Inlined patch below.

Signed-off-by: Cerrato Renaud <r.cerr...@til-technologies.fr>
---
 drivers/usb/gadget/dfu.c |    6 ++----
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c
index e051879..e4af567 100644
--- a/drivers/usb/gadget/dfu.c
+++ b/drivers/usb/gadget/dfu.c
@@ -514,14 +514,12 @@ static void dfu_disable(struct usb_function *f)
     struct f_dfu        *dfu = func_to_dfu(f);
 
     switch (dfu->dfu_state) {
+    case DFU_STATE_dfuIDLE:
     case DFU_STATE_appDETACH:
         dfu->dfu_state = DFU_STATE_dfuIDLE;
         break;
-    case DFU_STATE_dfuMANIFEST_WAIT_RST:
-        dfu->dfu_state = DFU_STATE_appIDLE;
-        break;
     default:
-        dfu->dfu_state = DFU_STATE_appDETACH;
+        dfu->dfu_state = DFU_STATE_appIDLE;
         break;
     }
 
-- 
1.7.2.5


On 12/03/2013 17:38, Renaud C. wrote:
> When an USB_REQ_DFU_DETACH request is received, the device state switch to 
> DFU_STATE_appDETACH, and then wait for an usb reset to switch to 
> DFU_STATE_dfuIDLE (through dfu_disable() being called). 
>
> I noticed that using dfu-util v0.7 on my AT91SAM9260 board, the programming 
> failed because of the device not entering the DFU_STATE_dfuIDLE after an usb 
> reset (staying in the DFU_STATE_appDETACH state).
>
> According to the current implementation, once the USB_REQ_DFU_DETACH is sent 
> and right after the usb reset, if the DFU client set more than one 
> configuration (by iterating over them for example), the device state will 
> reset to the DFU_STATE_appDETACH state on the 2nd iteration because of the 
> following line in set_config (composite.c, line 362) :
>
> ...
> if(cdev->config) 
>     reset_config();   // will call dfu_disable() again!
> ...
>
> The attached patch is a *try* to fix the issue by leaving the device in the 
> DFU_STATE_dfuIDLE state after an usb reset if already in that state. dfu-util 
> will complain about the device already in the DFU_STATE_dfuIDLE on the next 
> start, but everything is still working.
>
> This may need a REVISIT, but since the dfu_disable() gets called on both 
> configuration change and usb reset, we can't do this easily for now..
>
>
>
>
>
>
>
>
>
>
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox



_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to