Acked-by: André Roth <neol...@gmail.com>

On Tue, 18 Jun 2013 16:19:08 +0200
Guy Martin <gms...@tuxicoman.be> wrote:
> This patch copies the parms provided into a temporary buffer. This buffer 
> will then
> be used for any modification that needs to be performed. It makes the function
> dvb_fe_set_parms() thread-safe. Also, since the DTV_FREQUENCY is not 
> modified, it fixes
> a bug where dvbv5-scan retrieves the frequency from the parms and write it to 
> the
> channel file.
> 
> Signed-off-by: Guy Martin <gms...@tuxicoman.be>
> ---
>  lib/include/dvb-sat.h  |  1 -
>  lib/libdvbv5/dvb-fe.c  | 71 
> ++++++++++++++++++++++----------------------------
>  lib/libdvbv5/dvb-sat.c | 11 --------
>  3 files changed, 31 insertions(+), 52 deletions(-)
> 
> diff --git a/lib/include/dvb-sat.h b/lib/include/dvb-sat.h
> index 23df228..8b20c9e 100644
> --- a/lib/include/dvb-sat.h
> +++ b/lib/include/dvb-sat.h
> @@ -49,7 +49,6 @@ int print_lnb(int i);
>  void print_all_lnb(void);
>  const struct dvb_sat_lnb *dvb_sat_get_lnb(int i);
>  int dvb_sat_set_parms(struct dvb_v5_fe_parms *parms);
> -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms);
>  
>  #ifdef __cplusplus
>  }
> diff --git a/lib/libdvbv5/dvb-fe.c b/lib/libdvbv5/dvb-fe.c
> index b786a85..408423f 100644
> --- a/lib/libdvbv5/dvb-fe.c
> +++ b/lib/libdvbv5/dvb-fe.c
> @@ -551,7 +551,7 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms)
>                              delivery_system_name[parms->current_sys]);
>                       dvb_fe_prt_parms(parms);
>               }
> -             goto ret;
> +             return 0;
>       }
>       /* DVBv3 call */
>       if (ioctl(parms->fd, FE_GET_FRONTEND, &v3_parms) == -1) {
> @@ -592,32 +592,27 @@ int dvb_fe_get_parms(struct dvb_v5_fe_parms *parms)
>               return -EINVAL;
>       }
>  
> -ret:
> -     /* For satellite, need to recover from LNBf IF frequency */
> -     if (dvb_fe_is_satellite(parms->current_sys))
> -             return dvb_sat_get_parms(parms);
> -
>       return 0;
>  }
>  
>  int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms)
>  {
> +     /* Use a temporary copy of the parameters so we can safely perform
> +      * adjustments for satellite */
> +     struct dvb_v5_fe_parms tmp_parms = *parms;
> +
>       struct dtv_properties prop;
>       struct dvb_frontend_parameters v3_parms;
> -     uint32_t freq;
>       uint32_t bw;
>  
> -     struct dtv_property fe_prop[DTV_MAX_COMMAND];
> -
> -     if (dvb_fe_is_satellite(parms->current_sys)) {
> -             dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq);
> -             dvb_sat_set_parms(parms);
> -     }
> +     if (dvb_fe_is_satellite(tmp_parms.current_sys))
> +             dvb_sat_set_parms(&tmp_parms);
>  
> -     int n = dvb_copy_fe_props(parms->dvb_prop, parms->n_props, fe_prop);
> +     /* Filter out any user DTV_foo property such as DTV_POLARIZATION */
> +     tmp_parms.n_props = dvb_copy_fe_props(tmp_parms.dvb_prop, 
> tmp_parms.n_props, tmp_parms.dvb_prop);
>  
> -     prop.props = fe_prop;
> -     prop.num = n;
> +     prop.props = tmp_parms.dvb_prop;
> +     prop.num = tmp_parms.n_props;
>       prop.props[prop.num].cmd = DTV_TUNE;
>       prop.num++;
>  
> @@ -628,53 +623,49 @@ int dvb_fe_set_parms(struct dvb_v5_fe_parms *parms)
>                               dvb_fe_prt_parms(parms);
>                       return -1;
>               }
> -             goto ret;
> +             return 0;
>       }
>       /* DVBv3 call */
>  
> -     dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &v3_parms.frequency);
> -     dvb_fe_retrieve_parm(parms, DTV_INVERSION, &v3_parms.inversion);
> -     switch (parms->current_sys) {
> +     dvb_fe_retrieve_parm(&tmp_parms, DTV_FREQUENCY, &v3_parms.frequency);
> +     dvb_fe_retrieve_parm(&tmp_parms, DTV_INVERSION, &v3_parms.inversion);
> +     switch (tmp_parms.current_sys) {
>       case SYS_DVBS:
> -             dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, 
> &v3_parms.u.qpsk.symbol_rate);
> -             dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, 
> &v3_parms.u.qpsk.fec_inner);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, 
> &v3_parms.u.qpsk.symbol_rate);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, 
> &v3_parms.u.qpsk.fec_inner);
>               break;
>       case SYS_DVBC_ANNEX_AC:
> -             dvb_fe_retrieve_parm(parms, DTV_SYMBOL_RATE, 
> &v3_parms.u.qam.symbol_rate);
> -             dvb_fe_retrieve_parm(parms, DTV_INNER_FEC, 
> &v3_parms.u.qam.fec_inner);
> -             dvb_fe_retrieve_parm(parms, DTV_MODULATION, 
> &v3_parms.u.qam.modulation);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_SYMBOL_RATE, 
> &v3_parms.u.qam.symbol_rate);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_INNER_FEC, 
> &v3_parms.u.qam.fec_inner);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, 
> &v3_parms.u.qam.modulation);
>               break;
>       case SYS_ATSC:
>       case SYS_ATSCMH:
>       case SYS_DVBC_ANNEX_B:
> -             dvb_fe_retrieve_parm(parms, DTV_MODULATION, 
> &v3_parms.u.vsb.modulation);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, 
> &v3_parms.u.vsb.modulation);
>               break;
>       case SYS_DVBT:
>               for (bw = 0; fe_bandwidth_name[bw] != 0; bw++) {
>                       if (fe_bandwidth_name[bw] == v3_parms.u.ofdm.bandwidth)
>                               break;
>               }
> -             dvb_fe_retrieve_parm(parms, DTV_BANDWIDTH_HZ, &bw);
> -             dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_HP, 
> &v3_parms.u.ofdm.code_rate_HP);
> -             dvb_fe_retrieve_parm(parms, DTV_CODE_RATE_LP, 
> &v3_parms.u.ofdm.code_rate_LP);
> -             dvb_fe_retrieve_parm(parms, DTV_MODULATION, 
> &v3_parms.u.ofdm.constellation);
> -             dvb_fe_retrieve_parm(parms, DTV_TRANSMISSION_MODE, 
> &v3_parms.u.ofdm.transmission_mode);
> -             dvb_fe_retrieve_parm(parms, DTV_GUARD_INTERVAL, 
> &v3_parms.u.ofdm.guard_interval);
> -             dvb_fe_retrieve_parm(parms, DTV_HIERARCHY, 
> &v3_parms.u.ofdm.hierarchy_information);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_BANDWIDTH_HZ, &bw);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_HP, 
> &v3_parms.u.ofdm.code_rate_HP);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_CODE_RATE_LP, 
> &v3_parms.u.ofdm.code_rate_LP);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_MODULATION, 
> &v3_parms.u.ofdm.constellation);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_TRANSMISSION_MODE, 
> &v3_parms.u.ofdm.transmission_mode);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_GUARD_INTERVAL, 
> &v3_parms.u.ofdm.guard_interval);
> +             dvb_fe_retrieve_parm(&tmp_parms, DTV_HIERARCHY, 
> &v3_parms.u.ofdm.hierarchy_information);
>               break;
>       default:
>               return -EINVAL;
>       }
> -     if (ioctl(parms->fd, FE_SET_FRONTEND, &v3_parms) == -1) {
> +     if (ioctl(tmp_parms.fd, FE_SET_FRONTEND, &v3_parms) == -1) {
>               dvb_perror("FE_SET_FRONTEND");
> -             if (parms->verbose)
> -                     dvb_fe_prt_parms(parms);
> +             if (tmp_parms.verbose)
> +                     dvb_fe_prt_parms(&tmp_parms);
>               return -1;
>       }
> -ret:
> -     /* For satellite, need to recover from LNBf IF frequency */
> -     if (dvb_fe_is_satellite(parms->current_sys))
> -             dvb_fe_store_parm(parms, DTV_FREQUENCY, freq);
>  
>       return 0;
>  }
> diff --git a/lib/libdvbv5/dvb-sat.c b/lib/libdvbv5/dvb-sat.c
> index f84b5a4..3cbcf03 100644
> --- a/lib/libdvbv5/dvb-sat.c
> +++ b/lib/libdvbv5/dvb-sat.c
> @@ -394,17 +394,6 @@ ret:
>       return rc;
>  }
>  
> -int dvb_sat_get_parms(struct dvb_v5_fe_parms *parms)
> -{
> -     uint32_t freq = 0;
> -
> -     dvb_fe_retrieve_parm(parms, DTV_FREQUENCY, &freq);
> -     freq = abs(freq + parms->freq_offset);
> -     dvb_fe_store_parm(parms, DTV_FREQUENCY, freq);
> -
> -     return 0;
> -}
> -
>  const char *dvbsat_polarization_name[5] = {
>       "OFF",
>       "H",
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to