ChangeSet 1.1305.7.7, 2003/06/16 12:23:04-07:00, [EMAIL PROTECTED]
[PATCH] USB: Patch to cdc-acm.c to detect ACM part of USB WMC devices
drivers/usb/class/cdc-acm.c | 219 ++++++++++++++++++++++----------------------
1 files changed, 111 insertions(+), 108 deletions(-)
diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
--- a/drivers/usb/class/cdc-acm.c Wed Jun 18 11:15:46 2003
+++ b/drivers/usb/class/cdc-acm.c Wed Jun 18 11:15:46 2003
@@ -548,7 +548,7 @@
struct usb_host_config *cfacm;
struct usb_host_interface *ifcom, *ifdata;
struct usb_endpoint_descriptor *epctrl, *epread, *epwrite;
- int readsize, ctrlsize, minor, i;
+ int readsize, ctrlsize, minor, i, j;
unsigned char *buf;
dev = interface_to_usbdev (intf);
@@ -558,120 +558,123 @@
dbg("probing config %d", cfacm->desc.bConfigurationValue);
- if (cfacm->desc.bNumInterfaces != 2 ||
- usb_interface_claimed(cfacm->interface + 0) ||
- usb_interface_claimed(cfacm->interface + 1))
+ for (j = 0; j < cfacm->desc.bNumInterfaces - 1; j++) {
+
+ if (usb_interface_claimed(cfacm->interface + j) ||
+ usb_interface_claimed(cfacm->interface + j + 1))
continue;
- ifcom = cfacm->interface[0].altsetting + 0;
- ifdata = cfacm->interface[1].altsetting + 0;
+ ifcom = cfacm->interface[j].altsetting + 0;
+ ifdata = cfacm->interface[j + 1].altsetting + 0;
- if (ifdata->desc.bInterfaceClass != 10 || ifdata->desc.bNumEndpoints <
2) {
- ifcom = cfacm->interface[1].altsetting + 0;
- ifdata = cfacm->interface[0].altsetting + 0;
- if (ifdata->desc.bInterfaceClass != 10 ||
ifdata->desc.bNumEndpoints < 2)
+ if (ifdata->desc.bInterfaceClass != 10 ||
ifdata->desc.bNumEndpoints < 2) {
+ ifcom = cfacm->interface[j + 1].altsetting + 0;
+ ifdata = cfacm->interface[j].altsetting + 0;
+ if (ifdata->desc.bInterfaceClass != 10 ||
ifdata->desc.bNumEndpoints < 2)
+ continue;
+ }
+
+ if (ifcom->desc.bInterfaceClass != 2 ||
ifcom->desc.bInterfaceSubClass != 2 ||
+ ifcom->desc.bInterfaceProtocol < 1 ||
ifcom->desc.bInterfaceProtocol > 6 ||
+ ifcom->desc.bNumEndpoints < 1)
continue;
- }
-
- if (ifcom->desc.bInterfaceClass != 2 || ifcom->desc.bInterfaceSubClass
!= 2 ||
- ifcom->desc.bInterfaceProtocol != 1 || ifcom->desc.bNumEndpoints <
1)
- continue;
-
- epctrl = &ifcom->endpoint[0].desc;
- epread = &ifdata->endpoint[0].desc;
- epwrite = &ifdata->endpoint[1].desc;
-
- if ((epctrl->bEndpointAddress & 0x80) != 0x80 || (epctrl->bmAttributes
& 3) != 3 ||
- (epread->bmAttributes & 3) != 2 || (epwrite->bmAttributes & 3) != 2
||
- ((epread->bEndpointAddress & 0x80) ^ (epwrite->bEndpointAddress &
0x80)) != 0x80)
- continue;
-
- if ((epread->bEndpointAddress & 0x80) != 0x80) {
- epread = &ifdata->endpoint[1].desc;
- epwrite = &ifdata->endpoint[0].desc;
- }
- usb_set_configuration(dev, cfacm->desc.bConfigurationValue);
-
- for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor]; minor++);
- if (acm_table[minor]) {
- err("no more free acm devices");
- return -ENODEV;
- }
-
- if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
- err("out of memory");
- return -ENOMEM;
- }
- memset(acm, 0, sizeof(struct acm));
-
- ctrlsize = epctrl->wMaxPacketSize;
- readsize = epread->wMaxPacketSize;
- acm->writesize = epwrite->wMaxPacketSize;
- acm->iface = cfacm->interface;
- acm->minor = minor;
- acm->dev = dev;
-
- INIT_WORK(&acm->work, acm_softint, acm);
-
- if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize,
GFP_KERNEL))) {
- err("out of memory");
- kfree(acm);
- return -ENOMEM;
- }
+ epctrl = &ifcom->endpoint[0].desc;
+ epread = &ifdata->endpoint[0].desc;
+ epwrite = &ifdata->endpoint[1].desc;
+
+ if ((epctrl->bEndpointAddress & 0x80) != 0x80 ||
(epctrl->bmAttributes & 3) != 3 ||
+ (epread->bmAttributes & 3) != 2 || (epwrite->bmAttributes &
3) != 2 ||
+ ((epread->bEndpointAddress & 0x80) ^
(epwrite->bEndpointAddress & 0x80)) != 0x80)
+ continue;
- acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
- if (!acm->ctrlurb) {
- err("out of memory");
- kfree(acm);
- kfree(buf);
- return -ENOMEM;
- }
- acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
- if (!acm->readurb) {
- err("out of memory");
- usb_free_urb(acm->ctrlurb);
- kfree(acm);
- kfree(buf);
- return -ENOMEM;
- }
- acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
- if (!acm->writeurb) {
- err("out of memory");
- usb_free_urb(acm->readurb);
- usb_free_urb(acm->ctrlurb);
- kfree(acm);
- kfree(buf);
- return -ENOMEM;
+ if ((epread->bEndpointAddress & 0x80) != 0x80) {
+ epread = &ifdata->endpoint[1].desc;
+ epwrite = &ifdata->endpoint[0].desc;
+ }
+
+ usb_set_configuration(dev, cfacm->desc.bConfigurationValue);
+
+ for (minor = 0; minor < ACM_TTY_MINORS && acm_table[minor];
minor++);
+ if (acm_table[minor]) {
+ err("no more free acm devices");
+ return -ENODEV;
+ }
+
+ if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
+ err("out of memory");
+ return -ENOMEM;
+ }
+ memset(acm, 0, sizeof(struct acm));
+
+ ctrlsize = epctrl->wMaxPacketSize;
+ readsize = epread->wMaxPacketSize;
+ acm->writesize = epwrite->wMaxPacketSize;
+ acm->iface = cfacm->interface + j;
+ acm->minor = minor;
+ acm->dev = dev;
+
+ INIT_WORK(&acm->work, acm_softint, acm);
+
+ if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize,
GFP_KERNEL))) {
+ err("out of memory");
+ kfree(acm);
+ return -ENOMEM;
+ }
+
+ acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!acm->ctrlurb) {
+ err("out of memory");
+ kfree(acm);
+ kfree(buf);
+ return -ENOMEM;
+ }
+ acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!acm->readurb) {
+ err("out of memory");
+ usb_free_urb(acm->ctrlurb);
+ kfree(acm);
+ kfree(buf);
+ return -ENOMEM;
+ }
+ acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!acm->writeurb) {
+ err("out of memory");
+ usb_free_urb(acm->readurb);
+ usb_free_urb(acm->ctrlurb);
+ kfree(acm);
+ kfree(buf);
+ return -ENOMEM;
+ }
+
+ usb_fill_int_urb(acm->ctrlurb, dev, usb_rcvintpipe(dev,
epctrl->bEndpointAddress),
+ buf, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
+
+ usb_fill_bulk_urb(acm->readurb, dev, usb_rcvbulkpipe(dev,
epread->bEndpointAddress),
+ buf += ctrlsize, readsize, acm_read_bulk, acm);
+ acm->readurb->transfer_flags |= URB_NO_FSBR;
+
+ usb_fill_bulk_urb(acm->writeurb, dev, usb_sndbulkpipe(dev,
epwrite->bEndpointAddress),
+ buf += readsize, acm->writesize, acm_write_bulk, acm);
+ acm->writeurb->transfer_flags |= URB_NO_FSBR;
+
+ info("ttyACM%d: USB ACM device", minor);
+
+ acm_set_control(acm, acm->ctrlout);
+
+ acm->line.speed = cpu_to_le32(9600);
+ acm->line.databits = 8;
+ acm_set_line(acm, &acm->line);
+
+ usb_driver_claim_interface(&acm_driver, acm->iface + 0, acm);
+ usb_driver_claim_interface(&acm_driver, acm->iface + 1, acm);
+
+ tty_register_device(acm_tty_driver, minor, &intf->dev);
+
+ acm_table[minor] = acm;
+ usb_set_intfdata (intf, acm);
+ return 0;
}
-
- usb_fill_int_urb(acm->ctrlurb, dev, usb_rcvintpipe(dev,
epctrl->bEndpointAddress),
- buf, ctrlsize, acm_ctrl_irq, acm, epctrl->bInterval);
-
- usb_fill_bulk_urb(acm->readurb, dev, usb_rcvbulkpipe(dev,
epread->bEndpointAddress),
- buf += ctrlsize, readsize, acm_read_bulk, acm);
- acm->readurb->transfer_flags |= URB_NO_FSBR;
-
- usb_fill_bulk_urb(acm->writeurb, dev, usb_sndbulkpipe(dev,
epwrite->bEndpointAddress),
- buf += readsize, acm->writesize, acm_write_bulk, acm);
- acm->writeurb->transfer_flags |= URB_NO_FSBR;
-
- info("ttyACM%d: USB ACM device", minor);
-
- acm_set_control(acm, acm->ctrlout);
-
- acm->line.speed = cpu_to_le32(9600);
- acm->line.databits = 8;
- acm_set_line(acm, &acm->line);
-
- usb_driver_claim_interface(&acm_driver, acm->iface + 0, acm);
- usb_driver_claim_interface(&acm_driver, acm->iface + 1, acm);
-
- tty_register_device(acm_tty_driver, minor, &intf->dev);
-
- acm_table[minor] = acm;
- usb_set_intfdata (intf, acm);
- return 0;
}
return -EIO;
-------------------------------------------------------
This SF.Net email is sponsored by: INetU
Attention Web Developers & Consultants: Become An INetU Hosting Partner.
Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission!
INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel