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

Christian Gmeiner christian.gmeiner at gmail.com
Tue Jan 15 08:12:58 CET 2013


Ignore this patch.
--
Christian Gmeiner, MSc


2013/1/9 Christian Gmeiner <christian.gmeiner at gmail.com>:
> 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