diff --git a/ChangeLog b/ChangeLog
index d56d12d02a8c8d5163661b210088f95f7db42309..accf731ee568c942e7f1f0f2045f4e16dd4f99ef 100644
--- a/ChangeLog
+++ b/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/Documentation/NuttX.html b/Documentation/NuttX.html
index cf954853810e90c3c39e825ab5a1b8eecb4dd597..a93e24cff939c76cea10535b10210e7e453b8367 100644
--- a/Documentation/NuttX.html
+++ b/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/arch/arm/src/dm320/dm320_usbdev.c b/arch/arm/src/dm320/dm320_usbdev.c
index c585c3fe9779a25f677678285376a94f2cc29d4b..0076f0067b520a862d070dea8dc74640a03408c0 100644
--- a/arch/arm/src/dm320/dm320_usbdev.c
+++ b/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 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;
-        }
+  /* Receive the next packet */
 
-      /* If the receive buffer is full or if the last packet was not full
-       * then we are finished with the transfer.
-       */
+  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;
+    }
 
-      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;
-        }
+  /* 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; /* Won't get here */
+  return OK;
 }
 
 /*******************************************************************************
diff --git a/arch/arm/src/lpc214x/lpc214x_usbdev.c b/arch/arm/src/lpc214x/lpc214x_usbdev.c
index 71c30596d2ebc448d4dc61ca1e3d64552f5228a0..e23da86ccaa4a3a094426c8b19f37f6cfafceeb2 100644
--- a/arch/arm/src/lpc214x/lpc214x_usbdev.c
+++ b/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 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;
-        }
+  /* Receive the next packet */
 
-      /* If the receive buffer is full or if the last packet was not full
-       * then we are finished with the transfer.
-       */
+  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;
+    }
 
-      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;
-        }
+  /* 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; /* Won't get here */
+  return OK;
 }
 
 /*******************************************************************************