@@ -216,8 +216,13 @@ void linkwatch_fire_event(struct net_device *dev)
bool urgent = linkwatch_urgent_event(dev);
if (!test_and_set_bit(__LINK_STATE_LINKWATCH_PENDING, &dev->state)) {
- dev_hold(dev);
+ /* don't add an event before register_netdev(); it can fail */
+ if (!test_bit(__LINK_STATE_PRESENT, &dev->state)) {
+ WARN_ON(1);
+ return;
+ }
+ dev_hold(dev);
linkwatch_add_event(dev);
} else if (!urgent)
return;
@@ -286,7 +286,8 @@ EXPORT_SYMBOL(netif_carrier_on);
void netif_carrier_off(struct net_device *dev)
{
if (!test_and_set_bit(__LINK_STATE_NOCARRIER, &dev->state))
- linkwatch_fire_event(dev);
+ if (test_bit(__LINK_STATE_PRESENT, &dev->state))
+ linkwatch_fire_event(dev);
}
EXPORT_SYMBOL(netif_carrier_off);