Commit 50acaad3 authored by Oliver Neukum's avatar Oliver Neukum Committed by Hans Verkuil
Browse files

media: rc: ttusbir: respect DMA coherency rules



Buffers must not share a cache line with other data structures.
Allocate separately.

Fixes: 0938069f ("[media] rc: Add support for the TechnoTrend USB IR Receiver")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarOliver Neukum <oneukum@suse.com>
Signed-off-by: default avatarSean Young <sean@mess.org>
Signed-off-by: default avatarHans Verkuil <hverkuil+cisco@kernel.org>
parent eac69475
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -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,7 +284,7 @@ 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),
			  tt->bulk_out_endp), tt->bulk_buffer, 5,
			  ttusbir_bulk_complete, tt);

	tt->led.name = "ttusbir:green:power";
@@ -350,6 +353,7 @@ static int ttusbir_probe(struct usb_interface *intf,
		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);
}