34#define _CAM_CAM_CCB_H 1
39#include <sys/limits.h>
41#include <sys/callout.h>
50#define IOCDBLEN CAM_MAX_CDBLEN
55#define CCB_PERIPH_PRIV_SIZE 2
56#define CCB_SIM_PRIV_SIZE 2
263#define XPT_FC_GROUP_MASK 0xF0
264#define XPT_FC_GROUP(op) ((op) & XPT_FC_GROUP_MASK)
265#define XPT_FC_GROUP_COMMON 0x00
266#define XPT_FC_GROUP_SCSI_CONTROL 0x10
267#define XPT_FC_GROUP_HBA_ENGINE 0x20
268#define XPT_FC_GROUP_TMODE 0x30
269#define XPT_FC_GROUP_VENDOR_UNIQUE 0x80
271#define XPT_FC_IS_DEV_QUEUED(ccb) \
272 (((ccb)->ccb_h.func_code & XPT_FC_DEV_QUEUED) == XPT_FC_DEV_QUEUED)
273#define XPT_FC_IS_QUEUED(ccb) \
274 (((ccb)->ccb_h.func_code & XPT_FC_QUEUED) != 0)
305#define XPORT_IS_NVME(t) ((t) == XPORT_NVME)
306#define XPORT_IS_ATA(t) ((t) == XPORT_ATA || (t) == XPORT_SATA)
307#define XPORT_IS_SCSI(t) ((t) != XPORT_UNKNOWN && \
308 (t) != XPORT_UNSPECIFIED && \
309 !XPORT_IS_ATA(t) && !XPORT_IS_NVME(t))
310#define XPORT_DEVSTAT_TYPE(t) (XPORT_IS_ATA(t) ? DEVSTAT_TYPE_IF_IDE : \
311 XPORT_IS_SCSI(t) ? DEVSTAT_TYPE_IF_SCSI : \
312 DEVSTAT_TYPE_IF_OTHER)
314#define PROTO_VERSION_UNKNOWN (UINT_MAX - 1)
315#define PROTO_VERSION_UNSPECIFIED UINT_MAX
316#define XPORT_VERSION_UNKNOWN (UINT_MAX - 1)
317#define XPORT_VERSION_UNSPECIFIED UINT_MAX
329 u_int8_t bytes[
sizeof(uintptr_t)];
353#if BYTE_ORDER == LITTLE_ENDIAN
571#define CAM_BUS_GENERATION 0x00
572#define CAM_TARGET_GENERATION 0x01
573#define CAM_DEV_GENERATION 0x02
574#define CAM_PERIPH_GENERATION 0x03
594#define CAM_VERSION 0x1a
645#define NVME_DEV_NAME_LEN 52
656 "ccb_pathinq_settings_nvme too big");
658#define PATHINQ_SETTINGS_SIZE 128
772#define CAM_TAG_ACTION_NONE 0x00
776#if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
781static __inline uint8_t *
785 ccb->cdb_io.cdb_ptr :
ccb->cdb_io.cdb_bytes);
800#define ATA_FLAG_AUX 0x1
801#define ATA_FLAG_ICC 0x2
829static __inline uint8_t *
833 ccb->cdb_io.cdb_ptr :
ccb->cdb_io.cdb_bytes);
840#define RELSIM_ADJUST_OPENINGS 0x01
841#define RELSIM_RELEASE_AFTER_TIMEOUT 0x02
842#define RELSIM_RELEASE_AFTER_CMDCMPLT 0x04
843#define RELSIM_RELEASE_AFTER_QEMPTY 0x08
856 struct nvme_completion
cpl;
892#define AC_CONTRACT_DATA_MAX (128 - sizeof (u_int64_t))
898#define AC_CONTRACT_DEV_CHG 1
952#define CTS_SCSI_VALID_TQ 0x01
954#define CTS_SCSI_FLAGS_TAG_ENB 0x01
960#define CTS_ATA_VALID_TQ 0x01
962#define CTS_ATA_FLAGS_TAG_ENB 0x01
968#define CTS_SPI_VALID_SYNC_RATE 0x01
969#define CTS_SPI_VALID_SYNC_OFFSET 0x02
970#define CTS_SPI_VALID_BUS_WIDTH 0x04
971#define CTS_SPI_VALID_DISC 0x08
972#define CTS_SPI_VALID_PPR_OPTIONS 0x10
974#define CTS_SPI_FLAGS_DISC_ENB 0x01
983#define CTS_FC_VALID_WWNN 0x8000
984#define CTS_FC_VALID_WWPN 0x4000
985#define CTS_FC_VALID_PORT 0x2000
986#define CTS_FC_VALID_SPEED 0x1000
995#define CTS_SAS_VALID_SPEED 0x1000
1001#define CTS_ATA_VALID_MODE 0x01
1002#define CTS_ATA_VALID_BYTECOUNT 0x02
1003#define CTS_ATA_VALID_ATAPI 0x20
1004#define CTS_ATA_VALID_CAPS 0x40
1009#define CTS_ATA_CAPS_H 0x0000ffff
1010#define CTS_ATA_CAPS_H_DMA48 0x00000001
1011#define CTS_ATA_CAPS_D 0xffff0000
1016#define CTS_SATA_VALID_MODE 0x01
1017#define CTS_SATA_VALID_BYTECOUNT 0x02
1018#define CTS_SATA_VALID_REVISION 0x04
1019#define CTS_SATA_VALID_PM 0x08
1020#define CTS_SATA_VALID_TAGS 0x10
1021#define CTS_SATA_VALID_ATAPI 0x20
1022#define CTS_SATA_VALID_CAPS 0x40
1030#define CTS_SATA_CAPS_H 0x0000ffff
1031#define CTS_SATA_CAPS_H_PMREQ 0x00000001
1032#define CTS_SATA_CAPS_H_APST 0x00000002
1033#define CTS_SATA_CAPS_H_DMAAA 0x00000010
1034#define CTS_SATA_CAPS_H_AN 0x00000020
1035#define CTS_SATA_CAPS_D 0xffff0000
1036#define CTS_SATA_CAPS_D_PMREQ 0x00010000
1037#define CTS_SATA_CAPS_D_APST 0x00020000
1043#define CTS_NVME_VALID_SPEC 0x01
1044#define CTS_NVME_VALID_CAPS 0x02
1045#define CTS_NVME_VALID_LINK 0x04
1058#define MMC_CLK (1 << 1)
1059#define MMC_VDD (1 << 2)
1060#define MMC_CS (1 << 3)
1061#define MMC_BW (1 << 4)
1062#define MMC_PM (1 << 5)
1063#define MMC_BT (1 << 6)
1064#define MMC_BM (1 << 7)
1065#define MMC_VCCQ (1 << 8)
1072#define MMC_CAP_4_BIT_DATA (1 << 0)
1073#define MMC_CAP_8_BIT_DATA (1 << 1)
1074#define MMC_CAP_HSPEED (1 << 2)
1075#define MMC_CAP_BOOT_NOACC (1 << 4)
1076#define MMC_CAP_WAIT_WHILE_BUSY (1 << 5)
1077#define MMC_CAP_UHS_SDR12 (1 << 6)
1078#define MMC_CAP_UHS_SDR25 (1 << 7)
1079#define MMC_CAP_UHS_SDR50 (1 << 8)
1080#define MMC_CAP_UHS_SDR104 (1 << 9)
1081#define MMC_CAP_UHS_DDR50 (1 << 10)
1082#define MMC_CAP_MMC_DDR52_120 (1 << 11)
1083#define MMC_CAP_MMC_DDR52_180 (1 << 12)
1084#define MMC_CAP_MMC_DDR52 (MMC_CAP_MMC_DDR52_120 | MMC_CAP_MMC_DDR52_180)
1085#define MMC_CAP_MMC_HS200_120 (1 << 13)
1086#define MMC_CAP_MMC_HS200_180 (1 << 14)
1087#define MMC_CAP_MMC_HS200 (MMC_CAP_MMC_HS200_120| MMC_CAP_MMC_HS200_180)
1088#define MMC_CAP_MMC_HS400_120 (1 << 15)
1089#define MMC_CAP_MMC_HS400_180 (1 << 16)
1090#define MMC_CAP_MMC_HS400 (MMC_CAP_MMC_HS400_120 | MMC_CAP_MMC_HS400_180)
1091#define MMC_CAP_MMC_HSX00_120 (MMC_CAP_MMC_HS200_120 | MMC_CAP_MMC_HS400_120)
1092#define MMC_CAP_MMC_ENH_STROBE (1 << 17)
1093#define MMC_CAP_SIGNALING_120 (1 << 18)
1094#define MMC_CAP_SIGNALING_180 (1 << 19)
1095#define MMC_CAP_SIGNALING_330 (1 << 20)
1096#define MMC_CAP_DRIVER_TYPE_A (1 << 21)
1097#define MMC_CAP_DRIVER_TYPE_C (1 << 22)
1098#define MMC_CAP_DRIVER_TYPE_D (1 << 23)
1147#define KNOB_VALID_ADDRESS 0x1
1148#define KNOB_VALID_ROLE 0x2
1150#define KNOB_ROLE_NONE 0x0
1151#define KNOB_ROLE_INITIATOR 0x1
1152#define KNOB_ROLE_TARGET 0x2
1153#define KNOB_ROLE_BOTH 0x3
1173#define KNOB_SETTINGS_SIZE 128
1245#define CAM_RSP_TMF_COMPLETE 0x00
1246#define CAM_RSP_TMF_REJECTED 0x04
1247#define CAM_RSP_TMF_FAILED 0x05
1248#define CAM_RSP_TMF_SUCCEEDED 0x08
1249#define CAM_RSP_TMF_INCORRECT_LUN 0x09
1295#define CAM_TIME_DEFAULT 0x00000000
1296#define CAM_TIME_INFINITY 0xFFFFFFFF
1298#define CAM_SUCCESS 0
1300#define XPT_CCB_INVALID -1
1311#define CDAI_FLAG_NONE 0x0
1312#define CDAI_FLAG_STORE 0x1
1315#define CDAI_TYPE_SCSI_DEVID 1
1316#define CDAI_TYPE_SERIAL_NUM 2
1317#define CDAI_TYPE_PHYS_PATH 3
1318#define CDAI_TYPE_RCAPLONG 4
1319#define CDAI_TYPE_EXT_INQ 5
1320#define CDAI_TYPE_NVME_CNTRL 6
1321#define CDAI_TYPE_NVME_NS 7
1322#define CDAI_TYPE_MMC_PARAMS 8
1324#define CAM_SCSI_DEVID_MAXLEN 65536
1383#define CCB_CLEAR_ALL_EXCEPT_HDR(ccbp) \
1384 bzero((char *)(ccbp) + sizeof((ccbp)->ccb_h), \
1385 sizeof(*(ccbp)) - sizeof((ccbp)->ccb_h))
1391 u_int32_t flags, u_int8_t tag_action,
1392 u_int8_t *data_ptr, u_int32_t dxfer_len,
1393 u_int8_t sense_len, u_int8_t cdb_len,
1408#if defined(BUF_TRACKING) || defined(FULL_BUF_TRACKING)
1416 u_int32_t flags, u_int tag_action, u_int tag_id,
1417 u_int init_id, u_int scsi_status, u_int8_t *data_ptr,
1418 u_int32_t dxfer_len, u_int32_t timeout)
1438 u_int32_t flags, u_int tag_action __unused,
1439 u_int8_t *data_ptr, u_int32_t dxfer_len,
1454 void (*cbfcnp)(
struct cam_periph *,
union ccb *), uint32_t flags,
1455 uint8_t *smp_request,
int smp_request_len,
1456 uint8_t *smp_response,
int smp_response_len,
1461 (
"direction != CAM_DIR_BOTH"));
1462 KASSERT((smp_request != NULL) && (smp_response != NULL),
1463 (
"need valid request and response buffers"));
1464 KASSERT((smp_request_len != 0) && (smp_response_len != 0),
1465 (
"need non-zero request and response lengths"));
1480 void (*cbfcnp)(
struct cam_periph *,
union ccb *), uint32_t flags,
1481 uint32_t mmc_opcode, uint32_t mmc_arg, uint32_t mmc_flags,
1482 struct mmc_data *mmc_d,
1490 mmcio->
cmd.opcode = mmc_opcode;
1491 mmcio->
cmd.arg = mmc_arg;
1492 mmcio->
cmd.flags = mmc_flags;
1493 mmcio->
stop.opcode = 0;
1494 mmcio->
stop.arg = 0;
1495 mmcio->
stop.flags = 0;
1496 if (mmc_d != NULL) {
1497 mmcio->
cmd.data = mmc_d;
1499 mmcio->
cmd.data = NULL;
1500 mmcio->
cmd.resp[0] = 0;
1501 mmcio->
cmd.resp[1] = 0;
1502 mmcio->
cmd.resp[2] = 0;
1503 mmcio->
cmd.resp[3] = 0;
1524 u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len,
1539 u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len,
@ CAM_GDEVLIST_LIST_CHANGED
@ CAM_GDEVLIST_LAST_DEVICE
static __inline void cam_fill_ataio(struct ccb_ataio *ataio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int tag_action __unused, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int32_t timeout)
void ac_callback_t(void *softc, u_int32_t code, struct cam_path *path, void *args)
@ DEV_RESULT_UNCONFIGURED
#define CCB_PERIPH_PRIV_SIZE
@ CTS_TYPE_CURRENT_SETTINGS
#define KNOB_SETTINGS_SIZE
#define CCB_SIM_PRIV_SIZE
static __inline void cam_fill_smpio(struct ccb_smpio *smpio, uint32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint32_t flags, uint8_t *smp_request, int smp_request_len, uint8_t *smp_response, int smp_response_len, uint32_t timeout)
static __inline void cam_fill_mmcio(struct ccb_mmcio *mmcio, uint32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), uint32_t flags, uint32_t mmc_opcode, uint32_t mmc_arg, uint32_t mmc_flags, struct mmc_data *mmc_d, uint32_t timeout)
_Static_assert(sizeof(struct ccb_pathinq_settings_nvme)==64, "ccb_pathinq_settings_nvme too big")
#define PATHINQ_SETTINGS_SIZE
static __inline void cam_fill_nvmeadmin(struct ccb_nvmeio *nvmeio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int32_t timeout)
#define NVME_DEV_NAME_LEN
@ CAM_DEV_MATCH_SIZE_ERROR
@ CAM_DEV_MATCH_LIST_CHANGED
static __BEGIN_DECLS __inline void cam_fill_csio(struct ccb_scsiio *csio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int8_t tag_action, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len, u_int8_t cdb_len, u_int32_t timeout)
@ XPT_MMC_GET_TRAN_SETTINGS
@ XPT_MMC_SET_TRAN_SETTINGS
static __inline void cam_set_ccbstatus(union ccb *ccb, cam_status status)
static __inline void cam_fill_ctio(struct ccb_scsiio *csio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int tag_action, u_int tag_id, u_int init_id, u_int scsi_status, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int32_t timeout)
void cam_calc_geometry(struct ccb_calc_geometry *ccg, int extended)
static __inline cam_status cam_ccb_status(union ccb *ccb)
static __inline uint8_t * scsiio_cdb_ptr(struct ccb_scsiio *ccb)
static __inline void cam_fill_nvmeio(struct ccb_nvmeio *nvmeio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int32_t flags, u_int8_t *data_ptr, u_int32_t dxfer_len, u_int32_t timeout)
static __inline uint8_t * atio_cdb_ptr(struct ccb_accept_tio *ccb)
#define AC_CONTRACT_DATA_MAX
u_int64_t contract_number
u_int8_t contract_data[AC_CONTRACT_DATA_MAX]
struct scsi_sense_data sense_data
struct ccb_dev_position pos
struct dev_match_result * matches
ccb_dev_match_status status
u_int32_t pattern_buf_len
struct dev_match_pattern * patterns
struct ccb_dm_cookie cookie
dev_pos_type position_type
struct ata_params ident_data
struct scsi_inquiry_data inq_data
char periph_name[DEV_IDLEN]
ccb_getdevlist_status_e status
struct timeval last_reset
ccb_ppriv_area periph_priv
struct timeval softtimeout
void(* cbfcnp)(struct cam_periph *, union ccb *)
struct scsi_sense_data sense_data
struct nvme_completion cpl
char dev_name[NVME_DEV_NAME_LEN]
struct ccb_pathinq_settings_spi spi
union ccb_pathinq::@2 xport_specific
char ccb_pathinq_settings_opaque[PATHINQ_SETTINGS_SIZE]
struct ccb_pathinq_settings_fc fc
struct ccb_pathinq_settings_sas sas
u_int8_t vuhba_flags[VUHBALEN]
u_int32_t base_transfer_speed
struct ccb_pathinq_settings_nvme nvme
struct timeval last_reset
u_int32_t release_timeout
struct scsi_sense_data sense_data
struct ccb_sim_knob_settings_sas sas
union ccb_sim_knob::@5 xport_specific
struct ccb_sim_knob_settings_spi spi
char pad[KNOB_SETTINGS_SIZE]
struct ccb_sim_knob_settings_fc fc
uint16_t smp_request_sglist_cnt
uint16_t smp_response_sglist_cnt
struct ccb_trans_settings_fc fc
struct ccb_trans_settings_spi spi
struct ccb_trans_settings_scsi scsi
struct ccb_trans_settings_ata ata
struct ccb_trans_settings_sas sas
struct ccb_trans_settings_sata sata
union ccb_trans_settings::@4 xport_specific
struct ccb_trans_settings_nvme nvme
struct ccb_trans_settings_mmc mmc
union ccb_trans_settings::@3 proto_specific
union match_pattern pattern
union match_result result
union device_match_pattern::@1 data
struct device_id_match_pattern devid_pat
struct scsi_static_inquiry_pattern inq_pat
struct scsi_inquiry_data inq_data
struct ata_params ident_data
char periph_name[DEV_IDLEN]
periph_pattern_flags flags
char periph_name[DEV_IDLEN]
uint8_t sense_buf[SSD_FULL_SIZE - 1]
STAILQ_ENTRY(ccb_hdr) stqe
struct ccb_notify_acknowledge cna2
struct ccb_immed_notify cin
struct ccb_getdevlist cgdl
struct ccb_getdevstats cgds
struct ccb_trans_settings cts
struct ccb_dev_advinfo cdai
struct ccb_immediate_notify cin1
struct ccb_calc_geometry ccg
struct ccb_accept_tio atio
struct ccb_pathstats cpis
struct ccb_notify_ack cna
struct bus_match_pattern bus_pattern
struct device_match_pattern device_pattern
struct periph_match_pattern periph_pattern
struct device_match_result device_result
struct bus_match_result bus_result
struct periph_match_result periph_result