Skip to content

Commit

Permalink
ath9k_htc: Handle device unplug properly
Browse files Browse the repository at this point in the history
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: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Sujith authored and John W. Linville committed Apr 26, 2010
1 parent c11d8f8 commit a3be14b
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/net/wireless/ath/ath9k/htc.h
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,7 @@ struct htc_beacon_config {
#define OP_ASSOCIATED BIT(8)
#define OP_ENABLE_BEACON BIT(9)
#define OP_LED_DEINIT BIT(10)
#define OP_UNPLUGGED BIT(11)

struct ath9k_htc_priv {
struct device *dev;
Expand Down
8 changes: 8 additions & 0 deletions drivers/net/wireless/ath/ath9k/htc_drv_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -744,6 +744,9 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
if (ret)
goto err_init;

/* The device may have been unplugged earlier. */
priv->op_flags &= ~OP_UNPLUGGED;

ret = ath9k_init_device(priv, devid);
if (ret)
goto err_init;
Expand All @@ -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)
{
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_wmi(htc_handle->drv_priv);
ieee80211_free_hw(htc_handle->drv_priv->hw);
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/wireless/ath/ath9k/wmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,9 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
int time_left, ret = 0;
unsigned long flags;

if (wmi->drv_priv->op_flags & OP_UNPLUGGED)
return 0;

if (!wmi)
return -EINVAL;

Expand Down

0 comments on commit a3be14b

Please sign in to comment.