From fdad240792e395b7df8309ea6cd7e4e476589979 Mon Sep 17 00:00:00 2001 From: patacongo Date: Mon, 27 Oct 2008 22:45:55 +0000 Subject: [PATCH] Fix read failures when OUT req size > maxpacket git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@1086 7fd9a85b-ad96-42d3-883c-3090e2eb8679 --- nuttx/ChangeLog | 2 + nuttx/Documentation/NuttX.html | 2 + nuttx/arch/arm/src/dm320/dm320_usbdev.c | 45 +++++++++------------ nuttx/arch/arm/src/lpc214x/lpc214x_usbdev.c | 45 +++++++++------------ 4 files changed, 44 insertions(+), 50 deletions(-) diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index d56d12d02..accf731ee 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -518,6 +518,8 @@ to terminate an IN transfer with a short packet (zero-length if necessary). * Fix an error in the NXP LPC214x USB device driver that was causing corruption of the request queue (M320 driver also fixed, untested) + * Correct another error in the NXP LPC214x USB device driver that caused read failures + when the request buffer size was larger than maxpacket. diff --git a/nuttx/Documentation/NuttX.html b/nuttx/Documentation/NuttX.html index cf9548538..a93e24cff 100644 --- a/nuttx/Documentation/NuttX.html +++ b/nuttx/Documentation/NuttX.html @@ -1148,6 +1148,8 @@ nuttx-0.3.17 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> to terminate an IN transfer with a short packet (zero-length if necessary). * Fix an error in the NXP LPC214x USB device driver that was causing corruption of the request queue (M320 driver also fixed, untested) + * Correct another error in the NXP LPC214x USB device driver that caused read failures + when the request buffer size was larger than maxpacket. pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr> diff --git a/nuttx/arch/arm/src/dm320/dm320_usbdev.c b/nuttx/arch/arm/src/dm320/dm320_usbdev.c index c585c3fe9..0076f0067 100644 --- a/nuttx/arch/arm/src/dm320/dm320_usbdev.c +++ b/nuttx/arch/arm/src/dm320/dm320_usbdev.c @@ -1039,34 +1039,29 @@ static int dm320_rdrequest(struct dm320_ep_s *privep) } usbtrace(TRACE_READ(privep->epphy), privreq->req.xfrd); - for (;;) + + /* Receive the next packet */ + + buf = privreq->req.buf + privreq->req.xfrd; + nbytesread = dm320_epread(privep->epphy, buf, privep->ep.maxpacket); + if (nbytesread < 0) { - /* Receive the next packet if (1) there are more bytes to be receive, or - * (2) the last packet was exactly maxpacketsize. - */ - - buf = privreq->req.buf + privreq->req.xfrd; - nbytesread = dm320_epread(privep->epphy, buf, privep->ep.maxpacket); - if (nbytesread < 0) - { - usbtrace(TRACE_DEVERROR(DM320_TRACEERR_EPREAD), nbytesread); - return ERROR; - } - - /* If the receive buffer is full or if the last packet was not full - * then we are finished with the transfer. - */ - - privreq->req.xfrd += nbytesread; - if (privreq->req.len < privreq->req.xfrd || nbytesread < privep->ep.maxpacket) - { - usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); - dm320_reqcomplete(privep, OK); - return OK; - } + usbtrace(TRACE_DEVERROR(DM320_TRACEERR_EPREAD), nbytesread); + return ERROR; } - return OK; /* Won't get here */ + /* If the receive buffer is full or if the last packet was not full + * then we are finished with the transfer. + */ + + privreq->req.xfrd += nbytesread; + if (privreq->req.len < privreq->req.xfrd || nbytesread < privep->ep.maxpacket) + { + usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); + dm320_reqcomplete(privep, OK); + } + + return OK; } /******************************************************************************* diff --git a/nuttx/arch/arm/src/lpc214x/lpc214x_usbdev.c b/nuttx/arch/arm/src/lpc214x/lpc214x_usbdev.c index 71c30596d..e23da86cc 100644 --- a/nuttx/arch/arm/src/lpc214x/lpc214x_usbdev.c +++ b/nuttx/arch/arm/src/lpc214x/lpc214x_usbdev.c @@ -1136,34 +1136,29 @@ static int lpc214x_rdrequest(struct lpc214x_ep_s *privep) } usbtrace(TRACE_READ(privep->epphy), privreq->req.xfrd); - for (;;) + + /* Receive the next packet */ + + buf = privreq->req.buf + privreq->req.xfrd; + nbytesread = lpc214x_epread(privep->epphy, buf, privep->ep.maxpacket); + if (nbytesread < 0) { - /* Receive the next packet if (1) there are more bytes to be receive, or - * (2) the last packet was exactly maxpacketsize. - */ - - buf = privreq->req.buf + privreq->req.xfrd; - nbytesread = lpc214x_epread(privep->epphy, buf, privep->ep.maxpacket); - if (nbytesread < 0) - { - usbtrace(TRACE_DEVERROR(LPC214X_TRACEERR_EPREAD), nbytesread); - return ERROR; - } - - /* If the receive buffer is full or if the last packet was not full - * then we are finished with the transfer. - */ - - privreq->req.xfrd += nbytesread; - if (privreq->req.xfrd >= privreq->req.len || nbytesread < privep->ep.maxpacket) - { - usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); - lpc214x_reqcomplete(privep, OK); - return OK; - } + usbtrace(TRACE_DEVERROR(LPC214X_TRACEERR_EPREAD), nbytesread); + return ERROR; } - return OK; /* Won't get here */ + /* If the receive buffer is full or if the last packet was not full + * then we are finished with the transfer. + */ + + privreq->req.xfrd += nbytesread; + if (privreq->req.xfrd >= privreq->req.len || nbytesread < privep->ep.maxpacket) + { + usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd); + lpc214x_reqcomplete(privep, OK); + } + + return OK; } /*******************************************************************************