Re: "permanently" unbind a device from a driver?

Jiri Kosina
2009-01-29T09:43:20Z

On Tue, 27 Jan 2009, Greg KH wrote:

> > Oh, I didn't know. In fact, that's exactly what I was asking in my
> > first email in this thread - to have some module parameter or a sysfs
> > file which can be touched to stop the module from claiming the device.
> > This also helps to debug it, to know the right bits to use.. which I
> > don't know... ;)
> There is some way to do this, but I can't recall how at the moment.
> Try asking the HID maintainer about this.

There is a 'quirks=' parameter that can be passed to the usbhid driver.
Unfortunately the need for IGNORE_QUIRK went away when the whole hid stuff
got converted to proper bus with proper drivers.

But for backward userspace compatibility we want to have the
HID_IGNORE_QUIRK in place, solely for the purpose of users being able to
specify it during the module load, I agree. I currently have this queued
in my tree.

diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index f0a0f72..eed05a3 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -711,6 +711,9 @@ static int usbhid_parse(struct hid_device *hid)
quirks = usbhid_lookup_quirk(le16_to_cpu(dev->descriptor.idVendor),
le16_to_cpu(dev->descriptor.idProduct));

+ if (quirks & HID_QUIRK_IGNORE)
+ return -ENODEV;
+
/* Many keyboards and mice don't like to be polled for reports,
* so we will always set the HID_QUIRK_NOGET flag for them. */
if (interface->desc.bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) {
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 81aa84d..da481b3 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -270,6 +270,7 @@ struct hid_item {

#define HID_QUIRK_INVERT 0x00000001
#define HID_QUIRK_NOTOUCH 0x00000002
+#define HID_QUIRK_IGNORE 0x00000004
#define HID_QUIRK_NOGET 0x00000008
#define HID_QUIRK_BADPAD 0x00000020
#define HID_QUIRK_MULTI_INPUT 0x00000040

--
Jiri Kosina
SUSE Labs