drivers: net: xgene: Fix redundant prefetch buffer cleanup
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>
This commit is contained in:
Родитель
61c759cdf4
Коммит
8aba847418
|
@ -763,27 +763,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))
|
||||
|
|
|
@ -2159,8 +2159,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;
|
||||
|
|
|
@ -534,26 +534,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))
|
||||
|
|
|
@ -446,26 +446,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))
|
||||
|
|
Загрузка…
Ссылка в новой задаче