/*++

Copyright (c) 1998-2002  Microsoft Corporation

Module Name:

    i2obscsi.h

Abstract:

    This file contains declarations and definitions for handling SCSI-Passthrough Devices.

Author:

Environment:

    kernel mode only

Revision History:
 
--*/

#if !defined(I2O_BASE_SCSI_HDR)
#define I2O_BASE_SCSI_HDR

#include    "i2omsg.h"          /* Include the Base Message file */

#define I2OBSCSI_REV 1_5_1      /* Header file revision string */



/*****************************************************************************
 *
 *    I2OBSCSI.h -- I2O Base SCSI Device Class Message defintion file
 *
 *      This file contains information presented in Chapter 6, Section 6 & 7 of
 *      the I2O Specification.
 *
 *  Revision History: (Revision History tracks the revision number of the I2O
 *          specification)
 *
 *      .92 - First marked revsion used for Proof of Concept. 
 *      .93 - Change to match the rev .93 of the spec.
 *      .95 - Updated to Rev .95 of 2/5/96.
 *     1.00 - Checked and Updated against spec version 1.00 4/9/96.
 *     1.xx - Updated to the 1.x version of the I2O Specification on 11/11/96.
 *     1.xx - 11/14/96
 *            1) Removed duplicate device type definitions.
 *            2) Added "DSC" to Detailed Status Code definitions.
 *            3) Changed SCSI-3 LUN fields from U64 to U8 array.
 *     1.xx   11/15/96 - Added #pragma statments for i960.
 *     1.xx   11/20/96 - Changed duplicate Bus Scan structure to Bus Reset.
 *     1.xx   12/05/96 - Added Auto Request Sense flag definition.
 *     1.5d   03/06/97 - Update for spec. draft version 1.5d.
 *            1) Converted SCSI bus adapter class to generic in i2oadptr.h.
 *            2) Fixed DSC reference:  changed from _BUS_SCAN to _BUS_RESET.
 *     1.5d   03/031/97 - Made AutoSense flag definition consistent with spec.
 *     1.5d   04/11/97 - Corrections from review cycle:
 *            1) Corrected typo in I2O_SCSI_PERIPHERAL_TYPE_PARALLEL.
 *            2) Corrected typo in I2O_SCSI_PORT_CONN_UNSHIELDED_P_HD.
 *     1.5.1  05/02/97 - Corrections from review cycle:
 *            1) Remove #include for i2omstor.h.
 *            2) Add revision string.
 *            3) Convert tabs to spaces.
 *            4) New disclaimer.
 *
 *****************************************************************************/

/*
    NOTES:
    
    Gets, reads, receives, etc. are all even numbered functions.
    Sets, writes, sends, etc. are all odd numbered functions.
    Functions that both send and receive data can be either but an attempt is made
    to use the function number that indicates the greater transfer amount.
    Functions that do not send or receive data use odd function numbers.

    Some functions are synonyms like read, receive and send, write.
    
    All common functions will have a code of less than 0x80.
    Unique functions to a class will start at 0x80.
    Executive Functions start at 0xA0.
    
    Utility Message function codes range from 0 - 0x1f
    Base Message function codes range from 0x20 - 0xfe
    Private Message function code is 0xff.
*/

PRAGMA_ALIGN_PUSH

#pragma pack(push,1)

/*
    SCSI Peripheral Class specific functions
    
    Although the names are SCSI Peripheral class specific, the values 
    assigned are common with other classes when applicable.
*/

#define     I2O_SCSI_DEVICE_RESET           0x27
#define     I2O_SCSI_SCB_ABORT              0x83
#define     I2O_SCSI_SCB_EXEC               0x81

/*
    Detailed Status Codes for SCSI operations

    The 16-bit Detailed Status Code field for SCSI operations is divided 
    into two separate 8-bit fields.  The lower 8 bits are used to report 
    Device Status information.  The upper 8 bits are used to report
    Adapter Status information.  The definitions for these two fields, 
    however, will be consistent with the standard reply message frame 
    structure declaration, which treats this as a single 16-bit field.
*/  


