9
0
Fork 0

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:
patacongo 2008-10-25 14:40:37 +00:00
parent 2e884bcbeb
commit d5bc42e6ed
4 changed files with 28 additions and 22 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

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