]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
fixes for 4.14
authorSasha Levin <sashal@kernel.org>
Mon, 9 Mar 2020 14:51:44 +0000 (10:51 -0400)
committerSasha Levin <sashal@kernel.org>
Mon, 9 Mar 2020 14:51:44 +0000 (10:51 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
18 files changed:
queue-4.14/drm-msm-dsi-save-pll-state-before-dsi-host-is-powere.patch [new file with mode: 0644]
queue-4.14/drm-msm-fix-return-type-of-dsi_mgr_connector_mode_va.patch [new file with mode: 0644]
queue-4.14/drm-msm-mdp5-rate-limit-pp-done-timeout-warnings.patch [new file with mode: 0644]
queue-4.14/net-ks8851-ml-fix-16-bit-data-access.patch [new file with mode: 0644]
queue-4.14/net-ks8851-ml-fix-16-bit-io-operation.patch [new file with mode: 0644]
queue-4.14/net-ks8851-ml-remove-8-bit-bus-accessors.patch [new file with mode: 0644]
queue-4.14/net-thunderx-workaround-bgx-tx-underflow-issue.patch [new file with mode: 0644]
queue-4.14/nvme-fix-uninitialized-variable-warning.patch [new file with mode: 0644]
queue-4.14/s390-cio-cio_ignore_proc_seq_next-should-increase-po.patch [new file with mode: 0644]
queue-4.14/selftests-fix-too-long-argument.patch [new file with mode: 0644]
queue-4.14/serial-ar933x_uart-set-uart_cs_-rx-tx-_ready_oride.patch [new file with mode: 0644]
queue-4.14/series
queue-4.14/usb-gadget-composite-support-more-than-500ma-maxpowe.patch [new file with mode: 0644]
queue-4.14/usb-gadget-ffs-ffs_aio_cancel-save-restore-irq-flags.patch [new file with mode: 0644]
queue-4.14/usb-gadget-serial-fix-tx-stall-after-buffer-overflow.patch [new file with mode: 0644]
queue-4.14/watchdog-da9062-do-not-ping-the-hw-during-stop.patch [new file with mode: 0644]
queue-4.14/x86-boot-compressed-don-t-declare-__force_order-in-k.patch [new file with mode: 0644]
queue-4.14/x86-xen-distribute-switch-variables-for-initializati.patch [new file with mode: 0644]

diff --git a/queue-4.14/drm-msm-dsi-save-pll-state-before-dsi-host-is-powere.patch b/queue-4.14/drm-msm-dsi-save-pll-state-before-dsi-host-is-powere.patch
new file mode 100644 (file)
index 0000000..65001e8
--- /dev/null
@@ -0,0 +1,61 @@
+From a66be42c361c9cbbcac3d146be3ff2579c3e1f16 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Feb 2020 14:26:15 +0530
+Subject: drm/msm/dsi: save pll state before dsi host is powered off
+
+From: Harigovindan P <harigovi@codeaurora.org>
+
+[ Upstream commit a1028dcfd0dd97884072288d0c8ed7f30399b528 ]
+
+Save pll state before dsi host is powered off. Without this change
+some register values gets resetted.
+
+Signed-off-by: Harigovindan P <harigovi@codeaurora.org>
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/dsi/dsi_manager.c | 5 +++++
+ drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 ----
+ 2 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
+index 7d46399a39b4d..9fbfa9f94e6ce 100644
+--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
++++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
+@@ -543,6 +543,7 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
+       struct msm_dsi *msm_dsi1 = dsi_mgr_get_dsi(DSI_1);
+       struct mipi_dsi_host *host = msm_dsi->host;
+       struct drm_panel *panel = msm_dsi->panel;
++      struct msm_dsi_pll *src_pll;
+       bool is_dual_dsi = IS_DUAL_DSI();
+       int ret;
+@@ -583,6 +584,10 @@ static void dsi_mgr_bridge_post_disable(struct drm_bridge *bridge)
+                                                               id, ret);
+       }
++      /* Save PLL status if it is a clock source */
++      src_pll = msm_dsi_phy_get_pll(msm_dsi->phy);
++      msm_dsi_pll_save_state(src_pll);
++
+       ret = msm_dsi_host_power_off(host);
+       if (ret)
+               pr_err("%s: host %d power off failed,%d\n", __func__, id, ret);
+diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
+index 7c9bf91bc22b6..c0a7fa56d9a74 100644
+--- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
++++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c
+@@ -613,10 +613,6 @@ void msm_dsi_phy_disable(struct msm_dsi_phy *phy)
+       if (!phy || !phy->cfg->ops.disable)
+               return;
+-      /* Save PLL status if it is a clock source */
+-      if (phy->usecase != MSM_DSI_PHY_SLAVE)
+-              msm_dsi_pll_save_state(phy->pll);
+-
+       phy->cfg->ops.disable(phy);
+       dsi_phy_regulator_disable(phy);
+-- 
+2.20.1
+
diff --git a/queue-4.14/drm-msm-fix-return-type-of-dsi_mgr_connector_mode_va.patch b/queue-4.14/drm-msm-fix-return-type-of-dsi_mgr_connector_mode_va.patch
new file mode 100644 (file)
index 0000000..5da8ac1
--- /dev/null
@@ -0,0 +1,55 @@
+From aafed32a2727e0791515dea2a5d188ff0d22c42e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jan 2020 20:12:44 +0000
+Subject: drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI
+
+From: John Stultz <john.stultz@linaro.org>
+
+[ Upstream commit 7fd2dfc3694922eb7ace4801b7208cf9f62ebc7d ]
+
+I was hitting kCFI crashes when building with clang, and after
+some digging finally narrowed it down to the
+dsi_mgr_connector_mode_valid() function being implemented as
+returning an int, instead of an enum drm_mode_status.
+
+This patch fixes it, and appeases the opaque word of the kCFI
+gods (seriously, clang inlining everything makes the kCFI
+backtraces only really rough estimates of where things went
+wrong).
+
+Thanks as always to Sami for his help narrowing this down.
+
+Cc: Rob Clark <robdclark@gmail.com>
+Cc: Sean Paul <sean@poorly.run>
+Cc: Sami Tolvanen <samitolvanen@google.com>
+Cc: Todd Kjos <tkjos@google.com>
+Cc: Alistair Delva <adelva@google.com>
+Cc: Amit Pundir <amit.pundir@linaro.org>
+Cc: Sumit Semwal <sumit.semwal@linaro.org>
+Cc: freedreno@lists.freedesktop.org
+Cc: clang-built-linux@googlegroups.com
+Signed-off-by: John Stultz <john.stultz@linaro.org>
+Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
+Tested-by: Amit Pundir <amit.pundir@linaro.org>
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/dsi/dsi_manager.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
+index 855248132b2bd..7d46399a39b4d 100644
+--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
++++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
+@@ -400,7 +400,7 @@ static int dsi_mgr_connector_get_modes(struct drm_connector *connector)
+       return num;
+ }
+-static int dsi_mgr_connector_mode_valid(struct drm_connector *connector,
++static enum drm_mode_status dsi_mgr_connector_mode_valid(struct drm_connector *connector,
+                               struct drm_display_mode *mode)
+ {
+       int id = dsi_mgr_connector_get_id(connector);
+-- 
+2.20.1
+
diff --git a/queue-4.14/drm-msm-mdp5-rate-limit-pp-done-timeout-warnings.patch b/queue-4.14/drm-msm-mdp5-rate-limit-pp-done-timeout-warnings.patch
new file mode 100644 (file)
index 0000000..339b406
--- /dev/null
@@ -0,0 +1,37 @@
+From a763afa2f1387f1db9165d443296a15d1a24f0b4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 Jan 2020 15:41:20 -0500
+Subject: drm/msm/mdp5: rate limit pp done timeout warnings
+
+From: Brian Masney <masneyb@onstation.org>
+
+[ Upstream commit ef8c9809acb0805c991bba8bdd4749fc46d44a98 ]
+
+Add rate limiting of the 'pp done time out' warnings since these
+warnings can quickly fill the dmesg buffer.
+
+Signed-off-by: Brian Masney <masneyb@onstation.org>
+Signed-off-by: Rob Clark <robdclark@chromium.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+index 4409776770012..99d356b6e9151 100644
+--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
++++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+@@ -1004,8 +1004,8 @@ static void mdp5_crtc_wait_for_pp_done(struct drm_crtc *crtc)
+       ret = wait_for_completion_timeout(&mdp5_crtc->pp_completion,
+                                               msecs_to_jiffies(50));
+       if (ret == 0)
+-              dev_warn(dev->dev, "pp done time out, lm=%d\n",
+-                       mdp5_cstate->pipeline.mixer->lm);
++              dev_warn_ratelimited(dev->dev, "pp done time out, lm=%d\n",
++                                   mdp5_cstate->pipeline.mixer->lm);
+ }
+ static void mdp5_crtc_wait_for_flush_done(struct drm_crtc *crtc)
+-- 
+2.20.1
+
diff --git a/queue-4.14/net-ks8851-ml-fix-16-bit-data-access.patch b/queue-4.14/net-ks8851-ml-fix-16-bit-data-access.patch
new file mode 100644 (file)
index 0000000..12d5a3b
--- /dev/null
@@ -0,0 +1,48 @@
+From 87baf45b125bd5e97f16077dbfa161281aad81e7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 15 Feb 2020 17:54:18 +0100
+Subject: net: ks8851-ml: Fix 16-bit data access
+
+From: Marek Vasut <marex@denx.de>
+
+[ Upstream commit edacb098ea9c31589276152f09b4439052c0f2b1 ]
+
+The packet data written to and read from Micrel KSZ8851-16MLLI must be
+byte-swapped in 16-bit mode, add this byte-swapping.
+
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Lukas Wunner <lukas@wunner.de>
+Cc: Petr Stetiar <ynezz@true.cz>
+Cc: YueHaibing <yuehaibing@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/micrel/ks8851_mll.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
+index 77d059d7f8c55..fb5f4055e1592 100644
+--- a/drivers/net/ethernet/micrel/ks8851_mll.c
++++ b/drivers/net/ethernet/micrel/ks8851_mll.c
+@@ -515,7 +515,7 @@ static inline void ks_inblk(struct ks_net *ks, u16 *wptr, u32 len)
+ {
+       len >>= 1;
+       while (len--)
+-              *wptr++ = (u16)ioread16(ks->hw_addr);
++              *wptr++ = be16_to_cpu(ioread16(ks->hw_addr));
+ }
+ /**
+@@ -529,7 +529,7 @@ static inline void ks_outblk(struct ks_net *ks, u16 *wptr, u32 len)
+ {
+       len >>= 1;
+       while (len--)
+-              iowrite16(*wptr++, ks->hw_addr);
++              iowrite16(cpu_to_be16(*wptr++), ks->hw_addr);
+ }
+ static void ks_disable_int(struct ks_net *ks)
+-- 
+2.20.1
+
diff --git a/queue-4.14/net-ks8851-ml-fix-16-bit-io-operation.patch b/queue-4.14/net-ks8851-ml-fix-16-bit-io-operation.patch
new file mode 100644 (file)
index 0000000..530ba67
--- /dev/null
@@ -0,0 +1,51 @@
+From f35e8ff79ecd380434e474019a0230ba6ebbc877 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 15 Feb 2020 17:54:19 +0100
+Subject: net: ks8851-ml: Fix 16-bit IO operation
+
+From: Marek Vasut <marex@denx.de>
+
+[ Upstream commit 58292104832fef6cb4a89f736012c0e0724c3442 ]
+
+The Micrel KSZ8851-16MLLI datasheet DS00002357B page 12 states that
+BE[3:0] signals are active high. This contradicts the measurements
+of the behavior of the actual chip, where these signals behave as
+active low. For example, to read the CIDER register, the bus must
+expose 0xc0c0 during the address phase, which means BE[3:0]=4'b1100.
+
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Lukas Wunner <lukas@wunner.de>
+Cc: Petr Stetiar <ynezz@true.cz>
+Cc: YueHaibing <yuehaibing@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/micrel/ks8851_mll.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
+index fb5f4055e1592..799154d7c0470 100644
+--- a/drivers/net/ethernet/micrel/ks8851_mll.c
++++ b/drivers/net/ethernet/micrel/ks8851_mll.c
+@@ -484,7 +484,7 @@ static int msg_enable;
+ static u16 ks_rdreg16(struct ks_net *ks, int offset)
+ {
+-      ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02));
++      ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02));
+       iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
+       return ioread16(ks->hw_addr);
+ }
+@@ -499,7 +499,7 @@ static u16 ks_rdreg16(struct ks_net *ks, int offset)
+ static void ks_wrreg16(struct ks_net *ks, int offset, u16 value)
+ {
+-      ks->cmd_reg_cache = (u16)offset | ((BE1 | BE0) << (offset & 0x02));
++      ks->cmd_reg_cache = (u16)offset | ((BE3 | BE2) >> (offset & 0x02));
+       iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
+       iowrite16(value, ks->hw_addr);
+ }
+-- 
+2.20.1
+
diff --git a/queue-4.14/net-ks8851-ml-remove-8-bit-bus-accessors.patch b/queue-4.14/net-ks8851-ml-remove-8-bit-bus-accessors.patch
new file mode 100644 (file)
index 0000000..5cc7938
--- /dev/null
@@ -0,0 +1,138 @@
+From 2ff9bc12d0dfbea8d735acf49298dae3a6747052 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 15 Feb 2020 17:54:17 +0100
+Subject: net: ks8851-ml: Remove 8-bit bus accessors
+
+From: Marek Vasut <marex@denx.de>
+
+[ Upstream commit 69233bba6543a37755158ca3382765387b8078df ]
+
+This driver is mixing 8-bit and 16-bit bus accessors for reasons unknown,
+however the speculation is that this was some sort of attempt to support
+the 8-bit bus mode.
+
+As per the KS8851-16MLL documentation, all two registers accessed via the
+8-bit accessors are internally 16-bit registers, so reading them using
+16-bit accessors is fine. The KS_CCR read can be converted to 16-bit read
+outright, as it is already a concatenation of two 8-bit reads of that
+register. The KS_RXQCR accesses are 8-bit only, however writing the top
+8 bits of the register is OK as well, since the driver caches the entire
+16-bit register value anyway.
+
+Finally, the driver is not used by any hardware in the kernel right now.
+The only hardware available to me is one with 16-bit bus, so I have no
+way to test the 8-bit bus mode, however it is unlikely this ever really
+worked anyway. If the 8-bit bus mode is ever required, it can be easily
+added by adjusting the 16-bit accessors to do 2 consecutive accesses,
+which is how this should have been done from the beginning.
+
+Signed-off-by: Marek Vasut <marex@denx.de>
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Lukas Wunner <lukas@wunner.de>
+Cc: Petr Stetiar <ynezz@true.cz>
+Cc: YueHaibing <yuehaibing@huawei.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/micrel/ks8851_mll.c | 45 +++---------------------
+ 1 file changed, 5 insertions(+), 40 deletions(-)
+
+diff --git a/drivers/net/ethernet/micrel/ks8851_mll.c b/drivers/net/ethernet/micrel/ks8851_mll.c
+index adbe0a6fe0db9..77d059d7f8c55 100644
+--- a/drivers/net/ethernet/micrel/ks8851_mll.c
++++ b/drivers/net/ethernet/micrel/ks8851_mll.c
+@@ -474,24 +474,6 @@ static int msg_enable;
+  * chip is busy transferring packet data (RX/TX FIFO accesses).
+  */
+-/**
+- * ks_rdreg8 - read 8 bit register from device
+- * @ks          : The chip information
+- * @offset: The register address
+- *
+- * Read a 8bit register from the chip, returning the result
+- */
+-static u8 ks_rdreg8(struct ks_net *ks, int offset)
+-{
+-      u16 data;
+-      u8 shift_bit = offset & 0x03;
+-      u8 shift_data = (offset & 1) << 3;
+-      ks->cmd_reg_cache = (u16) offset | (u16)(BE0 << shift_bit);
+-      iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
+-      data  = ioread16(ks->hw_addr);
+-      return (u8)(data >> shift_data);
+-}
+-
+ /**
+  * ks_rdreg16 - read 16 bit register from device
+  * @ks          : The chip information
+@@ -507,22 +489,6 @@ static u16 ks_rdreg16(struct ks_net *ks, int offset)
+       return ioread16(ks->hw_addr);
+ }
+-/**
+- * ks_wrreg8 - write 8bit register value to chip
+- * @ks: The chip information
+- * @offset: The register address
+- * @value: The value to write
+- *
+- */
+-static void ks_wrreg8(struct ks_net *ks, int offset, u8 value)
+-{
+-      u8  shift_bit = (offset & 0x03);
+-      u16 value_write = (u16)(value << ((offset & 1) << 3));
+-      ks->cmd_reg_cache = (u16)offset | (BE0 << shift_bit);
+-      iowrite16(ks->cmd_reg_cache, ks->hw_addr_cmd);
+-      iowrite16(value_write, ks->hw_addr);
+-}
+-
+ /**
+  * ks_wrreg16 - write 16bit register value to chip
+  * @ks: The chip information
+@@ -642,8 +608,7 @@ static void ks_read_config(struct ks_net *ks)
+       u16 reg_data = 0;
+       /* Regardless of bus width, 8 bit read should always work.*/
+-      reg_data = ks_rdreg8(ks, KS_CCR) & 0x00FF;
+-      reg_data |= ks_rdreg8(ks, KS_CCR+1) << 8;
++      reg_data = ks_rdreg16(ks, KS_CCR);
+       /* addr/data bus are multiplexed */
+       ks->sharedbus = (reg_data & CCR_SHARED) == CCR_SHARED;
+@@ -747,7 +712,7 @@ static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len)
+       /* 1. set sudo DMA mode */
+       ks_wrreg16(ks, KS_RXFDPR, RXFDPR_RXFPAI);
+-      ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff);
++      ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA);
+       /* 2. read prepend data */
+       /**
+@@ -764,7 +729,7 @@ static inline void ks_read_qmu(struct ks_net *ks, u16 *buf, u32 len)
+       ks_inblk(ks, buf, ALIGN(len, 4));
+       /* 4. reset sudo DMA Mode */
+-      ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr);
++      ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr);
+ }
+ /**
+@@ -997,13 +962,13 @@ static void ks_write_qmu(struct ks_net *ks, u8 *pdata, u16 len)
+       ks->txh.txw[1] = cpu_to_le16(len);
+       /* 1. set sudo-DMA mode */
+-      ks_wrreg8(ks, KS_RXQCR, (ks->rc_rxqcr | RXQCR_SDA) & 0xff);
++      ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr | RXQCR_SDA);
+       /* 2. write status/lenth info */
+       ks_outblk(ks, ks->txh.txw, 4);
+       /* 3. write pkt data */
+       ks_outblk(ks, (u16 *)pdata, ALIGN(len, 4));
+       /* 4. reset sudo-DMA mode */
+-      ks_wrreg8(ks, KS_RXQCR, ks->rc_rxqcr);
++      ks_wrreg16(ks, KS_RXQCR, ks->rc_rxqcr);
+       /* 5. Enqueue Tx(move the pkt from TX buffer into TXQ) */
+       ks_wrreg16(ks, KS_TXQCR, TXQCR_METFE);
+       /* 6. wait until TXQCR_METFE is auto-cleared */
+-- 
+2.20.1
+
diff --git a/queue-4.14/net-thunderx-workaround-bgx-tx-underflow-issue.patch b/queue-4.14/net-thunderx-workaround-bgx-tx-underflow-issue.patch
new file mode 100644 (file)
index 0000000..40b8511
--- /dev/null
@@ -0,0 +1,155 @@
+From d281bf8c34cad0a2224e04f08bef76b2938b01cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Feb 2020 15:19:36 -0800
+Subject: net: thunderx: workaround BGX TX Underflow issue
+
+From: Tim Harvey <tharvey@gateworks.com>
+
+[ Upstream commit 971617c3b761c876d686a2188220a33898c90e99 ]
+
+While it is not yet understood why a TX underflow can easily occur
+for SGMII interfaces resulting in a TX wedge. It has been found that
+disabling/re-enabling the LMAC resolves the issue.
+
+Signed-off-by: Tim Harvey <tharvey@gateworks.com>
+Reviewed-by: Robert Jones <rjones@gateworks.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../net/ethernet/cavium/thunder/thunder_bgx.c | 62 ++++++++++++++++++-
+ .../net/ethernet/cavium/thunder/thunder_bgx.h |  9 +++
+ 2 files changed, 68 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+index 586e355933108..d678f088925c6 100644
+--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
++++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+@@ -234,10 +234,19 @@ void bgx_lmac_rx_tx_enable(int node, int bgx_idx, int lmacid, bool enable)
+       lmac = &bgx->lmac[lmacid];
+       cfg = bgx_reg_read(bgx, lmacid, BGX_CMRX_CFG);
+-      if (enable)
++      if (enable) {
+               cfg |= CMR_PKT_RX_EN | CMR_PKT_TX_EN;
+-      else
++
++              /* enable TX FIFO Underflow interrupt */
++              bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1S,
++                             GMI_TXX_INT_UNDFLW);
++      } else {
+               cfg &= ~(CMR_PKT_RX_EN | CMR_PKT_TX_EN);
++
++              /* Disable TX FIFO Underflow interrupt */
++              bgx_reg_modify(bgx, lmacid, BGX_GMP_GMI_TXX_INT_ENA_W1C,
++                             GMI_TXX_INT_UNDFLW);
++      }
+       bgx_reg_write(bgx, lmacid, BGX_CMRX_CFG, cfg);
+       if (bgx->is_rgx)
+@@ -1340,6 +1349,48 @@ static int bgx_init_phy(struct bgx *bgx)
+       return bgx_init_of_phy(bgx);
+ }
++static irqreturn_t bgx_intr_handler(int irq, void *data)
++{
++      struct bgx *bgx = (struct bgx *)data;
++      u64 status, val;
++      int lmac;
++
++      for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
++              status = bgx_reg_read(bgx, lmac, BGX_GMP_GMI_TXX_INT);
++              if (status & GMI_TXX_INT_UNDFLW) {
++                      pci_err(bgx->pdev, "BGX%d lmac%d UNDFLW\n",
++                              bgx->bgx_id, lmac);
++                      val = bgx_reg_read(bgx, lmac, BGX_CMRX_CFG);
++                      val &= ~CMR_EN;
++                      bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
++                      val |= CMR_EN;
++                      bgx_reg_write(bgx, lmac, BGX_CMRX_CFG, val);
++              }
++              /* clear interrupts */
++              bgx_reg_write(bgx, lmac, BGX_GMP_GMI_TXX_INT, status);
++      }
++
++      return IRQ_HANDLED;
++}
++
++static void bgx_register_intr(struct pci_dev *pdev)
++{
++      struct bgx *bgx = pci_get_drvdata(pdev);
++      int ret;
++
++      ret = pci_alloc_irq_vectors(pdev, BGX_LMAC_VEC_OFFSET,
++                                  BGX_LMAC_VEC_OFFSET, PCI_IRQ_ALL_TYPES);
++      if (ret < 0) {
++              pci_err(pdev, "Req for #%d msix vectors failed\n",
++                      BGX_LMAC_VEC_OFFSET);
++              return;
++      }
++      ret = pci_request_irq(pdev, GMPX_GMI_TX_INT, bgx_intr_handler, NULL,
++                            bgx, "BGX%d", bgx->bgx_id);
++      if (ret)
++              pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
++}
++
+ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ {
+       int err;
+@@ -1355,7 +1406,7 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+       pci_set_drvdata(pdev, bgx);
+-      err = pci_enable_device(pdev);
++      err = pcim_enable_device(pdev);
+       if (err) {
+               dev_err(dev, "Failed to enable PCI device\n");
+               pci_set_drvdata(pdev, NULL);
+@@ -1409,6 +1460,8 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+       bgx_init_hw(bgx);
++      bgx_register_intr(pdev);
++
+       /* Enable all LMACs */
+       for (lmac = 0; lmac < bgx->lmac_count; lmac++) {
+               err = bgx_lmac_enable(bgx, lmac);
+@@ -1425,6 +1478,7 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ err_enable:
+       bgx_vnic[bgx->bgx_id] = NULL;
++      pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
+ err_release_regions:
+       pci_release_regions(pdev);
+ err_disable_device:
+@@ -1442,6 +1496,8 @@ static void bgx_remove(struct pci_dev *pdev)
+       for (lmac = 0; lmac < bgx->lmac_count; lmac++)
+               bgx_lmac_disable(bgx, lmac);
++      pci_free_irq(pdev, GMPX_GMI_TX_INT, bgx);
++
+       bgx_vnic[bgx->bgx_id] = NULL;
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+index 23acdc5ab8963..adaa3bfa5f6cb 100644
+--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
++++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+@@ -179,6 +179,15 @@
+ #define BGX_GMP_GMI_TXX_BURST         0x38228
+ #define BGX_GMP_GMI_TXX_MIN_PKT               0x38240
+ #define BGX_GMP_GMI_TXX_SGMII_CTL     0x38300
++#define BGX_GMP_GMI_TXX_INT           0x38500
++#define BGX_GMP_GMI_TXX_INT_W1S               0x38508
++#define BGX_GMP_GMI_TXX_INT_ENA_W1C   0x38510
++#define BGX_GMP_GMI_TXX_INT_ENA_W1S   0x38518
++#define  GMI_TXX_INT_PTP_LOST                 BIT_ULL(4)
++#define  GMI_TXX_INT_LATE_COL                 BIT_ULL(3)
++#define  GMI_TXX_INT_XSDEF                    BIT_ULL(2)
++#define  GMI_TXX_INT_XSCOL                    BIT_ULL(1)
++#define  GMI_TXX_INT_UNDFLW                   BIT_ULL(0)
+ #define BGX_MSIX_VEC_0_29_ADDR                0x400000 /* +(0..29) << 4 */
+ #define BGX_MSIX_VEC_0_29_CTL         0x400008
+-- 
+2.20.1
+
diff --git a/queue-4.14/nvme-fix-uninitialized-variable-warning.patch b/queue-4.14/nvme-fix-uninitialized-variable-warning.patch
new file mode 100644 (file)
index 0000000..4189cc0
--- /dev/null
@@ -0,0 +1,38 @@
+From 19dacf7f126bdbba8da8cf10c55d061ccbe39ef0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Feb 2020 00:59:36 +0900
+Subject: nvme: Fix uninitialized-variable warning
+
+From: Keith Busch <kbusch@kernel.org>
+
+[ Upstream commit 15755854d53b4bbb0bb37a0fce66f0156cfc8a17 ]
+
+gcc may detect a false positive on nvme using an unintialized variable
+if setting features fails. Since this is not a fast path, explicitly
+initialize this variable to suppress the warning.
+
+Reported-by: Arnd Bergmann <arnd@arndb.de>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Keith Busch <kbusch@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/nvme/host/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
+index f543b9932c830..a760c449f4a90 100644
+--- a/drivers/nvme/host/core.c
++++ b/drivers/nvme/host/core.c
+@@ -889,8 +889,8 @@ static struct nvme_id_ns *nvme_identify_ns(struct nvme_ctrl *ctrl,
+ static int nvme_set_features(struct nvme_ctrl *dev, unsigned fid, unsigned dword11,
+                     void *buffer, size_t buflen, u32 *result)
+ {
++      union nvme_result res = { 0 };
+       struct nvme_command c;
+-      union nvme_result res;
+       int ret;
+       memset(&c, 0, sizeof(c));
+-- 
+2.20.1
+
diff --git a/queue-4.14/s390-cio-cio_ignore_proc_seq_next-should-increase-po.patch b/queue-4.14/s390-cio-cio_ignore_proc_seq_next-should-increase-po.patch
new file mode 100644 (file)
index 0000000..3cadff3
--- /dev/null
@@ -0,0 +1,50 @@
+From 366c517592045d91284f34456b398f8d76759709 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 24 Jan 2020 08:48:55 +0300
+Subject: s390/cio: cio_ignore_proc_seq_next should increase position index
+
+From: Vasily Averin <vvs@virtuozzo.com>
+
+[ Upstream commit 8b101a5e14f2161869636ff9cb4907b7749dc0c2 ]
+
+if seq_file .next fuction does not change position index,
+read after some lseek can generate unexpected output.
+
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=206283
+Link: https://lore.kernel.org/r/d44c53a7-9bc1-15c7-6d4a-0c10cb9dffce@virtuozzo.com
+Reviewed-by: Cornelia Huck <cohuck@redhat.com>
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Signed-off-by: Vasily Averin <vvs@virtuozzo.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/cio/blacklist.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c
+index 2a3f874a21d54..9cebff8e8d740 100644
+--- a/drivers/s390/cio/blacklist.c
++++ b/drivers/s390/cio/blacklist.c
+@@ -303,8 +303,10 @@ static void *
+ cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset)
+ {
+       struct ccwdev_iter *iter;
++      loff_t p = *offset;
+-      if (*offset >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1))
++      (*offset)++;
++      if (p >= (__MAX_SUBCHANNEL + 1) * (__MAX_SSID + 1))
+               return NULL;
+       iter = it;
+       if (iter->devno == __MAX_SUBCHANNEL) {
+@@ -314,7 +316,6 @@ cio_ignore_proc_seq_next(struct seq_file *s, void *it, loff_t *offset)
+                       return NULL;
+       } else
+               iter->devno++;
+-      (*offset)++;
+       return iter;
+ }
+-- 
+2.20.1
+
diff --git a/queue-4.14/selftests-fix-too-long-argument.patch b/queue-4.14/selftests-fix-too-long-argument.patch
new file mode 100644 (file)
index 0000000..8c05d7d
--- /dev/null
@@ -0,0 +1,75 @@
+From c73cdf89b8dc7b890a18f7ba2beb45330f3a28a9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Feb 2020 09:40:52 +0100
+Subject: selftests: fix too long argument
+
+From: Jiri Benc <jbenc@redhat.com>
+
+[ Upstream commit c363eb48ada5cf732b3f489fab799fc881097842 ]
+
+With some shells, the command construed for install of bpf selftests becomes
+too large due to long list of files:
+
+make[1]: execvp: /bin/sh: Argument list too long
+make[1]: *** [../lib.mk:73: install] Error 127
+
+Currently, each of the file lists is replicated three times in the command:
+in the shell 'if' condition, in the 'echo' and in the 'rsync'. Reduce that
+by one instance by using make conditionals and separate the echo and rsync
+into two shell commands. (One would be inclined to just remove the '@' at
+the beginning of the rsync command and let 'make' echo it by itself;
+unfortunately, it appears that the '@' in the front of mkdir silences output
+also for the following commands.)
+
+Also, separate handling of each of the lists to its own shell command.
+
+The semantics of the makefile is unchanged before and after the patch. The
+ability of individual test directories to override INSTALL_RULE is retained.
+
+Reported-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com>
+Tested-by: Yauheni Kaliuta <yauheni.kaliuta@redhat.com>
+Signed-off-by: Jiri Benc <jbenc@redhat.com>
+Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/lib.mk | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
+index 5bef05d6ba393..c9be64dc681d2 100644
+--- a/tools/testing/selftests/lib.mk
++++ b/tools/testing/selftests/lib.mk
+@@ -54,17 +54,20 @@ else
+       $(call RUN_TESTS, $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS))
+ endif
++define INSTALL_SINGLE_RULE
++      $(if $(INSTALL_LIST),@mkdir -p $(INSTALL_PATH))
++      $(if $(INSTALL_LIST),@echo rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
++      $(if $(INSTALL_LIST),@rsync -a $(INSTALL_LIST) $(INSTALL_PATH)/)
++endef
++
+ define INSTALL_RULE
+-      @if [ "X$(TEST_PROGS)$(TEST_PROGS_EXTENDED)$(TEST_FILES)" != "X" ]; then                                        \
+-              mkdir -p ${INSTALL_PATH};                                                                               \
+-              echo "rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/";    \
+-              rsync -a $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) $(INSTALL_PATH)/;           \
+-      fi
+-      @if [ "X$(TEST_GEN_PROGS)$(TEST_CUSTOM_PROGS)$(TEST_GEN_PROGS_EXTENDED)$(TEST_GEN_FILES)" != "X" ]; then                                        \
+-              mkdir -p ${INSTALL_PATH};                                                                               \
+-              echo "rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/";   \
+-              rsync -a $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_GEN_PROGS_EXTENDED) $(TEST_GEN_FILES) $(INSTALL_PATH)/;          \
+-      fi
++      $(eval INSTALL_LIST = $(TEST_PROGS)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_FILES)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_GEN_PROGS)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_CUSTOM_PROGS)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_GEN_PROGS_EXTENDED)) $(INSTALL_SINGLE_RULE)
++      $(eval INSTALL_LIST = $(TEST_GEN_FILES)) $(INSTALL_SINGLE_RULE)
+ endef
+ install: all
+-- 
+2.20.1
+
diff --git a/queue-4.14/serial-ar933x_uart-set-uart_cs_-rx-tx-_ready_oride.patch b/queue-4.14/serial-ar933x_uart-set-uart_cs_-rx-tx-_ready_oride.patch
new file mode 100644 (file)
index 0000000..1912691
--- /dev/null
@@ -0,0 +1,58 @@
+From 2cab89760b394df4e1fbbd9c2a836fc0c9f0aeb9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Feb 2020 11:53:35 +0200
+Subject: serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE
+
+From: Daniel Golle <daniel@makrotopia.org>
+
+[ Upstream commit 87c5cbf71ecbb9e289d60a2df22eb686c70bf196 ]
+
+On AR934x this UART is usually not initialized by the bootloader
+as it is only used as a secondary serial port while the primary
+UART is a newly introduced NS16550-compatible.
+In order to make use of the ar933x-uart on AR934x without RTS/CTS
+hardware flow control, one needs to set the
+UART_CS_{RX,TX}_READY_ORIDE bits as other than on AR933x where this
+UART is used as primary/console, the bootloader on AR934x typically
+doesn't set those bits.
+Setting them explicitely on AR933x should not do any harm, so just
+set them unconditionally.
+
+Tested-by: Chuanhong Guo <gch981213@gmail.com>
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+Link: https://lore.kernel.org/r/20200207095335.GA179836@makrotopia.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/ar933x_uart.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/tty/serial/ar933x_uart.c b/drivers/tty/serial/ar933x_uart.c
+index ed545a61413c0..ac56a5131a9cc 100644
+--- a/drivers/tty/serial/ar933x_uart.c
++++ b/drivers/tty/serial/ar933x_uart.c
+@@ -289,6 +289,10 @@ static void ar933x_uart_set_termios(struct uart_port *port,
+       ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
+                           AR933X_UART_CS_HOST_INT_EN);
++      /* enable RX and TX ready overide */
++      ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
++              AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
++
+       /* reenable the UART */
+       ar933x_uart_rmw(up, AR933X_UART_CS_REG,
+                       AR933X_UART_CS_IF_MODE_M << AR933X_UART_CS_IF_MODE_S,
+@@ -421,6 +425,10 @@ static int ar933x_uart_startup(struct uart_port *port)
+       ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
+                           AR933X_UART_CS_HOST_INT_EN);
++      /* enable RX and TX ready overide */
++      ar933x_uart_rmw_set(up, AR933X_UART_CS_REG,
++              AR933X_UART_CS_TX_READY_ORIDE | AR933X_UART_CS_RX_READY_ORIDE);
++
+       /* Enable RX interrupts */
+       up->ier = AR933X_UART_INT_RX_VALID;
+       ar933x_uart_write(up, AR933X_UART_INT_EN_REG, up->ier);
+-- 
+2.20.1
+
index b1d442e452ffb042ab2320d4672f6003e7b70647..9ac38df91dd7d3578fb8f2274b6714886a46500a 100644 (file)
@@ -71,3 +71,20 @@ net-dsa-bcm_sf2-forcibly-configure-imp-port-for-1gb-.patch
 rdma-core-fix-pkey-and-port-assignment-in-get_new_pp.patch
 rdma-core-fix-use-of-logical-or-in-get_new_pps.patch
 kprobes-fix-optimize_kprobe-unoptimize_kprobe-cancel.patch
