Commit 76b825ab authored by Lin Yun Sheng's avatar Lin Yun Sheng Committed by David S. Miller

net: hns: Bugfix for Tx timeout handling in hns driver

When hns port type is not debug mode, netif_tx_disable is called
when there is a tx timeout, which requires system reboot to return
to normal state. This patch fix this problem by resetting the net
dev.

Fixes: b5996f11 ("net: add Hisilicon Network Subsystem basic ethernet support")
Signed-off-by: default avatarLin Yun Sheng <linyunsheng@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2e3d232e
...@@ -1378,13 +1378,20 @@ void hns_nic_net_reset(struct net_device *ndev) ...@@ -1378,13 +1378,20 @@ void hns_nic_net_reset(struct net_device *ndev)
void hns_nic_net_reinit(struct net_device *netdev) void hns_nic_net_reinit(struct net_device *netdev)
{ {
struct hns_nic_priv *priv = netdev_priv(netdev); struct hns_nic_priv *priv = netdev_priv(netdev);
enum hnae_port_type type = priv->ae_handle->port_type;
netif_trans_update(priv->netdev); netif_trans_update(priv->netdev);
while (test_and_set_bit(NIC_STATE_REINITING, &priv->state)) while (test_and_set_bit(NIC_STATE_REINITING, &priv->state))
usleep_range(1000, 2000); usleep_range(1000, 2000);
hns_nic_net_down(netdev); hns_nic_net_down(netdev);
hns_nic_net_reset(netdev);
/* Only do hns_nic_net_reset in debug mode
* because of hardware limitation.
*/
if (type == HNAE_PORT_DEBUG)
hns_nic_net_reset(netdev);
(void)hns_nic_net_up(netdev); (void)hns_nic_net_up(netdev);
clear_bit(NIC_STATE_REINITING, &priv->state); clear_bit(NIC_STATE_REINITING, &priv->state);
} }
...@@ -1997,13 +2004,8 @@ static void hns_nic_reset_subtask(struct hns_nic_priv *priv) ...@@ -1997,13 +2004,8 @@ static void hns_nic_reset_subtask(struct hns_nic_priv *priv)
rtnl_lock(); rtnl_lock();
/* put off any impending NetWatchDogTimeout */ /* put off any impending NetWatchDogTimeout */
netif_trans_update(priv->netdev); netif_trans_update(priv->netdev);
hns_nic_net_reinit(priv->netdev);
if (type == HNAE_PORT_DEBUG) {
hns_nic_net_reinit(priv->netdev);
} else {
netif_carrier_off(priv->netdev);
netif_tx_disable(priv->netdev);
}
rtnl_unlock(); rtnl_unlock();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment