The MIPS BCM47xx code allocates a struct device for the SoC, sets a 32-bit DMA mask on it and passes it to bcma in struct bcma_soc. bcma never uses it: bus->dev stays NULL for the MIPS SoC host, so cores fall back to doing DMA through their own struct device, whose coherent_dma_mask is 0. Since commit f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms") coherent allocations then fail: bgmac_bcma bcma0:2: Allocation of TX ring 0x200 failed bgmac_bcma bcma0:2: Unable to alloc memory for DMA bgmac_bcma: probe of bcma0:2 failed with error -12 Set bus->dev from the SoC device and do DMA through it, as the ARM SoC host already does. Every SoC host now has a bus device, so drop the fallback that pointed a core's dma_mask at its coherent_dma_mask. This addresses the review of the earlier postings: the cores' DMA masks are no longer touched at all. Tested on an ASUS RT-N16 (BCM4718): bgmac probes and passes traffic. Fixes: f8c55dc6e828 ("MIPS: use generic dma noncoherent ops for simple noncoherent platforms") Link: https://patchwork.kernel.org/project/linux-wireless/patch/20190121101121.24555-1-zajec5@gmail.com/ Link: https://lore.kernel.org/linux-mips/20220107041744.2388470-1-f.fainelli@gmail.com/ Suggested-by: Rafał Miłecki Assisted-by: LLM Signed-off-by: Rosen Penev --- drivers/bcma/host_soc.c | 2 ++ drivers/bcma/main.c | 7 +------ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c index 411cfbf53f7b..6150e1588af5 100644 --- a/drivers/bcma/host_soc.c +++ b/drivers/bcma/host_soc.c @@ -188,6 +188,8 @@ int __init bcma_host_soc_register(struct bcma_soc *soc) int __init bcma_host_soc_init(struct bcma_soc *soc) { + soc->bus.dev = soc->dev; + return bcma_bus_early_register(&soc->bus); } diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c index 72f045e6ed51..3498d5419c19 100644 --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c @@ -251,12 +251,7 @@ void bcma_prepare_core(struct bcma_bus *bus, struct bcma_device *core) core->irq = bus->host_pci->irq; break; case BCMA_HOSTTYPE_SOC: - if (IS_ENABLED(CONFIG_OF) && bus->dev) { - core->dma_dev = bus->dev; - } else { - core->dev.dma_mask = &core->dev.coherent_dma_mask; - core->dma_dev = &core->dev; - } + core->dma_dev = bus->dev; break; case BCMA_HOSTTYPE_SDIO: break; -- 2.56.0