staging: rtl8712: fix error handling in r871xu_drv_init
authorPavel Skripkin <paskripkin@gmail.com>
Sun, 13 Jun 2021 22:00:13 +0000 (01:00 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 14 Jun 2021 14:48:09 +0000 (16:48 +0200)
Previous error handling path was unique for all
possible errors and there was unnecessary branching.
Also, one step for freeing drv_sw was missing. All
these problems was fixed by restructuring error
handling path.

Also, moved out free_netdev() from r8712_free_drv_sw() for
correct error handling.

Fixes: 2865d42c78a9 ("staging: r8712u: Add the new driver to the mainline kernel")
Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
Link: https://lore.kernel.org/r/febb00f72354449bb4d305f373d6d2f47e539ab4.1623620630.git.paskripkin@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8712/os_intfs.c
drivers/staging/rtl8712/usb_intf.c

index 0c3ae84..2214aca 100644 (file)
@@ -328,8 +328,6 @@ int r8712_init_drv_sw(struct _adapter *padapter)
 
 void r8712_free_drv_sw(struct _adapter *padapter)
 {
-       struct net_device *pnetdev = padapter->pnetdev;
-
        r8712_free_cmd_priv(&padapter->cmdpriv);
        r8712_free_evt_priv(&padapter->evtpriv);
        r8712_DeInitSwLeds(padapter);
@@ -339,8 +337,6 @@ void r8712_free_drv_sw(struct _adapter *padapter)
        _r8712_free_sta_priv(&padapter->stapriv);
        _r8712_free_recv_priv(&padapter->recvpriv);
        mp871xdeinit(padapter);
-       if (pnetdev)
-               free_netdev(pnetdev);
 }
 
 static void enable_video_mode(struct _adapter *padapter, int cbw40_value)
index f270824..2434b13 100644 (file)
@@ -360,7 +360,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
        /* step 1. */
        pnetdev = r8712_init_netdev();
        if (!pnetdev)
-               goto error;
+               goto put_dev;
        padapter = netdev_priv(pnetdev);
        disable_ht_for_spec_devid(pdid, padapter);
        pdvobjpriv = &padapter->dvobjpriv;
@@ -382,12 +382,12 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
 
        status = padapter->dvobj_init(padapter);
        if (status != _SUCCESS)
-               goto error;
+               goto free_netdev;
 
        /* step 4. */
        status = r8712_init_drv_sw(padapter);
        if (status)
-               goto error;
+               goto dvobj_deinit;
        /* step 5. read efuse/eeprom data and get mac_addr */
        {
                int i, offset;
@@ -567,17 +567,20 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
        }
        /* step 6. Load the firmware asynchronously */
        if (rtl871x_load_fw(padapter))
-               goto error;
+               goto deinit_drv_sw;
        spin_lock_init(&padapter->lock_rx_ff0_filter);
        mutex_init(&padapter->mutex_start);
        return 0;
-error:
+
+deinit_drv_sw:
+       r8712_free_drv_sw(padapter);
+dvobj_deinit:
+       padapter->dvobj_deinit(padapter);
+free_netdev:
+       free_netdev(pnetdev);
+put_dev:
        usb_put_dev(udev);
        usb_set_intfdata(pusb_intf, NULL);
-       if (padapter && padapter->dvobj_deinit)
-               padapter->dvobj_deinit(padapter);
-       if (pnetdev)
-               free_netdev(pnetdev);
        return -ENODEV;
 }
 
@@ -609,6 +612,7 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf)
                r8712_stop_drv_timers(padapter);
                r871x_dev_unload(padapter);
                r8712_free_drv_sw(padapter);
+               free_netdev(pnetdev);
 
                /* decrease the reference count of the usb device structure
                 * when disconnect