pull request: iwlwifi 2014-05-13
Hi John,
here is a bit more content content for 3.15.
We have here a fix from David Spinadel that makes a previous fix more complete, and an off-by-one issue fixed by Eliad in the same area. I fix the monitor that broke on the way.
Let me know about issues you may have.
Cheers,
The following changes since commit 83f7a85f1134c6e914453f5747435415a23d516b:
iwlwifi: pcie: disable interrupts upon PCIe alloc (2014-05-07 22:54:32 +0300)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git for-john
for you to fetch changes up to b538b8ce76f69f7fa225bc0817bbb361b877ea23:
iwlwifi: mvm: prevent sched scan while not idle (2014-05-13 15:05:32 +0300)
----------------------------------------------------------------
David Spinadel (1):
iwlwifi: mvm: prevent sched scan while not idle
Eliad Peller (1):
iwlwifi: mvm: fix off-by-one in scan channels configuration
Emmanuel Grumbach (1):
iwlwifi: mvm: fix setting channel in monitor mode
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 6 +++--- drivers/net/wireless/iwlwifi/mvm/mvm.h | 2 +- drivers/net/wireless/iwlwifi/mvm/scan.c | 2 +- drivers/net/wireless/iwlwifi/mvm/utils.c | 16 ++++++++-------- 4 files changed, 13 insertions(+), 13 deletions(-)
drivers/net/wireless/iwlwifi/mvm/mac80211.c +3 -3
@@ -1007,7 +1007,7 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,memcpy (cmd->bssid, vif->bss_conf.bssid,ETH_ALEN ); len =roundup (sizeof (*cmd) + cmd->count *ETH_ALEN ,4 ); - ret =iwl_mvm_send_cmd_pdu (mvm,MCAST_FILTER_CMD ,CMD_SYNC , len, cmd); + ret =iwl_mvm_send_cmd_pdu (mvm,MCAST_FILTER_CMD ,CMD_ASYNC , len, cmd);if (ret)IWL_ERR (mvm,"mcast filter cmd error. ret=%d\n" , ret); }
@@ -1023,7 +1023,7 @@ static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm)if (WARN_ON_ONCE (!mvm->mcast_filter_cmd))return ; -ieee80211_iterate_active_interfaces ( +ieee80211_iterate_active_interfaces_atomic ( mvm->hw,IEEE80211_IFACE_ITER_NORMAL , iwl_mvm_mc_iface_iterator, &iter_data); }
@@ -1807,7 +1807,7 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,mutex_lock (&mvm->mutex); -if (iwl_mvm_is_associated (mvm)) { +if (!iwl_mvm_is_idle (mvm)) { ret = -EBUSY ; goto out; }
drivers/net/wireless/iwlwifi/mvm/mvm.h +1 -1
@@ -1004,7 +1004,7 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif) }/* Assoc status */ -bool iwl_mvm_is_associated (struct iwl_mvm *mvm); +bool iwl_mvm_is_idle (struct iwl_mvm *mvm);/* Thermal management and CT-kill */ void iwl_mvm_tt_tx_backoff (struct iwl_mvm *mvm,u32 backoff);
drivers/net/wireless/iwlwifi/mvm/scan.c +1 -1
@@ -732,7 +732,7 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ ].n_channels;int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ ].n_channels;int head =0 ; -int tail = band_2ghz + band_5ghz; +int tail = band_2ghz + band_5ghz -1 ;u32 ssid_bitmap;int cmd_len;int ret;
drivers/net/wireless/iwlwifi/mvm/utils.c +8 -8
@@ -645,21 +645,21 @@ bool iwl_mvm_low_latency(struct iwl_mvm *mvm)return result; } -static void iwl_mvm_assoc_iter (void *_data,u8 *mac,struct ieee80211_vif *vif) +static void iwl_mvm_idle_iter (void *_data,u8 *mac,struct ieee80211_vif *vif) { -bool *assoc = _data; +bool *idle = _data; -if (vif->bss_conf.assoc) - *assoc = true; +if (!vif->bss_conf.idle) + *idle = false; } -bool iwl_mvm_is_associated (struct iwl_mvm *mvm) +bool iwl_mvm_is_idle (struct iwl_mvm *mvm) { -bool assoc = false; +bool idle = true;ieee80211_iterate_active_interfaces_atomic ( mvm->hw,IEEE80211_IFACE_ITER_NORMAL , - iwl_mvm_assoc_iter, &assoc); + iwl_mvm_idle_iter, &idle); -return assoc; +return idle; }
PATCH 1/3 iwlwifi: mvm: fix setting channel in monitor mode
From: Emmanuel Grumbach <[email protected]>
There was a deadlock in monitor mode when we were setting the channel if the channel was not 1.
======================================================
[ INFO: possible circular locking dependency detected ]
3.14.3 #4 Not tainted
-------------------------------------------------------
iw/3323 is trying to acquire lock:
(&local->chanctx_mtx){+.+.+.}, at: [<ffffffffa062e2f2>] ieee80211_vif_release_channel+0x42/0xb0 [mac80211]
but task is already holding lock:
(&local->iflist_mtx){+.+...}, at: [<ffffffffa0609e0a>] ieee80211_set_monitor_channel+0x5a/0x1b0 [mac80211]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&local->iflist_mtx){+.+...}:
[<ffffffff810d95bb>] __lock_acquire+0xb3b/0x13b0
[<ffffffff810d9ee0>] lock_acquire+0xb0/0x1f0
[<ffffffff817eb9c8>] mutex_lock_nested+0x78/0x4f0
[<ffffffffa06225cf>] ieee80211_iterate_active_interfaces+0x2f/0x60 [mac80211]
[<ffffffffa0518189>] iwl_mvm_recalc_multicast+0x49/0xa0 [iwlmvm]
[<ffffffffa051822e>] iwl_mvm_configure_filter+0x4e/0x70 [iwlmvm]
[<ffffffffa05e6d43>] ieee80211_configure_filter+0x153/0x5f0 [mac80211]
[<ffffffffa05e71f5>] ieee80211_reconfig_filter+0x15/0x20 [mac80211]
[snip]-> #1 (&mvm->mutex){+.+.+.}:
[<ffffffff810d95bb>] __lock_acquire+0xb3b/0x13b0
[<ffffffff810d9ee0>] lock_acquire+0xb0/0x1f0
[<ffffffff817eb9c8>] mutex_lock_nested+0x78/0x4f0
[<ffffffffa0517246>] iwl_mvm_add_chanctx+0x56/0xe0 [iwlmvm]
[<ffffffffa062ca1e>] ieee80211_new_chanctx+0x13e/0x410 [mac80211]
[<ffffffffa062d953>] ieee80211_vif_use_channel+0x1c3/0x5a0 [mac80211]
[<ffffffffa06035ab>] ieee80211_add_virtual_monitor+0x1ab/0x6b0 [mac80211]
[<ffffffffa06052ea>] ieee80211_do_open+0xe6a/0x15a0 [mac80211]
[<ffffffffa0605a79>] ieee80211_open+0x59/0x60 [mac80211]
[snip]-> #0 (&local->chanctx_mtx){+.+.+.}:
[<ffffffff810d6cb7>] check_prevs_add+0x977/0x980
[<ffffffff810d95bb>] __lock_acquire+0xb3b/0x13b0
[<ffffffff810d9ee0>] lock_acquire+0xb0/0x1f0
[<ffffffff817eb9c8>] mutex_lock_nested+0x78/0x4f0
[<ffffffffa062e2f2>] ieee80211_vif_release_channel+0x42/0xb0 [mac80211]
[<ffffffffa0609ec3>] ieee80211_set_monitor_channel+0x113/0x1b0 [mac80211]
[<ffffffffa058fb37>] cfg80211_set_monitor_channel+0x77/0x2b0 [cfg80211]
[<ffffffffa056e0b2>] __nl80211_set_channel+0x122/0x140 [cfg80211]
[<ffffffffa0581374>] nl80211_set_wiphy+0x284/0xaf0 [cfg80211]
[snip]other info that might help us debug this:
Chain exists of: &local->chanctx_mtx --> &mvm->mutex --> &local->iflist_mtx Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&local->iflist_mtx);
lock(&mvm->mutex);
lock(&local->iflist_mtx); lock(&local->chanctx_mtx);
*** DEADLOCK ***
This deadlock actually occurs:
INFO: task iw:3323 blocked for more than 120 seconds.
Not tainted 3.14.3 #4"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
iw D ffff8800c8afcd80 4192 3323 3322 0x00000000
ffff880078fdb7e0 0000000000000046 ffff8800c8afcd80 ffff880078fdbfd8 00000000001d5540 00000000001d5540 ffff8801141b0000 ffff8800c8afcd80 ffff880078ff9e38 ffff880078ff9e38 ffff880078ff9e40 0000000000000246
Call Trace: [<ffffffff817ea841>] schedule_preempt_disabled+0x31/0x80 [<ffffffff817ebaed>] mutex_lock_nested+0x19d/0x4f0 [<ffffffffa06225cf>] ? ieee80211_iterate_active_interfaces+0x2f/0x60 [mac80211] [<ffffffffa06225cf>] ? ieee80211_iterate_active_interfaces+0x2f/0x60 [mac80211] [<ffffffffa052a680>] ? iwl_mvm_power_mac_update_mode+0xc0/0xc0 [iwlmvm] [<ffffffffa06225cf>] ieee80211_iterate_active_interfaces+0x2f/0x60 [mac80211] [<ffffffffa0529357>] _iwl_mvm_power_update_binding+0x27/0x80 [iwlmvm] [<ffffffffa0516eb1>] iwl_mvm_unassign_vif_chanctx+0x81/0xc0 [iwlmvm] [<ffffffffa062d3ff>] __ieee80211_vif_release_channel+0xdf/0x470 [mac80211] [<ffffffffa062e2fa>] ieee80211_vif_release_channel+0x4a/0xb0 [mac80211] [<ffffffffa0609ec3>] ieee80211_set_monitor_channel+0x113/0x1b0 [mac80211] [<ffffffffa058fb37>] cfg80211_set_monitor_channel+0x77/0x2b0 [cfg80211] [<ffffffffa056e0b2>] __nl80211_set_channel+0x122/0x140 [cfg80211] [<ffffffffa0581374>] nl80211_set_wiphy+0x284/0xaf0 [cfg80211]
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=75541
--- drivers/net/wireless/iwlwifi/mvm/mac80211.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/iwlwifi/mvm/mac80211.c +2 -2
@@ -1007,7 +1007,7 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,memcpy (cmd->bssid, vif->bss_conf.bssid,ETH_ALEN ); len =roundup (sizeof (*cmd) + cmd->count *ETH_ALEN ,4 ); - ret =iwl_mvm_send_cmd_pdu (mvm,MCAST_FILTER_CMD ,CMD_SYNC , len, cmd); + ret =iwl_mvm_send_cmd_pdu (mvm,MCAST_FILTER_CMD ,CMD_ASYNC , len, cmd);if (ret)IWL_ERR (mvm,"mcast filter cmd error. ret=%d\n" , ret); }
@@ -1023,7 +1023,7 @@ static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm)if (WARN_ON_ONCE (!mvm->mcast_filter_cmd))return ; -ieee80211_iterate_active_interfaces ( +ieee80211_iterate_active_interfaces_atomic ( mvm->hw,IEEE80211_IFACE_ITER_NORMAL , iwl_mvm_mc_iface_iterator, &iter_data); }
Signature · 1 line
1.8.3.2
PATCH 2/3 iwlwifi: mvm: fix off-by-one in scan channels configuration
In reply to Emmanuel GrumbachFrom: Eliad Peller <[email protected]>
tail should be equal to the last valid index, so decrease it by one.
This error causes in "a gap" in some cases (as well as some possible out-of-bound write), finally resulting in ucode assertion.
--- drivers/net/wireless/iwlwifi/mvm/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/iwlwifi/mvm/scan.c +1 -1
@@ -732,7 +732,7 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ ].n_channels;int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ ].n_channels;int head =0 ; -int tail = band_2ghz + band_5ghz; +int tail = band_2ghz + band_5ghz -1 ;u32 ssid_bitmap;int cmd_len;int ret;
Signature · 1 line
1.8.3.2
PATCH 3/3 iwlwifi: mvm: prevent sched scan while not idle
In reply to Emmanuel GrumbachFrom: David Spinadel <[email protected]>
Prevent sched scan while not idle (including during association or in AP mode) instead of while associated only.
This fixes my previous commit which was incomplete:
commit bd5e4744a6ca64299b57a2682c720d00a475a734
Author: David Spinadel <[email protected]> Date: Thu Apr 24 13:15:29 2014 +0300
iwlwifi: mvm: do no sched scan while associated
Currently the FW doesn't support sched scan while associated, Prevent it.
--- drivers/net/wireless/iwlwifi/mvm/mac80211.c | 2 +- drivers/net/wireless/iwlwifi/mvm/mvm.h | 2 +- drivers/net/wireless/iwlwifi/mvm/utils.c | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-)
drivers/net/wireless/iwlwifi/mvm/mac80211.c +1 -1
@@ -1807,7 +1807,7 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,mutex_lock (&mvm->mutex); -if (iwl_mvm_is_associated (mvm)) { +if (!iwl_mvm_is_idle (mvm)) { ret = -EBUSY ; goto out; }
drivers/net/wireless/iwlwifi/mvm/mvm.h +1 -1
@@ -1004,7 +1004,7 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif) }/* Assoc status */ -bool iwl_mvm_is_associated (struct iwl_mvm *mvm); +bool iwl_mvm_is_idle (struct iwl_mvm *mvm);/* Thermal management and CT-kill */ void iwl_mvm_tt_tx_backoff (struct iwl_mvm *mvm,u32 backoff);
drivers/net/wireless/iwlwifi/mvm/utils.c +8 -8
@@ -645,21 +645,21 @@ bool iwl_mvm_low_latency(struct iwl_mvm *mvm)return result; } -static void iwl_mvm_assoc_iter (void *_data,u8 *mac,struct ieee80211_vif *vif) +static void iwl_mvm_idle_iter (void *_data,u8 *mac,struct ieee80211_vif *vif) { -bool *assoc = _data; +bool *idle = _data; -if (vif->bss_conf.assoc) - *assoc = true; +if (!vif->bss_conf.idle) + *idle = false; } -bool iwl_mvm_is_associated (struct iwl_mvm *mvm) +bool iwl_mvm_is_idle (struct iwl_mvm *mvm) { -bool assoc = false; +bool idle = true;ieee80211_iterate_active_interfaces_atomic ( mvm->hw,IEEE80211_IFACE_ITER_NORMAL , - iwl_mvm_assoc_iter, &assoc); + iwl_mvm_idle_iter, &idle); -return assoc; +return idle; }
Signature · 1 line
1.8.3.2
Quoted 16 lines · Emmanuel Grumbach
Hi John,
here is a bit more content content for 3.15.
We have here a fix from David Spinadel that makes a previous fix more complete, and an off-by-one issue fixed by Eliad in the same area. I fix the monitor that broke on the way.
Let me know about issues you may have.
Cheers,
The following changes since commit
83f7a85f1134c6e914453f5747435415a23d516b:iwlwifi: pcie: disable interrupts upon PCIe alloc (2014-05-07 22:54:32 +0300)
Quoted 7 lines
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.gitfor-johnfor you to fetch changes up to
b538b8ce76f69f7fa225bc0817bbb361b877ea23:iwlwifi: mvm: prevent sched scan while not idle (2014-05-13 15:05:32 +0300)
Pulling now...
Signature · 2 lines
John W. Linville Someday the world will need a hero, and you [email protected] might be all we have. Be ready.