diff options
| -rw-r--r-- | drivers/net/wireless/ath/ar9170/usb.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c index 82ab532a4923..a93dc18a45c3 100644 --- a/drivers/net/wireless/ath/ar9170/usb.c +++ b/drivers/net/wireless/ath/ar9170/usb.c | |||
| @@ -739,17 +739,27 @@ err_out: | |||
| 739 | static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) | 739 | static void ar9170_usb_firmware_failed(struct ar9170_usb *aru) |
| 740 | { | 740 | { |
| 741 | struct device *parent = aru->udev->dev.parent; | 741 | struct device *parent = aru->udev->dev.parent; |
| 742 | struct usb_device *udev; | ||
| 743 | |||
| 744 | /* | ||
| 745 | * Store a copy of the usb_device pointer locally. | ||
| 746 | * This is because device_release_driver initiates | ||
| 747 | * ar9170_usb_disconnect, which in turn frees our | ||
| 748 | * driver context (aru). | ||
| 749 | */ | ||
| 750 | udev = aru->udev; | ||
| 742 | 751 | ||
| 743 | complete(&aru->firmware_loading_complete); | 752 | complete(&aru->firmware_loading_complete); |
| 744 | 753 | ||
| 745 | /* unbind anything failed */ | 754 | /* unbind anything failed */ |
| 746 | if (parent) | 755 | if (parent) |
| 747 | device_lock(parent); | 756 | device_lock(parent); |
| 748 | device_release_driver(&aru->udev->dev); | 757 | |
| 758 | device_release_driver(&udev->dev); | ||
| 749 | if (parent) | 759 | if (parent) |
| 750 | device_unlock(parent); | 760 | device_unlock(parent); |
| 751 | 761 | ||
| 752 | usb_put_dev(aru->udev); | 762 | usb_put_dev(udev); |
| 753 | } | 763 | } |
| 754 | 764 | ||
| 755 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) | 765 | static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) |
