Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1498708

[PATCH v2 05/31] cinergyT2-fe: don't do DMA on stack

From Mauro Carvalho Chehab <mchehab@s-opensource.com>
Newsgroups linux.kernel
Subject [PATCH v2 05/31] cinergyT2-fe: don't do DMA on stack
Date 2016-10-11 12:20 +0200
Message-ID <sr2ka-5sy-15@gated-at.bofh.it> (permalink)
References <sr2k9-5sy-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


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.

Reviewed-By: Patrick Boettcher <patrick.boettcher@posteo.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
---
 drivers/media/usb/dvb-usb/cinergyT2-fe.c | 56 +++++++++++++++++++-------------
 1 file changed, 33 insertions(+), 23 deletions(-)

diff --git a/drivers/media/usb/dvb-usb/cinergyT2-fe.c b/drivers/media/usb/dvb-usb/cinergyT2-fe.c
index fd8edcb56e61..2d29b4174dba 100644
--- a/drivers/media/usb/dvb-usb/cinergyT2-fe.c
+++ b/drivers/media/usb/dvb-usb/cinergyT2-fe.c
@@ -139,6 +139,10 @@ static uint16_t compute_tps(struct dtv_frontend_properties *op)
 struct cinergyt2_fe_state {
 	struct dvb_frontend fe;
 	struct dvb_usb_device *d;
+
+	unsigned char data[64];
+	struct mutex data_mutex;
+
 	struct dvbt_get_status_msg status;
 };
 
@@ -146,28 +150,31 @@ static int cinergyt2_fe_read_status(struct dvb_frontend *fe,
 				    enum fe_status *status)
 {
 	struct cinergyt2_fe_state *state = fe->demodulator_priv;
-	struct dvbt_get_status_msg result;
-	u8 cmd[] = { CINERGYT2_EP1_GET_TUNER_STATUS };
 	int ret;
 
-	ret = dvb_usb_generic_rw(state->d, cmd, sizeof(cmd), (u8 *)&result,
-			sizeof(result), 0);
+	mutex_lock(&state->data_mutex);
+	state->data[0] = CINERGYT2_EP1_GET_TUNER_STATUS;
+
+	ret = dvb_usb_generic_rw(state->d, state->data, 1,
+				 state->data, sizeof(state->status), 0);
+	if (!ret)
+		memcpy(&state->status, state->data, sizeof(state->status));
+	mutex_unlock(&state->data_mutex);
+
 	if (ret < 0)
 		return ret;
 
-	state->status = result;
-
 	*status = 0;
 
-	if (0xffff - le16_to_cpu(result.gain) > 30)
+	if (0xffff - le16_to_cpu(state->status.gain) > 30)
 		*status |= FE_HAS_SIGNAL;
-	if (result.lock_bits & (1 << 6))
+	if (state->status.lock_bits & (1 << 6))
 		*status |= FE_HAS_LOCK;
-	if (result.lock_bits & (1 << 5))
+	if (state->status.lock_bits & (1 << 5))
 		*status |= FE_HAS_SYNC;
-	if (result.lock_bits & (1 << 4))
+	if (state->status.lock_bits & (1 << 4))
 		*status |= FE_HAS_CARRIER;
-	if (result.lock_bits & (1 << 1))
+	if (state->status.lock_bits & (1 << 1))
 		*status |= FE_HAS_VITERBI;
 
 	if ((*status & (FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC)) !=
@@ -232,34 +239,36 @@ static int cinergyt2_fe_set_frontend(struct dvb_frontend *fe)
 {
 	struct dtv_frontend_properties *fep = &fe->dtv_property_cache;
 	struct cinergyt2_fe_state *state = fe->demodulator_priv;
-	struct dvbt_set_parameters_msg param;
-	char result[2];
+	struct dvbt_set_parameters_msg *param;
 	int err;
 
-	param.cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS;
-	param.tps = cpu_to_le16(compute_tps(fep));
-	param.freq = cpu_to_le32(fep->frequency / 1000);
-	param.flags = 0;
+	mutex_lock(&state->data_mutex);
+
+	param = (void *)state->data;
+	param->cmd = CINERGYT2_EP1_SET_TUNER_PARAMETERS;
+	param->tps = cpu_to_le16(compute_tps(fep));
+	param->freq = cpu_to_le32(fep->frequency / 1000);
+	param->flags = 0;
 
 	switch (fep->bandwidth_hz) {
 	default:
 	case 8000000:
-		param.bandwidth = 8;
+		param->bandwidth = 8;
 		break;
 	case 7000000:
-		param.bandwidth = 7;
+		param->bandwidth = 7;
 		break;
 	case 6000000:
-		param.bandwidth = 6;
+		param->bandwidth = 6;
 		break;
 	}
 
-	err = dvb_usb_generic_rw(state->d,
-			(char *)&param, sizeof(param),
-			result, sizeof(result), 0);
+	err = dvb_usb_generic_rw(state->d, state->data, sizeof(*param),
+				 state->data, 2, 0);
 	if (err < 0)
 		err("cinergyt2_fe_set_frontend() Failed! err=%d\n", err);
 
+	mutex_unlock(&state->data_mutex);
 	return (err < 0) ? err : 0;
 }
 
@@ -281,6 +290,7 @@ struct dvb_frontend *cinergyt2_fe_attach(struct dvb_usb_device *d)
 	s->d = d;
 	memcpy(&s->fe.ops, &cinergyt2_fe_ops, sizeof(struct dvb_frontend_ops));
 	s->fe.demodulator_priv = s;
+	mutex_init(&s->data_mutex);
 	return &s->fe;
 }
 
-- 
2.7.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


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