Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 86f65c21 authored by Akihiro Tsukada's avatar Akihiro Tsukada Committed by Mauro Carvalho Chehab
Browse files

media: dvb-usb-v2/gl861: ensure USB message buffers DMA'able



i2c message buf might be on stack.

Signed-off-by: default avatarAkihiro Tsukada <tskd08@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 87360e68
Loading
Loading
Loading
Loading
+17 −3
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
	u16 value = addr << (8 + 1);
	int wo = (rbuf == NULL || rlen == 0); /* write-only */
	u8 req, type;
	u8 *buf;
	int ret;

	if (wo) {
		req = GL861_REQ_I2C_WRITE;
@@ -42,11 +44,23 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
				KBUILD_MODNAME, wlen);
		return -EINVAL;
	}

	buf = NULL;
	if (rlen > 0) {
		buf = kmalloc(rlen, GFP_KERNEL);
		if (!buf)
			return -ENOMEM;
	}
	usleep_range(1000, 2000); /* avoid I2C errors */

	return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
			       value, index, rbuf, rlen, 2000);
	ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
			      value, index, buf, rlen, 2000);
	if (rlen > 0) {
		if (ret > 0)
			memcpy(rbuf, buf, rlen);
		kfree(buf);
	}

	return ret;
}

/* I2C */