mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 15:12:13 +02:00
media: rc: ttusbir: respect DMA coherency rules
Buffers must not share a cache line with other data structures.
Allocate separately.
Fixes: 0938069fa0 ("[media] rc: Add support for the TechnoTrend USB IR Receiver")
Cc: stable@vger.kernel.org
Signed-off-by: Oliver Neukum <oneukum@suse.com>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
This commit is contained in:
parent
eac69475b0
commit
50acaad3d2
|
|
@ -32,7 +32,7 @@ struct ttusbir {
|
||||||
|
|
||||||
struct led_classdev led;
|
struct led_classdev led;
|
||||||
struct urb *bulk_urb;
|
struct urb *bulk_urb;
|
||||||
uint8_t bulk_buffer[5];
|
u8 *bulk_buffer;
|
||||||
int bulk_out_endp, iso_in_endp;
|
int bulk_out_endp, iso_in_endp;
|
||||||
bool led_on, is_led_on;
|
bool led_on, is_led_on;
|
||||||
atomic_t led_complete;
|
atomic_t led_complete;
|
||||||
|
|
@ -186,13 +186,16 @@ static int ttusbir_probe(struct usb_interface *intf,
|
||||||
struct rc_dev *rc;
|
struct rc_dev *rc;
|
||||||
int i, j, ret;
|
int i, j, ret;
|
||||||
int altsetting = -1;
|
int altsetting = -1;
|
||||||
|
u8 *buffer;
|
||||||
|
|
||||||
tt = kzalloc_obj(*tt);
|
tt = kzalloc_obj(*tt);
|
||||||
|
buffer = kzalloc(5, GFP_KERNEL);
|
||||||
rc = rc_allocate_device(RC_DRIVER_IR_RAW);
|
rc = rc_allocate_device(RC_DRIVER_IR_RAW);
|
||||||
if (!tt || !rc) {
|
if (!tt || !rc || buffer) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
tt->bulk_buffer = buffer;
|
||||||
|
|
||||||
/* find the correct alt setting */
|
/* find the correct alt setting */
|
||||||
for (i = 0; i < intf->num_altsetting && altsetting == -1; i++) {
|
for (i = 0; i < intf->num_altsetting && altsetting == -1; i++) {
|
||||||
|
|
@ -281,8 +284,8 @@ static int ttusbir_probe(struct usb_interface *intf,
|
||||||
tt->bulk_buffer[3] = 0x01;
|
tt->bulk_buffer[3] = 0x01;
|
||||||
|
|
||||||
usb_fill_bulk_urb(tt->bulk_urb, tt->udev, usb_sndbulkpipe(tt->udev,
|
usb_fill_bulk_urb(tt->bulk_urb, tt->udev, usb_sndbulkpipe(tt->udev,
|
||||||
tt->bulk_out_endp), tt->bulk_buffer, sizeof(tt->bulk_buffer),
|
tt->bulk_out_endp), tt->bulk_buffer, 5,
|
||||||
ttusbir_bulk_complete, tt);
|
ttusbir_bulk_complete, tt);
|
||||||
|
|
||||||
tt->led.name = "ttusbir:green:power";
|
tt->led.name = "ttusbir:green:power";
|
||||||
tt->led.default_trigger = "rc-feedback";
|
tt->led.default_trigger = "rc-feedback";
|
||||||
|
|
@ -350,6 +353,7 @@ static int ttusbir_probe(struct usb_interface *intf,
|
||||||
kfree(tt);
|
kfree(tt);
|
||||||
}
|
}
|
||||||
rc_free_device(rc);
|
rc_free_device(rc);
|
||||||
|
kfree(buffer);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
@ -373,6 +377,7 @@ static void ttusbir_disconnect(struct usb_interface *intf)
|
||||||
usb_kill_urb(tt->bulk_urb);
|
usb_kill_urb(tt->bulk_urb);
|
||||||
usb_free_urb(tt->bulk_urb);
|
usb_free_urb(tt->bulk_urb);
|
||||||
rc_free_device(tt->rc);
|
rc_free_device(tt->rc);
|
||||||
|
kfree(tt->bulk_buffer);
|
||||||
usb_set_intfdata(intf, NULL);
|
usb_set_intfdata(intf, NULL);
|
||||||
kfree(tt);
|
kfree(tt);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user