Commit 2440f7af authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab
Browse files

[media] Properly implement ITU-T J.88 Annex C support



The Annex C support were broken with the previous implementation,
as, at xc5000 and tda18271c2dd, it were choosing the wrong bandwidth
for some symbol rates.

At DRX-J, it were always selecting Annex A, even having Annex C
support coded there.

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 39ce61a8
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -628,20 +628,12 @@ static void xc_debug_dump(struct xc5000_priv *priv)
	dprintk(1, "*** Quality (0:<8dB, 7:>56dB) = %d\n", quality);
}

/*
 * As defined on EN 300 429, the DVB-C roll-off factor is 0.15.
 * So, the amount of the needed bandwith is given by:
 * 	Bw = Symbol_rate * (1 + 0.15)
 * As such, the maximum symbol rate supported by 6 MHz is given by:
 *	max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
 */
#define MAX_SYMBOL_RATE_6MHz	5217391

static int xc5000_set_params(struct dvb_frontend *fe,
	struct dvb_frontend_parameters *params)
{
	struct xc5000_priv *priv = fe->tuner_priv;
	int ret;
	u32 bw;

	if (xc5000_is_firmware_loaded(fe) != XC_RESULT_SUCCESS) {
		if (xc_load_fw_and_init_tuner(fe) != XC_RESULT_SUCCESS) {
@@ -707,11 +699,19 @@ static int xc5000_set_params(struct dvb_frontend *fe,
			dprintk(1, "%s() QAM modulation\n", __func__);
			priv->rf_mode = XC_RF_MODE_CABLE;
			/*
			 * Using a 8MHz bandwidth sometimes fail
			 * with 6MHz-spaced channels, due to inter-carrier
			 * interference. So, use DTV6 firmware
			 * Using a higher bandwidth at the tuner filter may
			 * allow inter-carrier interference.
			 * So, determine the minimal channel spacing, in order
			 * to better adjust the tuner filter.
			 * According with ITU-T J.83, the bandwidth is given by:
			 * bw = Simbol Rate * (1 + roll_off), where the roll_off
			 * is equal to 0.15 for Annex A, and 0.13 for annex C
			 */
			if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz) {
			if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
				bw = (params->u.qam.symbol_rate * 13) / 10;
			else
				bw = (params->u.qam.symbol_rate * 15) / 10;
			if (bw <= 6000000) {
				priv->bandwidth = BANDWIDTH_6_MHZ;
				priv->video_standard = DTV6;
				priv->freq_hz = params->frequency - 1750000;
+7 −0
Original line number Diff line number Diff line
@@ -6218,6 +6218,13 @@ static int drxk_set_parameters(struct dvb_frontend *fe,
		return -EINVAL;
	}

	if (state->m_OperationMode == OM_QAM_ITU_A ||
	    state->m_OperationMode == OM_QAM_ITU_C) {
		if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
			state->m_OperationMode = OM_QAM_ITU_C;
		else
			state->m_OperationMode = OM_QAM_ITU_A;
	}

	if (fe->ops.i2c_gate_ctrl)
		fe->ops.i2c_gate_ctrl(fe, 1);
+17 −15
Original line number Diff line number Diff line
@@ -1123,20 +1123,6 @@ static int release(struct dvb_frontend *fe)
	return 0;
}

/*
 * As defined on EN 300 429 Annex A and on ITU-T J.83 annex A, the DVB-C
 * roll-off factor is 0.15.
 * According with the specs, the amount of the needed bandwith is given by:
 *	Bw = Symbol_rate * (1 + 0.15)
 * As such, the maximum symbol rate supported by 6 MHz is
 *	max_symbol_rate = 6 MHz / 1.15 = 5217391 Bauds
 *NOTE: For ITU-T J.83 Annex C, the roll-off factor is 0.13. So:
 *	max_symbol_rate = 6 MHz / 1.13 = 5309735 Baud
 *	That means that an adjustment is needed for Japan,
 *	but, as currently DRX-K is hardcoded to Annex A, let's stick
 *	with 0.15 roll-off factor.
 */
#define MAX_SYMBOL_RATE_6MHz	5217391

static int set_params(struct dvb_frontend *fe,
		      struct dvb_frontend_parameters *params)
@@ -1144,6 +1130,7 @@ static int set_params(struct dvb_frontend *fe,
	struct tda_state *state = fe->tuner_priv;
	int status = 0;
	int Standard;
	u32 bw;

	state->m_Frequency = params->frequency;

@@ -1161,8 +1148,23 @@ static int set_params(struct dvb_frontend *fe,
			break;
		}
	else if (fe->ops.info.type == FE_QAM) {
		if (params->u.qam.symbol_rate <= MAX_SYMBOL_RATE_6MHz)
		/*
		 * Using a higher bandwidth at the tuner filter may
		 * allow inter-carrier interference.
		 * So, determine the minimal channel spacing, in order
		 * to better adjust the tuner filter.
		 * According with ITU-T J.83, the bandwidth is given by:
		 * bw = Simbol Rate * (1 + roll_off), where the roll_off
		 * is equal to 0.15 for Annex A, and 0.13 for annex C
		 */
		if (fe->dtv_property_cache.rolloff == ROLLOFF_13)
			bw = (params->u.qam.symbol_rate * 13) / 10;
		else
			bw = (params->u.qam.symbol_rate * 15) / 10;
		if (bw <= 6000000)
			Standard = HF_DVBC_6MHZ;
		else if (bw <= 7000000)
			Standard = HF_DVBC_7MHZ;
		else
			Standard = HF_DVBC_8MHZ;
	} else