Well this is an interesting one.
It makes an incorrect assumption about the behavior of "do { ... }
while(0)", that being issuance of a "continue" within the loop would
force execution to go back to the top of the loop. But what it really
does is force a jump to the bottom, where the false condition causes the
loop to always exit. Effectively "continue" is the same as "break"
here.
The intent here is that "continue" would cause the code to restart, i.e.
go to the top of the block. It was attempting to co-opt the behavior of
the outer do-while loop, incorrect.
The reason for the "do { ... } while(0)" idiom was to help avoid
accidentally jumping out of that block without freeing the lock along
the way. I did things like that back in 2005 when this code originated.
This is a bug, not dead code. Shockingly enough this has gone unnoticed
since forever, and given that it has gone unnoticed then either the
retry functionality is not needed or it has been failing to retry when
it should.
I need to dig into the validity of this test. I will deal with this.
-Mike
On Sat, 24 Jan 2015, Mike Isely wrote:
>
> Sorry been asleep at the wheel here. I'll take a look.
>
> Please realize that the code path being talked about here HAS worked -
> because the encoder does tend to fail and this is how the driver
> recovers.
>
> -Mike
>
>
> On Fri, 16 Jan 2015, Hans Verkuil wrote:
>
> > On 01/16/2015 12:29 PM, Haim Daniel wrote:
> > > It looks that "if (try_count < 20) continue" jumps to end of the do ...
> > > while(0) loop and goes out.
> >
> > Ah, you are right. But that is obviously not what was intended, so just
> > removing
> > it is not a proper 'fix'.
> >
> > Mike, can you take a look at this?
> >
> > Regards,
> >
> > Hans
> >
> > >
> > > --hd.
> > > On Fri, 2015-01-16 at 11:57 +0100, Hans Verkuil wrote:
> > >> On 01/05/2015 11:38 PM, Haim Daniel wrote:
> > >>> In case a command is timed out, current flow sets the retry_flag
> > >>> and does nothing.
> > >>
> > >> Really? That's not how I read the code: it retries up to 20 times before
> > >> bailing out.
> > >>
> > >> Perhaps you missed the "if (try_count < 20) continue;" line?
> > >>
> > >> Regards,
> > >>
> > >> Hans
> > >>
> > >>>
> > >>> Signed-off-by: Haim Daniel <[email protected]>
> > >>> ---
> > >>> drivers/media/usb/pvrusb2/pvrusb2-encoder.c | 15 +--------------
> > >>> 1 file changed, 1 insertion(+), 14 deletions(-)
> > >>>
> > >>> diff --git a/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> b/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> index f7702ae..02028aa 100644
> > >>> --- a/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> +++ b/drivers/media/usb/pvrusb2/pvrusb2-encoder.c
> > >>> @@ -145,8 +145,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>> u32 *argp)
> > >>> {
> > >>> unsigned int poll_count;
> > >>> - unsigned int try_count = 0;
> > >>> - int retry_flag;
> > >>> int ret = 0;
> > >>> unsigned int idx;
> > >>> /* These sizes look to be limited by the FX2 firmware
> > >>> implementation */
> > >>> @@ -213,8 +211,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>> break;
> > >>> }
> > >>>
> > >>> - retry_flag = 0;
> > >>> - try_count++;
> > >>> ret = 0;
> > >>> wrData[0] = 0;
> > >>> wrData[1] = cmd;
> > >>> @@ -245,11 +241,9 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>> }
> > >>> if (rdData[0] && (poll_count < 1000)) continue;
> > >>> if (!rdData[0]) {
> > >>> - retry_flag = !0;
> > >>> pvr2_trace(
> > >>> PVR2_TRACE_ERROR_LEGS,
> > >>> - "Encoder timed out waiting for
> > >>> us"
> > >>> - "; arranging to retry");
> > >>> + "Encoder timed out waiting for
> > >>> us");
> > >>> } else {
> > >>> pvr2_trace(
> > >>> PVR2_TRACE_ERROR_LEGS,
> > >>> @@ -269,13 +263,6 @@ static int pvr2_encoder_cmd(void *ctxt,
> > >>> ret = -EBUSY;
> > >>> break;
> > >>> }
> > >>> - if (retry_flag) {
> > >>> - if (try_count < 20) continue;
> > >>> - pvr2_trace(
> > >>> - PVR2_TRACE_ERROR_LEGS,
> > >>> - "Too many retries...");
> > >>> - ret = -EBUSY;
> > >>> - }
> > >>> if (ret) {
> > >>> del_timer_sync(&hdw->encoder_run_timer);
> > >>> hdw->state_encoder_ok = 0;
> > >>>
> > >>
> > >
> > >
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-media" in
> > the body of a message to [email protected]
> > More majordomo info at http://vger.kernel.org/majordomo-info.html
> >
>
>
--
Mike Isely
isely @ isely (dot) net
PGP: 03 54 43 4D 75 E5 CC 92 71 16 01 E2 B5 F5 C1 E8
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html