Fix 2 causes of protocol errors (there are more
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@977 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
52b2d03e27
commit
52b215159d
@ -304,6 +304,7 @@ struct lpc214x_ep_s
|
|||||||
ubyte epphy; /* Physical EP address */
|
ubyte epphy; /* Physical EP address */
|
||||||
ubyte stalled:1; /* Endpoint is halted */
|
ubyte stalled:1; /* Endpoint is halted */
|
||||||
ubyte halted:1; /* Endpoint feature halted */
|
ubyte halted:1; /* Endpoint feature halted */
|
||||||
|
ubyte txnullpkt:1; /* Null packet needed at end of transfer */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This represents a DMA descriptor */
|
/* This represents a DMA descriptor */
|
||||||
@ -1027,16 +1028,21 @@ static int lpc214x_wrrequest(struct lpc214x_ep_s *privep)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
usbtrace(TRACE_WRITE(privep->epphy), privreq->req.xfrd);
|
usbtrace(TRACE_WRITE(privep->epphy), privreq->req.xfrd);
|
||||||
if (bytesleft >= 0)
|
if (bytesleft > 0 || privep->txnullpkt)
|
||||||
{
|
{
|
||||||
/* Try to send maxpacketsize -- unless we don't have that many
|
/* Try to send maxpacketsize -- unless we don't have that many
|
||||||
* bytes to send.
|
* bytes to send.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
if (bytesleft > privep->ep.maxpacket)
|
||||||
|
{
|
||||||
nbytes = privep->ep.maxpacket;
|
nbytes = privep->ep.maxpacket;
|
||||||
if (nbytes > bytesleft)
|
privep->txnullpkt = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
nbytes = bytesleft;
|
nbytes = bytesleft;
|
||||||
|
privep->txnullpkt = (bytesleft == privep->ep.maxpacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send the largest number of bytes that we can in this packet */
|
/* Send the largest number of bytes that we can in this packet */
|
||||||
@ -1053,9 +1059,10 @@ static int lpc214x_wrrequest(struct lpc214x_ep_s *privep)
|
|||||||
* then we are finished with the transfer
|
* then we are finished with the transfer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (bytesleft <= 0)
|
if (bytesleft <= 0 || !privep->txnullpkt)
|
||||||
{
|
{
|
||||||
usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd);
|
usbtrace(TRACE_COMPLETE(privep->epphy), privreq->req.xfrd);
|
||||||
|
privep->txnullpkt = 0;
|
||||||
lpc214x_reqcomplete(privep, OK);
|
lpc214x_reqcomplete(privep, OK);
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -1376,11 +1383,6 @@ static void lpc214x_dispatchrequest(struct lpc214x_usbdev_s *priv,
|
|||||||
|
|
||||||
priv->stalled = 1;
|
priv->stalled = 1;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
lpc214x_epwrite(LPC214X_EP0_IN, NULL, 0);
|
|
||||||
priv->ep0state = LPC214X_EP0SHORTWRITE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2610,6 +2612,7 @@ static int lpc214x_epsubmit(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s
|
|||||||
{
|
{
|
||||||
/* Add the new request to the request queue for the endpoint */
|
/* Add the new request to the request queue for the endpoint */
|
||||||
|
|
||||||
|
privep->txnullpkt = 0;
|
||||||
lpc214x_rqenqueue(privep, privreq);
|
lpc214x_rqenqueue(privep, privreq);
|
||||||
usbtrace(TRACE_OUTREQQUEUED(privep->epphy), privreq->req.len);
|
usbtrace(TRACE_OUTREQQUEUED(privep->epphy), privreq->req.len);
|
||||||
ret = lpc214x_rdrequest(privep);
|
ret = lpc214x_rdrequest(privep);
|
||||||
|
Loading…
Reference in New Issue
Block a user