/*  SCSI Device Completion Status Codes (defined by SCSI-2/3)*/

#define I2O_SCSI_DEVICE_DSC_MASK                0x00FF

#define I2O_SCSI_DSC_SUCCESS                    0x0000
#define I2O_SCSI_DSC_CHECK_CONDITION            0x0002
#define I2O_SCSI_DSC_BUSY                       0x0008
#define I2O_SCSI_DSC_RESERVATION_CONFLICT       0x0018
#define I2O_SCSI_DSC_COMMAND_TERMINATED         0x0022
#define I2O_SCSI_DSC_TASK_SET_FULL              0x0028
#define I2O_SCSI_DSC_ACA_ACTIVE                 0x0030

/*  SCSI Adapter Status Codes (based on CAM-1) */

#define I2O_SCSI_HBA_DSC_MASK                   0xFF00

#define I2O_SCSI_HBA_DSC_SUCCESS                0x0000

#define I2O_SCSI_HBA_DSC_REQUEST_ABORTED        0x0200
#define I2O_SCSI_HBA_DSC_UNABLE_TO_ABORT        0x0300
#define I2O_SCSI_HBA_DSC_COMPLETE_WITH_ERROR    0x0400
#define I2O_SCSI_HBA_DSC_ADAPTER_BUSY           0x0500
#define I2O_SCSI_HBA_DSC_REQUEST_INVALID        0x0600
#define I2O_SCSI_HBA_DSC_PATH_INVALID           0x0700
#define I2O_SCSI_HBA_DSC_DEVICE_NOT_PRESENT     0x0800
#define I2O_SCSI_HBA_DSC_UNABLE_TO_TERMINATE    0x0900
#define I2O_SCSI_HBA_DSC_SELECTION_TIMEOUT      0x0A00
#define I2O_SCSI_HBA_DSC_COMMAND_TIMEOUT        0x0B00

#define I2O_SCSI_HBA_DSC_MR_MESSAGE_RECEIVED    0x0D00
#define I2O_SCSI_HBA_DSC_SCSI_BUS_RESET         0x0E00
#define I2O_SCSI_HBA_DSC_PARITY_ERROR_FAILURE   0x0F00
#define I2O_SCSI_HBA_DSC_AUTOSENSE_FAILED       0x1000
#define I2O_SCSI_HBA_DSC_NO_ADAPTER             0x1100
#define I2O_SCSI_HBA_DSC_DATA_OVERRUN           0x1200
#define I2O_SCSI_HBA_DSC_UNEXPECTED_BUS_FREE    0x1300
#define I2O_SCSI_HBA_DSC_SEQUENCE_FAILURE       0x1400
#define I2O_SCSI_HBA_DSC_REQUEST_LENGTH_ERROR   0x1500
#define I2O_SCSI_HBA_DSC_PROVIDE_FAILURE        0x1600
#define I2O_SCSI_HBA_DSC_BDR_MESSAGE_SENT       0x1700
#define I2O_SCSI_HBA_DSC_REQUEST_TERMINATED     0x1800

#define I2O_SCSI_HBA_DSC_IDE_MESSAGE_SENT       0x3300
#define I2O_SCSI_HBA_DSC_RESOURCE_UNAVAILABLE   0x3400
#define I2O_SCSI_HBA_DSC_UNACKNOWLEDGED_EVENT   0x3500
#define I2O_SCSI_HBA_DSC_MESSAGE_RECEIVED       0x3600
#define I2O_SCSI_HBA_DSC_INVALID_CDB            0x3700
#define I2O_SCSI_HBA_DSC_LUN_INVALID            0x3800
#define I2O_SCSI_HBA_DSC_SCSI_TID_INVALID       0x3900
#define I2O_SCSI_HBA_DSC_FUNCTION_UNAVAILABLE   0x3A00
#define I2O_SCSI_HBA_DSC_NO_NEXUS               0x3B00
#define I2O_SCSI_HBA_DSC_SCSI_IID_INVALID       0x3C00
#define I2O_SCSI_HBA_DSC_CDB_RECEIVED           0x3D00
#define I2O_SCSI_HBA_DSC_LUN_ALREADY_ENABLED    0x3E00
#define I2O_SCSI_HBA_DSC_BUS_BUSY               0x3F00

