Hi Oliver,

Could you take a look at these bits to see if that's fine with you? I'd
like to merge it through mac80211-next (pending some logistics with a
conflict)

> diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
> index 1447da1d5729..47c4c1182ef1 100644
> --- a/drivers/net/usb/usbnet.c
> +++ b/drivers/net/usb/usbnet.c
> @@ -1560,6 +1560,8 @@ void usbnet_disconnect (struct usb_interface *intf)
>       struct usbnet           *dev;
>       struct usb_device       *xdev;
>       struct net_device       *net;
> +     const struct driver_info *info;
> +     void (*unregdev)(struct net_device *);
>  
>       dev = usb_get_intfdata(intf);
>       usb_set_intfdata(intf, NULL);
> @@ -1574,7 +1576,10 @@ void usbnet_disconnect (struct usb_interface *intf)
>                  dev->driver_info->description);
>  
>       net = dev->net;
> -     unregister_netdev (net);
> +
> +     info = dev->driver_info;
> +     unregdev = info->unregister_netdev ?: unregister_netdev;
> +     unregdev(net);
>  
>       cancel_work_sync(&dev->kevent);
>  
> @@ -1627,6 +1632,7 @@ usbnet_probe (struct usb_interface *udev, const struct 
> usb_device_id *prod)
>       int                             status;
>       const char                      *name;
>       struct usb_driver       *driver = to_usb_driver(udev->dev.driver);
> +     int (*regdev)(struct net_device *);
>  
>       /* usbnet already took usb runtime pm, so have to enable the feature
>        * for usb interface, otherwise usb_autopm_get_interface may return
> @@ -1646,6 +1652,8 @@ usbnet_probe (struct usb_interface *udev, const struct 
> usb_device_id *prod)
>       xdev = interface_to_usbdev (udev);
>       interface = udev->cur_altsetting;
>  
> +     regdev = info->register_netdev ?: register_netdev;
> +
>       status = -ENOMEM;
>  
>       // set up our own records
> @@ -1768,7 +1776,7 @@ usbnet_probe (struct usb_interface *udev, const struct 
> usb_device_id *prod)
>               }
>       }
>  
> -     status = register_netdev (net);
> +     status = regdev(net);
>       if (status)
>               goto out5;
>       netif_info(dev, probe, dev->net,

[...]

> diff --git a/drivers/net/wireless/rndis_wlan.c 
> b/drivers/net/wireless/rndis_wlan.c
> index 9fe77556858e..b646d4295cfd 100644
> --- a/drivers/net/wireless/rndis_wlan.c
> +++ b/drivers/net/wireless/rndis_wlan.c
> @@ -3598,6 +3598,8 @@ static const struct driver_info bcm4320b_info = {
>       .stop =         rndis_wlan_stop,
>       .early_init =   bcm4320b_early_init,
>       .indication =   rndis_wlan_indication,
> +     .register_netdev = cfg80211_register_netdev,
> +     .unregister_netdev = cfg80211_unregister_netdev,
>  };
>  
>  static const struct driver_info      bcm4320a_info = {
> @@ -3613,6 +3615,8 @@ static const struct driver_info bcm4320a_info = {
>       .stop =         rndis_wlan_stop,
>       .early_init =   bcm4320a_early_init,
>       .indication =   rndis_wlan_indication,
> +     .register_netdev = cfg80211_register_netdev,
> +     .unregister_netdev = cfg80211_unregister_netdev,
>  };
>  
>  static const struct driver_info rndis_wlan_info = {
> @@ -3628,6 +3632,8 @@ static const struct driver_info rndis_wlan_info = {
>       .stop =         rndis_wlan_stop,
>       .early_init =   unknown_early_init,
>       .indication =   rndis_wlan_indication,
> +     .register_netdev = cfg80211_register_netdev,
> +     .unregister_netdev = cfg80211_unregister_netdev,
>  };
>  
>  /*-------------------------------------------------------------------------*/

[...]

> diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h
> index 88a7673894d5..11e57803acf9 100644
> --- a/include/linux/usb/usbnet.h
> +++ b/include/linux/usb/usbnet.h
> @@ -165,6 +165,12 @@ struct driver_info {
>       /* rx mode change (device changes address list filtering) */
>       void    (*set_rx_mode)(struct usbnet *dev);
>  
> +     /* register netdev - defaults to register_netdev() */
> +     int     (*register_netdev)(struct net_device *dev);
> +
> +     /* unregister netdev - defaults to unregister_netdev() */
> +     void    (*unregister_netdev)(struct net_device *dev);
> +
>       /* for new devices, use the descriptor-reading code instead */
>       int             in;             /* rx endpoint */
>       int             out;            /* tx endpoint *

Reply via email to