diff options
author | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2016-10-07 07:51:23 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-10-14 11:44:03 -0400 |
commit | 8f306145df334e2797ef5aa63225cd5178e569c1 (patch) | |
tree | b7395d42f6585a168d8c3f9bca3824db84050c01 /drivers/media/usb | |
parent | a3f9f07e06ebf37261171e167e2110b758c2a147 (diff) |
[media] dtv5100: don't do DMA on stack
The USB control messages require DMA to work. We cannot pass
a stack-allocated buffer, as it is not warranted that the
stack would be into a DMA enabled area.
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'drivers/media/usb')
-rw-r--r-- | drivers/media/usb/dvb-usb/dtv5100.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/media/usb/dvb-usb/dtv5100.c b/drivers/media/usb/dvb-usb/dtv5100.c index 3d11df41cac0..c60fb54f445f 100644 --- a/drivers/media/usb/dvb-usb/dtv5100.c +++ b/drivers/media/usb/dvb-usb/dtv5100.c | |||
@@ -31,9 +31,14 @@ module_param_named(debug, dvb_usb_dtv5100_debug, int, 0644); | |||
31 | MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS); | 31 | MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS); |
32 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 32 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
33 | 33 | ||
34 | struct dtv5100_state { | ||
35 | unsigned char data[80]; | ||
36 | }; | ||
37 | |||
34 | static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr, | 38 | static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr, |
35 | u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen) | 39 | u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen) |
36 | { | 40 | { |
41 | struct dtv5100_state *st = d->priv; | ||
37 | u8 request; | 42 | u8 request; |
38 | u8 type; | 43 | u8 type; |
39 | u16 value; | 44 | u16 value; |
@@ -60,9 +65,10 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr, | |||
60 | } | 65 | } |
61 | index = (addr << 8) + wbuf[0]; | 66 | index = (addr << 8) + wbuf[0]; |
62 | 67 | ||
68 | memcpy(st->data, rbuf, rlen); | ||
63 | msleep(1); /* avoid I2C errors */ | 69 | msleep(1); /* avoid I2C errors */ |
64 | return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), request, | 70 | return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), request, |
65 | type, value, index, rbuf, rlen, | 71 | type, value, index, st->data, rlen, |
66 | DTV5100_USB_TIMEOUT); | 72 | DTV5100_USB_TIMEOUT); |
67 | } | 73 | } |
68 | 74 | ||
@@ -176,7 +182,7 @@ static struct dvb_usb_device_properties dtv5100_properties = { | |||
176 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 182 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
177 | .usb_ctrl = DEVICE_SPECIFIC, | 183 | .usb_ctrl = DEVICE_SPECIFIC, |
178 | 184 | ||
179 | .size_of_priv = 0, | 185 | .size_of_priv = sizeof(struct dtv5100_state), |
180 | 186 | ||
181 | .num_adapters = 1, | 187 | .num_adapters = 1, |
182 | .adapter = {{ | 188 | .adapter = {{ |