2014-10-21 09:29:09

by Emmanuel Grumbach

[permalink] [raw]
Subject: pull request: iwlwifi 2014-10-21

Hi John,

Here is a first pull request for 3.18. This time I chose to work with
signed tags instead of signing emails.
Let me know if this is an issue for you.
Description of the content below.

Note that this you haven't updated your trees yet and Linus released
3.18-rc1 already,
I decided to base my trees on Linus's tag. Let me know you want me to
change this.

Thanks!

The following changes since commit f114040e3ea6e07372334ade75d1ee0775c355e1:

Linux 3.18-rc1 (2014-10-19 18:08:38 -0700)

are available in the git repository at:

git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
tags/iwlwifi-for-john-2014-10-21

for you to fetch changes up to ae35aee606d0ea5678c75fa058ea6eb048fc1d79:

Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
(2014-10-21 09:00:27 +0300)

----------------------------------------------------------------
I revert here a patch that caused interoperability issues.
dvm gets a fix for a bug that was reported by many users.
Two minor fixes for BT Coex and platform power fix that helps
reducing latency when the PCIe link goes to low power states.

----------------------------------------------------------------
Emmanuel Grumbach (5):
iwlwifi: configure the LTR
iwlwifi: mvm: BT Coex - update the MPLUT Boost register value
iwlwifi: mvm: BT coex - fix BT prio for probe requests
iwlwifi: dvm: drop non VO frames when flushing
Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"

Haim Dreyfuss (1):
iwlwifi: mvm: Add tx power condition to bss_info_changed_ap_ibss

Liad Kaufman (1):
iwlwifi: 8000: fix string given to MODULE_FIRMWARE

Matti Gottlieb (1):
iwlwifi: mvm: ROC - bug fixes around time events and locking

drivers/net/wireless/iwlwifi/dvm/mac80211.c | 24 +++++++++++++-----------
drivers/net/wireless/iwlwifi/iwl-8000.c | 3 ++-
drivers/net/wireless/iwlwifi/iwl-trans.h | 2 ++
drivers/net/wireless/iwlwifi/mvm/coex.c | 4 ++--
drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 4 ++--
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | 35
++++++++++++++++++++++++++++++++++-
drivers/net/wireless/iwlwifi/mvm/fw-api.h | 1 +
drivers/net/wireless/iwlwifi/mvm/fw.c | 9 +++++++++
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 32
+++++++++++++++++++++++---------
drivers/net/wireless/iwlwifi/mvm/ops.c | 1 +
drivers/net/wireless/iwlwifi/mvm/scan.c | 3 ++-
drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 +-
drivers/net/wireless/iwlwifi/mvm/tx.c | 8 ++------
drivers/net/wireless/iwlwifi/pcie/trans.c | 16 +++++++++-------
14 files changed, 103 insertions(+), 41 deletions(-)


2014-10-21 16:05:06

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 7/8] iwlwifi: dvm: drop non VO frames when flushing

From: Emmanuel Grumbach <[email protected]>

When mac80211 wants to ensure that a frame is sent, it calls
the flush() callback. Until now, iwldvm implemented this by
waiting that all the frames are sent (ACKed or timeout).
In case of weak signal, this can take a significant amount
of time, delaying the next connection (in case of roaming).
Many users have reported that the flush would take too long
leading to the following error messages to be printed:

iwlwifi 0000:03:00.0: fail to flush all tx fifo queues Q 2
iwlwifi 0000:03:00.0: Current SW read_ptr 161 write_ptr 201
iwl data: 00000000: 00 00 00 00 00 00 00 00 fe ff 01 00 00 00 00 00
[snip]
iwlwifi 0000:03:00.0: FH TRBs(0) = 0x00000000
[snip]
iwlwifi 0000:03:00.0: Q 0 is active and mapped to fifo 3 ra_tid 0x0000 [9,9]
[snip]

Instead of waiting for these packets, simply drop them. This
significantly improves the responsiveness of the network.
Note that all the queues are flushed, but the VO one. This
is not typically used by the applications and it likely
contains management frames that are useful for connection
or roaming.

This bug is tracked here:
https://bugzilla.kernel.org/show_bug.cgi?id=56581

But it is duplicated in distributions' trackers.
A simple search in Ubuntu's database led to these bugs:

https://bugs.launchpad.net/ubuntu/+source/linux-firmware/+bug/1270808
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1305406
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1356236
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1360597
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1361809