#define I2O_SCSI_HBA_DSC_QUEUE_FROZEN           0x4000


/****************************************************************************/

/* SCSI Peripheral Device Parameter Groups */

/****************************************************************************/


/* SCSI Configuration and Operating Structures and Defines */


#define     I2O_SCSI_DEVICE_INFO_GROUP_NO               0x0000
#define     I2O_SCSI_DEVICE_BUS_PORT_INFO_GROUP_NO      0x0001


/* - 0000h - SCSI Device Information Parameters Group defines */

/* Device Type */

#define I2O_SCSI_DEVICE_TYPE_DIRECT         0x00
#define I2O_SCSI_DEVICE_TYPE_SEQUENTIAL     0x01
#define I2O_SCSI_DEVICE_TYPE_PRINTER        0x02
#define I2O_SCSI_DEVICE_TYPE_PROCESSOR      0x03
#define I2O_SCSI_DEVICE_TYPE_WORM           0x04
#define I2O_SCSI_DEVICE_TYPE_CDROM          0x05
#define I2O_SCSI_DEVICE_TYPE_SCANNER        0x06
#define I2O_SCSI_DEVICE_TYPE_OPTICAL        0x07
#define I2O_SCSI_DEVICE_TYPE_MEDIA_CHANGER  0x08
#define I2O_SCSI_DEVICE_TYPE_COMM           0x09
#define I2O_SCSI_DEVICE_GRAPHICS_1          0x0A
#define I2O_SCSI_DEVICE_GRAPHICS_2          0x0B
#define I2O_SCSI_DEVICE_TYPE_ARRAY_CONT     0x0C
#define I2O_SCSI_DEVICE_TYPE_UNKNOWN        0x1F

/* Flags */

#define I2O_SCSI_PERIPHERAL_TYPE_FLAG       0x01
#define I2O_SCSI_PERIPHERAL_TYPE_PARALLEL   0x00
#define I2O_SCSI_PERIPHERAL_TYPE_SERIAL     0x01

#define I2O_SCSI_RESERVED_FLAG              0x02

#define I2O_SCSI_DISCONNECT_FLAG            0x04
#define I2O_SCSI_DISABLE_DISCONNECT         0x00
#define I2O_SCSI_ENABLE_DISCONNECT          0x04

#define I2O_SCSI_MODE_MASK                  0x18
#define I2O_SCSI_MODE_SET_DATA              0x00
#define I2O_SCSI_MODE_SET_DEFAULT           0x08
#define I2O_SCSI_MODE_SET_SAFEST            0x10

#define I2O_SCSI_DATA_WIDTH_MASK            0x60
#define I2O_SCSI_DATA_WIDTH_8               0x00
#define I2O_SCSI_DATA_WIDTH_16              0x20
#define I2O_SCSI_DATA_WIDTH_32              0x40

#define I2O_SCSI_SYNC_NEGOTIATION_FLAG      0x80
#define I2O_SCSI_DISABLE_SYNC_NEGOTIATION   0x00
#define I2O_SCSI_ENABLE_SYNC_NEGOTIATION    0x80


/* - 0001h - SCSI Device Bus Port Info Parameters Group defines */

/* Physical */

#define I2O_SCSI_PORT_PHYS_OTHER            0x01
#define I2O_SCSI_PORT_PHYS_UNKNOWN          0x02
#define I2O_SCSI_PORT_PHYS_PARALLEL         0x03
#define I2O_SCSI_PORT_PHYS_FIBRE_CHANNEL    0x04
#define I2O_SCSI_PORT_PHYS_SERIAL_P1394     0x05
#define I2O_SCSI_PORT_PHYS_SERIAL_SSA       0x06

/* Electrical */

