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:
parent
bca6c1e63d
commit
05f8581874
@ -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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user