From: Sasha Levin Date: Mon, 9 Mar 2020 14:51:44 +0000 (-0400) Subject: fixes for 4.14 X-Git-Tag: v4.4.216~59 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ab23f55a8aef9988e9e88c4ec5e90c715866fe88;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.14 Signed-off-by: Sasha Levin --- 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 index 00000000000..65001e83a49 --- /dev/null +++ b/queue-4.14/drm-msm-dsi-save-pll-state-before-dsi-host-is-powere.patch @@ -0,0 +1,61 @@ +From a66be42c361c9cbbcac3d146be3ff2579c3e1f16 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..5da8ac1c940 --- /dev/null +++ b/queue-4.14/drm-msm-fix-return-type-of-dsi_mgr_connector_mode_va.patch @@ -0,0 +1,55 @@ +From aafed32a2727e0791515dea2a5d188ff0d22c42e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Sean Paul +Cc: Sami Tolvanen +Cc: Todd Kjos +Cc: Alistair Delva +Cc: Amit Pundir +Cc: Sumit Semwal +Cc: freedreno@lists.freedesktop.org +Cc: clang-built-linux@googlegroups.com +Signed-off-by: John Stultz +Reviewed-by: Nick Desaulniers +Tested-by: Amit Pundir +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..339b4065216 --- /dev/null +++ b/queue-4.14/drm-msm-mdp5-rate-limit-pp-done-timeout-warnings.patch @@ -0,0 +1,37 @@ +From a763afa2f1387f1db9165d443296a15d1a24f0b4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Jan 2020 15:41:20 -0500 +Subject: drm/msm/mdp5: rate limit pp done timeout warnings + +From: Brian Masney + +[ 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 +Signed-off-by: Rob Clark +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..12d5a3be92a --- /dev/null +++ b/queue-4.14/net-ks8851-ml-fix-16-bit-data-access.patch @@ -0,0 +1,48 @@ +From 87baf45b125bd5e97f16077dbfa161281aad81e7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 15 Feb 2020 17:54:18 +0100 +Subject: net: ks8851-ml: Fix 16-bit data access + +From: Marek Vasut + +[ 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 +Cc: David S. Miller +Cc: Lukas Wunner +Cc: Petr Stetiar +Cc: YueHaibing +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..530ba675e7f --- /dev/null +++ b/queue-4.14/net-ks8851-ml-fix-16-bit-io-operation.patch @@ -0,0 +1,51 @@ +From f35e8ff79ecd380434e474019a0230ba6ebbc877 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 15 Feb 2020 17:54:19 +0100 +Subject: net: ks8851-ml: Fix 16-bit IO operation + +From: Marek Vasut + +[ 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 +Cc: David S. Miller +Cc: Lukas Wunner +Cc: Petr Stetiar +Cc: YueHaibing +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..5cc7938eab7 --- /dev/null +++ b/queue-4.14/net-ks8851-ml-remove-8-bit-bus-accessors.patch @@ -0,0 +1,138 @@ +From 2ff9bc12d0dfbea8d735acf49298dae3a6747052 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 15 Feb 2020 17:54:17 +0100 +Subject: net: ks8851-ml: Remove 8-bit bus accessors + +From: Marek Vasut + +[ 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 +Cc: David S. Miller +Cc: Lukas Wunner +Cc: Petr Stetiar +Cc: YueHaibing +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..40b8511f4c0 --- /dev/null +++ b/queue-4.14/net-thunderx-workaround-bgx-tx-underflow-issue.patch @@ -0,0 +1,155 @@ +From d281bf8c34cad0a2224e04f08bef76b2938b01cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 19 Feb 2020 15:19:36 -0800 +Subject: net: thunderx: workaround BGX TX Underflow issue + +From: Tim Harvey + +[ 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 +Reviewed-by: Robert Jones +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + .../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 index 00000000000..4189cc0b262 --- /dev/null +++ b/queue-4.14/nvme-fix-uninitialized-variable-warning.patch @@ -0,0 +1,38 @@ +From 19dacf7f126bdbba8da8cf10c55d061ccbe39ef0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 20 Feb 2020 00:59:36 +0900 +Subject: nvme: Fix uninitialized-variable warning + +From: Keith Busch + +[ 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 +Reviewed-by: Christoph Hellwig +Signed-off-by: Keith Busch +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..3cadff33772 --- /dev/null +++ b/queue-4.14/s390-cio-cio_ignore_proc_seq_next-should-increase-po.patch @@ -0,0 +1,50 @@ +From 366c517592045d91284f34456b398f8d76759709 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Jan 2020 08:48:55 +0300 +Subject: s390/cio: cio_ignore_proc_seq_next should increase position index + +From: Vasily Averin + +[ 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 +Signed-off-by: Christian Borntraeger +Signed-off-by: Vasily Averin +Signed-off-by: Vasily Gorbik +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..8c05d7d7156 --- /dev/null +++ b/queue-4.14/selftests-fix-too-long-argument.patch @@ -0,0 +1,75 @@ +From c73cdf89b8dc7b890a18f7ba2beb45330f3a28a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 6 Feb 2020 09:40:52 +0100 +Subject: selftests: fix too long argument + +From: Jiri Benc + +[ 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 +Tested-by: Yauheni Kaliuta +Signed-off-by: Jiri Benc +Signed-off-by: Shuah Khan +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..1912691aecf --- /dev/null +++ b/queue-4.14/serial-ar933x_uart-set-uart_cs_-rx-tx-_ready_oride.patch @@ -0,0 +1,58 @@ +From 2cab89760b394df4e1fbbd9c2a836fc0c9f0aeb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 7 Feb 2020 11:53:35 +0200 +Subject: serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE + +From: Daniel Golle + +[ 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 +Signed-off-by: Daniel Golle +Link: https://lore.kernel.org/r/20200207095335.GA179836@makrotopia.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-4.14/series b/queue-4.14/series index b1d442e452f..9ac38df91dd 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -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 index 00000000000..8dccaa850d1 --- /dev/null +++ b/queue-4.14/usb-gadget-composite-support-more-than-500ma-maxpowe.patch @@ -0,0 +1,115 @@ +From 78b870a269628a58f968cb56d87bf0c5248e4937 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Jan 2020 19:10:36 -0800 +Subject: usb: gadget: composite: Support more than 500mA MaxPower + +From: Jack Pham + +[ 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 +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..d85cb3b1019 --- /dev/null +++ b/queue-4.14/usb-gadget-ffs-ffs_aio_cancel-save-restore-irq-flags.patch @@ -0,0 +1,53 @@ +From 054fce29833d236a8774a346bbafeac452f8c6cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Jan 2020 15:29:01 +0200 +Subject: usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags + +From: Lars-Peter Clausen + +[ 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 +Signed-off-by: Lars-Peter Clausen +Signed-off-by: Alexandru Ardelean +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..5f05d718545 --- /dev/null +++ b/queue-4.14/usb-gadget-serial-fix-tx-stall-after-buffer-overflow.patch @@ -0,0 +1,50 @@ +From 54eb5d2b99e3ee57a2bf79017f63504cd66221d5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Reviewed-by: Michał Mirosław +Signed-off-by: Felipe Balbi +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..0c02427b94e --- /dev/null +++ b/queue-4.14/watchdog-da9062-do-not-ping-the-hw-during-stop.patch @@ -0,0 +1,51 @@ +From 48c21aca66541736fcc03b2560d1adf8e8d6a9cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Jan 2020 10:17:29 +0100 +Subject: watchdog: da9062: do not ping the hw during stop() + +From: Marco Felsch + +[ 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 +Reviewed-by: Guenter Roeck +Link: https://lore.kernel.org/r/20200120091729.16256-1-m.felsch@pengutronix.de +[groeck: Updated description] +Signed-off-by: Guenter Roeck +Signed-off-by: Wim Van Sebroeck +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..0e2fd3338c2 --- /dev/null +++ b/queue-4.14/x86-boot-compressed-don-t-declare-__force_order-in-k.patch @@ -0,0 +1,44 @@ +From 7f056a08aa7052b2bf2ffe1f4b8ada979e676096 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Borislav Petkov +Link: https://lkml.kernel.org/r/20200124181811.4780-1-hjl.tools@gmail.com +Signed-off-by: Sasha Levin +--- + 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 index 00000000000..8bf362516ed --- /dev/null +++ b/queue-4.14/x86-xen-distribute-switch-variables-for-initializati.patch @@ -0,0 +1,69 @@ +From b9598e305acfb0d3a894ccab4c129c52f3db2713 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Link: https://lore.kernel.org/r/20200220062318.69299-1-keescook@chromium.org +Reviewed-by: Juergen Gross +[boris: made @which an 'unsigned int'] +Signed-off-by: Boris Ostrovsky +Signed-off-by: Sasha Levin +--- + 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 +