677b357
From patchwork Tue Sep 26 21:10:20 2017
677b357
Content-Type: text/plain; charset="utf-8"
677b357
MIME-Version: 1.0
677b357
Content-Transfer-Encoding: 7bit
677b357
Subject: [1/2] media: dvb-usb-v2: lmedm04: Improve logic checking of warm
677b357
 start.
677b357
From: Malcolm Priestley <tvboxspy@gmail.com>
677b357
X-Patchwork-Id: 44566
677b357
Message-Id: <20170926211021.11036-1-tvboxspy@gmail.com>
677b357
To: linux-media@vger.kernel.org
677b357
Cc: Andrey Konovalov <andreyknvl@google.com>,
677b357
 Malcolm Priestley <tvboxspy@gmail.com>
677b357
Date: Tue, 26 Sep 2017 22:10:20 +0100
677b357
677b357
Warm start has no check as whether a genuine device has
677b357
connected and proceeds to next execution path.
677b357
677b357
Check device should read 0x47 at offset of 2 on USB descriptor read
677b357
and it is the amount requested of 6 bytes.
677b357
677b357
Fix for
677b357
kasan: CONFIG_KASAN_INLINE enabled
677b357
kasan: GPF could be caused by NULL-ptr deref or user memory access as
677b357
677b357
Reported-by: Andrey Konovalov <andreyknvl@google.com>
677b357
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
677b357
---
677b357
 drivers/media/usb/dvb-usb-v2/lmedm04.c | 26 ++++++++++++++++++--------
677b357
 1 file changed, 18 insertions(+), 8 deletions(-)
677b357
677b357
diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
index 5e320fa4a795..992f2011a6ba 100644
677b357
--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
+++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
@@ -494,18 +494,23 @@ static int lme2510_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid,
677b357
 
677b357
 static int lme2510_return_status(struct dvb_usb_device *d)
677b357
 {
677b357
-	int ret = 0;
677b357
+	int ret;
677b357
 	u8 *data;
677b357
 
677b357
-	data = kzalloc(10, GFP_KERNEL);
677b357
+	data = kzalloc(6, GFP_KERNEL);
677b357
 	if (!data)
677b357
 		return -ENOMEM;
677b357
 
677b357
-	ret |= usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
677b357
-			0x06, 0x80, 0x0302, 0x00, data, 0x0006, 200);
677b357
-	info("Firmware Status: %x (%x)", ret , data[2]);
677b357
+	ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
677b357
+			      0x06, 0x80, 0x0302, 0x00,
677b357
+			      data, 0x6, 200);
677b357
+	if (ret != 6)
677b357
+		ret = -EINVAL;
677b357
+	else
677b357
+		ret = data[2];
677b357
+
677b357
+	info("Firmware Status: %6ph", data);
677b357
 
677b357
-	ret = (ret < 0) ? -ENODEV : data[2];
677b357
 	kfree(data);
677b357
 	return ret;
677b357
 }
677b357
@@ -1189,6 +1194,7 @@ static int lme2510_get_adapter_count(struct dvb_usb_device *d)
677b357
 static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
