@@ -1488,6 +1488,17 @@ static int reset_umac(struct bcmgenet_priv *priv)
1488
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
1502
static int init_umac (struct bcmgenet_priv * priv )
1492
1503
{
1493
1504
struct device * kdev = & priv -> pdev -> dev ;
@@ -1516,10 +1527,7 @@ static int init_umac(struct bcmgenet_priv *priv)
1516
1527
if (!GENET_IS_V1 (priv ) && !GENET_IS_V2 (priv ))
1517
1528
bcmgenet_rbuf_writel (priv , 1 , RBUF_TBUF_SIZE_CTRL );
1518
1529
1519
- /* Mask all interrupts.*/
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 );
1530
+ bcmgenet_intr_disable (priv );
1523
1531
1524
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
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
2014
static int bcmgenet_open (struct net_device * dev )
1990
2015
{
1991
2016
struct bcmgenet_priv * priv = netdev_priv (dev );
@@ -2009,6 +2034,10 @@ static int bcmgenet_open(struct net_device *dev)
2009
2034
/* disable ethernet MAC while updating its registers */
2010
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
2041
bcmgenet_set_hw_addr (priv , dev -> dev_addr );
2013
2042
2014
2043
if (phy_is_internal (priv -> phydev )) {
@@ -2017,6 +2046,8 @@ static int bcmgenet_open(struct net_device *dev)
2017
2046
bcmgenet_ext_writel (priv , reg , EXT_EXT_PWR_MGMT );
2018
2047
}
2019
2048
2049
+ device_set_wakeup_capable (& dev -> dev , 1 );
2050
+
2020
2051
/* Disable RX/TX DMA and flush TX queues */
2021
2052
dma_ctrl = bcmgenet_dma_disable (priv );
2022
2053
@@ -2044,23 +2075,7 @@ static int bcmgenet_open(struct net_device *dev)
2044
2075
goto err_irq0 ;
2045
2076
}
2046
2077
2047
- /* Start the network engine */
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 );
2078
+ bcmgenet_netif_start (dev );
2064
2079
2065
2080
return 0 ;
2066
2081
@@ -2127,42 +2142,48 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv)
2127
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
2161
static int bcmgenet_close (struct net_device * dev )
2131
2162
{
2132
2163
struct bcmgenet_priv * priv = netdev_priv (dev );
2133
2164
int ret ;
2134
2165
2135
2166
netif_dbg (priv , ifdown , dev , "bcmgenet_close\n" );
2136
2167
2137
- phy_stop ( priv -> phydev );
2168
+ bcmgenet_netif_stop ( dev );
2138
2169
2139
2170
/* Disable MAC receive */
2140
2171
umac_enable_set (priv , CMD_RX_EN , false);
2141
2172
2142
- netif_tx_stop_all_queues (dev );
2143
-
2144
2173
ret = bcmgenet_dma_teardown (priv );
2145
2174
if (ret )
2146
2175
return ret ;
2147
2176
2148
2177
/* Disable MAC transmit. TX DMA disabled have to done before this */
2149
2178
umac_enable_set (priv , CMD_TX_EN , false);
2150
2179
2151
- napi_disable (& priv -> napi );
2152
-
2153
2180
/* tx reclaim */
2154
2181
bcmgenet_tx_reclaim_all (dev );
2155
2182
bcmgenet_fini_dma (priv );
2156
2183
2157
2184
free_irq (priv -> irq0 , priv );
2158
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
2187
if (phy_is_internal (priv -> phydev ))
2167
2188
bcmgenet_power_down (priv , GENET_POWER_PASSIVE );
2168
2189
@@ -2563,7 +2584,6 @@ static int bcmgenet_remove(struct platform_device *pdev)
2563
2584
return 0 ;
2564
2585
}
2565
2586
2566
-
2567
2587
static struct platform_driver bcmgenet_driver = {
2568
2588
.probe = bcmgenet_probe ,
2569
2589
.remove = bcmgenet_remove ,
0 commit comments