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

Reply via email to