From 1427e505419d4b4ccdeb1ba2886ba128041de244 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: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4492 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c | 31 ++++++++++---------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c b/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c index b0a73dc206..d50c938abb 100644 --- a/nuttx/arch/mips/src/pic32mx/pic32mx-usbdev.c +++ b/nuttx/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. */