qlge: Fix qlge_update_hw_vlan_features to handle if interface is down
Currently qlge_update_hw_vlan_features() will always first put the
interface down, then update features and then bring it up again. But it
is possible to hit this code while the adapter is down and this causes a
non-paired call to napi_disable(), which will get stuck.
This patch fixes it by skipping these down/up actions if the interface
is already down.
Fixes: a45adbe8d3
("qlge: Enhance nested VLAN (Q-in-Q) handling.")
Cc: Harish Patil <harish.patil@qlogic.com>
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
bdbbb8527b
Коммит
61132bf7fb
|
@ -2351,23 +2351,29 @@ static int qlge_update_hw_vlan_features(struct net_device *ndev,
|
|||
{
|
||||
struct ql_adapter *qdev = netdev_priv(ndev);
|
||||
int status = 0;
|
||||
bool need_restart = netif_running(ndev);
|
||||
|
||||
status = ql_adapter_down(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring down the adapter\n");
|
||||
return status;
|
||||
if (need_restart) {
|
||||
status = ql_adapter_down(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring down the adapter\n");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
/* update the features with resent change */
|
||||
ndev->features = features;
|
||||
|
||||
status = ql_adapter_up(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring up the adapter\n");
|
||||
return status;
|
||||
if (need_restart) {
|
||||
status = ql_adapter_up(qdev);
|
||||
if (status) {
|
||||
netif_err(qdev, link, qdev->ndev,
|
||||
"Failed to bring up the adapter\n");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче