aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2014-07-21 18:29:20 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-21 19:04:30 -0400
commite29585b8d8707686d3f8f66fdfd20d8c66fb5f6d (patch)
tree4a393563fbc53826e1f83ff8c83a8e47a808c791
parentef3d4f11dbb9d65ef2a70c7929467e3f0e7b8399 (diff)
net: bcmgenet: add umac_enable_set helper
Factor the code touching the UniMAC RX/TX enable bits since we are going to re-use it for implementing suspend/resume. Signed-off-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.c37
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 3cbf29095257..c037c888640d 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1437,6 +1437,25 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
1437 } 1437 }
1438} 1438}
1439 1439
1440static void umac_enable_set(struct bcmgenet_priv *priv, u32 mask,
1441 bool enable)
1442{
1443 u32 reg;
1444
1445 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
1446 if (enable)
1447 reg |= mask;
1448 else
1449 reg &= ~mask;
1450 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
1451
1452 /* UniMAC stops on a packet boundary, wait for a full-size packet
1453 * to be processed
1454 */
1455 if (enable == 0)
1456 usleep_range(1000, 2000);
1457}
1458
1440static int reset_umac(struct bcmgenet_priv *priv) 1459static int reset_umac(struct bcmgenet_priv *priv)
1441{ 1460{
1442 struct device *kdev = &priv->pdev->dev; 1461 struct device *kdev = &priv->pdev->dev;
@@ -1988,9 +2007,7 @@ static int bcmgenet_open(struct net_device *dev)
1988 goto err_clk_disable; 2007 goto err_clk_disable;
1989 2008
1990 /* disable ethernet MAC while updating its registers */ 2009 /* disable ethernet MAC while updating its registers */
1991 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 2010 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
1992 reg &= ~(CMD_TX_EN | CMD_RX_EN);
1993 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
1994 2011
1995 bcmgenet_set_hw_addr(priv, dev->dev_addr); 2012 bcmgenet_set_hw_addr(priv, dev->dev_addr);
1996 2013
@@ -2030,11 +2047,10 @@ static int bcmgenet_open(struct net_device *dev)
2030 /* Start the network engine */ 2047 /* Start the network engine */
2031 napi_enable(&priv->napi); 2048 napi_enable(&priv->napi);
2032 2049
2033 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 2050 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
2034 reg |= (CMD_TX_EN | CMD_RX_EN);
2035 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
2036 2051
2037 /* Make sure we reflect the value of CRC_CMD_FWD */ 2052 /* Make sure we reflect the value of CRC_CMD_FWD */
2053 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
2038 priv->crc_fwd_en = !!(reg & CMD_CRC_FWD); 2054 priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
2039 2055
2040 device_set_wakeup_capable(&dev->dev, 1); 2056 device_set_wakeup_capable(&dev->dev, 1);
@@ -2115,16 +2131,13 @@ static int bcmgenet_close(struct net_device *dev)
2115{ 2131{
2116 struct bcmgenet_priv *priv = netdev_priv(dev); 2132 struct bcmgenet_priv *priv = netdev_priv(dev);
2117 int ret; 2133 int ret;
2118 u32 reg;
2119 2134
2120 netif_dbg(priv, ifdown, dev, "bcmgenet_close\n"); 2135 netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
2121 2136
2122 phy_stop(priv->phydev); 2137 phy_stop(priv->phydev);
2123 2138
2124 /* Disable MAC receive */ 2139 /* Disable MAC receive */
2125 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 2140 umac_enable_set(priv, CMD_RX_EN, false);
2126 reg &= ~CMD_RX_EN;
2127 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
2128 2141
2129 netif_tx_stop_all_queues(dev); 2142 netif_tx_stop_all_queues(dev);
2130 2143
@@ -2133,9 +2146,7 @@ static int bcmgenet_close(struct net_device *dev)
2133 return ret; 2146 return ret;
2134 2147
2135 /* Disable MAC transmit. TX DMA disabled have to done before this */ 2148 /* Disable MAC transmit. TX DMA disabled have to done before this */
2136 reg = bcmgenet_umac_readl(priv, UMAC_CMD); 2149 umac_enable_set(priv, CMD_TX_EN, false);
2137 reg &= ~CMD_TX_EN;
2138 bcmgenet_umac_writel(priv, reg, UMAC_CMD);
2139 2150
2140 napi_disable(&priv->napi); 2151 napi_disable(&priv->napi);
2141 2152