ACK: [SRU][Xenial][Yakkety][PATCH 1/1] drivers: net: xgene: Fix redundant prefetch buffer cleanup

Colin Ian King colin.king at canonical.com
Fri Jul 21 09:24:38 UTC 2017


On 14/07/17 21:35, Joseph Salisbury wrote:
> From: Iyappan Subramanian <isubramanian at apm.com>
> 
> 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 at apm.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (back ported from commit 8aba8474181070a30f56ffd19359f5d80665175e)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
>  drivers/net/ethernet/apm/xgene/xgene_enet_hw.c    | 21 ---------------------
>  drivers/net/ethernet/apm/xgene/xgene_enet_main.c  |  2 +-
>  drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c | 21 ---------------------
>  drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c | 21 ---------------------
>  4 files changed, 1 insertion(+), 64 deletions(-)
> 
> diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
> index 18bb955..3ca84af 100644
> --- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
> +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
> @@ -681,27 +681,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, val;
> -	int i;
> -
> -	pb = 0;
> -	for (i = 0; i < pdata->rxq_cnt; i++) {
> -		ring = pdata->rx_ring[i]->buf_pool;
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val - 0x20);
> -	}
> -	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];
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val);
> -	}
> -	xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIWQRESET_ADDR, pb);
>  
>  	if (dev->of_node) {
>  		if (!IS_ERR(pdata->clk))
> diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
> index d1d6b5e..f58971f 100644
> --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
> +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
> @@ -1706,8 +1706,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;
> diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
> index d12e9cb..aa46458 100644
> --- a/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
> +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_sgmac.c
> @@ -527,27 +527,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, val;
> -	int i;
> -
> -	pb = 0;
> -	for (i = 0; i < p->rxq_cnt; i++) {
> -		ring = p->rx_ring[i]->buf_pool;
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val - 0x20);
> -	}
> -	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];
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val);
> -	}
> -	xgene_enet_wr_ring_if(p, ENET_CFGSSQMIWQRESET_ADDR, pb);
>  
>  	if (dev->of_node) {
>  		if (!IS_ERR(p->clk))
> diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
> index 9c6ad0d..0f706f8 100644
> --- a/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
> +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_xgmac.c
> @@ -309,27 +309,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, val;
> -	int i;
> -
> -	pb = 0;
> -	for (i = 0; i < pdata->rxq_cnt; i++) {
> -		ring = pdata->rx_ring[i]->buf_pool;
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val - 0x20);
> -	}
> -	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];
> -
> -		val = xgene_enet_ring_bufnum(ring->id);
> -		pb |= BIT(val);
> -	}
> -	xgene_enet_wr_ring_if(pdata, ENET_CFGSSQMIWQRESET_ADDR, pb);
>  
>  	if (dev->of_node) {
>  		if (!IS_ERR(pdata->clk))
> 

Backport looks correct, positive test results, so..

Acked-by: Colin Ian King <colin.king at canonical.com>






More information about the kernel-team mailing list