aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Fainelli <f.fainelli@gmail.com>2014-07-21 18:29:21 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-21 19:04:30 -0400
commit909ff5efbab85f2724c5f91ec200ebc9df50c440 (patch)
treedb1b9420c3394803c8f925a56d2be64a5708df72
parente29585b8d8707686d3f8f66fdfd20d8c66fb5f6d (diff)
net: bcmgenet: modularize bcmgenet_{open,close}
Introduce a bunch of helper functions: bcmgenet_netif_start, bcmgenet_netif_stop and bcmgenet_intr_disable to help reuse code that is going to be necessary for 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.c86
1 files changed, 53 insertions, 33 deletions
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index c037c888640d..5cab188ee323 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1488,6 +1488,17 @@ static int reset_umac(struct bcmgenet_priv *priv)
1488 return 0; 1488 return 0;
1489} 1489}
1490 1490
1491static void bcmgenet_intr_disable(struct bcmgenet_priv *priv)
1492{
1493 /* Mask all interrupts.*/
1494 bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
1495 bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
1496 bcmgenet_intrl2_0_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
1497 bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
1498 bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
1499 bcmgenet_intrl2_1_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
1500}
1501
1491static int init_umac(struct bcmgenet_priv *priv) 1502static int init_umac(struct bcmgenet_priv *priv)
1492{ 1503{
1493 struct device *kdev = &priv->pdev->dev; 1504 struct device *kdev = &priv->pdev->dev;
@@ -1516,10 +1527,7 @@ static int init_umac(struct bcmgenet_priv *priv)
1516 if (!GENET_IS_V1(priv) && !GENET_IS_V2(priv)) 1527 if (!GENET_IS_V1(priv) && !GENET_IS_V2(priv))
1517 bcmgenet_rbuf_writel(priv, 1, RBUF_TBUF_SIZE_CTRL); 1528 bcmgenet_rbuf_writel(priv, 1, RBUF_TBUF_SIZE_CTRL);
1518 1529
1519 /* Mask all interrupts.*/ 1530 bcmgenet_intr_disable(priv);
1520 bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
1521 bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
1522 bcmgenet_intrl2_0_writel(priv, 0, INTRL2_CPU_MASK_CLEAR);
1523 1531
1524 cpu_mask_clear = UMAC_IRQ_RXDMA_BDONE; 1532 cpu_mask_clear = UMAC_IRQ_RXDMA_BDONE;
1525 1533
@@ -1986,6 +1994,23 @@ static void bcmgenet_enable_dma(struct bcmgenet_priv *priv, u32 dma_ctrl)
1986 bcmgenet_tdma_writel(priv, reg, DMA_CTRL); 1994 bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
1987} 1995}
1988 1996
1997static void bcmgenet_netif_start(struct net_device *dev)
1998{
1999 struct bcmgenet_priv *priv = netdev_priv(dev);
2000
2001 /* Start the network engine */
2002 napi_enable(&priv->napi);
2003
2004 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
2005
2006 if (phy_is_internal(priv->phydev))
2007 bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
2008
2009 netif_tx_start_all_queues(dev);
2010
2011 phy_start(priv->phydev);
2012}
2013
1989static int bcmgenet_open(struct net_device *dev) 2014static int bcmgenet_open(struct net_device *dev)
1990{ 2015{
1991 struct bcmgenet_priv *priv = netdev_priv(dev); 2016 struct bcmgenet_priv *priv = netdev_priv(dev);
@@ -2009,6 +2034,10 @@ static int bcmgenet_open(struct net_device *dev)
2009 /* disable ethernet MAC while updating its registers */ 2034 /* disable ethernet MAC while updating its registers */
2010 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false); 2035 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, false);
2011 2036
2037 /* Make sure we reflect the value of CRC_CMD_FWD */
2038 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
2039 priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
2040
2012 bcmgenet_set_hw_addr(priv, dev->dev_addr); 2041 bcmgenet_set_hw_addr(priv, dev->dev_addr);
2013 2042
2014 if (phy_is_internal(priv->phydev)) { 2043 if (phy_is_internal(priv->phydev)) {
@@ -2017,6 +2046,8 @@ static int bcmgenet_open(struct net_device *dev)
2017 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); 2046 bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
2018 } 2047 }
2019 2048
2049 device_set_wakeup_capable(&dev->dev, 1);
2050
2020 /* Disable RX/TX DMA and flush TX queues */ 2051 /* Disable RX/TX DMA and flush TX queues */
2021 dma_ctrl = bcmgenet_dma_disable(priv); 2052 dma_ctrl = bcmgenet_dma_disable(priv);
2022 2053
@@ -2044,23 +2075,7 @@ static int bcmgenet_open(struct net_device *dev)
2044 goto err_irq0; 2075 goto err_irq0;
2045 } 2076 }
2046 2077
2047 /* Start the network engine */ 2078 bcmgenet_netif_start(dev);
2048 napi_enable(&priv->napi);
2049
2050 umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
2051
2052 /* Make sure we reflect the value of CRC_CMD_FWD */
2053 reg = bcmgenet_umac_readl(priv, UMAC_CMD);
2054 priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
2055
2056 device_set_wakeup_capable(&dev->dev, 1);
2057
2058 if (phy_is_internal(priv->phydev))
2059 bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
2060
2061 netif_tx_start_all_queues(dev);
2062
2063 phy_start(priv->phydev);
2064 2079
2065 return 0; 2080 return 0;
2066 2081
@@ -2127,6 +2142,22 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv)
2127 return ret; 2142 return ret;
2128} 2143}
2129 2144
2145static void bcmgenet_netif_stop(struct net_device *dev)
2146{
2147 struct bcmgenet_priv *priv = netdev_priv(dev);
2148
2149 netif_tx_stop_all_queues(dev);
2150 napi_disable(&priv->napi);
2151 phy_stop(priv->phydev);
2152
2153 bcmgenet_intr_disable(priv);
2154
2155 /* Wait for pending work items to complete. Since interrupts are
2156 * disabled no new work will be scheduled.
2157 */
2158 cancel_work_sync(&priv->bcmgenet_irq_work);
2159}
2160
2130static int bcmgenet_close(struct net_device *dev) 2161static int bcmgenet_close(struct net_device *dev)
2131{ 2162{
2132 struct bcmgenet_priv *priv = netdev_priv(dev); 2163 struct bcmgenet_priv *priv = netdev_priv(dev);
@@ -2134,13 +2165,11 @@ static int bcmgenet_close(struct net_device *dev)
2134 2165
2135 netif_dbg(priv, ifdown, dev, "bcmgenet_close\n"); 2166 netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
2136 2167
2137 phy_stop(priv->phydev); 2168 bcmgenet_netif_stop(dev);
2138 2169
2139 /* Disable MAC receive */ 2170 /* Disable MAC receive */
2140 umac_enable_set(priv, CMD_RX_EN, false); 2171 umac_enable_set(priv, CMD_RX_EN, false);
2141 2172
2142 netif_tx_stop_all_queues(dev);
2143
2144 ret = bcmgenet_dma_teardown(priv); 2173 ret = bcmgenet_dma_teardown(priv);
2145 if (ret) 2174 if (ret)
2146 return ret; 2175 return ret;
@@ -2148,8 +2177,6 @@ static int bcmgenet_close(struct net_device *dev)
2148 /* Disable MAC transmit. TX DMA disabled have to done before this */ 2177 /* Disable MAC transmit. TX DMA disabled have to done before this */
2149 umac_enable_set(priv, CMD_TX_EN, false); 2178 umac_enable_set(priv, CMD_TX_EN, false);
2150 2179
2151 napi_disable(&priv->napi);
2152
2153 /* tx reclaim */ 2180 /* tx reclaim */
2154 bcmgenet_tx_reclaim_all(dev); 2181 bcmgenet_tx_reclaim_all(dev);
2155 bcmgenet_fini_dma(priv); 2182 bcmgenet_fini_dma(priv);
@@ -2157,12 +2184,6 @@ static int bcmgenet_close(struct net_device *dev)
2157 free_irq(priv->irq0, priv); 2184 free_irq(priv->irq0, priv);
2158 free_irq(priv->irq1, priv); 2185 free_irq(priv->irq1, priv);
2159 2186
2160 /* Wait for pending work items to complete - we are stopping
2161 * the clock now. Since interrupts are disabled, no new work
2162 * will be scheduled.
2163 */
2164 cancel_work_sync(&priv->bcmgenet_irq_work);
2165
2166 if (phy_is_internal(priv->phydev)) 2187 if (phy_is_internal(priv->phydev))
2167 bcmgenet_power_down(priv, GENET_POWER_PASSIVE); 2188 bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
2168 2189
@@ -2563,7 +2584,6 @@ static int bcmgenet_remove(struct platform_device *pdev)
2563 return 0; 2584 return 0;
2564} 2585}
2565 2586
2566
2567static struct platform_driver bcmgenet_driver = { 2587static struct platform_driver bcmgenet_driver = {
2568 .probe = bcmgenet_probe, 2588 .probe = bcmgenet_probe,
2569 .remove = bcmgenet_remove, 2589 .remove = bcmgenet_remove,