Blame usr/scsi.c

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
}