git: 808c82daab85 - main - thunderbolt: Factor out router_prepare_cmd()

From: Aymeric Wibo <obiwac_at_FreeBSD.org>
Date: Mon, 14 Sep 2026 15:48:47 UTC
The branch main has been updated by obiwac:

URL: https://cgit.FreeBSD.org/src/commit/?id=808c82daab85c2c5576f37bcf371c3e1a51f71d9

commit 808c82daab85c2c5576f37bcf371c3e1a51f71d9
Author:     Aymeric Wibo <obiwac@FreeBSD.org>
AuthorDate: 2026-09-14 14:19:49 +0000
Commit:     Aymeric Wibo <obiwac@FreeBSD.org>
CommitDate: 2026-09-14 15:44:00 +0000

    thunderbolt: Factor out router_prepare_cmd()
    
    Common code between router_prepare_read() & router_prepare_write().
    Eventually will be used by other commands (e.g. hotplugging) aswell.
    
    Reviewed by:    ngie
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D59668
---
 sys/dev/thunderbolt/router.c | 54 ++++++++++++++++----------------------------
 1 file changed, 19 insertions(+), 35 deletions(-)

diff --git a/sys/dev/thunderbolt/router.c b/sys/dev/thunderbolt/router.c
index 52b092d09ae7..22377533dcc6 100644
--- a/sys/dev/thunderbolt/router.c
+++ b/sys/dev/thunderbolt/router.c
@@ -61,6 +61,8 @@
 static int router_alloc_cmd(struct router_softc *, struct router_command **);
 static void router_free_cmd(struct router_softc *, struct router_command *);
 static int _tb_router_attach(struct router_softc *);
+static void router_prepare_cmd(struct router_softc *, struct router_command *,
+    size_t, uint16_t);
 static void router_prepare_read(struct router_softc *, struct router_command *,
     int);
 static void router_prepare_write(struct router_softc *, struct router_command *,
@@ -604,8 +606,8 @@ router_free_cmd(struct router_softc *sc, struct router_command *cmd)
 }
 
 static void
-router_prepare_read(struct router_softc *sc, struct router_command *cmd,
-    int len)
+router_prepare_cmd(struct router_softc *sc, struct router_command *cmd,
+    size_t len, uint16_t pdf)
 {
 	struct nhi_cmd_frame *nhicmd;
 	uint32_t *msg;
@@ -621,56 +623,38 @@ router_prepare_read(struct router_softc *sc, struct router_command *cmd,
 		nhicmd->data[i] = htobe32(nhicmd->data[i]);
 
 	msg = (uint32_t *)nhicmd->data;
-	msg[msglen] = htobe32(tb_calc_crc(nhicmd->data, len-4));
+	/* The last 4 bytes of data is the CRC. Compute CRC for just data. */
+	msg[msglen] = htobe32(tb_calc_crc(nhicmd->data, len - 4));
 
-	nhicmd->pdf = PDF_READ;
+	nhicmd->pdf = pdf;
 	nhicmd->req_len = len;
 
 	nhicmd->timeout = NHI_CMD_TIMEOUT;
 	nhicmd->retries = 0;
-	nhicmd->resp_buffer = (uint32_t *)cmd->resp_buffer;
-	nhicmd->resp_len = (cmd->dwlen + 3) * 4;
 	nhicmd->context = cmd;
 
 	cmd->retries = CFG_DEFAULT_RETRIES;
 	cmd->timeout = CFG_DEFAULT_TIMEOUT;
-
-	return;
 }
 
 static void
-router_prepare_write(struct router_softc *sc, struct router_command *cmd,
+router_prepare_read(struct router_softc *sc, struct router_command *cmd,
     int len)
 {
-	struct nhi_cmd_frame *nhicmd;
-	uint32_t *msg;
-	int msglen, i;
-
-	KASSERT(cmd != NULL, ("cmd cannot be NULL\n"));
-	KASSERT(len != 0, ("Invalid zero-length command\n"));
-	KASSERT(len % 4 == 0, ("Message must be 32bit padded\n"));
+	router_prepare_cmd(sc, cmd, len, PDF_READ);
 
-	nhicmd = cmd->nhicmd;
-	msglen = (len - 4) / 4;
-	for (i = 0; i < msglen; i++)
-		nhicmd->data[i] = htobe32(nhicmd->data[i]);
-
-	msg = (uint32_t *)nhicmd->data;
-	msg[msglen] = htobe32(tb_calc_crc(nhicmd->data, len - 4));
-
-	nhicmd->pdf = PDF_WRITE;
-	nhicmd->req_len = len;
-
-	nhicmd->timeout = NHI_CMD_TIMEOUT;
-	nhicmd->retries = 0;
-	nhicmd->resp_buffer = (uint32_t *)cmd->resp_buffer;
-	nhicmd->resp_len = (cmd->dwlen + 3) * 4;
-	nhicmd->context = cmd;
+	cmd->nhicmd->resp_buffer = (uint32_t *)cmd->resp_buffer;
+	cmd->nhicmd->resp_len = (cmd->dwlen + 3) * 4;
+}
 
-	cmd->retries = CFG_DEFAULT_RETRIES;
-	cmd->timeout = CFG_DEFAULT_TIMEOUT;
+static void
+router_prepare_write(struct router_softc *sc, struct router_command *cmd,
+    int len)
+{
+	router_prepare_cmd(sc, cmd, len, PDF_WRITE);
 
-	return;
+	cmd->nhicmd->resp_buffer = (uint32_t *)cmd->resp_buffer;
+	cmd->nhicmd->resp_len = (cmd->dwlen + 3) * 4;
 }
 
 static int