Commit a3be14b7 authored by Sujith's avatar Sujith Committed by John W. Linville

ath9k_htc: Handle device unplug properly

When the USB device has been unplugged, there is
no point in trying to send commands to the target.
Fix this by denying all WMI commands in such a case.
Signed-off-by: default avatarSujith <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent c11d8f89
...@@ -329,6 +329,7 @@ struct htc_beacon_config { ...@@ -329,6 +329,7 @@ struct htc_beacon_config {
#define OP_ASSOCIATED BIT(8) #define OP_ASSOCIATED BIT(8)
#define OP_ENABLE_BEACON BIT(9) #define OP_ENABLE_BEACON BIT(9)
#define OP_LED_DEINIT BIT(10) #define OP_LED_DEINIT BIT(10)
#define OP_UNPLUGGED BIT(11)
struct ath9k_htc_priv { struct ath9k_htc_priv {
struct device *dev; struct device *dev;
......
...@@ -744,6 +744,9 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, ...@@ -744,6 +744,9 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
if (ret) if (ret)
goto err_init; goto err_init;
/* The device may have been unplugged earlier. */
priv->op_flags &= ~OP_UNPLUGGED;
ret = ath9k_init_device(priv, devid); ret = ath9k_init_device(priv, devid);
if (ret) if (ret)
goto err_init; goto err_init;
...@@ -760,6 +763,11 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev, ...@@ -760,6 +763,11 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug) void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
{ {
if (htc_handle->drv_priv) { if (htc_handle->drv_priv) {
/* Check if the device has been yanked out. */
if (hotunplug)
htc_handle->drv_priv->op_flags |= OP_UNPLUGGED;
ath9k_deinit_device(htc_handle->drv_priv); ath9k_deinit_device(htc_handle->drv_priv);
ath9k_deinit_wmi(htc_handle->drv_priv); ath9k_deinit_wmi(htc_handle->drv_priv);
ieee80211_free_hw(htc_handle->drv_priv->hw); ieee80211_free_hw(htc_handle->drv_priv->hw);
......
...@@ -276,6 +276,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, ...@@ -276,6 +276,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
int time_left, ret = 0; int time_left, ret = 0;
unsigned long flags; unsigned long flags;
if (wmi->drv_priv->op_flags & OP_UNPLUGGED)
return 0;
if (!wmi) if (!wmi)
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment