linux/drivers/accel/qaic
Manivannan Sadhasivam 7bdff9b9b0 net: qrtr: Drop the MHI auto_queue feature for IPCR DL channels
[ Upstream commit 51731792a2 ]

MHI stack offers the 'auto_queue' feature, which allows the MHI stack to
auto queue the buffers for the RX path (DL channel). Though this feature
simplifies the client driver design, it introduces race between the client
drivers and the MHI stack. For instance, with auto_queue, the 'dl_callback'
for the DL channel may get called before the client driver is fully probed.
This means, by the time the dl_callback gets called, the client driver's
structures might not be initialized, leading to NULL ptr dereference.

Currently, the drivers have to workaround this issue by initializing the
internal structures before calling mhi_prepare_for_transfer_autoqueue().
But even so, there is a chance that the client driver's internal code path
may call the MHI queue APIs before mhi_prepare_for_transfer_autoqueue() is
called, leading to similar NULL ptr dereference. This issue has been
reported on the Qcom X1E80100 CRD machines affecting boot.

So to properly fix all these races, drop the MHI 'auto_queue' feature
altogether and let the client driver (QRTR) manage the RX buffers manually.
In the QRTR driver, queue the RX buffers based on the ring length during
probe and recycle the buffers in 'dl_callback' once they are consumed. This
also warrants removing the setting of 'auto_queue' flag from controller
drivers.

Currently, this 'auto_queue' feature is only enabled for IPCR DL channel.
So only the QRTR client driver requires the modification.

Fixes: 227fee5fc9 ("bus: mhi: core: Add an API for auto queueing buffers for DL channel")
Fixes: 68a838b84e ("net: qrtr: start MHI channel after endpoit creation")
Reported-by: Johan Hovold <johan@kernel.org>
Closes: https://lore.kernel.org/linux-arm-msm/ZyTtVdkCCES0lkl4@hovoldconsulting.com
Suggested-by: Chris Lew <quic_clew@quicinc.com>
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@oss.qualcomm.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Reviewed-by: Loic Poulain <loic.poulain@oss.qualcomm.com>
Acked-by: Jeff Johnson <jjohnson@kernel.org> # drivers/net/wireless/ath/...
Acked-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Acked-by: Paolo Abeni <pabeni@redhat.com>
Cc: stable@vger.kernel.org
Link: https://patch.msgid.link/20251218-qrtr-fix-v2-1-c7499bfcfbe0@oss.qualcomm.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2026-03-12 07:09:25 -04:00
..
Kconfig PCI: Add CONFIG_MMU dependency 2025-04-23 15:40:30 -05:00
Makefile accel/qaic: Add Reliability, Accessibility, Serviceability (RAS) 2025-05-30 09:14:35 -06:00
mhi_controller.c net: qrtr: Drop the MHI auto_queue feature for IPCR DL channels 2026-03-12 07:09:25 -04:00
mhi_controller.h accel/qaic: Add AIC200 support 2025-01-31 10:08:45 -07:00
qaic.h accel/qaic: Synchronize access to DBC request queue head & tail pointer 2025-10-14 08:56:31 -06:00
qaic_control.c accel/qaic: Treat remaining == 0 as error in find_and_map_user_pages() 2025-10-14 08:44:40 -06:00
qaic_data.c accel/qaic: Synchronize access to DBC request queue head & tail pointer 2025-10-14 08:56:31 -06:00
qaic_debugfs.c accel/qaic: Fix bootlog initialization ordering 2025-10-14 08:30:39 -06:00
qaic_debugfs.h accel/qaic: mark debugfs stub functions as static inline 2024-04-12 09:53:28 -06:00
qaic_drv.c accel/qaic: Synchronize access to DBC request queue head & tail pointer 2025-10-14 08:56:31 -06:00
qaic_ras.c accel/qaic: Use dev_printk() in RAS 2025-06-11 09:34:05 -06:00
qaic_ras.h accel/qaic: Add Reliability, Accessibility, Serviceability (RAS) 2025-05-30 09:14:35 -06:00
qaic_timesync.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
qaic_timesync.h accel/qaic: Add support for periodic timesync 2023-10-27 10:05:42 -06:00
sahara.c accel/qaic: Add AIC200 support 2025-01-31 10:08:45 -07:00
sahara.h accel/qaic: Add Sahara implementation for firmware loading 2024-04-12 09:49:31 -06:00