diff options
author | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-10-07 10:24:21 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-10-14 11:45:03 -0400 |
commit | fa86c9a1fca5a50563cc63e97aa130a3c54f1d4c (patch) | |
tree | 84a657641f2c6d524f8503481de89ac8ad3a9739 | |
parent | 8f306145df334e2797ef5aa63225cd5178e569c1 (diff) |
[media] gp8psk: 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@s-opensource.com>
-rw-r--r-- | drivers/media/usb/dvb-usb/gp8psk.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/media/usb/dvb-usb/gp8psk.c b/drivers/media/usb/dvb-usb/gp8psk.c index 5d0384dd45b5..807f5628a3bb 100644 --- a/drivers/media/usb/dvb-usb/gp8psk.c +++ b/drivers/media/usb/dvb-usb/gp8psk.c | |||
@@ -24,6 +24,10 @@ MODULE_PARM_DESC(debug, "set debugging level (1=info,xfer=2,rc=4 (or-able))." DV | |||
24 | 24 | ||
25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 25 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
26 | 26 | ||
27 | struct gp8psk_state { | ||
28 | unsigned char data[80]; | ||
29 | }; | ||
30 | |||
27 | static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) | 31 | static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) |
28 | { | 32 | { |
29 | return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6)); | 33 | return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6)); |
@@ -53,17 +57,19 @@ static void gp8psk_info(struct dvb_usb_device *d) | |||
53 | 57 | ||
54 | int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) | 58 | int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) |
55 | { | 59 | { |
60 | struct gp8psk_state *st = d->priv; | ||
56 | int ret = 0,try = 0; | 61 | int ret = 0,try = 0; |
57 | 62 | ||
58 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) | 63 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) |
59 | return ret; | 64 | return ret; |
60 | 65 | ||
61 | while (ret >= 0 && ret != blen && try < 3) { | 66 | while (ret >= 0 && ret != blen && try < 3) { |
67 | memcpy(st->data, b, blen); | ||
62 | ret = usb_control_msg(d->udev, | 68 | ret = usb_control_msg(d->udev, |
63 | usb_rcvctrlpipe(d->udev,0), | 69 | usb_rcvctrlpipe(d->udev,0), |
64 | req, | 70 | req, |
65 | USB_TYPE_VENDOR | USB_DIR_IN, | 71 | USB_TYPE_VENDOR | USB_DIR_IN, |
66 | value,index,b,blen, | 72 | value, index, st->data, blen, |
67 | 2000); | 73 | 2000); |
68 | deb_info("reading number %d (ret: %d)\n",try,ret); | 74 | deb_info("reading number %d (ret: %d)\n",try,ret); |
69 | try++; | 75 | try++; |
@@ -86,6 +92,7 @@ int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 | |||
86 | int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | 92 | int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, |
87 | u16 index, u8 *b, int blen) | 93 | u16 index, u8 *b, int blen) |
88 | { | 94 | { |
95 | struct gp8psk_state *st = d->priv; | ||
89 | int ret; | 96 | int ret; |
90 | 97 | ||
91 | deb_xfer("out: req. %x, val: %x, ind: %x, buffer: ",req,value,index); | 98 | deb_xfer("out: req. %x, val: %x, ind: %x, buffer: ",req,value,index); |
@@ -94,11 +101,12 @@ int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, | |||
94 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) | 101 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) |
95 | return ret; | 102 | return ret; |
96 | 103 | ||
104 | memcpy(st->data, b, blen); | ||
97 | if (usb_control_msg(d->udev, | 105 | if (usb_control_msg(d->udev, |
98 | usb_sndctrlpipe(d->udev,0), | 106 | usb_sndctrlpipe(d->udev,0), |
99 | req, | 107 | req, |
100 | USB_TYPE_VENDOR | USB_DIR_OUT, | 108 | USB_TYPE_VENDOR | USB_DIR_OUT, |
101 | value,index,b,blen, | 109 | value, index, st->data, blen, |
102 | 2000) != blen) { | 110 | 2000) != blen) { |
103 | warn("usb out operation failed."); | 111 | warn("usb out operation failed."); |
104 | ret = -EIO; | 112 | ret = -EIO; |
@@ -265,6 +273,8 @@ static struct dvb_usb_device_properties gp8psk_properties = { | |||
265 | .usb_ctrl = CYPRESS_FX2, | 273 | .usb_ctrl = CYPRESS_FX2, |
266 | .firmware = "dvb-usb-gp8psk-01.fw", | 274 | .firmware = "dvb-usb-gp8psk-01.fw", |
267 | 275 | ||
276 | .size_of_priv = sizeof(struct gp8psk_state), | ||
277 | |||
268 | .num_adapters = 1, | 278 | .num_adapters = 1, |
269 | .adapter = { | 279 | .adapter = { |
270 | { | 280 | { |