Arnd Bergmann wrote:
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;
        }
}


--
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
Technologies, Inc.  Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.

Reply via email to