From: Greg Kroah-Hartman Date: Wed, 19 Nov 2014 17:42:11 +0000 (-0800) Subject: 3.14-stable patches X-Git-Tag: v3.10.61~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7476b744b525841a28b99efc4af3305872e97f2d;p=thirdparty%2Fkernel%2Fstable-queue.git 3.14-stable patches added patches: iwlwifi-configure-the-ltr.patch regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch --- diff --git a/queue-3.14/iwlwifi-configure-the-ltr.patch b/queue-3.14/iwlwifi-configure-the-ltr.patch new file mode 100644 index 00000000000..4f5620e5e86 --- /dev/null +++ b/queue-3.14/iwlwifi-configure-the-ltr.patch @@ -0,0 +1,169 @@ +From 9180ac50716a097a407c6d7e7e4589754a922260 Mon Sep 17 00:00:00 2001 +From: Emmanuel Grumbach +Date: Tue, 23 Sep 2014 23:02:41 +0300 +Subject: iwlwifi: configure the LTR + +From: Emmanuel Grumbach + +commit 9180ac50716a097a407c6d7e7e4589754a922260 upstream. + +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. + +Signed-off-by: Emmanuel Grumbach +Signed-off-by: Greg Kroah-Hartman + + +--- + 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(-) + +--- a/drivers/net/wireless/iwlwifi/iwl-trans.h ++++ b/drivers/net/wireless/iwlwifi/iwl-trans.h +@@ -514,6 +514,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 +@@ -539,6 +540,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; +--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h ++++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-power.h +@@ -66,13 +66,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, +--- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h ++++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h +@@ -142,6 +142,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, +--- a/drivers/net/wireless/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/iwlwifi/mvm/fw.c +@@ -439,6 +439,15 @@ int iwl_mvm_up(struct iwl_mvm *mvm) + goto error; + } + ++ 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_mode(mvm); + if (ret) + goto error; +--- a/drivers/net/wireless/iwlwifi/mvm/ops.c ++++ b/drivers/net/wireless/iwlwifi/mvm/ops.c +@@ -313,6 +313,7 @@ static const char *iwl_mvm_cmd_strings[R + CMD(REPLY_BEACON_FILTERING_CMD), + CMD(REPLY_THERMAL_MNG_BACKOFF), + CMD(MAC_PM_POWER_TABLE), ++ CMD(LTR_CONFIG), + CMD(BT_COEX_CI), + CMD(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION), + }; +--- a/drivers/net/wireless/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/iwlwifi/pcie/trans.c +@@ -94,6 +94,7 @@ static void iwl_pcie_apm_config(struct i + { + 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. +@@ -104,16 +105,17 @@ static void iwl_pcie_apm_config(struct i + * 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"); + } + + /* diff --git a/queue-3.14/regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch b/queue-3.14/regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch new file mode 100644 index 00000000000..79701018394 --- /dev/null +++ b/queue-3.14/regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch @@ -0,0 +1,42 @@ +From 48a47140d74e7116a14f5300ebcff220176f48ac Mon Sep 17 00:00:00 2001 +From: Quentin Casasnovas +Date: Wed, 12 Nov 2014 11:19:23 +0100 +Subject: regmap: fix kernel hang on regmap_bulk_write with zero val_count. + +From: Quentin Casasnovas + +Fixes commit 2f06fa04cf35da5c24481da3ac84a2900d0b99c3 which was an +incorrect backported version of commit +d6b41cb06044a7d895db82bdd54f6e4219970510 upstream. + +If val_count is zero we return -EINVAL with map->lock_arg locked, which +will deadlock the kernel next time we try to acquire this lock. + +This was introduced by f5942dd ("regmap: fix possible ZERO_SIZE_PTR pointer +dereferencing error.") which improperly back-ported d6b41cb0. + +This issue was found during review of Ubuntu Trusty 3.13.0-40.68 kernel to +prepare Ksplice rebootless updates. + +Fixes: f5942dd ("regmap: fix possible ZERO_SIZE_PTR pointer dereferencing error.") +Signed-off-by: Quentin Casasnovas +Signed-off-by: Greg Kroah-Hartman +--- + drivers/base/regmap/regmap.c | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -1557,8 +1557,10 @@ int regmap_bulk_write(struct regmap *map + } else { + void *wval; + +- if (!val_count) +- return -EINVAL; ++ if (!val_count) { ++ ret = -EINVAL; ++ goto out; ++ } + + wval = kmemdup(val, val_count * val_bytes, GFP_KERNEL); + if (!wval) { diff --git a/queue-3.14/series b/queue-3.14/series index 27258b07a58..e2966a66c5d 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -94,3 +94,5 @@ kvm-x86-don-t-report-guest-userspace-emulation-error-to-userspace.patch net-sctp-fix-remote-memory-pressure-from-excessive-queueing.patch net-sctp-fix-panic-on-duplicate-asconf-chunks.patch net-sctp-fix-skb_over_panic-when-receiving-malformed-asconf-chunks.patch +iwlwifi-configure-the-ltr.patch +regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch