Fix read failures when OUT req size > maxpacket

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1086 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2008-10-27 22:45:55 +00:00
parent bca6c1e63d
commit 05f8581874
4 changed files with 44 additions and 50 deletions

View File

@ -518,6 +518,8 @@
to terminate an IN transfer with a short packet (zero-length if necessary). 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 * Fix an error in the NXP LPC214x USB device driver that was causing corruption of
the request queue (M320 driver also fixed, untested) 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.

View File

@ -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). 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 * Fix an error in the NXP LPC214x USB device driver that was causing corruption of
the request queue (M320 driver also fixed, untested) 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> pascal-0.1.3 2008-xx-xx Gregory Nutt <spudmonkey@racsa.co.cr>

View File

@ -1039,34 +1039,29 @@ static int dm320_rdrequest(struct dm320_ep_s *privep)
} }
usbtrace(TRACE_READ(privep->epphy), privreq->req.xfrd); 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 usbtrace(TRACE_DEVERROR(DM320_TRACEERR_EPREAD), nbytesread);
* (2) the last packet was exactly maxpacketsize. return ERROR;
*/
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;
}
} }
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;
} }
/******************************************************************************* /*******************************************************************************

View File

@ -1136,34 +1136,29 @@ static int lpc214x_rdrequest(struct lpc214x_ep_s *privep)
} }
usbtrace(TRACE_READ(privep->epphy), privreq->req.xfrd); 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 usbtrace(TRACE_DEVERROR(LPC214X_TRACEERR_EPREAD), nbytesread);
* (2) the last packet was exactly maxpacketsize. return ERROR;
*/
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;
}
} }
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;
} }
/******************************************************************************* /*******************************************************************************