diff options
Diffstat (limited to 'drivers/scsi/u14-34f.c')
-rw-r--r-- | drivers/scsi/u14-34f.c | 60 |
1 files changed, 27 insertions, 33 deletions
diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c index 3de08a15de40..9e8232a1f169 100644 --- a/drivers/scsi/u14-34f.c +++ b/drivers/scsi/u14-34f.c | |||
@@ -1111,7 +1111,7 @@ static int u14_34f_detect(struct scsi_host_template *tpnt) { | |||
1111 | static void map_dma(unsigned int i, unsigned int j) { | 1111 | static void map_dma(unsigned int i, unsigned int j) { |
1112 | unsigned int data_len = 0; | 1112 | unsigned int data_len = 0; |
1113 | unsigned int k, count, pci_dir; | 1113 | unsigned int k, count, pci_dir; |
1114 | struct scatterlist *sgpnt; | 1114 | struct scatterlist *sg; |
1115 | struct mscp *cpp; | 1115 | struct mscp *cpp; |
1116 | struct scsi_cmnd *SCpnt; | 1116 | struct scsi_cmnd *SCpnt; |
1117 | 1117 | ||
@@ -1124,33 +1124,28 @@ static void map_dma(unsigned int i, unsigned int j) { | |||
1124 | 1124 | ||
1125 | cpp->sense_len = sizeof SCpnt->sense_buffer; | 1125 | cpp->sense_len = sizeof SCpnt->sense_buffer; |
1126 | 1126 | ||
1127 | if (!SCpnt->use_sg) { | 1127 | if (scsi_bufflen(SCpnt)) { |
1128 | 1128 | count = scsi_dma_map(SCpnt); | |
1129 | /* If we get here with PCI_DMA_NONE, pci_map_single triggers a BUG() */ | 1129 | BUG_ON(count < 0); |
1130 | if (!SCpnt->request_bufflen) pci_dir = PCI_DMA_BIDIRECTIONAL; | 1130 | |
1131 | 1131 | scsi_for_each_sg(SCpnt, sg, count, k) { | |
1132 | if (SCpnt->request_buffer) | 1132 | cpp->sglist[k].address = H2DEV(sg_dma_address(sg)); |
1133 | cpp->data_address = H2DEV(pci_map_single(HD(j)->pdev, | 1133 | cpp->sglist[k].num_bytes = H2DEV(sg_dma_len(sg)); |
1134 | SCpnt->request_buffer, SCpnt->request_bufflen, pci_dir)); | 1134 | data_len += sg->length; |
1135 | 1135 | } | |
1136 | cpp->data_len = H2DEV(SCpnt->request_bufflen); | 1136 | |
1137 | return; | 1137 | cpp->sg = TRUE; |
1138 | } | 1138 | cpp->use_sg = scsi_sg_count(SCpnt); |
1139 | 1139 | cpp->data_address = | |
1140 | sgpnt = (struct scatterlist *) SCpnt->request_buffer; | 1140 | H2DEV(pci_map_single(HD(j)->pdev, cpp->sglist, |
1141 | count = pci_map_sg(HD(j)->pdev, sgpnt, SCpnt->use_sg, pci_dir); | 1141 | cpp->use_sg * sizeof(struct sg_list), |
1142 | 1142 | pci_dir)); | |
1143 | for (k = 0; k < count; k++) { | 1143 | cpp->data_len = H2DEV(data_len); |
1144 | cpp->sglist[k].address = H2DEV(sg_dma_address(&sgpnt[k])); | 1144 | |
1145 | cpp->sglist[k].num_bytes = H2DEV(sg_dma_len(&sgpnt[k])); | 1145 | } else { |
1146 | data_len += sgpnt[k].length; | 1146 | pci_dir = PCI_DMA_BIDIRECTIONAL; |
1147 | } | 1147 | cpp->data_len = H2DEV(scsi_bufflen(SCpnt)); |
1148 | 1148 | } | |
1149 | cpp->sg = TRUE; | ||
1150 | cpp->use_sg = SCpnt->use_sg; | ||
1151 | cpp->data_address = H2DEV(pci_map_single(HD(j)->pdev, cpp->sglist, | ||
1152 | SCpnt->use_sg * sizeof(struct sg_list), pci_dir)); | ||
1153 | cpp->data_len = H2DEV(data_len); | ||
1154 | } | 1149 | } |
1155 | 1150 | ||
1156 | static void unmap_dma(unsigned int i, unsigned int j) { | 1151 | static void unmap_dma(unsigned int i, unsigned int j) { |
@@ -1165,8 +1160,7 @@ static void unmap_dma(unsigned int i, unsigned int j) { | |||
1165 | pci_unmap_single(HD(j)->pdev, DEV2H(cpp->sense_addr), | 1160 | pci_unmap_single(HD(j)->pdev, DEV2H(cpp->sense_addr), |
1166 | DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE); | 1161 | DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE); |
1167 | 1162 | ||
1168 | if (SCpnt->use_sg) | 1163 | scsi_dma_unmap(SCpnt); |
1169 | pci_unmap_sg(HD(j)->pdev, SCpnt->request_buffer, SCpnt->use_sg, pci_dir); | ||
1170 | 1164 | ||
1171 | if (!DEV2H(cpp->data_len)) pci_dir = PCI_DMA_BIDIRECTIONAL; | 1165 | if (!DEV2H(cpp->data_len)) pci_dir = PCI_DMA_BIDIRECTIONAL; |
1172 | 1166 | ||
@@ -1187,9 +1181,9 @@ static void sync_dma(unsigned int i, unsigned int j) { | |||
1187 | pci_dma_sync_single_for_cpu(HD(j)->pdev, DEV2H(cpp->sense_addr), | 1181 | pci_dma_sync_single_for_cpu(HD(j)->pdev, DEV2H(cpp->sense_addr), |
1188 | DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE); | 1182 | DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE); |
1189 | 1183 | ||
1190 | if (SCpnt->use_sg) | 1184 | if (scsi_sg_count(SCpnt)) |
1191 | pci_dma_sync_sg_for_cpu(HD(j)->pdev, SCpnt->request_buffer, | 1185 | pci_dma_sync_sg_for_cpu(HD(j)->pdev, scsi_sglist(SCpnt), |
1192 | SCpnt->use_sg, pci_dir); | 1186 | scsi_sg_count(SCpnt), pci_dir); |
1193 | 1187 | ||
1194 | if (!DEV2H(cpp->data_len)) pci_dir = PCI_DMA_BIDIRECTIONAL; | 1188 | if (!DEV2H(cpp->data_len)) pci_dir = PCI_DMA_BIDIRECTIONAL; |
1195 | 1189 | ||