aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaedon Shin <jaedon.shin@gmail.com>2015-08-20 21:08:26 -0400
committerDavid S. Miller <davem@davemloft.net>2015-08-24 02:00:41 -0400
commitb6df7d61c8776a882dd47ba4714d1445dd7ef2d9 (patch)
treec7fb9230e951946cafc55f6c724e5997038fd680
parenteed635699abaacebc9b19a2f9de9ddc688c390c2 (diff)
net: bcmgenet: fix uncleaned dma flags
Clean the dma flags of multiq ring buffer int the interface stop process. This patch fixes that the genet is not running while the interface is re-enabled. $ ifup eth0 - running after booting $ ifdown eth0 $ ifup eth0 - not running and occur tx_timeout The bcmgenet_dma_disable() in bcmgenet_open() do clean ring16 dma flag only. If the genet has multiq, the dma register is not cleaned. and bcmgenet_init_dma() is not done correctly. in case GENET_V2(tx_queues=4), tdma_ctrl has 0x1e after running bcmgenet_dma_disable(). Signed-off-by: Jaedon Shin <jaedon.shin@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 12a020c105bb..09ff09f828d0 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2126,6 +2126,8 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv)
2126 int ret = 0; 2126 int ret = 0;
2127 int timeout = 0; 2127 int timeout = 0;
2128 u32 reg; 2128 u32 reg;
2129 u32 dma_ctrl;
2130 int i;
2129 2131
2130 /* Disable TDMA to stop add more frames in TX DMA */ 2132 /* Disable TDMA to stop add more frames in TX DMA */
2131 reg = bcmgenet_tdma_readl(priv, DMA_CTRL); 2133 reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
@@ -2169,6 +2171,20 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv)
2169 ret = -ETIMEDOUT; 2171 ret = -ETIMEDOUT;
2170 } 2172 }
2171 2173
2174 dma_ctrl = 0;
2175 for (i = 0; i < priv->hw_params->rx_queues; i++)
2176 dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
2177 reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
2178 reg &= ~dma_ctrl;
2179 bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
2180
2181 dma_ctrl = 0;
2182 for (i = 0; i < priv->hw_params->tx_queues; i++)
2183 dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
2184 reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
2185 reg &= ~dma_ctrl;
2186 bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
2187
2172 return ret; 2188 return ret;
2173} 2189}
2174 2190