diff mbox

Proposed modifications to dvb_frontend_ops

Message ID CAA9z4LY6cWEm+4ed7HM3ga0dohsg6LJ6Z4XSge9i4FguJR=FJw@mail.gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Chris Lee July 19, 2013, 8:27 p.m. UTC
In frontend.h we have a struct called dvb_frontend_ops, in there we
have an element called delsys to show the delivery systems supported
by the tuner, Id like to propose we add onto that with delmod and
delfec.

Its not a perfect solution as sometimes a specific modulation or fec
is only availible on specific systems. But its better then what we
have now. The struct fe_caps isnt really suited for this, its missing
many systems, modulations, and fec's. Its just not expandable enough
to get all the supported sys/mod/fec a tuner supports in there.

Expanding this would allow user land applications to poll the tuner to
determine more detailed information on the tuners capabilities.

Here is the patch I propose, along with the au8522 driver modified to
utilize the new elements. Id like to hear comments on it. Does anyone
see a better way of doing this ?

Chris Lee <updatelee@gmail.com>

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Mauro Carvalho Chehab July 22, 2013, 11:21 a.m. UTC | #1
Hi Chris,

Em Fri, 19 Jul 2013 14:27:09 -0600
Chris Lee <updatelee@gmail.com> escreveu:

> In frontend.h we have a struct called dvb_frontend_ops, in there we
> have an element called delsys to show the delivery systems supported
> by the tuner, Id like to propose we add onto that with delmod and
> delfec.
> 
> Its not a perfect solution as sometimes a specific modulation or fec
> is only availible on specific systems. But its better then what we
> have now. The struct fe_caps isnt really suited for this, its missing
> many systems, modulations, and fec's. Its just not expandable enough
> to get all the supported sys/mod/fec a tuner supports in there.
> 
> Expanding this would allow user land applications to poll the tuner to
> determine more detailed information on the tuners capabilities.
> 
> Here is the patch I propose, along with the au8522 driver modified to
> utilize the new elements. Id like to hear comments on it. Does anyone
> see a better way of doing this ?

We had a discussion some time ago about it. Basically, a device that
it is said to support, let's say, DVB-T, should support all possible
modulations and FECs that are part of the system.

So, in thesis, there shouldn't be any need to add a list of modulations
and FECs.

Also, frontends that support multiple delivery systems would need
to enumerate the modulations and FECs after the selection of a given
delivery system (as, typically, they only support a subset of them
for each delsys).

Ok, practice is different, as there are reverse-engineered drivers
that may not support everything that the hardware supports. Also,
a few hardware may have additional restrictions.

Yet, on those cases, the userspace may detect if a given modulation
type or FEC is supported, by trying to set it and check if the
operation didn't fail, and if the cache got properly updated.

So, at the end, it was decided to not add anything like that.

Yet, it is good to see other opinions.

It should be said that one of the hard parts of an approach like
that, is that someone would need to dig into each driver and add
the proper support for per-delsys modulation and FECs.

Alternatively, the core could initialize it to the default value
for each standard, and call some driver-specific function that
would reset the modulation/FECs that aren't supported by some
specific drivers.

Regards,
Mauro

