]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
drivers: net: xgene: Fix redundant prefetch buffer cleanup
authorIyappan Subramanian <isubramanian@apm.com>
Fri, 14 Jul 2017 20:28:59 +0000 (16:28 -0400)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Wed, 9 Aug 2017 14:23:31 +0000 (16:23 +0200)
BugLink: http://bugs.launchpad.net/bugs/1693673
Prefetch buffer cleanup code was called twice, causing EDAC to
report errors during reboot.

[ 1130.972475] xgene-edac 78800000.edac: IOB bridge agent (BA) transaction
error
[ 1130.979584] xgene-edac 78800000.edac: IOB BA write response error
[ 1130.985648] xgene-edac 78800000.edac: IOB BA write access at 0x00.00000000
()
[ 1130.993612] xgene-edac 78800000.edac: IOB BA requestor ID 0x00002400
[ 1131.000242] xgene-edac 78800000.edac: IOB bridge agent (BA) transaction
error
...

This patch fixes the errors by,

- removing the redundant prefetch buffer cleanup from port_ops->shutdown()
- moving port_ops->shutdown() after delete_rings()

Signed-off-by: Iyappan Subramanian <isubramanian@apm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 8aba8474181070a30f56ffd19359f5d80665175e)
Signed-off-by: Joseph Salisbury <joseph.salisbury@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@canonical.com>
drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
drivers/net/ethernet/apm/xgene/xgene_enet_main.c
drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c

index 06e681697c1734872b2317550f17f28c306a63bc..4492b89363261e92647a7e87d5d0b9fdf3d183c6 100644 (file)
@@ -732,27 +732,6 @@ static void xgene_enet_clear(struct xgene_enet_pdata *pdata,
 static void xgene_gport_shutdown(struct xgene_enet_pdata *pdata)
 {
        struct device *dev = &pdata->pdev->dev;
-       struct xgene_enet_desc_ring *ring;
-       u32 pb;
-       int i;
-
-       pb = 0;
-       for (i = 0; i < pdata->rxq_cnt; i++) {
-               ring = pdata->rx_ring[i]->buf_pool;
-               pb |= BIT(xgene_enet_get_fpsel(ring->id));
-               ring = pdata->rx_ring[i]->page_pool;
-               if (ring)
-                       pb |= BIT(xgene_enet_get_fpsel(ring->id));
-
-       }
-       xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIFPRESET_ADDR, pb);
-
-       pb = 0;
-       for (i = 0; i < pdata->txq_cnt; i++) {
-               ring = pdata->tx_ring[i];
-               pb |= BIT(xgene_enet_ring_bufnum(ring->id));
-       }
-       xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIWQRESET_ADDR, pb);
 
        if (dev->of_node) {
                if (!IS_ERR(pdata->clk))
index 523b8eff6d7be67dab281d6fbf23d2c994b41558..a29998973cbaa44232ef85bd9a4e046c44c12ca6 100644 (file)
@@ -2092,8 +2092,8 @@ static int xgene_enet_remove(struct platform_device *pdev)
                xgene_enet_mdio_remove(pdata);
 
        unregister_netdev(ndev);
-       pdata->port_ops->shutdown(pdata);
        xgene_enet_delete_desc_rings(pdata);
+       pdata->port_ops->shutdown(pdata);
        free_netdev(ndev);
 
        return 0;
index a8e063bdee3b280705d80031c956b534675cf752..2062578dfb5543616a5f1af00bec8f66baeb5ebe 100644 (file)
@@ -587,26 +587,6 @@ static void xgene_enet_clear(struct xgene_enet_pdata *pdata,
 static void xgene_enet_shutdown(struct xgene_enet_pdata *p)
 {
        struct device *dev = &p->pdev->dev;
-       struct xgene_enet_desc_ring *ring;
-       u32 pb;
-       int i;
-
-       pb = 0;
-       for (i = 0; i < p->rxq_cnt; i++) {
-               ring = p->rx_ring[i]->buf_pool;
-               pb |= BIT(xgene_enet_get_fpsel(ring->id));
-               ring = p->rx_ring[i]->page_pool;
-               if (ring)
-                       pb |= BIT(xgene_enet_get_fpsel(ring->id));
-       }
-       xgene_enet_wr_ring_if(p, ENET_CFGSSQMIFPRESET_ADDR, pb);
-
-       pb = 0;
-       for (i = 0; i < p->txq_cnt; i++) {
-               ring = p->tx_ring[i];
-               pb |= BIT(xgene_enet_ring_bufnum(ring->id));
-       }
-       xgene_enet_wr_ring_if(p, ENET_CFGSSQMIWQRESET_ADDR, pb);
 
        if (dev->of_node) {
                if (!IS_ERR(p->clk))
index ece19e6d68e3bc53e0dddc8dbbb65e1bdf4af0e1..0a3666c04c7e02675c390d6665e4fc8d76db6309 100644 (file)
@@ -457,26 +457,6 @@ static void xgene_enet_xgcle_bypass(struct xgene_enet_pdata *pdata,
 static void xgene_enet_shutdown(struct xgene_enet_pdata *pdata)
 {
        struct device *dev = &pdata->pdev->dev;
-       struct xgene_enet_desc_ring *ring;
-       u32 pb;
-       int i;
-
-       pb = 0;
-       for (i = 0; i < pdata->rxq_cnt; i++) {
-               ring = pdata->rx_ring[i]->buf_pool;
-               pb |= BIT(xgene_enet_get_fpsel(ring->id));
-               ring = pdata->rx_ring[i]->page_pool;
-               if (ring)
-                       pb |= BIT(xgene_enet_get_fpsel(ring->id));
-       }
-       xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIFPRESET_ADDR, pb);
-
-       pb = 0;
-       for (i = 0; i < pdata->txq_cnt; i++) {
-               ring = pdata->tx_ring[i];
-               pb |= BIT(xgene_enet_ring_bufnum(ring->id));
-       }
-       xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIWQRESET_ADDR, pb);
 
        if (dev->of_node) {
                if (!IS_ERR(pdata->clk))