if (unplug) {
                usbhid->ctrltail = usbhid->ctrlhead;
-       } else {
+       } else if (usbhid->ctrlhead != usbhid->ctrltail) {
                usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1);
 
                if (usbhid->ctrlhead != usbhid->ctrltail &&
        mutex_lock(&usbhid->mutex);
 
        clear_bit(HID_STARTED, &usbhid->iofl);
+
        spin_lock_irq(&usbhid->lock);   /* Sync with error and led handlers */
        set_bit(HID_DISCONNECTED, &usbhid->iofl);
+       while (usbhid->ctrltail != usbhid->ctrlhead) {
+               if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_OUT) {
+                       kfree(usbhid->ctrl[usbhid->ctrltail].raw_report);
+                       usbhid->ctrl[usbhid->ctrltail].raw_report = NULL;
+               }
+
+               usbhid->ctrltail = (usbhid->ctrltail + 1) &
+                       (HID_CONTROL_FIFO_SIZE - 1);
+       }
        spin_unlock_irq(&usbhid->lock);
+
        usb_kill_urb(usbhid->urbin);
        usb_kill_urb(usbhid->urbout);
        usb_kill_urb(usbhid->urbctrl);