Commit d1d3e3cd authored by Pavel Skripkin's avatar Pavel Skripkin Committed by Greg Kroah-Hartman
Browse files

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: 2865d42c ("staging: r8712u: Add the new driver to the mainline kernel")
Signed-off-by: default avatarPavel Skripkin <paskripkin@gmail.com>
Link: https://lore.kernel.org/r/febb00f72354449bb4d305f373d6d2f47e539ab4.1623620630.git.paskripkin@gmail.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 69d998f1
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -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)
+13 −9
Original line number Diff line number Diff line
@@ -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:
	usb_put_dev(udev);
	usb_set_intfdata(pusb_intf, NULL);
	if (padapter && padapter->dvobj_deinit)

deinit_drv_sw:
	r8712_free_drv_sw(padapter);
dvobj_deinit:
	padapter->dvobj_deinit(padapter);
	if (pnetdev)
free_netdev:
	free_netdev(pnetdev);
put_dev:
	usb_put_dev(udev);
	usb_set_intfdata(pusb_intf, NULL);
	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