No, I'm talking about the inherent operation of the host controller. Look at the new_Pipe() function, you can see how the queue heads for all async (bulk and control) endpoints are arranged as a circular list. The host...
No. If an endpoint (pipe) blocks, the host simply moves on to the next round-robin style. If a single transfer blocked everything else until it completed it would even block new devices from being enumerated.
Any...
I've also got one of these old Kingston Datatraveler drives (a 4GB). When connected directly to a Teensy 4.1 it will not work at all, not matter how long the timeouts are or if the initial reset is skipped - the...
The mass storage code definitely isn't doing anything like that, data transfers are being queued with interrupts enabled which means there is the potential for list corruption (due to the interrupt service routine...
Is it just me or are there major race conditions in ehci.cpp? Lots of list manipulation happening without interrupts disabled and isr() being triggered can easily modify those same lists...
As a basic example, look...
Looks like it's being printed as a signed 32-bit int when it should be unsigned. -387938129 = 0xE8E088AF = 3,907,029,167 sectors. Multiply by 512 bytes per sector = 2000398933504 bytes which matches the reported...
The logged info here looks really suspicious. First a CBW goes out for a WRITE_10 command of length one sector, then the 512 bytes of sector data go out, then trying to bring in the 13 byte CSW fails with a STALL. But...
Think about it for a moment: if it were optimized out it would happen every time, not just on rare occasions.
The compiler simply isn't allowed to perform the optimization you're proposing because the address of the...
Look at the name of the function: queue_Data_transfer. It doesn't update the buffer directly, it just queues it - and the return value isn't being checked. Queueing can fail and the buffer will keep its original state....
The function calls queue_Data_Transfer and passes the address of StatusBlockWrapper as an argument. So it must exist in memory, and the compiler can't assume it is unmodified (unless that argument is a const pointer).
Spent a day pulling hair out trying to get some FlexIO code working on a Teensy4. Turns out one of the definitions in imxrt.h is incorrect, making it (silently) impossible to link a shifter to any of the upper 4 timers....