Re: [SeaBIOS] EHCI boot problems
On Tue, Sep 09, 2014 at 01:15:04PM -0600, Dave Frodin wrote: I'm seeing a problem booting from USB thumbdrives with commit ab9d771ce ehci: Update usb command timeouts to use usb_xfer_time() I'm not quite sure what the problem is other than it not liking the new timeouts. I couldn't see any problems with the ehci_control() calls to ehci_wait_td(). But the ehci_send_bulk() only allows the system to boot if I change int ret = ehci_wait_td(pipe, td, end); to int ret = ehci_wait_td(pipe, td, timer_calc(5000)); One potential problem is that the end value is calculated once and reused multiple times in the functions. Prior to the commit the timeout value was passed to the ehci_wait_td() function. Now the final end time is passed. So it looks like once the end timeout is reached in one of the loops that calls ehci_wait_td() the timer will always be expired for any other calls from that function. One solution might be to get rid of the end variable and change the calls from ret = ehci_wait_td(pipe, td, end); to ret = ehci_wait_td(pipe, td, timer_calc(usb_xfer_time(p, datasize))); Making the above change didn't have any impact on my booting problem until I forced the ehci_send_bulk() timeouts to 5000. Hi Dave, Stefan Burger reported a similar problem with that commit. However, I'm puzzled what would be causing such a regression - five seconds should be more then enough time to complete a single usb transaction. Do you have serial debugging (or similar) available on the device you are working with? If you could provide the output from the debugging patch below it may help diagnose the issue. I also got my Acer c720 back, and will run some tests on it. -Kevin --- a/src/hw/usb-ehci.c +++ b/src/hw/usb-ehci.c @@ -629,6 +629,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) , pipe-qh, dir, data, datasize); // Allocate 4 tds on stack (with required alignment) +u32 starttime = timer_calc(0); u32 end = timer_calc(usb_xfer_time(p, datasize)); u8 tdsbuf[sizeof(struct ehci_qtd) * STACKQTDS + EHCI_QTD_ALIGN - 1]; struct ehci_qtd *tds = (void*)ALIGN((u32)tdsbuf, EHCI_QTD_ALIGN); @@ -642,7 +643,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) struct ehci_qtd *td = tds[tdpos++ % STACKQTDS]; int ret = ehci_wait_td(pipe, td, end); if (ret) -return -1; +goto fail; struct ehci_qtd *nexttd_fl = MAKE_FLATPTR(GET_SEG(SS) , tds[tdpos % STACKQTDS]); @@ -662,10 +663,15 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) struct ehci_qtd *td = tds[tdpos++ % STACKQTDS]; int ret = ehci_wait_td(pipe, td, end); if (ret) -return -1; +goto fail; } return 0; +fail: +dprintf(1, timeout: start=%x end=%x cur=%x time=%d devaddr=%x datasize=%d\n +, starttime, end, timer_calc(0) +, usb_xfer_time(p, datasize), p-devaddr, datasize); +return -1; } int ___ SeaBIOS mailing list SeaBIOS@seabios.org http://www.seabios.org/mailman/listinfo/seabios
Re: [SeaBIOS] EHCI boot problems
Kevin, With your patch I'm not seeing that timeout message get displayed. I also forgot to mention that the USB thumbdrive will always get identified by SeaBIOS and will be listed as a boot device but will hang as soon as it is selected in the F12 boot menu. The activity LED on the thumbdrive only flashes when Seabios is identifying it. Thanks, Dave On Tue, Sep 9, 2014 at 2:46 PM, Kevin O'Connor ke...@koconnor.net wrote: On Tue, Sep 09, 2014 at 01:15:04PM -0600, Dave Frodin wrote: I'm seeing a problem booting from USB thumbdrives with commit ab9d771ce ehci: Update usb command timeouts to use usb_xfer_time() I'm not quite sure what the problem is other than it not liking the new timeouts. I couldn't see any problems with the ehci_control() calls to ehci_wait_td(). But the ehci_send_bulk() only allows the system to boot if I change int ret = ehci_wait_td(pipe, td, end); to int ret = ehci_wait_td(pipe, td, timer_calc(5000)); One potential problem is that the end value is calculated once and reused multiple times in the functions. Prior to the commit the timeout value was passed to the ehci_wait_td() function. Now the final end time is passed. So it looks like once the end timeout is reached in one of the loops that calls ehci_wait_td() the timer will always be expired for any other calls from that function. One solution might be to get rid of the end variable and change the calls from ret = ehci_wait_td(pipe, td, end); to ret = ehci_wait_td(pipe, td, timer_calc(usb_xfer_time(p, datasize))); Making the above change didn't have any impact on my booting problem until I forced the ehci_send_bulk() timeouts to 5000. Hi Dave, Stefan Burger reported a similar problem with that commit. However, I'm puzzled what would be causing such a regression - five seconds should be more then enough time to complete a single usb transaction. Do you have serial debugging (or similar) available on the device you are working with? If you could provide the output from the debugging patch below it may help diagnose the issue. I also got my Acer c720 back, and will run some tests on it. -Kevin --- a/src/hw/usb-ehci.c +++ b/src/hw/usb-ehci.c @@ -629,6 +629,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) , pipe-qh, dir, data, datasize); // Allocate 4 tds on stack (with required alignment) +u32 starttime = timer_calc(0); u32 end = timer_calc(usb_xfer_time(p, datasize)); u8 tdsbuf[sizeof(struct ehci_qtd) * STACKQTDS + EHCI_QTD_ALIGN - 1]; struct ehci_qtd *tds = (void*)ALIGN((u32)tdsbuf, EHCI_QTD_ALIGN); @@ -642,7 +643,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) struct ehci_qtd *td = tds[tdpos++ % STACKQTDS]; int ret = ehci_wait_td(pipe, td, end); if (ret) -return -1; +goto fail; struct ehci_qtd *nexttd_fl = MAKE_FLATPTR(GET_SEG(SS) , tds[tdpos % STACKQTDS]); @@ -662,10 +663,15 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize) struct ehci_qtd *td = tds[tdpos++ % STACKQTDS]; int ret = ehci_wait_td(pipe, td, end); if (ret) -return -1; +goto fail; } return 0; +fail: +dprintf(1, timeout: start=%x end=%x cur=%x time=%d devaddr=%x datasize=%d\n +, starttime, end, timer_calc(0) +, usb_xfer_time(p, datasize), p-devaddr, datasize); +return -1; } int ___ SeaBIOS mailing list SeaBIOS@seabios.org http://www.seabios.org/mailman/listinfo/seabios
Re: [SeaBIOS] EHCI boot problems
On Tue, Sep 09, 2014 at 04:08:25PM -0600, Dave Frodin wrote: Kevin, With your patch I'm not seeing that timeout message get displayed. I also forgot to mention that the USB thumbdrive will always get identified by SeaBIOS and will be listed as a boot device but will hang as soon as it is selected in the F12 boot menu. The activity LED on the thumbdrive only flashes when Seabios is identifying it. I was able to reproduce the problem on my c720. The patch below seems to fix it for me (but I'm still running tests). I'm not sure why this problem didn't show up on my other test machine (e350m1). -Kevin --- a/src/hw/usb.c +++ b/src/hw/usb.c @@ -195,7 +195,7 @@ usb_xfer_time(struct usb_pipe *pipe, int datalen) // set_address commands where we don't want to stall the boot if // the device doesn't actually exist. Add 100ms to account for // any controller delays. -if (!pipe-devaddr) +if (!GET_LOWFLAT(pipe-devaddr)) return USB_TIME_STATUS + 100; return USB_TIME_COMMAND + 100; } ___ SeaBIOS mailing list SeaBIOS@seabios.org http://www.seabios.org/mailman/listinfo/seabios