From 37fa53c6a13ac9e82f9c6d334862b514e34de2a4 Mon Sep 17 00:00:00 2001 From: Mauro Carvalho Chehab Date: Thu, 5 Jan 2012 14:39:05 -0200 Subject: [PATCH] [media] dvb_frontend: improve documentation on set_delivery_system() 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 --- drivers/media/dvb/dvb-core/dvb_frontend.c | 27 ++++++++++++++++++--------- 1 file 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 -- 2.7.4