vlan: Invoke driver vlan hooks only if device is present

NIC drivers mark device as detached during error recovery.
It expects no manangement hooks to be invoked in this state.
Invoke driver vlan hooks only if device is present.

Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@avagotech.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Padmanabh Ratnakar 2015-11-03 20:25:59 +05:30 committed by David S. Miller
parent 754107e341
commit 74f2d19caf
1 changed files with 8 additions and 2 deletions

View File

@ -206,7 +206,10 @@ static int __vlan_vid_add(struct vlan_info *vlan_info, __be16 proto, u16 vid,
return -ENOMEM; return -ENOMEM;
if (vlan_hw_filter_capable(dev, vid_info)) { if (vlan_hw_filter_capable(dev, vid_info)) {
err = ops->ndo_vlan_rx_add_vid(dev, proto, vid); if (netif_device_present(dev))
err = ops->ndo_vlan_rx_add_vid(dev, proto, vid);
else
err = -ENODEV;
if (err) { if (err) {
kfree(vid_info); kfree(vid_info);
return err; return err;
@ -264,7 +267,10 @@ static void __vlan_vid_del(struct vlan_info *vlan_info,
int err; int err;
if (vlan_hw_filter_capable(dev, vid_info)) { if (vlan_hw_filter_capable(dev, vid_info)) {
err = ops->ndo_vlan_rx_kill_vid(dev, proto, vid); if (netif_device_present(dev))
err = ops->ndo_vlan_rx_kill_vid(dev, proto, vid);
else
err = -ENODEV;
if (err) { if (err) {
pr_warn("failed to kill vid %04x/%d for device %s\n", pr_warn("failed to kill vid %04x/%d for device %s\n",
proto, vid, dev->name); proto, vid, dev->name);