Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 195335
b: refs/heads/master
c: 317149c
h: refs/heads/master
i:
  195333: a6042b6
  195331: 9dea06f
  195327: 184b646
v: v3
  • Loading branch information
Hans de Goede authored and Greg Kroah-Hartman committed May 20, 2010
1 parent d9ca0c3 commit 1322dba
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7f0ae3a8eeb7f231dc99cee7c871ba64e07ebefe
refs/heads/master: 317149c655defedfaf432143b86a720cfc12a424
16 changes: 14 additions & 2 deletions trunk/drivers/usb/core/config.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <linux/usb.h>
#include <linux/usb/ch9.h>
#include <linux/usb/hcd.h>
#include <linux/usb/quirks.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
Expand Down Expand Up @@ -479,9 +480,10 @@ static int usb_parse_interface(struct device *ddev, int cfgno,
return buffer - buffer0 + i;
}

static int usb_parse_configuration(struct device *ddev, int cfgidx,
static int usb_parse_configuration(struct usb_device *dev, int cfgidx,
struct usb_host_config *config, unsigned char *buffer, int size)
{
struct device *ddev = &dev->dev;
unsigned char *buffer0 = buffer;
int cfgno;
int nintf, nintf_orig;
Expand Down Expand Up @@ -550,6 +552,16 @@ static int usb_parse_configuration(struct device *ddev, int cfgidx,
}

inum = d->bInterfaceNumber;

if ((dev->quirks & USB_QUIRK_HONOR_BNUMINTERFACES) &&
n >= nintf_orig) {
dev_warn(ddev, "config %d has more interface "
"descriptors, than it declares in "
"bNumInterfaces, ignoring interface "
"number: %d\n", cfgno, inum);
continue;
}

if (inum >= nintf_orig)
dev_warn(ddev, "config %d has an invalid "
"interface number: %d but max is %d\n",
Expand Down Expand Up @@ -801,7 +813,7 @@ int usb_get_configuration(struct usb_device *dev)

dev->rawdescriptors[cfgno] = bigbuffer;

result = usb_parse_configuration(&dev->dev, cfgno,
result = usb_parse_configuration(dev, cfgno,
&dev->config[cfgno], bigbuffer, length);
if (result < 0) {
++cfgno;
Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/usb/core/quirks.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ static const struct usb_device_id usb_quirk_list[] = {
/* SKYMEDI USB_DRIVE */
{ USB_DEVICE(0x1516, 0x8628), .driver_info = USB_QUIRK_RESET_RESUME },

/* BUILDWIN Photo Frame */
{ USB_DEVICE(0x1908, 0x1315), .driver_info =
USB_QUIRK_HONOR_BNUMINTERFACES },

/* INTEL VALUE SSD */
{ USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },

Expand Down
4 changes: 4 additions & 0 deletions trunk/include/linux/usb/quirks.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,8 @@
/*device will morph if reset, don't use reset for handling errors */
#define USB_QUIRK_RESET_MORPHS 0x00000010

/* device has more interface descriptions than the bNumInterfaces count,
and can't handle talking to these interfaces */
#define USB_QUIRK_HONOR_BNUMINTERFACES 0x00000020

#endif /* __LINUX_USB_QUIRKS_H */

0 comments on commit 1322dba

Please sign in to comment.