1*92f251f3SWarner Losh inline string scsi_op[int k] = 2*92f251f3SWarner Losh k == 0x00 ? "TEST UNIT READY" : 3*92f251f3SWarner Losh k == 0x01 ? "REZERO UNIT" : 4*92f251f3SWarner Losh k == 0x03 ? "REQUEST SENSE" : 5*92f251f3SWarner Losh k == 0x04 ? "FORMAT UNIT" : 6*92f251f3SWarner Losh k == 0x05 ? "READ BLOCK LIMITS" : 7*92f251f3SWarner Losh k == 0x07 ? "REASSIGN BLOCKS" : 8*92f251f3SWarner Losh k == 0x08 ? "READ(6)" : 9*92f251f3SWarner Losh k == 0x0a ? "WRITE(6)" : 10*92f251f3SWarner Losh k == 0x0b ? "SEEK(6)" : 11*92f251f3SWarner Losh k == 0x0f ? "READ REVERSE(6)" : 12*92f251f3SWarner Losh k == 0x10 ? "WRITE FILEMARKS(6)" : 13*92f251f3SWarner Losh k == 0x11 ? "SPACE(6)" : 14*92f251f3SWarner Losh k == 0x12 ? "INQUIRY" : 15*92f251f3SWarner Losh k == 0x14 ? "RECOVER BUFFERED DATA" : 16*92f251f3SWarner Losh k == 0x15 ? "MODE SELECT(6)" : 17*92f251f3SWarner Losh k == 0x16 ? "RESERVE(6)" : 18*92f251f3SWarner Losh k == 0x17 ? "RELEASE(6)" : 19*92f251f3SWarner Losh k == 0x18 ? "COPY" : 20*92f251f3SWarner Losh k == 0x19 ? "ERASE(6)" : 21*92f251f3SWarner Losh k == 0x1a ? "MODE SENSE(6)" : 22*92f251f3SWarner Losh k == 0x1b ? "START STOP UNIT" : 23*92f251f3SWarner Losh k == 0x1c ? "RECEIVE DIAGNOSTIC RESULTS" : 24*92f251f3SWarner Losh k == 0x1d ? "SEND DIAGNOSTIC" : 25*92f251f3SWarner Losh k == 0x1e ? "PREVENT ALLOW MEDIUM REMOVAL" : 26*92f251f3SWarner Losh k == 0x24 ? "SET WINDOW" : 27*92f251f3SWarner Losh k == 0x25 ? "READ CAPACITY(10)" : 28*92f251f3SWarner Losh k == 0x28 ? "READ(10)" : 29*92f251f3SWarner Losh k == 0x29 ? "READ GENERATION" : 30*92f251f3SWarner Losh k == 0x2a ? "WRITE(10)" : 31*92f251f3SWarner Losh k == 0x2b ? "SEEK(10)" : 32*92f251f3SWarner Losh k == 0x2c ? "ERASE(10)" : 33*92f251f3SWarner Losh k == 0x2e ? "WRITE AND VERIFY(10)" : 34*92f251f3SWarner Losh k == 0x2f ? "VERIFY(10)" : 35*92f251f3SWarner Losh k == 0x30 ? "SEARCH DATA HIGH(10)" : 36*92f251f3SWarner Losh k == 0x31 ? "SEARCH DATA EQUAL(10)" : 37*92f251f3SWarner Losh k == 0x32 ? "SEARCH DATA LOW(10)" : 38*92f251f3SWarner Losh k == 0x33 ? "SET LIMITS(10)" : 39*92f251f3SWarner Losh k == 0x35 ? "SYNCHRONIZE CACHE(10)" : 40*92f251f3SWarner Losh k == 0x36 ? "LOCK UNLOCK CACHE(10)" : 41*92f251f3SWarner Losh k == 0x37 ? "READ DEFECT DATA(10)" : 42*92f251f3SWarner Losh k == 0x39 ? "COMPARE" : 43*92f251f3SWarner Losh k == 0x3a ? "COPY AND VERIFY" : 44*92f251f3SWarner Losh k == 0x3b ? "WRITE BUFFER" : 45*92f251f3SWarner Losh k == 0x3c ? "READ BUFFER(10)" : 46*92f251f3SWarner Losh k == 0x3e ? "READ LONG(10)" : 47*92f251f3SWarner Losh k == 0x3f ? "WRITE LONG(10)" : 48*92f251f3SWarner Losh k == 0x40 ? "CHANGE DEFINITION" : 49*92f251f3SWarner Losh k == 0x41 ? "WRITE SAME(10)" : 50*92f251f3SWarner Losh k == 0x42 ? "UNMAP" : 51*92f251f3SWarner Losh k == 0x48 ? "SANITIZE" : 52*92f251f3SWarner Losh k == 0x4c ? "LOG SELECT" : 53*92f251f3SWarner Losh k == 0x4d ? "LOG SENSE" : 54*92f251f3SWarner Losh k == 0x50 ? "XDWRITE(10)" : 55*92f251f3SWarner Losh k == 0x51 ? "XPWRITE(10)" : 56*92f251f3SWarner Losh k == 0x52 ? "XDREAD(10)" : 57*92f251f3SWarner Losh k == 0x53 ? "XDWRITEREAD(10)" : 58*92f251f3SWarner Losh k == 0x55 ? "MODE SELECT(10)" : 59*92f251f3SWarner Losh k == 0x56 ? "RESERVE(10)" : 60*92f251f3SWarner Losh k == 0x57 ? "RELEASE(10)" : 61*92f251f3SWarner Losh k == 0x5a ? "MODE SENSE(10)" : 62*92f251f3SWarner Losh k == 0x5e ? "PERSISTENT RESERVE IN" : 63*92f251f3SWarner Losh k == 0x5f ? "PERSISTENT RESERVE OUT" : 64*92f251f3SWarner Losh k == 0x7e ? "extended CDB" : 65*92f251f3SWarner Losh k == 0x7f ? "variable length CDB (more than 16 bytes)" : 66*92f251f3SWarner Losh k == 0x80 ? "XDWRITE EXTENDED(16)" : 67*92f251f3SWarner Losh k == 0x81 ? "REBUILD(16)" : 68*92f251f3SWarner Losh k == 0x82 ? "REGENERATE(16)" : 69*92f251f3SWarner Losh k == 0x83 ? "Third-party Copy OUT" : 70*92f251f3SWarner Losh k == 0x84 ? "Third-party Copy IN" : 71*92f251f3SWarner Losh k == 0x85 ? "ATA PASS-THROUGH(16)" : 72*92f251f3SWarner Losh k == 0x86 ? "ACCESS CONTROL IN" : 73*92f251f3SWarner Losh k == 0x87 ? "ACCESS CONTROL OUT" : 74*92f251f3SWarner Losh k == 0x88 ? "READ(16)" : 75*92f251f3SWarner Losh k == 0x89 ? "COMPARE AND WRITE" : 76*92f251f3SWarner Losh k == 0x8a ? "WRITE(16)" : 77*92f251f3SWarner Losh k == 0x8b ? "ORWRITE" : 78*92f251f3SWarner Losh k == 0x8c ? "READ ATTRIBUTE" : 79*92f251f3SWarner Losh k == 0x8d ? "WRITE ATTRIBUTE" : 80*92f251f3SWarner Losh k == 0x8e ? "WRITE AND VERIFY(16)" : 81*92f251f3SWarner Losh k == 0x8f ? "VERIFY(16)" : 82*92f251f3SWarner Losh k == 0x90 ? "PRE-FETCH(16)" : 83*92f251f3SWarner Losh k == 0x91 ? "SYNCHRONIZE CACHE(16)" : 84*92f251f3SWarner Losh k == 0x92 ? "LOCK UNLOCK CACHE(16)" : 85*92f251f3SWarner Losh k == 0x93 ? "WRITE SAME(16)" : 86*92f251f3SWarner Losh k == 0x94 ? "ZBC OUT" : 87*92f251f3SWarner Losh k == 0x95 ? "ZBC IN" : 88*92f251f3SWarner Losh k == 0x9a ? "WRITE STREAM(16)" : 89*92f251f3SWarner Losh k == 0x9b ? "READ BUFFER(16)" : 90*92f251f3SWarner Losh k == 0x9c ? "WRITE ATOMIC(16)" : 91*92f251f3SWarner Losh k == 0x9e ? "SERVICE ACTION IN(16)" : 92*92f251f3SWarner Losh k == 0xa0 ? "REPORT LUNS" : 93*92f251f3SWarner Losh k == 0xa1 ? "ATA PASS-THROUGH(12)" : 94*92f251f3SWarner Losh k == 0xa2 ? "SECURITY PROTOCOL IN" : 95*92f251f3SWarner Losh k == 0xa3 ? "MAINTENANCE IN" : 96*92f251f3SWarner Losh k == 0xa4 ? "MAINTENANCE OUT" : 97*92f251f3SWarner Losh k == 0xa7 ? "MOVE MEDIUM ATTACHED" : 98*92f251f3SWarner Losh k == 0xa8 ? "READ(12)" : 99*92f251f3SWarner Losh k == 0xaa ? "WRITE(12)" : 100*92f251f3SWarner Losh k == 0xae ? "WRITE AND VERIFY(12)" : 101*92f251f3SWarner Losh k == 0xaf ? "VERIFY(12)" : 102*92f251f3SWarner Losh k == 0xb3 ? "SET LIMITS(12)" : 103*92f251f3SWarner Losh k == 0xb4 ? "READ ELEMENT STATUS ATTACHED" : 104*92f251f3SWarner Losh k == 0xb5 ? "SECURITY PROTOCOL OUT" : 105*92f251f3SWarner Losh k == 0xb7 ? "READ DEFECT DATA(12)" : 106*92f251f3SWarner Losh k == 0xba ? "REDUNDANCY GROUP (IN)" : 107*92f251f3SWarner Losh k == 0xbb ? "REDUNDANCY GROUP (OUT)" : 108*92f251f3SWarner Losh k == 0xbc ? "SPARE (IN)" : 109*92f251f3SWarner Losh k == 0xbd ? "SPARE (OUT)" : 110*92f251f3SWarner Losh k == 0xbe ? "VOLUME SET (IN)" : 111*92f251f3SWarner Losh k == 0xbf ? "VOLUME SET (OUT)" : 112*92f251f3SWarner Losh "Unknown"; 113*92f251f3SWarner Losh 114*92f251f3SWarner Losh inline string xpt_action_string[int key] = 115*92f251f3SWarner Losh key == 0 ? "XPT_NOOP" : 116*92f251f3SWarner Losh key == 1 ? "XPT_SCSI_IO" : 117*92f251f3SWarner Losh key == 2 ? "XPT_GDEV_TYPE" : 118*92f251f3SWarner Losh key == 3 ? "XPT_GDEVLIST" : 119*92f251f3SWarner Losh key == 4 ? "XPT_PATH_INQ" : 120*92f251f3SWarner Losh key == 5 ? "XPT_REL_SIMQ" : 121*92f251f3SWarner Losh key == 6 ? "XPT_SASYNC_CB" : 122*92f251f3SWarner Losh key == 7 ? "XPT_SDEV_TYPE" : 123*92f251f3SWarner Losh key == 8 ? "XPT_SCAN_BUS" : 124*92f251f3SWarner Losh key == 9 ? "XPT_DEV_MATCH" : 125*92f251f3SWarner Losh key == 10 ? "XPT_DEBUG" : 126*92f251f3SWarner Losh key == 11 ? "XPT_PATH_STATS" : 127*92f251f3SWarner Losh key == 12 ? "XPT_GDEV_STATS" : 128*92f251f3SWarner Losh key == 13 ? "XPT_0X0d" : 129*92f251f3SWarner Losh key == 14 ? "XPT_DEV_ADVINFO" : 130*92f251f3SWarner Losh key == 15 ? "XPT_ASYNC" : 131*92f251f3SWarner Losh key == 16 ? "XPT_ABORT" : 132*92f251f3SWarner Losh key == 17 ? "XPT_RESET_BUS" : 133*92f251f3SWarner Losh key == 18 ? "XPT_RESET_DEV" : 134*92f251f3SWarner Losh key == 19 ? "XPT_TERM_IO" : 135*92f251f3SWarner Losh key == 20 ? "XPT_SCAN_LUN" : 136*92f251f3SWarner Losh key == 21 ? "XPT_GET_TRAN_SETTINGS" : 137*92f251f3SWarner Losh key == 22 ? "XPT_SET_TRAN_SETTINGS" : 138*92f251f3SWarner Losh key == 23 ? "XPT_CALC_GEOMETRY" : 139*92f251f3SWarner Losh key == 24 ? "XPT_ATA_IO" : 140*92f251f3SWarner Losh key == 25 ? "XPT_SET_SIM_KNOB" : 141*92f251f3SWarner Losh key == 26 ? "XPT_GET_SIM_KNOB" : 142*92f251f3SWarner Losh key == 27 ? "XPT_SMP_IO" : 143*92f251f3SWarner Losh key == 28 ? "XPT_NVME_IO" : 144*92f251f3SWarner Losh key == 29 ? "XPT_MMC_IO" : 145*92f251f3SWarner Losh key == 30 ? "XPT_SCAN_TGT" : 146*92f251f3SWarner Losh key == 31 ? "XPT_NVME_ADMIN" : 147*92f251f3SWarner Losh "Too big" ; 148*92f251f3SWarner Losh 149*92f251f3SWarner Losh inline int CAM_CDB_POINTER = 1; 150*92f251f3SWarner Losh inline int XPT_SCSI_IO = 0x01; 151*92f251f3SWarner Losh inline int XPT_ATA_IO = 0x18; 152*92f251f3SWarner Losh inline int XPT_NVME_IO = 0x1c; 153*92f251f3SWarner Losh inline int XPT_NVME_ADMIN = 0x1f; 154*92f251f3SWarner Losh 155*92f251f3SWarner Losh /* 156*92f251f3SWarner Losh * key >> 5 gives the group: 157*92f251f3SWarner Losh * Group 0: six byte commands 158*92f251f3SWarner Losh * Group 1: ten byte commands 159*92f251f3SWarner Losh * Group 2: ten byte commands 160*92f251f3SWarner Losh * Group 3: reserved (7e and 7f are de-facto 32 bytes though) 161*92f251f3SWarner Losh * Group 4: sixteen byte commands 162*92f251f3SWarner Losh * Group 5: twelve byte commands 163*92f251f3SWarner Losh * Group 6: vendor specific 164*92f251f3SWarner Losh * Group 7: vendor specific 165*92f251f3SWarner Losh */ 166*92f251f3SWarner Losh inline int scsi_cdb_len[int key] = 167*92f251f3SWarner Losh key == 0 ? 6 : 168*92f251f3SWarner Losh key == 1 ? 10 : 169*92f251f3SWarner Losh key == 2 ? 10 : 170*92f251f3SWarner Losh key == 3 ? 1 : /* reserved */ 171*92f251f3SWarner Losh key == 4 ? 16 : 172*92f251f3SWarner Losh key == 5 ? 12 : 173*92f251f3SWarner Losh key == 6 ? 1 : /* reserved */ 174*92f251f3SWarner Losh /* key == 7 */ 1; /* reserved */ 175*92f251f3SWarner Losh 176*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_MASK =(0x7FFF); 177*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SUCCESS =(0x0000); 178*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INVALID_FUNCTION =(0x0001); 179*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_BUSY =(0x0002); 180*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INVALID_SGL =(0x0003); 181*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INTERNAL_ERROR =(0x0004); 182*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INVALID_VPID =(0x0005); 183*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES =(0x0006); 184*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INVALID_FIELD =(0x0007); 185*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_INVALID_STATE =(0x0008); 186*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED =(0x0009); 187*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_INVALID_ACTION =(0x0020); 188*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_INVALID_TYPE =(0x0021); 189*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_INVALID_PAGE =(0x0022); 190*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_INVALID_DATA =(0x0023); 191*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS =(0x0024); 192*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_CONFIG_CANT_COMMIT =(0x0025); 193*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR =(0x0040); 194*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE =(0x0042); 195*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE =(0x0043); 196*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_DATA_OVERRUN =(0x0044); 197*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN =(0x0045); 198*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR =(0x0046); 199*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR =(0x0047); 200*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_TASK_TERMINATED =(0x0048); 201*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH =(0x0049); 202*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED =(0x004A); 203*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_IOC_TERMINATED =(0x004B); 204*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SCSI_EXT_TERMINATED =(0x004C); 205*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_EEDP_GUARD_ERROR =(0x004D); 206*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR =(0x004E); 207*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR =(0x004F); 208*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX =(0x0062); 209*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_ABORTED =(0x0063); 210*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE =(0x0064); 211*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_NO_CONNECTION =(0x0065); 212*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH =(0x006A); 213*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR =(0x006D); 214*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA =(0x006E); 215*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT =(0x006F); 216*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT =(0x0070); 217*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_TARGET_NAK_RECEIVED =(0x0071); 218*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED =(0x0090); 219*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN =(0x0091); 220*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED =(0x00A0); 221*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_RAID_ACCEL_ERROR =(0x00B0); 222*92f251f3SWarner Losh 223*92f251f3SWarner Losh inline int MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE =(0x8000); 224*92f251f3SWarner Losh 225*92f251f3SWarner Losh inline string mpi2_iocstatus_str[int key] = 226*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SUCCESS ? "MPI2_IOCSTATUS_SUCCESS" : 227*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INVALID_FUNCTION ? "MPI2_IOCSTATUS_INVALID_FUNCTION" : 228*92f251f3SWarner Losh key == MPI2_IOCSTATUS_BUSY ? "MPI2_IOCSTATUS_BUSY" : 229*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INVALID_SGL ? "MPI2_IOCSTATUS_INVALID_SGL" : 230*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INTERNAL_ERROR ? "MPI2_IOCSTATUS_INTERNAL_ERROR" : 231*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INVALID_VPID ? "MPI2_IOCSTATUS_INVALID_VPID" : 232*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES ? "MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES" : 233*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INVALID_FIELD ? "MPI2_IOCSTATUS_INVALID_FIELD" : 234*92f251f3SWarner Losh key == MPI2_IOCSTATUS_INVALID_STATE ? "MPI2_IOCSTATUS_INVALID_STATE" : 235*92f251f3SWarner Losh key == MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED ? "MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED" : 236*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_INVALID_ACTION ? "MPI2_IOCSTATUS_CONFIG_INVALID_ACTION" : 237*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_INVALID_TYPE ? "MPI2_IOCSTATUS_CONFIG_INVALID_TYPE" : 238*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE ? "MPI2_IOCSTATUS_CONFIG_INVALID_PAGE" : 239*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_INVALID_DATA ? "MPI2_IOCSTATUS_CONFIG_INVALID_DATA" : 240*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS ? "MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS" : 241*92f251f3SWarner Losh key == MPI2_IOCSTATUS_CONFIG_CANT_COMMIT ? "MPI2_IOCSTATUS_CONFIG_CANT_COMMIT" : 242*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR ? "MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR" : 243*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE ? "MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE" : 244*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE ? "MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE" : 245*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_DATA_OVERRUN ? "MPI2_IOCSTATUS_SCSI_DATA_OVERRUN" : 246*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN ? "MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN" : 247*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR ? "MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR" : 248*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR ? "MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR" : 249*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_TASK_TERMINATED ? "MPI2_IOCSTATUS_SCSI_TASK_TERMINATED" : 250*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH ? "MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH" : 251*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED ? "MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED" : 252*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_IOC_TERMINATED ? "MPI2_IOCSTATUS_SCSI_IOC_TERMINATED" : 253*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SCSI_EXT_TERMINATED ? "MPI2_IOCSTATUS_SCSI_EXT_TERMINATED" : 254*92f251f3SWarner Losh key == MPI2_IOCSTATUS_EEDP_GUARD_ERROR ? "MPI2_IOCSTATUS_EEDP_GUARD_ERROR" : 255*92f251f3SWarner Losh key == MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR ? "MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR" : 256*92f251f3SWarner Losh key == MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR ? "MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR" : 257*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX ? "MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX" : 258*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_ABORTED ? "MPI2_IOCSTATUS_TARGET_ABORTED" : 259*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE ? "MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE" : 260*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_NO_CONNECTION ? "MPI2_IOCSTATUS_TARGET_NO_CONNECTION" : 261*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH ? "MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH" : 262*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR ? "MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR" : 263*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA ? "MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA" : 264*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT ? "MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT" : 265*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT ? "MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT" : 266*92f251f3SWarner Losh key == MPI2_IOCSTATUS_TARGET_NAK_RECEIVED ? "MPI2_IOCSTATUS_TARGET_NAK_RECEIVED" : 267*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED ? "MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED" : 268*92f251f3SWarner Losh key == MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN ? "MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN" : 269*92f251f3SWarner Losh key == MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED ? "MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED" : 270*92f251f3SWarner Losh key == MPI2_IOCSTATUS_RAID_ACCEL_ERROR ? "MPI2_IOCSTATUS_RAID_ACCEL_ERROR" : 271*92f251f3SWarner Losh "MPI2_unknown value"; 272*92f251f3SWarner Losh 273*92f251f3SWarner Losh 274*92f251f3SWarner Losh 275*92f251f3SWarner Losh /* 276*92f251f3SWarner Losh * arg0 union *ccb 277*92f251f3SWarner Losh * arg1 mps_command *cm 278*92f251f3SWarner Losh * arg2 sassc->flags 279*92f251f3SWarner Losh * arg3 device_info 280*92f251f3SWarner Losh */ 281*92f251f3SWarner Losh cam::mps:complete 282*92f251f3SWarner Losh { 283*92f251f3SWarner Losh this->ccb = (union ccb *)arg0; 284*92f251f3SWarner Losh this->func = this->ccb->ccb_h.func_code & 0xff; 285*92f251f3SWarner Losh this->periph = this->ccb->ccb_h.path->periph; 286*92f251f3SWarner Losh this->cm = (struct mps_command *)arg1; 287*92f251f3SWarner Losh this->rep = (MPI2_SCSI_IO_REPLY *)this->cm->cm_reply; 288*92f251f3SWarner Losh this->sassc_flags = arg2; 289*92f251f3SWarner Losh this->device_info = arg3; 290*92f251f3SWarner Losh this->trace = 0; 291*92f251f3SWarner Losh this->do_fast = 0; 292*92f251f3SWarner Losh } 293*92f251f3SWarner Losh 294*92f251f3SWarner Losh 295*92f251f3SWarner Losh cam::mps:complete 296*92f251f3SWarner Losh /this->periph->unit_number == 1 || this->periph->unit_number == 2/ 297*92f251f3SWarner Losh { 298*92f251f3SWarner Losh this->trace = 1; 299*92f251f3SWarner Losh } 300*92f251f3SWarner Losh 301*92f251f3SWarner Losh cam::mps:complete 302*92f251f3SWarner Losh /this->trace && this->rep != NULL/ 303*92f251f3SWarner Losh { 304*92f251f3SWarner Losh this->IOCStatus = /* le16toh */ this->rep->IOCStatus & MPI2_IOCSTATUS_MASK; 305*92f251f3SWarner Losh } 306*92f251f3SWarner Losh 307*92f251f3SWarner Losh cam::mps:complete 308*92f251f3SWarner Losh /this->trace && this->rep == NULL/ 309*92f251f3SWarner Losh { 310*92f251f3SWarner Losh /* printf("mps: da%d: FAST", this->periph->unit_number); */ 311*92f251f3SWarner Losh this->trace = 0 312*92f251f3SWarner Losh } 313*92f251f3SWarner Losh 314*92f251f3SWarner Losh cam::mps:complete 315*92f251f3SWarner Losh /this->func == XPT_SCSI_IO/ 316*92f251f3SWarner Losh { 317*92f251f3SWarner Losh this->hdr = &this->ccb->ccb_h; 318*92f251f3SWarner Losh this->csio = &this->ccb->csio; 319*92f251f3SWarner Losh this->cdb = this->hdr->flags & CAM_CDB_POINTER ? 320*92f251f3SWarner Losh this->csio->cdb_io.cdb_ptr : 321*92f251f3SWarner Losh &this->csio->cdb_io.cdb_bytes[0]; 322*92f251f3SWarner Losh this->cdb_len = this->csio->cdb_len ? this->csio->cdb_len : 323*92f251f3SWarner Losh scsi_cdb_len[this->cdb[0] >> 5]; 324*92f251f3SWarner Losh } 325*92f251f3SWarner Losh 326*92f251f3SWarner Losh cam::mps:complete 327*92f251f3SWarner Losh /this->trace && this->rep != NULL && this->func == XPT_SCSI_IO/ 328*92f251f3SWarner Losh { 329*92f251f3SWarner Losh printf("mps: da%d: SLOW CDB: %s Status: %s", this->periph->unit_number, scsi_op[this->cdb[0]], 330*92f251f3SWarner Losh mpi2_iocstatus_str[this->IOCStatus]); 331*92f251f3SWarner Losh } 332