9
0
Fork 0

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
This commit is contained in:
patacongo 2008-10-27 22:45:55 +00:00
parent 8c2ac2fa56
commit fdad240792
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).
* 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.

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).
* 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>

View File

@ -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;
}
/*******************************************************************************

View File

@ -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;
}
/*******************************************************************************