Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1498730
| From | Mauro Carvalho Chehab <mchehab@s-opensource.com> |
|---|---|
| Newsgroups | linux.kernel |
| Subject | [PATCH v2 13/31] dtt200u-fe: don't do DMA on stack |
| Date | 2016-10-11 12:20 +0200 |
| Message-ID | <sr2kb-5sy-53@gated-at.bofh.it> (permalink) |
| References | <sr2k9-5sy-3@gated-at.bofh.it> |
| Organization | linux.* mail to news gateway |
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>
---
drivers/media/usb/dvb-usb/dtt200u-fe.c | 95 +++++++++++++++++++++++-----------
1 file changed, 65 insertions(+), 30 deletions(-)
diff --git a/drivers/media/usb/dvb-usb/dtt200u-fe.c b/drivers/media/usb/dvb-usb/dtt200u-fe.c
index 9bb15f7b48db..7f7f64be6353 100644
--- a/drivers/media/usb/dvb-usb/dtt200u-fe.c
+++ b/drivers/media/usb/dvb-usb/dtt200u-fe.c
@@ -18,17 +18,22 @@ struct dtt200u_fe_state {
struct dtv_frontend_properties fep;
struct dvb_frontend frontend;
+
+ unsigned char data[80];
+ struct mutex data_mutex;
};
static int dtt200u_fe_read_status(struct dvb_frontend *fe,
enum fe_status *stat)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 st = GET_TUNE_STATUS, b[3];
- dvb_usb_generic_rw(state->d,&st,1,b,3,0);
+ mutex_lock(&state->data_mutex);
+ state->data[0] = GET_TUNE_STATUS;
- switch (b[0]) {
+ dvb_usb_generic_rw(state->d, state->data, 1, state->data, 3, 0);
+
+ switch (state->data[0]) {
case 0x01:
*stat = FE_HAS_SIGNAL | FE_HAS_CARRIER |
FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK;
@@ -41,51 +46,75 @@ static int dtt200u_fe_read_status(struct dvb_frontend *fe,
*stat = 0;
break;
}
+ mutex_unlock(&state->data_mutex);
return 0;
}
static int dtt200u_fe_read_ber(struct dvb_frontend* fe, u32 *ber)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 bw = GET_VIT_ERR_CNT,b[3];
- dvb_usb_generic_rw(state->d,&bw,1,b,3,0);
- *ber = (b[0] << 16) | (b[1] << 8) | b[2];
+
+ mutex_lock(&state->data_mutex);
+ state->data[0] = GET_VIT_ERR_CNT;
+
+ dvb_usb_generic_rw(state->d, state->data, 1, state->data, 3, 0);
+ *ber = (state->data[0] << 16) | (state->data[1] << 8) | state->data[2];
+
+ mutex_unlock(&state->data_mutex);
return 0;
}
static int dtt200u_fe_read_unc_blocks(struct dvb_frontend* fe, u32 *unc)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 bw = GET_RS_UNCOR_BLK_CNT,b[2];
- dvb_usb_generic_rw(state->d,&bw,1,b,2,0);
- *unc = (b[0] << 8) | b[1];
- return 0;
+ mutex_lock(&state->data_mutex);
+ state->data[0] = GET_RS_UNCOR_BLK_CNT;
+
+ dvb_usb_generic_rw(state->d, state->data, 1, state->data, 2, 0);
+
+ mutex_unlock(&state->data_mutex);
+ return ret;
}
static int dtt200u_fe_read_signal_strength(struct dvb_frontend* fe, u16 *strength)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 bw = GET_AGC, b;
- dvb_usb_generic_rw(state->d,&bw,1,&b,1,0);
- *strength = (b << 8) | b;
- return 0;
+
+ mutex_lock(&state->data_mutex);
+ state->data[0] = GET_AGC;
+
+ dvb_usb_generic_rw(state->d, state->data, 1, state->data, 1, 0);
+
+ mutex_unlock(&state->data_mutex);
+ return ret;
}
static int dtt200u_fe_read_snr(struct dvb_frontend* fe, u16 *snr)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 bw = GET_SNR,br;
- dvb_usb_generic_rw(state->d,&bw,1,&br,1,0);
- *snr = ~((br << 8) | br);
- return 0;
+
+ mutex_lock(&state->data_mutex);
+ state->data[0] = GET_SNR;
+
+ dvb_usb_generic_rw(state->d, state->data, 1, state->data, 1, 0);
+
+ mutex_unlock(&state->data_mutex);
+ return ret;
}
static int dtt200u_fe_init(struct dvb_frontend* fe)
{
struct dtt200u_fe_state *state = fe->demodulator_priv;
- u8 b = SET_INIT;
- return dvb_usb_generic_write(state->d,&b,1);
+ int ret;
+
+ mutex_lock(&state->data_mutex);
+ state->data[0] = SET_INIT;
+
+ ret = dvb_usb_generic_write(state->d, state->data, 1);
+ mutex_unlock(&state->data_mutex);
+
+ return ret;
}
static int dtt200u_fe_sleep(struct dvb_frontend* fe)
@@ -106,29 +135,34 @@ static int dtt200u_fe_set_frontend(struct dvb_frontend *fe)
struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
struct dtt200u_fe_state *state = fe->demodulator_priv;
u16 freq = fep->frequency / 250000;
- u8 bwbuf[2] = { SET_BANDWIDTH, 0 },freqbuf[3] = { SET_RF_FREQ, 0, 0 };
+ mutex_lock(&state->data_mutex);
+ state->data[0] = SET_BANDWIDTH;
switch (fep->bandwidth_hz) {
case 8000000:
- bwbuf[1] = 8;
+ state->data[1] = 8;
break;
case 7000000:
- bwbuf[1] = 7;
+ state->data[1] = 7;
break;
case 6000000:
- bwbuf[1] = 6;
+ state->data[1] = 6;
break;
default:
- return -EINVAL;
+ ret = -EINVAL;
+ goto ret;
}
- dvb_usb_generic_write(state->d,bwbuf,2);
+ dvb_usb_generic_write(state->d, state->data, 2);
- freqbuf[1] = freq & 0xff;
- freqbuf[2] = (freq >> 8) & 0xff;
- dvb_usb_generic_write(state->d,freqbuf,3);
+ state->data[0] = SET_RF_FREQ;
+ state->data[1] = freq & 0xff;
+ state->data[2] = (freq >> 8) & 0xff;
+ dvb_usb_generic_write(state->d, state->data, 3);
- return 0;
+ret:
+ mutex_unlock(&state->data_mutex);
+ return ret;
}
static int dtt200u_fe_get_frontend(struct dvb_frontend* fe,
@@ -160,6 +194,7 @@ struct dvb_frontend* dtt200u_fe_attach(struct dvb_usb_device *d)
deb_info("attaching frontend dtt200u\n");
state->d = d;
+ mutex_init(&state->data_mutex);
memcpy(&state->frontend.ops,&dtt200u_fe_ops,sizeof(struct dvb_frontend_ops));
state->frontend.demodulator_priv = state;
--
2.7.4
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH v2 00/31] Don't use stack for DMA transers on media usb drivers Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 04/31] cinergyT2-fe: cache stats at cinergyt2_fe_read_status() Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 05/31] cinergyT2-fe: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 29/31] s2255drv: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 26/31] dw2102: return error if su3000_power_ctrl() fails Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 30/31] stk-webcam: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 28/31] cpia2_usb: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
Re: [PATCH v2 28/31] cpia2_usb: don't use stack for DMA Kosuke Tatsukawa <tatsu@ab.jp.nec.com> - 2016-10-12 01:00 +0200
[PATCH v2 .1 28/31] cpia2_usb: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-12 04:20 +0200
Re: [PATCH v2 28/31] cpia2_usb: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-12 04:20 +0200
[PATCH v2 01/31] af9005: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 15/31] dtt200u: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 24/31] dvb-usb: warn if return value for USB read/write routines is not checked Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 02/31] cinergyT2-core: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 07/31] dib0700: be sure that dib0700_ctrl_rd() users can do DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 11/31] digitv: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 17/31] dtv5100: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 25/31] nova-t-usb2: handle error code on RC query Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 18/31] gp8psk: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 20/31] nova-t-usb2: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 31/31] flexcop-usb: don't use stack for DMA Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 22/31] pctv452e: don't call BUG_ON() on non-fatal error Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 10/31] dibusb: handle error code on RC query Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 27/31] digitv: handle error code on RC query Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 16/31] dtt200u: handle USB control message errors Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 13/31] dtt200u-fe: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 21/31] pctv452e: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 19/31] gp8psk: don't go past the buffer size Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 12/31] dtt200u-fe: don't keep waiting for lock at set_frontend() Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 08/31] dib0700_core: don't use stack on I2C reads Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
[PATCH v2 06/31] cxusb: don't do DMA on stack Mauro Carvalho Chehab <mchehab@s-opensource.com> - 2016-10-11 12:20 +0200
csiph-web