diff options
author | Florian Fainelli <f.fainelli@gmail.com> | 2014-07-21 18:29:21 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-21 19:04:30 -0400 |
commit | 909ff5efbab85f2724c5f91ec200ebc9df50c440 (patch) | |
tree | db1b9420c3394803c8f925a56d2be64a5708df72 | |
parent | e29585b8d8707686d3f8f66fdfd20d8c66fb5f6d (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.c | 86 |
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 | ||
1491 | static 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 | |||
1491 | static int init_umac(struct bcmgenet_priv *priv) | 1502 | static 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 | ||
1997 | static 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 | |||
1989 | static int bcmgenet_open(struct net_device *dev) | 2014 | static 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 | ||
2145 | static 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 | |||
2130 | static int bcmgenet_close(struct net_device *dev) | 2161 | static 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 | |||
2567 | static struct platform_driver bcmgenet_driver = { | 2587 | static struct platform_driver bcmgenet_driver = { |
2568 | .probe = bcmgenet_probe, | 2588 | .probe = bcmgenet_probe, |
2569 | .remove = bcmgenet_remove, | 2589 | .remove = bcmgenet_remove, |