From: Greg Kroah-Hartman Date: Mon, 6 Apr 2015 10:39:44 +0000 (+0200) Subject: 3.19-stable patches X-Git-Tag: v3.10.74~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=35e5a9d9a08815a1ca75efe88e74240091891f19;p=thirdparty%2Fkernel%2Fstable-queue.git 3.19-stable patches added patches: iwlwifi-fix-max_ht_ampdu_exponent-for-older-devices.patch iwlwifi-mvm-bt-coex-fix-a-null-pointer-exception.patch iwlwifi-mvm-fix-roc-removal.patch iwlwifi-mvm-rs-fix-bt-coex-check-to-look-at-the-correct-ant.patch mac80211-count-interfaces-correctly-for-combination-checks.patch mac80211-disable-u-apsd-queues-by-default.patch mac80211-drop-unencrypted-frames-in-mesh-fwding.patch nl80211-ignore-ht-vht-capabilities-without-qos-wmm.patch powercap-rapl-handle-domains-with-different-energy-units.patch --- diff --git a/queue-3.19/iwlwifi-fix-max_ht_ampdu_exponent-for-older-devices.patch b/queue-3.19/iwlwifi-fix-max_ht_ampdu_exponent-for-older-devices.patch new file mode 100644 index 00000000000..86bcfed9e97 --- /dev/null +++ b/queue-3.19/iwlwifi-fix-max_ht_ampdu_exponent-for-older-devices.patch @@ -0,0 +1,177 @@ +From 540623caa6c769d9d19e6044949f5fa2fe1a33a6 Mon Sep 17 00:00:00 2001 +From: Emmanuel Grumbach +Date: Mon, 23 Feb 2015 02:40:07 +0200 +Subject: iwlwifi: fix max_ht_ampdu_exponent for older devices + +From: Emmanuel Grumbach + +commit 540623caa6c769d9d19e6044949f5fa2fe1a33a6 upstream. + +The commit below didn't update the max_ht_ampdu_exponent +for the devices listed in iwl-[1-6]000.c which, in result, +became 0 instead of 8K. This reduced the size of the Rx +AMPDU from 64K to 8K which had an impact in the Rx +throughput. One user reported that because of this, his +downstream throughput droppped by a half. + +Fixes: c064ddf318aa ("iwlwifi: change max HT and VHT A-MPDU exponent") +Reported-and-tested-by: Valentin Manea +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/iwl-1000.c | 6 ++++-- + drivers/net/wireless/iwlwifi/iwl-2000.c | 13 +++++++++---- + drivers/net/wireless/iwlwifi/iwl-5000.c | 6 ++++-- + drivers/net/wireless/iwlwifi/iwl-6000.c | 18 ++++++++++++------ + 4 files changed, 29 insertions(+), 14 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/iwl-1000.c ++++ b/drivers/net/wireless/iwlwifi/iwl-1000.c +@@ -95,7 +95,8 @@ static const struct iwl_eeprom_params iw + .nvm_calib_ver = EEPROM_1000_TX_POWER_VERSION, \ + .base_params = &iwl1000_base_params, \ + .eeprom_params = &iwl1000_eeprom_params, \ +- .led_mode = IWL_LED_BLINK ++ .led_mode = IWL_LED_BLINK, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl1000_bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 1000 BGN", +@@ -121,7 +122,8 @@ const struct iwl_cfg iwl1000_bg_cfg = { + .base_params = &iwl1000_base_params, \ + .eeprom_params = &iwl1000_eeprom_params, \ + .led_mode = IWL_LED_RF_STATE, \ +- .rx_with_siso_diversity = true ++ .rx_with_siso_diversity = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl100_bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 100 BGN", +--- a/drivers/net/wireless/iwlwifi/iwl-2000.c ++++ b/drivers/net/wireless/iwlwifi/iwl-2000.c +@@ -123,7 +123,9 @@ static const struct iwl_eeprom_params iw + .nvm_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ + .base_params = &iwl2000_base_params, \ + .eeprom_params = &iwl20x0_eeprom_params, \ +- .led_mode = IWL_LED_RF_STATE ++ .led_mode = IWL_LED_RF_STATE, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K ++ + + const struct iwl_cfg iwl2000_2bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 2200 BGN", +@@ -149,7 +151,8 @@ const struct iwl_cfg iwl2000_2bgn_d_cfg + .nvm_calib_ver = EEPROM_2000_TX_POWER_VERSION, \ + .base_params = &iwl2030_base_params, \ + .eeprom_params = &iwl20x0_eeprom_params, \ +- .led_mode = IWL_LED_RF_STATE ++ .led_mode = IWL_LED_RF_STATE, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl2030_2bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 2230 BGN", +@@ -170,7 +173,8 @@ const struct iwl_cfg iwl2030_2bgn_cfg = + .base_params = &iwl2000_base_params, \ + .eeprom_params = &iwl20x0_eeprom_params, \ + .led_mode = IWL_LED_RF_STATE, \ +- .rx_with_siso_diversity = true ++ .rx_with_siso_diversity = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl105_bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 105 BGN", +@@ -197,7 +201,8 @@ const struct iwl_cfg iwl105_bgn_d_cfg = + .base_params = &iwl2030_base_params, \ + .eeprom_params = &iwl20x0_eeprom_params, \ + .led_mode = IWL_LED_RF_STATE, \ +- .rx_with_siso_diversity = true ++ .rx_with_siso_diversity = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl135_bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N 135 BGN", +--- a/drivers/net/wireless/iwlwifi/iwl-5000.c ++++ b/drivers/net/wireless/iwlwifi/iwl-5000.c +@@ -93,7 +93,8 @@ static const struct iwl_eeprom_params iw + .nvm_calib_ver = EEPROM_5000_TX_POWER_VERSION, \ + .base_params = &iwl5000_base_params, \ + .eeprom_params = &iwl5000_eeprom_params, \ +- .led_mode = IWL_LED_BLINK ++ .led_mode = IWL_LED_BLINK, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl5300_agn_cfg = { + .name = "Intel(R) Ultimate N WiFi Link 5300 AGN", +@@ -158,7 +159,8 @@ const struct iwl_cfg iwl5350_agn_cfg = { + .base_params = &iwl5000_base_params, \ + .eeprom_params = &iwl5000_eeprom_params, \ + .led_mode = IWL_LED_BLINK, \ +- .internal_wimax_coex = true ++ .internal_wimax_coex = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl5150_agn_cfg = { + .name = "Intel(R) WiMAX/WiFi Link 5150 AGN", +--- a/drivers/net/wireless/iwlwifi/iwl-6000.c ++++ b/drivers/net/wireless/iwlwifi/iwl-6000.c +@@ -145,7 +145,8 @@ static const struct iwl_eeprom_params iw + .nvm_calib_ver = EEPROM_6005_TX_POWER_VERSION, \ + .base_params = &iwl6000_g2_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ +- .led_mode = IWL_LED_RF_STATE ++ .led_mode = IWL_LED_RF_STATE, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6005_2agn_cfg = { + .name = "Intel(R) Centrino(R) Advanced-N 6205 AGN", +@@ -199,7 +200,8 @@ const struct iwl_cfg iwl6005_2agn_mow2_c + .nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ + .base_params = &iwl6000_g2_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ +- .led_mode = IWL_LED_RF_STATE ++ .led_mode = IWL_LED_RF_STATE, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6030_2agn_cfg = { + .name = "Intel(R) Centrino(R) Advanced-N 6230 AGN", +@@ -235,7 +237,8 @@ const struct iwl_cfg iwl6030_2bg_cfg = { + .nvm_calib_ver = EEPROM_6030_TX_POWER_VERSION, \ + .base_params = &iwl6000_g2_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ +- .led_mode = IWL_LED_RF_STATE ++ .led_mode = IWL_LED_RF_STATE, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6035_2agn_cfg = { + .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", +@@ -290,7 +293,8 @@ const struct iwl_cfg iwl130_bg_cfg = { + .nvm_calib_ver = EEPROM_6000_TX_POWER_VERSION, \ + .base_params = &iwl6000_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ +- .led_mode = IWL_LED_BLINK ++ .led_mode = IWL_LED_BLINK, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6000i_2agn_cfg = { + .name = "Intel(R) Centrino(R) Advanced-N 6200 AGN", +@@ -322,7 +326,8 @@ const struct iwl_cfg iwl6000i_2bg_cfg = + .base_params = &iwl6050_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ + .led_mode = IWL_LED_BLINK, \ +- .internal_wimax_coex = true ++ .internal_wimax_coex = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6050_2agn_cfg = { + .name = "Intel(R) Centrino(R) Advanced-N + WiMAX 6250 AGN", +@@ -347,7 +352,8 @@ const struct iwl_cfg iwl6050_2abg_cfg = + .base_params = &iwl6050_base_params, \ + .eeprom_params = &iwl6000_eeprom_params, \ + .led_mode = IWL_LED_BLINK, \ +- .internal_wimax_coex = true ++ .internal_wimax_coex = true, \ ++ .max_ht_ampdu_exponent = IEEE80211_HT_MAX_AMPDU_64K + + const struct iwl_cfg iwl6150_bgn_cfg = { + .name = "Intel(R) Centrino(R) Wireless-N + WiMAX 6150 BGN", diff --git a/queue-3.19/iwlwifi-mvm-bt-coex-fix-a-null-pointer-exception.patch b/queue-3.19/iwlwifi-mvm-bt-coex-fix-a-null-pointer-exception.patch new file mode 100644 index 00000000000..8bc097a381a --- /dev/null +++ b/queue-3.19/iwlwifi-mvm-bt-coex-fix-a-null-pointer-exception.patch @@ -0,0 +1,80 @@ +From 4cd4b50cc2429294c23a1998c33fdfd804db0f37 Mon Sep 17 00:00:00 2001 +From: Emmanuel Grumbach +Date: Thu, 5 Mar 2015 13:43:15 +0200 +Subject: iwlwifi: mvm: BT Coex - fix a NULL pointer exception + +From: Emmanuel Grumbach + +commit 4cd4b50cc2429294c23a1998c33fdfd804db0f37 upstream. + +The commit below introduced an unsafe dereference of +mvmvif->phy_ctxt. It can be NULL even if we hold the mutex. +We can be handling a BT Coex notification while the vif has +already been unassigned. This can happen since the BT Coex +notification is hanled asynchronuously: we can have started +to handle the BT Coex notification trying to acquire the +mutex while the unassign flow already got it. The BT Coex +notification handling will wait for the mutext. I'll get it +later, but then mvmvif->phy_ctxt will be NULL. + +Panic log: + +BUG: unable to handle kernel NULL pointer dereference at (null) +IP: [] iwl_mvm_bt_notif_iterator+0x9d/0x340 [iwlmvm] +*pdpt = 0000000000000000 *pde = f000eef300000007 +Oops: 0000 [#1] SMP +Workqueue: events iwl_mvm_async_handlers_wk [iwlmvm] +task: ed719b20 ti: ec03e000 task.ti: ec03e000 +EIP: 0060:[] EFLAGS: 00010202 CPU: 2 +EIP is at iwl_mvm_bt_notif_iterator+0x9d/0x340 [iwlmvm] +EAX: 00000000 EBX: f6d3cb70 ECX: f6d3cb70 EDX: 00000000 +ESI: ec03fe40 EDI: efeb8810 EBP: ec03fdf0 ESP: ec03fdac + DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068 +CR0: 80050033 CR2: 00000000 CR3: 01a1a000 CR4: 001407f0 +Stack: + f743ca80 f744a404 ec03fdcc c10e3952 00003aba f743ca80 00000246 f743ca80 + 00000246 00000000 00000001 00000000 ebd45ff6 ebd458a4 f6d3c500 ebd45578 + ebd44b01 ec03fe18 f99e1bc2 00000002 ebd44bc0 f9851770 00000000 f6d3c500 +Call Trace: + [] ? ring_buffer_unlock_commit+0xa2/0xd0 + [] __iterate_interfaces+0x82/0x110 [mac80211] + [] ? iwl_mvm_bt_coex_reduced_txp+0x140/0x140 [iwlmvm] + [] ieee80211_iterate_active_interfaces_atomic+0x1a/0x20 [mac80211] + [] iwl_mvm_bt_coex_notif_handle+0x77/0x280 [iwlmvm] + [] iwl_mvm_rx_bt_coex_notif_old+0x211/0x220 [iwlmvm] + [] iwl_mvm_rx_bt_coex_notif+0x19b/0x1b0 [iwlmvm] + [] iwl_mvm_async_handlers_wk+0x7f/0xe0 [iwlmvm] + +Fixes: 123f515635b1 ("iwlwifi: mvm: BT Coex - add support for TTC / RRC") +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/mvm/coex.c | 3 ++- + drivers/net/wireless/iwlwifi/mvm/coex_legacy.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/mvm/coex.c ++++ b/drivers/net/wireless/iwlwifi/mvm/coex.c +@@ -793,7 +793,8 @@ static void iwl_mvm_bt_notif_iterator(vo + if (!vif->bss_conf.assoc) + smps_mode = IEEE80211_SMPS_AUTOMATIC; + +- if (IWL_COEX_IS_RRC_ON(mvm->last_bt_notif.ttc_rrc_status, ++ if (mvmvif->phy_ctxt && ++ IWL_COEX_IS_RRC_ON(mvm->last_bt_notif.ttc_rrc_status, + mvmvif->phy_ctxt->id)) + smps_mode = IEEE80211_SMPS_AUTOMATIC; + +--- a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c ++++ b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c +@@ -832,7 +832,8 @@ static void iwl_mvm_bt_notif_iterator(vo + if (!vif->bss_conf.assoc) + smps_mode = IEEE80211_SMPS_AUTOMATIC; + +- if (data->notif->rrc_enabled & BIT(mvmvif->phy_ctxt->id)) ++ if (mvmvif->phy_ctxt && ++ data->notif->rrc_enabled & BIT(mvmvif->phy_ctxt->id)) + smps_mode = IEEE80211_SMPS_AUTOMATIC; + + IWL_DEBUG_COEX(data->mvm, diff --git a/queue-3.19/iwlwifi-mvm-fix-roc-removal.patch b/queue-3.19/iwlwifi-mvm-fix-roc-removal.patch new file mode 100644 index 00000000000..1ccdbca6880 --- /dev/null +++ b/queue-3.19/iwlwifi-mvm-fix-roc-removal.patch @@ -0,0 +1,49 @@ +From 833d9b9785b3eedfaf2c869a6a63deba88058599 Mon Sep 17 00:00:00 2001 +From: Andrei Otcheretianski +Date: Sun, 15 Feb 2015 18:33:23 +0200 +Subject: iwlwifi: mvm: Fix ROC removal + +From: Andrei Otcheretianski + +commit 833d9b9785b3eedfaf2c869a6a63deba88058599 upstream. + +iwl_mvm_stop_roc removes TE only if running flag is set. This is not correct +since this flag is only set when the TE is started. +This resulted in a TE not being removed, when mac80211 believes that there are +no active ROCs. + +Fixes: bf5da87f60a9 ("iwlwifi: mvm: add remove flow for AUX ROC time events") +Signed-off-by: Andrei Otcheretianski +Reviewed-by: Matti Gottlieb +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/mvm/time-event.c | 9 +++------ + 1 file changed, 3 insertions(+), 6 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c ++++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c +@@ -750,8 +750,7 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mv + * request + */ + list_for_each_entry(te_data, &mvm->time_event_list, list) { +- if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE && +- te_data->running) { ++ if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) { + mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif); + is_p2p = true; + goto remove_te; +@@ -766,10 +765,8 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mv + * request + */ + list_for_each_entry(te_data, &mvm->aux_roc_te_list, list) { +- if (te_data->running) { +- mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif); +- goto remove_te; +- } ++ mvmvif = iwl_mvm_vif_from_mac80211(te_data->vif); ++ goto remove_te; + } + + remove_te: diff --git a/queue-3.19/iwlwifi-mvm-rs-fix-bt-coex-check-to-look-at-the-correct-ant.patch b/queue-3.19/iwlwifi-mvm-rs-fix-bt-coex-check-to-look-at-the-correct-ant.patch new file mode 100644 index 00000000000..a52e589c0b1 --- /dev/null +++ b/queue-3.19/iwlwifi-mvm-rs-fix-bt-coex-check-to-look-at-the-correct-ant.patch @@ -0,0 +1,90 @@ +From 57bff1485096c53f943e26b1c5847f2a9dfe84db Mon Sep 17 00:00:00 2001 +From: Eyal Shapira +Date: Mon, 2 Feb 2015 15:21:27 +0200 +Subject: iwlwifi: mvm: rs: fix BT Coex check to look at the correct ant + +From: Eyal Shapira + +commit 57bff1485096c53f943e26b1c5847f2a9dfe84db upstream. + +The check to avoid the shared antenna was passed the wrong +antenna parameter. It should have checked whether the antenna of +the next column we're considering is allowed and instead it was +passed the current antenna. +This could lead to a wrong choice of the next column in the rs +algorithm and non optimal performance. + +Fixes: commit 219fb66b49fac64bb ("iwlwifi: mvm: rs - don't use the shared antenna when BT load is high") +Signed-off-by: Eyal Shapira +Reviewed-by: Johannes Berg +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/wireless/iwlwifi/mvm/rs.c | 21 ++++++++++++++------- + 1 file changed, 14 insertions(+), 7 deletions(-) + +--- a/drivers/net/wireless/iwlwifi/mvm/rs.c ++++ b/drivers/net/wireless/iwlwifi/mvm/rs.c +@@ -146,9 +146,12 @@ enum rs_column_mode { + #define MAX_NEXT_COLUMNS 7 + #define MAX_COLUMN_CHECKS 3 + ++struct rs_tx_column; ++ + typedef bool (*allow_column_func_t) (struct iwl_mvm *mvm, + struct ieee80211_sta *sta, +- struct iwl_scale_tbl_info *tbl); ++ struct iwl_scale_tbl_info *tbl, ++ const struct rs_tx_column *next_col); + + struct rs_tx_column { + enum rs_column_mode mode; +@@ -159,13 +162,15 @@ struct rs_tx_column { + }; + + static bool rs_ant_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- struct iwl_scale_tbl_info *tbl) ++ struct iwl_scale_tbl_info *tbl, ++ const struct rs_tx_column *next_col) + { +- return iwl_mvm_bt_coex_is_ant_avail(mvm, tbl->rate.ant); ++ return iwl_mvm_bt_coex_is_ant_avail(mvm, next_col->ant); + } + + static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- struct iwl_scale_tbl_info *tbl) ++ struct iwl_scale_tbl_info *tbl, ++ const struct rs_tx_column *next_col) + { + if (!sta->ht_cap.ht_supported) + return false; +@@ -183,7 +188,8 @@ static bool rs_mimo_allow(struct iwl_mvm + } + + static bool rs_siso_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- struct iwl_scale_tbl_info *tbl) ++ struct iwl_scale_tbl_info *tbl, ++ const struct rs_tx_column *next_col) + { + if (!sta->ht_cap.ht_supported) + return false; +@@ -192,7 +198,8 @@ static bool rs_siso_allow(struct iwl_mvm + } + + static bool rs_sgi_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta, +- struct iwl_scale_tbl_info *tbl) ++ struct iwl_scale_tbl_info *tbl, ++ const struct rs_tx_column *next_col) + { + struct rs_rate *rate = &tbl->rate; + struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; +@@ -1594,7 +1601,7 @@ static enum rs_column rs_get_next_column + + for (j = 0; j < MAX_COLUMN_CHECKS; j++) { + allow_func = next_col->checks[j]; +- if (allow_func && !allow_func(mvm, sta, tbl)) ++ if (allow_func && !allow_func(mvm, sta, tbl, next_col)) + break; + } + diff --git a/queue-3.19/mac80211-count-interfaces-correctly-for-combination-checks.patch b/queue-3.19/mac80211-count-interfaces-correctly-for-combination-checks.patch new file mode 100644 index 00000000000..2b4b579714a --- /dev/null +++ b/queue-3.19/mac80211-count-interfaces-correctly-for-combination-checks.patch @@ -0,0 +1,40 @@ +From 0f611d28fc2e13cfec64e1c544c16a086886805a Mon Sep 17 00:00:00 2001 +From: Andrei Otcheretianski +Date: Thu, 12 Mar 2015 08:53:30 +0200 +Subject: mac80211: count interfaces correctly for combination checks + +From: Andrei Otcheretianski + +commit 0f611d28fc2e13cfec64e1c544c16a086886805a upstream. + +Since moving the interface combination checks to mac80211, it's +broken because it now only considers interfaces with an assigned +channel context, so for example any interface that isn't active +can still be up, which is clearly an issue; also, in particular +P2P-Device wdevs are an issue since they never have a chanctx. + +Fix this by counting running interfaces instead the ones with a +channel context assigned. + +Fixes: 73de86a38962b ("cfg80211/mac80211: move interface counting for combination check to mac80211") +Signed-off-by: Andrei Otcheretianski +Signed-off-by: Emmanuel Grumbach +[rewrite commit message, dig out the commit it fixes] +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman + +--- + net/mac80211/util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/net/mac80211/util.c ++++ b/net/mac80211/util.c +@@ -3153,7 +3153,7 @@ int ieee80211_check_combinations(struct + wdev_iter = &sdata_iter->wdev; + + if (sdata_iter == sdata || +- rcu_access_pointer(sdata_iter->vif.chanctx_conf) == NULL || ++ !ieee80211_sdata_running(sdata_iter) || + local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype)) + continue; + diff --git a/queue-3.19/mac80211-disable-u-apsd-queues-by-default.patch b/queue-3.19/mac80211-disable-u-apsd-queues-by-default.patch new file mode 100644 index 00000000000..c8d14a93622 --- /dev/null +++ b/queue-3.19/mac80211-disable-u-apsd-queues-by-default.patch @@ -0,0 +1,73 @@ +From aa75ebc275b2a91b193654a177daf900ad6703f0 Mon Sep 17 00:00:00 2001 +From: Michal Kazior +Date: Tue, 10 Feb 2015 12:48:44 +0100 +Subject: mac80211: disable u-APSD queues by default + +From: Michal Kazior + +commit aa75ebc275b2a91b193654a177daf900ad6703f0 upstream. + +Some APs experience problems when working with +U-APSD. Decreasing the probability of that +happening by using legacy mode for all ACs but VO +isn't enough. + +Cisco 4410N originally forced us to enable VO by +default only because it treated non-VO ACs as +legacy. + +However some APs (notably Netgear R7000) silently +reclassify packets to different ACs. Since u-APSD +ACs require trigger frames for frame retrieval +clients would never see some frames (e.g. ARP +responses) or would fetch them accidentally after +a long time. + +It makes little sense to enable u-APSD queues by +default because it needs userspace applications to +be aware of it to actually take advantage of the +possible additional powersavings. Implicitly +depending on driver autotrigger frame support +doesn't make much sense. + +Signed-off-by: Michal Kazior +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman + +--- + net/mac80211/ieee80211_i.h | 23 +++++++++++++++++------ + 1 file changed, 17 insertions(+), 6 deletions(-) + +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -58,13 +58,24 @@ struct ieee80211_local; + #define IEEE80211_UNSET_POWER_LEVEL INT_MIN + + /* +- * Some APs experience problems when working with U-APSD. Decrease the +- * probability of that happening by using legacy mode for all ACs but VO. +- * The AP that caused us trouble was a Cisco 4410N. It ignores our +- * setting, and always treats non-VO ACs as legacy. ++ * Some APs experience problems when working with U-APSD. Decreasing the ++ * probability of that happening by using legacy mode for all ACs but VO isn't ++ * enough. ++ * ++ * Cisco 4410N originally forced us to enable VO by default only because it ++ * treated non-VO ACs as legacy. ++ * ++ * However some APs (notably Netgear R7000) silently reclassify packets to ++ * different ACs. Since u-APSD ACs require trigger frames for frame retrieval ++ * clients would never see some frames (e.g. ARP responses) or would fetch them ++ * accidentally after a long time. ++ * ++ * It makes little sense to enable u-APSD queues by default because it needs ++ * userspace applications to be aware of it to actually take advantage of the ++ * possible additional powersavings. Implicitly depending on driver autotrigger ++ * frame support doesn't make much sense. + */ +-#define IEEE80211_DEFAULT_UAPSD_QUEUES \ +- IEEE80211_WMM_IE_STA_QOSINFO_AC_VO ++#define IEEE80211_DEFAULT_UAPSD_QUEUES 0 + + #define IEEE80211_DEFAULT_MAX_SP_LEN \ + IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL diff --git a/queue-3.19/mac80211-drop-unencrypted-frames-in-mesh-fwding.patch b/queue-3.19/mac80211-drop-unencrypted-frames-in-mesh-fwding.patch new file mode 100644 index 00000000000..d89bf36bc80 --- /dev/null +++ b/queue-3.19/mac80211-drop-unencrypted-frames-in-mesh-fwding.patch @@ -0,0 +1,34 @@ +From d0c22119f574b851e63360c6b8660fe9593bbc3c Mon Sep 17 00:00:00 2001 +From: Bob Copeland +Date: Mon, 2 Mar 2015 14:28:52 -0500 +Subject: mac80211: drop unencrypted frames in mesh fwding + +From: Bob Copeland + +commit d0c22119f574b851e63360c6b8660fe9593bbc3c upstream. + +The mesh forwarding path was not checking that data +frames were protected when running an encrypted network; +add the necessary check. + +Reported-by: Johannes Berg +Signed-off-by: Bob Copeland +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman + +--- + net/mac80211/rx.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/net/mac80211/rx.c ++++ b/net/mac80211/rx.c +@@ -2191,6 +2191,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80 + hdr = (struct ieee80211_hdr *) skb->data; + mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); + ++ if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) ++ return RX_DROP_MONITOR; ++ + /* frame is in RMC, don't forward */ + if (ieee80211_is_data(hdr->frame_control) && + is_multicast_ether_addr(hdr->addr1) && diff --git a/queue-3.19/nl80211-ignore-ht-vht-capabilities-without-qos-wmm.patch b/queue-3.19/nl80211-ignore-ht-vht-capabilities-without-qos-wmm.patch new file mode 100644 index 00000000000..0fc5388584c --- /dev/null +++ b/queue-3.19/nl80211-ignore-ht-vht-capabilities-without-qos-wmm.patch @@ -0,0 +1,42 @@ +From 496fcc294daab18799e190c0264863d653588d1f Mon Sep 17 00:00:00 2001 +From: Johannes Berg +Date: Thu, 12 Mar 2015 08:53:27 +0200 +Subject: nl80211: ignore HT/VHT capabilities without QoS/WMM + +From: Johannes Berg + +commit 496fcc294daab18799e190c0264863d653588d1f upstream. + +As HT/VHT depend heavily on QoS/WMM, it's not a good idea to +let userspace add clients that have HT/VHT but not QoS/WMM. +Since it does so in certain cases we've observed (client is +using HT IEs but not QoS/WMM) just ignore the HT/VHT info at +this point and don't pass it down to the drivers which might +unconditionally use it. + +Signed-off-by: Johannes Berg +Signed-off-by: Greg Kroah-Hartman + +--- + net/wireless/nl80211.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -4360,6 +4360,16 @@ static int nl80211_new_station(struct sk + if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) + return -EINVAL; + ++ /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT ++ * as userspace might just pass through the capabilities from the IEs ++ * directly, rather than enforcing this restriction and returning an ++ * error in this case. ++ */ ++ if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { ++ params.ht_capa = NULL; ++ params.vht_capa = NULL; ++ } ++ + /* When you run into this, adjust the code below for the new flag */ + BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); + diff --git a/queue-3.19/powercap-rapl-handle-domains-with-different-energy-units.patch b/queue-3.19/powercap-rapl-handle-domains-with-different-energy-units.patch new file mode 100644 index 00000000000..19397a5c10f --- /dev/null +++ b/queue-3.19/powercap-rapl-handle-domains-with-different-energy-units.patch @@ -0,0 +1,222 @@ +From d474a4d365aaa5c7aabcf11a74ea43aa23f6f2e9 Mon Sep 17 00:00:00 2001 +From: Jacob Pan +Date: Fri, 13 Mar 2015 03:48:56 -0700 +Subject: powercap / RAPL: handle domains with different energy units + +From: Jacob Pan + +commit d474a4d365aaa5c7aabcf11a74ea43aa23f6f2e9 upstream. + +The current driver assumes all RAPL domains within a CPU package +have the same energy unit. This is no longer true for HSW server +CPUs since DRAM domain has is own fixed energy unit which can be +different than the package energy unit enumerated by package +power MSR. In fact, the default HSW EP package power unit is 61uJ +whereas DRAM domain unit is 15.3uJ. The result is that DRAM power +consumption is counted 4x more than real power reported by energy +counters, similarly for max_energy_range_uj of DRAM domain. + +This patch adds domain specific energy unit per cpu type, it allows +domain energy unit to override package energy unit if non zero. + +Please see this document for details. +"Intel Xeon Processor E5-1600 and E5-2600 v3 Product Families, Volume 2 of 2. + Datasheet, September 2014, Reference Number: 330784-001 " + +Signed-off-by: Jacob Pan +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/powercap/intel_rapl.c | 54 ++++++++++++++++++++++++++++++------------ + 1 file changed, 39 insertions(+), 15 deletions(-) + +--- a/drivers/powercap/intel_rapl.c ++++ b/drivers/powercap/intel_rapl.c +@@ -73,7 +73,7 @@ + + #define TIME_WINDOW_MAX_MSEC 40000 + #define TIME_WINDOW_MIN_MSEC 250 +- ++#define ENERGY_UNIT_SCALE 1000 /* scale from driver unit to powercap unit */ + enum unit_type { + ARBITRARY_UNIT, /* no translation */ + POWER_UNIT, +@@ -158,6 +158,7 @@ struct rapl_domain { + struct rapl_power_limit rpl[NR_POWER_LIMITS]; + u64 attr_map; /* track capabilities */ + unsigned int state; ++ unsigned int domain_energy_unit; + int package_id; + }; + #define power_zone_to_rapl_domain(_zone) \ +@@ -190,6 +191,7 @@ struct rapl_defaults { + void (*set_floor_freq)(struct rapl_domain *rd, bool mode); + u64 (*compute_time_window)(struct rapl_package *rp, u64 val, + bool to_raw); ++ unsigned int dram_domain_energy_unit; + }; + static struct rapl_defaults *rapl_defaults; + +@@ -227,7 +229,8 @@ static int rapl_read_data_raw(struct rap + static int rapl_write_data_raw(struct rapl_domain *rd, + enum rapl_primitives prim, + unsigned long long value); +-static u64 rapl_unit_xlate(int package, enum unit_type type, u64 value, ++static u64 rapl_unit_xlate(struct rapl_domain *rd, int package, ++ enum unit_type type, u64 value, + int to_raw); + static void package_power_limit_irq_save(int package_id); + +@@ -305,7 +308,9 @@ static int get_energy_counter(struct pow + + static int get_max_energy_counter(struct powercap_zone *pcd_dev, u64 *energy) + { +- *energy = rapl_unit_xlate(0, ENERGY_UNIT, ENERGY_STATUS_MASK, 0); ++ struct rapl_domain *rd = power_zone_to_rapl_domain(pcd_dev); ++ ++ *energy = rapl_unit_xlate(rd, 0, ENERGY_UNIT, ENERGY_STATUS_MASK, 0); + return 0; + } + +@@ -639,6 +644,11 @@ static void rapl_init_domains(struct rap + rd->msrs[4] = MSR_DRAM_POWER_INFO; + rd->rpl[0].prim_id = PL1_ENABLE; + rd->rpl[0].name = pl1_name; ++ rd->domain_energy_unit = ++ rapl_defaults->dram_domain_energy_unit; ++ if (rd->domain_energy_unit) ++ pr_info("DRAM domain energy unit %dpj\n", ++ rd->domain_energy_unit); + break; + } + if (mask) { +@@ -648,11 +658,13 @@ static void rapl_init_domains(struct rap + } + } + +-static u64 rapl_unit_xlate(int package, enum unit_type type, u64 value, ++static u64 rapl_unit_xlate(struct rapl_domain *rd, int package, ++ enum unit_type type, u64 value, + int to_raw) + { + u64 units = 1; + struct rapl_package *rp; ++ u64 scale = 1; + + rp = find_package_by_id(package); + if (!rp) +@@ -663,7 +675,12 @@ static u64 rapl_unit_xlate(int package, + units = rp->power_unit; + break; + case ENERGY_UNIT: +- units = rp->energy_unit; ++ scale = ENERGY_UNIT_SCALE; ++ /* per domain unit takes precedence */ ++ if (rd && rd->domain_energy_unit) ++ units = rd->domain_energy_unit; ++ else ++ units = rp->energy_unit; + break; + case TIME_UNIT: + return rapl_defaults->compute_time_window(rp, value, to_raw); +@@ -673,11 +690,11 @@ static u64 rapl_unit_xlate(int package, + }; + + if (to_raw) +- return div64_u64(value, units); ++ return div64_u64(value, units) * scale; + + value *= units; + +- return value; ++ return div64_u64(value, scale); + } + + /* in the order of enum rapl_primitives */ +@@ -773,7 +790,7 @@ static int rapl_read_data_raw(struct rap + final = value & rp->mask; + final = final >> rp->shift; + if (xlate) +- *data = rapl_unit_xlate(rd->package_id, rp->unit, final, 0); ++ *data = rapl_unit_xlate(rd, rd->package_id, rp->unit, final, 0); + else + *data = final; + +@@ -799,7 +816,7 @@ static int rapl_write_data_raw(struct ra + "failed to read msr 0x%x on cpu %d\n", msr, cpu); + return -EIO; + } +- value = rapl_unit_xlate(rd->package_id, rp->unit, value, 1); ++ value = rapl_unit_xlate(rd, rd->package_id, rp->unit, value, 1); + msr_val &= ~rp->mask; + msr_val |= value << rp->shift; + if (wrmsrl_safe_on_cpu(cpu, msr, msr_val)) { +@@ -818,7 +835,7 @@ static int rapl_write_data_raw(struct ra + * calculate units differ on different CPUs. + * We convert the units to below format based on CPUs. + * i.e. +- * energy unit: microJoules : Represented in microJoules by default ++ * energy unit: picoJoules : Represented in picoJoules by default + * power unit : microWatts : Represented in milliWatts by default + * time unit : microseconds: Represented in seconds by default + */ +@@ -834,7 +851,7 @@ static int rapl_check_unit_core(struct r + } + + value = (msr_val & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; +- rp->energy_unit = 1000000 / (1 << value); ++ rp->energy_unit = ENERGY_UNIT_SCALE * 1000000 / (1 << value); + + value = (msr_val & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; + rp->power_unit = 1000000 / (1 << value); +@@ -842,7 +859,7 @@ static int rapl_check_unit_core(struct r + value = (msr_val & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; + rp->time_unit = 1000000 / (1 << value); + +- pr_debug("Core CPU package %d energy=%duJ, time=%dus, power=%duW\n", ++ pr_debug("Core CPU package %d energy=%dpJ, time=%dus, power=%duW\n", + rp->id, rp->energy_unit, rp->time_unit, rp->power_unit); + + return 0; +@@ -859,7 +876,7 @@ static int rapl_check_unit_atom(struct r + return -ENODEV; + } + value = (msr_val & ENERGY_UNIT_MASK) >> ENERGY_UNIT_OFFSET; +- rp->energy_unit = 1 << value; ++ rp->energy_unit = ENERGY_UNIT_SCALE * 1 << value; + + value = (msr_val & POWER_UNIT_MASK) >> POWER_UNIT_OFFSET; + rp->power_unit = (1 << value) * 1000; +@@ -867,7 +884,7 @@ static int rapl_check_unit_atom(struct r + value = (msr_val & TIME_UNIT_MASK) >> TIME_UNIT_OFFSET; + rp->time_unit = 1000000 / (1 << value); + +- pr_debug("Atom package %d energy=%duJ, time=%dus, power=%duW\n", ++ pr_debug("Atom package %d energy=%dpJ, time=%dus, power=%duW\n", + rp->id, rp->energy_unit, rp->time_unit, rp->power_unit); + + return 0; +@@ -1017,6 +1034,13 @@ static const struct rapl_defaults rapl_d + .compute_time_window = rapl_compute_time_window_core, + }; + ++static const struct rapl_defaults rapl_defaults_hsw_server = { ++ .check_unit = rapl_check_unit_core, ++ .set_floor_freq = set_floor_freq_default, ++ .compute_time_window = rapl_compute_time_window_core, ++ .dram_domain_energy_unit = 15300, ++}; ++ + static const struct rapl_defaults rapl_defaults_atom = { + .check_unit = rapl_check_unit_atom, + .set_floor_freq = set_floor_freq_atom, +@@ -1037,7 +1061,7 @@ static const struct x86_cpu_id rapl_ids[ + RAPL_CPU(0x3a, rapl_defaults_core),/* Ivy Bridge */ + RAPL_CPU(0x3c, rapl_defaults_core),/* Haswell */ + RAPL_CPU(0x3d, rapl_defaults_core),/* Broadwell */ +- RAPL_CPU(0x3f, rapl_defaults_core),/* Haswell */ ++ RAPL_CPU(0x3f, rapl_defaults_hsw_server),/* Haswell servers */ + RAPL_CPU(0x45, rapl_defaults_core),/* Haswell ULT */ + RAPL_CPU(0x4C, rapl_defaults_atom),/* Braswell */ + RAPL_CPU(0x4A, rapl_defaults_atom),/* Tangier */ diff --git a/queue-3.19/series b/queue-3.19/series index 3c69242a49c..185f28f6130 100644 --- a/queue-3.19/series +++ b/queue-3.19/series @@ -33,3 +33,12 @@ input-synaptics-skip-quirks-when-post-2013-dimensions.patch input-synaptics-fix-middle-button-on-lenovo-2015-products.patch input-synaptics-handle-spurious-release-of-trackstick-buttons.patch input-synaptics-do-not-retrieve-the-board-id-on-old-firmwares.patch +nl80211-ignore-ht-vht-capabilities-without-qos-wmm.patch +mac80211-disable-u-apsd-queues-by-default.patch +mac80211-drop-unencrypted-frames-in-mesh-fwding.patch +mac80211-count-interfaces-correctly-for-combination-checks.patch +powercap-rapl-handle-domains-with-different-energy-units.patch +iwlwifi-mvm-rs-fix-bt-coex-check-to-look-at-the-correct-ant.patch +iwlwifi-fix-max_ht_ampdu_exponent-for-older-devices.patch +iwlwifi-mvm-bt-coex-fix-a-null-pointer-exception.patch +iwlwifi-mvm-fix-roc-removal.patch