staging: rtl8712: Fix oops on dongle removal if firmware is not available
authorThomas Vegas <thomas@grouk.net>
Sun, 1 Jun 2014 12:34:39 +0000 (14:34 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Jun 2014 23:40:07 +0000 (16:40 -0700)
When firmware is not available, net device is not created. Upon
disconnect, we must check for net device existence before trying to
release net device private data.

Signed-off-by: Thomas Vegas <thomas@grouk.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8712/usb_intf.c

index ba743542babc72677d29f06b4749d49ced1fcaf4..bec9d45499ad5174f4deff5ed851651d7f98e16a 100644 (file)
@@ -607,31 +607,31 @@ error:
 static void r871xu_dev_remove(struct usb_interface *pusb_intf)
 {
        struct net_device *pnetdev = usb_get_intfdata(pusb_intf);
-       struct _adapter *padapter = netdev_priv(pnetdev);
        struct usb_device *udev = interface_to_usbdev(pusb_intf);
 
-       usb_set_intfdata(pusb_intf, NULL);
-       if (padapter->fw_found)
-               release_firmware(padapter->fw);
-       /* never exit with a firmware callback pending */
-       wait_for_completion(&padapter->rtl8712_fw_ready);
-       if (drvpriv.drv_registered == true)
-               padapter->bSurpriseRemoved = true;
-       if (pnetdev != NULL) {
-               /* will call netdev_close() */
-               unregister_netdev(pnetdev);
+       if (pnetdev) {
+               struct _adapter *padapter = netdev_priv(pnetdev);
+
+               usb_set_intfdata(pusb_intf, NULL);
+               if (padapter->fw_found)
+                       release_firmware(padapter->fw);
+               /* never exit with a firmware callback pending */
+               wait_for_completion(&padapter->rtl8712_fw_ready);
+               if (drvpriv.drv_registered == true)
+                       padapter->bSurpriseRemoved = true;
+               unregister_netdev(pnetdev); /* will call netdev_close() */
+               flush_scheduled_work();
+               udelay(1);
+               /* Stop driver mlme relation timer */
+               if (padapter->fw_found)
+                       r8712_stop_drv_timers(padapter);
+               r871x_dev_unload(padapter);
+               r8712_free_drv_sw(padapter);
+
+               /* decrease the reference count of the usb device structure
+                * when disconnect */
+               usb_put_dev(udev);
        }
-       flush_scheduled_work();
-       udelay(1);
-       /*Stop driver mlme relation timer */
-       if (padapter->fw_found)
-               r8712_stop_drv_timers(padapter);
-       r871x_dev_unload(padapter);
-       r8712_free_drv_sw(padapter);
-       usb_set_intfdata(pusb_intf, NULL);
-       /* decrease the reference count of the usb device structure
-        * when disconnect */
-       usb_put_dev(udev);
        /* If we didn't unplug usb dongle and remove/insert module, driver
         * fails on sitesurvey for the first time when device is up.
         * Reset usb port for sitesurvey fail issue. */