Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 316861
b: refs/heads/master
c: 81df2d5
h: refs/heads/master
i:
  316859: bcfb695
v: v3
  • Loading branch information
Bjørn Mork authored and Greg Kroah-Hartman committed Jun 13, 2012
1 parent b702357 commit 29e8fd4
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 8 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: 7e97243c2080ecae7129e83635227fdebd4feef6
refs/heads/master: 81df2d594340dcb6d1a02191976be88a1ca8120c
9 changes: 7 additions & 2 deletions trunk/drivers/usb/core/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -622,14 +622,15 @@ int usb_match_one_id(struct usb_interface *interface,
if (!usb_match_device(dev, id))
return 0;

/* The interface class, subclass, and protocol should never be
/* The interface class, subclass, protocol and number should never be
* checked for a match if the device class is Vendor Specific,
* unless the match record specifies the Vendor ID. */
if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC &&
!(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
(id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS |
USB_DEVICE_ID_MATCH_INT_SUBCLASS |
USB_DEVICE_ID_MATCH_INT_PROTOCOL)))
USB_DEVICE_ID_MATCH_INT_PROTOCOL |
USB_DEVICE_ID_MATCH_INT_NUMBER)))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&
Expand All @@ -644,6 +645,10 @@ int usb_match_one_id(struct usb_interface *interface,
(id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))
return 0;

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER) &&
(id->bInterfaceNumber != intf->desc.bInterfaceNumber))
return 0;

return 1;
}
EXPORT_SYMBOL_GPL(usb_match_one_id);
Expand Down
5 changes: 3 additions & 2 deletions trunk/drivers/usb/core/message.c
Original file line number Diff line number Diff line change
Expand Up @@ -1559,7 +1559,7 @@ static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env)

if (add_uevent_var(env,
"MODALIAS=usb:"
"v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02X",
"v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic%02Xisc%02Xip%02Xin%02X",
le16_to_cpu(usb_dev->descriptor.idVendor),
le16_to_cpu(usb_dev->descriptor.idProduct),
le16_to_cpu(usb_dev->descriptor.bcdDevice),
Expand All @@ -1568,7 +1568,8 @@ static int usb_if_uevent(struct device *dev, struct kobj_uevent_env *env)
usb_dev->descriptor.bDeviceProtocol,
alt->desc.bInterfaceClass,
alt->desc.bInterfaceSubClass,
alt->desc.bInterfaceProtocol))
alt->desc.bInterfaceProtocol,
alt->desc.bInterfaceNumber))
return -ENOMEM;

return 0;
Expand Down
5 changes: 3 additions & 2 deletions trunk/drivers/usb/core/sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -840,7 +840,7 @@ static ssize_t show_modalias(struct device *dev,
alt = intf->cur_altsetting;

return sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02X"
"ic%02Xisc%02Xip%02X\n",
"ic%02Xisc%02Xip%02Xin%02X\n",
le16_to_cpu(udev->descriptor.idVendor),
le16_to_cpu(udev->descriptor.idProduct),
le16_to_cpu(udev->descriptor.bcdDevice),
Expand All @@ -849,7 +849,8 @@ static ssize_t show_modalias(struct device *dev,
udev->descriptor.bDeviceProtocol,
alt->desc.bInterfaceClass,
alt->desc.bInterfaceSubClass,
alt->desc.bInterfaceProtocol);
alt->desc.bInterfaceProtocol,
alt->desc.bInterfaceNumber);
}
static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL);

Expand Down
7 changes: 7 additions & 0 deletions trunk/include/linux/mod_devicetable.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ struct ieee1394_device_id {
* of a given interface; other interfaces may support other classes.
* @bInterfaceSubClass: Subclass of interface; associated with bInterfaceClass.
* @bInterfaceProtocol: Protocol of interface; associated with bInterfaceClass.
* @bInterfaceNumber: Number of interface; composite devices may use
* fixed interface numbers to differentiate between vendor-specific
* interfaces.
* @driver_info: Holds information used by the driver. Usually it holds
* a pointer to a descriptor understood by the driver, or perhaps
* device flags.
Expand Down Expand Up @@ -115,6 +118,9 @@ struct usb_device_id {
__u8 bInterfaceSubClass;
__u8 bInterfaceProtocol;

/* Used for vendor-specific interface matches */
__u8 bInterfaceNumber;

/* not matched against */
kernel_ulong_t driver_info;
};
Expand All @@ -130,6 +136,7 @@ struct usb_device_id {
#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
#define USB_DEVICE_ID_MATCH_INT_NUMBER 0x0400

#define HID_ANY_ID (~0)
#define HID_BUS_ANY 0xffff
Expand Down
16 changes: 16 additions & 0 deletions trunk/include/linux/usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,22 @@ static inline int usb_make_path(struct usb_device *dev, char *buf, size_t size)
.idProduct = (prod), \
.bInterfaceProtocol = (pr)

/**
* USB_DEVICE_INTERFACE_NUMBER - describe a usb device with a specific interface number
* @vend: the 16 bit USB Vendor ID
* @prod: the 16 bit USB Product ID
* @num: bInterfaceNumber value
*
* This macro is used to create a struct usb_device_id that matches a
* specific interface number of devices.
*/
#define USB_DEVICE_INTERFACE_NUMBER(vend, prod, num) \
.match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
USB_DEVICE_ID_MATCH_INT_NUMBER, \
.idVendor = (vend), \
.idProduct = (prod), \
.bInterfaceNumber = (num)

/**
* USB_DEVICE_INFO - macro used to describe a class of usb devices
* @cl: bDeviceClass value
Expand Down
5 changes: 4 additions & 1 deletion trunk/scripts/mod/file2alias.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ static void device_id_check(const char *modname, const char *device_id,
}

/* USB is special because the bcdDevice can be matched against a numeric range */
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipN" */
/* Looks like "usb:vNpNdNdcNdscNdpNicNiscNipNinN" */
static void do_usb_entry(struct usb_device_id *id,
unsigned int bcdDevice_initial, int bcdDevice_initial_digits,
unsigned char range_lo, unsigned char range_hi,
Expand Down Expand Up @@ -210,6 +210,9 @@ static void do_usb_entry(struct usb_device_id *id,
ADD(alias, "ip",
id->match_flags&USB_DEVICE_ID_MATCH_INT_PROTOCOL,
id->bInterfaceProtocol);
ADD(alias, "in",
id->match_flags&USB_DEVICE_ID_MATCH_INT_NUMBER,
id->bInterfaceNumber);

add_wildcard(alias);
buf_printf(&mod->dev_table_buf,
Expand Down

0 comments on commit 29e8fd4

Please sign in to comment.