> 
> Chris Lee <updatelee@gmail.com>
> 
> diff --git a/drivers/media/dvb-core/dvb_frontend.c
> b/drivers/media/dvb-core/dvb_frontend.c
> index 1f925e8..f5df08e 100644
> --- a/drivers/media/dvb-core/dvb_frontend.c
> +++ b/drivers/media/dvb-core/dvb_frontend.c
> @@ -1036,6 +1036,8 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
>   _DTV_CMD(DTV_API_VERSION, 0, 0),
> 
>   _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
> + _DTV_CMD(DTV_ENUM_DELMOD, 0, 0),
> + _DTV_CMD(DTV_ENUM_DELFEC, 0, 0),
> 
>   _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
>   _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
> @@ -1285,6 +1287,22 @@ static int dtv_property_process_get(struct
> dvb_frontend *fe,
>   }
>   tvp->u.buffer.len = ncaps;
>   break;
> + case DTV_ENUM_DELMOD:
> + ncaps = 0;
> + while (fe->ops.delmod[ncaps] && ncaps < MAX_DELMOD) {
> + tvp->u.buffer.data[ncaps] = fe->ops.delmod[ncaps];
> + ncaps++;
> + }
> + tvp->u.buffer.len = ncaps;
> + break;
> + case DTV_ENUM_DELFEC:
> + ncaps = 0;
> + while (fe->ops.delfec[ncaps] && ncaps < MAX_DELFEC) {
> + tvp->u.buffer.data[ncaps] = fe->ops.delfec[ncaps];
> + ncaps++;
> + }
> + tvp->u.buffer.len = ncaps;
> + break;
>   case DTV_FREQUENCY:
>   tvp->u.data = c->frequency;
>   break;
> diff --git a/drivers/media/dvb-core/dvb_frontend.h
> b/drivers/media/dvb-core/dvb_frontend.h
> index 371b6ca..4e96640 100644
> --- a/drivers/media/dvb-core/dvb_frontend.h
> +++ b/drivers/media/dvb-core/dvb_frontend.h
> @@ -47,6 +47,8 @@
>   * should be smaller or equal to 32
>   */
>  #define MAX_DELSYS 8
> +#define MAX_DELMOD 8
> +#define MAX_DELFEC 32
> 
>  struct dvb_frontend_tune_settings {
>   int min_delay_ms;
> @@ -263,6 +265,8 @@ struct dvb_frontend_ops {
>   struct dvb_frontend_info info;
> 
>   u8 delsys[MAX_DELSYS];
> + u8 delmod[MAX_DELMOD];
> + u8 delfec[MAX_DELFEC];
> 
>   void (*release)(struct dvb_frontend* fe);
>   void (*release_sec)(struct dvb_frontend* fe);
> diff --git a/include/uapi/linux/dvb/frontend.h
> b/include/uapi/linux/dvb/frontend.h
> index c56d77c..be63d37 100644
> --- a/include/uapi/linux/dvb/frontend.h
> +++ b/include/uapi/linux/dvb/frontend.h
> @@ -375,7 +375,10 @@ struct dvb_frontend_event {
>  #define DTV_STAT_ERROR_BLOCK_COUNT 68
>  #define DTV_STAT_TOTAL_BLOCK_COUNT 69
> 
> -#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT
> +#define DTV_ENUM_DELMOD 70
> +#define DTV_ENUM_DELFEC 71
> +
> +#define DTV_MAX_COMMAND DTV_ENUM_DELFEC
> 
>  typedef enum fe_pilot {
>   PILOT_ON,
> diff --git a/drivers/media/dvb-frontends/au8522_dig.c
> b/drivers/media/dvb-frontends/au8522_dig.c
> index 6ee9028..1044c9d 100644
> --- a/drivers/media/dvb-frontends/au8522_dig.c
> +++ b/drivers/media/dvb-frontends/au8522_dig.c
> @@ -822,7 +822,9 @@ error:
>  EXPORT_SYMBOL(au8522_attach);
> 
>  static struct dvb_frontend_ops au8522_ops = {
> - .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
> + .delsys = { SYS_DVBC_ANNEX_B, SYS_ATSC },
> + .delmod = { QAM_256, QAM_64, VSB_8 },
> + .delfec = { FEC_NONE },
>   .info = {
>   .name = "Auvitek AU8522 QAM/8VSB Frontend",
>   .frequency_min = 54000000,
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Lee July 23, 2013, 1:28 a.m. UTC | #2
By using DTV_SET_PROPERTY I can run though a list of possible systems
to determine what is supported and what isnt. I havent looked too far
but I think it uses delsys to determine this information. Which I can
already get from DTV_ENUM_DELSYS. This functionality could be expanded
to delmod and delfec.

But there is no way to pol modulations or fec using DTV_SET_PROPERTY.
I understand there is FE_CAN_*** for modulations and fecs but its far
from complete and not very expandable. If we only went on FE_CAN_ for
fec we'd be missing about half the supported fec's.

Ultimately Id like a solution that would have modulations per system,
and fec per modulation as they are quite often different. The
delsys/delmod/delfec is a simpler cleaner interface that is adding new
functionality and wouldnt be required for drivers or userland to
implement if they dont want to as the patch stands (if we implemented
DTV_SET_PROPERTY checks against delmod/delfec then it would be
required in drivers)

So Id love to hear more comments on this subject, it would really be
nice to clean some of the inadequacies up, imo userland should have
the ability to pol the driver for supported systems/modulation/fec vs
just trying everything and seeing what works and what doesnt.

Thanks,
Chris



On Mon, Jul 22, 2013 at 5:21 AM, Mauro Carvalho Chehab
<m.chehab@samsung.com> wrote:
> Hi Chris,
>
> Em Fri, 19 Jul 2013 14:27:09 -0600
> Chris Lee <updatelee@gmail.com> escreveu:
>
>> In frontend.h we have a struct called dvb_frontend_ops, in there we
>> have an element called delsys to show the delivery systems supported
>> by the tuner, Id like to propose we add onto that with delmod and
>> delfec.
>>
>> Its not a perfect solution as sometimes a specific modulation or fec
>> is only availible on specific systems. But its better then what we
>> have now. The struct fe_caps isnt really suited for this, its missing
>> many systems, modulations, and fec's. Its just not expandable enough
>> to get all the supported sys/mod/fec a tuner supports in there.
>>
>> Expanding this would allow user land applications to poll the tuner to
>> determine more detailed information on the tuners capabilities.
>>
>> Here is the patch I propose, along with the au8522 driver modified to
>> utilize the new elements. Id like to hear comments on it. Does anyone
>> see a better way of doing this ?
>
> We had a discussion some time ago about it. Basically, a device that
> it is said to support, let's say, DVB-T, should support all possible
> modulations and FECs that are part of the system.
>
> So, in thesis, there shouldn't be any need to add a list of modulations
> and FECs.
>
> Also, frontends that support multiple delivery systems would need
> to enumerate the modulations and FECs after the selection of a given
> delivery system (as, typically, they only support a subset of them
> for each delsys).
>
> Ok, practice is different, as there are reverse-engineered drivers
> that may not support everything that the hardware supports. Also,
> a few hardware may have additional restrictions.
>
> Yet, on those cases, the userspace may detect if a given modulation
> type or FEC is supported, by trying to set it and check if the
> operation didn't fail, and if the cache got properly updated.
>
> So, at the end, it was decided to not add anything like that.
>
> Yet, it is good to see other opinions.
>
> It should be said that one of the hard parts of an approach like
> that, is that someone would need to dig into each driver and add
> the proper support for per-delsys modulation and FECs.
>
> Alternatively, the core could initialize it to the default value
> for each standard, and call some driver-specific function that
> would reset the modulation/FECs that aren't supported by some
> specific drivers.
>
> Regards,
> Mauro
>
>>
>> Chris Lee <updatelee@gmail.com>
>>
>> diff --git a/drivers/media/dvb-core/dvb_frontend.c
>> b/drivers/media/dvb-core/dvb_frontend.c
>> index 1f925e8..f5df08e 100644
>> --- a/drivers/media/dvb-core/dvb_frontend.c
>> +++ b/drivers/media/dvb-core/dvb_frontend.c
>> @@ -1036,6 +1036,8 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
>>   _DTV_CMD(DTV_API_VERSION, 0, 0),
>>
>>   _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
>> + _DTV_CMD(DTV_ENUM_DELMOD, 0, 0),
>> + _DTV_CMD(DTV_ENUM_DELFEC, 0, 0),
>>
>>   _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
>>   _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
>> @@ -1285,6 +1287,22 @@ static int dtv_property_process_get(struct
>> dvb_frontend *fe,
>>   }
>>   tvp->u.buffer.len = ncaps;
>>   break;
>> + case DTV_ENUM_DELMOD:
>> + ncaps = 0;
>> + while (fe->ops.delmod[ncaps] && ncaps < MAX_DELMOD) {
>> + tvp->u.buffer.data[ncaps] = fe->ops.delmod[ncaps];
>> + ncaps++;
>> + }
>> + tvp->u.buffer.len = ncaps;
>> + break;
>> + case DTV_ENUM_DELFEC:
>> + ncaps = 0;
>> + while (fe->ops.delfec[ncaps] && ncaps < MAX_DELFEC) {
>> + tvp->u.buffer.data[ncaps] = fe->ops.delfec[ncaps];
>> + ncaps++;
>> + }
>> + tvp->u.buffer.len = ncaps;
>> + break;
>>   case DTV_FREQUENCY:
>>   tvp->u.data = c->frequency;
>>   break;
>> diff --git a/drivers/media/dvb-core/dvb_frontend.h
>> b/drivers/media/dvb-core/dvb_frontend.h
>> index 371b6ca..4e96640 100644
>> --- a/drivers/media/dvb-core/dvb_frontend.h
>> +++ b/drivers/media/dvb-core/dvb_frontend.h
>> @@ -47,6 +47,8 @@
>>   * should be smaller or equal to 32
>>   */
>>  #define MAX_DELSYS 8
>> +#define MAX_DELMOD 8
>> +#define MAX_DELFEC 32
>>
>>  struct dvb_frontend_tune_settings {
>>   int min_delay_ms;
>> @@ -263,6 +265,8 @@ struct dvb_frontend_ops {
>>   struct dvb_frontend_info info;
>>
>>   u8 delsys[MAX_DELSYS];
>> + u8 delmod[MAX_DELMOD];
>> + u8 delfec[MAX_DELFEC];
>>
>>   void (*release)(struct dvb_frontend* fe);
>>   void (*release_sec)(struct dvb_frontend* fe);
>> diff --git a/include/uapi/linux/dvb/frontend.h
>> b/include/uapi/linux/dvb/frontend.h
>> index c56d77c..be63d37 100644
>> --- a/include/uapi/linux/dvb/frontend.h
>> +++ b/include/uapi/linux/dvb/frontend.h
>> @@ -375,7 +375,10 @@ struct dvb_frontend_event {
>>  #define DTV_STAT_ERROR_BLOCK_COUNT 68
>>  #define DTV_STAT_TOTAL_BLOCK_COUNT 69
>>
>> -#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT
>> +#define DTV_ENUM_DELMOD 70
>> +#define DTV_ENUM_DELFEC 71
>> +
>> +#define DTV_MAX_COMMAND DTV_ENUM_DELFEC
>>
>>  typedef enum fe_pilot {
>>   PILOT_ON,
>> diff --git a/drivers/media/dvb-frontends/au8522_dig.c
>> b/drivers/media/dvb-frontends/au8522_dig.c
>> index 6ee9028..1044c9d 100644
>> --- a/drivers/media/dvb-frontends/au8522_dig.c
>> +++ b/drivers/media/dvb-frontends/au8522_dig.c
>> @@ -822,7 +822,9 @@ error:
>>  EXPORT_SYMBOL(au8522_attach);
>>
>>  static struct dvb_frontend_ops au8522_ops = {
>> - .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
>> + .delsys = { SYS_DVBC_ANNEX_B, SYS_ATSC },
>> + .delmod = { QAM_256, QAM_64, VSB_8 },
>> + .delfec = { FEC_NONE },
>>   .info = {
>>   .name = "Auvitek AU8522 QAM/8VSB Frontend",
>>   .frequency_min = 54000000,
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-media" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
>
> --
>
> Cheers,
> Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Mauro Carvalho Chehab July 23, 2013, 1:03 p.m. UTC | #3
Em Mon, 22 Jul 2013 19:28:55 -0600
Chris Lee <updatelee@gmail.com> escreveu:

> By using DTV_SET_PROPERTY I can run though a list of possible systems
> to determine what is supported and what isnt. I havent looked too far
> but I think it uses delsys to determine this information. Which I can
> already get from DTV_ENUM_DELSYS. This functionality could be expanded
> to delmod and delfec.
> 
> But there is no way to pol modulations or fec using DTV_SET_PROPERTY.
> I understand there is FE_CAN_*** for modulations and fecs but its far
> from complete and not very expandable. If we only went on FE_CAN_ for
> fec we'd be missing about half the supported fec's.
> 
> Ultimately Id like a solution that would have modulations per system,
> and fec per modulation as they are quite often different. The
> delsys/delmod/delfec is a simpler cleaner interface that is adding new
> functionality and wouldnt be required for drivers or userland to
> implement if they dont want to as the patch stands (if we implemented
> DTV_SET_PROPERTY checks against delmod/delfec then it would be
> required in drivers)
> 
> So Id love to hear more comments on this subject, it would really be
> nice to clean some of the inadequacies up, imo userland should have
> the ability to pol the driver for supported systems/modulation/fec vs
> just trying everything and seeing what works and what doesnt.

Well, if we're going to properly implement it, then we need to deprecate
the .caps field at the dvb structure, replacing it by the new DVBv5
equivalent, adding a DVBv3 backward code at dvb_frontend.c that will use
the new DVBv5 "caps" to fill the DVBv3 caps.

> 
> Thanks,
> Chris
> 
> 
> 
> On Mon, Jul 22, 2013 at 5:21 AM, Mauro Carvalho Chehab
> <m.chehab@samsung.com> wrote:
> > Hi Chris,
> >
> > Em Fri, 19 Jul 2013 14:27:09 -0600
> > Chris Lee <updatelee@gmail.com> escreveu:
> >
> >> In frontend.h we have a struct called dvb_frontend_ops, in there we
> >> have an element called delsys to show the delivery systems supported
> >> by the tuner, Id like to propose we add onto that with delmod and
> >> delfec.
> >>
> >> Its not a perfect solution as sometimes a specific modulation or fec
> >> is only availible on specific systems. But its better then what we
> >> have now. The struct fe_caps isnt really suited for this, its missing
> >> many systems, modulations, and fec's. Its just not expandable enough
> >> to get all the supported sys/mod/fec a tuner supports in there.
> >>
> >> Expanding this would allow user land applications to poll the tuner to
> >> determine more detailed information on the tuners capabilities.
> >>
> >> Here is the patch I propose, along with the au8522 driver modified to
> >> utilize the new elements. Id like to hear comments on it. Does anyone
> >> see a better way of doing this ?
> >
> > We had a discussion some time ago about it. Basically, a device that
> > it is said to support, let's say, DVB-T, should support all possible
> > modulations and FECs that are part of the system.
> >
> > So, in thesis, there shouldn't be any need to add a list of modulations
> > and FECs.
> >
> > Also, frontends that support multiple delivery systems would need
> > to enumerate the modulations and FECs after the selection of a given
> > delivery system (as, typically, they only support a subset of them
> > for each delsys).
> >
> > Ok, practice is different, as there are reverse-engineered drivers
> > that may not support everything that the hardware supports. Also,
> > a few hardware may have additional restrictions.
> >
> > Yet, on those cases, the userspace may detect if a given modulation
> > type or FEC is supported, by trying to set it and check if the
> > operation didn't fail, and if the cache got properly updated.
> >
> > So, at the end, it was decided to not add anything like that.
> >
> > Yet, it is good to see other opinions.
> >
> > It should be said that one of the hard parts of an approach like
> > that, is that someone would need to dig into each driver and add
> > the proper support for per-delsys modulation and FECs.
> >
> > Alternatively, the core could initialize it to the default value
> > for each standard, and call some driver-specific function that
> > would reset the modulation/FECs that aren't supported by some
> > specific drivers.
> >
> > Regards,
> > Mauro
> >
> >>
> >> Chris Lee <updatelee@gmail.com>
> >>
> >> diff --git a/drivers/media/dvb-core/dvb_frontend.c
> >> b/drivers/media/dvb-core/dvb_frontend.c
> >> index 1f925e8..f5df08e 100644
> >> --- a/drivers/media/dvb-core/dvb_frontend.c
> >> +++ b/drivers/media/dvb-core/dvb_frontend.c
> >> @@ -1036,6 +1036,8 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
> >>   _DTV_CMD(DTV_API_VERSION, 0, 0),
> >>
> >>   _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
> >> + _DTV_CMD(DTV_ENUM_DELMOD, 0, 0),
> >> + _DTV_CMD(DTV_ENUM_DELFEC, 0, 0),
> >>
> >>   _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
> >>   _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
> >> @@ -1285,6 +1287,22 @@ static int dtv_property_process_get(struct
> >> dvb_frontend *fe,
> >>   }
> >>   tvp->u.buffer.len = ncaps;
> >>   break;
> >> + case DTV_ENUM_DELMOD:
> >> + ncaps = 0;
> >> + while (fe->ops.delmod[ncaps] && ncaps < MAX_DELMOD) {
> >> + tvp->u.buffer.data[ncaps] = fe->ops.delmod[ncaps];
> >> + ncaps++;
> >> + }
> >> + tvp->u.buffer.len = ncaps;
> >> + break;
> >> + case DTV_ENUM_DELFEC:
> >> + ncaps = 0;
> >> + while (fe->ops.delfec[ncaps] && ncaps < MAX_DELFEC) {
> >> + tvp->u.buffer.data[ncaps] = fe->ops.delfec[ncaps];
> >> + ncaps++;
> >> + }
> >> + tvp->u.buffer.len = ncaps;
> >> + break;
> >>   case DTV_FREQUENCY:
> >>   tvp->u.data = c->frequency;
> >>   break;
> >> diff --git a/drivers/media/dvb-core/dvb_frontend.h
> >> b/drivers/media/dvb-core/dvb_frontend.h
> >> index 371b6ca..4e96640 100644
> >> --- a/drivers/media/dvb-core/dvb_frontend.h
> >> +++ b/drivers/media/dvb-core/dvb_frontend.h
> >> @@ -47,6 +47,8 @@
> >>   * should be smaller or equal to 32
> >>   */
> >>  #define MAX_DELSYS 8
> >> +#define MAX_DELMOD 8
> >> +#define MAX_DELFEC 32
> >>
> >>  struct dvb_frontend_tune_settings {
> >>   int min_delay_ms;
> >> @@ -263,6 +265,8 @@ struct dvb_frontend_ops {
> >>   struct dvb_frontend_info info;
> >>
> >>   u8 delsys[MAX_DELSYS];
> >> + u8 delmod[MAX_DELMOD];
> >> + u8 delfec[MAX_DELFEC];
> >>
> >>   void (*release)(struct dvb_frontend* fe);
> >>   void (*release_sec)(struct dvb_frontend* fe);
> >> diff --git a/include/uapi/linux/dvb/frontend.h
> >> b/include/uapi/linux/dvb/frontend.h
> >> index c56d77c..be63d37 100644
> >> --- a/include/uapi/linux/dvb/frontend.h
> >> +++ b/include/uapi/linux/dvb/frontend.h
> >> @@ -375,7 +375,10 @@ struct dvb_frontend_event {
> >>  #define DTV_STAT_ERROR_BLOCK_COUNT 68
> >>  #define DTV_STAT_TOTAL_BLOCK_COUNT 69
> >>
> >> -#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT
> >> +#define DTV_ENUM_DELMOD 70
> >> +#define DTV_ENUM_DELFEC 71
> >> +
> >> +#define DTV_MAX_COMMAND DTV_ENUM_DELFEC
> >>
> >>  typedef enum fe_pilot {
> >>   PILOT_ON,
> >> diff --git a/drivers/media/dvb-frontends/au8522_dig.c
> >> b/drivers/media/dvb-frontends/au8522_dig.c
> >> index 6ee9028..1044c9d 100644
> >> --- a/drivers/media/dvb-frontends/au8522_dig.c
> >> +++ b/drivers/media/dvb-frontends/au8522_dig.c
> >> @@ -822,7 +822,9 @@ error:
> >>  EXPORT_SYMBOL(au8522_attach);
> >>
> >>  static struct dvb_frontend_ops au8522_ops = {
> >> - .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
> >> + .delsys = { SYS_DVBC_ANNEX_B, SYS_ATSC },
> >> + .delmod = { QAM_256, QAM_64, VSB_8 },
> >> + .delfec = { FEC_NONE },
> >>   .info = {
> >>   .name = "Auvitek AU8522 QAM/8VSB Frontend",
> >>   .frequency_min = 54000000,
> >> --
> >> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> >> the body of a message to majordomo@vger.kernel.org
> >> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> >
> >
> > --
> >
> > Cheers,
> > Mauro
Manu Abraham July 23, 2013, 1:35 p.m. UTC | #4
On Sat, Jul 20, 2013 at 1:57 AM, Chris Lee <updatelee@gmail.com> wrote:
> In frontend.h we have a struct called dvb_frontend_ops, in there we
> have an element called delsys to show the delivery systems supported
> by the tuner, Id like to propose we add onto that with delmod and
> delfec.
>
> Its not a perfect solution as sometimes a specific modulation or fec
> is only availible on specific systems. But its better then what we
> have now. The struct fe_caps isnt really suited for this, its missing
> many systems, modulations, and fec's. Its just not expandable enough
> to get all the supported sys/mod/fec a tuner supports in there.

Question > Why should an application know all the modulations and
FEC's supported by a demodulator ?

Aren't demodulators compliant to their respective delivery systems ?

Or do you mean to state that, you are trying to work around some
demodulator quirks ?


Regards,

Manu
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Lee July 23, 2013, 4:47 p.m. UTC | #5
Not all tuners support all fec's

- genpix devices support an odd 5/11 fec for digicipher, pretty sure
no one else does.
- stv0899 supports 1/2, 2/3, 3/4, 5/6, 6/7, 7/8
- stv0900 supports 1/2, 3/5, 2/3, 3/4, 4/5, 5/6, 8/9, 9/10

Not all tuners support the entire range of fec's. I think this is more
the norm then the exception.

If the userland application can poll the driver for a list of
supported fec it allows them to have a list of valid tuning options
for the user to choose from, vs listing everything and hoping it
doesnt fail.

As stated Id much rather have a list made up from system -> modulation -> fec.

ie genpix

SYS_TURBO -> QPSK/8PSK
SYS_TURBO.QPSK -> 1/2, 2/3, 3/4, 5/6, 7/8
SYS_TURBO.8PSK -> 2/3, 3/4, 5/6, 8/9

but that could get more complicated to implement pretty quickly

Chris Lee


On Tue, Jul 23, 2013 at 7:35 AM, Manu Abraham <abraham.manu@gmail.com> wrote:
> On Sat, Jul 20, 2013 at 1:57 AM, Chris Lee <updatelee@gmail.com> wrote:
>> In frontend.h we have a struct called dvb_frontend_ops, in there we
>> have an element called delsys to show the delivery systems supported
>> by the tuner, Id like to propose we add onto that with delmod and
>> delfec.
>>
>> Its not a perfect solution as sometimes a specific modulation or fec
>> is only availible on specific systems. But its better then what we
>> have now. The struct fe_caps isnt really suited for this, its missing
>> many systems, modulations, and fec's. Its just not expandable enough
>> to get all the supported sys/mod/fec a tuner supports in there.
>
> Question > Why should an application know all the modulations and
> FEC's supported by a demodulator ?
>
> Aren't demodulators compliant to their respective delivery systems ?
>
> Or do you mean to state that, you are trying to work around some
> demodulator quirks ?
>
>
> Regards,
>
> Manu
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Manu Abraham July 23, 2013, 8:54 p.m. UTC | #6
On Tue, Jul 23, 2013 at 10:17 PM, Chris Lee <updatelee@gmail.com> wrote:
> Not all tuners support all fec's

Nitpick: tuner doesn't have anything to do with FEC, it just provides IQ
outputs to the demodulator. ;-)

That said;

Demods support all FEC's relevant to their delivery systems. It's just that
some devices likely do support some additional states.


> - genpix devices support an odd 5/11 fec for digicipher, pretty sure
> no one else does.

I think DCII FEC5/11 is standard, reading this URL
http://rickcaylor.websitetoolbox.com/post/DCII-Valid-SRFECModulation-Combinations-5827500

Also, according to the BCM4201 datasheet:
* DVB/DIRECTV/Digicipher II compliant FEC decoder
64 state viterbi decoder supports rates= 5/11, 1/2, 3/5, 2/3, 3/4.
4/5, 5/6, 6/7, 7/8

I would say, it is pretty much standard for DCII.

Given that it is pretty much standard, I would say that for DCII; for
the genpix
all you need is a SYS_DCII and or a SYS_DSS addition to the genpix driver,
rather than having a ton of delivery systems mixed with modulations as in
your patch with DCII_QPSK, ... _OQPSK etc. Actually, those are a bit too
superfluous. You shouldn't mix delivery systems and modulations. That was
the whole reason why the delivery system flag was introduced to make
things saner and proper for the frontend API.

If I am not mistaken, the genpix hardware is a hardware wrapper around the
BCM demodulator. So, it is quite likely that even if you don't set any FEC
parameter, the device could still acquire lock as expected. I am not holding
my breath on this. Maybe someone with a genpix device can prove me right
or wrong.


> - stv0899 supports 1/2, 2/3, 3/4, 5/6, 6/7, 7/8
> - stv0900 supports 1/2, 3/5, 2/3, 3/4, 4/5, 5/6, 8/9, 9/10


Ah....

Though these devices support additional modes, the STB0899 (I don't know
whether you meant the STB0899 with stv0899, yet looking at the stb0899,
since there doesn't seem to be other references)

With the STB0899 driver, all you need to tune with it is Frequency,
Symbol Rate and Delivery system


With the STV090x driver all you need is Frequency and Symbol Rate.
(It will auto detect delivery system)


>
> Not all tuners support the entire range of fec's. I think this is more
> the norm then the exception.
>


I find it slightly hard to believe... ;-)


> If the userland application can poll the driver for a list of
> supported fec it allows them to have a list of valid tuning options
> for the user to choose from, vs listing everything and hoping it
> doesnt fail.


When a driver is not accepting those parameters as inputs, why
should the application/user burden himself with knowing parameters
of no relevance to him ?


>
> As stated Id much rather have a list made up from system -> modulation -> fec.
>
> ie genpix
>
> SYS_TURBO -> QPSK/8PSK
> SYS_TURBO.QPSK -> 1/2, 2/3, 3/4, 5/6, 7/8
> SYS_TURBO.8PSK -> 2/3, 3/4, 5/6, 8/9
>
> but that could get more complicated to implement pretty quickly


Actually with all those redundant FEC bits gone away from relevance, things are
a bit more saner.

Regards,

Manu
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Lee July 23, 2013, 9:27 p.m. UTC | #7
> Nitpick: tuner doesn't have anything to do with FEC, it just provides IQ
> outputs to the demodulator. ;-)

ya ya :) you knew what I meant, not what I said hehe

> Demods support all FEC's relevant to their delivery systems. It's just that
> some devices likely do support some additional states.

This part I dont understand, what do you mean additional states ? and
how would a userland application determine if a demod supports these
additional states?

> I think DCII FEC5/11 is standard, reading this URL
> http://rickcaylor.websitetoolbox.com/post/DCII-Valid-SRFECModulation-Combinations-5827500
> I would say, it is pretty much standard for DCII.

yes 5/11 is standard for DCII, but nothing else.

> Given that it is pretty much standard, I would say that for DCII; for
> the genpix
> all you need is a SYS_DCII and or a SYS_DSS addition to the genpix driver,
> rather than having a ton of delivery systems mixed with modulations as in
> your patch with DCII_QPSK, ... _OQPSK etc. Actually, those are a bit too
> superfluous. You shouldn't mix delivery systems and modulations. That was
> the whole reason why the delivery system flag was introduced to make
> things saner and proper for the frontend API.

Yup fair enough, easy to change, I'll get on that and resubmit the patch.

> If I am not mistaken, the genpix hardware is a hardware wrapper around the
> BCM demodulator. So, it is quite likely that even if you don't set any FEC
> parameter, the device could still acquire lock as expected. I am not holding
> my breath on this. Maybe someone with a genpix device can prove me right
> or wrong.

FEC_AUTO works for all but turbo-qpsk on genpix devices.

I still think its important to have all the fec supported in the
driver though even if FEC_AUTO did work 100% else why even have it as
an option at all.

> With the STB0899 driver, all you need to tune with it is Frequency,
> Symbol Rate and Delivery system
>
>
> With the STV090x driver all you need is Frequency and Symbol Rate.
> (It will auto detect delivery system)

Same thing, I still think if we allow the user to send a fec value we
should make sure its right, else why not just hard code all the
drivers to fec-auto that support it and remove the option all
together. I dont like that option.

> When a driver is not accepting those parameters as inputs, why
> should the application/user burden himself with knowing parameters
> of no relevance to him ?

But it will accept them as inputs. without complaint too. I can send
DTV_INNER_FEC w/ FEC_5_11 to stv090x and it doesnt complain at all,
even though it doesnt support it. It'll even acquire a lock just
because the demod uses blind search. So the driver most definitely
does accept fec that it cant use.

> Actually with all those redundant FEC bits gone away from relevance, things are
> a bit more saner.

I dont understand this either. "gone away from relevance" are you
meaning just how they really arent used much anymore or something?
still though if the demod supports them I think we should too.

Honestly I still think the .delsys .delmod .delfec is a cleaner
approach then we have now which is ugly and mismatched (modulations
mixed in with fec, and only some are defined) its not a perfect
solution though so I really dont think its worth fighting for if
others dont agree with me. Im just kinda surprised that everyone is
perfectly happy with the .delsys / .caps method we use

Chris
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Manu Abraham July 23, 2013, 10:37 p.m. UTC | #8
On Wed, Jul 24, 2013 at 2:57 AM, Chris Lee <updatelee@gmail.com> wrote:
>> Nitpick: tuner doesn't have anything to do with FEC, it just provides IQ
>> outputs to the demodulator. ;-)
>
> ya ya :) you knew what I meant, not what I said hehe
>
>> Demods support all FEC's relevant to their delivery systems. It's just that
>> some devices likely do support some additional states.
>
> This part I dont understand, what do you mean additional states ? and
> how would a userland application determine if a demod supports these
> additional states?


Actually, the userland application shouldn't know about these.


>> If I am not mistaken, the genpix hardware is a hardware wrapper around the
>> BCM demodulator. So, it is quite likely that even if you don't set any FEC
>> parameter, the device could still acquire lock as expected. I am not holding
>> my breath on this. Maybe someone with a genpix device can prove me right
>> or wrong.
>
> FEC_AUTO works for all but turbo-qpsk on genpix devices.
>


That was why the SYS_TURBO flag was introduced. IIRC, you needed one
flag alone for the turbo mode.


> I still think its important to have all the fec supported in the
> driver though even if FEC_AUTO did work 100% else why even have it as
> an option at all.

Maybe, FEC_AUTO is broken for some very old hardware.

If FEC_AUTO works just as expected, why would you have to take the
gigantic effort of specifying parameters by hand which is error prone which
you have mentioned later on ? I fail to understand your point.


>> With the STB0899 driver, all you need to tune with it is Frequency,
>> Symbol Rate and Delivery system
>>
>>
>> With the STV090x driver all you need is Frequency and Symbol Rate.
>> (It will auto detect delivery system)
>
> Same thing, I still think if we allow the user to send a fec value we
> should make sure its right, else why not just hard code all the
> drivers to fec-auto that support it and remove the option all
> together. I dont like that option.



This is why it was decided eventually that the FEC bits are redundant
and we decided not to create large lists and enumerations causing
insanity and not to mention ugliness. AFAIR, almost all drivers do
FEC_AUTO, except for the ones which have some known issues.



>> When a driver is not accepting those parameters as inputs, why
>> should the application/user burden himself with knowing parameters
>> of no relevance to him ?
>
> But it will accept them as inputs. without complaint too. I can send
> DTV_INNER_FEC w/ FEC_5_11 to stv090x and it doesnt complain at all,
> even though it doesnt support it. It'll even acquire a lock just
> because the demod uses blind search. So the driver most definitely
> does accept fec that it cant use.



The driver will acquire a lock to the frequency/srate and "return" the
relevant FEC value for the user/application. This avoids pitfalls and
human errors in manually specifying FEC bits to tune configurations,
as I described above. Because some legacy application does set
a FEC value which might be wrong and the rest are correct, I wouldn't
fail that request.



>> Actually with all those redundant FEC bits gone away from relevance, things are
>> a bit more saner.
>
> I dont understand this either. "gone away from relevance" are you
> meaning just how they really arent used much anymore or something?
> still though if the demod supports them I think we should too.


Yeah, they aren't really used at all. They exist for compatibility reasons.


                Manu
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Lee July 23, 2013, 10:57 p.m. UTC | #9
The problems isnt for tuners where FEC_AUTO does work, its more for
ones that dont work like the genpix. Im sure there are others too. I
still think that userland applications should be able to poll that
info and that the ability to poll the info is a good thing not a bad
thing.

oh well, lets let this patch die, and the idea can be revisited in the
future if it warrants more of a pressing need.

Chris
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
VDRU VDRU July 23, 2013, 11:39 p.m. UTC | #10
On Tue, Jul 23, 2013 at 3:57 PM, Chris Lee <updatelee@gmail.com> wrote:
> The problems isnt for tuners where FEC_AUTO does work, its more for
> ones that dont work like the genpix. Im sure there are others too.

If FEC_AUTO for turbo qpsk can be fixed in the Genpix firmware, maybe
it's worth seeing if Genpix will have a look into it.?
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Chris Lee July 23, 2013, 11:45 p.m. UTC | #11
He is, I talked to him last month about various things and he
mentioned turbofec-qpsk FEC_AUTO is semi working and its in his plans.

Chris

On Tue, Jul 23, 2013 at 5:39 PM, VDR User <user.vdr@gmail.com> wrote:
> On Tue, Jul 23, 2013 at 3:57 PM, Chris Lee <updatelee@gmail.com> wrote:
>> The problems isnt for tuners where FEC_AUTO does work, its more for
>> ones that dont work like the genpix. Im sure there are others too.
>
> If FEC_AUTO for turbo qpsk can be fixed in the Genpix firmware, maybe
> it's worth seeing if Genpix will have a look into it.?
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/media/dvb-core/dvb_frontend.c
b/drivers/media/dvb-core/dvb_frontend.c
index 1f925e8..f5df08e 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -1036,6 +1036,8 @@  static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = {
  _DTV_CMD(DTV_API_VERSION, 0, 0),

  _DTV_CMD(DTV_ENUM_DELSYS, 0, 0),
+ _DTV_CMD(DTV_ENUM_DELMOD, 0, 0),
+ _DTV_CMD(DTV_ENUM_DELFEC, 0, 0),

  _DTV_CMD(DTV_ATSCMH_PARADE_ID, 1, 0),
  _DTV_CMD(DTV_ATSCMH_RS_FRAME_ENSEMBLE, 1, 0),
@@ -1285,6 +1287,22 @@  static int dtv_property_process_get(struct
dvb_frontend *fe,
  }
  tvp->u.buffer.len = ncaps;
  break;
+ case DTV_ENUM_DELMOD:
+ ncaps = 0;
+ while (fe->ops.delmod[ncaps] && ncaps < MAX_DELMOD) {
+ tvp->u.buffer.data[ncaps] = fe->ops.delmod[ncaps];
+ ncaps++;
+ }
+ tvp->u.buffer.len = ncaps;
+ break;
+ case DTV_ENUM_DELFEC:
+ ncaps = 0;
+ while (fe->ops.delfec[ncaps] && ncaps < MAX_DELFEC) {
+ tvp->u.buffer.data[ncaps] = fe->ops.delfec[ncaps];
+ ncaps++;
+ }
+ tvp->u.buffer.len = ncaps;
+ break;
  case DTV_FREQUENCY:
  tvp->u.data = c->frequency;
  break;
diff --git a/drivers/media/dvb-core/dvb_frontend.h
b/drivers/media/dvb-core/dvb_frontend.h
index 371b6ca..4e96640 100644
--- a/drivers/media/dvb-core/dvb_frontend.h
+++ b/drivers/media/dvb-core/dvb_frontend.h
@@ -47,6 +47,8 @@ 
  * should be smaller or equal to 32
  */
 #define MAX_DELSYS 8
+#define MAX_DELMOD 8
+#define MAX_DELFEC 32

 struct dvb_frontend_tune_settings {
  int min_delay_ms;
@@ -263,6 +265,8 @@  struct dvb_frontend_ops {
  struct dvb_frontend_info info;

  u8 delsys[MAX_DELSYS];
+ u8 delmod[MAX_DELMOD];
+ u8 delfec[MAX_DELFEC];

  void (*release)(struct dvb_frontend* fe);
  void (*release_sec)(struct dvb_frontend* fe);
diff --git a/include/uapi/linux/dvb/frontend.h
b/include/uapi/linux/dvb/frontend.h
index c56d77c..be63d37 100644
--- a/include/uapi/linux/dvb/frontend.h
+++ b/include/uapi/linux/dvb/frontend.h
@@ -375,7 +375,10 @@  struct dvb_frontend_event {
 #define DTV_STAT_ERROR_BLOCK_COUNT 68
 #define DTV_STAT_TOTAL_BLOCK_COUNT 69

-#define DTV_MAX_COMMAND DTV_STAT_TOTAL_BLOCK_COUNT
+#define DTV_ENUM_DELMOD 70
+#define DTV_ENUM_DELFEC 71
+
+#define DTV_MAX_COMMAND DTV_ENUM_DELFEC

 typedef enum fe_pilot {
  PILOT_ON,
diff --git a/drivers/media/dvb-frontends/au8522_dig.c
b/drivers/media/dvb-frontends/au8522_dig.c
index 6ee9028..1044c9d 100644
--- a/drivers/media/dvb-frontends/au8522_dig.c
+++ b/drivers/media/dvb-frontends/au8522_dig.c
@@ -822,7 +822,9 @@  error:
 EXPORT_SYMBOL(au8522_attach);

 static struct dvb_frontend_ops au8522_ops = {
- .delsys = { SYS_ATSC, SYS_DVBC_ANNEX_B },
+ .delsys = { SYS_DVBC_ANNEX_B, SYS_ATSC },
+ .delmod = { QAM_256, QAM_64, VSB_8 },
+ .delfec = { FEC_NONE },
  .info = {
  .name = "Auvitek AU8522 QAM/8VSB Frontend",
  .frequency_min = 54000000,