All transactions that are performed for USB devices are sent using the URB (Usb Request Block) structure. These URBs will be first received by the USB core, and then routed to the proper Host Controller Driver(HCD). Once a URB has been processed, then it utilizes a callback to return to the USB core. This method of collecting USB data does come with a little bit of overhead, however it was deemed manageable since Linux developers had no good means of debugging USB before.
Image Reference: http://elinux.