aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/aic7xxx_old.c55
1 files changed, 14 insertions, 41 deletions
diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c
index a988d5abf702..f5e3c6b27c70 100644
--- a/drivers/scsi/aic7xxx_old.c
+++ b/drivers/scsi/aic7xxx_old.c
@@ -2690,17 +2690,8 @@ aic7xxx_done(struct aic7xxx_host *p, struct aic7xxx_scb *scb)
2690 struct aic7xxx_scb *scbp; 2690 struct aic7xxx_scb *scbp;
2691 unsigned char queue_depth; 2691 unsigned char queue_depth;
2692 2692
2693 if (cmd->use_sg > 1) 2693 scsi_dma_unmap(cmd);
2694 {
2695 struct scatterlist *sg;
2696 2694
2697 sg = (struct scatterlist *)cmd->request_buffer;
2698 pci_unmap_sg(p->pdev, sg, cmd->use_sg, cmd->sc_data_direction);
2699 }
2700 else if (cmd->request_bufflen)
2701 pci_unmap_single(p->pdev, aic7xxx_mapping(cmd),
2702 cmd->request_bufflen,
2703 cmd->sc_data_direction);
2704 if (scb->flags & SCB_SENSE) 2695 if (scb->flags & SCB_SENSE)
2705 { 2696 {
2706 pci_unmap_single(p->pdev, 2697 pci_unmap_single(p->pdev,
@@ -3869,7 +3860,7 @@ aic7xxx_calculate_residual (struct aic7xxx_host *p, struct aic7xxx_scb *scb)
3869 * the mid layer didn't check residual data counts to see if the 3860 * the mid layer didn't check residual data counts to see if the
3870 * command needs retried. 3861 * command needs retried.
3871 */ 3862 */
3872 cmd->resid = scb->sg_length - actual; 3863 scsi_set_resid(cmd, scb->sg_length - actual);
3873 aic7xxx_status(cmd) = hscb->target_status; 3864 aic7xxx_status(cmd) = hscb->target_status;
3874 } 3865 }
3875 } 3866 }
@@ -10137,6 +10128,7 @@ static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
10137 struct scsi_device *sdptr = cmd->device; 10128 struct scsi_device *sdptr = cmd->device;
10138 unsigned char tindex = TARGET_INDEX(cmd); 10129 unsigned char tindex = TARGET_INDEX(cmd);
10139 struct request *req = cmd->request; 10130 struct request *req = cmd->request;
10131 int use_sg;
10140 10132
10141 mask = (0x01 << tindex); 10133 mask = (0x01 << tindex);
10142 hscb = scb->hscb; 10134 hscb = scb->hscb;
@@ -10209,8 +10201,10 @@ static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
10209 memcpy(scb->cmnd, cmd->cmnd, cmd->cmd_len); 10201 memcpy(scb->cmnd, cmd->cmnd, cmd->cmd_len);
10210 hscb->SCSI_cmd_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, scb->cmnd)); 10202 hscb->SCSI_cmd_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, scb->cmnd));
10211 10203
10212 if (cmd->use_sg) 10204 use_sg = scsi_dma_map(cmd);
10213 { 10205 BUG_ON(use_sg < 0);
10206
10207 if (use_sg) {
10214 struct scatterlist *sg; /* Must be mid-level SCSI code scatterlist */ 10208 struct scatterlist *sg; /* Must be mid-level SCSI code scatterlist */
10215 10209
10216 /* 10210 /*
@@ -10219,11 +10213,11 @@ static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
10219 * differences and the kernel SG list uses virtual addresses where 10213 * differences and the kernel SG list uses virtual addresses where
10220 * we need physical addresses. 10214 * we need physical addresses.
10221 */ 10215 */
10222 int i, use_sg; 10216 int i;
10223 10217
10224 sg = (struct scatterlist *)cmd->request_buffer;
10225 scb->sg_length = 0; 10218 scb->sg_length = 0;
10226 use_sg = pci_map_sg(p->pdev, sg, cmd->use_sg, cmd->sc_data_direction); 10219
10220
10227 /* 10221 /*
10228 * Copy the segments into the SG array. NOTE!!! - We used to 10222 * Copy the segments into the SG array. NOTE!!! - We used to
10229 * have the first entry both in the data_pointer area and the first 10223 * have the first entry both in the data_pointer area and the first
@@ -10231,10 +10225,9 @@ static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
10231 * entry in both places, but now we download the address of 10225 * entry in both places, but now we download the address of
10232 * scb->sg_list[1] instead of 0 to the sg pointer in the hscb. 10226 * scb->sg_list[1] instead of 0 to the sg pointer in the hscb.
10233 */ 10227 */
10234 for (i = 0; i < use_sg; i++) 10228 scsi_for_each_sg(cmd, sg, use_sg, i) {
10235 { 10229 unsigned int len = sg_dma_len(sg);
10236 unsigned int len = sg_dma_len(sg+i); 10230 scb->sg_list[i].address = cpu_to_le32(sg_dma_address(sg));
10237 scb->sg_list[i].address = cpu_to_le32(sg_dma_address(sg+i));
10238 scb->sg_list[i].length = cpu_to_le32(len); 10231 scb->sg_list[i].length = cpu_to_le32(len);
10239 scb->sg_length += len; 10232 scb->sg_length += len;
10240 } 10233 }
@@ -10244,33 +10237,13 @@ static void aic7xxx_buildscb(struct aic7xxx_host *p, struct scsi_cmnd *cmd,
10244 scb->sg_count = i; 10237 scb->sg_count = i;
10245 hscb->SG_segment_count = i; 10238 hscb->SG_segment_count = i;
10246 hscb->SG_list_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, &scb->sg_list[1])); 10239 hscb->SG_list_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, &scb->sg_list[1]));
10247 } 10240 } else {
10248 else
10249 {
10250 if (cmd->request_bufflen)
10251 {
10252 unsigned int address = pci_map_single(p->pdev, cmd->request_buffer,
10253 cmd->request_bufflen,
10254 cmd->sc_data_direction);
10255 aic7xxx_mapping(cmd) = address;
10256 scb->sg_list[0].address = cpu_to_le32(address);
10257 scb->sg_list[0].length = cpu_to_le32(cmd->request_bufflen);
10258 scb->sg_count = 1;
10259 scb->sg_length = cmd->request_bufflen;
10260 hscb->SG_segment_count = 1;
10261 hscb->SG_list_pointer = cpu_to_le32(SCB_DMA_ADDR(scb, &scb->sg_list[0]));
10262 hscb->data_count = scb->sg_list[0].length;
10263 hscb->data_pointer = scb->sg_list[0].address;
10264 }
10265 else
10266 {
10267 scb->sg_count = 0; 10241 scb->sg_count = 0;
10268 scb->sg_length = 0; 10242 scb->sg_length = 0;
10269 hscb->SG_segment_count = 0; 10243 hscb->SG_segment_count = 0;
10270 hscb->SG_list_pointer = 0; 10244 hscb->SG_list_pointer = 0;
10271 hscb->data_count = 0; 10245 hscb->data_count = 0;
10272 hscb->data_pointer = 0; 10246 hscb->data_pointer = 0;
10273 }
10274 } 10247 }
10275} 10248}
10276 10249