Thread (3 messages) 3 messages, 2 authors, 2012-12-07

Re: [PATCH] Fixes kernel oops when turning bluetooth mouse on

flat view

From: Jiri Kosina <hidden>
Date: 2012-12-07 10:21:10
Also in: linux-input, lkml

On Thu, 6 Dec 2012, Gustavo Padovan wrote:
quoted
quoted
diff -Nrup a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
--- a/drivers/hid/hid-core.c	2012-12-05 01:43:45.000000000 -0200
+++ b/drivers/hid/hid-core.c	2012-12-05 01:26:57.000000000 -0200
@@ -2150,8 +2150,13 @@ static const struct hid_device_id hid_mo
 	{ }
 };
 
-static bool hid_ignore(struct hid_device *hdev)
+bool hid_ignore(struct hid_device *hdev)
 {
+	if (hdev->quirks & HID_QUIRK_NO_IGNORE)
+		return false;
+	if (hdev->quirks & HID_QUIRK_IGNORE)
+		return true;
+
 	switch (hdev->vendor) {
 	case USB_VENDOR_ID_CODEMERCS:
 		/* ignore all Code Mercenaries IOWarrior devices */
@@ -2197,6 +2202,7 @@ static bool hid_ignore(struct hid_device
 
 	return !!hid_match_id(hdev, hid_ignore_list);
 }
+EXPORT_SYMBOL_GPL(hid_ignore);
 
 int hid_add_device(struct hid_device *hdev)
 {
@@ -2208,8 +2214,7 @@ int hid_add_device(struct hid_device *hd
 
 	/* we need to kill them here, otherwise they will stay allocated to
 	 * wait for coming driver */
-	if (!(hdev->quirks & HID_QUIRK_NO_IGNORE)
-            && (hid_ignore(hdev) || (hdev->quirks & HID_QUIRK_IGNORE)))
+	if (hid_ignore(hdev))
 		return -ENODEV;
 
 	/*
diff -Nrup a/include/linux/hid.h b/include/linux/hid.h
--- a/include/linux/hid.h	2012-12-05 01:44:14.000000000 -0200
+++ b/include/linux/hid.h	2012-12-05 01:26:57.000000000 -0200
@@ -684,6 +684,7 @@ struct hid_ll_driver {
 
 extern int hid_debug;
 
+extern bool hid_ignore(struct hid_device *);
 extern int hid_add_device(struct hid_device *);
 extern void hid_destroy_device(struct hid_device *);
 
diff -Nrup a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
--- a/net/bluetooth/hidp/core.c	2012-12-05 01:43:15.000000000 -0200
+++ b/net/bluetooth/hidp/core.c	2012-12-05 02:29:49.000000000 -0200
@@ -941,6 +941,13 @@ static int hidp_setup_hid(struct hidp_se
 	hid->hid_get_raw_report = hidp_get_raw_report;
 	hid->hid_output_raw_report = hidp_output_raw_report;
 
+	/* True if device is blacklisted in drivers/hid/hid-core.c */
+	if (hid_ignore(hid)) {
+		hid_destroy_device(session->hid);
+		session->hid = NULL;
+		return -ENODEV;
+	}
+
 	return 0;
 
 fault:
@@ -1013,7 +1020,7 @@ int hidp_add_connection(struct hidp_conn
 
 	if (req->rd_size > 0) {
 		err = hidp_setup_hid(session, req);
-		if (err)
+		if (err && err != -ENODEV)
 			goto purge;
 	}
Acked-by: Gustavo Padovan <redacted>
Queuing in hid.git, thanks.

-- 
Jiri Kosina
SUSE Labs
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help