#define I2O_SCSI_PORT_ELEC_OTHER            0x01
#define I2O_SCSI_PORT_ELEC_UNKNOWN          0x02
#define I2O_SCSI_PORT_ELEC_SINGLE_ENDED     0x03
#define I2O_SCSI_PORT_ELEC_DIFFERENTIAL     0x04
#define I2O_SCSI_PORT_ELEC_LOW_VOLT_DIFF    0x05
#define I2O_SCSI_PORT_ELEC_OPTICAL          0x06

/* Isochronous */

#define I2O_SCSI_PORT_ISOC_NO               0x00
#define I2O_SCSI_PORT_ISOC_YES              0x01
#define I2O_SCSI_PORT_ISOC_UNKNOWN          0x02

/* Connector Type */

#define I2O_SCSI_PORT_CONN_OTHER            0x01
#define I2O_SCSI_PORT_CONN_UNKNOWN          0x02
#define I2O_SCSI_PORT_CONN_NONE             0x03
#define I2O_SCSI_PORT_CONN_SHIELDED_A_HD    0x04
#define I2O_SCSI_PORT_CONN_UNSHIELDED_A_HD  0x05
#define I2O_SCSI_PORT_CONN_SHIELDED_A_LD    0x06
#define I2O_SCSI_PORT_CONN_UNSHIELDED_A_LD  0x07
#define I2O_SCSI_PORT_CONN_SHIELDED_P_HD    0x08
#define I2O_SCSI_PORT_CONN_UNSHIELDED_P_HD  0x09
#define I2O_SCSI_PORT_CONN_SCA_I            0x0A
#define I2O_SCSI_PORT_CONN_SCA_II           0x0B
#define I2O_SCSI_PORT_CONN_FC_DB9           0x0C
#define I2O_SCSI_PORT_CONN_FC_FIBRE         0x0D
#define I2O_SCSI_PORT_CONN_FC_SCA_II_40     0x0E
#define I2O_SCSI_PORT_CONN_FC_SCA_II_20     0x0F
#define I2O_SCSI_PORT_CONN_FC_BNC           0x10

/* Connector Gender */

#define I2O_SCSI_PORT_CONN_GENDER_OTHER     0x01
#define I2O_SCSI_PORT_CONN_GENDER_UNKOWN    0x02
#define I2O_SCSI_PORT_CONN_GENDER_FEMALE    0x03
#define I2O_SCSI_PORT_CONN_GENDER_MALE      0x04


/* SCSI Device Group 0000h - Device Information Parameter Group */

typedef struct _I2O_SCSI_DEVICE_INFO_SCALAR {
    U8          DeviceType;
    U8          Flags;
    U16         Reserved2;
    U32         Identifier;
    U8          LunInfo[8]; /* SCSI-2 8-bit scalar LUN goes into offset 1 */
    U32         QueueDepth;
    U8          Reserved1a;
    U8          NegOffset;
    U8          NegDataWidth;
    U8          Reserved1b;
    U64         NegSyncRate;

} I2O_SCSI_DEVICE_INFO_SCALAR, *PI2O_SCSI_DEVICE_INFO_SCALAR;


/* SCSI Device Group 0001h - Bus Port Information Parameter Group */

typedef struct _I2O_SCSI_BUS_PORT_INFO_SCALAR {
    U8          PhysicalInterface;
    U8          ElectricalInterface;
    U8          Isochronous;
    U8          ConnectorType;
    U8          ConnectorGender;
    U8          Reserved1;
    U16         Reserved2;
    U32         MaxNumberDevices;
} I2O_SCSI_BUS_PORT_INFO_SCALAR, *PI2O_SCSI_BUS_PORT_INFO_SCALAR;



/****************************************************************************/

/* I2O SCSI Peripheral Event Indicator Assignment */

#define I2O_SCSI_EVENT_SCSI_SMART               0x00000010


/****************************************************************************/

/* SCSI Peripheral Class Specific Message Definitions */

/****************************************************************************/


/****************************************************************************/

/* I2O SCSI Peripheral Successful Completion Reply Message Frame */

