aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@s-opensource.com>2016-10-07 10:24:21 -0400
committerMauro Carvalho Chehab <mchehab@s-opensource.com>2016-10-14 11:45:03 -0400
commitfa86c9a1fca5a50563cc63e97aa130a3c54f1d4c (patch)
tree84a657641f2c6d524f8503481de89ac8ad3a9739
parent8f306145df334e2797ef5aa63225cd5178e569c1 (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.c14
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
25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 25DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
26 26
27struct gp8psk_state {
28 unsigned char data[80];
29};
30
27static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) 31static 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
54int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen) 58int 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
86int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, 92int 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 {