From 22ee4c6dac2c7139564ff45520ac3e87200bbbde Mon Sep 17 00:00:00 2001 From: patacongo Date: Thu, 15 Mar 2012 22:56:46 +0000 Subject: [PATCH] Fix PIC32 USB double buffer toggle git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4492 42af7a65-404d-4744-a932-0658087f49c3 --- arch/mips/src/pic32mx/pic32mx-usbdev.c | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/arch/mips/src/pic32mx/pic32mx-usbdev.c b/arch/mips/src/pic32mx/pic32mx-usbdev.c index b0a73dc2064..d50c938abb3 100644 --- a/arch/mips/src/pic32mx/pic32mx-usbdev.c +++ b/arch/mips/src/pic32mx/pic32mx-usbdev.c @@ -2259,31 +2259,17 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) { struct pic32mx_ep_s *ep0 = &priv->eplist[EP0]; volatile struct usbotg_bdtentry_s *bdtlast; - volatile struct usbotg_bdtentry_s *bdtnext; int ret; - /* Get the last and the next IN BDT */ + /* Get the last BDT and make sure that we own it. */ bdtlast = ep0->bdtin; - if (bdtlast == &g_bdt[EP0_IN_EVEN]) - { - bdtnext = &g_bdt[EP0_IN_ODD]; - } - else - { - DEBUGASSERT(bdtlast == &g_bdt[EP0_IN_ODD]); - bdtnext = &g_bdt[EP0_IN_EVEN]; - } /* Make sure that we own the last BDT. */ bdtlast->status = 0; bdtlast->addr = 0; - /* Save the next BDT as the current BDT */ - - ep0->bdtin = bdtnext; - /* Are we processing the completion of one packet of an outgoing request * from the class driver? */ @@ -2292,6 +2278,9 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) { /* An outgoing EP0 transfer has completed. Update the byte count and * check for the completion of the transfer. + * + * NOTE: pic32mx_wrcomplete() will toggle bdtin to the other buffer so + * we do not need to that for this case. */ pic32mx_wrcomplete(priv, &priv->eplist[EP0]); @@ -2318,6 +2307,18 @@ static void pic32mx_ep0incomplete(struct pic32mx_usbdev_s *priv) else if (priv->ctrlstate == CTRLSTATE_WAITSETUP) { + /* Get the next IN BDT */ + + if (bdtlast == &g_bdt[EP0_IN_EVEN]) + { + ep0->bdtin = &g_bdt[EP0_IN_ODD]; + } + else + { + DEBUGASSERT(bdtlast == &g_bdt[EP0_IN_ODD]); + ep0->bdtin = &g_bdt[EP0_IN_EVEN]; + } + /* Look at the saved SETUP command. Was it a SET ADDRESS request? * If so, then now is the time to set the address. */