diff options
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 6b1cb706e410..24dc555f5ff1 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
@@ -726,12 +726,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) | |||
726 | { | 726 | { |
727 | struct device *parent = aru->udev->dev.parent; | 727 | struct device *parent = aru->udev->dev.parent; |
728 | 728 | ||
729 | complete(&aru->firmware_loading_complete); | ||
730 | |||
729 | /* unbind anything failed */ | 731 | /* unbind anything failed */ |
730 | if (parent) | 732 | if (parent) |
731 | down(&parent->sem); | 733 | down(&parent->sem); |
732 | device_release_driver(&aru->udev->dev); | 734 | device_release_driver(&aru->udev->dev); |
733 | if (parent) | 735 | if (parent) |
734 | up(&parent->sem); | 736 | up(&parent->sem); |
737 | |||
738 | usb_put_dev(aru->udev); | ||
735 | } | 739 | } |
736 | 740 | ||
737 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | 741 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) |
@@ -760,6 +764,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | |||
760 | if (err) | 764 | if (err) |
761 | goto err_unrx; | 765 | goto err_unrx; |
762 | 766 | ||
767 | complete(&aru->firmware_loading_complete); | ||
768 | usb_put_dev(aru->udev); | ||
763 | return; | 769 | return; |
764 | 770 | ||
765 | err_unrx: | 771 | err_unrx: |
@@ -857,6 +863,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
857 | init_usb_anchor(&aru->tx_pending); | 863 | init_usb_anchor(&aru->tx_pending); |
858 | init_usb_anchor(&aru->tx_submitted); | 864 | init_usb_anchor(&aru->tx_submitted); |
859 | init_completion(&aru->cmd_wait); | 865 | init_completion(&aru->cmd_wait); |
866 | init_completion(&aru->firmware_loading_complete); | ||
860 | spin_lock_init(&aru->tx_urb_lock); | 867 | spin_lock_init(&aru->tx_urb_lock); |
861 | 868 | ||
862 | aru->tx_pending_urbs = 0; | 869 | aru->tx_pending_urbs = 0; |
@@ -876,6 +883,7 @@ static int ar9170_usb_probe(struct usb_interface *intf, | |||
876 | if (err) | 883 | if (err) |
877 | goto err_freehw; | 884 | goto err_freehw; |
878 | 885 | ||
886 | usb_get_dev(aru->udev); | ||
879 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", | 887 | return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", |
880 | &aru->udev->dev, GFP_KERNEL, aru, | 888 | &aru->udev->dev, GFP_KERNEL, aru, |
881 | ar9170_usb_firmware_step2); | 889 | ar9170_usb_firmware_step2); |
@@ -895,6 +903,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf) | |||
895 | return; | 903 | return; |
896 | 904 | ||
897 | aru->common.state = AR9170_IDLE; | 905 | aru->common.state = AR9170_IDLE; |
906 | |||
907 | wait_for_completion(&aru->firmware_loading_complete); | ||
908 | |||
898 | ar9170_unregister(&aru->common); | 909 | ar9170_unregister(&aru->common); |
899 | ar9170_usb_cancel_urbs(aru); | 910 | ar9170_usb_cancel_urbs(aru); |
900 | 911 | ||