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