Cc: <[email protected]>
Depends-on: 77be2c54c5bd ("mac80211: add vif to flush call")
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/dvm/mac80211.c | 24 +++++++++++++-----------
1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 2364a3c..cae692f 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -1095,6 +1095,7 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u32 queues, bool drop)
{
struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
+ u32 scd_queues;

mutex_lock(&priv->mutex);
IWL_DEBUG_MAC80211(priv, "enter\n");
@@ -1108,18 +1109,19 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
goto done;
}

- /*
- * mac80211 will not push any more frames for transmit
- * until the flush is completed
- */
- if (drop) {
- IWL_DEBUG_MAC80211(priv, "send flush command\n");
- if (iwlagn_txfifo_flush(priv, 0)) {
- IWL_ERR(priv, "flush request fail\n");
- goto done;
- }
+ scd_queues = BIT(priv->cfg->base_params->num_of_queues) - 1;
+ scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) |
+ BIT(IWL_DEFAULT_CMD_QUEUE_NUM));
+
+ if (vif)
+ scd_queues &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]);
+
+ IWL_DEBUG_TX_QUEUES(priv, "Flushing SCD queues: 0x%x\n", scd_queues);
+ if (iwlagn_txfifo_flush(priv, scd_queues)) {
+ IWL_ERR(priv, "flush request fail\n");
+ goto done;
}
- IWL_DEBUG_MAC80211(priv, "wait transmit/flush all frames\n");
+ IWL_DEBUG_TX_QUEUES(priv, "wait transmit/flush all frames\n");
iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff);
done:
mutex_unlock(&priv->mutex);
--
1.9.1


2014-10-23 18:00:09

by John W. Linville

[permalink] [raw]
Subject: Re: pull request: iwlwifi 2014-10-21

I do not have the 3.18-rc1 tag, because Dave doesn't have it yet in
the net.git tre. Please rebase.

Thanks,

John

On Tue, Oct 21, 2014 at 12:29:08PM +0300, Emmanuel Grumbach wrote:
> Hi John,
>
> Here is a first pull request for 3.18. This time I chose to work with
> signed tags instead of signing emails.
> Let me know if this is an issue for you.
> Description of the content below.
>
> Note that this you haven't updated your trees yet and Linus released
> 3.18-rc1 already,
> I decided to base my trees on Linus's tag. Let me know you want me to
> change this.
>
> Thanks!
>
> The following changes since commit f114040e3ea6e07372334ade75d1ee0775c355e1:
>
> Linux 3.18-rc1 (2014-10-19 18:08:38 -0700)
>
> are available in the git repository at:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
> tags/iwlwifi-for-john-2014-10-21
>
> for you to fetch changes up to ae35aee606d0ea5678c75fa058ea6eb048fc1d79:
>
> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
> (2014-10-21 09:00:27 +0300)
>
> ----------------------------------------------------------------
> I revert here a patch that caused interoperability issues.
> dvm gets a fix for a bug that was reported by many users.
> Two minor fixes for BT Coex and platform power fix that helps
> reducing latency when the PCIe link goes to low power states.
>
> ----------------------------------------------------------------
> Emmanuel Grumbach (5):
> iwlwifi: configure the LTR
> iwlwifi: mvm: BT Coex - update the MPLUT Boost register value
> iwlwifi: mvm: BT coex - fix BT prio for probe requests
> iwlwifi: dvm: drop non VO frames when flushing
> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
>
> Haim Dreyfuss (1):
> iwlwifi: mvm: Add tx power condition to bss_info_changed_ap_ibss
>
> Liad Kaufman (1):
> iwlwifi: 8000: fix string given to MODULE_FIRMWARE
>
> Matti Gottlieb (1):
> iwlwifi: mvm: ROC - bug fixes around time events and locking
>
> drivers/net/wireless/iwlwifi/dvm/mac80211.c | 24 +++++++++++++-----------
> drivers/net/wireless/iwlwifi/iwl-8000.c | 3 ++-
> drivers/net/wireless/iwlwifi/iwl-trans.h | 2 ++
> drivers/net/wireless/iwlwifi/mvm/coex.c | 4 ++--
> drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 4 ++--
> drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | 35
> ++++++++++++++++++++++++++++++++++-
> drivers/net/wireless/iwlwifi/mvm/fw-api.h | 1 +
> drivers/net/wireless/iwlwifi/mvm/fw.c | 9 +++++++++
> drivers/net/wireless/iwlwifi/mvm/mac80211.c | 32
> +++++++++++++++++++++++---------
> drivers/net/wireless/iwlwifi/mvm/ops.c | 1 +
> drivers/net/wireless/iwlwifi/mvm/scan.c | 3 ++-
> drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 +-
> drivers/net/wireless/iwlwifi/mvm/tx.c | 8 ++------
> drivers/net/wireless/iwlwifi/pcie/trans.c | 16 +++++++++-------
> 14 files changed, 103 insertions(+), 41 deletions(-)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>

