ie, check if the VPD bit is set when an inquiry is issued and stop if it is. adds a free check for the cdblen there too.
i cant even ping my x60 atm, so i cant test. anyone else want to give it a spin? Index: sdmmc_scsi.c =================================================================== RCS file: /cvs/src/sys/dev/sdmmc/sdmmc_scsi.c,v retrieving revision 1.26 diff -u -p -r1.26 sdmmc_scsi.c --- sdmmc_scsi.c 25 Oct 2010 10:36:49 -0000 1.26 +++ sdmmc_scsi.c 15 Jun 2011 03:25:28 -0000 @@ -80,6 +80,7 @@ void *sdmmc_ccb_alloc(void *); void sdmmc_ccb_free(void *, void *); void sdmmc_scsi_cmd(struct scsi_xfer *); +void sdmmc_inquiry(struct scsi_xfer *); void sdmmc_start_xs(struct sdmmc_softc *, struct sdmmc_ccb *); void sdmmc_complete_xs(void *); void sdmmc_done_xs(struct sdmmc_ccb *); @@ -296,7 +297,6 @@ sdmmc_scsi_cmd(struct scsi_xfer *xs) struct sdmmc_softc *sc = link->adapter_softc; struct sdmmc_scsi_softc *scbus = sc->sc_scsibus; struct sdmmc_scsi_target *tgt = &scbus->sc_tgt[link->target]; - struct scsi_inquiry_data inq; struct scsi_read_cap_data rcd; u_int32_t blockno; u_int32_t blockcnt; @@ -327,17 +327,7 @@ sdmmc_scsi_cmd(struct scsi_xfer *xs) break; case INQUIRY: - bzero(&inq, sizeof inq); - inq.device = T_DIRECT; - inq.version = 2; - inq.response_format = 2; - inq.additional_length = 32; - strlcpy(inq.vendor, "SD/MMC ", sizeof(inq.vendor)); - snprintf(inq.product, sizeof(inq.product), - "Drive #%02d", link->target); - strlcpy(inq.revision, " ", sizeof(inq.revision)); - bcopy(&inq, xs->data, MIN(xs->datalen, sizeof inq)); - scsi_done(xs); + sdmmc_inquiry(xs); return; case TEST_UNIT_READY: @@ -381,6 +371,39 @@ sdmmc_scsi_cmd(struct scsi_xfer *xs) ccb->ccb_blockno = blockno; sdmmc_start_xs(sc, ccb); +} + +void +sdmmc_inquiry(struct scsi_xfer *xs) +{ + struct scsi_link *link = xs->sc_link; + struct scsi_inquiry_data inq; + struct scsi_inquiry *cdb = (struct scsi_inquiry *)xs->cmd; + + if (xs->cmdlen != sizeof(*cdb)) { + xs->error = XS_DRIVER_STUFFUP; + goto done; + } + + if (ISSET(cdb->flags, SI_EVPD)) { + xs->error = XS_DRIVER_STUFFUP; + goto done; + } + + bzero(&inq, sizeof inq); + inq.device = T_DIRECT; + inq.version = 2; + inq.response_format = 2; + inq.additional_length = 32; + strlcpy(inq.vendor, "SD/MMC ", sizeof(inq.vendor)); + snprintf(inq.product, sizeof(inq.product), + "Drive #%02d", link->target); + strlcpy(inq.revision, " ", sizeof(inq.revision)); + + bcopy(&inq, xs->data, MIN(xs->datalen, sizeof(inq))); + +done: + scsi_done(xs); } void