Skip to content

Commit

Permalink
iwlegacy: more priv->mutex serialization
Browse files Browse the repository at this point in the history
Check status bits with mutex taken, because when we wait for mutex
unlock, status can change. Patch should also make remaining sync
commands be send with priv->mutex taken. That will prevent execute
these commands when we are currently reset firmware, what could
possibly cause troubles.

Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Stanislaw Gruszka authored and John W. Linville committed Apr 29, 2011
1 parent 81e6326 commit 28a6e57
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 23 deletions.
8 changes: 5 additions & 3 deletions drivers/net/wireless/iwlegacy/iwl-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2429,11 +2429,13 @@ void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw,

IWL_DEBUG_MAC80211(priv, "changes = 0x%X\n", changes);

if (!iwl_legacy_is_alive(priv))
return;

mutex_lock(&priv->mutex);

if (!iwl_legacy_is_alive(priv)) {
mutex_unlock(&priv->mutex);
return;
}

if (changes & BSS_CHANGED_QOS) {
unsigned long flags;

Expand Down
21 changes: 13 additions & 8 deletions drivers/net/wireless/iwlegacy/iwl3945-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -2748,11 +2748,12 @@ static void iwl3945_bg_init_alive_start(struct work_struct *data)
struct iwl_priv *priv =
container_of(data, struct iwl_priv, init_alive_start.work);

mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
goto out;

mutex_lock(&priv->mutex);
iwl3945_init_alive_start(priv);
out:
mutex_unlock(&priv->mutex);
}

Expand All @@ -2761,11 +2762,12 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
struct iwl_priv *priv =
container_of(data, struct iwl_priv, alive_start.work);

mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
goto out;

mutex_lock(&priv->mutex);
iwl3945_alive_start(priv);
out:
mutex_unlock(&priv->mutex);
}

Expand Down Expand Up @@ -2995,10 +2997,12 @@ static void iwl3945_bg_restart(struct work_struct *data)
} else {
iwl3945_down(priv);

if (test_bit(STATUS_EXIT_PENDING, &priv->status))
mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
mutex_unlock(&priv->mutex);
return;
}

mutex_lock(&priv->mutex);
__iwl3945_up(priv);
mutex_unlock(&priv->mutex);
}
Expand All @@ -3009,11 +3013,12 @@ static void iwl3945_bg_rx_replenish(struct work_struct *data)
struct iwl_priv *priv =
container_of(data, struct iwl_priv, rx_replenish);

mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
goto out;

mutex_lock(&priv->mutex);
iwl3945_rx_replenish(priv);
out:
mutex_unlock(&priv->mutex);
}

Expand Down
28 changes: 16 additions & 12 deletions drivers/net/wireless/iwlegacy/iwl4965-base.c
Original file line number Diff line number Diff line change
Expand Up @@ -2404,11 +2404,12 @@ static void iwl4965_bg_init_alive_start(struct work_struct *data)
struct iwl_priv *priv =
container_of(data, struct iwl_priv, init_alive_start.work);

mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
goto out;

mutex_lock(&priv->mutex);
priv->cfg->ops->lib->init_alive_start(priv);
out:
mutex_unlock(&priv->mutex);
}

Expand All @@ -2417,11 +2418,12 @@ static void iwl4965_bg_alive_start(struct work_struct *data)
struct iwl_priv *priv =
container_of(data, struct iwl_priv, alive_start.work);

mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
goto out;

mutex_lock(&priv->mutex);
iwl4965_alive_start(priv);
out:
mutex_unlock(&priv->mutex);
}

Expand Down Expand Up @@ -2471,10 +2473,12 @@ static void iwl4965_bg_restart(struct work_struct *data)
} else {
iwl4965_down(priv);

if (test_bit(STATUS_EXIT_PENDING, &priv->status))
mutex_lock(&priv->mutex);
if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
mutex_unlock(&priv->mutex);
return;
}

mutex_lock(&priv->mutex);
__iwl4965_up(priv);
mutex_unlock(&priv->mutex);
}
Expand Down Expand Up @@ -2851,21 +2855,22 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw,

IWL_DEBUG_MAC80211(priv, "enter\n");

mutex_lock(&priv->mutex);

if (iwl_legacy_is_rfkill(priv))
goto out_exit;
goto out;

if (test_bit(STATUS_EXIT_PENDING, &priv->status) ||
test_bit(STATUS_SCANNING, &priv->status))
goto out_exit;
goto out;

if (!iwl_legacy_is_associated_ctx(ctx))
goto out_exit;
goto out;

/* channel switch in progress */
if (priv->switch_rxon.switch_in_progress == true)
goto out_exit;
goto out;

mutex_lock(&priv->mutex);
if (priv->cfg->ops->lib->set_channel_switch) {

ch = channel->hw_value;
Expand Down Expand Up @@ -2921,7 +2926,6 @@ void iwl4965_mac_channel_switch(struct ieee80211_hw *hw,
}
out:
mutex_unlock(&priv->mutex);
out_exit:
if (!priv->switch_rxon.switch_in_progress)
ieee80211_chswitch_done(ctx->vif, false);
IWL_DEBUG_MAC80211(priv, "leave\n");
Expand Down

0 comments on commit 28a6e57

Please sign in to comment.