+serial-ar933x_uart-set-uart_cs_-rx-tx-_ready_oride.patch
+selftests-fix-too-long-argument.patch
+usb-gadget-composite-support-more-than-500ma-maxpowe.patch
+usb-gadget-ffs-ffs_aio_cancel-save-restore-irq-flags.patch
+usb-gadget-serial-fix-tx-stall-after-buffer-overflow.patch
+drm-msm-mdp5-rate-limit-pp-done-timeout-warnings.patch
+drm-msm-fix-return-type-of-dsi_mgr_connector_mode_va.patch
+drm-msm-dsi-save-pll-state-before-dsi-host-is-powere.patch
+net-ks8851-ml-remove-8-bit-bus-accessors.patch
+net-ks8851-ml-fix-16-bit-data-access.patch
+net-ks8851-ml-fix-16-bit-io-operation.patch
+watchdog-da9062-do-not-ping-the-hw-during-stop.patch
+s390-cio-cio_ignore_proc_seq_next-should-increase-po.patch
+x86-boot-compressed-don-t-declare-__force_order-in-k.patch
+nvme-fix-uninitialized-variable-warning.patch
+x86-xen-distribute-switch-variables-for-initializati.patch
+net-thunderx-workaround-bgx-tx-underflow-issue.patch
diff --git a/queue-4.14/usb-gadget-composite-support-more-than-500ma-maxpowe.patch b/queue-4.14/usb-gadget-composite-support-more-than-500ma-maxpowe.patch
new file mode 100644 (file)
index 0000000..8dccaa8
--- /dev/null
@@ -0,0 +1,115 @@
+From 78b870a269628a58f968cb56d87bf0c5248e4937 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 Jan 2020 19:10:36 -0800
+Subject: usb: gadget: composite: Support more than 500mA MaxPower
+
+From: Jack Pham <jackp@codeaurora.org>
+
+[ Upstream commit a2035411fa1d1206cea7d5dfe833e78481844a76 ]
+
+USB 3.x SuperSpeed peripherals can draw up to 900mA of VBUS power
+when in configured state. However, if a configuration wanting to
+take advantage of this is added with MaxPower greater than 500
+(currently possible if using a ConfigFS gadget) the composite
+driver fails to accommodate this for a couple reasons:
+
+ - usb_gadget_vbus_draw() when called from set_config() and
+   composite_resume() will be passed the MaxPower value without
+   regard for the current connection speed, resulting in a
+   violation for USB 2.0 since the max is 500mA.
+
+ - the bMaxPower of the configuration descriptor would be
+   incorrectly encoded, again if the connection speed is only
+   at USB 2.0 or below, likely wrapping around U8_MAX since
+   the 2mA multiplier corresponds to a maximum of 510mA.
+
+Fix these by adding checks against the current gadget->speed
+when the c->MaxPower value is used (set_config() and
+composite_resume()) and appropriately limit based on whether
+it is currently at a low-/full-/high- or super-speed connection.
+
+Because 900 is not divisible by 8, with the round-up division
+currently used in encode_bMaxPower() a MaxPower of 900mA will
+result in an encoded value of 0x71. When a host stack (including
+Linux and Windows) enumerates this on a single port root hub, it
+reads this value back and decodes (multiplies by 8) to get 904mA
+which is strictly greater than 900mA that is typically budgeted
+for that port, causing it to reject the configuration. Instead,
+we should be using the round-down behavior of normal integral
+division so that 900 / 8 -> 0x70 or 896mA to stay within range.
+And we might as well change it for the high/full/low case as well
+for consistency.
+
+N.B. USB 3.2 Gen N x 2 allows for up to 1500mA but there doesn't
+seem to be any any peripheral controller supported by Linux that
+does two lane operation, so for now keeping the clamp at 900
+should be fine.
+
+Signed-off-by: Jack Pham <jackp@codeaurora.org>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/composite.c | 24 ++++++++++++++++++------
+ 1 file changed, 18 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
+index 6e30b177aa224..5a4cf779b2692 100644
+--- a/drivers/usb/gadget/composite.c
++++ b/drivers/usb/gadget/composite.c
+@@ -441,9 +441,13 @@ static u8 encode_bMaxPower(enum usb_device_speed speed,
+       if (!val)
+               return 0;
+       if (speed < USB_SPEED_SUPER)
+-              return DIV_ROUND_UP(val, 2);
++              return min(val, 500U) / 2;
+       else
+-              return DIV_ROUND_UP(val, 8);
++              /*
++               * USB 3.x supports up to 900mA, but since 900 isn't divisible
++               * by 8 the integral division will effectively cap to 896mA.
++               */
++              return min(val, 900U) / 8;
+ }
+ static int config_buf(struct usb_configuration *config,
+@@ -841,6 +845,10 @@ static int set_config(struct usb_composite_dev *cdev,
+       /* when we return, be sure our power usage is valid */
+       power = c->MaxPower ? c->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
++      if (gadget->speed < USB_SPEED_SUPER)
++              power = min(power, 500U);
++      else
++              power = min(power, 900U);
+ done:
+       usb_gadget_vbus_draw(gadget, power);
+       if (result >= 0 && cdev->delayed_status)
+@@ -2280,7 +2288,7 @@ void composite_resume(struct usb_gadget *gadget)
+ {
+       struct usb_composite_dev        *cdev = get_gadget_data(gadget);
+       struct usb_function             *f;
+-      u16                             maxpower;
++      unsigned                        maxpower;
+       /* REVISIT:  should we have config level
+        * suspend/resume callbacks?
+@@ -2294,10 +2302,14 @@ void composite_resume(struct usb_gadget *gadget)
+                               f->resume(f);
+               }
+-              maxpower = cdev->config->MaxPower;
++              maxpower = cdev->config->MaxPower ?
++                      cdev->config->MaxPower : CONFIG_USB_GADGET_VBUS_DRAW;
++              if (gadget->speed < USB_SPEED_SUPER)
++                      maxpower = min(maxpower, 500U);
++              else
++                      maxpower = min(maxpower, 900U);
+-              usb_gadget_vbus_draw(gadget, maxpower ?
+-                      maxpower : CONFIG_USB_GADGET_VBUS_DRAW);
++              usb_gadget_vbus_draw(gadget, maxpower);
+       }
+       cdev->suspended = 0;
+-- 
+2.20.1
+
diff --git a/queue-4.14/usb-gadget-ffs-ffs_aio_cancel-save-restore-irq-flags.patch b/queue-4.14/usb-gadget-ffs-ffs_aio_cancel-save-restore-irq-flags.patch
new file mode 100644 (file)
index 0000000..d85cb3b
--- /dev/null
@@ -0,0 +1,53 @@
+From 054fce29833d236a8774a346bbafeac452f8c6cd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Jan 2020 15:29:01 +0200
+Subject: usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags
+
+From: Lars-Peter Clausen <lars@metafoo.de>
+
+[ Upstream commit 43d565727a3a6fd24e37c7c2116475106af71806 ]
+
+ffs_aio_cancel() can be called from both interrupt and thread context. Make
+sure that the current IRQ state is saved and restored by using
+spin_{un,}lock_irq{save,restore}().
+
+Otherwise undefined behavior might occur.
+
+Acked-by: Michal Nazarewicz <mina86@mina86.com>
+Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
+Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/function/f_fs.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
+index cdffbe999500d..282396e8eec63 100644
+--- a/drivers/usb/gadget/function/f_fs.c
++++ b/drivers/usb/gadget/function/f_fs.c
+@@ -1078,18 +1078,19 @@ static int ffs_aio_cancel(struct kiocb *kiocb)
+ {
+       struct ffs_io_data *io_data = kiocb->private;
+       struct ffs_epfile *epfile = kiocb->ki_filp->private_data;
++      unsigned long flags;
+       int value;
+       ENTER();
+-      spin_lock_irq(&epfile->ffs->eps_lock);
++      spin_lock_irqsave(&epfile->ffs->eps_lock, flags);
+       if (likely(io_data && io_data->ep && io_data->req))
+               value = usb_ep_dequeue(io_data->ep, io_data->req);
+       else
+               value = -EINVAL;
+-      spin_unlock_irq(&epfile->ffs->eps_lock);
++      spin_unlock_irqrestore(&epfile->ffs->eps_lock, flags);
+       return value;
+ }
+-- 
+2.20.1
+
diff --git a/queue-4.14/usb-gadget-serial-fix-tx-stall-after-buffer-overflow.patch b/queue-4.14/usb-gadget-serial-fix-tx-stall-after-buffer-overflow.patch
new file mode 100644 (file)
index 0000000..5f05d71
--- /dev/null
@@ -0,0 +1,50 @@
+From 54eb5d2b99e3ee57a2bf79017f63504cd66221d5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 Jan 2020 14:21:46 +0300
+Subject: usb: gadget: serial: fix Tx stall after buffer overflow
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Sergey Organov <sorganov@gmail.com>
+
+[ Upstream commit e4bfded56cf39b8d02733c1e6ef546b97961e18a ]
+
+Symptom: application opens /dev/ttyGS0 and starts sending (writing) to
+it while either USB cable is not connected, or nobody listens on the
+other side of the cable. If driver circular buffer overflows before
+connection is established, no data will be written to the USB layer
+until/unless /dev/ttyGS0 is closed and re-opened again by the
+application (the latter besides having no means of being notified about
+the event of establishing of the connection.)
+
+Fix: on open and/or connect, kick Tx to flush circular buffer data to
+USB layer.
+
+Signed-off-by: Sergey Organov <sorganov@gmail.com>
+Reviewed-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
+Signed-off-by: Felipe Balbi <balbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/function/u_serial.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c
+index 520ace49f91d9..942d2977797d7 100644
+--- a/drivers/usb/gadget/function/u_serial.c
++++ b/drivers/usb/gadget/function/u_serial.c
+@@ -715,8 +715,10 @@ static int gs_start_io(struct gs_port *port)
+       port->n_read = 0;
+       started = gs_start_rx(port);
+-      /* unblock any pending writes into our circular buffer */
+       if (started) {
++              gs_start_tx(port);
++              /* Unblock any pending writes into our circular buffer, in case
++               * we didn't in gs_start_tx() */
+               tty_wakeup(port->port.tty);
+       } else {
+               gs_free_requests(ep, head, &port->read_allocated);
+-- 
+2.20.1
+
diff --git a/queue-4.14/watchdog-da9062-do-not-ping-the-hw-during-stop.patch b/queue-4.14/watchdog-da9062-do-not-ping-the-hw-during-stop.patch
new file mode 100644 (file)
index 0000000..0c02427
--- /dev/null
@@ -0,0 +1,51 @@
+From 48c21aca66541736fcc03b2560d1adf8e8d6a9cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Jan 2020 10:17:29 +0100
+Subject: watchdog: da9062: do not ping the hw during stop()
+
+From: Marco Felsch <m.felsch@pengutronix.de>
+
+[ Upstream commit e9a0e65eda3f78d0b04ec6136c591c000cbc3b76 ]
+
+The da9062 hw has a minimum ping cool down phase of at least 200ms. The
+driver takes that into account by setting the min_hw_heartbeat_ms to
+300ms and the core guarantees that the hw limit is observed for the
+ping() calls. But the core can't guarantee the required minimum ping
+cool down phase if a stop() command is send immediately after the ping()
+command. So it is not allowed to ping the watchdog within the stop()
+command as the driver does. Remove the ping can be done without doubts
+because the watchdog gets disabled anyway and a (re)start resets the
+watchdog counter too.
+
+Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
+Reviewed-by: Guenter Roeck <linux@roeck-us.net>
+Link: https://lore.kernel.org/r/20200120091729.16256-1-m.felsch@pengutronix.de
+[groeck: Updated description]
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/watchdog/da9062_wdt.c | 7 -------
+ 1 file changed, 7 deletions(-)
+
+diff --git a/drivers/watchdog/da9062_wdt.c b/drivers/watchdog/da9062_wdt.c
+index 9083d3d922b0b..79383ff620199 100644
+--- a/drivers/watchdog/da9062_wdt.c
++++ b/drivers/watchdog/da9062_wdt.c
+@@ -126,13 +126,6 @@ static int da9062_wdt_stop(struct watchdog_device *wdd)
+       struct da9062_watchdog *wdt = watchdog_get_drvdata(wdd);
+       int ret;
+-      ret = da9062_reset_watchdog_timer(wdt);
+-      if (ret) {
+-              dev_err(wdt->hw->dev, "Failed to ping the watchdog (err = %d)\n",
+-                      ret);
+-              return ret;
+-      }
+-
+       ret = regmap_update_bits(wdt->hw->regmap,
+                                DA9062AA_CONTROL_D,
+                                DA9062AA_TWDSCALE_MASK,
+-- 
+2.20.1
+
diff --git a/queue-4.14/x86-boot-compressed-don-t-declare-__force_order-in-k.patch b/queue-4.14/x86-boot-compressed-don-t-declare-__force_order-in-k.patch
new file mode 100644 (file)
index 0000000..0e2fd33
--- /dev/null
@@ -0,0 +1,44 @@
+From 7f056a08aa7052b2bf2ffe1f4b8ada979e676096 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Jan 2020 12:46:51 -0800
+Subject: x86/boot/compressed: Don't declare __force_order in kaslr_64.c
+
+From: H.J. Lu <hjl.tools@gmail.com>
+
+[ Upstream commit df6d4f9db79c1a5d6f48b59db35ccd1e9ff9adfc ]
+
+GCC 10 changed the default to -fno-common, which leads to
+
+    LD      arch/x86/boot/compressed/vmlinux
+  ld: arch/x86/boot/compressed/pgtable_64.o:(.bss+0x0): multiple definition of `__force_order'; \
+    arch/x86/boot/compressed/kaslr_64.o:(.bss+0x0): first defined here
+  make[2]: *** [arch/x86/boot/compressed/Makefile:119: arch/x86/boot/compressed/vmlinux] Error 1
+
+Since __force_order is already provided in pgtable_64.c, there is no
+need to declare __force_order in kaslr_64.c.
+
+Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
+Signed-off-by: Borislav Petkov <bp@suse.de>
+Link: https://lkml.kernel.org/r/20200124181811.4780-1-hjl.tools@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/boot/compressed/pagetable.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/arch/x86/boot/compressed/pagetable.c b/arch/x86/boot/compressed/pagetable.c
+index e691ff734cb5a..46573842d8c3e 100644
+--- a/arch/x86/boot/compressed/pagetable.c
++++ b/arch/x86/boot/compressed/pagetable.c
+@@ -36,9 +36,6 @@
+ #define __PAGE_OFFSET __PAGE_OFFSET_BASE
+ #include "../../mm/ident_map.c"
+-/* Used by pgtable.h asm code to force instruction serialization. */
+-unsigned long __force_order;
+-
+ /* Used to track our page table allocation area. */
+ struct alloc_pgt_data {
+       unsigned char *pgt_buf;
+-- 
+2.20.1
+
diff --git a/queue-4.14/x86-xen-distribute-switch-variables-for-initializati.patch b/queue-4.14/x86-xen-distribute-switch-variables-for-initializati.patch
new file mode 100644 (file)
index 0000000..8bf3625
--- /dev/null
@@ -0,0 +1,69 @@
+From b9598e305acfb0d3a894ccab4c129c52f3db2713 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Feb 2020 22:23:18 -0800
+Subject: x86/xen: Distribute switch variables for initialization
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Kees Cook <keescook@chromium.org>
+
+[ Upstream commit 9038ec99ceb94fb8d93ade5e236b2928f0792c7c ]
+
+Variables declared in a switch statement before any case statements
+cannot be automatically initialized with compiler instrumentation (as
+they are not part of any execution flow). With GCC's proposed automatic
+stack variable initialization feature, this triggers a warning (and they
+don't get initialized). Clang's automatic stack variable initialization
+(via CONFIG_INIT_STACK_ALL=y) doesn't throw a warning, but it also
+doesn't initialize such variables[1]. Note that these warnings (or silent
+skipping) happen before the dead-store elimination optimization phase,
+so even when the automatic initializations are later elided in favor of
+direct initializations, the warnings remain.
+
+To avoid these problems, move such variables into the "case" where
+they're used or lift them up into the main function body.
+
+arch/x86/xen/enlighten_pv.c: In function ‘xen_write_msr_safe’:
+arch/x86/xen/enlighten_pv.c:904:12: warning: statement will never be executed [-Wswitch-unreachable]
+  904 |   unsigned which;
+      |            ^~~~~
+
+[1] https://bugs.llvm.org/show_bug.cgi?id=44916
+
+Signed-off-by: Kees Cook <keescook@chromium.org>
+Link: https://lore.kernel.org/r/20200220062318.69299-1-keescook@chromium.org
+Reviewed-by: Juergen Gross <jgross@suse.com>
+[boris: made @which an 'unsigned int']
+Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/xen/enlighten_pv.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c
+index f79a0cdc6b4e7..1f8175bf2a5e3 100644
+--- a/arch/x86/xen/enlighten_pv.c
++++ b/arch/x86/xen/enlighten_pv.c
+@@ -909,14 +909,15 @@ static u64 xen_read_msr_safe(unsigned int msr, int *err)
+ static int xen_write_msr_safe(unsigned int msr, unsigned low, unsigned high)
+ {
+       int ret;
++#ifdef CONFIG_X86_64
++      unsigned int which;
++      u64 base;
++#endif
+       ret = 0;
+       switch (msr) {
+ #ifdef CONFIG_X86_64
+-              unsigned which;
+-              u64 base;
+-
+       case MSR_FS_BASE:               which = SEGBASE_FS; goto set;
+       case MSR_KERNEL_GS_BASE:        which = SEGBASE_GS_USER; goto set;
+       case MSR_GS_BASE:               which = SEGBASE_GS_KERNEL; goto set;
+-- 
+2.20.1
+