diff options
author | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-10-25 14:40:37 +0000 |
---|---|---|
committer | patacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3> | 2008-10-25 14:40:37 +0000 |
commit | ac127ea7b0247cf23f3c7be443cadf9f2983d248 (patch) | |
tree | 3f5d91016a6b36608a34ba06034de328f6cb21f7 /nuttx | |
parent | 89b3d89c8ff69d5dffcc0359220b3fe12a91be58 (diff) | |
download | px4-nuttx-ac127ea7b0247cf23f3c7be443cadf9f2983d248.tar.gz px4-nuttx-ac127ea7b0247cf23f3c7be443cadf9f2983d248.tar.bz2 px4-nuttx-ac127ea7b0247cf23f3c7be443cadf9f2983d248.zip |
Fix to handler transfers larger than one request
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@1077 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx')
-rw-r--r-- | nuttx/drivers/usbdev/usbdev_scsi.c | 15 | ||||
-rw-r--r-- | nuttx/drivers/usbdev/usbdev_serial.c | 6 | ||||
-rw-r--r-- | nuttx/drivers/usbdev/usbdev_storage.c | 24 | ||||
-rw-r--r-- | nuttx/include/nuttx/usbdev.h | 5 |
4 files changed, 28 insertions, 22 deletions
diff --git a/nuttx/drivers/usbdev/usbdev_scsi.c b/nuttx/drivers/usbdev/usbdev_scsi.c index 08e7cc1b4..726748920 100644 --- a/nuttx/drivers/usbdev/usbdev_scsi.c +++ b/nuttx/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/nuttx/drivers/usbdev/usbdev_serial.c b/nuttx/drivers/usbdev/usbdev_serial.c index 7e3c513e4..4b32ac052 100644 --- a/nuttx/drivers/usbdev/usbdev_serial.c +++ b/nuttx/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/nuttx/drivers/usbdev/usbdev_storage.c b/nuttx/drivers/usbdev/usbdev_storage.c index 128249a88..a84669701 100644 --- a/nuttx/drivers/usbdev/usbdev_storage.c +++ b/nuttx/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/nuttx/include/nuttx/usbdev.h b/nuttx/include/nuttx/usbdev.h index b36c05b56..3066baa5c 100644 --- a/nuttx/include/nuttx/usbdev.h +++ b/nuttx/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) */ |