--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.

2014-10-21 16:05:01

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 5/8] iwlwifi: mvm: Add tx power condition to bss_info_changed_ap_ibss

From: Haim Dreyfuss <[email protected]>

The tx power should be limited from many reasons.
currently, setting the tx power is available by the mvm only for
station interface. Adding the tx power condition to
bss_info_changed_ap_ibss make it available also for AP.

Signed-off-by: Haim Dreyfuss <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index c7a73c6..892a6bc 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1734,6 +1734,13 @@ iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
if (changes & BSS_CHANGED_BEACON &&
iwl_mvm_mac_ctxt_beacon_changed(mvm, vif))
IWL_WARN(mvm, "Failed updating beacon data\n");
+
+ if (changes & BSS_CHANGED_TXPOWER) {
+ IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n",
+ bss_conf->txpower);
+ iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower);
+ }
+
}

static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
--
1.9.1


2014-10-21 16:05:06

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 8/8] Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"

From: Emmanuel Grumbach <[email protected]>

This reverts commit aa11bbf3df026d6b1c6b528bef634fd9de7c2619.
This commit was causing connection issues and is not needed
if IWL_MVM_RS_RSSI_BASED_INIT_RATE is set to false by default.

Regardless of the issues mentioned above, this patch added the
following WARNING:

WARNING: CPU: 0 PID: 3946 at drivers/net/wireless/iwlwifi/mvm/tx.c:190 iwl_mvm_set_tx_params+0x60a/0x6f0 [iwlmvm]()
Got an HT rate for a non data frame 0x8
CPU: 0 PID: 3946 Comm: wpa_supplicant Tainted: G O 3.17.0+ #6
Hardware name: LENOVO 20ANCTO1WW/20ANCTO1WW, BIOS GLET71WW (2.25 ) 07/02/2014
0000000000000009 ffffffff814fa911 ffff8804288db8f8 ffffffff81064f52
0000000000001808 ffff8804288db948 ffff88040add8660 ffff8804291b5600
0000000000000000 ffffffff81064fb7 ffffffffa07b73d0 0000000000000020
Call Trace:
[<ffffffff814fa911>] ? dump_stack+0x41/0x51
[<ffffffff81064f52>] ? warn_slowpath_common+0x72/0x90
[<ffffffff81064fb7>] ? warn_slowpath_fmt+0x47/0x50
[<ffffffffa07a39ea>] ? iwl_mvm_set_tx_params+0x60a/0x6f0 [iwlmvm]
[<ffffffffa07a3cf8>] ? iwl_mvm_tx_skb+0x48/0x3c0 [iwlmvm]
[<ffffffffa079cb9b>] ? iwl_mvm_mac_tx+0x7b/0x180 [iwlmvm]
[<ffffffffa0746ce9>] ? __ieee80211_tx+0x2b9/0x3c0 [mac80211]
[<ffffffffa07492f3>] ? ieee80211_tx+0xb3/0x100 [mac80211]
[<ffffffffa0749c49>] ? ieee80211_subif_start_xmit+0x459/0xca0 [mac80211]
[<ffffffff814116e7>] ? dev_hard_start_xmit+0x337/0x5f0
[<ffffffff81430d46>] ? sch_direct_xmit+0x96/0x1f0
[<ffffffff81411ba3>] ? __dev_queue_xmit+0x203/0x4f0
[<ffffffff8142f670>] ? ether_setup+0x70/0x70
[<ffffffff814e96a1>] ? packet_sendmsg+0xf81/0x1110
[<ffffffff8140625c>] ? skb_free_datagram+0xc/0x40
[<ffffffff813f7538>] ? sock_sendmsg+0x88/0xc0
[<ffffffff813f7274>] ? move_addr_to_kernel.part.20+0x14/0x60
[<ffffffff811c47c2>] ? __inode_wait_for_writeback+0x62/0xb0
[<ffffffff813f7a91>] ? SYSC_sendto+0xf1/0x180
[<ffffffff813f88f9>] ? __sys_recvmsg+0x39/0x70
[<ffffffff8150066d>] ? system_call_fastpath+0x1a/0x1f
---[ end trace cc19a150d311fc63 ]---

