From fd096557737ca103336a69a80cc186b7c6d0cc3b Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Tue, 24 Aug 2010 19:12:22 -0300 Subject: [PATCH] Requests following a rejected SETUP requests failed too, which sometimes produces user-visible errors and may confuse implementations. (E.g., when probing for an unimplemented feature and subsequently being greeted by a timeout.) - fw/comon/usb.c (handle_setup): set SOPRDY when answering a request error with a stall, according to the example in AN139. This seems to eliminate the timeouts observed in requests following after bad requests. - fw/boot/boot.c (run_payload): described how the host is expected to respond to the device resetting its USB stack --- fw/boot/boot.c | 9 +++++++++ fw/common/usb.c | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fw/boot/boot.c b/fw/boot/boot.c index 88a0af0..2ce765f 100644 --- a/fw/boot/boot.c +++ b/fw/boot/boot.c @@ -71,6 +71,15 @@ void run_payload(void) /* Restart USB */ USB0XCN = 0; + /* + * The USB host must detect a disconnect (pull-ups absent) within 2 and + * 2.5 us according to parameter Tddis in table 7-13 on page 186 of the + * Universal Serial Bus Specification Revision 2.0. + * + * If our application calls usb_init really really quickly, we may need + * an extra delay here. + */ + debug("launching payload\n"); __asm diff --git a/fw/common/usb.c b/fw/common/usb.c index 3342126..6d037af 100644 --- a/fw/common/usb.c +++ b/fw/common/usb.c @@ -1,8 +1,8 @@ /* * common/usb.c - USB hardware setup and standard device requests * - * Written 2008, 2009 by Werner Almesberger - * Copyright 2008m 2009 Werner Almesberger + * Written 2008-2010 by Werner Almesberger + * Copyright 2008-2010 Werner Almesberger * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -258,8 +258,9 @@ okay: } stall: printk("STALL\n"); - usb_write(E0CSR, SDSTL_0); - ep0.state = EP_STALL; + /* AN139 recommends this sequence */ + usb_write(E0CSR, SOPRDY | SDSTL_0); + ep0.state = EP_IDLE; }