On Mon, Jun 24, 2013 at 11:49:22AM +0200, Gerd Hoffmann wrote:
Very first revision doing something useful. Initializes xhci host controller, detects devices, can handle control and bulk transfers. Good enougth to boot from usb storage devices and handle keyboard.
Tested on qemu.
To be done:
- Test on real hardware.
- Add support for streams (needed for uas devices on usb3 ports).
This is great!
I haven't had a chance to fully review, but I did have a couple of questions.
[...]
+static void wait_fixed(u32 timeout) +{
- u64 end = calc_future_tsc(timeout);
- while (!check_tsc(end))
yield();
+}
How does this differ from msleep()?
[...]
+struct usb_pipe * +xhci_alloc_pipe(struct usbdevice_s *usbdev
, struct usb_endpoint_descriptor *epdesc)
+{
- ASSERT32FLAT();
- if (!CONFIG_USB_XHCI)
return NULL;
- u8 eptype = epdesc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
- struct usb_xhci_s *xhci = container_of(
usbdev->hub->cntl, struct usb_xhci_s, usb);
- struct xhci_pipe *pipe;
- u32 epid;
- if (epdesc->bEndpointAddress == 0) {
epid = 1;
- } else {
epid = (epdesc->bEndpointAddress & 0x0f) * 2;
epid += (epdesc->bEndpointAddress & USB_DIR_IN) ? 1 : 0;
- }
+#if 1
- /* dirty hack time: try to dig our pipe out of the freelist */
- struct usb_pipe **pfree = &xhci->usb.freelist;
- for (;;) {
struct usb_pipe *upipe = *pfree;
Can you explain this further. What's needed to reuse a previously opened pipe on xhci?
-Kevin