34#include <sys/endian.h>
37#include <sys/malloc.h>
38#include <sys/kernel.h>
44#include <sys/eventhandler.h>
47#include <sys/sysctl.h>
63#include <machine/stdarg.h>
69#define CAM_QUIRK_MAXTAGS 0x01
116 "PROBE_FULL_INQUIRY",
119 "PROBE_IDENTIFY_SES",
120 "PROBE_IDENTIFY_SAFTE",
125#define PROBE_SET_ACTION(softc, newaction) \
128 text = probe_action_text; \
129 CAM_DEBUG((softc)->periph->path, CAM_DEBUG_PROBE, \
130 ("Probe %s to %s\n", text[(softc)->action], \
131 text[(newaction)])); \
132 (softc)->action = (newaction); \
141 struct ata_params ident_data;
216#define ATA_XPT_XPORT(x, X) \
217static struct xpt_xport ata_xport_ ## x = { \
218 .xport = XPORT_ ## X, \
220 .ops = &ata_xport_ops, \
222CAM_XPT_XPORT(ata_xport_ ## x);
227#undef ATA_XPORT_XPORT
280 union ccb *request_ccb;
283 request_ccb = (
union ccb *)arg;
284 if (request_ccb == NULL) {
285 printf(
"proberegister: no probe CCB, "
286 "can't register device\n");
290 softc = (
aprobe_softc *)malloc(
sizeof(*softc), M_CAMXPT, M_ZERO | M_NOWAIT);
293 printf(
"proberegister: Unable to probe new device. "
294 "Unable to allocate softc\n");
297 TAILQ_INIT(&softc->request_ccbs);
298 TAILQ_INSERT_TAIL(&softc->request_ccbs, &request_ccb->
ccb_h,
301 periph->
softc = softc;
302 softc->periph = periph;
320 ccb = (
union ccb *)TAILQ_FIRST(&softc->request_ccbs);
332 softc->flags &= ~PROBE_NO_ANNOUNCE;
345 struct ata_params *ident_buf;
352 ataio = &start_ccb->
ataio;
353 csio = &start_ccb->
csio;
356 if (softc->restart) {
365 switch (softc->action) {
383 (u_int8_t *)&softc->ident_data,
384 sizeof(softc->ident_data),
402 ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_PUIS_SPINUP, 0, 0);
417 mode =
cts.xport_specific.ata.mode;
420 mode =
cts.xport_specific.sata.mode;
423 if (
ata_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX))
426 if (
atapi_dma == 0 && (mode == 0 || mode > ATA_PIO_MAX))
438 cts.xport_specific.ata.mode = mode;
441 cts.xport_specific.sata.mode = mode;
453 mode =
cts.xport_specific.ata.mode;
456 mode =
cts.xport_specific.sata.mode;
459 if (mode != wantmode)
477 ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode);
542 u_int sectors, bytecount;
553 bytecount =
cts.xport_specific.ata.bytecount;
556 bytecount =
cts.xport_specific.sata.bytecount;
559 sectors = max(1, min(ident_buf->sectors_intr & 0xff,
567 cts.xport_specific.ata.bytecount = sectors *
571 cts.xport_specific.sata.bytecount = sectors *
584 bytecount =
cts.xport_specific.ata.bytecount;
587 bytecount =
cts.xport_specific.sata.bytecount;
615 bytecount =
cts.xport_specific.ata.bytecount;
618 bytecount =
cts.xport_specific.sata.bytecount;
622 bytecount = max(2, min(65534, bytecount));
623 if (ident_buf->satacapabilities != 0x0000 &&
624 ident_buf->satacapabilities != 0xffff) {
625 bytecount = min(8192, bytecount);
633 cts.xport_specific.ata.bytecount = bytecount;
636 cts.xport_specific.sata.bytecount = bytecount;
658 inquiry_len = roundup2(inquiry_len, 2);
699 (u_int8_t *)&softc->ident_data,
700 sizeof(softc->ident_data),
703 sizeof(softc->ident_data) / 4);
711 (u_int8_t *)&softc->ident_data,
712 sizeof(softc->ident_data),
715 sizeof(softc->ident_data) / 4);
718 panic(
"aprobestart: invalid action state 0x%x\n", softc->action);
736 cts.xport_specific.valid = 0;
746 struct ata_params *ident_buf;
753 int changed, found = 1;
754 static const uint8_t fake_device_id_hdr[8] =
780 if (softc->restart) {
785 if (softc->faults < 10)
794 (ident_buf->capabilities1 & ATA_SUPPORT_IORDY) == 0) {
856 switch (softc->action) {
862 (
"SIGNATURE: %04x\n", sign));
863 if (sign == 0x0000 &&
867 }
else if (sign == 0x9669 &&
874 cts.xport_specific.sata.pm_present = 1;
879 }
else if (sign == 0xc33c &&
883 }
else if (sign == 0xeb14 &&
890 "Unexpected signature 0x%04x\n", sign);
906 ident_buf = &softc->ident_data;
914 EVENTHANDLER_INVOKE(ada_probe_veto, path, ident_buf, &veto);
920 if ((ident_buf->specconf == 0x37c8 ||
921 ident_buf->specconf == 0x738c) &&
922 ((ident_buf->config & ATA_RESP_INCOMPLETE) ||
923 softc->spinup == 0)) {
933 if (bcmp(softc->ident_data.model, ident_buf->model,
934 sizeof(ident_buf->model)) ||
935 bcmp(softc->ident_data.serial, ident_buf->serial,
936 sizeof(ident_buf->serial))) {
940 }
else if (bcmp(&softc->ident_data, ident_buf,
941 sizeof(*ident_buf))) {
954 bcopy(&softc->ident_data, ident_buf,
sizeof(
struct ata_params));
968 (u_int8_t *)malloc((
sizeof(ident_buf->serial) + 1),
971 bcopy(ident_buf->serial,
973 sizeof(ident_buf->serial));
979 if (ident_buf->enabled.extension &
980 ATA_SUPPORT_64BITWWN) {
982 malloc(16, M_CAMXPT, M_NOWAIT);
985 bcopy(&fake_device_id_hdr,
987 bcopy(ident_buf->wwn,
996 if (ident_buf->satacapabilities & ATA_SUPPORT_NCQ) {
999 ATA_QUEUE_LEN(ident_buf->queue) + 1;
1009 bzero(&
cts,
sizeof(
cts));
1036 bzero(&
cts,
sizeof(
cts));
1050 ident_buf->satacapabilities != 0xffff) {
1051 if (ident_buf->satacapabilities & ATA_SUPPORT_IFPWRMNGTRCV)
1053 if (ident_buf->satacapabilities & ATA_SUPPORT_HAPST)
1057 bzero(&
cts,
sizeof(
cts));
1064 caps &=
cts.xport_specific.sata.caps;
1067 caps &=
cts.xport_specific.ata.caps;
1086 bzero(&
cts,
sizeof(
cts));
1091 cts.xport_specific.sata.caps = caps;
1094 cts.xport_specific.ata.caps = caps;
1101 if ((ident_buf->satasupport & ATA_SUPPORT_IFPWRMNGT) &&
1103 (!(ident_buf->sataenabled & ATA_SUPPORT_IFPWRMNGT))) {
1111 if (ident_buf->satacapabilities != 0xffff &&
1112 (ident_buf->satacapabilities & ATA_SUPPORT_DAPST) &&
1114 (!(ident_buf->sataenabled & ATA_ENABLED_DAPST))) {
1122 if ((ident_buf->satasupport & ATA_SUPPORT_AUTOACTIVATE) &&
1124 (!(ident_buf->sataenabled & ATA_SUPPORT_AUTOACTIVATE))) {
1133 (ident_buf->satasupport & ATA_SUPPORT_ASYNCNOTIF) &&
1135 (!(ident_buf->sataenabled & ATA_SUPPORT_ASYNCNOTIF))) {
1165 u_int8_t periph_qual, len;
1208 bzero(ident_buf,
sizeof(*ident_buf));
1213 ((uint32_t *)ident_buf)[0] = softc->pm_pid;
1214 snprintf(ident_buf->model,
sizeof(ident_buf->model),
1215 "Port Multiplier %08x", softc->pm_pid);
1225 ((uint32_t *)ident_buf)[1] = softc->pm_prv;
1226 snprintf(ident_buf->revision,
sizeof(ident_buf->revision),
1227 "%04x", softc->pm_prv);
1233 bzero(&
cts,
sizeof(
cts));
1245 bzero(&
cts,
sizeof(
cts));
1251 caps &=
cts.xport_specific.sata.caps;
1261 bzero(&
cts,
sizeof(
cts));
1265 cts.xport_specific.sata.caps = caps;
1288 if (bcmp(&softc->ident_data, ident_buf, 53)) {
1293 bcopy(&softc->ident_data, ident_buf,
sizeof(
struct ata_params));
1299 bcopy(&softc->ident_data, ident_buf,
sizeof(
struct ata_params));
1307 malloc(16, M_CAMXPT, M_NOWAIT);
1310 bcopy(&fake_device_id_hdr,
1312 bcopy(((uint8_t*)ident_buf) + 2,
1332 panic(
"aprobedone: invalid action state 0x%x\n", softc->action);
1335 if (softc->restart) {
1343 while ((done_ccb = (
union ccb *)TAILQ_FIRST(&softc->request_ccbs))) {
1344 TAILQ_REMOVE(&softc->request_ccbs,
1345 &done_ccb->
ccb_h, periph_links.tqe);
1358 free(periph->
softc, M_CAMXPT);
1373 panic(
"xpt_find_quirk: device didn't match wildcard entry!!");
1376 device->
quirk = quirk;
1399 union ccb *work_ccb, *reset_ccb;
1404 (
"xpt_scan_bus\n"));
1410 if (work_ccb == NULL) {
1429 if (reset_ccb == NULL) {
1452 if (scan_info == NULL) {
1459 scan_info->
cpi = &work_ccb->
cpi;
1467 if (work_ccb == NULL) {
1468 free(scan_info, M_CAMXPT);
1476 work_ccb = request_ccb;
1493 bzero(&
cts,
sizeof(
cts));
1498 cts.xport_specific.sata.pm_present = 0;
1513 free(scan_info, M_CAMXPT);
1528 printf(
"xpt_scan_bus: xpt_create_path failed"
1529 " with status %#x, bus scan halted\n",
1534 free(scan_info, M_CAMXPT);
1544 work_ccb->
ccb_h.ppriv_ptr0 = scan_info;
1572 if (request_ccb != NULL) {
1579 if (request_ccb == NULL) {
1581 if (request_ccb == NULL) {
1583 "can't continue\n");
1592 "can't continue\n");
1611 TAILQ_INSERT_TAIL(&
softc->request_ccbs,
1612 &request_ccb->
ccb_h, periph_links.tqe);
1627 "returned an error, can't continue probe\n");
1676 struct ata_params *ident_buf = NULL;
1697 bzero(&
cts,
sizeof(
cts));
1705 cts.proto_specific.valid = 0;
1708 cts.xport_specific.ata.atapi =
1709 (ident_buf->config == ATA_PROTO_CFA) ? 0 :
1710 ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1711 ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1714 cts.xport_specific.sata.atapi =
1715 (ident_buf->config == ATA_PROTO_CFA) ? 0 :
1716 ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_16) ? 16 :
1717 ((ident_buf->config & ATA_PROTO_MASK) == ATA_PROTO_ATAPI_12) ? 12 : 0;
1721 cts.xport_specific.valid = 0;
1735 cdai = &start_ccb->
cdai;
1793 (
void *)(uintptr_t)cdai->
buftype);
1803 (
"%s: ccb %p, func_code %#x should not be allocated "
1842 (device->
ident_data.config == ATA_PROTO_CFA) ? 0 :
1843 (p == ATA_PROTO_ATAPI_16) ? 16 :
1844 (p == ATA_PROTO_ATAPI_12) ? 12 : 0;
1872 device =
cts->ccb_h.path->device;
1882 ata = &
cts->proto_specific.ata;
1892 scsi = &
cts->proto_specific.scsi;
1916 struct ata_params *ident_data;
1920 if (path == NULL || (device = path->
device) == NULL) {
1937 xpt_print(path,
"Uninitialized Protocol %x:%x?\n",
1945 "Version from %d to %d?\n",
cts->protocol_version,
1962 xpt_print(path,
"Uninitialized Transport %x:%x?\n",
1969 xpt_print(path,
"Down reving Transport "
1970 "Version from %d to %d?\n",
cts->transport_version,
1979 ata = &
cts->proto_specific.ata;
1983 scsi = &
cts->proto_specific.scsi;
1990 || (ata && (
ident_data->satacapabilities & ATA_SUPPORT_NCQ) == 0)
1999 ata->
flags &= ~CTS_ATA_FLAGS_TAG_ENB;
2001 scsi->
flags &= ~CTS_SCSI_FLAGS_TAG_ENB;
2017 if (newt && !nowt) {
2027 }
else if (nowt && !newt)
2031 if (async_update == FALSE)
2040 struct cam_ed *device,
void *async_arg)
2120 &
cts->xport_specific.ata;
2127 &
cts->xport_specific.sata;
2140 bzero(&
cts,
sizeof(
cts));
2147 printf(
"%s%d: %d.%03dMB/s transfers",
2151 printf(
"%s%d: %dKB/s transfers", periph->
periph_name,
2156 &
cts.xport_specific.ata;
2162 printf(
"ATAPI %dbytes, ", pata->
atapi);
2169 &
cts.xport_specific.sata;
2173 printf(
"SATA %d.x, ", sata->
revision);
2179 printf(
"ATAPI %dbytes, ", sata->
atapi);
2193 bzero(&
cts,
sizeof(
cts));
2200 sbuf_printf(sb,
"%s%d: %d.%03dMB/s transfers",
2204 sbuf_printf(sb,
"%s%d: %dKB/s transfers", periph->
periph_name,
2209 &
cts.xport_specific.ata;
2211 sbuf_printf(sb,
" (");
2215 sbuf_printf(sb,
"ATAPI %dbytes, ", pata->
atapi);
2217 sbuf_printf(sb,
"PIO %dbytes", pata->
bytecount);
2218 sbuf_printf(sb,
")");
2222 &
cts.xport_specific.sata;
2224 sbuf_printf(sb,
" (");
2226 sbuf_printf(sb,
"SATA %d.x, ", sata->
revision);
2228 sbuf_printf(sb,
"SATA, ");
2232 sbuf_printf(sb,
"ATAPI %dbytes, ", sata->
atapi);
2234 sbuf_printf(sb,
"PIO %dbytes", sata->
bytecount);
2235 sbuf_printf(sb,
")");
2237 sbuf_printf(sb,
"\n");
2291 char cdb_str[(
sizeof(
struct ata_cmd) * 3) + 1];
void semb_print_ident_short(struct sep_identify_data *ident_data)
void ata_pm_read_cmd(struct ccb_ataio *ataio, int reg, int port)
char * ata_cmd_string(struct ata_cmd *cmd, char *cmd_string, size_t len)
u_int ata_revision2speed(int revision)
void ata_bswap(int8_t *buf, int len)
void ata_print_ident(struct ata_params *ident_data)
char * ata_mode2string(int mode)
void ata_param_fixup(struct ata_params *ident_buf)
void ata_reset_cmd(struct ccb_ataio *ataio)
void semb_print_ident(struct sep_identify_data *ident_data)
void semb_print_ident_short_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb)
void ata_print_ident_short(struct ata_params *ident_data)
void ata_print_ident_sbuf(struct ata_params *ident_data, struct sbuf *sb)
void ata_print_ident_short_sbuf(struct ata_params *ident_data, struct sbuf *sb)
int ata_identify_match(caddr_t identbuffer, caddr_t table_entry)
int ata_max_pmode(struct ata_params *ap)
uint32_t ata_logical_sector_size(struct ata_params *ident_data)
char * ata_op_string(struct ata_cmd *cmd)
int ata_max_mode(struct ata_params *ap, int maxmode)
void semb_print_ident_sbuf(struct sep_identify_data *ident_data, struct sbuf *sb)
void ata_28bit_cmd(struct ccb_ataio *ataio, uint8_t cmd, uint8_t features, uint32_t lba, uint8_t sector_count)
u_int ata_mode2speed(int mode)
static void aprobestart(struct cam_periph *periph, union ccb *start_ccb)
static void ata_proto_denounce(struct cam_ed *device)
static void aprobedone(struct cam_periph *periph, union ccb *done_ccb)
static void ata_device_transport(struct cam_path *path)
static struct periph_driver aprobe_driver
static char * probe_action_text[]
static void ata_scan_lun(struct cam_periph *periph, struct cam_path *path, cam_flags flags, union ccb *ccb)
static struct xpt_xport_ops ata_xport_ops
static struct xpt_proto ata_proto_satapm
static void ata_dev_async(u_int32_t async_code, struct cam_eb *bus, struct cam_et *target, struct cam_ed *device, void *async_arg)
static void semb_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
static void ata_announce_periph_sbuf(struct cam_periph *periph, struct sbuf *sb)
static struct xpt_proto ata_proto_semb
static void semb_proto_announce(struct cam_ed *device)
static void axptscandone(struct cam_periph *periph, union ccb *done_ccb)
static void aprobeschedule(struct cam_periph *probe_periph)
static void ata_get_transfer_settings(struct ccb_trans_settings *cts)
static struct xpt_proto_ops ata_proto_ops_semb
static void ata_find_quirk(struct cam_ed *device)
static void ata_proto_debug_out(union ccb *ccb)
#define CAM_QUIRK_MAXTAGS
static struct cam_ed * ata_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
TUNABLE_INT("hw.ata.ata_dma", &ata_dma)
static void ata_action(union ccb *start_ccb)
static void aprobecleanup(struct cam_periph *periph)
CAM_XPT_PROTO(ata_proto_ata)
#define ATA_XPT_XPORT(x, X)
static void ata_proto_announce_sbuf(struct cam_ed *device, struct sbuf *sb)
PERIPHDRIVER_DECLARE(aprobe, aprobe_driver)
static cam_status aproberegister(struct cam_periph *periph, void *arg)
static periph_init_t aprobe_periph_init
static void ata_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
static void aproberequestdefaultnegotiation(struct cam_periph *periph)
static void _ata_announce_periph(struct cam_periph *periph, struct ccb_trans_settings *cts, u_int *speed)
static void semb_proto_denounce(struct cam_ed *device)
static struct xpt_proto ata_proto_ata
static struct ata_quirk_entry ata_quirk_table[]
static void semb_proto_denounce_sbuf(struct cam_ed *device, struct sbuf *sb)
static void ata_scan_bus(struct cam_periph *periph, union ccb *ccb)
static void ata_dev_advinfo(union ccb *start_ccb)
static void ata_proto_announce(struct cam_ed *device)
#define PROBE_SET_ACTION(softc, newaction)
static struct xpt_proto_ops ata_proto_ops_ata
static struct xpt_proto_ops ata_proto_ops_satapm
static void ata_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_path *path, int async_update)
static void ata_announce_periph(struct cam_periph *periph)
caddr_t cam_quirkmatch(caddr_t target, caddr_t quirk_table, int num_entries, int entry_size, cam_quirkmatch_t *comp_func)
#define CAM_TARGET_WILDCARD
#define CAM_PRIORITY_NORMAL
#define CAM_PRIORITY_NONE
#define CTS_SATA_CAPS_H_DMAAA
#define CTS_ATA_VALID_MODE
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)
#define CTS_SATA_VALID_BYTECOUNT
#define CTS_SCSI_FLAGS_TAG_ENB
#define PROTO_VERSION_UNSPECIFIED
@ CTS_TYPE_CURRENT_SETTINGS
#define CTS_SATA_CAPS_D_PMREQ
#define CTS_SCSI_VALID_TQ
#define CTS_SATA_VALID_CAPS
#define CTS_ATA_FLAGS_TAG_ENB
#define CTS_SATA_VALID_MODE
#define CTS_SATA_VALID_TAGS
#define XPORT_VERSION_UNSPECIFIED
#define CTS_SATA_CAPS_D_APST
#define CTS_SATA_CAPS_H_AN
#define CTS_SATA_CAPS_H_PMREQ
#define CTS_SATA_VALID_PM
#define PROTO_VERSION_UNKNOWN
#define CTS_SATA_VALID_REVISION
#define CTS_ATA_VALID_ATAPI
#define CTS_ATA_VALID_CAPS
#define CTS_SATA_VALID_ATAPI
#define CDAI_TYPE_SERIAL_NUM
#define CTS_ATA_VALID_BYTECOUNT
#define CDAI_TYPE_PHYS_PATH
#define XPORT_VERSION_UNKNOWN
#define CTS_ATA_CAPS_H_DMA48
#define CTS_SATA_CAPS_H_APST
#define CDAI_TYPE_SCSI_DEVID
#define CAM_DEBUG(path, flag, printfargs)
void cam_periph_release_locked(struct cam_periph *periph)
struct cam_periph * cam_periph_find(struct cam_path *path, char *name)
u_int32_t cam_release_devq(struct cam_path *path, u_int32_t relsim_flags, u_int32_t openings, u_int32_t arg, int getcount_only)
int cam_periph_acquire(struct cam_periph *periph)
void cam_periph_invalidate(struct cam_periph *periph)
int cam_periph_error(union ccb *ccb, cam_flags camflags, u_int32_t sense_flags)
cam_status cam_periph_alloc(periph_ctor_t *periph_ctor, periph_oninv_t *periph_oninvalidate, periph_dtor_t *periph_dtor, periph_start_t *periph_start, char *name, cam_periph_type type, struct cam_path *path, ac_callback_t *ac_callback, ac_code code, void *arg)
#define CAM_PERIPH_INVALID
#define cam_periph_assert(periph, what)
#define CAM_PERIPH_DRV_EARLY
void() periph_init_t(void)
void xpt_acquire_device(struct cam_ed *device)
struct mtx * xpt_path_mtx(struct cam_path *path)
void xpt_schedule(struct cam_periph *periph, u_int32_t new_priority)
cam_status xpt_create_path(struct cam_path **new_path_ptr, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id)
void xpt_release_device(struct cam_ed *device)
void xpt_print(struct cam_path *path, const char *fmt,...)
void xpt_release_path(struct cam_path *path)
void xpt_async(u_int32_t async_code, struct cam_path *path, void *async_arg)
void xpt_setup_ccb(struct ccb_hdr *ccb_h, struct cam_path *path, u_int32_t priority)
void xpt_action(union ccb *start_ccb)
void xpt_done(union ccb *done_ccb)
union ccb * xpt_alloc_ccb_nowait(void)
void xpt_free_path(struct cam_path *path)
void xpt_action_default(union ccb *start_ccb)
cam_status xpt_compile_path(struct cam_path *new_path, struct cam_periph *perph, path_id_t path_id, target_id_t target_id, lun_id_t lun_id)
void xpt_stop_tags(struct cam_path *path)
void xpt_release_ccb(union ccb *free_ccb)
struct cam_ed * xpt_alloc_device(struct cam_eb *bus, struct cam_et *target, lun_id_t lun_id)
void xpt_release_devq(struct cam_path *path, u_int count, int run_queue)
void xpt_free_ccb(union ccb *free_ccb)
#define xpt_path_unlock(path)
#define xpt_path_owned(path)
#define xpt_path_lock(path)
#define xpt_path_assert(path, what)
static void xpt_path_inq(struct ccb_pathinq *cpi, struct cam_path *path)
#define CAM_DEV_UNCONFIGURED
#define CAM_DEV_INQUIRY_DATA_VALID
#define CAM_DEV_TAG_AFTER_COUNT
#define CAM_TAG_DELAY_COUNT
#define CAM_DEV_IDENTIFY_DATA_VALID
struct ccb_trans_settings_mmc * cts
void scsi_inquiry(struct ccb_scsiio *csio, u_int32_t retries, void(*cbfcnp)(struct cam_periph *, union ccb *), u_int8_t tag_action, u_int8_t *inq_buf, u_int32_t inq_len, int evpd, u_int8_t page_code, u_int8_t sense_len, u_int32_t timeout)
#define SID_ADDITIONAL_LENGTH(iqd)
#define SIP_MEDIA_REMOVABLE
#define SVPD_ID_CODESET_BINARY
#define SHORT_INQUIRY_LENGTH
#define SID_QUAL_LU_CONNECTED
#define INQ_DATA_TQ_ENABLED(iqd)
#define SID_ANSI_REV(inq_data)
#define SID_QUAL_LU_OFFLINE
#define SID_QUAL(inq_data)
struct scsi_inquiry_pattern inq_pat
struct timeval last_reset
u_int32_t tag_delay_count
struct ata_params ident_data
struct scsi_inquiry_data inq_data
struct cam_periph * periph
int max_tagged_dev_openings
void(* cbfcnp)(struct cam_periph *, union ccb *)
u_int32_t base_transfer_speed
TAILQ_HEAD(, cam_periph) units
u_int8_t additional_length
xpt_proto_announce_func announce
xpt_alloc_device_func alloc_device
struct ccb_trans_settings cts
struct ccb_dev_advinfo cdai