Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1598737 > unrolled thread

[PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk

Started bySamuel Thibault <samuel.thibault@ens-lyon.org>
First post2017-03-12 21:20 +0100
Last post2017-03-14 02:50 +0100
Articles 9 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-03-12 21:20 +0100
    Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Alan Stern <stern@rowland.harvard.edu> - 2017-03-12 22:20 +0100
      Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-03-12 22:50 +0100
      Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Dave Mielke <dave@mielke.cc> - 2017-03-12 23:00 +0100
        Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Alan Stern <stern@rowland.harvard.edu> - 2017-03-13 02:40 +0100
          Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Dave Mielke <dave@mielke.cc> - 2017-03-13 02:50 +0100
            Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Alan Stern <stern@rowland.harvard.edu> - 2017-03-13 02:50 +0100
              Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Samuel Thibault <samuel.thibault@ens-lyon.org> - 2017-03-13 08:10 +0100
                Re: [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk Alan Stern <stern@rowland.harvard.edu> - 2017-03-14 02:50 +0100

#1598737 — [PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-03-12 21:20 +0100
Subject[PATCH] usb-core: Add MS_INTR_BINTERVAL USB quirk
Message-ID<tki89-6tx-1@gated-at.bofh.it>
Some USB 2.0 devices erroneously report millisecond values in
bInterval. The generic config code manages to catch most of them,
but in some cases it's not completely enough.

The case at stake here is a USB 2.0 braille device, which wants to
announce 10ms and thus sets bInterval to 10, but with the USB 2.0
computation that yields to 64ms.  It happens that one can type fast
enough to reach this interval and get the device buffers overflown,
leading to problematic latencies.  The generic config code does not
catch this case because the 64ms is considered a sane enough value.

This change thus adds a USB_QUIRK_MS_INTR_BINTERVAL quirk to mark
devices which actually report milliseconds in bInterval, and marks
Vario Ultra devices as needing it.

Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

--- a/include/linux/usb/quirks.h
+++ b/include/linux/usb/quirks.h
@@ -50,4 +50,10 @@
 /* device can't handle Link Power Management */
 #define USB_QUIRK_NO_LPM			BIT(10)
 
+/*
+ * Device reports its bInterval as milliseconds instead of the
+ * USB 2.0 calculation.
+ */
+#define USB_QUIRK_MS_INTR_BINTERVAL		BIT(11)
+
 #endif /* __LINUX_USB_QUIRKS_H */
--- a/drivers/usb/core/config.c
+++ b/drivers/usb/core/config.c
@@ -280,6 +280,14 @@ static int usb_parse_endpoint(struct dev
 
 			/*
 			 * Adjust bInterval for quirked devices.
+			 */
+			/*
+			 * This quirk fixes bIntervals reported in ms.
+			 */
+			if (to_usb_device(ddev)->quirks &
+				USB_QUIRK_MS_INTR_BINTERVAL)
+				i = j = n;
+			/*
 			 * This quirk fixes bIntervals reported in
 			 * linear microframes.
 			 */
--- a/drivers/usb/core/quirks.c
+++ b/drivers/usb/core/quirks.c
@@ -218,6 +218,14 @@ static const struct usb_device_id usb_qu
 	/* INTEL VALUE SSD */
 	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
 
+	/* Baum Vario Ultra */
+	{ USB_DEVICE(0x0904, 0x6101), .driver_info =
+			USB_QUIRK_MS_INTR_BINTERVAL },
+	{ USB_DEVICE(0x0904, 0x6102), .driver_info =
+			USB_QUIRK_MS_INTR_BINTERVAL },
+	{ USB_DEVICE(0x0904, 0x6103), .driver_info =
+			USB_QUIRK_MS_INTR_BINTERVAL },
+
 	{ }  /* terminating entry must be last */
 };
 

[toc] | [next] | [standalone]


#1598762

FromAlan Stern <stern@rowland.harvard.edu>
Date2017-03-12 22:20 +0100
Message-ID<tkj4d-77v-3@gated-at.bofh.it>
In reply to#1598737
On Sun, 12 Mar 2017, Samuel Thibault wrote:

> Some USB 2.0 devices erroneously report millisecond values in
> bInterval. The generic config code manages to catch most of them,
> but in some cases it's not completely enough.
> 
> The case at stake here is a USB 2.0 braille device, which wants to
> announce 10ms and thus sets bInterval to 10, but with the USB 2.0
> computation that yields to 64ms.  It happens that one can type fast
> enough to reach this interval and get the device buffers overflown,
> leading to problematic latencies.  The generic config code does not
> catch this case because the 64ms is considered a sane enough value.

Interesting.  This is a high-speed device that mistakenly uses the 
low/full-speed encoding for an interrupt bInterval value?

That's pretty unusual.  Most HID devices (which includes the Braille
devices I have heard of) run at low speed, and a few of them run at 
full speed.  I can't remember any running at high speed.

> This change thus adds a USB_QUIRK_MS_INTR_BINTERVAL quirk to mark
> devices which actually report milliseconds in bInterval, and marks
> Vario Ultra devices as needing it.
> 
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
> 
> --- a/include/linux/usb/quirks.h
> +++ b/include/linux/usb/quirks.h
> @@ -50,4 +50,10 @@
>  /* device can't handle Link Power Management */
>  #define USB_QUIRK_NO_LPM			BIT(10)
>  
> +/*
> + * Device reports its bInterval as milliseconds instead of the

This should be described as "linear frames", not "milliseconds", and 
its name should be USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL.

> + * USB 2.0 calculation.
> + */
> +#define USB_QUIRK_MS_INTR_BINTERVAL		BIT(11)
> +
>  #endif /* __LINUX_USB_QUIRKS_H */
> --- a/drivers/usb/core/config.c
> +++ b/drivers/usb/core/config.c
> @@ -280,6 +280,14 @@ static int usb_parse_endpoint(struct dev
>  
>  			/*
>  			 * Adjust bInterval for quirked devices.
> +			 */
> +			/*
> +			 * This quirk fixes bIntervals reported in ms.
> +			 */
> +			if (to_usb_device(ddev)->quirks &
> +				USB_QUIRK_MS_INTR_BINTERVAL)
> +				i = j = n;

You want to use the bInterval value the device intended to provide, not
a default value.  This should be like the microframe case, with the
value increased by 3:

				n = clamp(fls(d->bInterval) + 3, i, j);
				i = j = n;

> +			/*
>  			 * This quirk fixes bIntervals reported in
>  			 * linear microframes.
>  			 */
> --- a/drivers/usb/core/quirks.c
> +++ b/drivers/usb/core/quirks.c
> @@ -218,6 +218,14 @@ static const struct usb_device_id usb_qu
>  	/* INTEL VALUE SSD */
>  	{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
>  
> +	/* Baum Vario Ultra */
> +	{ USB_DEVICE(0x0904, 0x6101), .driver_info =
> +			USB_QUIRK_MS_INTR_BINTERVAL },
> +	{ USB_DEVICE(0x0904, 0x6102), .driver_info =
> +			USB_QUIRK_MS_INTR_BINTERVAL },
> +	{ USB_DEVICE(0x0904, 0x6103), .driver_info =
> +			USB_QUIRK_MS_INTR_BINTERVAL },

You didn't read the comment at the start of the file.  :-)  This list
is supposed to remain sorted by vendor and product ID.

Alan Stern

> +
>  	{ }  /* terminating entry must be last */
>  };
>  
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

[toc] | [prev] | [next] | [standalone]


#1598769

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-03-12 22:50 +0100
Message-ID<tkjxg-7k3-21@gated-at.bofh.it>
In reply to#1598762
Alan Stern, on dim. 12 mars 2017 17:18:51 -0400, wrote:
> Interesting.  This is a high-speed device that mistakenly uses the 
> low/full-speed encoding for an interrupt bInterval value?

Yes...

> That's pretty unusual.  Most HID devices (which includes the Braille
> devices I have heard of) run at low speed, and a few of them run at 
> full speed.  I can't remember any running at high speed.

That's the first device for which we have such issue.  We'll try to
check whether some other devices need the same quirk.

> > +			 */
> > +			/*
> > +			 * This quirk fixes bIntervals reported in ms.
> > +			 */
> > +			if (to_usb_device(ddev)->quirks &
> > +				USB_QUIRK_MS_INTR_BINTERVAL)
> > +				i = j = n;
> 
> You want to use the bInterval value the device intended to provide, not
> a default value.

n is alreay computed as such above, but OK :) (and better clamp anyway)

> > +	/* Baum Vario Ultra */
> > +	{ USB_DEVICE(0x0904, 0x6101), .driver_info =
> > +			USB_QUIRK_MS_INTR_BINTERVAL },
> > +	{ USB_DEVICE(0x0904, 0x6102), .driver_info =
> > +			USB_QUIRK_MS_INTR_BINTERVAL },
> > +	{ USB_DEVICE(0x0904, 0x6103), .driver_info =
> > +			USB_QUIRK_MS_INTR_BINTERVAL },
> 
> You didn't read the comment at the start of the file.  :-)  This list
> is supposed to remain sorted by vendor and product ID.

D'oh, sorry :)

Samuel

[toc] | [prev] | [next] | [standalone]


#1598771

FromDave Mielke <dave@mielke.cc>
Date2017-03-12 23:00 +0100
Message-ID<tkjGV-7nz-1@gated-at.bofh.it>
In reply to#1598762
[quoted lines by Alan Stern on 2017/03/12 at 17:18 -0400]

>Interesting.  This is a high-speed device that mistakenly uses the 
>low/full-speed encoding for an interrupt bInterval value?

Yes.

>That's pretty unusual.  Most HID devices (which includes the Braille
>devices I have heard of) run at low speed, and a few of them run at 
>full speed.  I can't remember any running at high speed.