677b357
 {
677b357
 	struct lme2510_state *st = d->priv;
677b357
+	int status;
677b357
 
677b357
 	usb_reset_configuration(d->udev);
677b357
 
677b357
@@ -1197,12 +1203,16 @@ static int lme2510_identify_state(struct dvb_usb_device *d, const char **name)
677b357
 
677b357
 	st->dvb_usb_lme2510_firmware = dvb_usb_lme2510_firmware;
677b357
 
677b357
-	if (lme2510_return_status(d) == 0x44) {
677b357
+	status = lme2510_return_status(d);
677b357
+	if (status == 0x44) {
677b357
 		*name = lme_firmware_switch(d, 0);
677b357
 		return COLD;
677b357
 	}
677b357
 
677b357
-	return 0;
677b357
+	if (status != 0x47)
677b357
+		return -EINVAL;
677b357
+
677b357
+	return WARM;
677b357
 }
677b357
 
677b357
 static int lme2510_get_stream_config(struct dvb_frontend *fe, u8 *ts_type,
677b357
From patchwork Tue Sep 26 21:10:21 2017
677b357
Content-Type: text/plain; charset="utf-8"
677b357
MIME-Version: 1.0
677b357
Content-Transfer-Encoding: 7bit
677b357
Subject: [2/2] media: dvb-usb-v2: lmedm04: move ts2020 attach to
677b357
 dm04_lme2510_tuner
677b357
From: Malcolm Priestley <tvboxspy@gmail.com>
677b357
X-Patchwork-Id: 44567
677b357
Message-Id: <20170926211021.11036-2-tvboxspy@gmail.com>
677b357
To: linux-media@vger.kernel.org
677b357
Cc: Andrey Konovalov <andreyknvl@google.com>,
677b357
 Malcolm Priestley <tvboxspy@gmail.com>
677b357
Date: Tue, 26 Sep 2017 22:10:21 +0100
677b357
677b357
When the tuner was split from m88rs2000 the attach function is in wrong
677b357
place.
677b357
677b357
Move to dm04_lme2510_tuner to trap errors on failure and removing
677b357
a call to lme_coldreset.
677b357
677b357
Prevents driver starting up without any tuner connected.
677b357
677b357
Fixes to trap for ts2020 fail.
677b357
LME2510(C): FE Found M88RS2000
677b357
ts2020: probe of 0-0060 failed with error -11
677b357
...
677b357
LME2510(C): TUN Found RS2000 tuner
677b357
kasan: CONFIG_KASAN_INLINE enabled
677b357
kasan: GPF could be caused by NULL-ptr deref or user memory access
677b357
general protection fault: 0000 [#1] PREEMPT SMP KASAN
677b357
677b357
Reported-by: Andrey Konovalov <andreyknvl@google.com>
677b357
Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
677b357
Tested-by: Andrey Konovalov <andreyknvl@google.com>
677b357
---
677b357
 drivers/media/usb/dvb-usb-v2/lmedm04.c | 13 ++++++-------
677b357
 1 file changed, 6 insertions(+), 7 deletions(-)
677b357
677b357
diff --git a/drivers/media/usb/dvb-usb-v2/lmedm04.c b/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
index 992f2011a6ba..be26c029546b 100644
677b357
--- a/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
+++ b/drivers/media/usb/dvb-usb-v2/lmedm04.c
677b357
@@ -1076,8 +1076,6 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
677b357
 
677b357
 		if (adap->fe[0]) {
677b357
 			info("FE Found M88RS2000");
677b357
-			dvb_attach(ts2020_attach, adap->fe[0], &ts2020_config,
677b357
-					&d->i2c_adap);
677b357
 			st->i2c_tuner_gate_w = 5;
677b357
 			st->i2c_tuner_gate_r = 5;
677b357
 			st->i2c_tuner_addr = 0x60;
677b357
@@ -1143,17 +1141,18 @@ static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
677b357
 			ret = st->tuner_config;
677b357
 		break;
677b357
 	case TUNER_RS2000:
677b357
-		ret = st->tuner_config;
677b357
+		if (dvb_attach(ts2020_attach, adap->fe[0],
677b357
+			       &ts2020_config, &d->i2c_adap))
677b357
+			ret = st->tuner_config;
677b357
 		break;
677b357
 	default:
677b357
 		break;
677b357
 	}
677b357
 
677b357
-	if (ret)
677b357
+	if (ret) {
677b357
 		info("TUN Found %s tuner", tun_msg[ret]);
677b357
-	else {
677b357
-		info("TUN No tuner found --- resetting device");
677b357
-		lme_coldreset(d);
677b357
+	} else {
677b357
+		info("TUN No tuner found");
677b357
 		return -ENODEV;
677b357
 	}
677b357