aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/wd7000.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/wd7000.c')
-rw-r--r--drivers/scsi/wd7000.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
index 30be76514c43..d6fd4259c56b 100644
--- a/drivers/scsi/wd7000.c
+++ b/drivers/scsi/wd7000.c
@@ -1091,6 +1091,7 @@ static int wd7000_queuecommand(struct scsi_cmnd *SCpnt,
1091 unchar *cdb = (unchar *) SCpnt->cmnd; 1091 unchar *cdb = (unchar *) SCpnt->cmnd;
1092 unchar idlun; 1092 unchar idlun;
1093 short cdblen; 1093 short cdblen;
1094 int nseg;
1094 Adapter *host = (Adapter *) SCpnt->device->host->hostdata; 1095 Adapter *host = (Adapter *) SCpnt->device->host->hostdata;
1095 1096
1096 cdblen = SCpnt->cmd_len; 1097 cdblen = SCpnt->cmd_len;
@@ -1106,28 +1107,29 @@ static int wd7000_queuecommand(struct scsi_cmnd *SCpnt,
1106 SCpnt->host_scribble = (unchar *) scb; 1107 SCpnt->host_scribble = (unchar *) scb;
1107 scb->host = host; 1108 scb->host = host;
1108 1109
1109 if (SCpnt->use_sg) { 1110 nseg = scsi_sg_count(SCpnt);
1110 struct scatterlist *sg = (struct scatterlist *) SCpnt->request_buffer; 1111 if (nseg) {
1112 struct scatterlist *sg;
1111 unsigned i; 1113 unsigned i;
1112 1114
1113 if (SCpnt->device->host->sg_tablesize == SG_NONE) { 1115 if (SCpnt->device->host->sg_tablesize == SG_NONE) {
1114 panic("wd7000_queuecommand: scatter/gather not supported.\n"); 1116 panic("wd7000_queuecommand: scatter/gather not supported.\n");
1115 } 1117 }
1116 dprintk("Using scatter/gather with %d elements.\n", SCpnt->use_sg); 1118 dprintk("Using scatter/gather with %d elements.\n", nseg);
1117 1119
1118 sgb = scb->sgb; 1120 sgb = scb->sgb;
1119 scb->op = 1; 1121 scb->op = 1;
1120 any2scsi(scb->dataptr, (int) sgb); 1122 any2scsi(scb->dataptr, (int) sgb);
1121 any2scsi(scb->maxlen, SCpnt->use_sg * sizeof(Sgb)); 1123 any2scsi(scb->maxlen, nseg * sizeof(Sgb));
1122 1124
1123 for (i = 0; i < SCpnt->use_sg; i++) { 1125 scsi_for_each_sg(SCpnt, sg, nseg, i) {
1124 any2scsi(sgb[i].ptr, isa_page_to_bus(sg[i].page) + sg[i].offset); 1126 any2scsi(sgb[i].ptr, isa_page_to_bus(sg->page) + sg->offset);
1125 any2scsi(sgb[i].len, sg[i].length); 1127 any2scsi(sgb[i].len, sg->length);
1126 } 1128 }
1127 } else { 1129 } else {
1128 scb->op = 0; 1130 scb->op = 0;
1129 any2scsi(scb->dataptr, isa_virt_to_bus(SCpnt->request_buffer)); 1131 any2scsi(scb->dataptr, isa_virt_to_bus(scsi_sglist(SCpnt)));
1130 any2scsi(scb->maxlen, SCpnt->request_bufflen); 1132 any2scsi(scb->maxlen, scsi_bufflen(SCpnt));
1131 } 1133 }
1132 1134
1133 /* FIXME: drop lock and yield here ? */ 1135 /* FIXME: drop lock and yield here ? */