[SeaBIOS] [PATCH RFC] usb-ehci: maintain toggle state

Christian Gmeiner christian.gmeiner at gmail.com
Wed Jan 9 10:52:26 CET 2013


This fixes/improves the ehci driver on bare metal. The current logic
in ehci_send_bulk(..) looks wired... but he.. this patch is RFC :)

Before patch:

Option rom sizing returned 0 0
\0f7a6000/ End thread
\0f7a4000/ End thread
\0f7a3000/ End thread
|0f7a2000| ata_reset exit status=50
|0f7a2000| send_cmd : read error (status=51 err=04)
|0f7a2000| ata0-0: SFCF4096H3BK2SA-I-Q1-233-SMA ATA-5 Hard-Disk (3919 MiBytes)
|0f7a2000| Registering bootable: ata0-0: SFCF4096H3BK2SA-I-Q1-233-SMA ATA-5 Hard-Disk (3919 MiBytes) (type:2 prio:103 data:fdb10)
|0f7a2000| ata_detect resetresult=604f
\0f7a2000/ End thread
|0f7a5000| set_address 0x0f7a8d10
|0f7a5000| ehci_control 0x0f7a8950 (dir=0 cmd=8 data=0)
|0f7a5000| config_usb: 0x0f7a8950
|0f7a5000| ehci_control 0x0f7a8950 (dir=128 cmd=8 data=8)
|0f7a5000| device rev=0200 cls=00 sub=00 proto=00 size=40
|0f7a5000| ehci_control 0x0f7a8950 (dir=128 cmd=8 data=9)
|0f7a5000| ehci_control 0x0f7a8950 (dir=128 cmd=8 data=39)
|0f7a5000| ehci_control 0x0f7a8950 (dir=0 cmd=8 data=0)
|0f7a5000| ehci_control 0x0f7a8950 (dir=128 cmd=8 data=1)
|0f7a5000| WARNING - Timeout at ehci_wait_td:544!
|0f7a5000| ehci pipe=0x000ef700 cur=00000000 tok=00000000 next=f7a5c80 td=0x0f7a5c80 status=d0d80
|0f7a5000| USB transmission failed
|0f7a5000| Unable to configure USB MSC drive.
|0f7a5000| Unable to configure USB MSC device.
\0f7a5000/ End thread
\0f7a7000/ End thread
All threads complete.
Mapping hd drive 0x000fdb10 to 0
drive 0x000fdb10: PCHS=7964/16/63 translation=large LCHS=995/128/63 s=8027712
finalize PMM
malloc finalize
Space available for UMB: 000c0000-000ef000

usb transfer log: http://dpaste.com/869037/

After patch:

\0f7a6000/ End thread
\0f7a4000/ End thread
\0f7a3000/ End thread
|0f7a2000| ata_reset exit status=50
|0f7a2000| send_cmd : read error (status=51 err=04)
|0f7a2000| ata0-0: SFCF4096H3BK2SA-I-Q1-233-SMA ATA-5 Hard-Disk (3919 MiBytes)
|0f7a2000| Registering bootable: ata0-0: SFCF4096H3BK2SA-I-Q1-233-SMA ATA-5 Hard-Disk (3919 MiBytes) (type:2 prio:103 data:fdb10)
|0f7a2000| ata_detect resetresult=604f
\0f7a2000/ End thread
|0f7a5000| set_address 0x0f7a8ce0
|0f7a5000| ehci_control 0x0f7a88d0 (dir=0 cmd=8 data=0)
|0f7a5000| config_usb: 0x0f7a88d0
|0f7a5000| ehci_control 0x0f7a88d0 (dir=128 cmd=8 data=8)
|0f7a5000| device rev=0200 cls=00 sub=00 proto=00 size=40
|0f7a5000| ehci_control 0x0f7a88d0 (dir=128 cmd=8 data=9)
|0f7a5000| ehci_control 0x0f7a88d0 (dir=128 cmd=8 data=39)
|0f7a5000| ehci_control 0x0f7a88d0 (dir=0 cmd=8 data=0)
|0f7a5000| ehci_control 0x0f7a88d0 (dir=128 cmd=8 data=1)
|0f7a5000| USB MSC vendor='' product='STD USB 1GB' rev='0.00' type=0 removable=1
|0f7a5000| scsi_is_ready (drive=0x000fdae0)
|0f7a5000| USB MSC blksize=512 sectors=2005575
|0f7a5000| Registering bootable: USB MSC Drive  STD USB 1GB 0.00 (type:2 prio:103 data:fdae0)
\0f7a5000/ End thread
\0f7a7000/ End thread
All threads complete.
Mapping hd drive 0x000fdb10 to 0
drive 0x000fdb10: PCHS=7964/16/63 translation=large LCHS=995/128/63 s=8027712
Mapping hd drive 0x000fdae0 to 1
drive 0x000fdae0: PCHS=0/0/0 translation=lba LCHS=994/32/63 s=2005575
finalize PMM
malloc finalize

ubs transfer log: http://dpaste.com/869023/

Signed-off-by: Christian Gmeiner <christian.gmeiner at gmail.com>
---
 src/usb-ehci.c | 15 ++++++++++++++-
 src/usb.h      |  1 +
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/usb-ehci.c b/src/usb-ehci.c
index 2676615..3eefd85 100644
--- a/src/usb-ehci.c
+++ b/src/usb-ehci.c
@@ -410,6 +410,8 @@ ehci_desc2pipe(struct ehci_pipe *pipe, struct usbdevice_s *usbdev
                            | QH_TOGGLECONTROL);
     else if (eptype == USB_ENDPOINT_XFER_INT)
         pipe->qh.info2 |= (0x01 << QH_SMASK_SHIFT) | (0x1c << QH_CMASK_SHIFT);
+    else if (eptype == USB_ENDPOINT_XFER_BULK)
+        pipe->qh.info1 |= QH_TOGGLECONTROL;
 }
 
 static struct usb_pipe *
@@ -661,12 +663,15 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
 
     u16 maxpacket = GET_LOWFLAT(pipe->pipe.maxpacket);
     int tdpos = 0;
+    struct ehci_qtd *last = &tds[0];
+
     while (datasize) {
         struct ehci_qtd *td = &tds[tdpos++ % STACKQTDS];
+/*
         int ret = ehci_wait_td(pipe, td, 5000);
         if (ret)
             return -1;
-
+*/
         struct ehci_qtd *nexttd_fl = MAKE_FLATPTR(GET_SEG(SS)
                                                  , &tds[tdpos % STACKQTDS]);
 
@@ -680,6 +685,11 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
         data += transfer;
         datasize -= transfer;
     }
+
+    /* update based on endpoint toggle */
+    tds[0].token  |= (pipe->pipe.toogle?QTD_TOGGLE:0);
+    pipe->qh.token|= (pipe->pipe.toogle?QTD_TOGGLE:0);
+
     int i;
     for (i=0; i<STACKQTDS; i++) {
         struct ehci_qtd *td = &tds[tdpos++ % STACKQTDS];
@@ -688,6 +698,9 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
             return -1;
     }
 
+    /* update endpoint toggle based on device */
+    pipe->pipe.toogle = (last->token & QTD_TOGGLE) >> 31;
+
     return 0;
 }
 
diff --git a/src/usb.h b/src/usb.h
index a43e829..d272306 100644
--- a/src/usb.h
+++ b/src/usb.h
@@ -14,6 +14,7 @@ struct usb_pipe {
     u8 ep;
     u8 devaddr;
     u8 speed;
+    u8 toogle;
     u16 maxpacket;
     u8 eptype;
 };
-- 
1.7.12.2.421.g261b511




More information about the SeaBIOS mailing list