summaryrefslogtreecommitdiff
path: root/libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch
diff options
context:
space:
mode:
Diffstat (limited to 'libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch')
-rw-r--r--libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch b/libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch
new file mode 100644
index 000000000..3ba839940
--- /dev/null
+++ b/libre-testing/linux-libre/ath9k_htc-fix-target-is-unresponsive.patch
@@ -0,0 +1,67 @@
+diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
+index f5dda84..7730a5c 100644
+--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
+@@ -1124,7 +1124,7 @@ static void ath9k_hif_usb_firmware_cb(const struct firmware *fw, void *context)
+ }
+
+ release_firmware(fw);
+- hif_dev->flags |= HIF_USB_READY;
++ hif_dev->flags |= HIF_USB_FW_LOADED;
+ complete(&hif_dev->fw_done);
+
+ return;
+@@ -1281,7 +1281,7 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
+
+ wait_for_completion(&hif_dev->fw_done);
+
+- if (hif_dev->flags & HIF_USB_READY) {
++ if (hif_dev->flags & HIF_USB_FW_LOADED) {
+ ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
+ ath9k_htc_hw_free(hif_dev->htc_handle);
+ ath9k_hif_usb_dev_deinit(hif_dev);
+@@ -1289,7 +1289,9 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
+
+ usb_set_intfdata(interface, NULL);
+
+- if (!unplugged && (hif_dev->flags & HIF_USB_START))
++ /* If firmware was loaded we should drop it
++ * go back to first stage bootloader. */
++ if (!unplugged && (hif_dev->flags & HIF_USB_FW_LOADED))
+ ath9k_hif_usb_reboot(udev);
+
+ kfree(hif_dev);
+@@ -1326,7 +1328,7 @@ static int ath9k_hif_usb_resume(struct usb_interface *interface)
+ if (ret)
+ return ret;
+
+- if (hif_dev->flags & HIF_USB_READY) {
++ if (hif_dev->flags & HIF_USB_FW_LOADED) {
+ /* request cached firmware during suspend/resume cycle */
+ ret = request_firmware(&fw, hif_dev->fw_name,
+ &hif_dev->udev->dev);
+diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.h b/drivers/net/wireless/ath/ath9k/hif_usb.h
+index 51496e7..d74697d 100644
+--- a/drivers/net/wireless/ath/ath9k/hif_usb.h
++++ b/drivers/net/wireless/ath/ath9k/hif_usb.h
+@@ -85,7 +85,7 @@ struct cmd_buf {
+ };
+
+ #define HIF_USB_START BIT(0)
+-#define HIF_USB_READY BIT(1)
++#define HIF_USB_FW_LOADED BIT(1)
+
+ struct hif_device_usb {
+ struct usb_device *udev;
+diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+index a47f5e0..3b202ff 100644
+--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
++++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+@@ -846,6 +846,7 @@ static int ath9k_init_device(struct ath9k_htc_priv *priv,
+ if (error != 0)
+ goto err_rx;
+
++ ath9k_hw_disable(priv->ah);
+ #ifdef CONFIG_MAC80211_LEDS
+ /* must be initialized before ieee80211_register_hw */
+ priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw,