diff options
Diffstat (limited to 'sys/cam/scsi/scsi_all.c')
-rw-r--r-- | sys/cam/scsi/scsi_all.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/cam/scsi/scsi_all.c b/sys/cam/scsi/scsi_all.c index cddac5c..7ededa1 100644 --- a/sys/cam/scsi/scsi_all.c +++ b/sys/cam/scsi/scsi_all.c @@ -3552,6 +3552,34 @@ scsi_calc_syncparam(u_int period) return (period/400); } +uint8_t * +scsi_get_sas_addr(struct scsi_vpd_device_id *id, uint32_t len) +{ + uint8_t *bufp, *buf_end; + struct scsi_vpd_id_descriptor *descr; + struct scsi_vpd_id_naa_basic *naa; + + bufp = buf_end = (uint8_t *)id; + bufp += SVPD_DEVICE_ID_HDR_LEN; + buf_end += len; + while (bufp < buf_end) { + descr = (struct scsi_vpd_id_descriptor *)bufp; + bufp += SVPD_DEVICE_ID_DESC_HDR_LEN; + /* Right now, we only care about SAS NAA IEEE Reg addrs */ + if (((descr->id_type & SVPD_ID_PIV) != 0) + && (descr->proto_codeset >> SVPD_ID_PROTO_SHIFT) == + SCSI_PROTO_SAS + && (descr->id_type & SVPD_ID_TYPE_MASK) == SVPD_ID_TYPE_NAA){ + naa = (struct scsi_vpd_id_naa_basic *)bufp; + if ((naa->naa >> 4) == SVPD_ID_NAA_IEEE_REG) + return bufp; + } + bufp += descr->length; + } + + return NULL; +} + void scsi_test_unit_ready(struct ccb_scsiio *csio, u_int32_t retries, void (*cbfcnp)(struct cam_periph *, union ccb *), |