typedef struct _I2O_SCSI_SUCCESS_REPLY_MESSAGE_FRAME {
    I2O_SINGLE_REPLY_MESSAGE_FRAME StdReplyFrame;
    U32                     TransferCount;
} I2O_SCSI_SUCCESS_REPLY_MESSAGE_FRAME, *PI2O_SCSI_SUCCESS_REPLY_MESSAGE_FRAME;


/****************************************************************************/

/* I2O SCSI Peripheral Error Report Reply Message Frame */

#define I2O_SCSI_SENSE_DATA_SZ      40

typedef struct _I2O_SCSI_ERROR_REPLY_MESSAGE_FRAME {
    I2O_SINGLE_REPLY_MESSAGE_FRAME StdReplyFrame;
    U32                     TransferCount;
    U32                     AutoSenseTransferCount;
    U8                      SenseData[I2O_SCSI_SENSE_DATA_SZ];
} I2O_SCSI_ERROR_REPLY_MESSAGE_FRAME, *PI2O_SCSI_ERROR_REPLY_MESSAGE_FRAME;


/****************************************************************************/

/* I2O SCSI Device Reset Message Frame */

typedef struct _I2O_SCSI_DEVICE_RESET_MESSAGE {
    I2O_MESSAGE_FRAME       StdMessageFrame;
    I2O_TRANSACTION_CONTEXT TransactionContext;
} I2O_SCSI_DEVICE_RESET_MESSAGE, *PI2O_SCSI_DEVICE_RESET_MESSAGE;


/****************************************************************************/

/* I2O SCSI Control Block Abort Message Frame */

typedef struct _I2O_SCSI_SCB_ABORT_MESSAGE {
    I2O_MESSAGE_FRAME       StdMessageFrame;
    I2O_TRANSACTION_CONTEXT TransactionContext;
    I2O_TRANSACTION_CONTEXT TransactionContextToAbort;
} I2O_SCSI_SCB_ABORT_MESSAGE, *PI2O_SCSI_SCB_ABORT_MESSAGE;


/****************************************************************************/

/* I2O SCSI Control Block Execute Message Frame */

#define  I2O_SCSI_CDB_LENGTH                16

typedef U16     I2O_SCB_FLAGS;

#define I2O_SCB_FLAG_XFER_DIR_MASK          0xC000
#define I2O_SCB_FLAG_NO_DATA_XFER           0x0000
#define I2O_SCB_FLAG_XFER_FROM_DEVICE       0x4000
#define I2O_SCB_FLAG_XFER_TO_DEVICE         0x8000

#define I2O_SCB_FLAG_ENABLE_DISCONNECT      0x2000

#define I2O_SCB_FLAG_TAG_TYPE_MASK          0x0380
#define I2O_SCB_FLAG_NO_TAG_QUEUEING        0x0000
#define I2O_SCB_FLAG_SIMPLE_QUEUE_TAG       0x0080
#define I2O_SCB_FLAG_HEAD_QUEUE_TAG         0x0100
#define I2O_SCB_FLAG_ORDERED_QUEUE_TAG      0x0180
#define I2O_SCB_FLAG_ACA_QUEUE_TAG          0x0200

#define I2O_SCB_FLAG_AUTOSENSE_MASK         0x0060
#define I2O_SCB_FLAG_DISABLE_AUTOSENSE      0x0000
#define I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE  0x0020
#define I2O_SCB_FLAG_SENSE_DATA_IN_BUFFER   0x0060

typedef struct _I2O_SCSI_SCB_EXECUTE_MESSAGE {
    I2O_MESSAGE_FRAME       StdMessageFrame;
    I2O_TRANSACTION_CONTEXT TransactionContext;
    U8                      CDBLength;
    U8                      Reserved;
    I2O_SCB_FLAGS           SCBFlags;
    U8                      CDB[I2O_SCSI_CDB_LENGTH];
    U32                     ByteCount;
    I2O_SG_ELEMENT          SGL;
} I2O_SCSI_SCB_EXECUTE_MESSAGE, *PI2O_SCSI_SCB_EXECUTE_MESSAGE;


#pragma pack(pop)

PRAGMA_ALIGN_POP

#endif      /* I2O_BASE_SCSI_HDR */



