lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <4E1D1DAF.4060900@redhat.com>
Date:	Wed, 13 Jul 2011 01:23:11 -0300
From:	Mauro Carvalho Chehab <mchehab@...hat.com>
To:	Simon Arlott <simon@...e.lp0.eu>
CC:	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
	linux-media@...r.kernel.org
Subject: Re: 2.6.39 "tuner-core: remove usage of DIGITAL_TV" breaks saa7134
 with mt2050

Em 12-07-2011 18:21, Simon Arlott escreveu:
> commit ad020dc2fe9039628cf6cef42cd1b76531ee8411
> Author: Mauro Carvalho Chehab <mchehab@...hat.com>
> Date:   Tue Feb 15 09:30:50 2011 -0200
> 
>     [media] tuner-core: remove usage of DIGITAL_TV
>     
>     tuner-core has no business to do with digital TV. So, don't use
>     T_DIGITAL_TV on it, as it has no code to distinguish between
>     them, and nobody fills T_DIGITAL_TV right.
>     
>     Signed-off-by: Mauro Carvalho Chehab <mchehab@...hat.com>
> 
> 
> This breaks my Pinnacle PCTV 300i DVB-T cards as they can no longer tune
> DVB-T.
> 
> [  540.010030] tuner 3-0043: Tuner doesn't support mode 3. Putting tuner to sleep
> [  540.011017] tuner 2-0043: Tuner doesn't support mode 3. Putting tuner to sleep
> [  540.012012] tuner 3-0060: Tuner doesn't support mode 3. Putting tuner to sleep
> [  540.013029] tuner 2-0060: Tuner doesn't support mode 3. Putting tuner to sleep
> 
> saa7134 needs to indicate digital TV tuning to mt20xx but it looks like
> tuner-core no longer has any way to allow a tuner to indicate support
> for this?
> 
> (mt2050_set_tv_freq in mt20xx.c uses V4L2_TUNER_DIGITAL_TV)
> 

Could you please try the enclosed patch? It should fix the issue.
I should probably rename T_ANALOG_TV to just T_TV, but I'll do it on
a next patch if this one works ok, as we don't want to send a renaming
patch to -stable.

---
[media] Fix Digital TV breakage with mt20xx tuner

The mt20xx tuner passes V4L2_TUNER_DIGITAL_TV to tuner core. However, the
check_mode code now doesn't handle it well. Change the logic there to
avoid the breakage, and fix a test for analog-only at g_tuner.

Signed-off-by: Mauro Carvalho Chehab <mchehab@...hat.com>

diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c
index 5748d04..aa45952 100644
--- a/drivers/media/video/tuner-core.c
+++ b/drivers/media/video/tuner-core.c
@@ -732,10 +732,19 @@ static int tuner_remove(struct i2c_client *client)
  * returns 0.
  * This function is needed for boards that have a separate tuner for
  * radio (like devices with tea5767).
+ * NOTE: mt20xx uses V4L2_TUNER_DIGITAL_TV and calls set_tv_freq to
+ *       select a TV frequency. So, t_mode = T_ANALOG_TV could actually
+ *	 be used to represent a Digital TV too.
  */
 static inline int check_mode(struct tuner *t, enum v4l2_tuner_type mode)
 {
-	if ((1 << mode & t->mode_mask) == 0)
+	int t_mode;
+	if (mode == V4L2_TUNER_RADIO)
+		t_mode = T_RADIO;
+	else
+		t_mode = T_ANALOG_TV;
+
+	if ((t_mode & t->mode_mask) == 0)
 		return -EINVAL;
 
 	return 0;
@@ -1034,7 +1043,7 @@ static void tuner_status(struct dvb_frontend *fe)
 	case V4L2_TUNER_RADIO:
 		p = "radio";
 		break;
-	case V4L2_TUNER_DIGITAL_TV:
+	case V4L2_TUNER_DIGITAL_TV: /* Used by mt20xx */
 		p = "digital TV";
 		break;
 	case V4L2_TUNER_ANALOG_TV:
@@ -1166,9 +1175,8 @@ static int tuner_g_tuner(struct v4l2_subdev *sd, struct v4l2_tuner *vt)
 	vt->type = t->mode;
 	if (analog_ops->get_afc)
 		vt->afc = analog_ops->get_afc(&t->fe);
-	if (t->mode == V4L2_TUNER_ANALOG_TV)
-		vt->capability |= V4L2_TUNER_CAP_NORM;
 	if (t->mode != V4L2_TUNER_RADIO) {
+		vt->capability |= V4L2_TUNER_CAP_NORM;
 		vt->rangelow = tv_range[0] * 16;
 		vt->rangehigh = tv_range[1] * 16;
 		return 0;
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