diff options
Diffstat (limited to 'drivers/usb/atm/ueagle-atm.c')
| -rw-r--r-- | drivers/usb/atm/ueagle-atm.c | 22 | 
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index 44447f54942..99ac70e3255 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c @@ -2206,8 +2206,11 @@ static int uea_boot(struct uea_softc *sc)  		goto err1;  	} -	sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); -	if (sc->kthread == ERR_PTR(-ENOMEM)) { +	/* Create worker thread, but don't start it here.  Start it after +	 * all usbatm generic initialization is done. +	 */ +	sc->kthread = kthread_create(uea_kthread, sc, "ueagle-atm"); +	if (IS_ERR(sc->kthread)) {  		uea_err(INS_TO_USBDEV(sc), "failed to create thread\n");  		goto err2;  	} @@ -2624,6 +2627,7 @@ static struct usbatm_driver uea_usbatm_driver = {  static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)  {  	struct usb_device *usb = interface_to_usbdev(intf); +	int ret;  	uea_enters(usb);  	uea_info(usb, "ADSL device founded vid (%#X) pid (%#X) Rev (%#X): %s\n", @@ -2637,7 +2641,19 @@ static int uea_probe(struct usb_interface *intf, const struct usb_device_id *id)  	if (UEA_IS_PREFIRM(id))  		return uea_load_firmware(usb, UEA_CHIP_VERSION(id)); -	return usbatm_usb_probe(intf, id, &uea_usbatm_driver); +	ret = usbatm_usb_probe(intf, id, &uea_usbatm_driver); +	if (ret == 0) { +		struct usbatm_data *usbatm = usb_get_intfdata(intf); +		struct uea_softc *sc = usbatm->driver_data; + +		/* Ensure carrier is initialized to off as early as possible */ +		UPDATE_ATM_SIGNAL(ATM_PHY_SIG_LOST); + +		/* Only start the worker thread when all init is done */ +		wake_up_process(sc->kthread); +	} + +	return ret;  }  static void uea_disconnect(struct usb_interface *intf)  |