Use dma_alloc_pages to allocate DMAable pages instead of hoping that
the architecture either has GFP_DMA32 or not more than 4G of memory.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/firewire/ohci.c | 26 +++++++++++---------------
 1 file changed, 11 insertions(+), 15 deletions(-)

diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 020cb15a4d8fcc..9811c40956e54d 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -674,17 +674,16 @@ static void ar_context_link_page(struct ar_context *ctx, 
unsigned int index)
 
 static void ar_context_release(struct ar_context *ctx)
 {
+       struct device *dev = ctx->ohci->card.device;
        unsigned int i;
 
        vunmap(ctx->buffer);
 
-       for (i = 0; i < AR_BUFFERS; i++)
-               if (ctx->pages[i]) {
-                       dma_unmap_page(ctx->ohci->card.device,
-                                      ar_buffer_bus(ctx, i),
-                                      PAGE_SIZE, DMA_FROM_DEVICE);
-                       __free_page(ctx->pages[i]);
-               }
+       for (i = 0; i < AR_BUFFERS; i++) {
+               if (ctx->pages[i])
+                       dma_free_pages(dev, PAGE_SIZE, ctx->pages[i],
+                                      ar_buffer_bus(ctx, i), DMA_FROM_DEVICE);
+       }
 }
 
 static void ar_context_abort(struct ar_context *ctx, const char *error_msg)
@@ -970,6 +969,7 @@ static void ar_context_tasklet(unsigned long data)
 static int ar_context_init(struct ar_context *ctx, struct fw_ohci *ohci,
                           unsigned int descriptors_offset, u32 regs)
 {
+       struct device *dev = ohci->card.device;
        unsigned int i;
        dma_addr_t dma_addr;
        struct page *pages[AR_BUFFERS + AR_WRAPAROUND_PAGES];
@@ -980,17 +980,13 @@ static int ar_context_init(struct ar_context *ctx, struct 
fw_ohci *ohci,
        tasklet_init(&ctx->tasklet, ar_context_tasklet, (unsigned long)ctx);
 
        for (i = 0; i < AR_BUFFERS; i++) {
-               ctx->pages[i] = alloc_page(GFP_KERNEL | GFP_DMA32);
+               ctx->pages[i] = dma_alloc_pages(dev, PAGE_SIZE, &dma_addr,
+                                               DMA_FROM_DEVICE, GFP_KERNEL);
                if (!ctx->pages[i])
                        goto out_of_memory;
-               dma_addr = dma_map_page(ohci->card.device, ctx->pages[i],
-                                       0, PAGE_SIZE, DMA_FROM_DEVICE);
-               if (dma_mapping_error(ohci->card.device, dma_addr)) {
-                       __free_page(ctx->pages[i]);
-                       ctx->pages[i] = NULL;
-                       goto out_of_memory;
-               }
                set_page_private(ctx->pages[i], dma_addr);
+               dma_sync_single_for_device(dev, dma_addr, PAGE_SIZE,
+                                          DMA_FROM_DEVICE);
        }
 
        for (i = 0; i < AR_BUFFERS; i++)
-- 
2.28.0

_______________________________________________
Nouveau mailing list
Nouveau@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to