Commit d69d8adc authored by Christoph Hellwig's avatar Christoph Hellwig

53c700: convert to dma_alloc_noncoherent

Use the new non-coherent DMA API including proper ownership transfers.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Tested-by: default avatarThomas Bogendoerfer <tsbogend@alpha.franken.de>
parent 7f3bb7f5
...@@ -269,18 +269,25 @@ NCR_700_get_SXFER(struct scsi_device *SDp) ...@@ -269,18 +269,25 @@ NCR_700_get_SXFER(struct scsi_device *SDp)
spi_period(SDp->sdev_target)); spi_period(SDp->sdev_target));
} }
static inline dma_addr_t virt_to_dma(struct NCR_700_Host_Parameters *h, void *p)
{
return h->pScript + ((uintptr_t)p - (uintptr_t)h->script);
}
static inline void dma_sync_to_dev(struct NCR_700_Host_Parameters *h, static inline void dma_sync_to_dev(struct NCR_700_Host_Parameters *h,
void *addr, size_t size) void *addr, size_t size)
{ {
if (h->noncoherent) if (h->noncoherent)
dma_cache_sync(h->dev, addr, size, DMA_TO_DEVICE); dma_sync_single_for_device(h->dev, virt_to_dma(h, addr),
size, DMA_BIDIRECTIONAL);
} }
static inline void dma_sync_from_dev(struct NCR_700_Host_Parameters *h, static inline void dma_sync_from_dev(struct NCR_700_Host_Parameters *h,
void *addr, size_t size) void *addr, size_t size)
{ {
if (h->noncoherent) if (h->noncoherent)
dma_cache_sync(h->dev, addr, size, DMA_FROM_DEVICE); dma_sync_single_for_device(h->dev, virt_to_dma(h, addr), size,
DMA_BIDIRECTIONAL);
} }
struct Scsi_Host * struct Scsi_Host *
...@@ -300,8 +307,8 @@ NCR_700_detect(struct scsi_host_template *tpnt, ...@@ -300,8 +307,8 @@ NCR_700_detect(struct scsi_host_template *tpnt,
memory = dma_alloc_coherent(dev, TOTAL_MEM_SIZE, &pScript, GFP_KERNEL); memory = dma_alloc_coherent(dev, TOTAL_MEM_SIZE, &pScript, GFP_KERNEL);
if (!memory) { if (!memory) {
hostdata->noncoherent = 1; hostdata->noncoherent = 1;
memory = dma_alloc_attrs(dev, TOTAL_MEM_SIZE, &pScript, memory = dma_alloc_noncoherent(dev, TOTAL_MEM_SIZE, &pScript,
GFP_KERNEL, DMA_ATTR_NON_CONSISTENT); DMA_BIDIRECTIONAL, GFP_KERNEL);
} }
if (!memory) { if (!memory) {
printk(KERN_ERR "53c700: Failed to allocate memory for driver, detaching\n"); printk(KERN_ERR "53c700: Failed to allocate memory for driver, detaching\n");
...@@ -414,8 +421,9 @@ NCR_700_release(struct Scsi_Host *host) ...@@ -414,8 +421,9 @@ NCR_700_release(struct Scsi_Host *host)
(struct NCR_700_Host_Parameters *)host->hostdata[0]; (struct NCR_700_Host_Parameters *)host->hostdata[0];
if (hostdata->noncoherent) if (hostdata->noncoherent)
dma_free_attrs(hostdata->dev, TOTAL_MEM_SIZE, hostdata->script, dma_free_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
hostdata->pScript, DMA_ATTR_NON_CONSISTENT); hostdata->script, hostdata->pScript,
DMA_BIDIRECTIONAL);
else else
dma_free_coherent(hostdata->dev, TOTAL_MEM_SIZE, dma_free_coherent(hostdata->dev, TOTAL_MEM_SIZE,
hostdata->script, hostdata->pScript); hostdata->script, hostdata->pScript);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment