]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Nov 2014 17:42:11 +0000 (09:42 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Nov 2014 17:42:11 +0000 (09:42 -0800)
added patches:
iwlwifi-configure-the-ltr.patch
regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch

queue-3.14/iwlwifi-configure-the-ltr.patch [new file with mode: 0644]
queue-3.14/regmap-fix-kernel-hang-on-regmap_bulk_write-with-zero-val_count.patch [new file with mode: 0644]
queue-3.14/series

diff --git a/queue-3.14/iwlwifi-configure-the-ltr.patch b/queue-3.14/iwlwifi-configure-the-ltr.patch
new file mode 100644 (file)
index 0000000..4f5620e
--- /dev/null
@@ -0,0 +1,169 @@
+From 9180ac50716a097a407c6d7e7e4589754a922260 Mon Sep 17 00:00:00 2001
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Date: Tue, 23 Sep 2014 23:02:41 +0300
+Subject: iwlwifi: configure the LTR
+
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+
+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 <emmanuel.grumbach@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+
+---
+ 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 (file)
index 0000000..7970101
--- /dev/null
@@ -0,0 +1,42 @@
+From 48a47140d74e7116a14f5300ebcff220176f48ac Mon Sep 17 00:00:00 2001
+From: Quentin Casasnovas <quentin.casasnovas@oracle.com>
+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 <quentin.casasnovas@oracle.com>
+
+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 <quentin.casasnovas@oracle.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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) {
index 27258b07a58d927bb7b43e6eb905fd42d23cc418..e2966a66c5d981604baaa7ac4da63ac1247b19e0 100644 (file)
@@ -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