Clearing stall needs pipe descriptor, store it in acm structure.

Signed-off-by: Ladislav Michl <la...@linux-mips.org>
---
Changes:
 - v2: none
 - v3: follow CodingStyle

 drivers/usb/class/cdc-acm.c | 33 +++++++++++++++++----------------
 drivers/usb/class/cdc-acm.h |  1 +
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 83f471a..670fa19 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -1349,8 +1349,16 @@ static int acm_probe(struct usb_interface *intf,
        spin_lock_init(&acm->read_lock);
        mutex_init(&acm->mutex);
        acm->is_int_ep = usb_endpoint_xfer_int(epread);
-       if (acm->is_int_ep)
+       if (acm->is_int_ep) {
                acm->bInterval = epread->bInterval;
+               acm->in = usb_rcvintpipe(usb_dev, epread->bEndpointAddress);
+       } else {
+               acm->in = usb_rcvbulkpipe(usb_dev, epread->bEndpointAddress);
+       }
+       if (usb_endpoint_xfer_int(epwrite))
+               acm->out = usb_sndintpipe(usb_dev, epwrite->bEndpointAddress);
+       else
+               acm->out = usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress);
        tty_port_init(&acm->port);
        acm->port.ops = &acm_port_ops;
        init_usb_anchor(&acm->delayed);
@@ -1385,20 +1393,15 @@ static int acm_probe(struct usb_interface *intf,
 
                urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
                urb->transfer_dma = rb->dma;
-               if (acm->is_int_ep) {
-                       usb_fill_int_urb(urb, acm->dev,
-                                        usb_rcvintpipe(usb_dev, 
epread->bEndpointAddress),
-                                        rb->base,
+               if (acm->is_int_ep)
+                       usb_fill_int_urb(urb, acm->dev, acm->in, rb->base,
                                         acm->readsize,
                                         acm_read_bulk_callback, rb,
                                         acm->bInterval);
-               } else {
-                       usb_fill_bulk_urb(urb, acm->dev,
-                                         usb_rcvbulkpipe(usb_dev, 
epread->bEndpointAddress),
-                                         rb->base,
+               else
+                       usb_fill_bulk_urb(urb, acm->dev, acm->in, rb->base,
                                          acm->readsize,
                                          acm_read_bulk_callback, rb);
-               }
 
                acm->read_urbs[i] = urb;
                __set_bit(i, &acm->read_urbs_free);
@@ -1411,12 +1414,10 @@ static int acm_probe(struct usb_interface *intf,
                        goto alloc_fail7;
 
                if (usb_endpoint_xfer_int(epwrite))
-                       usb_fill_int_urb(snd->urb, usb_dev,
-                               usb_sndintpipe(usb_dev, 
epwrite->bEndpointAddress),
+                       usb_fill_int_urb(snd->urb, usb_dev, acm->out,
                                NULL, acm->writesize, acm_write_bulk, snd, 
epwrite->bInterval);
                else
-                       usb_fill_bulk_urb(snd->urb, usb_dev,
-                               usb_sndbulkpipe(usb_dev, 
epwrite->bEndpointAddress),
+                       usb_fill_bulk_urb(snd->urb, usb_dev, acm->out,
                                NULL, acm->writesize, acm_write_bulk, snd);
                snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
                if (quirks & SEND_ZERO_PACKET)
@@ -1488,8 +1489,8 @@ static int acm_probe(struct usb_interface *intf,
        }
 
        if (quirks & CLEAR_HALT_CONDITIONS) {
-               usb_clear_halt(usb_dev, usb_rcvbulkpipe(usb_dev, 
epread->bEndpointAddress));
-               usb_clear_halt(usb_dev, usb_sndbulkpipe(usb_dev, 
epwrite->bEndpointAddress));
+               usb_clear_halt(usb_dev, acm->in);
+               usb_clear_halt(usb_dev, acm->out);
        }
 
        return 0;
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h
index 1f1eabf..58ddd25 100644
--- a/drivers/usb/class/cdc-acm.h
+++ b/drivers/usb/class/cdc-acm.h
@@ -83,6 +83,7 @@ struct acm {
        struct usb_device *dev;                         /* the corresponding 
usb device */
        struct usb_interface *control;                  /* control interface */
        struct usb_interface *data;                     /* data interface */
+       unsigned in, out;                               /* i/o pipes */
        struct tty_port port;                           /* our tty port data */
        struct urb *ctrlurb;                            /* urbs */
        u8 *ctrl_buffer;                                /* buffers of urbs */
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to