Jiri Slaby ef7db2
From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Jiri Slaby ef7db2
Date: Wed, 28 Dec 2022 21:47:01 +0530
Jiri Slaby ef7db2
Subject: [PATCH] bus: mhi: ep: Only send -ENOTCONN status if client driver is
Jiri Slaby ef7db2
 available
Jiri Slaby ef7db2
References: bsc#1012628
Jiri Slaby ef7db2
Patch-mainline: 6.2.3
Jiri Slaby ef7db2
Git-commit: e6cebcc27519dcf1652e604c73b9fd4f416987c0
Jiri Slaby ef7db2
Jiri Slaby ef7db2
commit e6cebcc27519dcf1652e604c73b9fd4f416987c0 upstream.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
For the STOP and RESET commands, only send the channel disconnect status
Jiri Slaby ef7db2
-ENOTCONN if client driver is available. Otherwise, it will result in
Jiri Slaby ef7db2
null pointer dereference.
Jiri Slaby ef7db2
Jiri Slaby ef7db2
Cc: <stable@vger.kernel.org> # 5.19
Jiri Slaby ef7db2
Fixes: e827569062a8 ("bus: mhi: ep: Add support for processing command rings")
Jiri Slaby ef7db2
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Jiri Slaby ef7db2
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Jiri Slaby ef7db2
Link: https://lore.kernel.org/r/20221228161704.255268-4-manivannan.sadhasivam@linaro.org
Jiri Slaby ef7db2
Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Jiri Slaby ef7db2
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby ef7db2
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby ef7db2
---
Jiri Slaby ef7db2
 drivers/bus/mhi/ep/main.c | 16 ++++++++++------
Jiri Slaby ef7db2
 1 file changed, 10 insertions(+), 6 deletions(-)
Jiri Slaby ef7db2
Jiri Slaby ef7db2
diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c
Jiri Slaby ef7db2
index 1dc8a355..2b3a3b56 100644
Jiri Slaby ef7db2
--- a/drivers/bus/mhi/ep/main.c
Jiri Slaby ef7db2
+++ b/drivers/bus/mhi/ep/main.c
Jiri Slaby ef7db2
@@ -196,9 +196,11 @@ static int mhi_ep_process_cmd_ring(struct mhi_ep_ring *ring, struct mhi_ring_ele
Jiri Slaby ef7db2
 		mhi_ep_mmio_disable_chdb(mhi_cntrl, ch_id);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 		/* Send channel disconnect status to client drivers */
Jiri Slaby ef7db2
-		result.transaction_status = -ENOTCONN;
Jiri Slaby ef7db2
-		result.bytes_xferd = 0;
Jiri Slaby ef7db2
-		mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);
Jiri Slaby ef7db2
+		if (mhi_chan->xfer_cb) {
Jiri Slaby ef7db2
+			result.transaction_status = -ENOTCONN;
Jiri Slaby ef7db2
+			result.bytes_xferd = 0;
Jiri Slaby ef7db2
+			mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);
Jiri Slaby ef7db2
+		}
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 		/* Set channel state to STOP */
Jiri Slaby ef7db2
 		mhi_chan->state = MHI_CH_STATE_STOP;
Jiri Slaby ef7db2
@@ -228,9 +230,11 @@ static int mhi_ep_process_cmd_ring(struct mhi_ep_ring *ring, struct mhi_ring_ele
Jiri Slaby ef7db2
 		mhi_ep_ring_reset(mhi_cntrl, ch_ring);
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 		/* Send channel disconnect status to client driver */
Jiri Slaby ef7db2
-		result.transaction_status = -ENOTCONN;
Jiri Slaby ef7db2
-		result.bytes_xferd = 0;
Jiri Slaby ef7db2
-		mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);
Jiri Slaby ef7db2
+		if (mhi_chan->xfer_cb) {
Jiri Slaby ef7db2
+			result.transaction_status = -ENOTCONN;
Jiri Slaby ef7db2
+			result.bytes_xferd = 0;
Jiri Slaby ef7db2
+			mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);
Jiri Slaby ef7db2
+		}
Jiri Slaby ef7db2
 
Jiri Slaby ef7db2
 		/* Set channel state to DISABLED */
Jiri Slaby ef7db2
 		mhi_chan->state = MHI_CH_STATE_DISABLED;
Jiri Slaby ef7db2
-- 
Jiri Slaby ef7db2
2.35.3
Jiri Slaby ef7db2