summaryrefslogtreecommitdiff
path: root/drivers/scsi/ch.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/ch.c')
-rw-r--r--drivers/scsi/ch.c84
1 files changed, 32 insertions, 52 deletions
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 4010fdbf813c..b2c9fb71c9e0 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -112,7 +112,6 @@ typedef struct {
int minor;
char name[8];
struct scsi_device *device;
- struct scsi_device **dt; /* ptrs to data transfer elements */
u_int firsts[CH_TYPES];
u_int counts[CH_TYPES];
u_int voltags;
@@ -123,38 +122,32 @@ static DEFINE_IDR(ch_index_idr);
static DEFINE_SPINLOCK(ch_index_lock);
static const struct {
- unsigned char sense;
- unsigned char asc;
- unsigned char ascq;
- int errno;
+ u8 sense_key;
+ u16 sense_code;
+ int errno;
} ch_err[] = {
/* Just filled in what looks right. Hav'nt checked any standard paper for
these errno assignments, so they may be wrong... */
{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x21,
- .ascq = 0x01,
- .errno = EBADSLT, /* Invalid element address */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = INVALID_ELEMENT_ADDRESS,
+ .errno = EBADSLT,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x28,
- .ascq = 0x01,
- .errno = EBADE, /* Import or export element accessed */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = IMPORT_OR_EXPORT_ELEMENT_ACCESSED,
+ .errno = EBADE,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x3B,
- .ascq = 0x0D,
- .errno = EXFULL, /* Medium destination element full */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = MEDIUM_DESTINATION_ELEMENT_FULL,
+ .errno = EXFULL,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x3B,
- .ascq = 0x0E,
- .errno = EBADE, /* Medium source element empty */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = MEDIUM_SOURCE_ELEMENT_EMPTY,
+ .errno = EBADE,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x20,
- .ascq = 0x00,
- .errno = EBADRQC, /* Invalid command operation code */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = INVALID_COMMAND_OP_CODE,
+ .errno = EBADRQC,
},{
/* end of list */
}
@@ -167,12 +160,10 @@ static int ch_find_errno(struct scsi_sense_hdr *sshdr)
int i,errno = 0;
/* Check to see if additional sense information is available */
- if (scsi_sense_valid(sshdr) &&
- sshdr->asc != 0) {
+ if (scsi_sense_valid(sshdr) && scsi_sense_asc(sshdr) != 0) {
for (i = 0; ch_err[i].errno != 0; i++) {
- if (ch_err[i].sense == sshdr->sense_key &&
- ch_err[i].asc == sshdr->asc &&
- ch_err[i].ascq == sshdr->ascq) {
+ if (ch_err[i].sense_key == sshdr->sense_key &&
+ ch_err[i].sense_code == sshdr->sense_code) {
errno = -ch_err[i].errno;
break;
}
@@ -191,9 +182,8 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd, int cmd_len,
struct scsi_sense_hdr sshdr;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 3,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -363,15 +353,10 @@ ch_readconfig(scsi_changer *ch)
vendor_labels[i]);
}
- /* look up the devices of the data transfer elements */
- ch->dt = kzalloc_objs(*ch->dt, ch->counts[CHET_DT]);
-
- if (!ch->dt) {
- kfree(buffer);
- return -ENOMEM;
- }
-
+ /* report the devices of the data transfer elements */
for (elem = 0; elem < ch->counts[CHET_DT]; elem++) {
+ struct scsi_device *sdev;
+
id = -1;
lun = 0;
if (elem < CH_DT_MAX && -1 != dt_id[elem]) {
@@ -387,10 +372,8 @@ ch_readconfig(scsi_changer *ch)
VPRINTK(KERN_INFO, "dt 0x%x: ",elem+ch->firsts[CHET_DT]);
if (data[6] & 0x80) {
VPRINTK(KERN_CONT, "not this SCSI bus\n");
- ch->dt[elem] = NULL;
} else if (0 == (data[6] & 0x30)) {
VPRINTK(KERN_CONT, "ID/LUN unknown\n");
- ch->dt[elem] = NULL;
} else {
id = ch->device->id;
lun = 0;
@@ -400,18 +383,16 @@ ch_readconfig(scsi_changer *ch)
}
if (-1 != id) {
VPRINTK(KERN_CONT, "ID %i, LUN %i, ",id,lun);
- ch->dt[elem] =
- scsi_device_lookup(ch->device->host,
- ch->device->channel,
- id,lun);
- if (!ch->dt[elem]) {
+ sdev = scsi_device_lookup(ch->device->host,
+ ch->device->channel,
+ id, lun);
+ if (!sdev) {
/* should not happen */
VPRINTK(KERN_CONT, "Huh? device not found!\n");
} else {
VPRINTK(KERN_CONT, "name: %8.8s %16.16s %4.4s\n",
- ch->dt[elem]->vendor,
- ch->dt[elem]->model,
- ch->dt[elem]->rev);
+ sdev->vendor, sdev->model, sdev->rev);
+ scsi_device_put(sdev);
}
}
}
@@ -575,7 +556,6 @@ static void ch_destroy(struct kref *ref)
scsi_changer *ch = container_of(ref, scsi_changer, ref);
ch->device = NULL;
- kfree(ch->dt);
kfree(ch);
}