Fix to handler transfers larger than one request
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@1077 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
parent
2e884bcbeb
commit
d5bc42e6ed
|
@ -1998,8 +1998,9 @@ static int usbstrg_cmdreadstate(FAR struct usbstrg_dev_s *priv)
|
|||
req->len = priv->nreqbytes;
|
||||
req->private = privreq;
|
||||
req->callback = usbstrg_wrcomplete;
|
||||
req->flags = 0;
|
||||
|
||||
ret = EP_SUBMIT(priv->epbulkin, req);
|
||||
ret = EP_SUBMIT(priv->epbulkin, req);
|
||||
if (ret != OK)
|
||||
{
|
||||
usbtrace(TRACE_CLSERROR(USBSTRG_TRACEERR_CMDREADSUBMIT), (uint16)-ret);
|
||||
|
@ -2227,6 +2228,8 @@ static int usbstrg_cmdfinishstate(FAR struct usbstrg_dev_s *priv)
|
|||
req->len = priv->nreqbytes;
|
||||
req->callback = usbstrg_wrcomplete;
|
||||
req->private = privreq;
|
||||
req->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
|
||||
ret = EP_SUBMIT(priv->epbulkin, privreq->req);
|
||||
if (ret < 0)
|
||||
{
|
||||
|
@ -2367,10 +2370,12 @@ static int usbstrg_cmdstatusstate(FAR struct usbstrg_dev_s *priv)
|
|||
|
||||
usbstrg_dumpdata("SCSCI CSW", (ubyte*)csw, USBSTRG_CSW_SIZEOF);
|
||||
|
||||
req->len = USBSTRG_CSW_SIZEOF;
|
||||
req->callback = usbstrg_wrcomplete;
|
||||
req->private = privreq;
|
||||
ret = EP_SUBMIT(priv->epbulkin, req);
|
||||
req->len = USBSTRG_CSW_SIZEOF;
|
||||
req->callback = usbstrg_wrcomplete;
|
||||
req->private = privreq;
|
||||
req->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
|
||||
ret = EP_SUBMIT(priv->epbulkin, req);
|
||||
if (ret < 0)
|
||||
{
|
||||
usbtrace(TRACE_CLSERROR(USBSTRG_TRACEERR_SNDSTATUSSUBMIT), (uint16)-ret);
|
||||
|
|
|
@ -613,6 +613,7 @@ static int usbclass_sndpacket(FAR struct usbser_dev_s *priv)
|
|||
|
||||
req->len = len;
|
||||
req->private = reqcontainer;
|
||||
req->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
ret = EP_SUBMIT(ep, req);
|
||||
if (ret != OK)
|
||||
{
|
||||
|
@ -1765,8 +1766,9 @@ static int usbclass_setup(FAR struct usbdev_s *dev, const struct usb_ctrlreq_s *
|
|||
|
||||
if (ret >= 0)
|
||||
{
|
||||
ctrlreq->len = min(len, ret);
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
ctrlreq->len = min(len, ret);
|
||||
ctrlreq->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
if (ret < 0)
|
||||
{
|
||||
usbtrace(TRACE_CLSERROR(USBSER_TRACEERR_EPRESPQ), (uint16)-ret);
|
||||
|
|
|
@ -584,7 +584,6 @@ static int usbstrg_bind(FAR struct usbdev_s *dev, FAR struct usbdevclass_driver_
|
|||
|
||||
flags = irqsave();
|
||||
sq_addlast((sq_entry_t*)reqcontainer, &priv->wrreqlist);
|
||||
priv->nwrq++; /* Count of write requests available */
|
||||
irqrestore(flags);
|
||||
}
|
||||
|
||||
|
@ -677,7 +676,6 @@ static void usbstrg_unbind(FAR struct usbdev_s *dev)
|
|||
* been returned to the free list at this time -- we don't check)
|
||||
*/
|
||||
|
||||
DEBUGASSERT(priv->nrdq == 0);
|
||||
for (i = 0; i < CONFIG_USBSTRG_NRDREQS; i++)
|
||||
{
|
||||
reqcontainer = &priv->rdreqs[i];
|
||||
|
@ -701,17 +699,14 @@ static void usbstrg_unbind(FAR struct usbdev_s *dev)
|
|||
*/
|
||||
|
||||
flags = irqsave();
|
||||
DEBUGASSERT(priv->nwrq == CONFIG_USBSTRG_NWRREQS);
|
||||
while (!sq_empty(&priv->wrreqlist))
|
||||
{
|
||||
reqcontainer = (struct usbstrg_req_s *)sq_remfirst(&priv->wrreqlist);
|
||||
if (reqcontainer->req != NULL)
|
||||
{
|
||||
usbstrg_freereq(priv->epbulkin, reqcontainer->req);
|
||||
priv->nwrq--; /* Number of write requests queued */
|
||||
}
|
||||
}
|
||||
DEBUGASSERT(priv->nwrq == 0);
|
||||
irqrestore(flags);
|
||||
}
|
||||
}
|
||||
|
@ -977,8 +972,9 @@ static int usbstrg_setup(FAR struct usbdev_s *dev, const struct usb_ctrlreq_s *c
|
|||
|
||||
if (ret >= 0)
|
||||
{
|
||||
ctrlreq->len = min(len, ret);
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
ctrlreq->len = min(len, ret);
|
||||
ctrlreq->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
if (ret < 0)
|
||||
{
|
||||
usbtrace(TRACE_CLSERROR(USBSTRG_TRACEERR_EPRESPQ), (uint16)-ret);
|
||||
|
@ -1160,7 +1156,6 @@ int usbstrg_setconfig(FAR struct usbstrg_dev_s *priv, ubyte config)
|
|||
|
||||
/* Queue read requests in the bulk OUT endpoint */
|
||||
|
||||
DEBUGASSERT(priv->nrdq == 0);
|
||||
for (i = 0; i < CONFIG_USBSTRG_NRDREQS; i++)
|
||||
{
|
||||
privreq = &priv->rdreqs[i];
|
||||
|
@ -1174,7 +1169,6 @@ int usbstrg_setconfig(FAR struct usbstrg_dev_s *priv, ubyte config)
|
|||
usbtrace(TRACE_CLSERROR(USBSTRG_TRACEERR_RDSUBMIT), (uint16)-ret);
|
||||
goto errout;
|
||||
}
|
||||
priv->nrdq++;
|
||||
}
|
||||
|
||||
priv->config = config;
|
||||
|
@ -1246,7 +1240,6 @@ void usbstrg_wrcomplete(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s *req
|
|||
|
||||
flags = irqsave();
|
||||
sq_addlast((sq_entry_t*)privreq, &priv->wrreqlist);
|
||||
priv->nwrq++;
|
||||
irqrestore(flags);
|
||||
|
||||
/* Process the received data unless this is some unusual condition */
|
||||
|
@ -1254,7 +1247,7 @@ void usbstrg_wrcomplete(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s *req
|
|||
switch (req->result)
|
||||
{
|
||||
case OK: /* Normal completion */
|
||||
usbtrace(TRACE_CLASSWRCOMPLETE, priv->nwrq);
|
||||
usbtrace(TRACE_CLASSWRCOMPLETE, req->xfrd);
|
||||
break;
|
||||
|
||||
case -ESHUTDOWN: /* Disconnection */
|
||||
|
@ -1309,7 +1302,7 @@ void usbstrg_rdcomplete(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s *req
|
|||
{
|
||||
case 0: /* Normal completion */
|
||||
{
|
||||
usbtrace(TRACE_CLASSRDCOMPLETE, priv->nrdq);
|
||||
usbtrace(TRACE_CLASSRDCOMPLETE, req->xfrd);
|
||||
|
||||
/* Add the filled read request from the rdreqlist */
|
||||
|
||||
|
@ -1391,14 +1384,15 @@ void usbstrg_deferredresponse(FAR struct usbstrg_dev_s *priv, boolean failed)
|
|||
dev = priv->usbdev;
|
||||
ctrlreq = priv->ctrlreq;
|
||||
|
||||
/* If no error occurs, response to the deferred setup command with a null
|
||||
/* If no error occurs, respond to the deferred setup command with a null
|
||||
* packet.
|
||||
*/
|
||||
|
||||
if (!failed)
|
||||
{
|
||||
ctrlreq->len = 0;
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
ctrlreq->len = 0;
|
||||
ctrlreq->flags = USBDEV_REQFLAGS_NULLPKT;
|
||||
ret = EP_SUBMIT(dev->ep0, ctrlreq);
|
||||
if (ret < 0)
|
||||
{
|
||||
usbtrace(TRACE_CLSERROR(USBSTRG_TRACEERR_DEFERREDRESPSUBMIT), (uint16)-ret);
|
||||
|
|
|
@ -175,6 +175,10 @@
|
|||
#define USB_SPEED_HIGH 3 /* USB 2.0 */
|
||||
#define USB_SPEED_VARIABLE 4 /* Wireless USB 2.5 */
|
||||
|
||||
/* Request flags */
|
||||
|
||||
#define USBDEV_REQFLAGS_NULLPKT 0 /* Terminate w/short packet; null packet if necessary */
|
||||
|
||||
/************************************************************************************
|
||||
* Public Types
|
||||
************************************************************************************/
|
||||
|
@ -187,6 +191,7 @@ struct usbdev_ep_s;
|
|||
struct usbdev_req_s
|
||||
{
|
||||
char *buf; /* Call: Buffer used for data; Return: Unchanged */
|
||||
ubyte flags; /* See USBDEV_REQFLAGS_* definitions */
|
||||
uint16 len; /* Call: Total length of data in buf; Return: Unchanged */
|
||||
uint16 xfrd; /* Call: zero; Return: Bytes transferred so far */
|
||||
sint16 result; /* Call: zero; Return: Result of transfer (O or -errno) */
|
||||
|
|
Loading…
Reference in New Issue