diff --git a/drivers/usbdev/usbdev_scsi.c b/drivers/usbdev/usbdev_scsi.c index 08e7cc1b4348c287e961f1643580e3021c6ee550..7267489202a390f45058c394f9566149d8f4b311 100644 --- a/drivers/usbdev/usbdev_scsi.c +++ b/drivers/usbdev/usbdev_scsi.c @@ -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); diff --git a/drivers/usbdev/usbdev_serial.c b/drivers/usbdev/usbdev_serial.c index 7e3c513e4e2d4da48c845c4be758ca3c5425c9b6..4b32ac0521c5a71960cc89fe4c7fa8378c8585f9 100644 --- a/drivers/usbdev/usbdev_serial.c +++ b/drivers/usbdev/usbdev_serial.c @@ -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); diff --git a/drivers/usbdev/usbdev_storage.c b/drivers/usbdev/usbdev_storage.c index 128249a88f57c8bb8b6d3496f771e6772d472f1d..a846697014c3505e80ead6126ebd512ae732cdf2 100644 --- a/drivers/usbdev/usbdev_storage.c +++ b/drivers/usbdev/usbdev_storage.c @@ -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); diff --git a/include/nuttx/usbdev.h b/include/nuttx/usbdev.h index b36c05b5634687e22f6ca00e3d0fd2d2c3bfcf6d..3066baa5ca7d23472e4d71681db0adbf44df8408 100644 --- a/include/nuttx/usbdev.h +++ b/include/nuttx/usbdev.h @@ -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) */