]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: rc: ttusbir: respect DMA coherency rules
authorOliver Neukum <oneukum@suse.com>
Wed, 11 Feb 2026 18:11:04 +0000 (19:11 +0100)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Tue, 17 Mar 2026 13:43:57 +0000 (14:43 +0100)
Buffers must not share a cache line with other data structures.
Allocate separately.

Fixes: 0938069fa0897 ("[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>
drivers/media/rc/ttusbir.c

index a2a64a860264b041ef02a9efe958a665b8e88302..3848ad3a6b85f10826d6eb5634cf403026bd1511 100644 (file)
@@ -32,7 +32,7 @@ struct ttusbir {
 
        struct led_classdev led;
        struct urb *bulk_urb;
-       uint8_t bulk_buffer[5];
+       u8 *bulk_buffer;
        int bulk_out_endp, iso_in_endp;
        bool led_on, is_led_on;
        atomic_t led_complete;
@@ -186,13 +186,16 @@ static int ttusbir_probe(struct usb_interface *intf,
        struct rc_dev *rc;
        int i, j, ret;
        int altsetting = -1;
+       u8 *buffer;
 
        tt = kzalloc_obj(*tt);
+       buffer = kzalloc(5, GFP_KERNEL);
        rc = rc_allocate_device(RC_DRIVER_IR_RAW);
-       if (!tt || !rc) {
+       if (!tt || !rc || buffer) {
                ret = -ENOMEM;
                goto out;
        }
+       tt->bulk_buffer = buffer;
 
        /* find the correct alt setting */
        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;
 
        usb_fill_bulk_urb(tt->bulk_urb, tt->udev, usb_sndbulkpipe(tt->udev,
-               tt->bulk_out_endp), tt->bulk_buffer, sizeof(tt->bulk_buffer),
-                                               ttusbir_bulk_complete, tt);
+                         tt->bulk_out_endp), tt->bulk_buffer, 5,
+                         ttusbir_bulk_complete, tt);
 
        tt->led.name = "ttusbir:green:power";
        tt->led.default_trigger = "rc-feedback";
@@ -350,6 +353,7 @@ out:
                kfree(tt);
        }
        rc_free_device(rc);
+       kfree(buffer);
 
        return ret;
 }
@@ -373,6 +377,7 @@ static void ttusbir_disconnect(struct usb_interface *intf)
        usb_kill_urb(tt->bulk_urb);
        usb_free_urb(tt->bulk_urb);
        rc_free_device(tt->rc);
+       kfree(tt->bulk_buffer);
        usb_set_intfdata(intf, NULL);
        kfree(tt);
 }