summaryrefslogtreecommitdiffstats
path: root/sys/cam/scsi/scsi_all.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/scsi/scsi_all.c')
-rw-r--r--sys/cam/scsi/scsi_all.c28
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 *),
OpenPOWER on IntegriCloud