Yup, I realize that that is extremely bad code (hey, it took me about an hour to fix what I was looking for...)
All in all I like your code better... (Sure enough, moving the commented-out switch statement from pci_setup.c to usb.c will do for calling the appropriate code for the controller.)
Only one question: shouldn't you be free()ing that array as well after usb_loop() is done?
Any chance this yours gets merged upstream anytime soon?