which was reported here: https://bugzilla.kernel.org/show_bug.cgi?id=85691

CC: <[email protected]> [3.13+]
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/mvm/tx.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index 1cb793a..c6a517c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -175,14 +175,10 @@ static void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm,

/*
* for data packets, rate info comes from the table inside the fw. This
- * table is controlled by LINK_QUALITY commands. Exclude ctrl port
- * frames like EAPOLs which should be treated as mgmt frames. This
- * avoids them being sent initially in high rates which increases the
- * chances for completion of the 4-Way handshake.
+ * table is controlled by LINK_QUALITY commands
*/

- if (ieee80211_is_data(fc) && sta &&
- !(info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO)) {
+ if (ieee80211_is_data(fc) && sta) {
tx_cmd->initial_rate_index = 0;
tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE);
return;
--
1.9.1


2014-10-21 16:04:57

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 3/8] iwlwifi: mvm: BT Coex - update the MPLUT Boost register value

From: Emmanuel Grumbach <[email protected]>

Cc: <[email protected]> [3.16+]
Fixes: 2adc8949efab ("iwlwifi: mvm: BT Coex - fix boost register / LUT values")
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/mvm/coex.c | 4 ++--
drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/mvm/coex.c b/drivers/net/wireless/iwlwifi/mvm/coex.c
index 8df2021..da2ffb7 100644
--- a/drivers/net/wireless/iwlwifi/mvm/coex.c
+++ b/drivers/net/wireless/iwlwifi/mvm/coex.c
@@ -303,8 +303,8 @@ static const __le64 iwl_ci_mask[][3] = {
};

static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = {
- cpu_to_le32(0x28412201),
- cpu_to_le32(0x11118451),
+ cpu_to_le32(0x2e402280),
+ cpu_to_le32(0x7711a751),
};

struct corunning_block_luts {
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
index 585c0ab..8a1d2f3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
+++ b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
@@ -291,8 +291,8 @@ static const __le64 iwl_ci_mask[][3] = {
};

static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = {
- cpu_to_le32(0x28412201),
- cpu_to_le32(0x11118451),
+ cpu_to_le32(0x2e402280),
+ cpu_to_le32(0x7711a751),
};

struct corunning_block_luts {
--
1.9.1


2014-10-21 16:04:55

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 2/8] iwlwifi: 8000: fix string given to MODULE_FIRMWARE

From: Liad Kaufman <[email protected]>

I changed the string but forgot to update the fix also to
MODULE_FIRMWARE().

Signed-off-by: Liad Kaufman <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-8000.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c
index e435148..d2b7234 100644
--- a/drivers/net/wireless/iwlwifi/iwl-8000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-8000.c
@@ -82,7 +82,8 @@
#define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */

#define IWL8000_FW_PRE "iwlwifi-8000"
-#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode"
+#define IWL8000_MODULE_FIRMWARE(api) \
+ IWL8000_FW_PRE "-" __stringify(api) ".ucode"

#define NVM_HW_SECTION_NUM_FAMILY_8000 10
#define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin"
--
1.9.1


2014-10-23 18:24:34

by Emmanuel Grumbach

[permalink] [raw]
Subject: Re: pull request: iwlwifi 2014-10-21

On Thu, Oct 23, 2014 at 8:48 PM, John W. Linville
<[email protected]> wrote:
> I do not have the 3.18-rc1 tag, because Dave doesn't have it yet in
> the net.git tre. Please rebase.
>

Done - new tag:

git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
tags/iwlwifi-for-john-2014-10-23


> Thanks,
>
> John
>
> On Tue, Oct 21, 2014 at 12:29:08PM +0300, Emmanuel Grumbach wrote:
>> Hi John,
>>
>> Here is a first pull request for 3.18. This time I chose to work with
>> signed tags instead of signing emails.
>> Let me know if this is an issue for you.
>> Description of the content below.
>>
>> Note that this you haven't updated your trees yet and Linus released
>> 3.18-rc1 already,
>> I decided to base my trees on Linus's tag. Let me know you want me to
>> change this.
>>
>> Thanks!
>>
>> The following changes since commit f114040e3ea6e07372334ade75d1ee0775c355e1:
>>
>> Linux 3.18-rc1 (2014-10-19 18:08:38 -0700)
>>
>> are available in the git repository at:
>>
>> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
>> tags/iwlwifi-for-john-2014-10-21
>>
>> for you to fetch changes up to ae35aee606d0ea5678c75fa058ea6eb048fc1d79:
>>
>> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
>> (2014-10-21 09:00:27 +0300)
>>
>> ----------------------------------------------------------------
>> I revert here a patch that caused interoperability issues.
>> dvm gets a fix for a bug that was reported by many users.
>> Two minor fixes for BT Coex and platform power fix that helps
>> reducing latency when the PCIe link goes to low power states.
>>
>> ----------------------------------------------------------------
>> Emmanuel Grumbach (5):
>> iwlwifi: configure the LTR
>> iwlwifi: mvm: BT Coex - update the MPLUT Boost register value
>> iwlwifi: mvm: BT coex - fix BT prio for probe requests
>> iwlwifi: dvm: drop non VO frames when flushing
>> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
>>
>> Haim Dreyfuss (1):
>> iwlwifi: mvm: Add tx power condition to bss_info_changed_ap_ibss
>>
>> Liad Kaufman (1):
>> iwlwifi: 8000: fix string given to MODULE_FIRMWARE
>>
>> Matti Gottlieb (1):
>> iwlwifi: mvm: ROC - bug fixes around time events and locking
>>
>> drivers/net/wireless/iwlwifi/dvm/mac80211.c | 24 +++++++++++++-----------
>> drivers/net/wireless/iwlwifi/iwl-8000.c | 3 ++-
>> drivers/net/wireless/iwlwifi/iwl-trans.h | 2 ++
>> drivers/net/wireless/iwlwifi/mvm/coex.c | 4 ++--
>> drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 4 ++--
>> drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | 35
>> ++++++++++++++++++++++++++++++++++-
>> drivers/net/wireless/iwlwifi/mvm/fw-api.h | 1 +
>> drivers/net/wireless/iwlwifi/mvm/fw.c | 9 +++++++++
>> drivers/net/wireless/iwlwifi/mvm/mac80211.c | 32
>> +++++++++++++++++++++++---------
>> drivers/net/wireless/iwlwifi/mvm/ops.c | 1 +
>> drivers/net/wireless/iwlwifi/mvm/scan.c | 3 ++-
>> drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 +-
>> drivers/net/wireless/iwlwifi/mvm/tx.c | 8 ++------
>> drivers/net/wireless/iwlwifi/pcie/trans.c | 16 +++++++++-------
>> 14 files changed, 103 insertions(+), 41 deletions(-)
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
>
> --
> John W. Linville Someday the world will need a hero, and you
> [email protected] might be all we have. Be ready.

2014-10-21 16:05:04

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 6/8] iwlwifi: mvm: ROC - bug fixes around time events and locking

