aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/53c700.c55
1 files changed, 15 insertions, 40 deletions
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
index cb02656eb54c..405d9d6f9653 100644
--- a/drivers/scsi/53c700.c
+++ b/drivers/scsi/53c700.c
@@ -585,16 +585,8 @@ NCR_700_unmap(struct NCR_700_Host_Parameters *hostdata, struct scsi_cmnd *SCp,
585 struct NCR_700_command_slot *slot) 585 struct NCR_700_command_slot *slot)
586{ 586{
587 if(SCp->sc_data_direction != DMA_NONE && 587 if(SCp->sc_data_direction != DMA_NONE &&
588 SCp->sc_data_direction != DMA_BIDIRECTIONAL) { 588 SCp->sc_data_direction != DMA_BIDIRECTIONAL)
589 if(SCp->use_sg) { 589 scsi_dma_unmap(SCp);
590 dma_unmap_sg(hostdata->dev, SCp->request_buffer,
591 SCp->use_sg, SCp->sc_data_direction);
592 } else {
593 dma_unmap_single(hostdata->dev, slot->dma_handle,
594 SCp->request_bufflen,
595 SCp->sc_data_direction);
596 }
597 }
598} 590}
599 591
600STATIC inline void 592STATIC inline void
@@ -1263,14 +1255,13 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
1263 host->host_no, pun, lun, NCR_700_condition[i], 1255 host->host_no, pun, lun, NCR_700_condition[i],
1264 NCR_700_phase[j], dsp - hostdata->pScript); 1256 NCR_700_phase[j], dsp - hostdata->pScript);
1265 if(SCp != NULL) { 1257 if(SCp != NULL) {
1266 scsi_print_command(SCp); 1258 struct scatterlist *sg;
1267 1259
1268 if(SCp->use_sg) { 1260 scsi_print_command(SCp);
1269 for(i = 0; i < SCp->use_sg + 1; i++) { 1261 scsi_for_each_sg(SCp, sg, scsi_sg_count(SCp) + 1, i) {
1270 printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, ((struct scatterlist *)SCp->request_buffer)[i].length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr); 1262 printk(KERN_INFO " SG[%d].length = %d, move_insn=%08x, addr %08x\n", i, sg->length, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].ins, ((struct NCR_700_command_slot *)SCp->host_scribble)->SG[i].pAddr);
1271 }
1272 } 1263 }
1273 } 1264 }
1274 NCR_700_internal_bus_reset(host); 1265 NCR_700_internal_bus_reset(host);
1275 } else if((dsps & 0xfffff000) == A_DEBUG_INTERRUPT) { 1266 } else if((dsps & 0xfffff000) == A_DEBUG_INTERRUPT) {
1276 printk(KERN_NOTICE "scsi%d (%d:%d) DEBUG INTERRUPT %d AT %08x[%04x], continuing\n", 1267 printk(KERN_NOTICE "scsi%d (%d:%d) DEBUG INTERRUPT %d AT %08x[%04x], continuing\n",
@@ -1844,8 +1835,8 @@ NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *))
1844 } 1835 }
1845 /* sanity check: some of the commands generated by the mid-layer 1836 /* sanity check: some of the commands generated by the mid-layer
1846 * have an eccentric idea of their sc_data_direction */ 1837 * have an eccentric idea of their sc_data_direction */
1847 if(!SCp->use_sg && !SCp->request_bufflen 1838 if(!scsi_sg_count(SCp) && !scsi_bufflen(SCp) &&
1848 && SCp->sc_data_direction != DMA_NONE) { 1839 SCp->sc_data_direction != DMA_NONE) {
1849#ifdef NCR_700_DEBUG 1840#ifdef NCR_700_DEBUG
1850 printk("53c700: Command"); 1841 printk("53c700: Command");
1851 scsi_print_command(SCp); 1842 scsi_print_command(SCp);
@@ -1887,31 +1878,15 @@ NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *))
1887 int i; 1878 int i;
1888 int sg_count; 1879 int sg_count;
1889 dma_addr_t vPtr = 0; 1880 dma_addr_t vPtr = 0;
1881 struct scatterlist *sg;
1890 __u32 count = 0; 1882 __u32 count = 0;
1891 1883
1892 if(SCp->use_sg) { 1884 sg_count = scsi_dma_map(SCp);
1893 sg_count = dma_map_sg(hostdata->dev, 1885 BUG_ON(sg_count < 0);
1894 SCp->request_buffer, SCp->use_sg,
1895 direction);
1896 } else {
1897 vPtr = dma_map_single(hostdata->dev,
1898 SCp->request_buffer,
1899 SCp->request_bufflen,
1900 direction);
1901 count = SCp->request_bufflen;
1902 slot->dma_handle = vPtr;
1903 sg_count = 1;
1904 }
1905
1906 1886
1907 for(i = 0; i < sg_count; i++) { 1887 scsi_for_each_sg(SCp, sg, sg_count, i) {
1908 1888 vPtr = sg_dma_address(sg);
1909 if(SCp->use_sg) { 1889 count = sg_dma_len(sg);
1910 struct scatterlist *sg = SCp->request_buffer;
1911
1912 vPtr = sg_dma_address(&sg[i]);
1913 count = sg_dma_len(&sg[i]);
1914 }
1915 1890
1916 slot->SG[i].ins = bS_to_host(move_ins | count); 1891 slot->SG[i].ins = bS_to_host(move_ins | count);
1917 DEBUG((" scatter block %d: move %d[%08x] from 0x%lx\n", 1892 DEBUG((" scatter block %d: move %d[%08x] from 0x%lx\n",