On Wed, Jun 15, 2011 at 01:27:03PM +1000, David Gwynne wrote:
> 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?
I have several sdmmc devices. What would I look for? i.e. what problem
does this fix?
.... Ken
>
> 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