> Add a check to ohci_softintr to see if the list goes circular and enter
> ddb / dump usbhist when it does...
I already did add a panic and it fired.

I'm still trying to find out how that happens.

What I'm seeing (dumped by device_ctrl_start()) is a chain of four TDs 
(named here after their addresses' three least significant nybbles):
        E20->EE0->FA0->F40->0
which are linked in that sense by both nexttd and td.td_nexttd.

Then, in ohci_softint(), the done queue is (as linked by td.nexttd):
        FA0->EE0->E20->FA0->...
and, as expected, the nexttd links are as before.
Absent the E20->FA0 link, that's exactly what one would expect if the first 
three TDs have been handled (the done list is most recently done first); 
the big question is where that additinal link comes from.

I've added code to ohci_hash_add_td() to catch a TD being added with a 
physical address already present in the hash list, but that didn't fire.

Reply via email to