On 15/06/2011, at 9:52 PM, Kenneth R Westerback wrote:

> 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?

the kernel seems to ignore garbage vpd pages just fine, so you wont see
anything visible in dmesg. if you run
https://svn.itee.uq.edu.au/repo/openbsd-scsidump/ against a card before this
diff you'll see it try to parse the inquiry page as vpd pages cos thats what
the device returns. after the diff it should only show the basic inquiry since
thats all the code emulates.

dlg

>
> .... 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

Reply via email to