net: stmmac: Only enable enhanced addressing mode when needed
authorThierry Reding <treding@nvidia.com>
Wed, 2 Oct 2019 14:52:57 +0000 (16:52 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Oct 2019 19:00:50 +0000 (12:00 -0700)
Enhanced addressing mode is only required when more than 32 bits need to
be addressed. Add a DMA configuration parameter to enable this mode only
when needed.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
include/linux/stmmac.h

index 53c4a40..19ef037 100644 (file)
@@ -27,7 +27,10 @@ static void dwxgmac2_dma_init(void __iomem *ioaddr,
        if (dma_cfg->aal)
                value |= XGMAC_AAL;
 
-       writel(value | XGMAC_EAME, ioaddr + XGMAC_DMA_SYSBUS_MODE);
+       if (dma_cfg->eame)
+               value |= XGMAC_EAME;
+
+       writel(value, ioaddr + XGMAC_DMA_SYSBUS_MODE);
 }
 
 static void dwxgmac2_dma_init_chan(void __iomem *ioaddr,
index d323273..2da1f77 100644 (file)
@@ -4514,6 +4514,13 @@ int stmmac_dvr_probe(struct device *device,
                if (!ret) {
                        dev_info(priv->device, "Using %d bits DMA width\n",
                                 priv->dma_cap.addr64);
+
+                       /*
+                        * If more than 32 bits can be addressed, make sure to
+                        * enable enhanced addressing mode.
+                        */
+                       if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT))
+                               priv->plat->dma_cfg->eame = true;
                } else {
                        ret = dma_set_mask_and_coherent(device, DMA_BIT_MASK(32));
                        if (ret) {
index dc60d03..86f9464 100644 (file)
@@ -92,6 +92,7 @@ struct stmmac_dma_cfg {
        int fixed_burst;
        int mixed_burst;
        bool aal;
+       bool eame;
 };
 
 #define AXI_BLEN       7