NETREG_UNREGISTERED,     /* completed unregister todo */
               NETREG_RELEASED,         /* called free_netdev */
               NETREG_DUMMY,            /* dummy device for NAPI poll */
-       } reg_state;
+       } reg_state:16;
+
+       enum {
+               RTNL_LINK_INITIALIZED,
+               RTNL_LINK_INITIALIZING,
+       } rtnl_link_state:16;
 
        /* Called from unregister, can be used to call free_netdev */
        void (*destructor)(struct net_device *dev);
 
                */
                call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
 
+               if (!dev->rtnl_link_ops ||
+                   dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
+                       rtmsg_ifinfo(RTM_DELLINK, dev, ~0U);
+
                /*
                 *      Flush the unicast and multicast chains
                 */
         *      Prevent userspace races by waiting until the network
         *      device is fully setup before sending notifications.
         */
-       rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
+       if (!dev->rtnl_link_ops ||
+           dev->rtnl_link_state == RTNL_LINK_INITIALIZED)
+               rtmsg_ifinfo(RTM_NEWLINK, dev, ~0U);
 
 out:
        return ret;
 
        struct net_device *dev = ptr;
 
        switch (event) {
-       case NETDEV_UNREGISTER:
-               rtmsg_ifinfo(RTM_DELLINK, dev, ~0U);
-               break;
        case NETDEV_UP:
        case NETDEV_DOWN:
                rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP|IFF_RUNNING);
        case NETDEV_REGISTER:
        case NETDEV_CHANGE:
        case NETDEV_GOING_DOWN:
+       case NETDEV_UNREGISTER:
        case NETDEV_UNREGISTER_BATCH:
                break;
        default: