On 13/12/2017 13:58, Mauro Carvalho Chehab wrote:
> If sat_number is not filled (e.g. it is -1), the dvb-sat
> disables DiSEqC. However, currently, it also breaks support
> for non-bandstacking LNBf.
>
> Change the logic to fix it. There is a drawback on this
> approach, though: usually, on bandstacking arrangements,
> only one device needs to feed power to the LNBf. The
> others don't need to send power. With the previous code,
> no power would be sent at all, if sat_number == -1.
>
> Now, it will always power the LNBf when using it.
>
> Signed-off-by: Mauro Carvalho Chehab
> ---
> lib/libdvbv5/dvb-sat.c | 48
> 1 file changed, 24 insertions(+), 24 deletions(-)
>
> diff --git a/lib/libdvbv5/dvb-sat.c b/lib/libdvbv5/dvb-sat.c
> index b012318c4195..8c04f66f973b 100644
> --- a/lib/libdvbv5/dvb-sat.c
> +++ b/lib/libdvbv5/dvb-sat.c
> @@ -523,11 +523,8 @@ static int dvbsat_diseqc_set_input(struct
> dvb_v5_fe_parms_priv *parms,
> struct diseqc_cmd cmd;
> const struct dvb_sat_lnb_priv *lnb = (void *)parms->p.lnb;
>
> - /* Negative numbers means to not use a DiSEqC switch */
> - if (parms->p.sat_number < 0) {
> - /* If not bandstack, warn if DiSEqC is disabled */
> - if (!lnb->freqrange[0].pol)
> - dvb_logwarn(_("DiSEqC disabled. Probably won't tune."));
> + if (sat_number < 0 && t) {
> + dvb_logwarn(_("DiSEqC disabled. Can't tune using
> SCR/Unicable."));
> return 0;
> }
>
> @@ -546,7 +543,7 @@ static int dvbsat_diseqc_set_input(struct
> dvb_v5_fe_parms_priv *parms,
> vol_high = 1;
> } else {
> /* Adjust voltage/tone accordingly */
> - if (parms->p.sat_number < 2) {
> + if (sat_number < 2) {
> vol_high = pol_v ? 0 : 1;
> tone_on = high_band;
> }
> @@ -560,28 +557,31 @@ static int dvbsat_diseqc_set_input(struct
> dvb_v5_fe_parms_priv *parms,
> if (rc)
> return rc;
>
> - usleep(15 * 1000);
> -
> - if (!t)
> - rc = dvbsat_diseqc_write_to_port_group(parms, &cmd, high_band,
> - pol_v, sat_number);
> - else
> - rc = dvbsat_scr_odu_channel_change(parms, &cmd, high_band,
> - pol_v, sat_number, t);
> + if (sat_number >= 0) {
> + /* DiSEqC is enabled. Send DiSEqC commands */
> + usleep(15 * 1000);
>
> - if (rc) {
> - dvb_logerr(_("sending diseq failed"));
> - return rc;
> - }
> - usleep((15 + parms->p.diseqc_wait) * 1000);
> + if (!t)
> + rc = dvbsat_diseqc_write_to_port_group(parms, &cmd,
> high_band,
> + pol_v,
> sat_number);
> + else
> + rc = dvbsat_scr_odu_channel_change(parms, &cmd,
> high_band,
> + pol_v,
> sat_number, t);
>
> - /* miniDiSEqC/Toneburst commands are defined only for up to 2
> sattelites */
> - if (parms->p.sat_number < 2) {
> - rc = dvb_fe_diseqc_burst(&parms->p, parms->p.sat_number);
> - if (rc)
> + if (rc) {
> + dvb_logerr(_("sending diseq failed"));
> return rc;
> + }
> + usleep((15 + parms->p.diseqc_wait) * 1000);
> +
> + /* miniDiSEqC/Toneburst commands are defined only for up to 2
> sattelites */
> + if (parms->p.sat_number < 2) {
> + rc = dvb_fe_diseqc_burst(&parms->p,
> parms->p.sat_number);
> + if (rc)
> + return rc;
> + }
> + usleep(15 * 1000);
> }
> - usleep(15 * 1000);
>
> rc = dvb_fe_sec_tone(&parms->p, tone_on ? SEC_TONE_ON : SEC_TONE_OFF);
>
>
Tested-by: Rafaël Carré