git: 7eb538974c49 - main - cam mmc_xpt/nvme_xpt: Add _sbuf variants of {an,de}nounce xport and proto ops

From: John Baldwin <jhb_at_FreeBSD.org>
Date: Tue, 01 Aug 2023 22:26:10 UTC
The branch main has been updated by jhb:

URL: https://cgit.FreeBSD.org/src/commit/?id=7eb538974c49857a590c79c91f1e4f1c107b5f7d

commit 7eb538974c49857a590c79c91f1e4f1c107b5f7d
Author:     John Baldwin <jhb@FreeBSD.org>
AuthorDate: 2023-08-01 22:23:25 +0000
Commit:     John Baldwin <jhb@FreeBSD.org>
CommitDate: 2023-08-01 22:23:25 +0000

    cam mmc_xpt/nvme_xpt: Add _sbuf variants of {an,de}nounce xport and proto ops
    
    Reviewed by:    imp
    Sponsored by:   Chelsio Communications
    Differential Revision:  https://reviews.freebsd.org/D41261
---
 sys/cam/mmc/mmc_xpt.c   | 42 ++++++++++++++++++++++++++++++++++++++++++
 sys/cam/nvme/nvme_xpt.c | 42 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 77 insertions(+), 7 deletions(-)

diff --git a/sys/cam/mmc/mmc_xpt.c b/sys/cam/mmc/mmc_xpt.c
index 8fee7b4cad58..0930717b0a2a 100644
--- a/sys/cam/mmc/mmc_xpt.c
+++ b/sys/cam/mmc/mmc_xpt.c
@@ -74,6 +74,8 @@ static void mmc_dev_async(uint32_t async_code, struct cam_eb *bus,
 static void	 mmc_action(union ccb *start_ccb);
 static void	 mmc_dev_advinfo(union ccb *start_ccb);
 static void	 mmc_announce_periph(struct cam_periph *periph);
+static void	 mmc_announce_periph_sbuf(struct cam_periph *periph,
+    struct sbuf *sb);
 static void	 mmc_scan_lun(struct cam_periph *periph,
     struct cam_path *path, cam_flags flags, union ccb *ccb);
 
@@ -84,7 +86,9 @@ static void	 mmcprobe_cleanup(struct cam_periph *periph);
 static void	 mmcprobe_done(struct cam_periph *periph, union ccb *done_ccb);
 
 static void mmc_proto_announce(struct cam_ed *device);
+static void mmc_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb);
 static void mmc_proto_denounce(struct cam_ed *device);
+static void mmc_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb);
 static void mmc_proto_debug_out(union ccb *ccb);
 
 typedef enum {
@@ -148,6 +152,7 @@ static struct xpt_xport_ops mmc_xport_ops = {
 	.action = mmc_action,
 	.async = mmc_dev_async,
 	.announce = mmc_announce_periph,
+	.announce_sbuf = mmc_announce_periph_sbuf,
 };
 
 #define MMC_XPT_XPORT(x, X)				\
@@ -162,7 +167,9 @@ MMC_XPT_XPORT(mmc, MMCSD);
 
 static struct xpt_proto_ops mmc_proto_ops = {
 	.announce = mmc_proto_announce,
+	.announce_sbuf = mmc_proto_announce_sbuf,
 	.denounce = mmc_proto_denounce,
+	.denounce_sbuf = mmc_proto_denounce_sbuf,
 	.debug_out = mmc_proto_debug_out,
 };
 
@@ -399,6 +406,29 @@ mmc_announce_periph(struct cam_periph *periph)
 	    ("XPT info: CLK %04d, ...\n", cts.proto_specific.mmc.ios.clock));
 }
 
+static void
+mmc_announce_periph_sbuf(struct cam_periph *periph, struct sbuf *sb)
+{
+	struct	ccb_pathinq cpi;
+	struct	ccb_trans_settings cts;
+	struct	cam_path *path = periph->path;
+
+	cam_periph_assert(periph, MA_OWNED);
+
+	CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("mmc_announce_periph"));
+
+	memset(&cts, 0, sizeof(cts));
+	xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
+	cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
+	cts.type = CTS_TYPE_CURRENT_SETTINGS;
+	xpt_action((union ccb*)&cts);
+	if ((cts.ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP)
+		return;
+	xpt_path_inq(&cpi, periph->path);
+	CAM_DEBUG(path, CAM_DEBUG_INFO,
+	    ("XPT info: CLK %04d, ...\n", cts.proto_specific.mmc.ios.clock));
+}
+
 void
 mmccam_start_discovery(struct cam_sim *sim)
 {
@@ -480,6 +510,12 @@ mmc_proto_announce(struct cam_ed *device)
 	sbuf_putbuf(&sb);
 }
 
+static void
+mmc_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
+{
+	mmc_print_ident(&device->mmc_ident_data, sb);
+}
+
 static void
 mmc_proto_denounce(struct cam_ed *device)
 {
@@ -487,6 +523,12 @@ mmc_proto_denounce(struct cam_ed *device)
 	mmc_proto_announce(device);
 }
 