From: Matti Gottlieb <[email protected]>

Don't add the time event to the list. We added it several
times the same time event, which leads to an infinite loop
when walking the list.

Since we (currently) don't support more than one ROC for STA
vif at a time, enforce this and don't add the time event
to any list.

We were also missing the locking of the mutex which led to
a lockdep splat - fix that.

Signed-off-by: Matti Gottlieb <[email protected]>
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/mvm/mac80211.c | 25 ++++++++++++++++---------
drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 +-
2 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 892a6bc..585fe5b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -526,7 +526,8 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
}

if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
- !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status))
+ !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) &&
+ !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status))
goto drop;

/* treat non-bufferable MMPDUs as broadcast if sta is sleeping */
@@ -2374,14 +2375,19 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
/* Set the node address */
memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN);

+ lockdep_assert_held(&mvm->mutex);
+
+ spin_lock_bh(&mvm->time_event_lock);
+
+ if (WARN_ON(te_data->id == HOT_SPOT_CMD)) {
+ spin_unlock_bh(&mvm->time_event_lock);
+ return -EIO;
+ }
+
te_data->vif = vif;
te_data->duration = duration;
te_data->id = HOT_SPOT_CMD;

- lockdep_assert_held(&mvm->mutex);
-
- spin_lock_bh(&mvm->time_event_lock);
- list_add_tail(&te_data->list, &mvm->time_event_list);
spin_unlock_bh(&mvm->time_event_lock);

/*
@@ -2437,22 +2443,23 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
duration, type);

+ mutex_lock(&mvm->mutex);
+
switch (vif->type) {
case NL80211_IFTYPE_STATION:
/* Use aux roc framework (HS20) */
ret = iwl_mvm_send_aux_roc_cmd(mvm, channel,
vif, duration);
- return ret;
+ goto out_unlock;
case NL80211_IFTYPE_P2P_DEVICE:
/* handle below */
break;
default:
IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type);
- return -EINVAL;
+ ret = -EINVAL;
+ goto out_unlock;
}

