[SeaBIOS] [PATCH 12/19] usb: Pass 'struct usbdevice_s' to controller alloc_intr_pipe functions.

Kevin O'Connor kevin at koconnor.net
Sun Mar 11 03:46:45 CET 2012


Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/usb-ehci.c |   10 ++++++----
 src/usb-ehci.h |    3 ++-
 src/usb-ohci.c |   14 ++++++++------
 src/usb-ohci.h |    3 ++-
 src/usb-uhci.c |   14 ++++++++------
 src/usb-uhci.h |    3 ++-
 src/usb.c      |   28 +++++++++++++++-------------
 src/usb.h      |    2 ++
 8 files changed, 45 insertions(+), 32 deletions(-)

diff --git a/src/usb-ehci.c b/src/usb-ehci.c
index 9721568..477b1cf 100644
--- a/src/usb-ehci.c
+++ b/src/usb-ehci.c
@@ -621,17 +621,19 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
 }
 
 struct usb_pipe *
-ehci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
+ehci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                     , struct usb_endpoint_descriptor *epdesc)
 {
     if (! CONFIG_USB_EHCI)
         return NULL;
     struct usb_ehci_s *cntl = container_of(
-        dummy->cntl, struct usb_ehci_s, usb);
+        usbdev->hub->cntl, struct usb_ehci_s, usb);
+    int frameexp = usb_getFrameExp(usbdev, epdesc);
     dprintf(7, "ehci_alloc_intr_pipe %p %d\n", &cntl->usb, frameexp);
 
     if (frameexp > 10)
         frameexp = 10;
-    int maxpacket = dummy->maxpacket;
+    int maxpacket = epdesc->wMaxPacketSize;
     // Determine number of entries needed for 2 timer ticks.
     int ms = 1<<frameexp;
     int count = DIV_ROUND_UP(PIT_TICK_INTERVAL * 1000 * 2, PIT_TICK_RATE * ms);
@@ -643,7 +645,7 @@ ehci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
         goto fail;
     }
     memset(pipe, 0, sizeof(*pipe));
-    memcpy(&pipe->pipe, dummy, sizeof(pipe->pipe));
+    usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
     pipe->next_td = pipe->tds = tds;
     pipe->data = data;
 
diff --git a/src/usb-ehci.h b/src/usb-ehci.h
index ed2c3f7..958f444 100644
--- a/src/usb-ehci.h
+++ b/src/usb-ehci.h
@@ -11,7 +11,8 @@ struct usb_pipe;
 int ehci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
                  , void *data, int datasize);
 int ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize);
-struct usb_pipe *ehci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp);
+struct usb_pipe *ehci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                                      , struct usb_endpoint_descriptor *epdesc);
 int ehci_poll_intr(struct usb_pipe *p, void *data);
 
 
diff --git a/src/usb-ohci.c b/src/usb-ohci.c
index 8703b26..a012c6c 100644
--- a/src/usb-ohci.c
+++ b/src/usb-ohci.c
@@ -425,19 +425,19 @@ ohci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
 }
 
 struct usb_pipe *
-ohci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
+ohci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                     , struct usb_endpoint_descriptor *epdesc)
 {
     if (! CONFIG_USB_OHCI)
         return NULL;
     struct usb_ohci_s *cntl = container_of(
-        dummy->cntl, struct usb_ohci_s, usb);
+        usbdev->hub->cntl, struct usb_ohci_s, usb);
+    int frameexp = usb_getFrameExp(usbdev, epdesc);
     dprintf(7, "ohci_alloc_intr_pipe %p %d\n", &cntl->usb, frameexp);
 
     if (frameexp > 5)
         frameexp = 5;
-    int maxpacket = dummy->maxpacket;
-    int lowspeed = dummy->speed;
-    int devaddr = dummy->devaddr | (dummy->ep << 7);
+    int maxpacket = epdesc->wMaxPacketSize;
     // Determine number of entries needed for 2 timer ticks.
     int ms = 1<<frameexp;
     int count = DIV_ROUND_UP(PIT_TICK_INTERVAL * 1000 * 2, PIT_TICK_RATE * ms)+1;
@@ -447,7 +447,9 @@ ohci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
     if (!pipe || !tds || !data)
         goto err;
     memset(pipe, 0, sizeof(*pipe));
-    memcpy(&pipe->pipe, dummy, sizeof(pipe->pipe));
+    usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
+    int lowspeed = pipe->pipe.speed;
+    int devaddr = pipe->pipe.devaddr | (pipe->pipe.ep << 7);
     pipe->data = data;
     pipe->count = count;
     pipe->tds = tds;
diff --git a/src/usb-ohci.h b/src/usb-ohci.h
index bc6eb7b..ab957e6 100644
--- a/src/usb-ohci.h
+++ b/src/usb-ohci.h
@@ -11,7 +11,8 @@ struct usb_pipe;
 int ohci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
                  , void *data, int datasize);
 int ohci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize);
-struct usb_pipe *ohci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp);
+struct usb_pipe *ohci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                                      , struct usb_endpoint_descriptor *epdesc);
 int ohci_poll_intr(struct usb_pipe *p, void *data);
 
 
