Commit 48db0089 authored by Mika Båtsman's avatar Mika Båtsman Committed by Mauro Carvalho Chehab

media: gl861: fix probe of dvb_usb_gl861

Probe of dvb_usb_gl861 was working at least with v4.4. Noticed the issue
with v4.13 but according to similar issues the problem started with v4.9.

[   15.288065] transfer buffer not dma capable
[   15.288090] WARNING: CPU: 2 PID: 493 at drivers/usb/core/hcd.c:1595 usb_hcd_map_urb_for_dma+0x4e2/0x640
...CUT...
[   15.288791] dvb_usb_gl861: probe of 3-7:1.0 failed with error -5

Tested with MSI Mega Sky 580 DVB-T Tuner [GL861]

[mchehab+samsung@kernel.org: rebased on the top of upstream]
Cc: stable@vger.kernel.org
Signed-off-by: default avatarMika Båtsman <mika.batsman@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+samsung@kernel.org>
parent 443eaa35
...@@ -26,10 +26,14 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr, ...@@ -26,10 +26,14 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
if (wo) { if (wo) {
req = GL861_REQ_I2C_WRITE; req = GL861_REQ_I2C_WRITE;
type = GL861_WRITE; type = GL861_WRITE;
buf = kmemdup(wbuf, wlen, GFP_KERNEL);
} else { /* rw */ } else { /* rw */
req = GL861_REQ_I2C_READ; req = GL861_REQ_I2C_READ;
type = GL861_READ; type = GL861_READ;
buf = kmalloc(rlen, GFP_KERNEL);
} }
if (!buf)
return -ENOMEM;
switch (wlen) { switch (wlen) {
case 1: case 1:
...@@ -42,24 +46,19 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr, ...@@ -42,24 +46,19 @@ static int gl861_i2c_msg(struct dvb_usb_device *d, u8 addr,
default: default:
dev_err(&d->udev->dev, "%s: wlen=%d, aborting\n", dev_err(&d->udev->dev, "%s: wlen=%d, aborting\n",
KBUILD_MODNAME, wlen); KBUILD_MODNAME, wlen);
kfree(buf);
return -EINVAL; return -EINVAL;
} }
buf = NULL;
if (rlen > 0) {
buf = kmalloc(rlen, GFP_KERNEL);
if (!buf)
return -ENOMEM;
}
usleep_range(1000, 2000); /* avoid I2C errors */ usleep_range(1000, 2000); /* avoid I2C errors */
ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type, ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), req, type,
value, index, buf, rlen, 2000); value, index, buf, rlen, 2000);
if (rlen > 0) {
if (ret > 0)
memcpy(rbuf, buf, rlen);
kfree(buf);
}
if (!wo && ret > 0)
memcpy(rbuf, buf, rlen);
kfree(buf);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment