int sd_ioctl_inquiry(struct sd_softc *sc, struct dk_inquiry *di) { struct scsi_vpd_serial *vpd; vpd = dma_alloc(sizeof(*vpd), PR_WAITOK | PR_ZERO); bzero(di, sizeof(struct dk_inquiry)); scsi_strvis(di->vendor, sc->sc_link->inqdata.vendor, sizeof(sc->sc_link->inqdata.vendor)); scsi_strvis(di->product, sc->sc_link->inqdata.product, sizeof(sc->sc_link->inqdata.product)); scsi_strvis(di->revision, sc->sc_link->inqdata.revision, sizeof(sc->sc_link->inqdata.revision)); /* the serial vpd page is optional */ if (scsi_inquire_vpd(sc->sc_link, vpd, sizeof(*vpd), SI_PG_SERIAL, 0) == 0) scsi_strvis(di->serial, vpd->serial, sizeof(vpd->serial)); else strlcpy(di->serial, "(unknown)", sizeof(vpd->serial)); dma_free(vpd, sizeof(*vpd)); return (0); }
int emc_inquiry(struct emc_softc *sc, char *model, char *serial) { u_int8_t *buffer; struct scsi_inquiry *cdb; struct scsi_xfer *xs; size_t length; int error; u_int8_t slen, mlen; length = MIN(sc->sc_path.p_link->inqdata.additional_length + 5, 255); if (length < 160) { printf("%s: FC (Legacy)\n"); return (0); } buffer = dma_alloc(length, PR_WAITOK); xs = scsi_xs_get(sc->sc_path.p_link, scsi_autoconf); if (xs == NULL) { error = EBUSY; goto done; } cdb = (struct scsi_inquiry *)xs->cmd; cdb->opcode = INQUIRY; _lto2b(length, cdb->length); xs->cmdlen = sizeof(*cdb); xs->flags |= SCSI_DATA_IN; xs->data = buffer; xs->datalen = length; error = scsi_xs_sync(xs); scsi_xs_put(xs); if (error != 0) goto done; slen = buffer[160]; if (slen == 0 || slen + 161 > length) { error = EIO; goto done; } mlen = buffer[99]; if (mlen == 0 || slen + mlen + 161 > length) { error = EIO; goto done; } scsi_strvis(serial, buffer + 161, slen); scsi_strvis(model, buffer + 161 + slen, mlen); error = 0; done: dma_free(buffer, length); return (error); }
int emc_inquiry(struct emc_softc *sc, char *model, char *serial) { u_int8_t buffer[255]; struct scsi_inquiry *cdb; struct scsi_xfer *xs; size_t length; int error; u_int8_t slen, mlen; length = MIN(sc->sc_path.p_link->inqdata.additional_length + 5, sizeof(buffer)); if (length < 160) { printf("%s: FC (Legacy)\n"); return (0); } xs = scsi_xs_get(sc->sc_path.p_link, scsi_autoconf); if (xs == NULL) return (EBUSY); cdb = (struct scsi_inquiry *)xs->cmd; cdb->opcode = INQUIRY; _lto2b(length, cdb->length); xs->cmdlen = sizeof(*cdb); xs->flags |= SCSI_DATA_IN; xs->data = buffer; xs->datalen = length; error = scsi_xs_sync(xs); scsi_xs_put(xs); if (error != 0) return (error); slen = buffer[160]; if (slen == 0 || slen + 161 > length) return (EIO); mlen = buffer[99]; if (mlen == 0 || slen + mlen + 161 > length) return (EIO); scsi_strvis(serial, buffer + 161, slen); scsi_strvis(model, buffer + 161 + slen, mlen); return (0); }