[PATCH] Re: [linux-dvb] Sending diseqc commands on DST frontend

Philip Prindeville philipp_subx at redfish-solutions.com
Mon Nov 7 08:23:52 CET 2005


Manu Abraham wrote:

> Hello,
>
> Someone with a Twinhan card having diseqc equipment test this patch ?
> One needs to apply the cleanup patch and then the diseqc patch.
>
> Note:
> In the patch,
>
> +    if (cmd->msg_len == 0 || cmd->msg_len > 5)
>          return -EINVAL;
>
> please do change
>
> cmd->msg_len > 5 to cmd->msg_len > 6
>
> Thanks,
> Manu
>
>[snip]
>  
>

>--- dst.c.orig	2005-10-24 15:50:24.000000000 +0400
>+++ dst.c	2005-10-24 15:47:37.000000000 +0400
>@@ -630,7 +630,7 @@ struct dst_types dst_tlist[] = {
> 		.offset = 0,
> 		.dst_type =  DST_TYPE_IS_SAT,
> 		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
>-		.dst_feature = 0
>+		.dst_feature = DST_TYPE_HAS_DISEQC3
> 	},	/*	obsolete	*/
> 
> 	{
>@@ -639,7 +639,8 @@ struct dst_types dst_tlist[] = {
> 		.dst_type = DST_TYPE_IS_SAT,
> 		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE
> 						 | DST_TYPE_HAS_FW_1,
>-		.dst_feature = 0
>+
>+		.dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4
> 	},	/*	obsolete	*/
> 
> 	{
>@@ -659,7 +660,8 @@ struct dst_types dst_tlist[] = {
> 		.offset =  0,
> 		.dst_type = DST_TYPE_IS_SAT,
> 		.type_flags = DST_TYPE_HAS_SYMDIV | DST_TYPE_HAS_FW_1,
>-		.dst_feature = 0
>+		.dst_feature = DST_TYPE_HAS_DISEQC3 | DST_TYPE_HAS_DISEQC4 |
>+			       DST_TYPE_HAS_DISEQC5
> 	},	/*	obsolete	*/
> 
> 	{
>@@ -669,7 +671,8 @@ struct dst_types dst_tlist[] = {
> 		.type_flags = DST_TYPE_HAS_TS204 | DST_TYPE_HAS_NEWTUNE |
> 			      DST_TYPE_HAS_FW_1,
> 
>-		.dst_feature = DST_TYPE_HAS_CA
>+		.dst_feature = DST_TYPE_HAS_CA		| DST_TYPE_HAS_DISEQC3 |
>+			       DST_TYPE_HAS_DISEQC4	| DST_TYPE_HAS_DISEQC5
> 	},	/*	An OEM board	*/
> 
> 	{
>@@ -680,7 +683,7 @@ struct dst_types dst_tlist[] = {
> 			      DST_TYPE_HAS_FW_BUILD | DST_TYPE_HAS_INC_COUNT,
> 
> 		.dst_feature = DST_TYPE_HAS_CA		| DST_TYPE_HAS_DISEQC3 |
>-			       DST_TYPE_HAS_DISEQC4     | DST_TYPE_HAS_MOTO    |
>+			       DST_TYPE_HAS_DISEQC4     | DST_TYPE_HAS_DISEQC5 |
> 			       DST_TYPE_HAS_MAC
> 	},
> 
>@@ -1260,9 +1263,20 @@ static int dst_set_diseqc(struct dvb_fro
> 
> 	if (state->dst_type != DST_TYPE_IS_SAT)
> 		return 0;
>-	if (cmd->msg_len == 0 || cmd->msg_len > 4)
>+//	if (cmd->msg_len == 0 || cmd->msg_len > 4)
>+//		return -EINVAL;
>+	if (cmd->msg_len == 0 || cmd->msg_len > 5)
>  
>

Ok, this should be "6", not "5" as you said...


> 		return -EINVAL;
>-	memcpy(&paket[3], cmd->msg, cmd->msg_len);
>  
>

Why not keep this line, but put it after the checks?


>+	if ((cmd->msg_len == 3) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC3)) {
>+		memcpy(&paket[3], cmd->msg, cmd->msg_len);
>+		paket[2] = 0x03;
>+	} else if ((cmd->msg_len == 4) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC4)) {
>+		memcpy(&paket[3], cmd->msg, cmd->msg_len);
>+		paket[2] = 0x04;
>+	} else if ((cmd->msg_len == 5) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC5)) {
>+		memcpy(&paket[2], cmd->msg, cmd->msg_len);
>+	}
>  
>

Need:

     } else
           return -EINVAL;

here...  And then ... why not set:

    paket[2] = cmd->msg_len;


here instead?  And then following it with the above memcpy():

    memcpy(&paket[2], cmd->msg, cmd->msg_len);

The case of "msg_len == 6" never gets handled properly, however.

I couldn't find a case of DST_TYPE_HAS_MOTO being tested
anywhere...

>+
> 	paket[7] = dst_check_sum(&paket[0], 7);
> 	dst_command(state, paket, 8);
> 	return 0;
>
>  
>


In short, write the code as:

 	if (state->dst_type != DST_TYPE_IS_SAT)
 		return 0;
 	if (cmd->msg_len == 0 || cmd->msg_len > 6)
 		return -EINVAL;

 	if ((cmd->msg_len == 3) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC3)) {
 		;
 	} else if ((cmd->msg_len == 4) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC4)) {
 		;
 	} else if ((cmd->msg_len == 5) && (state->dst_hw_cap & DST_TYPE_HAS_DISEQC5)) {
 		;
 	} else
		return -EINVAL;

 	memcpy(&paket[3], cmd->msg, cmd->msg_len);
 	paket[2] = cmd->msg_len;
 	paket[7] = dst_check_sum(&paket[0], 7);
 	dst_command(state, paket, 8);
 	return 0;


Note that "msg_len == 6" will be handled by the "return -EINVAL".




More information about the linux-dvb mailing list