diff --git a/src/usb-uhci.c b/src/usb-uhci.c
index 0da4eff..50d98fc 100644
--- a/src/usb-uhci.c
+++ b/src/usb-uhci.c
@@ -475,19 +475,19 @@ fail:
 }
 
 struct usb_pipe *
-uhci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
+uhci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                     , struct usb_endpoint_descriptor *epdesc)
 {
     if (! CONFIG_USB_UHCI)
         return NULL;
     struct usb_uhci_s *cntl = container_of(
-        dummy->cntl, struct usb_uhci_s, usb);
+        usbdev->hub->cntl, struct usb_uhci_s, usb);
+    int frameexp = usb_getFrameExp(usbdev, epdesc);
     dprintf(7, "uhci_alloc_intr_pipe %p %d\n", &cntl->usb, frameexp);
 
     if (frameexp > 10)
         frameexp = 10;
-    int maxpacket = dummy->maxpacket;
-    int lowspeed = dummy->speed;
-    int devaddr = dummy->devaddr | (dummy->ep << 7);
+    int maxpacket = epdesc->wMaxPacketSize;
     // Determine number of entries needed for 2 timer ticks.
     int ms = 1<<frameexp;
     int count = DIV_ROUND_UP(PIT_TICK_INTERVAL * 1000 * 2, PIT_TICK_RATE * ms);
@@ -500,7 +500,9 @@ uhci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp)
         goto fail;
     }
     memset(pipe, 0, sizeof(*pipe));
-    memcpy(&pipe->pipe, dummy, sizeof(pipe->pipe));
+    usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
+    int lowspeed = pipe->pipe.speed;
+    int devaddr = pipe->pipe.devaddr | (pipe->pipe.ep << 7);
     pipe->qh.element = (u32)tds;
     pipe->next_td = &tds[0];
     pipe->iobase = cntl->iobase;
diff --git a/src/usb-uhci.h b/src/usb-uhci.h
index 035a565..708ba59 100644
--- a/src/usb-uhci.h
+++ b/src/usb-uhci.h
@@ -11,7 +11,8 @@ struct usb_pipe;
 int uhci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
                  , void *data, int datasize);
 int uhci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize);
-struct usb_pipe *uhci_alloc_intr_pipe(struct usb_pipe *dummy, int frameexp);
+struct usb_pipe *uhci_alloc_intr_pipe(struct usbdevice_s *usbdev
+                                      , struct usb_endpoint_descriptor *epdesc);
 int uhci_poll_intr(struct usb_pipe *p, void *data);
 
 
diff --git a/src/usb.c b/src/usb.c
index b61fbc1..7276e15 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -127,27 +127,29 @@ usb_send_bulk(struct usb_pipe *pipe_fl, int dir, void *data, int datasize)
     }
 }
 
-struct usb_pipe *
-alloc_intr_pipe(struct usbdevice_s *usbdev
+// Find the exponential period of the requested interrupt end point.
+int
+usb_getFrameExp(struct usbdevice_s *usbdev
                 , struct usb_endpoint_descriptor *epdesc)
 {
-    struct usb_pipe dummy;
-    usb_desc2pipe(&dummy, usbdev, epdesc);
-    // Find the exponential period of the requested time.
     int period = epdesc->bInterval;
-    int frameexp;
     if (usbdev->speed != USB_HIGHSPEED)
-        frameexp = (period <= 0) ? 0 : __fls(period);
-    else
-        frameexp = (period <= 4) ? 0 : period - 4;
-    switch (dummy.type) {
+        return (period <= 0) ? 0 : __fls(period);
+    return (period <= 4) ? 0 : period - 4;
+}
+
+struct usb_pipe *
+alloc_intr_pipe(struct usbdevice_s *usbdev
+                , struct usb_endpoint_descriptor *epdesc)
+{
+    switch (usbdev->hub->cntl->type) {
     default:
     case USB_TYPE_UHCI:
-        return uhci_alloc_intr_pipe(&dummy, frameexp);
+        return uhci_alloc_intr_pipe(usbdev, epdesc);
     case USB_TYPE_OHCI:
-        return ohci_alloc_intr_pipe(&dummy, frameexp);
+        return ohci_alloc_intr_pipe(usbdev, epdesc);
     case USB_TYPE_EHCI:
-        return ehci_alloc_intr_pipe(&dummy, frameexp);
+        return ehci_alloc_intr_pipe(usbdev, epdesc);
     }
 }
 
diff --git a/src/usb.h b/src/usb.h
index c792376..eddf9af 100644
--- a/src/usb.h
+++ b/src/usb.h
@@ -223,6 +223,8 @@ void usb_desc2pipe(struct usb_pipe *pipe, struct usbdevice_s *usbdev
 struct usb_pipe *usb_getFreePipe(struct usb_s *cntl, u8 eptype);
 struct usb_pipe *alloc_async_pipe(struct usbdevice_s *usbdev
                                   , struct usb_endpoint_descriptor *epdesc);
+int usb_getFrameExp(struct usbdevice_s *usbdev
+                    , struct usb_endpoint_descriptor *epdesc);
 struct usb_pipe *alloc_intr_pipe(struct usbdevice_s *usbdev
                                  , struct usb_endpoint_descriptor *epdesc);
 int usb_poll_intr(struct usb_pipe *pipe, void *data);
-- 
1.7.6.5




More information about the SeaBIOS mailing list