diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c index 96b0181cf819..60662616fd2a 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -1253,6 +1253,14 @@ static void usbhid_stop(struct hid_device *hid) usbhid->ctrltail = (usbhid->ctrltail + 1) & (HID_CONTROL_FIFO_SIZE - 1); } + + while (usbhid->outtail != usbhid->outhead) { + kfree(usbhid->out[usbhid->outtail].raw_report); + usbhid->out[usbhid->outtail].raw_report = NULL; + + usbhid->outtail = (usbhid->outtail + 1) & + (HID_OUTPUT_FIFO_SIZE - 1); + } spin_unlock_irq(&usbhid->lock); usb_kill_urb(usbhid->urbin); diff --git a/drivers/hid/usbhid/usbhid.h b/drivers/hid/usbhid/usbhid.h index 75fe85d3d27a..c408e694a7b2 100644 --- a/drivers/hid/usbhid/usbhid.h +++ b/drivers/hid/usbhid/usbhid.h @@ -74,7 +74,7 @@ struct usbhid_device { unsigned long last_ctrl; /* record of last output for timeouts */ struct urb *urbout; /* Output URB */ - struct hid_output_fifo out[HID_CONTROL_FIFO_SIZE]; /* Output pipe fifo */ + struct hid_output_fifo out[HID_OUTPUT_FIFO_SIZE]; /* Output pipe fifo */ unsigned char outhead, outtail; /* Output pipe fifo head & tail */ char *outbuf; /* Output buffer */ dma_addr_t outbuf_dma; /* Output buffer dma */