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:
Lin Yun Sheng 2017-07-12 19:09:59 +08:00 коммит произвёл David S. Miller
Родитель 2e3d232e13
Коммит 76b825ab87
1 изменённых файлов: 9 добавлений и 7 удалений

Просмотреть файл

@ -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();
} }