Re: new device - agfa af5080MS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux