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: b5996f11ea
("net: add Hisilicon Network Subsystem basic ethernet support")
Signed-off-by: Lin Yun Sheng <linyunsheng@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
2e3d232e13
Коммит
76b825ab87
|
@ -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);
|
||||||
|
|
||||||
|
/* Only do hns_nic_net_reset in debug mode
|
||||||
|
* because of hardware limitation.
|
||||||
|
*/
|
||||||
|
if (type == HNAE_PORT_DEBUG)
|
||||||
hns_nic_net_reset(netdev);
|
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)
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
/* put off any impending NetWatchDogTimeout */
|
/* put off any impending NetWatchDogTimeout */
|
||||||
netif_trans_update(priv->netdev);
|
netif_trans_update(priv->netdev);
|
||||||
|
|
||||||
if (type == HNAE_PORT_DEBUG) {
|
|
||||||
hns_nic_net_reinit(priv->netdev);
|
hns_nic_net_reinit(priv->netdev);
|
||||||
} else {
|
|
||||||
netif_carrier_off(priv->netdev);
|
|
||||||
netif_tx_disable(priv->netdev);
|
|
||||||
}
|
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче