/*
 * This file has been modified for the cdrkit suite.
 *
 * The behaviour and appearence of the program code below can differ to a major
 * extent from the version distributed by the original author(s).
 *
 * For details, see Changelog file distributed with the cdrkit package. If you
 * received this file from another source then ask the distributing person for
 * a log of modifications.
 *
 */

/* @(#)aspi-dos.h	1.2 05/05/15 J. Schilling */
#ifndef	__ASPI16_H_
#define	__ASPI16_H_

#define	PACKED	__attribute__((packed))
#define	FAR
typedef unsigned char	BYTE;
typedef unsigned short	WORD;
typedef unsigned long	DWORD;

//*****************************************************************************
//	%%% SCSI MISCELLANEOUS EQUATES %%%
//*****************************************************************************

#define	SENSE_LEN			14	// Default sense buffer length
#define	SRB_DIR_SCSI			0x00	// Direction determined by SCSI
#define	SRB_POSTING			0x01	// Enable ASPI posting
#define	SRB_ENABLE_RESIDUAL_COUNT	0x04	// Enable residual byte count reporting
#define	SRB_DIR_IN			0x08	// Transfer from SCSI target to host
#define	SRB_DIR_OUT			0x10	// Transfer from host to SCSI target

//*****************************************************************************
//      %%% ASPI Command Definitions %%%
//*****************************************************************************

#define	SC_HA_INQUIRY			0x00	// Host adapter inquiry
#define	SC_GET_DEV_TYPE			0x01	// Get device type
#define	SC_EXEC_SCSI_CMD		0x02	// Execute SCSI command
#define	SC_ABORT_SRB			0x03	// Abort an SRB
#define	SC_RESET_DEV			0x04	// SCSI bus device reset
#define	SC_SET_HA_PARMS			0x05	// Set HA parameters
#define	SC_GET_DISK_INFO		0x06	// Get Disk information

//*****************************************************************************
//      %%% SRB Status %%%
//*****************************************************************************

#define	SS_PENDING			0x00	// SRB being processed
#define	SS_COMP				0x01	// SRB completed without error
#define	SS_ABORTED			0x02	// SRB aborted
#define	SS_ABORT_FAIL			0x03	// Unable to abort SRB
#define	SS_ERR				0x04	// SRB completed with error

#define	SS_INVALID_CMD			0x80	// Invalid ASPI command
#define	SS_INVALID_HA			0x81	// Invalid host adapter number
#define	SS_NO_DEVICE			0x82	// SCSI device not installed

//*****************************************************************************
//      %%% Host Adapter Status %%%
//*****************************************************************************

#define	HASTAT_OK			0x00	// Host adapter did not detect an
						// error
#define	HASTAT_SEL_TO			0x11	// Selection Timeout
#define	HASTAT_DO_DU			0x12	// Data overrun data underrun
#define	HASTAT_BUS_FREE			0x13	// Unexpected bus free
#define	HASTAT_PHASE_ERR		0x14	// Target bus phase sequence
						// failure
#define	HASTAT_TIMEOUT			0x09	// Timed out while SRB was
						// waiting to beprocessed.
#define	HASTAT_COMMAND_TIMEOUT		0x0B	// Adapter timed out processing SRB.
#define	HASTAT_MESSAGE_REJECT		0x0D	// While processing SRB, the
						// adapter received a MESSAGE
#define	HASTAT_BUS_RESET		0x0E	// A bus reset was detected.
#define	HASTAT_PARITY_ERROR		0x0F	// A parity error was detected.
#define	HASTAT_REQUEST_SENSE_FAILED	0x10	// The adapter failed in issuing

typedef struct {

	BYTE	Cmd;				// 00/000 ASPI command code = SC_EXEC_SCSI_CMD
	BYTE	Status;				// 01/001 ASPI command status byte
	BYTE	HaId;				// 02/002 ASPI host adapter number
	BYTE	Flags;				// 03/003 ASPI request flags
	DWORD	Hdr_Rsvd;			// 04/004 Reserved, MUST = 0

	union {

	struct {

		BYTE	Count;			// 08/008 Number of host adapters present
		BYTE	SCSI_ID;		// 09/009 SCSI ID of host adapter
		BYTE	ManagerId[16];		// 0A/010 String describing the manager
		BYTE	Identifier[16];		// 1A/026 String describing the host adapter
		BYTE	Unique[16];		// 2A/042 Host Adapter Unique parameters
		BYTE	ExtBuffer[8];		// 3A/058 Extended inquiry data

	} PACKED HAInquiry;

	struct {

		BYTE	Target;			// 08/008 Target's SCSI ID
		BYTE	Lun;			// 09/009 Target's LUN number
		BYTE	DeviceType;		// 0A/010 Target's peripheral device type

	} PACKED GetDeviceType;

	struct {

		BYTE	Target;			// 08/008 Target's SCSI ID
		BYTE	Lun;			// 09/009 Target's LUN number
		DWORD	BufLen;			// 0A/010 Data Allocation Length
		BYTE	SenseLen;		// 0E/014 Sense Allocation Length
		BYTE	FAR *BufPointer;	// 0F/015 Data Buffer Pointer
		DWORD	Rsvd1;			// 13/019 Reserved, MUST = 0
		BYTE	CDBLen;			// 17/023 CDB Length = 6/10/12
		BYTE	HaStat;			// 18/024 Host Adapter Status
		BYTE	TargStat;		// 19/025 Target Status
		VOID	FAR *PostProc;		// 1A/026 Post routine
		BYTE	Rsvd2[34];		// 1E/030 Reserved, MUST = 0

		union {

		struct {

			BYTE	CDBByte[6];		// 40/064 SCSI CDB
			BYTE	SenseArea[SENSE_LEN+2];	// 46/070 Request Sense buffer

		} PACKED _6;

		struct {

			BYTE	CDBByte[10];		// 40/064 SCSI CDB
			BYTE	SenseArea[SENSE_LEN+2];	// 4A/074 Request Sense buffer

		} PACKED _10;

		struct {

			BYTE	CDBByte[12];		// 40/064 SCSI CDB
			BYTE	SenseArea[SENSE_LEN+2];	// 4C/076 Request Sense buffer

		} PACKED _12;

		} PACKED CmdLen;

	} PACKED ExecSCSICmd;

	struct {

		VOID	FAR	*SRBToAbort;	// 08/008 Pointer to SRB to abort

	} PACKED Abort;

	struct {
		BYTE	Target;		// 08/008 Target's SCSI ID
		BYTE	Lun;		// 09/009 Target's LUN number
		BYTE	ResetRsvd1[14];	// 0A/010 Reserved, MUST = 0
		BYTE	HaStat;		// 18/024 Host Adapter Status
		BYTE	TargStat;	// 19/025 Target Status
		VOID	FAR *PostProc;	// 1A/026 Post routine
		BYTE	ResetRsvd2[34];	// 1E/030 Reserved, MUST = 0
	} Reset;
	} PACKED Type;

} PACKED SRB;

#endif /* __ASPI16_H_ */
