diff options
Diffstat (limited to 'drivers/scsi/qlogicpti.c')
| -rw-r--r-- | drivers/scsi/qlogicpti.c | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c index a917ab7475ac..1fd5fc6d0fe3 100644 --- a/drivers/scsi/qlogicpti.c +++ b/drivers/scsi/qlogicpti.c | |||
| @@ -1119,6 +1119,36 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int | |||
| 1119 | host->sg_tablesize = QLOGICPTI_MAX_SG(num_free); | 1119 | host->sg_tablesize = QLOGICPTI_MAX_SG(num_free); |
| 1120 | } | 1120 | } |
| 1121 | 1121 | ||
| 1122 | static unsigned int scsi_rbuf_get(struct scsi_cmnd *cmd, unsigned char **buf_out) | ||
| 1123 | { | ||
| 1124 | unsigned char *buf; | ||
| 1125 | unsigned int buflen; | ||
| 1126 | |||
| 1127 | if (cmd->use_sg) { | ||
| 1128 | struct scatterlist *sg; | ||
| 1129 | |||
| 1130 | sg = (struct scatterlist *) cmd->request_buffer; | ||
| 1131 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | ||
| 1132 | buflen = sg->length; | ||
| 1133 | } else { | ||
| 1134 | buf = cmd->request_buffer; | ||
| 1135 | buflen = cmd->request_bufflen; | ||
| 1136 | } | ||
| 1137 | |||
| 1138 | *buf_out = buf; | ||
| 1139 | return buflen; | ||
| 1140 | } | ||
| 1141 | |||
| 1142 | static void scsi_rbuf_put(struct scsi_cmnd *cmd, unsigned char *buf) | ||
| 1143 | { | ||
| 1144 | if (cmd->use_sg) { | ||
| 1145 | struct scatterlist *sg; | ||
| 1146 | |||
| 1147 | sg = (struct scatterlist *) cmd->request_buffer; | ||
| 1148 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | ||
| 1149 | } | ||
| 1150 | } | ||
| 1151 | |||
| 1122 | /* | 1152 | /* |
| 1123 | * Until we scan the entire bus with inquiries, go throught this fella... | 1153 | * Until we scan the entire bus with inquiries, go throught this fella... |
| 1124 | */ | 1154 | */ |
| @@ -1145,11 +1175,9 @@ static void ourdone(struct scsi_cmnd *Cmnd) | |||
| 1145 | int ok = host_byte(Cmnd->result) == DID_OK; | 1175 | int ok = host_byte(Cmnd->result) == DID_OK; |
| 1146 | if (Cmnd->cmnd[0] == 0x12 && ok) { | 1176 | if (Cmnd->cmnd[0] == 0x12 && ok) { |
| 1147 | unsigned char *iqd; | 1177 | unsigned char *iqd; |
| 1178 | unsigned int iqd_len; | ||
| 1148 | 1179 | ||
| 1149 | if (Cmnd->use_sg != 0) | 1180 | iqd_len = scsi_rbuf_get(Cmnd, &iqd); |
| 1150 | BUG(); | ||
| 1151 | |||
| 1152 | iqd = ((unsigned char *)Cmnd->buffer); | ||
| 1153 | 1181 | ||
| 1154 | /* tags handled in midlayer */ | 1182 | /* tags handled in midlayer */ |
| 1155 | /* enable sync mode? */ | 1183 | /* enable sync mode? */ |
| @@ -1163,6 +1191,9 @@ static void ourdone(struct scsi_cmnd *Cmnd) | |||
| 1163 | if (iqd[7] & 0x20) { | 1191 | if (iqd[7] & 0x20) { |
| 1164 | qpti->dev_param[tgt].device_flags |= 0x20; | 1192 | qpti->dev_param[tgt].device_flags |= 0x20; |
| 1165 | } | 1193 | } |
| 1194 | |||
| 1195 | scsi_rbuf_put(Cmnd, iqd); | ||
| 1196 | |||
| 1166 | qpti->sbits |= (1 << tgt); | 1197 | qpti->sbits |= (1 << tgt); |
| 1167 | } else if (!ok) { | 1198 | } else if (!ok) { |
| 1168 | qpti->sbits |= (1 << tgt); | 1199 | qpti->sbits |= (1 << tgt); |
