Alan, The BAD_SENSE patch looks good to me. ----- "Alan Stern" <stern@xxxxxxxxxxxxxxxxxxx> wrote: > From: "Alan Stern" <stern@xxxxxxxxxxxxxxxxxxx> > To: "Ben Efros" <ben@xxxxxxxxxxxxx>, "Daniel Kuku?a" <daniel.kuku@xxxxxxxxx> > Cc: "USB list" <linux-usb@xxxxxxxxxxxxxxx> > Sent: Saturday, December 5, 2009 1:16:41 PM GMT -08:00 US/Canada Pacific > Subject: Re: new device - agfa af5080MS > > On Thu, 3 Dec 2009, Ben Efros wrote: > > > I don't like the quirk idea, but it seems like the only appropriate > > > solution when the device has explicitly claimed to have more data > than > > 18. I'll prepare a patch in the next few days to make review and > > discuss. > > I beat you to it. :-) Daniel, try out the patch below and let us > know > how it works. > > Alan Stern > > > Index: usb-2.6/Documentation/kernel-parameters.txt > =================================================================== > --- usb-2.6.orig/Documentation/kernel-parameters.txt > +++ usb-2.6/Documentation/kernel-parameters.txt > @@ -2645,6 +2645,8 @@ and is between 256 and 4096 characters. > to a common usb-storage quirk flag as follows: > a = SANE_SENSE (collect more than 18 bytes > of sense data); > + b = BAD_SENSE (don't collect more than 18 > + bytes of sense data); > c = FIX_CAPACITY (decrease the reported > device capacity by one sector); > h = CAPACITY_HEURISTICS (decrease the > Index: usb-2.6/include/linux/usb_usual.h > =================================================================== > --- usb-2.6.orig/include/linux/usb_usual.h > +++ usb-2.6/include/linux/usb_usual.h > @@ -56,7 +56,9 @@ > US_FLAG(SANE_SENSE, 0x00008000) \ > /* Sane Sense (> 18 bytes) */ \ > US_FLAG(CAPACITY_OK, 0x00010000) \ > - /* READ CAPACITY response is correct */ > + /* READ CAPACITY response is correct */ \ > + US_FLAG(BAD_SENSE, 0x00020000) \ > + /* Bad Sense (never more than 18 bytes) */ > > #define US_FLAG(name, value) US_FL_##name = value , > enum { US_DO_ALL_FLAGS }; > Index: usb-2.6/drivers/usb/storage/usb.c > =================================================================== > --- usb-2.6.orig/drivers/usb/storage/usb.c > +++ usb-2.6/drivers/usb/storage/usb.c > @@ -463,6 +463,9 @@ static void adjust_quirks(struct us_data > case 'a': > f |= US_FL_SANE_SENSE; > break; > + case 'b': > + f |= US_FL_BAD_SENSE; > + break; > case 'c': > f |= US_FL_FIX_CAPACITY; > break; > Index: usb-2.6/drivers/usb/storage/transport.c > =================================================================== > --- usb-2.6.orig/drivers/usb/storage/transport.c > +++ usb-2.6/drivers/usb/storage/transport.c > @@ -666,10 +666,11 @@ void usb_stor_invoke_transport(struct sc > * to wait for at least one CHECK_CONDITION to determine > * SANE_SENSE support > */ > - if ((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) && > + if (unlikely((srb->cmnd[0] == ATA_16 || srb->cmnd[0] == ATA_12) && > result == USB_STOR_TRANSPORT_GOOD && > !(us->fflags & US_FL_SANE_SENSE) && > - !(srb->cmnd[2] & 0x20)) { > + !(us->fflags & US_FL_BAD_SENSE) && > + !(srb->cmnd[2] & 0x20))) { > US_DEBUGP("-- SAT supported, increasing auto-sense\n"); > us->fflags |= US_FL_SANE_SENSE; > } > @@ -718,6 +719,13 @@ Retry_Sense: > if (test_bit(US_FLIDX_TIMED_OUT, &us->dflags)) { > US_DEBUGP("-- auto-sense aborted\n"); > srb->result = DID_ABORT << 16; > + > + /* If SANE_SENSE caused this problem, disable it */ > + if ((us->fflags & US_FL_SANE_SENSE) && > + sense_size != US_SENSE_SIZE) { > + us->fflags &= ~US_FL_SANE_SENSE; > + us->fflags |= US_FL_BAD_SENSE; > + } > goto Handle_Errors; > } > > @@ -731,6 +739,8 @@ Retry_Sense: > sense_size != US_SENSE_SIZE) { > US_DEBUGP("-- auto-sense failure, retry small sense\n"); > sense_size = US_SENSE_SIZE; > + us->fflags &= ~US_FL_SANE_SENSE; > + us->fflags |= US_FL_BAD_SENSE; > goto Retry_Sense; > } > > @@ -754,6 +764,7 @@ Retry_Sense: > */ > if (srb->sense_buffer[7] > (US_SENSE_SIZE - 8) && > !(us->fflags & US_FL_SANE_SENSE) && > + !(us->fflags & US_FL_BAD_SENSE) && > (srb->sense_buffer[0] & 0x7C) == 0x70) { > US_DEBUGP("-- SANE_SENSE support enabled\n"); > us->fflags |= US_FL_SANE_SENSE; > Index: usb-2.6/drivers/usb/storage/unusual_devs.h > =================================================================== > --- usb-2.6.orig/drivers/usb/storage/unusual_devs.h > +++ usb-2.6/drivers/usb/storage/unusual_devs.h > @@ -818,6 +818,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0 > US_SC_DEVICE, US_PR_DEVICE, NULL, > US_FL_FIX_CAPACITY ), > > +/* Reported by Daniel Kuku <daniel.kuku@xxxxxxxxx> */ > +UNUSUAL_DEV( 0x067b, 0x1063, 0x0100, 0x0100, > + "Prolific Technology, Inc.", > + "Prolific Storage Gadget", > + US_SC_DEVICE, US_PR_DEVICE, NULL, > + US_FL_BAD_SENSE ), > + > /* Reported by Rogerio Brito <rbrito@xxxxxxxxxx> */ > UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001, > "Prolific Technology, Inc.", -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html