aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLendacky, Thomas <Thomas.Lendacky@amd.com>2015-01-16 13:46:45 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-16 22:24:20 -0500
commit916102c6664dcfc11f76ab1da27882aee1d01d8c (patch)
treeb1c1e84eab61248f28e85ad1a5469e8c7da81223
parent03e50fd7b18351ab4766d4d0f7d25c5b4fefa9d9 (diff)
amd-xgbe: Clear all state during a device restart
When performing a device restart, like during an MTU change, sometimes the device queues still have data and get hung up trying to flush resulting in the device becoming unresponsive until brought down and back up. To prevent this, always perform a device reset during a restart. Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-dev.c18
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-drv.c11
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-main.c1
3 files changed, 24 insertions, 6 deletions
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
index 53f5f66ec2ee..e424997afc55 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
@@ -2107,6 +2107,23 @@ static void xgbe_config_jumbo_enable(struct xgbe_prv_data *pdata)
2107 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val); 2107 XGMAC_IOWRITE_BITS(pdata, MAC_RCR, JE, val);
2108} 2108}
2109 2109
2110static void xgbe_config_mac_speed(struct xgbe_prv_data *pdata)
2111{
2112 switch (pdata->phy_speed) {
2113 case SPEED_10000:
2114 xgbe_set_xgmii_speed(pdata);
2115 break;
2116
2117 case SPEED_2500:
2118 xgbe_set_gmii_2500_speed(pdata);
2119 break;
2120
2121 case SPEED_1000:
2122 xgbe_set_gmii_speed(pdata);
2123 break;
2124 }
2125}
2126
2110static void xgbe_config_checksum_offload(struct xgbe_prv_data *pdata) 2127static void xgbe_config_checksum_offload(struct xgbe_prv_data *pdata)
2111{ 2128{
2112 if (pdata->netdev->features & NETIF_F_RXCSUM) 2129 if (pdata->netdev->features & NETIF_F_RXCSUM)
@@ -2757,6 +2774,7 @@ static int xgbe_init(struct xgbe_prv_data *pdata)
2757 xgbe_config_mac_address(pdata); 2774 xgbe_config_mac_address(pdata);
2758 xgbe_config_jumbo_enable(pdata); 2775 xgbe_config_jumbo_enable(pdata);
2759 xgbe_config_flow_control(pdata); 2776 xgbe_config_flow_control(pdata);
2777 xgbe_config_mac_speed(pdata);
2760 xgbe_config_checksum_offload(pdata); 2778 xgbe_config_checksum_offload(pdata);
2761 xgbe_config_vlan_support(pdata); 2779 xgbe_config_vlan_support(pdata);
2762 xgbe_config_mmc(pdata); 2780 xgbe_config_mmc(pdata);
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
index e2e921768185..bdb373c87050 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
@@ -927,7 +927,7 @@ static void xgbe_stop(struct xgbe_prv_data *pdata)
927 DBGPR("<--xgbe_stop\n"); 927 DBGPR("<--xgbe_stop\n");
928} 928}
929 929
930static void xgbe_restart_dev(struct xgbe_prv_data *pdata, unsigned int reset) 930static void xgbe_restart_dev(struct xgbe_prv_data *pdata)
931{ 931{
932 struct xgbe_channel *channel; 932 struct xgbe_channel *channel;
933 struct xgbe_hw_if *hw_if = &pdata->hw_if; 933 struct xgbe_hw_if *hw_if = &pdata->hw_if;
@@ -950,9 +950,8 @@ static void xgbe_restart_dev(struct xgbe_prv_data *pdata, unsigned int reset)
950 xgbe_free_tx_data(pdata); 950 xgbe_free_tx_data(pdata);
951 xgbe_free_rx_data(pdata); 951 xgbe_free_rx_data(pdata);
952 952
953 /* Issue software reset to device if requested */ 953 /* Issue software reset to device */
954 if (reset) 954 hw_if->exit(pdata);
955 hw_if->exit(pdata);
956 955
957 xgbe_start(pdata); 956 xgbe_start(pdata);
958 957
@@ -967,7 +966,7 @@ static void xgbe_restart(struct work_struct *work)
967 966
968 rtnl_lock(); 967 rtnl_lock();
969 968
970 xgbe_restart_dev(pdata, 1); 969 xgbe_restart_dev(pdata);
971 970
972 rtnl_unlock(); 971 rtnl_unlock();
973} 972}
@@ -1587,7 +1586,7 @@ static int xgbe_change_mtu(struct net_device *netdev, int mtu)
1587 pdata->rx_buf_size = ret; 1586 pdata->rx_buf_size = ret;
1588 netdev->mtu = mtu; 1587 netdev->mtu = mtu;
1589 1588
1590 xgbe_restart_dev(pdata, 0); 1589 xgbe_restart_dev(pdata);
1591 1590
1592 DBGPR("<--xgbe_change_mtu\n"); 1591 DBGPR("<--xgbe_change_mtu\n");
1593 1592
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
index dbd3850b8b0a..a50dccd67de7 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
@@ -148,6 +148,7 @@ static void xgbe_default_config(struct xgbe_prv_data *pdata)
148 pdata->pause_autoneg = 1; 148 pdata->pause_autoneg = 1;
149 pdata->tx_pause = 1; 149 pdata->tx_pause = 1;
150 pdata->rx_pause = 1; 150 pdata->rx_pause = 1;
151 pdata->phy_speed = SPEED_UNKNOWN;
151 pdata->power_down = 0; 152 pdata->power_down = 0;
152 pdata->default_autoneg = AUTONEG_ENABLE; 153 pdata->default_autoneg = AUTONEG_ENABLE;
153 pdata->default_speed = SPEED_10000; 154 pdata->default_speed = SPEED_10000;