According to my collection of data, 5 say 1.00, 15 say 1.1, and 21 say 2.0.

-- 
Dave Mielke           | 2213 Fox Crescent | The Bible is the very Word of God.
Phone: 1-613-726-0014 | Ottawa, Ontario   | http://Mielke.cc/bible/
EMail: Dave@Mielke.cc | Canada  K2A 1H7   | http://FamilyRadio.org/

[toc] | [prev] | [next] | [standalone]


#1598809

FromAlan Stern <stern@rowland.harvard.edu>
Date2017-03-13 02:40 +0100
Message-ID<tkn7P-1ma-1@gated-at.bofh.it>
In reply to#1598771
On Sun, 12 Mar 2017, Dave Mielke wrote:

> [quoted lines by Alan Stern on 2017/03/12 at 17:18 -0400]
> 
> >Interesting.  This is a high-speed device that mistakenly uses the 
> >low/full-speed encoding for an interrupt bInterval value?
> 
> Yes.
> 
> >That's pretty unusual.  Most HID devices (which includes the Braille
> >devices I have heard of) run at low speed, and a few of them run at 
> >full speed.  I can't remember any running at high speed.
> 
> According to my collection of data, 5 say 1.00, 15 say 1.1, and 21 say 2.0.

A device's speed is only partially related to its USB version.  A
USB-1.1 device can run at low speed or full speed.  A USB-2 device can
run at low, full, or high speed.  And a USB-3 device can run at low,
full, high, or Super speed.

Alan Stern

[toc] | [prev] | [next] | [standalone]


#1598812

FromDave Mielke <dave@mielke.cc>
Date2017-03-13 02:50 +0100
Message-ID<tknhv-1pV-1@gated-at.bofh.it>
In reply to#1598809
[quoted lines by Alan Stern on 2017/03/12 at 21:31 -0400]

>A device's speed is only partially related to its USB version.  A
>USB-1.1 device can run at low speed or full speed.  A USB-2 device can
>run at low, full, or high speed.  And a USB-3 device can run at low,
>full, high, or Super speed.

Yes, I did know this, so maybe I misunderstood what you were wondering about. 
Were you wondering why 64ms was too long?