- mutex_lock(&mvm->mutex);
-
for (i = 0; i < NUM_PHY_CTX; i++) {
phy_ctxt = &mvm->phy_ctxts[i];
if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt)
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c
index b7f9e61..6dfad23 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c
@@ -305,8 +305,8 @@ static int iwl_mvm_aux_roc_te_handle_notif(struct iwl_mvm *mvm,
te_data->running = false;
te_data->vif = NULL;
te_data->uid = 0;
+ te_data->id = TE_MAX;
} else if (le32_to_cpu(notif->action) == TE_V2_NOTIF_HOST_EVENT_START) {
- set_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status);
set_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status);
te_data->running = true;
ieee80211_ready_on_channel(mvm->hw); /* Start TE */
--
1.9.1


2014-10-21 16:05:01

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 4/8] iwlwifi: mvm: BT coex - fix BT prio for probe requests

From: Emmanuel Grumbach <[email protected]>

The probe requests sent during scan must get BT prio 3.
Fix that.

Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/mvm/scan.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index cb85e63..b280d5d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -459,7 +459,8 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
basic_ssid ? 1 : 0);

cmd->tx_cmd.tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL |
- TX_CMD_FLG_BT_DIS);
+ 3 << TX_CMD_FLG_BT_PRIO_POS);
+
cmd->tx_cmd.sta_id = mvm->aux_sta.sta_id;
cmd->tx_cmd.life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
cmd->tx_cmd.rate_n_flags =
--
1.9.1


2014-10-21 16:05:01

by Emmanuel Grumbach

[permalink] [raw]
Subject: [PATCH 1/8] iwlwifi: configure the LTR

From: Emmanuel Grumbach <[email protected]>

The LTR is the handshake between the device and the root
complex about the latency allowed when the bus exits power
save. This configuration was missing and this led to high
latency in the link power up. The end user could experience
high latency in the network because of this.

Cc: <[email protected]> [3.10+]
Signed-off-by: Emmanuel Grumbach <[email protected]>
---
drivers/net/wireless/iwlwifi/iwl-trans.h | 2 ++
drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | 35 ++++++++++++++++++++++++-
drivers/net/wireless/iwlwifi/mvm/fw-api.h | 1 +
drivers/net/wireless/iwlwifi/mvm/fw.c | 9 +++++++
drivers/net/wireless/iwlwifi/mvm/ops.c | 1 +
drivers/net/wireless/iwlwifi/pcie/trans.c | 16 ++++++-----
6 files changed, 56 insertions(+), 8 deletions(-)

diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index 9eb8524..d8fc548 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -563,6 +563,7 @@ enum iwl_trans_state {
* Set during transport allocation.
* @hw_id_str: a string with info about HW ID. Set during transport allocation.
* @pm_support: set to true in start_hw if link pm is supported
+ * @ltr_enabled: set to true if the LTR is enabled
* @dev_cmd_pool: pool for Tx cmd allocation - for internal use only.
* The user should use iwl_trans_{alloc,free}_tx_cmd.
* @dev_cmd_headroom: room needed for the transport's private use before the
@@ -589,6 +590,7 @@ struct iwl_trans {
u8 rx_mpdu_cmd, rx_mpdu_cmd_hdr_size;

bool pm_support;
+ bool ltr_enabled;

/* The following fields are internal only */
struct kmem_cache *dev_cmd_pool;
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
index 27dd863..2fd8ad4 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h
@@ -68,13 +68,46 @@

/* Power Management Commands, Responses, Notifications */

+/**
+ * enum iwl_ltr_config_flags - masks for LTR config command flags
+ * @LTR_CFG_FLAG_FEATURE_ENABLE: Feature operational status
+ * @LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS: allow LTR change on shadow
+ * memory access
+ * @LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH: allow LTR msg send on ANY LTR
+ * reg change
+ * @LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3: allow LTR msg send on transition from
+ * D0 to D3
+ * @LTR_CFG_FLAG_SW_SET_SHORT: fixed static short LTR register
+ * @LTR_CFG_FLAG_SW_SET_LONG: fixed static short LONG register
+ * @LTR_CFG_FLAG_DENIE_C10_ON_PD: allow going into C10 on PD
+ */
+enum iwl_ltr_config_flags {
+ LTR_CFG_FLAG_FEATURE_ENABLE = BIT(0),
+ LTR_CFG_FLAG_HW_DIS_ON_SHADOW_REG_ACCESS = BIT(1),
+ LTR_CFG_FLAG_HW_EN_SHRT_WR_THROUGH = BIT(2),
+ LTR_CFG_FLAG_HW_DIS_ON_D0_2_D3 = BIT(3),
+ LTR_CFG_FLAG_SW_SET_SHORT = BIT(4),
+ LTR_CFG_FLAG_SW_SET_LONG = BIT(5),
+ LTR_CFG_FLAG_DENIE_C10_ON_PD = BIT(6),
+};
+
+/**
+ * struct iwl_ltr_config_cmd - configures the LTR
+ * @flags: See %enum iwl_ltr_config_flags
+ */
+struct iwl_ltr_config_cmd {
+ __le32 flags;
+ __le32 static_long;
+ __le32 static_short;
+} __packed;
+
/* Radio LP RX Energy Threshold measured in dBm */
#define POWER_LPRX_RSSI_THRESHOLD 75
#define POWER_LPRX_RSSI_THRESHOLD_MAX 94
#define POWER_LPRX_RSSI_THRESHOLD_MIN 30

/**
- * enum iwl_scan_flags - masks for power table command flags
+ * enum iwl_power_flags - masks for power table command flags
* @POWER_FLAGS_POWER_SAVE_ENA_MSK: '1' Allow to save power by turning off
* receiver and transmitter. '0' - does not allow.
* @POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK: '0' Driver disables power management,
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
index 667a922..c62575d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
@@ -157,6 +157,7 @@ enum {
/* Power - legacy power table command */
POWER_TABLE_CMD = 0x77,
PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION = 0x78,
+ LTR_CONFIG = 0xee,

/* Thermal Throttling*/
REPLY_THERMAL_MNG_BACKOFF = 0x7e,
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c
index 23fd711..e0d9f19 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
@@ -480,6 +480,15 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
/* Initialize tx backoffs to the minimal possible */
iwl_mvm_tt_tx_backoff(mvm, 0);

+ if (mvm->trans->ltr_enabled) {
+ struct iwl_ltr_config_cmd cmd = {
+ .flags = cpu_to_le32(LTR_CFG_FLAG_FEATURE_ENABLE),
+ };
+
+ WARN_ON(iwl_mvm_send_cmd_pdu(mvm, LTR_CONFIG, 0,
+ sizeof(cmd), &cmd));
+ }
+
ret = iwl_mvm_power_update_device(mvm);
if (ret)
goto error;
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 15aa298..48cb25a 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -336,6 +336,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = {
CMD(DTS_MEASUREMENT_NOTIFICATION),
CMD(REPLY_THERMAL_MNG_BACKOFF),
CMD(MAC_PM_POWER_TABLE),
+ CMD(LTR_CONFIG),
CMD(BT_COEX_CI),
CMD(BT_COEX_UPDATE_SW_BOOST),
CMD(BT_COEX_UPDATE_CORUN_LUT),
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 1393bac..c706dba 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -174,6 +174,7 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans)
{
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
u16 lctl;
+ u16 cap;

/*
* HW bug W/A for instability in PCIe bus L0S->L1 transition.
@@ -184,16 +185,17 @@ static void iwl_pcie_apm_config(struct iwl_trans *trans)
* power savings, even without L1.
*/
pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_LNKCTL, &lctl);
- if (lctl & PCI_EXP_LNKCTL_ASPM_L1) {
- /* L1-ASPM enabled; disable(!) L0S */
+ if (lctl & PCI_EXP_LNKCTL_ASPM_L1)
iwl_set_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
- dev_info(trans->dev, "L1 Enabled; Disabling L0S\n");
- } else {
- /* L1-ASPM disabled; enable(!) L0S */
+ else
iwl_clear_bit(trans, CSR_GIO_REG, CSR_GIO_REG_VAL_L0S_ENABLED);
- dev_info(trans->dev, "L1 Disabled; Enabling L0S\n");
- }
trans->pm_support = !(lctl & PCI_EXP_LNKCTL_ASPM_L0S);
+
+ pcie_capability_read_word(trans_pcie->pci_dev, PCI_EXP_DEVCTL2, &cap);
+ trans->ltr_enabled = cap & PCI_EXP_DEVCTL2_LTR_EN;
+ dev_info(trans->dev, "L1 %sabled - LTR %sabled\n",
+ (lctl & PCI_EXP_LNKCTL_ASPM_L1) ? "En" : "Dis",
+ trans->ltr_enabled ? "En" : "Dis");
}

/*
--
1.9.1


2014-10-27 17:45:10

by John W. Linville

[permalink] [raw]
Subject: Re: pull request: iwlwifi 2014-10-21

On Thu, Oct 23, 2014 at 09:24:33PM +0300, Emmanuel Grumbach wrote:
> On Thu, Oct 23, 2014 at 8:48 PM, John W. Linville
> <[email protected]> wrote:
> > I do not have the 3.18-rc1 tag, because Dave doesn't have it yet in
> > the net.git tre. Please rebase.
> >
>
> Done - new tag:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
> tags/iwlwifi-for-john-2014-10-23

Pulling now...

> > Thanks,
> >
> > John
> >
> > On Tue, Oct 21, 2014 at 12:29:08PM +0300, Emmanuel Grumbach wrote:
> >> Hi John,
> >>
> >> Here is a first pull request for 3.18. This time I chose to work with
> >> signed tags instead of signing emails.
> >> Let me know if this is an issue for you.
> >> Description of the content below.
> >>
> >> Note that this you haven't updated your trees yet and Linus released
> >> 3.18-rc1 already,
> >> I decided to base my trees on Linus's tag. Let me know you want me to
> >> change this.
> >>
> >> Thanks!
> >>
> >> The following changes since commit f114040e3ea6e07372334ade75d1ee0775c355e1:
> >>
> >> Linux 3.18-rc1 (2014-10-19 18:08:38 -0700)
> >>
> >> are available in the git repository at:
> >>
> >> git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes.git
> >> tags/iwlwifi-for-john-2014-10-21
> >>
> >> for you to fetch changes up to ae35aee606d0ea5678c75fa058ea6eb048fc1d79:
> >>
> >> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
> >> (2014-10-21 09:00:27 +0300)
> >>
> >> ----------------------------------------------------------------
> >> I revert here a patch that caused interoperability issues.
> >> dvm gets a fix for a bug that was reported by many users.
> >> Two minor fixes for BT Coex and platform power fix that helps
> >> reducing latency when the PCIe link goes to low power states.
> >>
> >> ----------------------------------------------------------------
> >> Emmanuel Grumbach (5):
> >> iwlwifi: configure the LTR
> >> iwlwifi: mvm: BT Coex - update the MPLUT Boost register value
> >> iwlwifi: mvm: BT coex - fix BT prio for probe requests
> >> iwlwifi: dvm: drop non VO frames when flushing
> >> Revert "iwlwifi: mvm: treat EAPOLs like mgmt frames wrt rate"
> >>
> >> Haim Dreyfuss (1):
> >> iwlwifi: mvm: Add tx power condition to bss_info_changed_ap_ibss
> >>
> >> Liad Kaufman (1):
> >> iwlwifi: 8000: fix string given to MODULE_FIRMWARE
> >>
> >> Matti Gottlieb (1):
> >> iwlwifi: mvm: ROC - bug fixes around time events and locking
> >>
> >> drivers/net/wireless/iwlwifi/dvm/mac80211.c | 24 +++++++++++++-----------
> >> drivers/net/wireless/iwlwifi/iwl-8000.c | 3 ++-
> >> drivers/net/wireless/iwlwifi/iwl-trans.h | 2 ++
> >> drivers/net/wireless/iwlwifi/mvm/coex.c | 4 ++--
> >> drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 4 ++--
> >> drivers/net/wireless/iwlwifi/mvm/fw-api-power.h | 35
> >> ++++++++++++++++++++++++++++++++++-
> >> drivers/net/wireless/iwlwifi/mvm/fw-api.h | 1 +
> >> drivers/net/wireless/iwlwifi/mvm/fw.c | 9 +++++++++
> >> drivers/net/wireless/iwlwifi/mvm/mac80211.c | 32
> >> +++++++++++++++++++++++---------
> >> drivers/net/wireless/iwlwifi/mvm/ops.c | 1 +
> >> drivers/net/wireless/iwlwifi/mvm/scan.c | 3 ++-
> >> drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 +-
> >> drivers/net/wireless/iwlwifi/mvm/tx.c | 8 ++------
> >> drivers/net/wireless/iwlwifi/pcie/trans.c | 16 +++++++++-------
> >> 14 files changed, 103 insertions(+), 41 deletions(-)
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> >> the body of a message to [email protected]
> >> More majordomo info at http://vger.kernel.org/majordomo-info.html
> >>
> >
> > --
> > John W. Linville Someday the world will need a hero, and you
> > [email protected] might be all we have. Be ready.
>

--
John W. Linville Someday the world will need a hero, and you
[email protected] might be all we have. Be ready.