spin_unlock_bh(&br->lock);
        }
 done:
+       dev_put(dev);
        rtnl_unlock();
 }
 
 
        dev_set_promiscuity(dev, -1);
 
-       cancel_delayed_work(&p->carrier_check);
+       if (cancel_delayed_work(&p->carrier_check))
+               dev_put(dev);
 
        spin_lock_bh(&br->lock);
        br_stp_disable_port(p);
        spin_lock_bh(&br->lock);
        br_stp_recalculate_bridge_id(br);
        br_features_recompute(br);
-       schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE);
+       if (schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE))
+               dev_hold(dev);
+
        spin_unlock_bh(&br->lock);
 
        dev_set_mtu(br->dev, br_min_mtu(br));
 
 
        case NETDEV_CHANGE:
                if (br->dev->flags & IFF_UP)
-                       schedule_delayed_work(&p->carrier_check, BR_PORT_DEBOUNCE);
+                       if (schedule_delayed_work(&p->carrier_check,
+                                               BR_PORT_DEBOUNCE))
+                               dev_hold(dev);
                break;
 
        case NETDEV_FEAT_CHANGE: