drv_types.h |    1 
 usb_intf.c  |  116 +++++++++++++++++++++++++++++++++---------------------------
 2 files changed, 66 insertions(+), 51 deletions(-)

Index: wireless-testing-new/drivers/staging/rtl8712/drv_types.h
===================================================================
--- wireless-testing-new.orig/drivers/staging/rtl8712/drv_types.h
+++ wireless-testing-new/drivers/staging/rtl8712/drv_types.h
@@ -179,6 +179,7 @@ struct _adapter {
 	int bup;
 	struct net_device_stats stats;
 	struct iw_statistics iwstats;
+	struct work_struct initial_work;
 	int pid; /*process id from UI*/
 	_workitem wkFilterRxFF0;
 	u8 blnEnableRxFF0Filter;
Index: wireless-testing-new/drivers/staging/rtl8712/usb_intf.c
===================================================================
--- wireless-testing-new.orig/drivers/staging/rtl8712/usb_intf.c
+++ wireless-testing-new/drivers/staging/rtl8712/usb_intf.c
@@ -357,60 +357,18 @@ static u8 key_2char2num(u8 hch, u8 lch)
 	return (hex_to_bin(hch) << 4) | hex_to_bin(lch);
 }
 
-/*
- * drv_init() - a device potentially for us
- *
- * notes: drv_init() is called when the bus driver has located a card for us
- * to support. We accept the new device by returning 0.
-*/
-static int r871xu_drv_init(struct usb_interface *pusb_intf,
-			   const struct usb_device_id *pdid)
+static void r8712_init_drv_sw_delayed(struct work_struct *work)
 {
+	struct _adapter *padapter = container_of(work, struct _adapter,
+						 initial_work);
+	struct net_device *pnetdev = padapter->pnetdev;
 	uint status;
-	struct _adapter *padapter = NULL;
-	struct dvobj_priv *pdvobjpriv;
-	struct net_device *pnetdev;
-	struct usb_device *udev;
 
-	printk(KERN_INFO "r8712u: DriverVersion: %s\n", DRVER);
-	/* In this probe function, O.S. will provide the usb interface pointer
-	 * to driver. We have to increase the reference count of the usb device
-	 * structure by using the usb_get_dev function.
-	 */
-	udev = interface_to_usbdev(pusb_intf);
-	usb_get_dev(udev);
-	pintf = pusb_intf;
-	/* step 1. */
-	pnetdev = r8712_init_netdev();
-	if (!pnetdev)
-		goto error;
-	padapter = netdev_priv(pnetdev);
-	disable_ht_for_spec_devid(pdid, padapter);
-	pdvobjpriv = &padapter->dvobjpriv;
-	pdvobjpriv->padapter = padapter;
-	padapter->dvobjpriv.pusbdev = udev;
-	usb_set_intfdata(pusb_intf, pnetdev);
-	SET_NETDEV_DEV(pnetdev, &pusb_intf->dev);
-	/* step 2. */
-	padapter->dvobj_init = &r8712_usb_dvobj_init;
-	padapter->dvobj_deinit = &r8712_usb_dvobj_deinit;
-	padapter->halpriv.hal_bus_init = &r8712_usb_hal_bus_init;
-	padapter->dvobjpriv.inirp_init = &r8712_usb_inirp_init;
-	padapter->dvobjpriv.inirp_deinit = &r8712_usb_inirp_deinit;
-	/* step 3.
-	 * initialize the dvobj_priv
-	 */
-	if (padapter->dvobj_init == NULL)
-			goto error;
-	else {
-		status = padapter->dvobj_init(padapter);
-		if (status != _SUCCESS)
-			goto error;
-	}
-	/* step 4. */
 	status = r8712_init_drv_sw(padapter);
-	if (status == _FAIL)
-		goto error;
+	if (status == _FAIL) {
+		printk(KERN_ERR "r8712u: Failed in init_drv_sw\n");
+		return;
+	}
 	/* step 5. read efuse/eeprom data and get mac_addr */
 	{
 		int i, offset;
@@ -597,8 +555,64 @@ static int r871xu_drv_init(struct usb_in
 	}
 	/* step 6. Tell the network stack we exist */
 	if (register_netdev(pnetdev) != 0)
-		goto error;
+		return;
 	spin_lock_init(&padapter->lockRxFF0Filter);
+}
+
+/*
+ * drv_init() - a device potentially for us
+ *
+ * notes: drv_init() is called when the bus driver has located a card for us
+ * to support. We accept the new device by returning 0.
+*/
+static int r871xu_drv_init(struct usb_interface *pusb_intf,
+			   const struct usb_device_id *pdid)
+{
+	uint status;
+	struct _adapter *padapter = NULL;
+	struct dvobj_priv *pdvobjpriv;
+	struct net_device *pnetdev;
+	struct usb_device *udev;
+
+	printk(KERN_INFO "r8712u: DriverVersion: %s\n", DRVER);
+	/* In this probe function, O.S. will provide the usb interface pointer
+	 * to driver. We have to increase the reference count of the usb device
+	 * structure by using the usb_get_dev function.
+	 */
+	udev = interface_to_usbdev(pusb_intf);
+	usb_get_dev(udev);
+	pintf = pusb_intf;
+	/* step 1. */
+	pnetdev = r8712_init_netdev();
+	if (!pnetdev)
+		goto error;
+	padapter = netdev_priv(pnetdev);
+	padapter->pnetdev = pnetdev;
+	disable_ht_for_spec_devid(pdid, padapter);
+	pdvobjpriv = &padapter->dvobjpriv;
+	pdvobjpriv->padapter = padapter;
+	padapter->dvobjpriv.pusbdev = udev;
+	usb_set_intfdata(pusb_intf, pnetdev);
+	SET_NETDEV_DEV(pnetdev, &pusb_intf->dev);
+	/* step 2. */
+	padapter->dvobj_init = &r8712_usb_dvobj_init;
+	padapter->dvobj_deinit = &r8712_usb_dvobj_deinit;
+	padapter->halpriv.hal_bus_init = &r8712_usb_hal_bus_init;
+	padapter->dvobjpriv.inirp_init = &r8712_usb_inirp_init;
+	padapter->dvobjpriv.inirp_deinit = &r8712_usb_inirp_deinit;
+	/* step 3.
+	 * initialize the dvobj_priv
+	 */
+	if (padapter->dvobj_init == NULL)
+			goto error;
+	else {
+		status = padapter->dvobj_init(padapter);
+		if (status != _SUCCESS)
+			goto error;
+	}
+	/* step 4. */
+	INIT_WORK(&padapter->initial_work, r8712_init_drv_sw_delayed);
+	schedule_work(&padapter->initial_work);
 	return 0;
 error:
 	usb_put_dev(udev);