diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2013-02-11 08:56:01 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-02-12 10:07:14 -0500 |
commit | 5360cfb2bcbdd7a906cf290036bd406985973e88 (patch) | |
tree | b7b4220cfa4df37a368840899a11150ba836a7d5 | |
parent | a3777e0fdd4abb2f04202580c236d64ecdaac6f2 (diff) |
iwlwifi: mvm: use atomic interface iteration to avoid deadlock
Using the non-atomic version creates a dependency between
mac80211's iflist_mtx and mvm->mutex. Use the atomic version
instead which doesn't take iflist_mtx but can't sleep, so
send the HCMD in ASYNC.
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/power.c | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index a6b05a02cfd4..64acc4a597fb 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -475,7 +475,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, | |||
475 | if (mvm->vif_count > 1) { | 475 | if (mvm->vif_count > 1) { |
476 | IWL_DEBUG_MAC80211(mvm, | 476 | IWL_DEBUG_MAC80211(mvm, |
477 | "Disable power on existing interfaces\n"); | 477 | "Disable power on existing interfaces\n"); |
478 | ieee80211_iterate_active_interfaces( | 478 | ieee80211_iterate_active_interfaces_atomic( |
479 | mvm->hw, | 479 | mvm->hw, |
480 | IEEE80211_IFACE_ITER_NORMAL, | 480 | IEEE80211_IFACE_ITER_NORMAL, |
481 | iwl_mvm_pm_disable_iterator, mvm); | 481 | iwl_mvm_pm_disable_iterator, mvm); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/power.c b/drivers/net/wireless/iwlwifi/mvm/power.c index 63628739cf4a..5a92a4978795 100644 --- a/drivers/net/wireless/iwlwifi/mvm/power.c +++ b/drivers/net/wireless/iwlwifi/mvm/power.c | |||
@@ -194,7 +194,7 @@ int iwl_mvm_power_disable(struct iwl_mvm *mvm, struct ieee80211_vif *vif) | |||
194 | cmd.id_and_color, iwlmvm_mod_params.power_scheme, | 194 | cmd.id_and_color, iwlmvm_mod_params.power_scheme, |
195 | le16_to_cpu(cmd.flags)); | 195 | le16_to_cpu(cmd.flags)); |
196 | 196 | ||
197 | return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, CMD_SYNC, | 197 | return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, CMD_ASYNC, |
198 | sizeof(cmd), &cmd); | 198 | sizeof(cmd), &cmd); |
199 | } | 199 | } |
200 | 200 | ||