Index: sys/cam/cam_ccb.h =================================================================== --- sys/cam/cam_ccb.h +++ sys/cam/cam_ccb.h @@ -1269,6 +1269,8 @@ uint32_t flags; #define CDAI_FLAG_NONE 0x0 /* No flags set */ #define CDAI_FLAG_STORE 0x1 /* If set, action becomes store */ +#define CDAI_FLAG_PER_TYPE_MASK 0xffff0000 /* Per-request type extra data */ +#define CDAI_FLAG_PER_TYPE_SHIFT 16 uint32_t buftype; /* IN: Type of data being requested */ /* NB: buftype is interpreted on a per-transport basis */ #define CDAI_TYPE_SCSI_DEVID 1 @@ -1279,6 +1281,7 @@ #define CDAI_TYPE_NVME_CNTRL 6 /* NVMe Identify Controller data */ #define CDAI_TYPE_NVME_NS 7 /* NVMe Identify Namespace data */ #define CDAI_TYPE_MMC_PARAMS 8 /* MMC/SD ident */ +#define CDAI_TYPE_VPD_PAGE 9 /* Fetch cached VPD page extra in page no */ off_t bufsiz; /* IN: Size of external buffer */ #define CAM_SCSI_DEVID_MAXLEN 65536 /* length in buffer is an uint16_t */ off_t provsiz; /* OUT: Size required/used */ Index: sys/cam/scsi/scsi_xpt.c =================================================================== --- sys/cam/scsi/scsi_xpt.c +++ sys/cam/scsi/scsi_xpt.c @@ -2611,6 +2611,23 @@ amt = cdai->bufsiz; memcpy(cdai->buf, device->ext_inq, amt); break; + case CDAI_TYPE_VPD_PAGE: + /* + * We fetch and cache some VPD pages during probe, if + * available. We don't allow changing them. + */ + if (cdai->flags & CDAI_FLAG_STORE) + return; + /* Only support page 0 at this time */ + if ((cdai->flags & CDAI_FLAG_PER_TYPE_MASK) >> + CDAI_FLAG_PER_TYPE_SHIFT != 0) + return; + cdai->provsiz = device->supported_vpds_len; + if (device->ext_inq_len == 0) + break; + amt = imin(device->supported_vpds_len, cdai->bufsiz); + memcpy(cdai->buf, device->supported_vpds, amt); + break; default: return; }