|
@@ -1119,6 +1119,36 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int
|
|
|
host->sg_tablesize = QLOGICPTI_MAX_SG(num_free);
|
|
|
}
|
|
|
|
|
|
+static unsigned int scsi_rbuf_get(struct scsi_cmnd *cmd, unsigned char **buf_out)
|
|
|
+{
|
|
|
+ unsigned char *buf;
|
|
|
+ unsigned int buflen;
|
|
|
+
|
|
|
+ if (cmd->use_sg) {
|
|
|
+ struct scatterlist *sg;
|
|
|
+
|
|
|
+ sg = (struct scatterlist *) cmd->request_buffer;
|
|
|
+ buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
|
|
|
+ buflen = sg->length;
|
|
|
+ } else {
|
|
|
+ buf = cmd->request_buffer;
|
|
|
+ buflen = cmd->request_bufflen;
|
|
|
+ }
|
|
|
+
|
|
|
+ *buf_out = buf;
|
|
|
+ return buflen;
|
|
|
+}
|
|
|
+
|
|
|
+static void scsi_rbuf_put(struct scsi_cmnd *cmd, unsigned char *buf)
|
|
|
+{
|
|
|
+ if (cmd->use_sg) {
|
|
|
+ struct scatterlist *sg;
|
|
|
+
|
|
|
+ sg = (struct scatterlist *) cmd->request_buffer;
|
|
|
+ kunmap_atomic(buf - sg->offset, KM_IRQ0);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Until we scan the entire bus with inquiries, go throught this fella...
|
|
|
*/
|
|
@@ -1145,11 +1175,9 @@ static void ourdone(struct scsi_cmnd *Cmnd)
|
|
|
int ok = host_byte(Cmnd->result) == DID_OK;
|
|
|
if (Cmnd->cmnd[0] == 0x12 && ok) {
|
|
|
unsigned char *iqd;
|
|
|
+ unsigned int iqd_len;
|
|
|
|
|
|
- if (Cmnd->use_sg != 0)
|
|
|
- BUG();
|
|
|
-
|
|
|
- iqd = ((unsigned char *)Cmnd->buffer);
|
|
|
+ iqd_len = scsi_rbuf_get(Cmnd, &iqd);
|
|
|
|
|
|
/* tags handled in midlayer */
|
|
|
/* enable sync mode? */
|
|
@@ -1163,6 +1191,9 @@ static void ourdone(struct scsi_cmnd *Cmnd)
|
|
|
if (iqd[7] & 0x20) {
|
|
|
qpti->dev_param[tgt].device_flags |= 0x20;
|
|
|
}
|
|
|
+
|
|
|
+ scsi_rbuf_put(Cmnd, iqd);
|
|
|
+
|
|
|
qpti->sbits |= (1 << tgt);
|
|
|
} else if (!ok) {
|
|
|
qpti->sbits |= (1 << tgt);
|