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);