From b63e94e2513e9665006764a69a32cbd8a79adf3c Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 7 Aug 2021 10:20:44 +0200 Subject: [PATCH] 4.9-stable patches added patches: spi-mediatek-fix-fifo-transfer.patch --- ...revert-spi-mediatek-fix-fifo-rx-mode.patch | 52 -------------- queue-4.9/series | 2 +- .../spi-mediatek-fix-fifo-transfer.patch | 68 +++++++++++++++++++ 3 files changed, 69 insertions(+), 53 deletions(-) delete mode 100644 queue-4.9/revert-spi-mediatek-fix-fifo-rx-mode.patch create mode 100644 queue-4.9/spi-mediatek-fix-fifo-transfer.patch diff --git a/queue-4.9/revert-spi-mediatek-fix-fifo-rx-mode.patch b/queue-4.9/revert-spi-mediatek-fix-fifo-rx-mode.patch deleted file mode 100644 index 0c6e83e896c..00000000000 --- a/queue-4.9/revert-spi-mediatek-fix-fifo-rx-mode.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 568f12594bc88a1b8f9e697c9bf6a3a5b6b6d134 Mon Sep 17 00:00:00 2001 -From: Greg Kroah-Hartman -Date: Thu, 5 Aug 2021 20:53:50 +0200 -Subject: Revert "spi: mediatek: fix fifo rx mode" - -From: Greg Kroah-Hartman - -This reverts commit 42982d02f56445cec2cbaea31811c88bb9db2947 which is -commit 3a70dd2d050331ee4cf5ad9d5c0a32d83ead9a43 upstream. - -It has been found to have problems. - -Reported-by: Guenter Roeck -Cc: Peter Hess -Cc: Frank Wunderlich -Cc: Mark Brown -Cc: Sasha Levin -Link: https://lore.kernel.org/r/efee3a58-a4d2-af22-0931-e81b877ab539@roeck-us.net -Signed-off-by: Greg Kroah-Hartman ---- - drivers/spi/spi-mt65xx.c | 16 +++------------- - 1 file changed, 3 insertions(+), 13 deletions(-) - ---- a/drivers/spi/spi-mt65xx.c -+++ b/drivers/spi/spi-mt65xx.c -@@ -338,23 +338,13 @@ static int mtk_spi_fifo_transfer(struct - mtk_spi_setup_packet(master); - - cnt = xfer->len / 4; -- if (xfer->tx_buf) -- iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); -- -- if (xfer->rx_buf) -- ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt); -+ iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); - - remainder = xfer->len % 4; - if (remainder > 0) { - reg_val = 0; -- if (xfer->tx_buf) { -- memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder); -- writel(reg_val, mdata->base + SPI_TX_DATA_REG); -- } -- if (xfer->rx_buf) { -- reg_val = readl(mdata->base + SPI_RX_DATA_REG); -- memcpy(xfer->rx_buf + (cnt * 4), ®_val, remainder); -- } -+ memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder); -+ writel(reg_val, mdata->base + SPI_TX_DATA_REG); - } - - mtk_spi_enable_transfer(master); diff --git a/queue-4.9/series b/queue-4.9/series index a5543c88d84..740b1d502bd 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -2,6 +2,6 @@ btrfs-mark-compressed-range-uptodate-only-if-all-bio.patch regulator-rt5033-fix-n_voltages-settings-for-buck-an.patch r8152-fix-potential-pm-refcount-imbalance.patch net-fix-zero-copy-head-len-calculation.patch -revert-spi-mediatek-fix-fifo-rx-mode.patch revert-bluetooth-shutdown-controller-after-workqueues-are-flushed-or-cancelled.patch can-raw-raw_setsockopt-fix-raw_rcv-panic-for-sock-uaf.patch +spi-mediatek-fix-fifo-transfer.patch diff --git a/queue-4.9/spi-mediatek-fix-fifo-transfer.patch b/queue-4.9/spi-mediatek-fix-fifo-transfer.patch new file mode 100644 index 00000000000..bbac1522d5a --- /dev/null +++ b/queue-4.9/spi-mediatek-fix-fifo-transfer.patch @@ -0,0 +1,68 @@ +From 0d5c3954b35eddff0da0436c31e8d721eceb7dc2 Mon Sep 17 00:00:00 2001 +From: Guenter Roeck +Date: Sun, 1 Aug 2021 20:00:23 -0700 +Subject: spi: mediatek: Fix fifo transfer + +From: Guenter Roeck + +commit 0d5c3954b35eddff0da0436c31e8d721eceb7dc2 upstream. + +Commit 3a70dd2d0503 ("spi: mediatek: fix fifo rx mode") claims that +fifo RX mode was never handled, and adds the presumably missing code +to the FIFO transfer function. However, the claim that receive data +was not handled is incorrect. It was handled as part of interrupt +handling after the transfer was complete. The code added with the above +mentioned commit reads data from the receive FIFO before the transfer +is started, which is wrong. This results in an actual transfer error +on a Hayato Chromebook. + +Remove the code trying to handle receive data before the transfer is +started to fix the problem. + +Fixes: 3a70dd2d0503 ("spi: mediatek: fix fifo rx mode") +Cc: Peter Hess +Cc: Frank Wunderlich +Cc: Tzung-Bi Shih +Cc: Hsin-Yi Wang +Signed-off-by: Guenter Roeck +Tested-by: Hsin-Yi Wang +Tested-by: Tzung-Bi Shih +Link: https://lore.kernel.org/r/20210802030023.1748777-1-linux@roeck-us.net +Signed-off-by: Mark Brown +Signed-off-by: Greg Kroah-Hartman +--- + drivers/spi/spi-mt65xx.c | 19 +++++-------------- + 1 file changed, 5 insertions(+), 14 deletions(-) + +--- a/drivers/spi/spi-mt65xx.c ++++ b/drivers/spi/spi-mt65xx.c +@@ -337,24 +337,15 @@ static int mtk_spi_fifo_transfer(struct + mtk_spi_prepare_transfer(master, xfer); + mtk_spi_setup_packet(master); + +- cnt = xfer->len / 4; +- if (xfer->tx_buf) ++ if (xfer->tx_buf) { ++ cnt = xfer->len / 4; + iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt); +- +- if (xfer->rx_buf) +- ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt); +- +- remainder = xfer->len % 4; +- if (remainder > 0) { +- reg_val = 0; +- if (xfer->tx_buf) { ++ remainder = xfer->len % 4; ++ if (remainder > 0) { ++ reg_val = 0; + memcpy(®_val, xfer->tx_buf + (cnt * 4), remainder); + writel(reg_val, mdata->base + SPI_TX_DATA_REG); + } +- if (xfer->rx_buf) { +- reg_val = readl(mdata->base + SPI_RX_DATA_REG); +- memcpy(xfer->rx_buf + (cnt * 4), ®_val, remainder); +- } + } + + mtk_spi_enable_transfer(master); -- 2.47.3