usba_init_pipe_handle()中为这个新的pipe创建一个taskq。
usba_async_ph_req()会把一个task dispatch到这个taskq上。usba_async_ph_req()被usba_hcdi_cb()调用,而usba_hcdi_cb()是usba内部一个公共函数,每个host controller driver的callback都会调用到这个函数。
举例来说,ehci中ehci_hcdi_callback调用了这个函数。对于从底层得到的数据,简单的流程是这样的:
ehci_intr()(ehci ISR)-->ehci_traverse_active_qtd_list()-->ehci_handle_normal_qtd()--> tw_handle_qtd-->ehci_handle_bulk_qtd()(e.g.)-->ehci_hcdi_callback() -->usba_hcdi_cb() -->usba_async_ph_req() 在这个函数中,需要处理的数据被放到了这个pipe的taskq上。task的处理函数hcdi_do_cb()会调用每个request的callback,从而完成一次数据传输。
从上层来的request:
usb_pipe_ctrl_xfer()--> ehci_hcdi_pipe_ctrl_xfer() -->ehci_insert_ctrl_req() -->ehci_insert_qtd() --> ehci_insert_qtd_into_active_qtd_list()