linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Richard Fitzgerald <rf@opensource.cirrus.com>,
	Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>,
	Vinod Koul <vkoul@kernel.org>, Sasha Levin <sashal@kernel.org>,
	yung-chuan.liao@linux.intel.com, alsa-devel@alsa-project.org
Subject: [PATCH AUTOSEL 5.15 50/50] soundwire: cadence: Drain the RX FIFO after an IO timeout
Date: Fri,  3 Mar 2023 16:45:31 -0500	[thread overview]
Message-ID: <20230303214531.1450154-50-sashal@kernel.org> (raw)
In-Reply-To: <20230303214531.1450154-1-sashal@kernel.org>

From: Richard Fitzgerald <rf@opensource.cirrus.com>

[ Upstream commit 0603a47bd3a8f439d7844b841eee1819353063e0 ]

If wait_for_completion_timeout() times-out in _cdns_xfer_msg() it
is possible that something could have been written to the RX FIFO.
In this case, we should drain the RX FIFO so that anything in it
doesn't carry over and mess up the next transfer.

Obviously, if we got to this state something went wrong, and we
don't really know the state of everything. The cleanup in this
situation cannot be bullet-proof but we should attempt to avoid
breaking future transaction, if only to reduce the amount of
error noise when debugging the failure from a kernel log.

Note that this patch only implements the draining for blocking
(non-deferred) transfers. The deferred API doesn't have any proper
handling of error conditions and would need some re-design before
implementing cleanup. That is a task for a separate patch...

Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20221202161812.4186897-4-rf@opensource.cirrus.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/soundwire/cadence_master.c | 50 ++++++++++++++++--------------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index b229e1e0d7d97..842e08c56796b 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -555,6 +555,29 @@ cdns_fill_msg_resp(struct sdw_cdns *cdns,
 	return SDW_CMD_OK;
 }
 
+static void cdns_read_response(struct sdw_cdns *cdns)
+{
+	u32 num_resp, cmd_base;
+	int i;
+
+	/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */
+	BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
+
+	num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
+	num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
+	if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
+		dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
+		num_resp = ARRAY_SIZE(cdns->response_buf);
+	}
+
+	cmd_base = CDNS_MCP_CMD_BASE;
+
+	for (i = 0; i < num_resp; i++) {
+		cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
+		cmd_base += CDNS_MCP_CMD_WORD_LEN;
+	}
+}
+
 static enum sdw_command_response
 _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
 	       int offset, int count, bool defer)
@@ -596,6 +619,10 @@ _cdns_xfer_msg(struct sdw_cdns *cdns, struct sdw_msg *msg, int cmd,
 		dev_err(cdns->dev, "IO transfer timed out, cmd %d device %d addr %x len %d\n",
 			cmd, msg->dev_num, msg->addr, msg->len);
 		msg->len = 0;
+
+		/* Drain anything in the RX_FIFO */
+		cdns_read_response(cdns);
+
 		return SDW_CMD_TIMEOUT;
 	}
 
@@ -764,29 +791,6 @@ EXPORT_SYMBOL(cdns_reset_page_addr);
  * IRQ handling
  */
 
