diff options
author | Antti Palosaari <crope@iki.fi> | 2013-02-26 11:25:19 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-18 15:51:17 -0400 |
commit | aff8c2d475cb660ee246099dd15f269e9ebb7b1d (patch) | |
tree | e48d1977bece79d31e5088bf3f8f96bc6f0865b3 | |
parent | acb0549acc270c8206ecfdd35d34fc349c3457a0 (diff) |
[media] af9015: do not use buffers from stack for usb_bulk_msg()
WARNING: at lib/dma-debug.c:947 check_for_stack+0xa7/0xf0()
ehci-pci 0000:00:04.1: DMA-API: device driver maps memory fromstack
Reported-by: poma <pomidorabelisima@gmail.com>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9015.c | 39 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/af9015.h | 2 |
2 files changed, 23 insertions, 18 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/af9015.c b/drivers/media/usb/dvb-usb-v2/af9015.c index b86d0f27a398..2fa7c6ee5a70 100644 --- a/drivers/media/usb/dvb-usb-v2/af9015.c +++ b/drivers/media/usb/dvb-usb-v2/af9015.c | |||
@@ -30,22 +30,22 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | |||
30 | 30 | ||
31 | static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req) | 31 | static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req) |
32 | { | 32 | { |
33 | #define BUF_LEN 63 | ||
34 | #define REQ_HDR_LEN 8 /* send header size */ | 33 | #define REQ_HDR_LEN 8 /* send header size */ |
35 | #define ACK_HDR_LEN 2 /* rece header size */ | 34 | #define ACK_HDR_LEN 2 /* rece header size */ |
36 | struct af9015_state *state = d_to_priv(d); | 35 | struct af9015_state *state = d_to_priv(d); |
37 | int ret, wlen, rlen; | 36 | int ret, wlen, rlen; |
38 | u8 buf[BUF_LEN]; | ||
39 | u8 write = 1; | 37 | u8 write = 1; |
40 | 38 | ||
41 | buf[0] = req->cmd; | 39 | mutex_lock(&d->usb_mutex); |
42 | buf[1] = state->seq++; | 40 | |
43 | buf[2] = req->i2c_addr; | 41 | state->buf[0] = req->cmd; |
44 | buf[3] = req->addr >> 8; | 42 | state->buf[1] = state->seq++; |
45 | buf[4] = req->addr & 0xff; | 43 | state->buf[2] = req->i2c_addr; |
46 | buf[5] = req->mbox; | 44 | state->buf[3] = req->addr >> 8; |
47 | buf[6] = req->addr_len; | 45 | state->buf[4] = req->addr & 0xff; |
48 | buf[7] = req->data_len; | 46 | state->buf[5] = req->mbox; |
47 | state->buf[6] = req->addr_len; | ||
48 | state->buf[7] = req->data_len; | ||
49 | 49 | ||
50 | switch (req->cmd) { | 50 | switch (req->cmd) { |
51 | case GET_CONFIG: | 51 | case GET_CONFIG: |
@@ -55,14 +55,14 @@ static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req) | |||
55 | break; | 55 | break; |
56 | case READ_I2C: | 56 | case READ_I2C: |
57 | write = 0; | 57 | write = 0; |
58 | buf[2] |= 0x01; /* set I2C direction */ | 58 | state->buf[2] |= 0x01; /* set I2C direction */ |
59 | case WRITE_I2C: | 59 | case WRITE_I2C: |
60 | buf[0] = READ_WRITE_I2C; | 60 | state->buf[0] = READ_WRITE_I2C; |
61 | break; | 61 | break; |
62 | case WRITE_MEMORY: | 62 | case WRITE_MEMORY: |
63 | if (((req->addr & 0xff00) == 0xff00) || | 63 | if (((req->addr & 0xff00) == 0xff00) || |
64 | ((req->addr & 0xff00) == 0xae00)) | 64 | ((req->addr & 0xff00) == 0xae00)) |
65 | buf[0] = WRITE_VIRTUAL_MEMORY; | 65 | state->buf[0] = WRITE_VIRTUAL_MEMORY; |
66 | case WRITE_VIRTUAL_MEMORY: | 66 | case WRITE_VIRTUAL_MEMORY: |
67 | case COPY_FIRMWARE: | 67 | case COPY_FIRMWARE: |
68 | case DOWNLOAD_FIRMWARE: | 68 | case DOWNLOAD_FIRMWARE: |
@@ -90,7 +90,7 @@ static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req) | |||
90 | rlen = ACK_HDR_LEN; | 90 | rlen = ACK_HDR_LEN; |
91 | if (write) { | 91 | if (write) { |
92 | wlen += req->data_len; | 92 | wlen += req->data_len; |
93 | memcpy(&buf[REQ_HDR_LEN], req->data, req->data_len); | 93 | memcpy(&state->buf[REQ_HDR_LEN], req->data, req->data_len); |
94 | } else { | 94 | } else { |
95 | rlen += req->data_len; | 95 | rlen += req->data_len; |
96 | } | 96 | } |
@@ -99,22 +99,25 @@ static int af9015_ctrl_msg(struct dvb_usb_device *d, struct req_t *req) | |||
99 | if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB) | 99 | if (req->cmd == DOWNLOAD_FIRMWARE || req->cmd == RECONNECT_USB) |
100 | rlen = 0; | 100 | rlen = 0; |
101 | 101 | ||
102 | ret = dvb_usbv2_generic_rw(d, buf, wlen, buf, rlen); | 102 | ret = dvb_usbv2_generic_rw_locked(d, |
103 | state->buf, wlen, state->buf, rlen); | ||
103 | if (ret) | 104 | if (ret) |
104 | goto error; | 105 | goto error; |
105 | 106 | ||
106 | /* check status */ | 107 | /* check status */ |
107 | if (rlen && buf[1]) { | 108 | if (rlen && state->buf[1]) { |
108 | dev_err(&d->udev->dev, "%s: command failed=%d\n", | 109 | dev_err(&d->udev->dev, "%s: command failed=%d\n", |
109 | KBUILD_MODNAME, buf[1]); | 110 | KBUILD_MODNAME, state->buf[1]); |
110 | ret = -EIO; | 111 | ret = -EIO; |
111 | goto error; | 112 | goto error; |
112 | } | 113 | } |
113 | 114 | ||
114 | /* read request, copy returned data to return buf */ | 115 | /* read request, copy returned data to return buf */ |
115 | if (!write) | 116 | if (!write) |
116 | memcpy(req->data, &buf[ACK_HDR_LEN], req->data_len); | 117 | memcpy(req->data, &state->buf[ACK_HDR_LEN], req->data_len); |
117 | error: | 118 | error: |
119 | mutex_unlock(&d->usb_mutex); | ||
120 | |||
118 | return ret; | 121 | return ret; |
119 | } | 122 | } |
120 | 123 | ||
diff --git a/drivers/media/usb/dvb-usb-v2/af9015.h b/drivers/media/usb/dvb-usb-v2/af9015.h index 533637dedd23..3a6f3ad1eadb 100644 --- a/drivers/media/usb/dvb-usb-v2/af9015.h +++ b/drivers/media/usb/dvb-usb-v2/af9015.h | |||
@@ -115,7 +115,9 @@ enum af9015_ir_mode { | |||
115 | AF9015_IR_MODE_POLLING, /* just guess */ | 115 | AF9015_IR_MODE_POLLING, /* just guess */ |
116 | }; | 116 | }; |
117 | 117 | ||
118 | #define BUF_LEN 63 | ||
118 | struct af9015_state { | 119 | struct af9015_state { |
120 | u8 buf[BUF_LEN]; /* bulk USB control message */ | ||
119 | u8 ir_mode; | 121 | u8 ir_mode; |
120 | u8 rc_repeat; | 122 | u8 rc_repeat; |
121 | u32 rc_keycode; | 123 | u32 rc_keycode; |