[linux-dvb] dst tone/power patch

Yeasah Pell yeasah at schwide.com
Mon Aug 7 16:45:45 CEST 2006


I've had this dst patch kicking around for a while now -- it needs 
somebody else to try it out and confirm. If anybody's got a dst card and 
wouldn't mind trying out this patch, it'd be nice, as I'm getting a 
little tired of having this patch outstanding :-)

It changes the way the dst tone/power commands are issued, and has the 
following effects:

* Previously, tone/power commands would be partially co-mingled with 
tuning commands under some circumstances, and thus some commands could 
be lost (and bogus commands issued to the dst chip)

* The toneburst ("minidiseqc") command values were wrong (at least on my 
card), the new code generates the proper tonebursts. Somebody with a 
minidiseqc switch would have to verify this one. I bet nobody uses one 
of those though. FWIW, I did verify both with a scope and a minidiseqc 
switch, so it definitely works for my card anyway.

* It keeps better track of what the last state of the hardware was for 
the tone/power command so as to avoid unnecessary i2c traffic, but also 
to allow the retry of failed commands. (i.e. it won't squelch a repeat 
command if the last one failed)

thanks,
-yeasah
-------------- next part --------------
diff -r cf687ab6b0ab linux/drivers/media/dvb/bt8xx/dst.c
--- a/linux/drivers/media/dvb/bt8xx/dst.c	Mon Aug 07 10:44:33 2006 -0300
+++ b/linux/drivers/media/dvb/bt8xx/dst.c	Mon Aug 07 10:18:57 2006 -0400
@@ -1330,9 +1330,38 @@ static int dst_tone_power_cmd(struct dst
 
 	if (state->dst_type != DST_TYPE_IS_SAT)
 		return -EOPNOTSUPP;
-	paket[4] = state->tx_tuna[4];
-	paket[2] = state->tx_tuna[2];
-	paket[3] = state->tx_tuna[3];
+
+	switch (state->tone) {
+	case SEC_TONE_OFF:
+		if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
+			paket[2] = 0x00;
+		else
+			paket[2] = 0xff;
+		break;
+	case SEC_TONE_ON:
+		paket[2] = 0x02;
+		break;
+	}
+
+	switch (state->minicmd) {
+	case SEC_MINI_A:
+		paket[3] = 0x00;
+		break;
+	case SEC_MINI_B:
+		paket[3] = 0x01;
+		break;
+	}
+	state->minicmd = -1;
+
+	switch (state->voltage) {
+	case SEC_VOLTAGE_OFF:
+		paket[4] = 0x00;
+		break;
+	default:
+		paket[4] = 0x01;
+		break;
+	}
+
 	paket[7] = dst_check_sum (paket, 7);
 	return dst_command(state, paket, 8);
 }
@@ -1476,79 +1505,70 @@ static int dst_set_diseqc(struct dvb_fro
 
 static int dst_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
 {
-	int need_cmd, retval = 0;
+	int retval = 0;
 	struct dst_state *state = fe->demodulator_priv;
 
 	state->voltage = voltage;
 	if (state->dst_type != DST_TYPE_IS_SAT)
 		return -EOPNOTSUPP;
-
-	need_cmd = 0;
 
 	switch (voltage) {
 	case SEC_VOLTAGE_13:
 	case SEC_VOLTAGE_18:
 		if ((state->diseq_flags & HAS_POWER) == 0)
-			need_cmd = 1;
-		state->diseq_flags |= HAS_POWER;
-		state->tx_tuna[4] = 0x01;
+			retval = dst_tone_power_cmd(state);
+		if (retval == 0)
+			state->diseq_flags |= HAS_POWER;
 		break;
 	case SEC_VOLTAGE_OFF:
-		need_cmd = 1;
-		state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
-		state->tx_tuna[4] = 0x00;
+		if ((state->diseq_flags & HAS_POWER) != 0)
+			retval = dst_tone_power_cmd(state);
+		if (retval == 0)
+			state->diseq_flags &= ~(HAS_POWER | HAS_LOCK | ATTEMPT_TUNE);
 		break;
 	default:
 		return -EINVAL;
 	}
 
-	if (need_cmd)
-		retval = dst_tone_power_cmd(state);
-
 	return retval;
 }
 
 static int dst_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
 {
+	int retval = -EINVAL;
 	struct dst_state *state = fe->demodulator_priv;
 
-	state->tone = tone;
 	if (state->dst_type != DST_TYPE_IS_SAT)
 		return -EOPNOTSUPP;
 
 	switch (tone) {
 	case SEC_TONE_OFF:
-		if (state->type_flags & DST_TYPE_HAS_OBS_REGS)
-		    state->tx_tuna[2] = 0x00;
-		else
-		    state->tx_tuna[2] = 0xff;
-		break;
-
 	case SEC_TONE_ON:
-		state->tx_tuna[2] = 0x02;
-		break;
-	default:
-		return -EINVAL;
-	}
-	return dst_tone_power_cmd(state);
+		state->tone = tone;
+		retval = dst_tone_power_cmd(state);
+		if (retval != 0)
+			state->tone = -1;
+		break;
+	}
+	return retval;
 }
 
 static int dst_send_burst(struct dvb_frontend *fe, fe_sec_mini_cmd_t minicmd)
 {
+	int retval = -EINVAL;
 	struct dst_state *state = fe->demodulator_priv;
 
 	if (state->dst_type != DST_TYPE_IS_SAT)
 		return -EOPNOTSUPP;
-	state->minicmd = minicmd;
+
 	switch (minicmd) {
 	case SEC_MINI_A:
-		state->tx_tuna[3] = 0x02;
-		break;
 	case SEC_MINI_B:
-		state->tx_tuna[3] = 0xff;
-		break;
-	}
-	return dst_tone_power_cmd(state);
+		state->minicmd = minicmd;
+		retval = dst_tone_power_cmd(state);
+		break;
+	}
+	return retval;
 }
 
 
@@ -1565,8 +1585,9 @@ static int dst_init(struct dvb_frontend 
 	static u8 atsc_tuner[] = { 0x00, 0x00, 0x03, 0xb6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00 };
 
 	state->inversion = INVERSION_OFF;
-	state->voltage = SEC_VOLTAGE_13;
-	state->tone = SEC_TONE_OFF;
+	state->voltage = -1;
+	state->tone = -1;
+	state->minicmd = -1;
 	state->diseq_flags = 0;
 	state->k22 = 0x02;
 	state->bandwidth = BANDWIDTH_7_MHZ;


More information about the linux-dvb mailing list