|
@@ -875,16 +875,21 @@ int hiddev_connect(struct hid_device *hid, unsigned int force)
|
|
hiddev->hid = hid;
|
|
hiddev->hid = hid;
|
|
hiddev->exist = 1;
|
|
hiddev->exist = 1;
|
|
|
|
|
|
|
|
+ /* when lock_kernel() usage is fixed in usb_open(),
|
|
|
|
+ * we could also fix it here */
|
|
|
|
+ lock_kernel();
|
|
retval = usb_register_dev(usbhid->intf, &hiddev_class);
|
|
retval = usb_register_dev(usbhid->intf, &hiddev_class);
|
|
if (retval) {
|
|
if (retval) {
|
|
err_hid("Not able to get a minor for this device.");
|
|
err_hid("Not able to get a minor for this device.");
|
|
hid->hiddev = NULL;
|
|
hid->hiddev = NULL;
|
|
|
|
+ unlock_kernel();
|
|
kfree(hiddev);
|
|
kfree(hiddev);
|
|
return -1;
|
|
return -1;
|
|
} else {
|
|
} else {
|
|
hid->minor = usbhid->intf->minor;
|
|
hid->minor = usbhid->intf->minor;
|
|
hiddev_table[usbhid->intf->minor - HIDDEV_MINOR_BASE] = hiddev;
|
|
hiddev_table[usbhid->intf->minor - HIDDEV_MINOR_BASE] = hiddev;
|
|
}
|
|
}
|
|
|
|
+ unlock_kernel();
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|