use libdisks sense table Reference: /n/sources/patch/applied/scuzzsense Date: Wed Dec 31 22:55:44 CET 2008 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/scuzz/sense.c Wed Dec 31 22:55:32 2008 +++ /sys/src/cmd/scuzz/sense.c Wed Dec 31 22:55:30 2008 @@ -1,6 +1,7 @@ #include #include #include +#include #include "scsireq.h" @@ -23,153 +24,20 @@ "reserved", }; -static struct { - uchar asc; - uchar ascq; - char* diag; -} code[] = { /* see /sys/lib/scsicodes */ -0x00,0x01, "filemark detected", -0x00,0x17, "cleaning requested", -0x01,0x00, "no index/sector signal", -0x02,0x00, "no seek complete", -0x03,0x00, "peripheral device write fault", -0x04,0x00, "drive not ready", -0x04,0x01, "drive becoming ready", -0x04,0x01, "drive need initializing cmd", -0x05,0x00, "logical unit does not respond to selection", -0x08,0x00, "logical unit communication failure", -0x09,0x00, "track-following error", -0x0c,0x00, "write error", -0x0c,0x01, "write error - recovered with auto reallocation", -0x0c,0x02, "write error - auto reallocation failed", -0x0c,0x03, "write error - recommend reassignment", - -0x11,0x00, "unrecovered read error", -0x15,0x00, "positioning error", -0x17,0x00, "recovered read data with retries", -0x18,0x00, "recovered read with ecc correction", -0x1A,0x00, "parameter list length error", -0x1B,0x00, "synchronous data transfer error", - -0x20,0x00, "invalid command", -0x21,0x00, "invalid block address", -0x22,0x00, "illegal function (use 20 00, 24 00, or 26 00)", -0x24,0x00, "illegal field in command list", -0x25,0x00, "invalid lun", -0x26,0x00, "invalid field in parameter list", -0x27,0x00, "write protected", -0x28,0x00, "medium changed", -0x29,0x00, "power-on reset or bus reset occurred", -0x2C,0x00, "command sequence error", - -0x30,0x00, "incompatible medium installed", -0x31,0x00, "medium format corrupted", -0x33,0x00, "tape length error / monitor atip error", -0x34,0x00, "enclosure failure / absorption control error", -0x3A,0x00, "medium not present", -0x3B,0x00, "sequential positioning error", -0x3B,0x01, "tape position error at beginning-of-medium", -0x3B,0x02, "tape position error at end-of-medium", -0x3B,0x08, "reposition error", -0x3B,0x09, "read past end of medium", -0x3B,0x0A, "read past beginning of medium", -0x3B,0x0B, "position past end of medium", -0x3B,0x0C, "position past beginning of medium", -0x3B,0x0D, "medium destination element full", -0x3B,0x0E, "medium source element empty", -0x3B,0x0F, "end of medium reached", -0x3B,0x16, "mechanical positioning or changer error", -0x3D,0x00, "invalid bits in identify message", -0x3E,0x00, "logical unit has not self-configured yet", - -0x40,0x00, "diagnostic failure", -0x42,0x00, "power-on or self test failure", -0x44,0x00, "internal controller error", -0x47,0x00, "scsi parity error", - -0x50,0x00, "write append error", -0x51,0x00, "erase failure", -0x53,0x00, "medium load or eject failed", -0x54,0x00, "scsi to host system interface failure", -0x55,0x00, "system resource failure", -0x57,0x00, "unable to read toc, pma or subcode", -0x5A,0x00, "operator medium removal request", -0x5D,0x00, "failure prediction threshold exceeded", - -/* cd/dvd? */ -0x63,0x00, "end of user area encountered on this track", -0x64,0x00, "illegal mode for this track", -0x65,0x00, "verify failed", -0x67,0x00, "configuration failure", -0x68,0x00, "logical unit not configured", -0x69,0x00, "data loss on logical unit", -0x6f,0x01, "copy protection key exchange failure - key not present", -0x6f,0x02, "copy protection key exchange failure - key not established", -0x6f,0x03, "read of scrambled sector without authentication", -0x6f,0x04, "media region code is mismatched to logical unit region", -0x6f,0x05, "drive region must be permanent/region reset count error", -0x6f,0x00, "copy protection key exchange failure", - -0x72,0x00, "session fixation error", -0x73,0x00, "cd control error", -0x74,0x00, "security error", - -/* vendor specific */ - -0x81,0x00, "illegal track", -0x82,0x00, "command now not valid", -0x83,0x00, "medium removal is prevented", - -0xA0,0x00, "stopped on non-data block", -0xA1,0x00, "invalid start address", -0xA2,0x00, "attempt to cross track boundary", -0xA3,0x00, "illegal medium", -0xA4,0x00, "disc write-protected", -0xA5,0x00, "application code conflict", -0xA6,0x00, "illegal block-size for command", -0xA7,0x00, "block-size conflict", -0xA8,0x00, "illegal transfer-length", -0xA9,0x00, "request for fixation failed", -0xAA,0x00, "end of medium reached", -0xAB,0x00, "illegal track number", -0xAC,0x00, "data track length error", -0xAD,0x00, "buffer underrun", -0xAE,0x00, "illegal track mode", -0xAF,0x00, "optimum power calibration error", - -0xB0,0x00, "calibration area almost full", -0xB1,0x00, "current programme area empty", -0xB2,0x00, "no efm at search address", -0xB3,0x00, "link area encountered", -0xB4,0x00, "calibration area full", -0xB5,0x00, "dummy blocks added", -0xB6,0x00, "block size format conflict", -0xB7,0x00, "current command aborted", - -/* cd/dvd burning? */ -0xD0,0x00, "recovery needed", -0xD1,0x00, "can't recover from track", -0xD2,0x00, "can't recover from program memory area", -0xD3,0x00, "can't recover from leadin area", -0xD4,0x00, "can't recover from leadout area", -0xD5,0x00, "can't recover from optical power calibration area", -0xD6,0x00, "eeprom failure", -}; - extern Biobuf bout; +/* + * use libdisk to read /sys/lib/scsicodes + */ void makesense(ScsiReq *rp) { + char *s; int i; Bprint(&bout, "sense data: %s", key[rp->sense[2] & 0x0F]); - for(i=0; isense[0x0C]) - if(code[i].ascq == 0 || code[i].ascq == rp->sense[0x0D]) - break; - if(rp->sense[7] >= 5 && i < nelem(code)) - Bprint(&bout, ": %s", code[i].diag); + if(rp->sense[7] >= 5 && (s = scsierror(rp->sense[0xc], rp->sense[0xd]))) + Bprint(&bout, ": %s", s); Bprint(&bout, "\n\t"); for(i = 0; i < 8+rp->sense[7]; i++) Bprint(&bout, " %2.2ux", rp->sense[i]);