diff options
| author | David S. Miller <davem@davemloft.net> | 2010-05-12 00:05:35 -0700 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-05-12 00:05:35 -0700 | 
| commit | 278554bd6579206921f5d8a523649a7a57f8850d (patch) | |
| tree | 4e6c527daf0910e455b3aa72e2c96b0479e430be /drivers/net/wireless/ath/ar9170/usb.c | |
| parent | 5a147e8bf982f9dd414c1dd751fe02c1942506b2 (diff) | |
| parent | cea0d767c29669bf89f86e4aee46ef462d2ebae8 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
	Documentation/feature-removal-schedule.txt
	drivers/net/wireless/ath/ar9170/usb.c
	drivers/scsi/iscsi_tcp.c
	net/ipv4/ipmr.c
Diffstat (limited to 'drivers/net/wireless/ath/ar9170/usb.c')
| -rw-r--r-- | drivers/net/wireless/ath/ar9170/usb.c | 11 | 
1 files changed, 11 insertions, 0 deletions
| diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index c8121a6a9d3a..8663660ea4c6 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c @@ -738,12 +738,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)  {  	struct device *parent = aru->udev->dev.parent; +	complete(&aru->firmware_loading_complete); +  	/* unbind anything failed */  	if (parent)  		device_lock(parent);  	device_release_driver(&aru->udev->dev);  	if (parent)  		device_unlock(parent); + +	usb_put_dev(aru->udev);  }  static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) @@ -772,6 +776,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)  	if (err)  		goto err_unrx; +	complete(&aru->firmware_loading_complete); +	usb_put_dev(aru->udev);  	return;   err_unrx: @@ -869,6 +875,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,  	init_usb_anchor(&aru->tx_pending);  	init_usb_anchor(&aru->tx_submitted);  	init_completion(&aru->cmd_wait); +	init_completion(&aru->firmware_loading_complete);  	spin_lock_init(&aru->tx_urb_lock);  	aru->tx_pending_urbs = 0; @@ -888,6 +895,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,  	if (err)  		goto err_freehw; +	usb_get_dev(aru->udev);  	return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw",  				       &aru->udev->dev, GFP_KERNEL, aru,  				       ar9170_usb_firmware_step2); @@ -907,6 +915,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf)  		return;  	aru->common.state = AR9170_IDLE; + +	wait_for_completion(&aru->firmware_loading_complete); +  	ar9170_unregister(&aru->common);  	ar9170_usb_cancel_urbs(aru); | 
