53c700: convert to dma_alloc_noncoherent
Use the new non-coherent DMA API including proper ownership transfers. Signed-off-by: Christoph Hellwig <hch@lst.de> Tested-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
This commit is contained in:
parent
7f3bb7f53a
commit
d69d8adc5b
|
@ -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,
|
||||||
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)
|
||||||
(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);
|
||||||
|
|
Loading…
Reference in New Issue