aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/cciss_scsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/block/cciss_scsi.c')
-rw-r--r--drivers/block/cciss_scsi.c75
1 files changed, 22 insertions, 53 deletions
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c
index 90961a8ea895..4aca7ddfdddf 100644
--- a/drivers/block/cciss_scsi.c
+++ b/drivers/block/cciss_scsi.c
@@ -555,7 +555,6 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
555{ 555{
556 struct scsi_cmnd *cmd; 556 struct scsi_cmnd *cmd;
557 ctlr_info_t *ctlr; 557 ctlr_info_t *ctlr;
558 u64bit addr64;
559 ErrorInfo_struct *ei; 558 ErrorInfo_struct *ei;
560 559
561 ei = cp->err_info; 560 ei = cp->err_info;
@@ -569,20 +568,7 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
569 cmd = (struct scsi_cmnd *) cp->scsi_cmd; 568 cmd = (struct scsi_cmnd *) cp->scsi_cmd;
570 ctlr = hba[cp->ctlr]; 569 ctlr = hba[cp->ctlr];
571 570
572 /* undo the DMA mappings */ 571 scsi_dma_unmap(cmd);
573
574 if (cmd->use_sg) {
575 pci_unmap_sg(ctlr->pdev,
576 cmd->request_buffer, cmd->use_sg,
577 cmd->sc_data_direction);
578 }
579 else if (cmd->request_bufflen) {
580 addr64.val32.lower = cp->SG[0].Addr.lower;
581 addr64.val32.upper = cp->SG[0].Addr.upper;
582 pci_unmap_single(ctlr->pdev, (dma_addr_t) addr64.val,
583 cmd->request_bufflen,
584 cmd->sc_data_direction);
585 }
586 572
587 cmd->result = (DID_OK << 16); /* host byte */ 573 cmd->result = (DID_OK << 16); /* host byte */
588 cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */ 574 cmd->result |= (COMMAND_COMPLETE << 8); /* msg byte */
@@ -597,7 +583,7 @@ complete_scsi_command( CommandList_struct *cp, int timeout, __u32 tag)
597 ei->SenseLen > SCSI_SENSE_BUFFERSIZE ? 583 ei->SenseLen > SCSI_SENSE_BUFFERSIZE ?
598 SCSI_SENSE_BUFFERSIZE : 584 SCSI_SENSE_BUFFERSIZE :
599 ei->SenseLen); 585 ei->SenseLen);
600 cmd->resid = ei->ResidualCnt; 586 scsi_set_resid(cmd, ei->ResidualCnt);
601 587
602 if(ei->CommandStatus != 0) 588 if(ei->CommandStatus != 0)
603 { /* an error has occurred */ 589 { /* an error has occurred */
@@ -1204,46 +1190,29 @@ cciss_scatter_gather(struct pci_dev *pdev,
1204 CommandList_struct *cp, 1190 CommandList_struct *cp,
1205 struct scsi_cmnd *cmd) 1191 struct scsi_cmnd *cmd)
1206{ 1192{
1207 unsigned int use_sg, nsegs=0, len; 1193 unsigned int len;
1208 struct scatterlist *scatter = (struct scatterlist *) cmd->request_buffer; 1194 struct scatterlist *sg;
1209 __u64 addr64; 1195 __u64 addr64;
1210 1196 int use_sg, i;
1211 /* is it just one virtual address? */ 1197
1212 if (!cmd->use_sg) { 1198 BUG_ON(scsi_sg_count(cmd) > MAXSGENTRIES);
1213 if (cmd->request_bufflen) { /* anything to xfer? */ 1199
1214 1200 use_sg = scsi_dma_map(cmd);
1215 addr64 = (__u64) pci_map_single(pdev, 1201 if (use_sg) { /* not too many addrs? */
1216 cmd->request_buffer, 1202 scsi_for_each_sg(cmd, sg, use_sg, i) {
1217 cmd->request_bufflen, 1203 addr64 = (__u64) sg_dma_address(sg);
1218 cmd->sc_data_direction); 1204 len = sg_dma_len(sg);
1219 1205 cp->SG[i].Addr.lower =
1220 cp->SG[0].Addr.lower = 1206 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
1221 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF); 1207 cp->SG[i].Addr.upper =
1222 cp->SG[0].Addr.upper = 1208 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
1223 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF); 1209 cp->SG[i].Len = len;
1224 cp->SG[0].Len = cmd->request_bufflen; 1210 cp->SG[i].Ext = 0; // we are not chaining
1225 nsegs=1;
1226 }
1227 } /* else, must be a list of virtual addresses.... */
1228 else if (cmd->use_sg <= MAXSGENTRIES) { /* not too many addrs? */
1229
1230 use_sg = pci_map_sg(pdev, cmd->request_buffer, cmd->use_sg,
1231 cmd->sc_data_direction);
1232
1233 for (nsegs=0; nsegs < use_sg; nsegs++) {
1234 addr64 = (__u64) sg_dma_address(&scatter[nsegs]);
1235 len = sg_dma_len(&scatter[nsegs]);
1236 cp->SG[nsegs].Addr.lower =
1237 (__u32) (addr64 & (__u64) 0x00000000FFFFFFFF);
1238 cp->SG[nsegs].Addr.upper =
1239 (__u32) ((addr64 >> 32) & (__u64) 0x00000000FFFFFFFF);
1240 cp->SG[nsegs].Len = len;
1241 cp->SG[nsegs].Ext = 0; // we are not chaining
1242 } 1211 }
1243 } else BUG(); 1212 }
1244 1213
1245 cp->Header.SGList = (__u8) nsegs; /* no. SGs contig in this cmd */ 1214 cp->Header.SGList = (__u8) use_sg; /* no. SGs contig in this cmd */
1246 cp->Header.SGTotal = (__u16) nsegs; /* total sgs in this cmd list */ 1215 cp->Header.SGTotal = (__u16) use_sg; /* total sgs in this cmd list */
1247 return; 1216 return;
1248} 1217}
1249 1218