]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i3c: mipi-i3c-hci: Add missing TID field to no-op command descriptor
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 6 Mar 2026 07:24:46 +0000 (09:24 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 19 Mar 2026 15:15:31 +0000 (16:15 +0100)
commit ec3cfd835f7c4bbd23bc9ad909d2fdc772a578bb upstream.

The internal control command descriptor used for no-op commands includes a
Transaction ID (TID) field, but the no-op command constructed in
hci_dma_dequeue_xfer() omitted it.  As a result, the hardware receives a
no-op descriptor without the expected TID.

This bug has gone unnoticed because the TID is currently not validated in
the no-op completion path, but the descriptor format requires it to be
present.

Add the missing TID field when generating a no-op descriptor so that its
layout matches the defined command structure.

Fixes: 9ad9a52cce282 ("i3c/master: introduce the mipi-i3c-hci driver")
Cc: stable@vger.kernel.org
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260306072451.11131-10-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/i3c/master/mipi-i3c-hci/cmd.h
drivers/i3c/master/mipi-i3c-hci/dma.c

index 1d6dd2c5d01a5389485b45e16efa7c216243aacc..b1bf87daa65166a8115abcfaebcd61540e29a025 100644 (file)
@@ -17,6 +17,7 @@
 #define CMD_0_TOC                      W0_BIT_(31)
 #define CMD_0_ROC                      W0_BIT_(30)
 #define CMD_0_ATTR                     W0_MASK(2, 0)
+#define CMD_0_TID                      W0_MASK(6, 3)
 
 /*
  * Response Descriptor Structure
index 5c306dc5b564f1f0c8e443c55be9110e62b2d8e0..1ed9d053c62feb8a34b4c0b21d7d1ce6011aad86 100644 (file)
@@ -510,7 +510,7 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci,
                        u32 *ring_data = rh->xfer + rh->xfer_struct_sz * idx;
 
                        /* store no-op cmd descriptor */
-                       *ring_data++ = FIELD_PREP(CMD_0_ATTR, 0x7);
+                       *ring_data++ = FIELD_PREP(CMD_0_ATTR, 0x7) | FIELD_PREP(CMD_0_TID, xfer->cmd_tid);
                        *ring_data++ = 0;
                        if (hci->cmd == &mipi_i3c_hci_cmd_v2) {
                                *ring_data++ = 0;