lkml.org 
[lkml]   [2009]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: PROBLEM: USB ACM device does not work
Date
On Wednesday 01 July 2009 14:56:46 Oliver Neukum wrote:
> > + ep = (usb_pipein(acm->rx_endpoint) ? acm->dev->ep_in :
> > acm->dev->ep_out) + [usb_pipeendpoint(acm->rx_endpoint)];
> > + if (usb_endpoint_xfer_int(&ep->desc))
> > + usb_fill_int_urb(rcv->urb, acm->dev,
> > + acm->rx_endpoint,
> > + buf->base,
> > + acm->readsize,
> > + acm_read_bulk, rcv, 0xff);
>
> The patch is good except for this.
> We should make sure this interval matches usbcore's value.
> Would you care to redo it with that change?

Am I right that 0xff here should be changed to ep->desc.bInterval (and to
epwrite->bInterval in the other call to usb_fill_int_urb)?

--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -387,6 +387,7 @@ static void acm_rx_tasklet(unsigned long
struct acm_ru *rcv;
unsigned long flags;
unsigned char throttled;
+ struct usb_host_endpoint *ep;

dbg("Entering acm_rx_tasklet");

@@ -462,11 +463,20 @@ urbs:

rcv->buffer = buf;

- usb_fill_bulk_urb(rcv->urb, acm->dev,
- acm->rx_endpoint,
- buf->base,
- acm->readsize,
- acm_read_bulk, rcv);
+ ep = (usb_pipein(acm->rx_endpoint) ? acm->dev->ep_in : acm->dev->ep_out)
+ [usb_pipeendpoint(acm->rx_endpoint)];
+ if (usb_endpoint_xfer_int(&ep->desc))
+ usb_fill_int_urb(rcv->urb, acm->dev,
+ acm->rx_endpoint,
+ buf->base,
+ acm->readsize,
+ acm_read_bulk, rcv, ep->desc.bInterval);
+ else
+ usb_fill_bulk_urb(rcv->urb, acm->dev,
+ acm->rx_endpoint,
+ buf->base,
+ acm->readsize,
+ acm_read_bulk, rcv);
rcv->urb->transfer_dma = buf->dma;
rcv->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

@@ -1227,9 +1237,14 @@ made_compressed_probe:
goto alloc_fail7;
}

- usb_fill_bulk_urb(snd->urb, usb_dev,
- usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
- NULL, acm->writesize, acm_write_bulk, snd);
+ if (usb_endpoint_xfer_int(epwrite))
+ usb_fill_int_urb(snd->urb, usb_dev,
+ usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
+ NULL, acm->writesize, acm_write_bulk, snd, epwrite->bInterval);
+ else
+ usb_fill_bulk_urb(snd->urb, usb_dev,
+ usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress),
+ NULL, acm->writesize, acm_write_bulk, snd);
snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
snd->instance = acm;
}
[unhandled content-type:application/pgp-signature]
\
 
 \ /
  Last update: 2009-07-01 13:29    [W:1.134 / U:0.476 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site