Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e2ce4f9 authored by Henk Vergonet's avatar Henk Vergonet Committed by Greg Kroah-Hartman
Browse files

[PATCH] drivers/usb/input/yealink.c: Cleanup device matching code



This should fix things mentioned below:

	"I was curious why my firewall was loading a 'phone driver'.
	It turns out that the probing in the yealink driver is
	a little too assuming..

	static struct usb_device_id usb_table [] = {
	    { USB_INTERFACE_INFO(USB_CLASS_HID, 0, 0) },
	    { }
	};

	So it picked up my UPS, and loaded the driver.
	Whilst no harm came, because it later checks the vendor/product IDs,
	this driver should probably be rewritten to only probe
	for the device IDs it actually knows about.

	Dave"

Signed-off-by: default avatarHenk Vergonet <henk.vergonet@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 09c280a2
Loading
Loading
Loading
Loading
+19 −27
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@
#include "map_to_7segment.h"
#include "yealink.h"

#define DRIVER_VERSION "yld-20050816"
#define DRIVER_VERSION "yld-20051230"
#define DRIVER_AUTHOR "Henk Vergonet"
#define DRIVER_DESC "Yealink phone driver"

@@ -786,16 +786,25 @@ static struct attribute_group yld_attr_group = {
 * Linux interface and usb initialisation
 ******************************************************************************/

static const struct yld_device {
	u16 idVendor;
	u16 idProduct;
struct driver_info {
	char *name;
} yld_device[] = {
	{ 0x6993, 0xb001, "Yealink usb-p1k" },
};

static struct usb_device_id usb_table [] = {
	{ USB_INTERFACE_INFO(USB_CLASS_HID, 0, 0) },
static const struct driver_info info_P1K = {
	.name	= "Yealink usb-p1k",
};

static const struct usb_device_id usb_table [] = {
	{
		.match_flags		= USB_DEVICE_ID_MATCH_DEVICE |
						USB_DEVICE_ID_MATCH_INT_INFO,
		.idVendor		= 0x6993,
		.idProduct		= 0xb001,
		.bInterfaceClass	= USB_CLASS_HID,
		.bInterfaceSubClass	= 0,
		.bInterfaceProtocol	= 0,
		.driver_info		= (kernel_ulong_t)&info_P1K
	},
	{ }
};

@@ -842,33 +851,16 @@ static void usb_disconnect(struct usb_interface *intf)
	usb_cleanup(yld, 0);
}

static int usb_match(struct usb_device *udev)
{
	int i;
	u16 idVendor = le16_to_cpu(udev->descriptor.idVendor);
	u16 idProduct = le16_to_cpu(udev->descriptor.idProduct);

	for (i = 0; i < ARRAY_SIZE(yld_device); i++) {
		if ((idVendor == yld_device[i].idVendor) &&
		    (idProduct == yld_device[i].idProduct))
			return i;
	}
	return -ENODEV;
}

static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
	struct usb_device *udev = interface_to_usbdev (intf);
	struct driver_info *nfo = (struct driver_info *)id->driver_info;
	struct usb_host_interface *interface;
	struct usb_endpoint_descriptor *endpoint;
	struct yealink_dev *yld;
	struct input_dev *input_dev;
	int ret, pipe, i;

	i = usb_match(udev);
	if (i < 0)
		return -ENODEV;

	interface = intf->cur_altsetting;
	endpoint = &interface->endpoint[0].desc;
	if (!(endpoint->bEndpointAddress & USB_DIR_IN))
@@ -948,7 +940,7 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
	strlcat(yld->phys,  "/input0", sizeof(yld->phys));

	/* register settings for the input device */
	input_dev->name = yld_device[i].name;
	input_dev->name = nfo->name;
	input_dev->phys = yld->phys;
	usb_to_input_id(udev, &input_dev->id);
	input_dev->cdev.dev = &intf->dev;