mirror of https://gitee.com/openkylin/linux.git
staging: rtl8712: fix error handling in r871xu_drv_init
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>
This commit is contained in:
parent
69d998f1e5
commit
d1d3e3cdfd
|
@ -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)
|
||||||
|
|
|
@ -360,7 +360,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;
|
||||||
|
@ -382,12 +382,12 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
|
||||||
|
|
||||||
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;
|
||||||
|
@ -567,17 +567,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -609,6 +612,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
|
||||||
|
|
Loading…
Reference in New Issue