On Tue, 7 Aug 2012, Tomas Sokorai wrote:
> On Tue, Aug 7, 2012 at 3:42 PM, Alan Stern <[email protected]> wrote:
> >
> > I don't have time today to look further into this, but I'll get back to
> > you later.
>
> No hurries, in fact I was gathering a bit more info about this behavior.
> I dumped the ed_rm_list when it is hung, and we have only one element
> that's unkillable:
>
> [ 1108.841482] ohci_hcd 0000:00:04.0: ed_rm_list, ed ffff8800c781f140
> state 0x1 type bulk; next ed 00000000
> [ 1108.841489] ohci_hcd 0000:00:04.0: info 08405103 MAX=64 DQ SKIP
> EP=2-IN DEV=3
> [ 1108.841494] ohci_hcd 0000:00:04.0: tds: head c78261e0 DATA0 tail
> c78261e0 (not listing)
Yep; that's undoubtedly the one your program is trying to kill.
> Also, there's only one non-empty ed_rm_list "pass" after the
> finish_unlinks between SR intr disables, when not hung.
As it should be.
So the next step is to see what's happening inside finish_unlinks().
The function is a big loop over the entries in the ed_rm_list, but
we're considered just with the first part of the loop. "last" is
initially set to &ohci->ed_rm_list, and about line 945 we have:
*last = ed->ed_next;
If everything were working right, ed->ed_next would be NULL (no other
ED's on the list). So either ed->ed_next points back to ed itself or
else this line doesn't get executed at all.
The only way for it not be executed is if the "skip_ed" case occurs.
Therefore your next task is to determine what's going on. Does the
tick_before() test succeed? Does we follow the "goto skip_ed"? Or is
the list pointer messed up?
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html