While this patch change some things, the updated fields there are
used just on printk, so it shouldn't cause any functional changes.

Yet, this routine is a little complex, so explain a little more
how it works.

Signed-off-by: Mauro Carvalho Chehab <mche...@redhat.com>
---
 drivers/media/dvb/dvb-core/dvb_frontend.c |   27 ++++++++++++++++++---------
 1 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c 
b/drivers/media/dvb/dvb-core/dvb_frontend.c
index 128f677..0e079a1 100644
--- a/drivers/media/dvb/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb/dvb-core/dvb_frontend.c
@@ -1440,9 +1440,13 @@ static int set_delivery_system(struct dvb_frontend *fe, 
u32 desired_system)
        if (desired_system == SYS_UNDEFINED) {
                /*
                 * A DVBv3 call doesn't know what's the desired system.
-                * So, don't change the current delivery system. Instead,
-                * find the closest DVBv3 system that matches the delivery
-                * system.
+                * Also, DVBv3 applications don't know that ops.info->type
+                * could be changed, and they simply dies when it doesn't
+                * match.
+                * So, don't change the current delivery system, as it
+                * may be trying to do the wrong thing, like setting an
+                * ISDB-T frontend as DVB-T. Instead, find the closest
+                * DVBv3 system that matches the delivery system.
                 */
                if (is_dvbv3_delsys(c->delivery_system)) {
                        dprintk("%s() Using delivery system to %d\n",
@@ -1452,27 +1456,29 @@ static int set_delivery_system(struct dvb_frontend *fe, 
u32 desired_system)
                type = dvbv3_type(c->delivery_system);
                switch (type) {
                case DVBV3_QPSK:
-                       desired_system = FE_QPSK;
+                       desired_system = SYS_DVBS;
                        break;
                case DVBV3_QAM:
-                       desired_system = FE_QAM;
+                       desired_system = SYS_DVBC_ANNEX_A;
                        break;
                case DVBV3_ATSC:
-                       desired_system = FE_ATSC;
+                       desired_system = SYS_ATSC;
                        break;
                case DVBV3_OFDM:
-                       desired_system = FE_OFDM;
+                       desired_system = SYS_DVBT;
                        break;
                default:
                        dprintk("%s(): This frontend doesn't support DVBv3 
calls\n",
                                __func__);
                        return -EINVAL;
                }
-               delsys = c->delivery_system;
        } else {
                /*
-                * Check if the desired delivery system is supported
+                * This is a DVBv5 call. So, it likely knows the supported
+                * delivery systems.
                 */
+
+               /* Check if the desired delivery system is supported */
                ncaps = 0;
                while (fe->ops.delsys[ncaps] && ncaps < MAX_DELSYS) {
                        if (fe->ops.delsys[ncaps] == desired_system) {
@@ -1518,6 +1524,9 @@ static int set_delivery_system(struct dvb_frontend *fe, 
u32 desired_system)
        }
 
        /*
+        * The DVBv3 or DVBv5 call is requesting a different system. So,
+        * emulation is needed.
+        *
         * Emulate newer delivery systems like ISDBT, DVBT and DMBTH
         * for older DVBv5 applications. The emulation will try to use
         * the auto mode for most things, and will assume that the desired
-- 
1.7.7.5

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to