|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* The following is from the linux kernel scsi_error.c
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* scsi_error.c Copyright (C) 1997 Eric Youngdale
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* SCSI error/timeout handling
|
|
Packit Service |
646995 |
* Initial versions: Eric Youngdale. Based upon conversations with
|
|
Packit Service |
646995 |
* Leonard Zubkoff and David Miller at Linux Expo,
|
|
Packit Service |
646995 |
* ideas originating from all over the place.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Restructured scsi_unjam_host and associated functions.
|
|
Packit Service |
646995 |
* September 04, 2002 Mike Anderson (andmike@us.ibm.com)
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Forward port of Russell King's (rmk@arm.linux.org.uk) changes and
|
|
Packit Service |
646995 |
* minor cleanups.
|
|
Packit Service |
646995 |
* September 30, 2002 Mike Anderson (andmike@us.ibm.com)
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
#include <string.h>
|
|
Packit Service |
646995 |
#include "scsi.h"
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
/**
|
|
Packit Service |
646995 |
* scsi_normalize_sense - normalize main elements from either fixed or
|
|
Packit Service |
646995 |
* descriptor sense data format into a common format.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* @sense_buffer: byte array containing sense data returned by device
|
|
Packit Service |
646995 |
* @sb_len: number of valid bytes in sense_buffer
|
|
Packit Service |
646995 |
* @sshdr: pointer to instance of structure that common
|
|
Packit Service |
646995 |
* elements are written to.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Notes:
|
|
Packit Service |
646995 |
* The "main elements" from sense data are: response_code, sense_key,
|
|
Packit Service |
646995 |
* asc, ascq and additional_length (only for descriptor format).
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Typically this function can be called after a device has
|
|
Packit Service |
646995 |
* responded to a SCSI command with the CHECK_CONDITION status.
|
|
Packit Service |
646995 |
*
|
|
Packit Service |
646995 |
* Return value:
|
|
Packit Service |
646995 |
* 1 if valid sense data information found, else 0;
|
|
Packit Service |
646995 |
**/
|
|
Packit Service |
646995 |
int scsi_normalize_sense(const uint8_t *sense_buffer, int sb_len,
|
|
Packit Service |
646995 |
struct scsi_sense_hdr *sshdr)
|
|
Packit Service |
646995 |
{
|
|
Packit Service |
646995 |
if (!sense_buffer || !sb_len)
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
memset(sshdr, 0, sizeof(struct scsi_sense_hdr));
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
sshdr->response_code = (sense_buffer[0] & 0x7f);
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (!scsi_sense_valid(sshdr))
|
|
Packit Service |
646995 |
return 0;
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
if (sshdr->response_code >= 0x72) {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* descriptor format
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (sb_len > 1)
|
|
Packit Service |
646995 |
sshdr->sense_key = (sense_buffer[1] & 0xf);
|
|
Packit Service |
646995 |
if (sb_len > 2)
|
|
Packit Service |
646995 |
sshdr->asc = sense_buffer[2];
|
|
Packit Service |
646995 |
if (sb_len > 3)
|
|
Packit Service |
646995 |
sshdr->ascq = sense_buffer[3];
|
|
Packit Service |
646995 |
if (sb_len > 7)
|
|
Packit Service |
646995 |
sshdr->additional_length = sense_buffer[7];
|
|
Packit Service |
646995 |
} else {
|
|
Packit Service |
646995 |
/*
|
|
Packit Service |
646995 |
* fixed format
|
|
Packit Service |
646995 |
*/
|
|
Packit Service |
646995 |
if (sb_len > 2)
|
|
Packit Service |
646995 |
sshdr->sense_key = (sense_buffer[2] & 0xf);
|
|
Packit Service |
646995 |
if (sb_len > 7) {
|
|
Packit Service |
646995 |
sb_len = (sb_len < (sense_buffer[7] + 8)) ?
|
|
Packit Service |
646995 |
sb_len : (sense_buffer[7] + 8);
|
|
Packit Service |
646995 |
if (sb_len > 12)
|
|
Packit Service |
646995 |
sshdr->asc = sense_buffer[12];
|
|
Packit Service |
646995 |
if (sb_len > 13)
|
|
Packit Service |
646995 |
sshdr->ascq = sense_buffer[13];
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
}
|
|
Packit Service |
646995 |
|
|
Packit Service |
646995 |
return 1;
|
|
Packit Service |
646995 |
}
|