git: 8ef8c6abfadf - main - cam/scsi: Restore scsi_start_stop() and add scsi_start_stop_pc()

From: Jaeyoon Choi <jaeyoon_at_FreeBSD.org>
Date: Mon, 26 Jan 2026 06:47:08 UTC
The branch main has been updated by jaeyoon:

URL: https://cgit.FreeBSD.org/src/commit/?id=8ef8c6abfadfc9eb0465ce57c6b09ca310415bdd

commit 8ef8c6abfadfc9eb0465ce57c6b09ca310415bdd
Author:     Jaeyoon Choi <jaeyoon@FreeBSD.org>
AuthorDate: 2026-01-26 06:29:28 +0000
Commit:     Jaeyoon Choi <jaeyoon@FreeBSD.org>
CommitDate: 2026-01-26 06:35:31 +0000

    cam/scsi: Restore scsi_start_stop() and add scsi_start_stop_pc()
    
    Revert the argument change that broke libcam in 8c35de49 and move
    power_condition support to scsi_start_stop_pc().
    
    Reported by:            imp
    Reviewed By:            #cam, imp (mentor)
    Sponsored by:           Samsung Electronics
    Differential Revision:  https://reviews.freebsd.org/D54822
---
 sbin/camcontrol/camcontrol.c |  1 -
 sys/cam/cam_periph.c         |  1 -
 sys/cam/scsi/scsi_all.c      | 34 ++++++++++++++++++++++++++++++++++
 sys/cam/scsi/scsi_all.h      |  4 ++++
 sys/cam/scsi/scsi_cd.c       |  2 --
 sys/dev/mpr/mpr_sas_lsi.c    |  1 -
 sys/dev/mps/mps_sas_lsi.c    |  1 -
 sys/dev/ufshci/ufshci_sim.c  |  2 +-
 8 files changed, 39 insertions(+), 7 deletions(-)

diff --git a/sbin/camcontrol/camcontrol.c b/sbin/camcontrol/camcontrol.c
index 8da0c97b02a9..15a5d42a2ba5 100644
--- a/sbin/camcontrol/camcontrol.c
+++ b/sbin/camcontrol/camcontrol.c
@@ -1024,7 +1024,6 @@ scsistart(struct cam_device *device, int startstop, int loadeject,
 			/* start/stop */ startstop,
 			/* load_eject */ loadeject,
 			/* immediate */ 0,
-			/* power_condition */ SSS_PC_START_VALID,
 			/* sense_len */ SSD_FULL_SIZE,
 			/* timeout */ timeout ? timeout : 120000);
 
diff --git a/sys/cam/cam_periph.c b/sys/cam/cam_periph.c
index 7f6855a5d51d..91ec7a71f612 100644
--- a/sys/cam/cam_periph.c
+++ b/sys/cam/cam_periph.c
@@ -1791,7 +1791,6 @@ camperiphscsisenseerror(union ccb *ccb, union ccb **orig,
 					/*start*/TRUE,
 					/*load/eject*/le,
 					/*immediate*/FALSE,
-					/*power_condition*/SSS_PC_START_VALID,
 					SSD_FULL_SIZE,
 					/*timeout*/50000);
 			break;
diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c
index d8bba97e79bc..76fcd3fee188 100644
--- a/sys/cam/scsi/scsi_all.c
+++ b/sys/cam/scsi/scsi_all.c
@@ -9007,6 +9007,40 @@ scsi_write_buffer(struct ccb_scsiio *csio, uint32_t retries,
 
 void
 scsi_start_stop(struct ccb_scsiio *csio, uint32_t retries,
+		void (*cbfcnp)(struct cam_periph *, union ccb *),
+		uint8_t tag_action, int start, int load_eject,
+		int immediate, uint8_t sense_len, uint32_t timeout)
+{
+	struct scsi_start_stop_unit *scsi_cmd;
+	int extra_flags = 0;
+
+	scsi_cmd = (struct scsi_start_stop_unit *)&csio->cdb_io.cdb_bytes;
+	bzero(scsi_cmd, sizeof(*scsi_cmd));
+	scsi_cmd->opcode = START_STOP_UNIT;
+	if (start != 0) {
+		scsi_cmd->how |= SSS_START;
+		/* it takes a lot of power to start a drive */
+		extra_flags |= CAM_HIGH_POWER;
+	}
+	if (load_eject != 0)
+		scsi_cmd->how |= SSS_LOEJ;
+	if (immediate != 0)
+		scsi_cmd->byte2 |= SSS_IMMED;
+
+	cam_fill_csio(csio,
+		      retries,
+		      cbfcnp,
+		      /*flags*/CAM_DIR_NONE | extra_flags,
+		      tag_action,
+		      /*data_ptr*/NULL,
+		      /*dxfer_len*/0,
+		      sense_len,
+		      sizeof(*scsi_cmd),
+		      timeout);
+}
+
+void
+scsi_start_stop_pc(struct ccb_scsiio *csio, uint32_t retries,
 		void (*cbfcnp)(struct cam_periph *, union ccb *),
 		uint8_t tag_action, int start, int load_eject,
 		int immediate, uint8_t power_condition, uint8_t sense_len,
diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h
index cadf2d1f2835..8aa87abce370 100644
--- a/sys/cam/scsi/scsi_all.h
+++ b/sys/cam/scsi/scsi_all.h
@@ -4348,6 +4348,10 @@ void scsi_unmap(struct ccb_scsiio *csio, uint32_t retries,
 		uint8_t sense_len, uint32_t timeout);
 
 void scsi_start_stop(struct ccb_scsiio *csio, uint32_t retries,
+		     void (*cbfcnp)(struct cam_periph *, union ccb *),
+		     uint8_t tag_action, int start, int load_eject,
+		     int immediate, uint8_t sense_len, uint32_t timeout);
+void scsi_start_stop_pc(struct ccb_scsiio *csio, uint32_t retries,
 		     void (*cbfcnp)(struct cam_periph *, union ccb *),
 		     uint8_t tag_action, int start, int load_eject,
 		     int immediate, uint8_t power_condition, uint8_t sense_len,
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index bc4634562dc6..e622a96ec77e 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -3406,7 +3406,6 @@ cdstartunit(struct cam_periph *periph, int load)
 			/* start */ TRUE,
 			/* load_eject */ load,
 			/* immediate */ FALSE,
-			/* power_condition */ SSS_PC_START_VALID,
 			/* sense_len */ SSD_FULL_SIZE,
 			/* timeout */ 50000);
 
@@ -3435,7 +3434,6 @@ cdstopunit(struct cam_periph *periph, uint32_t eject)
 			/* start */ FALSE,
 			/* load_eject */ eject,
 			/* immediate */ FALSE,
-			/* power_condition */ SSS_PC_START_VALID,
 			/* sense_len */ SSD_FULL_SIZE,
 			/* timeout */ 50000);
 
diff --git a/sys/dev/mpr/mpr_sas_lsi.c b/sys/dev/mpr/mpr_sas_lsi.c
index 6529b38cc5f1..f88dd6e2532f 100644
--- a/sys/dev/mpr/mpr_sas_lsi.c
+++ b/sys/dev/mpr/mpr_sas_lsi.c
@@ -1516,7 +1516,6 @@ mprsas_SSU_to_SATA_devices(struct mpr_softc *sc, int howto)
 			    /*start*/FALSE,
 			    /*load/eject*/0,
 			    /*immediate*/FALSE,
-			    /*power_condition*/SSS_PC_START_VALID,
 			    MPR_SENSE_LEN,
 			    /*timeout*/10000);
 			xpt_action(ccb);
diff --git a/sys/dev/mps/mps_sas_lsi.c b/sys/dev/mps/mps_sas_lsi.c
index c48c8e15d4a4..bcde5d69a021 100644
--- a/sys/dev/mps/mps_sas_lsi.c
+++ b/sys/dev/mps/mps_sas_lsi.c
@@ -1152,7 +1152,6 @@ mpssas_SSU_to_SATA_devices(struct mps_softc *sc, int howto)
 			    /*start*/FALSE,
 			    /*load/eject*/0,
 			    /*immediate*/FALSE,
-			    /*power_condition*/SSS_PC_START_VALID,
 			    MPS_SENSE_LEN,
 			    /*timeout*/10000);
 			xpt_action(ccb);
diff --git a/sys/dev/ufshci/ufshci_sim.c b/sys/dev/ufshci/ufshci_sim.c
index bee1fff858ff..404f3e99d1e2 100644
--- a/sys/dev/ufshci/ufshci_sim.c
+++ b/sys/dev/ufshci/ufshci_sim.c
@@ -494,7 +494,7 @@ ufshci_sim_send_ssu(struct ufshci_controller *ctrlr, bool start,
 		return ENOMEM;
 	}
 
-	scsi_start_stop(&ccb->csio,
+	scsi_start_stop_pc(&ccb->csio,
 	    /*retries*/ 4,
 	    /*cbfcnp*/ NULL,
 	    /*tag_action*/ MSG_SIMPLE_Q_TAG,