Re: [PATCH 07/13] si2157: Briefly wait for tuning operation to complete

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Sean,


On 08/04/2019 16.37, Brad Love wrote:
> Hi Sean,
>
>
> On 08/04/2019 15.55, Sean Young wrote:
>> On Mon, Apr 08, 2019 at 01:14:08PM -0500, Brad Love wrote:
>>> On 05/04/2019 05.29, Sean Young wrote:
>>>> On Sat, Dec 29, 2018 at 11:51:16AM -0600, Brad Love wrote:
>>>>> Some software reports no signal found on a frequency due to immediately
>>>>> checking for lock as soon as set_params returns. This waits up 40ms for
>>>>> tuning operation, then from 30-150ms (dig/analog) for signal lock before
>>>>> returning from set_params and set_analog_params.
>>>>>
>>>>> Tuning typically completes in 20-30ms. Digital tuning will additionally
>>>>> wait depending on signal characteristics. Analog tuning will wait the
>>>>> full timeout in case of no signal.
>>>> This looks like a workaround for broken userspace. Very possibly this
>>>> is software was tested on a different frontend which does wait for tuning
>>>> to complete.
>>>>
>>>> This is a change in uapi and will have to be done for all frontends, and
>>>> documented. However I doubt such a change is acceptable.
>>>>
>>>> What software are you refering to?
>>> Hi Sean,
>>>
>>> I would have to check with support to find out the various software that
>>> expect when a tune command returns for that tuning operation to have
>>> actually completed. In the current state when you tune si2157 it
>>> immediately returns, no care of the tuning operation completion, no care
>>> of the pll lock success. This is correct? Not so according to Silicon
>>> Labs documentation, which suggests a brief wait. I just took a look at
>>> other drivers, sampling only those with set_analog_params, all but two
>>> have similar code in place to actually allow the tune operation time to
>>> complete (both digital and analog) before returning to userland. The
>>> other drivers just insert arbitrary time delays to accommodate the
>>> operations completion time. At least with my patch I am monitoring the
>>> hardware to know when the operation actually completes.
>>>
>>> I see in tuners (not frontends):
>>>
>>> mt2063 - waits up to 100ms for lock status and return
>>> r820t - sleep 100ms for pll lock status and return
>>> tda827x - 170-500ms wait after tune before checking status and return
>>> tda8290 - sleep 100ms up to 3x while checking tune status and return
>>> tuner-xc2028 - sleep for 110ms awaiting lock status and return
>>> xc4000 - 10ms sleep after tune, unless debug, then 100ms and return
>>> xc5000 - 20ms sleep after tune,  if pll not locked, re-tune and sleep
>>> again, repeat until success and return
>>>
>>> There's also other arbitrary sleeps peppered throughout the operations.
>>>
>>> Then you have si2157 that fires off the tuning commands and goes right
>>> back to userland immediately, when with instrumented testing, the
>>> operation takes time to complete and lock. The operation does not happen
>>> instantaneously. Software that expects clocks to be locked when the
>>> function returns determine this is an error. They query the tuner
>>> immediately when tune returns and they output tuning failed.
>>>
>>> Please explain why awaiting the hardware to say the "tuning operation
>>> you requested is done and clocks are locked" is not ok. If it's not ok,
>>> fine, but then a lot of other drivers are currently "not ok" as well.
>> If you read the dvb userspace api, there is nothing in the DTV_TUNE
>> property that says it will block until a lock has been made.
>>
>> https://www.kernel.org/doc/html/latest/media/uapi/dvb/fe_property_parameters.html#dtv-tune
>>
>> The locking status can be queried using read status.
>>
>> https://www.kernel.org/doc/html/latest/media/uapi/dvb/fe-read-status.html#fe-read-status
>>
>> Using this mechanism, there is a minimum of sleeping in the kernel which helps
>> interactivity. (uninterruptable) sleeping in drivers something that really
>> should be avoided if at all possible. Userspace can't do anything during that
>> time.
>
> This is not dealing with signal lock. As far as I understand the
> documentation I have, this is hardware tuning completion, aka the pll's
> and whatever else are properly configured and the tuning operation
> itself is finished successfully. The byte read is looking for
> TUNINT/ATVINT/DTVINT bits set, meaning the operation is complete. Right
> now I ignore errors, which probably should be returned to userland, as
> if a tune fails the userland has no way to determine this fact. This
> process comes directly from a flowchart in the SL guide.
>
> Signal lock is determined later, using the methods you describe. No
> property registers are being queried here, the success of the previous
> (tuning) operation is.


Hi Sean,

Just noticing now that my commit message does not agree with what I'm
saying. I will need to do some testing to see which is correct. I've
been basing my statements here off the SL reference I have, but I wrote
the commit message over a year ago probably. I'll need to do some
testing, I seem to recall the timing being consistent whether a signal
is found or not. I might have mis-wrote the message long ago when I was
splitting this up.

Regards,

Brad




>
>
>> So if you look at how dvbv5-zap finds a lock, you can see that it sets
>> DTV_TUNE (amongst others) and then uses the frontend read_status() to query
>> for locking until either timeout or a lock is found (not sure why it polls
>> one per second though, seems a bit overly conservative).
>>
>> https://git.linuxtv.org/v4l-utils.git/tree/utils/dvb/dvbv5-zap.c#n494
>>
>> Now, if other drivers have a sleep to wait for tuning lock in them and whether
>> they should be removed, is another question. Looking at the tda8290 driver
>> it needs to try various things in order to make a lock, so there is (currently)
>> no way to avoid this. It would be nice if it could be changed to interruptable
>> sleeps though, so that dvb userspace does not "hang" until a lock is made
>> or failed.
>
> I indeed noticed none of the other drivers use usleep_range, which is
> interruptible, correct?
>
> Regards,
>
> Brad
>
>
>>
>> Thanks,
>>
>> Sean




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux