aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-15 19:51:54 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-15 19:51:54 -0400
commitbc06cffdec85d487c77109dffcd2f285bdc502d3 (patch)
treeadc6e6398243da87e66c56102840597a329183a0 /drivers/block
parentd3502d7f25b22cfc9762bf1781faa9db1bb3be2e (diff)
parent9413d7b8aa777dd1fc7db9563ce5e80d769fe7b5 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (166 commits) [SCSI] ibmvscsi: convert to use the data buffer accessors [SCSI] dc395x: convert to use the data buffer accessors [SCSI] ncr53c8xx: convert to use the data buffer accessors [SCSI] sym53c8xx: convert to use the data buffer accessors [SCSI] ppa: coding police and printk levels [SCSI] aic7xxx_old: remove redundant GFP_ATOMIC from kmalloc [SCSI] i2o: remove redundant GFP_ATOMIC from kmalloc from device.c [SCSI] remove the dead CYBERSTORMIII_SCSI option [SCSI] don't build scsi_dma_{map,unmap} for !HAS_DMA [SCSI] Clean up scsi_add_lun a bit [SCSI] 53c700: Remove printk, which triggers because of low scsi clock on SNI RMs [SCSI] sni_53c710: Cleanup [SCSI] qla4xxx: Fix underrun/overrun conditions [SCSI] megaraid_mbox: use mutex instead of semaphore [SCSI] aacraid: add 51245, 51645 and 52245 adapters to documentation. [SCSI] qla2xxx: update version to 8.02.00-k1. [SCSI] qla2xxx: add support for NPIV [SCSI] stex: use resid for xfer len information [SCSI] Add Brownie 1200U3P to blacklist [SCSI] scsi.c: convert to use the data buffer accessors ...
Diffstat (limited to 'drivers/block')
-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