Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 84743bbc authored by James Bottomley's avatar James Bottomley Committed by James Bottomley
Browse files

[SCSI] convert ch to use scsi_execute_req



I also tinkered with it's sense recognition routines to make them take
scsi_sense_hdr structures instead of raw sense data.

Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 820732b5
Loading
Loading
Loading
Loading
+17 −21
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#include <scsi/scsi_ioctl.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_request.h>
#include <scsi/scsi_eh.h>
#include <scsi/scsi_dbg.h>

#define CH_DT_MAX       16
@@ -180,17 +180,17 @@ static struct {

/* ------------------------------------------------------------------- */

static int ch_find_errno(unsigned char *sense_buffer)
static int ch_find_errno(struct scsi_sense_hdr *sshdr)
{
	int i,errno = 0;

	/* Check to see if additional sense information is available */
	if (sense_buffer[7]  > 5 &&
	    sense_buffer[12] != 0) {
	if (scsi_sense_valid(sshdr) &&
	    sshdr->asc != 0) {
		for (i = 0; err[i].errno != 0; i++) {
			if (err[i].sense == sense_buffer[ 2] &&
			    err[i].asc   == sense_buffer[12] &&
			    err[i].ascq  == sense_buffer[13]) {
			if (err[i].sense == sshdr->sense_key &&
			    err[i].asc   == sshdr->asc &&
			    err[i].ascq  == sshdr->ascq) {
				errno = -err[i].errno;
				break;
			}
@@ -206,12 +206,8 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd,
	   void *buffer, unsigned buflength,
	   enum dma_data_direction direction)
{
	int errno, retries = 0, timeout;
	struct scsi_request *sr;
	
	sr = scsi_allocate_request(ch->device, GFP_KERNEL);
	if (NULL == sr)
		return -ENOMEM;
	int errno, retries = 0, timeout, result;
	struct scsi_sense_hdr sshdr;
	
	timeout = (cmd[0] == INITIALIZE_ELEMENT_STATUS)
		? timeout_init : timeout_move;
@@ -223,16 +219,17 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd,
		__scsi_print_command(cmd);
	}

        scsi_wait_req(sr, cmd, buffer, buflength,
		      timeout * HZ, MAX_RETRIES);
        result = scsi_execute_req(ch->device, cmd, direction, buffer,
				  buflength, &sshdr, timeout * HZ,
				  MAX_RETRIES);

	dprintk("result: 0x%x\n",sr->sr_result);
	if (driver_byte(sr->sr_result) & DRIVER_SENSE) {
	dprintk("result: 0x%x\n",result);
	if (driver_byte(result) & DRIVER_SENSE) {
		if (debug)
			scsi_print_req_sense(ch->name, sr);
		errno = ch_find_errno(sr->sr_sense_buffer);
			scsi_print_sense_hdr(ch->name, &sshdr);
		errno = ch_find_errno(&sshdr);

		switch(sr->sr_sense_buffer[2] & 0xf) {
		switch(sshdr.sense_key) {
		case UNIT_ATTENTION:
			ch->unit_attention = 1;
			if (retries++ < 3)
@@ -240,7 +237,6 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd,
			break;
		}
	}
	scsi_release_request(sr);
	return errno;
}