A friend warned me when I said I was going to work on a USB controller. He said it was a huge spec and it would take me months to figure it all out.
I didn't believe him. I went off to write a host controller for the PowerPC 8xx chip. Six month passed. Turns out he was right. Still, it was fun to learn the entire spec from top to bottom.
Who ever claimed that USB was going to make anyone's life easier was a liar. There are days when I am amazed it works at all. While I like many things about it it seems way too complex for the job it need to do. Maybe I'm just too simplistic.
It's been interesting to track the Linux USB project for the last year. They have been slowly adding devices while struggling with controller driver issues and (mostly) software interface issues. The first generation of USB stack was simple and worked for keyboards and mice but didn't help more complex devices. This was scrapped for the 2.3.x/2.4.x kernels. The new API is better but has some synchronization holes in it which are both poorly specified and poorly understood. But, as with most things linux it will get sorted out and the problems will get solved.
Most of the linux code is pretty good. The UHCI and OHCI drivers are, well, while working they still have some bugs and problems.