-static void cdns_read_response(struct sdw_cdns *cdns)
-{
-	u32 num_resp, cmd_base;
-	int i;
-
-	/* RX_FIFO_AVAIL can be 2 entries more than the FIFO size */
-	BUILD_BUG_ON(ARRAY_SIZE(cdns->response_buf) < CDNS_MCP_CMD_LEN + 2);
-
-	num_resp = cdns_readl(cdns, CDNS_MCP_FIFOSTAT);
-	num_resp &= CDNS_MCP_RX_FIFO_AVAIL;
-	if (num_resp > ARRAY_SIZE(cdns->response_buf)) {
-		dev_warn(cdns->dev, "RX AVAIL %d too long\n", num_resp);
-		num_resp = ARRAY_SIZE(cdns->response_buf);
-	}
-
-	cmd_base = CDNS_MCP_CMD_BASE;
-
-	for (i = 0; i < num_resp; i++) {
-		cdns->response_buf[i] = cdns_readl(cdns, cmd_base);
-		cmd_base += CDNS_MCP_CMD_WORD_LEN;
-	}
-}
-
 static int cdns_update_slave_status(struct sdw_cdns *cdns,
 				    u64 slave_intstat)
 {
-- 
2.39.2


      parent reply	other threads:[~2023-03-03 21:57 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-03 21:44 [PATCH AUTOSEL 5.15 01/50] IB/hfi1: Update RMT size calculation Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 02/50] iommu/amd: Fix error handling for pdev_pri_ats_enable() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 03/50] media: uvcvideo: Remove format descriptions Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 04/50] media: uvcvideo: Handle cameras with invalid descriptors Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 05/50] media: uvcvideo: Handle errors from calls to usb_string Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 06/50] media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910 Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 07/50] media: uvcvideo: Silence memcpy() run-time false positive warnings Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 08/50] USB: fix memory leak with using debugfs_lookup() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 09/50] staging: emxx_udc: Add checks for dma_alloc_coherent() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 10/50] tty: fix out-of-bounds access in tty_driver_lookup_tty() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 11/50] tty: serial: fsl_lpuart: disable the CTS when send break signal Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 12/50] serial: sc16is7xx: setup GPIO controller later in probe Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 13/50] mei: bus-fixup:upon error print return values of send and receive Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 14/50] parport_pc: Set up mode and ECR masks for Oxford Semiconductor devices Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 15/50] tools/iio/iio_utils:fix memory leak Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 16/50] iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_status_word() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 17/50] iio: accel: mma9551_core: Prevent uninitialized variable in mma9551_read_config_word() Sasha Levin
2023-03-03 21:44 ` [PATCH AUTOSEL 5.15 18/50] firmware: coreboot: framebuffer: Ignore reserved pixel color bits Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 19/50] soundwire: bus_type: Avoid lockdep assert in sdw_drv_probe() Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 20/50] PCI: loongson: Prevent LS7A MRRS increases Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 21/50] USB: dwc3: fix memory leak with using debugfs_lookup() Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 22/50] USB: chipidea: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 23/50] USB: uhci: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 24/50] USB: sl811: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 25/50] USB: fotg210: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 26/50] USB: isp116x: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 27/50] USB: isp1362: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 28/50] USB: gadget: gr_udc: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 29/50] USB: gadget: bcm63xx_udc: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 30/50] USB: gadget: lpc32xx_udc: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 31/50] USB: gadget: pxa25x_udc: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 32/50] USB: gadget: pxa27x_udc: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 33/50] usb: host: xhci: mvebu: Iterate over array indexes instead of using pointer math Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 34/50] USB: ene_usb6250: Allocate enough memory for full object Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 35/50] usb: uvc: Enumerate valid values for color matching Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 36/50] usb: gadget: uvc: Make bSourceID read/write Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 37/50] PCI: Align extra resources for hotplug bridges properly Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 38/50] PCI: Take other bus devices into account when distributing resources Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 39/50] tty: pcn_uart: fix memory leak with using debugfs_lookup() Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 40/50] misc: vmw_balloon: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 41/50] drivers: base: component: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 42/50] drivers: base: dd: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 43/50] kernel/time/test_udelay.c: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 44/50] kernel/power/energy_model.c: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 45/50] kernel/fail_function: " Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 46/50] PCI: loongson: Add more devices that need MRRS quirk Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 47/50] PCI: Add ACS quirk for Wangxun NICs Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 48/50] phy: rockchip-typec: Fix unsigned comparison with less than zero Sasha Levin
2023-03-03 21:45 ` [PATCH AUTOSEL 5.15 49/50] soundwire: cadence: Remove wasted space in response_buf Sasha Levin
2023-03-03 21:45 ` Sasha Levin [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230303214531.1450154-50-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=alsa-devel@alsa-project.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=rf@opensource.cirrus.com \
    --cc=stable@vger.kernel.org \
    --cc=vkoul@kernel.org \
    --cc=yung-chuan.liao@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).