Guennadi Liakhovetski wrote:

/* Recover a TD/ED using its collision chain */ static inline void * dma_to_ed_td (struct hash_list_t * entry, dma_addr_t dma) { struct hash_t * scan = entry->head; while (scan && scan->dma != dma) scan = scan->next; if (!scan) BUG(); return scan->virt; }

Hence the main question - what could this BUG mean?

Usually it means that the HCD freed a TD before the HC was quite done with it ... so the HC put it on the donelist, and donelist processing tried to find the TD given its DMA address (using that routine), then BUG().

There are some fairly non-obvious races that can cause that,
and even the 2.6 code had a bug in that area that was only
fixed in 2.6.5 or so ... which bug will certainly be in the
2.4 usb-ohci code, it came from there.  That one involved
the "unlink empty ED" case taking an inappropriate shortcut;
it really needs to wait a frame like all the other cases.
(However, the usb-ohci "wait a frame" logic is broken too,
in ways that showed up mostly on slower systems.  I think a
PXA would hit those bugs often enough.)

- Dave



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to