-- 
Dave Mielke           | 2213 Fox Crescent | The Bible is the very Word of God.
Phone: 1-613-726-0014 | Ottawa, Ontario   | http://Mielke.cc/bible/
EMail: Dave@Mielke.cc | Canada  K2A 1H7   | http://FamilyRadio.org/

[toc] | [prev] | [next] | [standalone]


#1598813

FromAlan Stern <stern@rowland.harvard.edu>
Date2017-03-13 02:50 +0100
Message-ID<tknhv-1pV-5@gated-at.bofh.it>
In reply to#1598812
On Sun, 12 Mar 2017, Dave Mielke wrote:

> [quoted lines by Alan Stern on 2017/03/12 at 21:31 -0400]
> 
> >A device's speed is only partially related to its USB version.  A
> >USB-1.1 device can run at low speed or full speed.  A USB-2 device can
> >run at low, full, or high speed.  And a USB-3 device can run at low,
> >full, high, or Super speed.
> 
> Yes, I did know this, so maybe I misunderstood what you were wondering about. 
> Were you wondering why 64ms was too long?

No, I was wondering why an HID device would run at high speed.  Both
you and Samuel implied that this was because it was a USB-2 device.  
But that is not an adequate answer, because it is perfectly valid for a 
USB-2 device to run at full speed.

Alan Stern

[toc] | [prev] | [next] | [standalone]


#1598906

FromSamuel Thibault <samuel.thibault@ens-lyon.org>
Date2017-03-13 08:10 +0100
Message-ID<tkshb-5nd-7@gated-at.bofh.it>
In reply to#1598813
Alan Stern, on dim. 12 mars 2017 21:40:33 -0400, wrote:
> On Sun, 12 Mar 2017, Dave Mielke wrote:
> > [quoted lines by Alan Stern on 2017/03/12 at 21:31 -0400]
> > 
> > >A device's speed is only partially related to its USB version.  A
> > >USB-1.1 device can run at low speed or full speed.  A USB-2 device can
> > >run at low, full, or high speed.  And a USB-3 device can run at low,
> > >full, high, or Super speed.
> > 
> > Yes, I did know this, so maybe I misunderstood what you were wondering about. 
> > Were you wondering why 64ms was too long?
> 
> No, I was wondering why an HID device would run at high speed.  Both
> you and Samuel implied that this was because it was a USB-2 device.  
> But that is not an adequate answer, because it is perfectly valid for a 
> USB-2 device to run at full speed.

to_usb_device(ddev)->speed really is USB_SPEED_HIGH, otherwise the quirk
wouldn't work :)

Samuel

[toc] | [prev] | [next] | [standalone]


#1599980

FromAlan Stern <stern@rowland.harvard.edu>
Date2017-03-14 02:50 +0100
Message-ID<tkJL3-1e8-7@gated-at.bofh.it>
In reply to#1598906
On Mon, 13 Mar 2017, Samuel Thibault wrote:

> Alan Stern, on dim. 12 mars 2017 21:40:33 -0400, wrote:
> > On Sun, 12 Mar 2017, Dave Mielke wrote:
> > > [quoted lines by Alan Stern on 2017/03/12 at 21:31 -0400]
> > > 
> > > >A device's speed is only partially related to its USB version.  A
> > > >USB-1.1 device can run at low speed or full speed.  A USB-2 device can
> > > >run at low, full, or high speed.  And a USB-3 device can run at low,
> > > >full, high, or Super speed.
> > > 
> > > Yes, I did know this, so maybe I misunderstood what you were wondering about. 
> > > Were you wondering why 64ms was too long?
> > 
> > No, I was wondering why an HID device would run at high speed.  Both
> > you and Samuel implied that this was because it was a USB-2 device.  
> > But that is not an adequate answer, because it is perfectly valid for a 
> > USB-2 device to run at full speed.
> 
> to_usb_device(ddev)->speed really is USB_SPEED_HIGH, otherwise the quirk
> wouldn't work :)

Indeed; I believe you.  It's just odd and a little noteworthy, that's
all.

Alan Stern

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web