diff options
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.patch | 67 |
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, |