
...
Are you missing "sync" instructions in your UART handling? Sounds
like
the UART register operations are not being forced to run by the processor... when you hit the LED register, you are forcing the instructions to run as a side effect and all becomes well.
The UART code that I am using is plain vanilla U-boot 1.1.4, drivers/ns16550.c. I dropped an asm("sync;isync;msync") in front of the loop which polls the LSR and the behavior didn't change. I dropped an asm("sync;isync;msync") inside the loop which polls the LSR and the behavior didn't change.
I just want to mention that those instructions will only "sync" from the processor core's point of view. However, PQIII has this coeherency module between the processor core and the rest of the system, which adds another level of "asynchronism". For a "real sync" in this chip, specially when there are dependencies between different subsystems, you need to do a read after a write; that will force the processor to really sync with the device and it is the only way for you to make sure that a value has been written to the sub-system.
Best Regards