The patch number 12687 was added via Mauro Carvalho Chehab <mche...@redhat.com>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        Linux Media Mailing List <linux-me...@vger.kernel.org>

------

From: Mauro Carvalho Chehab  <mche...@redhat.com>
merge: http://hg.jannau.net/v4l-dvb/v4l-dvb


Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>


---

 linux/drivers/media/dvb/Kconfig                 |   13 +++++
 linux/drivers/media/dvb/dvb-core/dvb_frontend.c |   35 +++++++++++++---
 linux/drivers/media/dvb/dvb-core/dvbdev.h       |    5 ++
 3 files changed, 48 insertions(+), 5 deletions(-)

diff -r 9c963a87b840 -r 6fd2bdff3299 linux/drivers/media/dvb/Kconfig
--- a/linux/drivers/media/dvb/Kconfig   Sun Sep 06 23:52:29 2009 -0300
+++ b/linux/drivers/media/dvb/Kconfig   Mon Sep 07 00:01:14 2009 -0300
@@ -2,6 +2,19 @@
 # DVB device configuration
 #
 
+config DVB_MAX_ADAPTERS
+       int "maximum number of DVB/ATSC adapters"
+       depends on DVB_CORE
+       default 8
+       range 1 255
+       help
+         Maximum number of DVB/ATSC adapters. Increasing this number
+         increases the memory consumption of the DVB subsystem even
+         if a much lower number of DVB/ATSC adapters is present.
+         Only values in the range 4-32 are tested.
+
+         If you are unsure about this, use the default value 8
+
 config DVB_DYNAMIC_MINORS
        bool "Dynamic DVB minor allocation"
        depends on DVB_CORE
diff -r 9c963a87b840 -r 6fd2bdff3299 
linux/drivers/media/dvb/dvb-core/dvb_frontend.c
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c   Sun Sep 06 23:52:29 
2009 -0300
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c   Mon Sep 07 00:01:14 
2009 -0300
@@ -77,6 +77,7 @@
 #define FESTATE_ZIGZAG_FAST 32
 #define FESTATE_ZIGZAG_SLOW 64
 #define FESTATE_DISEQC 128
+#define FESTATE_ERROR 256
 #define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | 
FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
 #define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
 #define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
@@ -274,6 +275,7 @@
 {
        int autoinversion;
        int ready = 0;
+       int fe_set_err = 0;
        struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int original_inversion = fepriv->parameters.inversion;
        u32 original_frequency = fepriv->parameters.frequency;
@@ -350,7 +352,11 @@
        if (autoinversion)
                fepriv->parameters.inversion = fepriv->inversion;
        if (fe->ops.set_frontend)
-               fe->ops.set_frontend(fe, &fepriv->parameters);
+               fe_set_err = fe->ops.set_frontend(fe, &fepriv->parameters);
+       if (fe_set_err < 0) {
+               fepriv->state = FESTATE_ERROR;
+               return fe_set_err;
+       }
 
        fepriv->parameters.frequency = original_frequency;
        fepriv->parameters.inversion = original_inversion;
@@ -362,6 +368,7 @@
 static void dvb_frontend_swzigzag(struct dvb_frontend *fe)
 {
        fe_status_t s = 0;
+       int retval = 0;
        struct dvb_frontend_private *fepriv = fe->frontend_priv;
 
        /* if we've got no parameters, just keep idling */
@@ -375,8 +382,12 @@
        if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
                if (fepriv->state & FESTATE_RETUNE) {
                        if (fe->ops.set_frontend)
-                               fe->ops.set_frontend(fe, &fepriv->parameters);
-                       fepriv->state = FESTATE_TUNED;
+                               retval = fe->ops.set_frontend(fe,
+                                                       &fepriv->parameters);
+                       if (retval < 0)
+                               fepriv->state = FESTATE_ERROR;
+                       else
+                               fepriv->state = FESTATE_TUNED;
                }
                fepriv->delay = 3*HZ;
                fepriv->quality = 0;
@@ -454,7 +465,11 @@
                fepriv->delay = fepriv->min_delay;
 
                /* peform a tune */
-               if (dvb_frontend_swzigzag_autotune(fe, fepriv->check_wrapped)) {
+               retval = dvb_frontend_swzigzag_autotune(fe,
+                                                       fepriv->check_wrapped);
+               if (retval < 0) {
+                       return;
+               } else if (retval) {
                        /* OK, if we've run out of trials at the fast speed.
                         * Drop back to slow for the _next_ attempt */
                        fepriv->state = FESTATE_SEARCHING_SLOW;
@@ -834,6 +849,15 @@
                }
        }
 
+       /* check for supported modulation */
+       if (fe->ops.info.type == FE_QAM &&
+           (parms->u.qam.modulation > QAM_AUTO ||
+            !((1 << (parms->u.qam.modulation + 10)) & fe->ops.info.caps))) {
+               printk(KERN_WARNING "DVB: adapter %i frontend %i modulation %u 
not supported\n",
+                      fe->dvb->num, fe->id, parms->u.qam.modulation);
+                       return -EINVAL;
+       }
+
        return 0;
 }
 
@@ -1614,7 +1638,8 @@
 
                /* if retune was requested but hasn't occured yet, prevent
                 * that user get signal state from previous tuning */
-               if(fepriv->state == FESTATE_RETUNE) {
+               if (fepriv->state == FESTATE_RETUNE ||
+                   fepriv->state == FESTATE_ERROR) {
                        err=0;
                        *status = 0;
                        break;
diff -r 9c963a87b840 -r 6fd2bdff3299 linux/drivers/media/dvb/dvb-core/dvbdev.h
--- a/linux/drivers/media/dvb/dvb-core/dvbdev.h Sun Sep 06 23:52:29 2009 -0300
+++ b/linux/drivers/media/dvb/dvb-core/dvbdev.h Mon Sep 07 00:01:14 2009 -0300
@@ -30,7 +30,12 @@
 
 #define DVB_MAJOR 212
 
+#if defined(CONFIG_DVB_MAX_ADAPTERS) && CONFIG_DVB_MAX_ADAPTERS > 0
+#define DVB_MAX_ADAPTERS CONFIG_DVB_MAX_ADAPTERS
+#else
+#warning invalid CONFIG_DVB_MAX_ADAPTERS value
 #define DVB_MAX_ADAPTERS 8
+#endif
 
 #define DVB_UNSET (-1)
 


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/6fd2bdff329977a10ebdbf165d2d81b41e70a382

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to