Thread (22 messages) 22 messages, 5 authors, 2016-08-04

Re: [PATCH] [v6] net: emac: emac gigabit ethernet controller driver

From: Arnd Bergmann <arnd@arndb.de>
Date: 2016-08-04 09:21:43
Also in: linux-arm-msm, netdev

On Wednesday, August 3, 2016 4:24:22 PM CEST Timur Tabi wrote:
Arnd Bergmann wrote:
quoted
As I said, this is inherently driver specific. If setting the 64-bit
mask fails, the driver itself needs to fall back to the 32-bit mask
so it can allocate buffers from ZONE_DMA instead of ZONE_NORMAL.
I just posted a v7 of my patch, but I forgot to fix the dma_set_mask 
call.  I'll post a v8 soon, but before I do, what do you think of this:

/* The EMAC itself is capable of 64-bit DMA, so try that first. */
ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (ret) {
         /* Some platforms may restrict the EMAC's address bus to less
          * then the size of DDR. In this case, we need to try a
          * smaller mask.  We could try every possible smaller mask,
          * but that's overkill.  Instead, just fall to 32-bit, which
          * should always work.
          */
         ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
         if (ret) {
                 dev_err(&pdev->dev, "could not set DMA mask\n");
                 return ret;
         }
}
This is basically ok, but then I think you should pass GFP_DMA
or GFP_DMA32 to all allocations that the driver does after
the 64-bit mask fails, otherwise you get a significant overhead
in the bounce buffers.

For data that comes from the network stack, we have no choice
and always use bounce buffers for data that is beyond the mask.

	Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help