staging: rtl8712: fix error handling in r871xu_drv_init

[ Upstream commit d1d3e3cdfda8eb91f0e24be7ec8be1e6e01b3a1c ]

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: 2865d42c78 ("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Pavel Skripkin
2021-06-14 01:00:13 +03:00
committed by Greg Kroah-Hartman
parent 7bc3fa5db4
commit bf5d6f6979
2 changed files with 14 additions and 14 deletions

View File

@@ -328,8 +328,6 @@ int r8712_init_drv_sw(struct _adapter *padapter)
void r8712_free_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_cmd_priv(&padapter->cmdpriv);
r8712_free_evt_priv(&padapter->evtpriv); r8712_free_evt_priv(&padapter->evtpriv);
r8712_DeInitSwLeds(padapter); r8712_DeInitSwLeds(padapter);
@@ -339,8 +337,6 @@ void r8712_free_drv_sw(struct _adapter *padapter)
_r8712_free_sta_priv(&padapter->stapriv); _r8712_free_sta_priv(&padapter->stapriv);
_r8712_free_recv_priv(&padapter->recvpriv); _r8712_free_recv_priv(&padapter->recvpriv);
mp871xdeinit(padapter); mp871xdeinit(padapter);
if (pnetdev)
free_netdev(pnetdev);
} }
static void enable_video_mode(struct _adapter *padapter, int cbw40_value) static void enable_video_mode(struct _adapter *padapter, int cbw40_value)

View File

@@ -361,7 +361,7 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
/* step 1. */ /* step 1. */
pnetdev = r8712_init_netdev(); pnetdev = r8712_init_netdev();
if (!pnetdev) if (!pnetdev)
goto error; goto put_dev;
padapter = netdev_priv(pnetdev); padapter = netdev_priv(pnetdev);
disable_ht_for_spec_devid(pdid, padapter); disable_ht_for_spec_devid(pdid, padapter);
pdvobjpriv = &padapter->dvobjpriv; pdvobjpriv = &padapter->dvobjpriv;
@@ -381,16 +381,16 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
* initialize the dvobj_priv * initialize the dvobj_priv
*/ */
if (!padapter->dvobj_init) { if (!padapter->dvobj_init) {
goto error; goto put_dev;
} else { } else {
status = padapter->dvobj_init(padapter); status = padapter->dvobj_init(padapter);
if (status != _SUCCESS) if (status != _SUCCESS)
goto error; goto free_netdev;
} }
/* step 4. */ /* step 4. */
status = r8712_init_drv_sw(padapter); status = r8712_init_drv_sw(padapter);
if (status) if (status)
goto error; goto dvobj_deinit;
/* step 5. read efuse/eeprom data and get mac_addr */ /* step 5. read efuse/eeprom data and get mac_addr */
{ {
int i, offset; int i, offset;
@@ -570,17 +570,20 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
} }
/* step 6. Load the firmware asynchronously */ /* step 6. Load the firmware asynchronously */
if (rtl871x_load_fw(padapter)) if (rtl871x_load_fw(padapter))
goto error; goto deinit_drv_sw;
spin_lock_init(&padapter->lock_rx_ff0_filter); spin_lock_init(&padapter->lock_rx_ff0_filter);
mutex_init(&padapter->mutex_start); mutex_init(&padapter->mutex_start);
return 0; 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_put_dev(udev);
usb_set_intfdata(pusb_intf, NULL); usb_set_intfdata(pusb_intf, NULL);
if (padapter && padapter->dvobj_deinit)
padapter->dvobj_deinit(padapter);
if (pnetdev)
free_netdev(pnetdev);
return -ENODEV; return -ENODEV;
} }
@@ -612,6 +615,7 @@ static void r871xu_dev_remove(struct usb_interface *pusb_intf)
r8712_stop_drv_timers(padapter); r8712_stop_drv_timers(padapter);
r871x_dev_unload(padapter); r871x_dev_unload(padapter);
r8712_free_drv_sw(padapter); r8712_free_drv_sw(padapter);
free_netdev(pnetdev);
/* decrease the reference count of the usb device structure /* decrease the reference count of the usb device structure
* when disconnect * when disconnect