diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2014-07-21 18:29:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-21 19:04:30 -0400 |
commit | e29585b8d8707686d3f8f66fdfd20d8c66fb5f6d (patch) | |
tree | 4a393563fbc53826e1f83ff8c83a8e47a808c791 | |
parent | ef3d4f11dbb9d65ef2a70c7929467e3f0e7b8399 (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.c | 37 |
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 | ||
1440 | static 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 | |||
1440 | static int reset_umac(struct bcmgenet_priv *priv) | 1459 | static 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 | ||