📄 scsi_all.c
字号:
/* 50 O XDWRITE(10) */{0x50, D, "XDWRITE(10)"},/* 51 O XPWRITE(10) */{0x51, D, "XPWRITE(10)"},/* 51 M READ DISC INFORMATION {MMC Proposed} */{0x51, R, "READ DISC INFORMATION {MMC Proposed}"},/* 52 O XDREAD(10) */{0x52, D, "XDREAD(10)"},/* 52 M READ TRACK INFORMATION {MMC Proposed} */{0x52, R, "READ TRACK INFORMATION {MMC Proposed}"},/* 53 M RESERVE TRACK {MMC Proposed} */{0x53, R, "RESERVE TRACK {MMC Proposed}"},/* 54 O SEND OPC INFORMATION {MMC Proposed} */{0x54, R, "SEND OPC INFORMATION {MMC Proposed}"},/* 55 OOO OOOOOOOO MODE SELECT(10) */{0x55, ALL & ~(P), "MODE SELECT(10)"},/* 56 MMMOMMMM O RESERVE(10) */{0x56, ALL & ~(M|C|A), "RESERVE(10)"},/* 56 M RESERVE ELEMENT(10) */{0x56, M, "RESERVE ELEMENT(10)"},/* 57 MMMOMMMM O RELEASE(10) */{0x57, ALL & ~(M|C|A), "RELEASE(10"},/* 57 M RELEASE ELEMENT(10) */{0x57, M, "RELEASE ELEMENT(10)"},/* 58 O REPAIR TRACK {MMC Proposed} */{0x58, R, "REPAIR TRACK {MMC Proposed}"},/* 59 O READ MASTER CUE {MMC Proposed} */{0x59, R, "READ MASTER CUE {MMC Proposed}"},/* 5A OOO OOOOOOOO MODE SENSE(10) */{0x5A, ALL & ~(P), "MODE SENSE(10)"},/* 5B M CLOSE TRACK/SESSION {MMC Proposed} */{0x5B, R, "CLOSE TRACK/SESSION {MMC Proposed}"},/* 5C O READ BUFFER CAPACITY {MMC Proposed} */{0x5C, R, "READ BUFFER CAPACITY {MMC Proposed}"},/* 5D O SEND CUE SHEET {MMC Proposed} */{0x5D, R, "SEND CUE SHEET {MMC Proposed}"},/* 5E OOOOOOOOO O PERSISTENT RESERVE IN */{0x5E, ALL & ~(C|A),"PERSISTENT RESERVE IN"},/* 5F OOOOOOOOO O PERSISTENT RESERVE OUT */{0x5F, ALL & ~(C|A),"PERSISTENT RESERVE OUT"},/* 80 O XDWRITE EXTENDED(16) */{0x80, D, "XDWRITE EXTENDED(16)"},/* 81 O REBUILD(16) */{0x81, D, "REBUILD(16)"},/* 82 O REGENERATE(16) */{0x82, D, "REGENERATE(16)"},/* 83 *//* 84 *//* 85 *//* 86 *//* 87 *//* 88 *//* 89 *//* 8A *//* 8B *//* 8C *//* 8D *//* 8E *//* 8F *//* 90 *//* 91 *//* 92 *//* 93 *//* 94 *//* 95 *//* 96 *//* 97 *//* 98 *//* 99 *//* 9A *//* 9B *//* 9C *//* 9D *//* 9E *//* 9F *//* A0 OOOOOOOOOOO REPORT LUNS */{0xA0, ALL & ~(E), "REPORT LUNS"},/* A1 O BLANK {MMC Proposed} */{0xA1, R, "BLANK {MMC Proposed}"},/* A2 O WRITE CD MSF {MMC Proposed} */{0xA2, R, "WRITE CD MSF {MMC Proposed}"},/* A3 M MAINTENANCE (IN) */{0xA3, A, "MAINTENANCE (IN)"},/* A4 O MAINTENANCE (OUT) */{0xA4, A, "MAINTENANCE (OUT)"},/* A5 O M MOVE MEDIUM */{0xA5, T|M, "MOVE MEDIUM"},/* A5 O PLAY AUDIO(12) */{0xA5, R, "PLAY AUDIO(12)"},/* A6 O EXCHANGE MEDIUM */{0xA6, M, "EXCHANGE MEDIUM"},/* A6 O LOAD/UNLOAD CD {MMC Proposed} */{0xA6, R, "LOAD/UNLOAD CD {MMC Proposed}"},/* A7 OO OO OO MOVE MEDIUM ATTACHED */{0xA7, D|T|W|R|O|M, "MOVE MEDIUM ATTACHED"},/* A8 OM O READ(12) */{0xA8, W|R|O, "READ(12)"},/* A8 O GET MESSAGE(12) */{0xA8, C, "GET MESSAGE(12)"},/* A9 O PLAY TRACK RELATIVE(12) */{0xA9, R, "PLAY TRACK RELATIVE(12)"},/* AA O O WRITE(12) */{0xAA, W|O, "WRITE(12)"},/* AA O WRITE CD(12) {MMC Proposed} */{0xAA, R, "WRITE CD(12) {MMC Proposed}"},/* AA O SEND MESSAGE(12) */{0xAA, C, "SEND MESSAGE(12)"},/* AB *//* AC O ERASE(12) */{0xAC, O, "ERASE(12)"},/* AD *//* AE O O WRITE AND VERIFY(12) */{0xAE, W|O, "WRITE AND VERIFY(12)"},/* AF OO O VERIFY(12) */{0xAF, W|R|O, "VERIFY(12)"},/* B0 ZO Z SEARCH DATA HIGH(12) */{0xB0, W|R|O, "SEARCH DATA HIGH(12)"},/* B1 ZO Z SEARCH DATA EQUAL(12) */{0xB1, W|R|O, "SEARCH DATA EQUAL(12)"},/* B2 ZO Z SEARCH DATA LOW(12) */{0xB2, W|R|O, "SEARCH DATA LOW(12)"},/* B3 OO O SET LIMITS(12) */{0xB3, W|R|O, "SET LIMITS(12)"},/* B4 OO OO OO READ ELEMENT STATUS ATTACHED */{0xB4, D|T|W|R|O|M, "READ ELEMENT STATUS ATTACHED"},/* B5 O REQUEST VOLUME ELEMENT ADDRESS */{0xB5, M, "REQUEST VOLUME ELEMENT ADDRESS"},/* B6 O SEND VOLUME TAG */{0xB6, M, "SEND VOLUME TAG"},/* B7 O READ DEFECT DATA(12) */{0xB7, O, "READ DEFECT DATA(12)"},/* B8 O M READ ELEMENT STATUS */{0xB8, T|M, "READ ELEMENT STATUS"},/* B8 O SET CD SPEED {MMC Proposed} */{0xB8, R, "SET CD SPEED {MMC Proposed}"},/* B9 M READ CD MSF {MMC Proposed} */{0xB9, R, "READ CD MSF {MMC Proposed}"},/* BA O SCAN {MMC Proposed} */{0xBA, R, "SCAN {MMC Proposed}"},/* BA M REDUNDANCY GROUP (IN) */{0xBA, A, "REDUNDANCY GROUP (IN)"},/* BB O SET CD-ROM SPEED {proposed} */{0xBB, R, "SET CD-ROM SPEED {proposed}"},/* BB O REDUNDANCY GROUP (OUT) */{0xBB, A, "REDUNDANCY GROUP (OUT)"},/* BC O PLAY CD {MMC Proposed} */{0xBC, R, "PLAY CD {MMC Proposed}"},/* BC M SPARE (IN) */{0xBC, A, "SPARE (IN)"},/* BD M MECHANISM STATUS {MMC Proposed} */{0xBD, R, "MECHANISM STATUS {MMC Proposed}"},/* BD O SPARE (OUT) */{0xBD, A, "SPARE (OUT)"},/* BE O READ CD {MMC Proposed} */{0xBE, R, "READ CD {MMC Proposed}"},/* BE M VOLUME SET (IN) */{0xBE, A, "VOLUME SET (IN)"},/* BF O VOLUME SET (OUT) */{0xBF, A, "VOLUME SET (OUT)"}};const char *scsi_op_desc(u_int16_t opcode, struct scsi_inquiry_data *inq_data){ caddr_t match; int i, j; u_int16_t opmask; u_int16_t pd_type; int num_ops[2]; struct op_table_entry *table[2]; int num_tables; pd_type = SID_TYPE(inq_data); match = cam_quirkmatch((caddr_t)inq_data, (caddr_t)scsi_op_quirk_table, sizeof(scsi_op_quirk_table)/ sizeof(*scsi_op_quirk_table), sizeof(*scsi_op_quirk_table), scsi_inquiry_match); if (match != NULL) { table[0] = ((struct scsi_op_quirk_entry *)match)->op_table; num_ops[0] = ((struct scsi_op_quirk_entry *)match)->num_ops; table[1] = scsi_op_codes; num_ops[1] = sizeof(scsi_op_codes)/sizeof(scsi_op_codes[0]); num_tables = 2; } else { /* * If this is true, we have a vendor specific opcode that * wasn't covered in the quirk table. */ if ((opcode > 0xBF) || ((opcode > 0x5F) && (opcode < 0x80))) return("Vendor Specific Command"); table[0] = scsi_op_codes; num_ops[0] = sizeof(scsi_op_codes)/sizeof(scsi_op_codes[0]); num_tables = 1; } opmask = 1 << pd_type; for (j = 0; j < num_tables; j++) { for (i = 0;i < num_ops[j] && table[j][i].opcode <= opcode; i++){ if ((table[j][i].opcode == opcode) && ((table[j][i].opmask & opmask) != 0)) return(table[j][i].desc); } } /* * If we can't find a match for the command in the table, we just * assume it's a vendor specifc command. */ return("Vendor Specific Command");}#else /* SCSI_NO_OP_STRINGS */const char *scsi_op_desc(u_int16_t opcode, struct scsi_inquiry_data *inq_data){ return("");}#endif#include <sys/param.h>#if !defined(SCSI_NO_SENSE_STRINGS)#define SST(asc, ascq, action, desc) \ asc, ascq, action, desc#else #define SST(asc, ascq, action, desc) \ asc, asc, action#endif /* * If we're in the kernel, 'quantum' is already defined in cam_xpt.c. * Otherwise, we need to define it. */#ifdef KERNELextern const char quantum[];#elsestatic const char quantum[] = "QUANTUM";#endif/* * WARNING: You must update the num_ascs field below for this quirk table * entry if you add more entries. */static struct asc_table_entry quantum_fireball_entries[] = { {SST(0x04, 0x0b, SS_START|SSQ_DECREMENT_COUNT|ENXIO, "Logical unit not ready, initializing cmd. required")}};static struct scsi_sense_quirk_entry asc_quirk_table[] = { { /* * The Quantum Fireball ST and SE like to return 0x04 0x0b when * they really should return 0x04 0x02. 0x04,0x0b isn't * defined in any SCSI spec, and it isn't mentioned in the * hardware manual for these drives. */ {T_DIRECT, SIP_MEDIA_FIXED, "QUANTUM", "FIREBALL S*", "*"}, 1, /* number of vendor-specific sense codes for this entry */ quantum_fireball_entries }};static struct asc_table_entry asc_text[] = {/* * From File: ASC-NUM.TXT * SCSI ASC/ASCQ Assignments * Numeric Sorted Listing * as of 5/12/97 * * D - DIRECT ACCESS DEVICE (SBC) device column key * .T - SEQUENTIAL ACCESS DEVICE (SSC) ------------------- * . L - PRINTER DEVICE (SSC) blank = reserved * . P - PROCESSOR DEVICE (SPC) not blank = allowed * . .W - WRITE ONCE READ MULTIPLE DEVICE (SBC) * . . R - CD DEVICE (MMC) * . . S - SCANNER DEVICE (SGC) * . . .O - OPTICAL MEMORY DEVICE (SBC) * . . . M - MEDIA CHANGER DEVICE (SMC) * . . . C - COMMUNICATION DEVICE (SSC) * . . . .A - STORAGE ARRAY DEVICE (SCC) * . . . . E - ENCLOSURE SERVICES DEVICE (SES) * DTLPWRSOMCAE ASC ASCQ Action Description * ------------ ---- ---- ------ -----------------------------------*//* DTLPWRSOMCAE */{SST(0x00, 0x00, SS_NEPDEF, "No additional sense information") },/* T S */{SST(0x00, 0x01, SS_DEF, "Filemark detected") },/* T S */{SST(0x00, 0x02, SS_DEF, "End-of-partition/medium detected") },/* T */{SST(0x00, 0x03, SS_DEF, "Setmark detected") },/* T S */{SST(0x00, 0x04, SS_DEF, "Beginning-of-partition/medium detected") },/* T S */{SST(0x00, 0x05, SS_DEF, "End-of-data detected") },/* DTLPWRSOMCAE */{SST(0x00, 0x06, SS_DEF, "I/O process terminated") },/* R */{SST(0x00, 0x11, SS_NEDEF|EBUSY, "Audio play operation in progress") },/* R */{SST(0x00, 0x12, SS_NEDEF, "Audio play operation paused") },/* R */{SST(0x00, 0x13, SS_NEDEF, "Audio play operation successfully completed") },/* R */{SST(0x00, 0x14, SS_DEF, "Audio play operation stopped due to error") },/* R */{SST(0x00, 0x15, SS_DEF, "No current audio status to return") },/* DTLPWRSOMCAE */{SST(0x00, 0x16, SS_NEDEF|EBUSY, "Operation in progress") },/* DTL WRSOM AE */{SST(0x00, 0x17, SS_DEF, "Cleaning requested") },/* D W O */{SST(0x01, 0x00, SS_DEF, "No index/sector signal") },/* D WR OM */{SST(0x02, 0x00, SS_DEF, "No seek complete") },/* DTL W SO */{SST(0x03, 0x00, SS_DEF, "Peripheral device write fault") },/* T */{SST(0x03, 0x01, SS_DEF, "No write current") },/* T */{SST(0x03, 0x02, SS_DEF, "Excessive write errors") },/* DTLPWRSOMCAE */{SST(0x04, 0x00, SS_TUR|SSQ_MANY|SSQ_DECREMENT_COUNT|EIO, "Logical unit not ready, cause not reportable") },/* DTLPWRSOMCAE */{SST(0x04, 0x01, SS_TUR|SSQ_MANY|SSQ_DECREMENT_COUNT|EBUSY, "Logical unit is in process of becoming ready") },/* DTLPWRSOMCAE */{SST(0x04, 0x02, SS_START|SSQ_DECREMENT_COUNT|ENXIO, "Logical unit not ready, initializing cmd. required") },/* DTLPWRSOMCAE */{SST(0x04, 0x03, SS_NEDEF|ENXIO, "Logical unit not ready, manual intervention required")},/* DTL O */{SST(0x04, 0x04, SS_NEDEF|EBUSY, "Logical unit not ready, format in progress") },/* DT W OMCA */{SST(0x04, 0x05, SS_NEDEF|EBUSY, "Logical unit not ready, rebuild in progress") },/* DT W OMCA */{SST(0x04, 0x06, SS_NEDEF|EBUSY, "Logical unit not ready, recalculation in progress") },/* DTLPWRSOMCAE */{SST(0x04, 0x07, SS_NEDEF|EBUSY, "Logical unit not ready, operation in progress") },/* R */{SST(0x04, 0x08, SS_NEDEF|EBUSY, "Logical unit not ready, long write in progress") },/* DTL WRSOMCAE */{SST(0x05, 0x00, SS_DEF, "Logical unit does not respond to selection") },/* D WR OM */{SST(0x06, 0x00, SS_DEF, "No reference position found") },/* DTL WRSOM */{SST(0x07, 0x00, SS_DEF, "Multiple peripheral devices selected") },/* DTL WRSOMCAE */{SST(0x08, 0x00, SS_DEF, "Logical unit communication failure") },/* DTL WRSOMCAE */{SST(0x08, 0x01, SS_DEF, "Logical unit communication time-out") },/* DTL WRSOMCAE */{SST(0x08, 0x02, SS_DEF, "Logical unit communication parity error") },/* DT R OM */{SST(0x08, 0x03, SS_DEF, "Logical unit communication crc error (ultra-dma/32)")},/* DT WR O */{SST(0x09, 0x00, SS_DEF, "Track following error") },/* WR O */{SST(0x09, 0x01, SS_DEF, "Tracking servo failure") },/* WR O */{SST(0x09, 0x02, SS_DEF, "Focus servo failure") },/* WR O */{SST(0x09, 0x03, SS_DEF,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -