diff options
| author | Michael Brown | 2014-06-02 03:17:28 +0200 |
|---|---|---|
| committer | Michael Brown | 2014-06-03 03:04:46 +0200 |
| commit | e047811c859bd11777c9a01d7ca89ca948567199 (patch) | |
| tree | c84557d88a049527dfc80631dcc3d9cb3bed2380 /src/drivers/block/scsi.c | |
| parent | [ethernet] Provide eth_random_addr() to generate random Ethernet addresses (diff) | |
| download | ipxe-e047811c859bd11777c9a01d7ca89ca948567199.tar.gz ipxe-e047811c859bd11777c9a01d7ca89ca948567199.tar.xz ipxe-e047811c859bd11777c9a01d7ca89ca948567199.zip | |
[scsi] Improve sense code parsing
Parse the sense data to extract the reponse code, the sense key, the
additional sense code, and the additional sense code qualifier.
Originally-implemented-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/block/scsi.c')
| -rw-r--r-- | src/drivers/block/scsi.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/drivers/block/scsi.c b/src/drivers/block/scsi.c index 4245f019b..64d692986 100644 --- a/src/drivers/block/scsi.c +++ b/src/drivers/block/scsi.c @@ -132,6 +132,33 @@ int scsi_parse_lun ( const char *lun_string, struct scsi_lun *lun ) { return 0; } +/** + * Parse SCSI sense data + * + * @v data Raw sense data + * @v len Length of raw sense data + * @v sense Descriptor-format sense data to fill in + */ +void scsi_parse_sense ( const void *data, size_t len, + struct scsi_sns_descriptor *sense ) { + const union scsi_sns *sns = data; + + /* Avoid returning uninitialised data */ + memset ( sense, 0, sizeof ( *sense ) ); + + /* Copy, assuming descriptor-format data */ + if ( len < sizeof ( sns->desc ) ) + return; + memcpy ( sense, &sns->desc, sizeof ( *sense ) ); + + /* Convert fixed-format to descriptor-format, if applicable */ + if ( len < sizeof ( sns->fixed ) ) + return; + if ( ! SCSI_SENSE_FIXED ( sns->code ) ) + return; + sense->additional = sns->fixed.additional; +} + /****************************************************************************** * * Interface methods @@ -468,9 +495,10 @@ static void scsicmd_response ( struct scsi_command *scsicmd, underrun = -(response->overrun); DBGC ( scsidev, " underrun -%zd", underrun ); } - DBGC ( scsidev, " sense %02x:%02x:%08x\n", - response->sense.code, response->sense.key, - ntohl ( response->sense.info ) ); + DBGC ( scsidev, " sense %02x key %02x additional %04x\n", + ( response->sense.code & SCSI_SENSE_CODE_MASK ), + ( response->sense.key & SCSI_SENSE_KEY_MASK ), + ntohs ( response->sense.additional ) ); /* Construct error number from sense data */ rc = -EIO_SENSE ( response->sense.key & SCSI_SENSE_KEY_MASK ); |