+static void
+mmc_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
+{
+	mmc_proto_announce_sbuf(device, sb);
+}
+
 static void
 mmc_proto_debug_out(union ccb *ccb)
 {
diff --git a/sys/cam/nvme/nvme_xpt.c b/sys/cam/nvme/nvme_xpt.c
index 0662f476536c..d2968d1019d1 100644
--- a/sys/cam/nvme/nvme_xpt.c
+++ b/sys/cam/nvme/nvme_xpt.c
@@ -157,8 +157,14 @@ static void	 nvme_dev_async(uint32_t async_code,
 				void *async_arg);
 static void	 nvme_action(union ccb *start_ccb);
 static void	 nvme_announce_periph(struct cam_periph *periph);
+static void	 nvme_announce_periph_sbuf(struct cam_periph *periph,
+    struct sbuf *sb);
 static void	 nvme_proto_announce(struct cam_ed *device);
+static void	 nvme_proto_announce_sbuf(struct cam_ed *device,
+    struct sbuf *sb);
 static void	 nvme_proto_denounce(struct cam_ed *device);
+static void	 nvme_proto_denounce_sbuf(struct cam_ed *device,
+    struct sbuf *sb);
 static void	 nvme_proto_debug_out(union ccb *ccb);
 
 static struct xpt_xport_ops nvme_xport_ops = {
@@ -166,6 +172,7 @@ static struct xpt_xport_ops nvme_xport_ops = {
 	.action = nvme_action,
 	.async = nvme_dev_async,
 	.announce = nvme_announce_periph,
+	.announce_sbuf = nvme_announce_periph_sbuf,
 };
 #define NVME_XPT_XPORT(x, X)			\
 static struct xpt_xport nvme_xport_ ## x = {	\
@@ -181,7 +188,9 @@ NVME_XPT_XPORT(nvme, NVME);
 
 static struct xpt_proto_ops nvme_proto_ops = {
 	.announce = nvme_proto_announce,
+	.announce_sbuf = nvme_proto_announce_sbuf,
 	.denounce = nvme_proto_denounce,
+	.denounce_sbuf = nvme_proto_denounce_sbuf,
 	.debug_out = nvme_proto_debug_out,
 };
 static struct xpt_proto nvme_proto = {
@@ -783,14 +792,12 @@ nvme_dev_async(uint32_t async_code, struct cam_eb *bus, struct cam_et *target,
 }
 
 static void
-nvme_announce_periph(struct cam_periph *periph)
+nvme_announce_periph_sbuf(struct cam_periph *periph, struct sbuf *sb)
 {
 	struct	ccb_pathinq cpi;
 	struct	ccb_trans_settings cts;
 	struct	cam_path *path = periph->path;
 	struct ccb_trans_settings_nvme	*nvmex;
-	struct sbuf	sb;
-	char		buffer[120];
 
 	cam_periph_assert(periph, MA_OWNED);
 
@@ -805,20 +812,29 @@ nvme_announce_periph(struct cam_periph *periph)
 
 	/* Ask the SIM for its base transfer speed */
 	xpt_path_inq(&cpi, periph->path);
-	sbuf_new(&sb, buffer, sizeof(buffer), SBUF_FIXEDLEN);
-	sbuf_printf(&sb, "%s%d: nvme version %d.%d",
+	sbuf_printf(sb, "%s%d: nvme version %d.%d",
 	    periph->periph_name, periph->unit_number,
 	    NVME_MAJOR(cts.protocol_version),
 	    NVME_MINOR(cts.protocol_version));
 	if (cts.transport == XPORT_NVME) {
 		nvmex = &cts.proto_specific.nvme;
 		if (nvmex->valid & CTS_NVME_VALID_LINK)
-			sbuf_printf(&sb,
+			sbuf_printf(sb,
 			    " x%d (max x%d) lanes PCIe Gen%d (max Gen%d) link",
 			    nvmex->lanes, nvmex->max_lanes,
 			    nvmex->speed, nvmex->max_speed);
 	}
-	sbuf_printf(&sb, "\n");
+	sbuf_printf(sb, "\n");
+}
+
+static void
+nvme_announce_periph(struct cam_periph *periph)
+{
+	struct sbuf	sb;
+	char		buffer[120];
+
+	sbuf_new(&sb, buffer, sizeof(buffer), SBUF_FIXEDLEN);
+	nvme_announce_periph_sbuf(periph, &sb);
 	sbuf_finish(&sb);
 	sbuf_putbuf(&sb);
 }
@@ -835,6 +851,12 @@ nvme_proto_announce(struct cam_ed *device)
 	sbuf_putbuf(&sb);
 }
 
+static void
+nvme_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
+{
+	nvme_print_ident(device->nvme_cdata, device->nvme_data, sb);
+}
+
 static void
 nvme_proto_denounce(struct cam_ed *device)
 {
@@ -847,6 +869,12 @@ nvme_proto_denounce(struct cam_ed *device)
 	sbuf_putbuf(&sb);
 }
 
+static void
+nvme_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
+{
+	nvme_print_ident_short(device->nvme_cdata, device->nvme_data, sb);
+}
+
 static void
 nvme_proto_debug_out(union ccb *ccb)
 {