|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: aha154x.h ! 8: ! 9: Abstract: ! 10: ! 11: This module contains the structures, specific to the Adaptec aha154x ! 12: host bus adapter, used by the SCSI miniport driver. Data structures ! 13: that are part of standard ANSI SCSI will be defined in a header ! 14: file that will be available to all SCSI device drivers. ! 15: ! 16: Author: ! 17: ! 18: Mike Glass December 1990 ! 19: ! 20: ! 21: Revision History: ! 22: ! 23: --*/ ! 24: ! 25: #include "scsi.h" ! 26: ! 27: // ! 28: // The following definitions are used to convert ULONG addresses ! 29: // to Adaptec's 3 byte address format. ! 30: // ! 31: ! 32: typedef struct _THREE_BYTE { ! 33: UCHAR Msb; ! 34: UCHAR Mid; ! 35: UCHAR Lsb; ! 36: } THREE_BYTE, *PTHREE_BYTE; ! 37: ! 38: // ! 39: // Convert four-byte Little Endian to three-byte Big Endian ! 40: // ! 41: ! 42: #define FOUR_TO_THREE(Three, Four) { \ ! 43: ASSERT(!((Four)->Byte3)); \ ! 44: (Three)->Lsb = (Four)->Byte0; \ ! 45: (Three)->Mid = (Four)->Byte1; \ ! 46: (Three)->Msb = (Four)->Byte2; \ ! 47: } ! 48: ! 49: #define THREE_TO_FOUR(Four, Three) { \ ! 50: (Four)->Byte0 = (Three)->Lsb; \ ! 51: (Four)->Byte1 = (Three)->Mid; \ ! 52: (Four)->Byte2 = (Three)->Msb; \ ! 53: (Four)->Byte3 = 0; \ ! 54: } ! 55: ! 56: /////////////////////////////////////////////////////////////////////////////// ! 57: // ! 58: // CCB - Adaptec SCSI Command Control Block ! 59: // ! 60: // The CCB is a superset of the CDB (Command Descriptor Block) ! 61: // and specifies detailed information about a SCSI command. ! 62: // ! 63: /////////////////////////////////////////////////////////////////////////////// ! 64: ! 65: // ! 66: // Byte 0 Command Control Block Operation Code ! 67: // ! 68: ! 69: #define SCSI_INITIATOR_COMMAND 0x00 ! 70: #define TARGET_MODE_COMMAND 0x01 ! 71: #define SCATTER_GATHER_COMMAND 0x04 ! 72: ! 73: // ! 74: // Byte 1 Address and Direction Control ! 75: // ! 76: ! 77: #define CCB_TARGET_ID_SHIFT 0x06 // CCB Op Code = 00, 02 ! 78: #define CCB_INITIATOR_ID_SHIFT 0x06 // CCB Op Code = 01 ! 79: #define CCB_DATA_XFER_OUT 0x10 // Write ! 80: #define CCB_DATA_XFER_IN 0x08 // Read ! 81: #define CCB_LUN_MASK 0x07 // Logical Unit Number ! 82: ! 83: // ! 84: // Byte 2 SCSI_Command_Length - Length of SCSI CDB ! 85: // ! 86: // Byte 3 Request Sense Allocation Length ! 87: // ! 88: ! 89: #define FOURTEEN_BYTES 0x00 // Request Sense Buffer size ! 90: #define NO_AUTO_REQUEST_SENSE 0x01 // No Request Sense Buffer ! 91: ! 92: // ! 93: // Bytes 4, 5 and 6 Data Length // Data transfer byte count ! 94: // ! 95: // Bytes 7, 8 and 9 Data Pointer // SGD List or Data Buffer ! 96: // ! 97: // Bytes 10, 11 and 12 Link Pointer // Next CCB in Linked List ! 98: // ! 99: // Byte 13 Command Link ID // TBD (I don't know yet) ! 100: // ! 101: // Byte 14 Host Status // Host Adapter status ! 102: // ! 103: ! 104: #define CCB_COMPLETE 0x00 // CCB completed without error ! 105: #define CCB_LINKED_COMPLETE 0x0A // Linked command completed ! 106: #define CCB_LINKED_COMPLETE_INT 0x0B // Linked complete with interrupt ! 107: #define CCB_SELECTION_TIMEOUT 0x11 // Set SCSI selection timed out ! 108: #define CCB_DATA_OVER_UNDER_RUN 0x12 ! 109: #define CCB_UNEXPECTED_BUS_FREE 0x13 // Target dropped SCSI BSY ! 110: #define CCB_PHASE_SEQUENCE_FAIL 0x14 // Target bus phase sequence failure ! 111: #define CCB_BAD_MBO_COMMAND 0x15 // MBO command not 0, 1 or 2 ! 112: #define CCB_INVALID_OP_CODE 0x16 // CCB invalid operation code ! 113: #define CCB_BAD_LINKED_LUN 0x17 // Linked CCB LUN different from first ! 114: #define CCB_INVALID_DIRECTION 0x18 // Invalid target direction ! 115: #define CCB_DUPLICATE_CCB 0x19 // Duplicate CCB ! 116: #define CCB_INVALID_CCB 0x1A // Invalid CCB - bad parameter ! 117: ! 118: // ! 119: // Byte 15 Target Status ! 120: // ! 121: // See SCSI.H files for these statuses. ! 122: // ! 123: ! 124: // ! 125: // Bytes 16 and 17 Reserved (must be 0) ! 126: // ! 127: ! 128: // ! 129: // Bytes 18 through 18+n-1, where n=size of CDB Command Descriptor Block ! 130: // ! 131: ! 132: // ! 133: // Bytes 18+n through 18+m-1, where m=buffer size Allocated for Sense Data ! 134: // ! 135: ! 136: #define REQUEST_SENSE_BUFFER_SIZE 18 ! 137: ! 138: /////////////////////////////////////////////////////////////////////////////// ! 139: // ! 140: // Scatter/Gather Segment List Definitions ! 141: // ! 142: /////////////////////////////////////////////////////////////////////////////// ! 143: ! 144: // ! 145: // Adapter limits ! 146: // ! 147: ! 148: #define MAX_SG_DESCRIPTORS 17 ! 149: #define MAX_TRANSFER_SIZE 64 * 1024 ! 150: ! 151: // ! 152: // Scatter/Gather Segment Descriptor Definition ! 153: // ! 154: ! 155: typedef struct _SGD { ! 156: THREE_BYTE Length; ! 157: THREE_BYTE Address; ! 158: } SGD, *PSGD; ! 159: ! 160: typedef struct _SDL { ! 161: SGD Sgd[MAX_SG_DESCRIPTORS]; ! 162: } SDL, *PSDL; ! 163: ! 164: #define SEGMENT_LIST_SIZE MAX_SG_DESCRIPTORS * sizeof(SGD) ! 165: ! 166: /////////////////////////////////////////////////////////////////////////////// ! 167: // ! 168: // CCB Typedef ! 169: // ! 170: ! 171: typedef struct _CCB { ! 172: UCHAR OperationCode; ! 173: UCHAR ControlByte; ! 174: UCHAR CdbLength; ! 175: UCHAR RequestSenseLength; ! 176: THREE_BYTE DataLength; ! 177: THREE_BYTE DataPointer; ! 178: THREE_BYTE LinkPointer; ! 179: UCHAR LinkIdentifier; ! 180: UCHAR HostStatus; ! 181: UCHAR TargetStatus; ! 182: UCHAR Reserved[2]; ! 183: UCHAR Cdb[MAXIMUM_CDB_SIZE]; ! 184: PVOID SrbAddress; ! 185: PVOID AbortSrb; ! 186: SDL Sdl; ! 187: UCHAR RequestSenseBuffer[REQUEST_SENSE_BUFFER_SIZE]; ! 188: } CCB, *PCCB; ! 189: ! 190: // ! 191: // CCB and request sense buffer ! 192: // ! 193: ! 194: #define CCB_SIZE sizeof(CCB) ! 195: ! 196: /////////////////////////////////////////////////////////////////////////////// ! 197: // ! 198: // Adapter Command Overview ! 199: // ! 200: // Adapter commands are issued by writing to the Command/Data Out port. ! 201: // They are used to initialize the host adapter and to establish control ! 202: // conditions within the host adapter. They may not be issued when there ! 203: // are outstanding SCSI commands. ! 204: // ! 205: // All adapter commands except Start SCSI(02) and Enable Mailbox-Out ! 206: // Interrupt(05) must be executed only when the IDLE bit (Status bit 4) ! 207: // is one. Many commands require additional parameter bytes which are ! 208: // then written to the Command/Data Out I/O port (base+1). Before each ! 209: // byte is written by the host to the host adapter, the host must verify ! 210: // that the CDF bit (Status bit 3) is zero, indicating that the command ! 211: // port is ready for another byte of information. The host adapter usually ! 212: // clears the Command/Data Out port within 100 microseconds. Some commands ! 213: // require information bytes to be returned from the host adapter to the ! 214: // host. In this case, the host monitors the DF bit (Status bit 2) to ! 215: // determine when the host adapter has placed a byte in the Data In I/O ! 216: // port for the host to read. The DF bit is reset automatically when the ! 217: // host reads the byte. The format of each adapter command is strictly ! 218: // defined, so the host adapter and host system can always agree upon the ! 219: // correct number of parameter bytes to be transferred during a command. ! 220: // ! 221: // ! 222: /////////////////////////////////////////////////////////////////////////////// ! 223: ! 224: // ! 225: // Host Adapter Command Operation Codes ! 226: // ! 227: ! 228: #define AC_NO_OPERATION 0x00 ! 229: #define AC_MAILBOX_INITIALIZATION 0x01 ! 230: #define AC_START_SCSI_COMMAND 0x02 ! 231: #define AC_START_BIOS_COMMAND 0x03 ! 232: #define AC_ADAPTER_INQUIRY 0x04 ! 233: #define AC_ENABLE_MBO_AVAIL_INT 0x05 ! 234: #define AC_SET_SELECTION_TIMEOUT 0x06 ! 235: #define AC_SET_BUS_ON_TIME 0x07 ! 236: #define AC_SET_BUS_OFF_TIME 0x08 ! 237: #define AC_SET_TRANSFER_SPEED 0x09 ! 238: #define AC_RET_INSTALLED_DEVICES 0x0A ! 239: #define AC_RET_CONFIGURATION_DATA 0x0B ! 240: #define AC_ENABLE_TARGET_MODE 0x0C ! 241: #define AC_RETURN_SETUP_DATA 0x0D ! 242: #define AC_WRITE_CHANNEL_2_BUFFER 0x1A ! 243: #define AC_READ_CHANNEL_2_BUFFER 0x1B ! 244: #define AC_WRITE_FIFO_BUFFER 0x1C ! 245: #define AC_READ_FIFO_BUFFER 0x1D ! 246: #define AC_ECHO_COMMAND_DATA 0x1F ! 247: #define AC_SET_HA_OPTION 0x21 ! 248: #define AC_GET_BIOS_INFO 0x28 ! 249: #define AC_SET_MAILBOX_INTERFACE 0x29 ! 250: #define AC_EXTENDED_SETUP_INFO 0x8D ! 251: ! 252: ! 253: // ! 254: // DMA Transfer Speeds ! 255: // ! 256: ! 257: #define DMA_SPEED_50_MBS 0x00 ! 258: ! 259: // ! 260: // I/O Port Interface ! 261: // ! 262: ! 263: typedef struct _BASE_REGISTER { ! 264: UCHAR StatusRegister; ! 265: UCHAR CommandRegister; ! 266: UCHAR InterruptRegister; ! 267: } BASE_REGISTER, *PBASE_REGISTER; ! 268: ! 269: // ! 270: // Base+0 Write: Control Register ! 271: // ! 272: ! 273: #define IOP_HARD_RESET 0x80 // bit 7 ! 274: #define IOP_SOFT_RESET 0x40 // bit 6 ! 275: #define IOP_INTERRUPT_RESET 0x20 // bit 5 ! 276: #define IOP_SCSI_BUS_RESET 0x10 // bit 4 ! 277: ! 278: // ! 279: // Base+0 Read: Status ! 280: // ! 281: ! 282: #define IOP_SELF_TEST 0x80 // bit 7 ! 283: #define IOP_INTERNAL_DIAG_FAILURE 0x40 // bit 6 ! 284: #define IOP_MAILBOX_INIT_REQUIRED 0x20 // bit 5 ! 285: #define IOP_SCSI_HBA_IDLE 0x10 // bit 4 ! 286: #define IOP_COMMAND_DATA_OUT_FULL 0x08 // bit 3 ! 287: #define IOP_DATA_IN_PORT_FULL 0x04 // bit 2 ! 288: #define IOP_INVALID_COMMAND 0X01 // bit 1 ! 289: ! 290: // ! 291: // Base+1 Write: Command/Data Out ! 292: // ! 293: ! 294: // ! 295: // Base+1 Read: Data In ! 296: // ! 297: ! 298: // ! 299: // Base+2 Read: Interrupt Flags ! 300: // ! 301: ! 302: #define IOP_ANY_INTERRUPT 0x80 // bit 7 ! 303: #define IOP_SCSI_RESET_DETECTED 0x08 // bit 3 ! 304: #define IOP_COMMAND_COMPLETE 0x04 // bit 2 ! 305: #define IOP_MBO_EMPTY 0x02 // bit 1 ! 306: #define IOP_MBI_FULL 0x01 // bit 0 ! 307: ! 308: /////////////////////////////////////////////////////////////////////////////// ! 309: // ! 310: // Mailbox Definitions ! 311: // ! 312: // ! 313: /////////////////////////////////////////////////////////////////////////////// ! 314: ! 315: // ! 316: // Mailbox Definition ! 317: // ! 318: ! 319: #define MB_COUNT 0x04 // number of mailboxes ! 320: ! 321: // ! 322: // Mailbox Out ! 323: // ! 324: ! 325: typedef struct _MBO { ! 326: UCHAR Command; ! 327: THREE_BYTE Address; ! 328: } MBO, *PMBO; ! 329: ! 330: // ! 331: // MBO Command Values ! 332: // ! 333: ! 334: #define MBO_FREE 0x00 ! 335: #define MBO_START 0x01 ! 336: #define MBO_ABORT 0x02 ! 337: ! 338: // ! 339: // Mailbox In ! 340: // ! 341: ! 342: typedef struct _MBI { ! 343: UCHAR Status; ! 344: THREE_BYTE Address; ! 345: } MBI, *PMBI; ! 346: ! 347: // ! 348: // MBI Status Values ! 349: // ! 350: ! 351: #define MBI_FREE 0x00 ! 352: #define MBI_SUCCESS 0x01 ! 353: #define MBI_ABORT 0x02 ! 354: #define MBI_NOT_FOUND 0x03 ! 355: #define MBI_ERROR 0x04 ! 356: ! 357: // ! 358: // Mailbox Initialization ! 359: // ! 360: ! 361: typedef struct _MAILBOX_INIT { ! 362: UCHAR Count; ! 363: THREE_BYTE Address; ! 364: } MAILBOX_INIT, *PMAILBOX_INIT; ! 365: ! 366: #define MAILBOX_UNLOCK 0x00 ! 367: #define TRANSLATION_LOCK 0x01 // mailbox locked for extended BIOS ! 368: #define DYNAMIC_SCAN_LOCK 0x02 // mailbox locked for 154xC ! 369: #define TRANSLATION_ENABLED 0x08 // extended BIOS translation (1023/64) ! 370: ! 371: // ! 372: // Scatter/Gather firmware bug detection ! 373: // ! 374: ! 375: #define BOARD_ID 0x00 ! 376: #define HARDWARE_ID 0x01 ! 377: #define FIRMWARE_ID 0x02 ! 378: #define OLD_BOARD_ID1 0x00 ! 379: #define OLD_BOARD_ID2 0x30 ! 380: #define A154X_BOARD 0x41 ! 381: #define A154X_BAD_HARDWARE_ID 0x30 ! 382: #define A154X_BAD_FIRMWARE_ID 0x33 ! 383: ! 384: // ! 385: // MCA specific definitions. ! 386: // ! 387: ! 388: #define NUMBER_POS_SLOTS 8 ! 389: #define POS_IDENTIFIER 0x0F1F ! 390: #define POS_PORT_MASK 0xC7 ! 391: #define POS_PORT_130 0x01 ! 392: #define POS_PORT_134 0x41 ! 393: #define POS_PORT_230 0x02 ! 394: #define POS_PORT_234 0x42 ! 395: #define POS_PORT_330 0x03 ! 396: #define POS_PORT_334 0x43 ! 397: ! 398: typedef struct _POS_DATA { ! 399: USHORT AdapterId; ! 400: UCHAR BiosEnabled; ! 401: UCHAR IoPortInformation; ! 402: UCHAR ScsiInformation; ! 403: UCHAR DmaInformation; ! 404: } POS_DATA, *PPOS_DATA; ! 405: ! 406: typedef struct _INIT_DATA { ! 407: ! 408: ULONG AdapterId; ! 409: ULONG CardSlot; ! 410: POS_DATA PosData[NUMBER_POS_SLOTS]; ! 411: ! 412: } INIT_DATA, *PINIT_DATA; ! 413:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.