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