[SeaBIOS] [PATCH 17/19] usb: Populate OHCI endpoint descriptor info at pipe allocation.
Kevin O'Connor
kevin at koconnor.net
Sun Mar 11 03:48:52 CET 2012
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/usb-ohci.c | 32 ++++++++++++++++++--------------
1 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/src/usb-ohci.c b/src/usb-ohci.c
index a0937a2..9980a8e 100644
--- a/src/usb-ohci.c
+++ b/src/usb-ohci.c
@@ -302,6 +302,17 @@ ohci_init(struct pci_device *pci, int busid)
* End point communication
****************************************************************/
+// Setup fields in ed
+static void
+ohci_desc2pipe(struct ohci_pipe *pipe, struct usbdevice_s *usbdev
+ , struct usb_endpoint_descriptor *epdesc)
+{
+ usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
+ pipe->ed.hwINFO = (ED_SKIP | usbdev->devaddr | (pipe->pipe.ep << 7)
+ | (epdesc->wMaxPacketSize << 16)
+ | (usbdev->speed ? ED_LOWSPEED : 0));
+}
+
static struct usb_pipe *
ohci_alloc_intr_pipe(struct usbdevice_s *usbdev
, struct usb_endpoint_descriptor *epdesc)
@@ -323,9 +334,8 @@ ohci_alloc_intr_pipe(struct usbdevice_s *usbdev
if (!pipe || !tds || !data)
goto err;
memset(pipe, 0, sizeof(*pipe));
- usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
- int lowspeed = pipe->pipe.speed;
- int devaddr = pipe->pipe.devaddr | (pipe->pipe.ep << 7);
+ ohci_desc2pipe(pipe, usbdev, epdesc);
+ pipe->ed.hwINFO &= ~ED_SKIP;
pipe->data = data;
pipe->count = count;
pipe->tds = tds;
@@ -333,7 +343,6 @@ ohci_alloc_intr_pipe(struct usbdevice_s *usbdev
struct ohci_ed *ed = &pipe->ed;
ed->hwHeadP = (u32)&tds[0];
ed->hwTailP = (u32)&tds[count-1];
- ed->hwINFO = devaddr | (maxpacket << 16) | (lowspeed ? ED_LOWSPEED : 0);
int i;
for (i=0; i<count-1; i++) {
@@ -387,7 +396,8 @@ ohci_alloc_pipe(struct usbdevice_s *usbdev
struct usb_pipe *usbpipe = usb_getFreePipe(&cntl->usb, eptype);
if (usbpipe) {
// Use previously allocated pipe.
- usb_desc2pipe(usbpipe, usbdev, epdesc);
+ struct ohci_pipe *pipe = container_of(usbpipe, struct ohci_pipe, pipe);
+ ohci_desc2pipe(pipe, usbdev, epdesc);
return usbpipe;
}
@@ -398,8 +408,7 @@ ohci_alloc_pipe(struct usbdevice_s *usbdev
return NULL;
}
memset(pipe, 0, sizeof(*pipe));
- usb_desc2pipe(&pipe->pipe, usbdev, epdesc);
- pipe->ed.hwINFO = ED_SKIP;
+ ohci_desc2pipe(pipe, usbdev, epdesc);
// Add queue head to controller list.
pipe->ed.hwNextED = cntl->regs->ed_controlhead;
@@ -439,9 +448,6 @@ ohci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
struct ohci_pipe *pipe = container_of(p, struct ohci_pipe, pipe);
struct usb_ohci_s *cntl = container_of(
pipe->pipe.cntl, struct usb_ohci_s, usb);
- int maxpacket = pipe->pipe.maxpacket;
- int lowspeed = pipe->pipe.speed;
- int devaddr = pipe->pipe.devaddr | (pipe->pipe.ep << 7);
// Setup transfer descriptors
struct ohci_td *tds = malloc_tmphigh(sizeof(*tds) * 3);
@@ -469,16 +475,14 @@ ohci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
td++;
// Transfer data
- pipe->ed.hwINFO = ED_SKIP;
- barrier();
pipe->ed.hwHeadP = (u32)tds;
pipe->ed.hwTailP = (u32)td;
barrier();
- pipe->ed.hwINFO = devaddr | (maxpacket << 16) | (lowspeed ? ED_LOWSPEED : 0);
+ pipe->ed.hwINFO &= ~ED_SKIP;
writel(&cntl->regs->cmdstatus, OHCI_CLF);
int ret = wait_ed(&pipe->ed);
- pipe->ed.hwINFO = ED_SKIP;
+ pipe->ed.hwINFO |= ED_SKIP;
if (ret)
ohci_waittick(cntl);
free(tds);
--
1.7.6.5
More information about the SeaBIOS
mailing list