|
@@ -781,6 +781,8 @@ static int usbhid_start(struct hid_device *hid)
|
|
|
unsigned int n, insize = 0;
|
|
|
int ret;
|
|
|
|
|
|
+ clear_bit(HID_DISCONNECTED, &usbhid->iofl);
|
|
|
+
|
|
|
usbhid->bufsize = HID_MIN_BUFFER_SIZE;
|
|
|
hid_find_max_report(hid, HID_INPUT_REPORT, &usbhid->bufsize);
|
|
|
hid_find_max_report(hid, HID_OUTPUT_REPORT, &usbhid->bufsize);
|
|
@@ -888,6 +890,9 @@ fail:
|
|
|
usb_free_urb(usbhid->urbin);
|
|
|
usb_free_urb(usbhid->urbout);
|
|
|
usb_free_urb(usbhid->urbctrl);
|
|
|
+ usbhid->urbin = NULL;
|
|
|
+ usbhid->urbout = NULL;
|
|
|
+ usbhid->urbctrl = NULL;
|
|
|
hid_free_buffers(dev, hid);
|
|
|
mutex_unlock(&usbhid->setup);
|
|
|
return ret;
|
|
@@ -924,6 +929,9 @@ static void usbhid_stop(struct hid_device *hid)
|
|
|
usb_free_urb(usbhid->urbin);
|
|
|
usb_free_urb(usbhid->urbctrl);
|
|
|
usb_free_urb(usbhid->urbout);
|
|
|
+ usbhid->urbin = NULL; /* don't mess up next start */
|
|
|
+ usbhid->urbctrl = NULL;
|
|
|
+ usbhid->urbout = NULL;
|
|
|
|
|
|
hid_free_buffers(hid_to_usb_dev(hid), hid);
|
|
|
mutex_unlock(&usbhid->setup);
|