<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">ChangeSet 1.1587.3.54, 2004/05/11 16:19:59-07:00, colin@colino.net

[PATCH] USB: cosmetic fixes for cdc-acm


 drivers/usb/class/cdc-acm.c |  275 ++++++++++++++++++++++----------------------
 1 files changed, 142 insertions(+), 133 deletions(-)


diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
--- a/drivers/usb/class/cdc-acm.c	Fri May 14 15:28:22 2004
+++ b/drivers/usb/class/cdc-acm.c	Fri May 14 15:28:22 2004
@@ -567,6 +567,8 @@
  * USB probe and disconnect routines.
  */
 
+#define CHECK_XFERTYPE(descr, xfer_type) (((descr)-&gt;bmAttributes &amp; USB_ENDPOINT_XFERTYPE_MASK) == xfer_type)
+			
 static int acm_probe (struct usb_interface *intf,
 		      const struct usb_device_id *id)
 {
@@ -583,143 +585,150 @@
 
 	dev = interface_to_usbdev (intf);
 
-			cfacm = dev-&gt;actconfig;
-	
-			/* We know we're probe()d with the control interface. */
-			ifcom = intf-&gt;cur_altsetting;
-
-			/* ACM doesn't guarantee the data interface is
-			 * adjacent to the control interface, or that if one
-			 * is there it's not for call management ... so find
-			 * it
-			 */
-			for (j = 0; j &lt; cfacm-&gt;desc.bNumInterfaces; j++) {
-				ifdata = cfacm-&gt;interface[j]-&gt;cur_altsetting;
-				data = cfacm-&gt;interface[j];
-
-				if (ifdata-&gt;desc.bInterfaceClass == 10 &amp;&amp;
-				    ifdata-&gt;desc.bNumEndpoints == 2) {
-					epctrl = &amp;ifcom-&gt;endpoint[0].desc;
-					epread = &amp;ifdata-&gt;endpoint[0].desc;
-					epwrite = &amp;ifdata-&gt;endpoint[1].desc;
-
-					if ((epctrl-&gt;bEndpointAddress &amp; 0x80) != 0x80 ||
-					    (epctrl-&gt;bmAttributes &amp; 3) != 3 ||
-					    (epread-&gt;bmAttributes &amp; 3) != 2 || 
-					    (epwrite-&gt;bmAttributes &amp; 3) != 2 ||
-					    ((epread-&gt;bEndpointAddress &amp; 0x80) ^ (epwrite-&gt;bEndpointAddress &amp; 0x80)) != 0x80) 
-						goto next_interface;
-
-					if ((epread-&gt;bEndpointAddress &amp; 0x80) != 0x80) {
-						epread = &amp;ifdata-&gt;endpoint[1].desc;
-						epwrite = &amp;ifdata-&gt;endpoint[0].desc;
-					}
-					dbg("found data interface at %d\n", j);
-					break;
-				} else {
-next_interface:
-					ifdata = NULL;
-					data = NULL;
-				}
-			}
-
-			/* there's been a problem */
-			if (!ifdata) {
-				dbg("interface not found (%p)\n", ifdata);
-				return -ENODEV;
-
-			}
-
-			for (minor = 0; minor &lt; ACM_TTY_MINORS &amp;&amp; acm_table[minor]; minor++);
-			if (acm_table[minor]) {
-				err("no more free acm devices");
-				return -ENODEV;
-			}
+	cfacm = dev-&gt;actconfig;
 
-			if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
-				err("out of memory");
-				return -ENOMEM;
-			}
-			memset(acm, 0, sizeof(struct acm));
-
-			ctrlsize = epctrl-&gt;wMaxPacketSize;
-			readsize = epread-&gt;wMaxPacketSize;
-			acm-&gt;writesize = epwrite-&gt;wMaxPacketSize;
-			acm-&gt;control = intf;
-			acm-&gt;data = data;
-			acm-&gt;minor = minor;
-			acm-&gt;dev = dev;
-
-			acm-&gt;bh.func = acm_rx_tasklet;
-			acm-&gt;bh.data = (unsigned long) acm;
-			INIT_WORK(&amp;acm-&gt;work, acm_softint, acm);
-
-			if (!(buf = kmalloc(ctrlsize + readsize + acm-&gt;writesize, GFP_KERNEL))) {
-				err("out of memory");
-				kfree(acm);
-				return -ENOMEM;
-			}
+	/* We know we're probe()d with the control interface. */
+	ifcom = intf-&gt;cur_altsetting;
 
-			acm-&gt;ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
-			if (!acm-&gt;ctrlurb) {
-				err("out of memory");
-				kfree(acm);
-				kfree(buf);
-				return -ENOMEM;
-			}
-			acm-&gt;readurb = usb_alloc_urb(0, GFP_KERNEL);
-			if (!acm-&gt;readurb) {
-				err("out of memory");
-				usb_free_urb(acm-&gt;ctrlurb);
-				kfree(acm);
-				kfree(buf);
-				return -ENOMEM;
-			}
-			acm-&gt;writeurb = usb_alloc_urb(0, GFP_KERNEL);
-			if (!acm-&gt;writeurb) {
-				err("out of memory");
-				usb_free_urb(acm-&gt;readurb);
-				usb_free_urb(acm-&gt;ctrlurb);
-				kfree(acm);
-				kfree(buf);
-				return -ENOMEM;
-			}
-
-			usb_fill_int_urb(acm-&gt;ctrlurb, dev, usb_rcvintpipe(dev, epctrl-&gt;bEndpointAddress),
-				buf, ctrlsize, acm_ctrl_irq, acm, epctrl-&gt;bInterval);
+	/* ACM doesn't guarantee the data interface is
+	 * adjacent to the control interface, or that if one
+	 * is there it's not for call management ... so find
+	 * it
+	 */
+	for (j = 0; j &lt; cfacm-&gt;desc.bNumInterfaces; j++) {
+		ifdata = cfacm-&gt;interface[j]-&gt;cur_altsetting;
+		data = cfacm-&gt;interface[j];
+
+		if (ifdata-&gt;desc.bInterfaceClass == USB_CLASS_CDC_DATA
+		    &amp;&amp; ifdata-&gt;desc.bNumEndpoints == 2) {
+			
+			epctrl = &amp;ifcom-&gt;endpoint[0].desc;
+			epread = &amp;ifdata-&gt;endpoint[0].desc;
+			epwrite = &amp;ifdata-&gt;endpoint[1].desc;
+
+			if ((epctrl-&gt;bEndpointAddress &amp; USB_DIR_IN) != USB_DIR_IN
+			    || !CHECK_XFERTYPE(epctrl,  USB_ENDPOINT_XFER_INT)
+			    || !CHECK_XFERTYPE(epread,  USB_ENDPOINT_XFER_BULK)
+			    || !CHECK_XFERTYPE(epwrite, USB_ENDPOINT_XFER_BULK)
+			    || ((epread-&gt;bEndpointAddress &amp; USB_DIR_IN)
+			        ^ (epwrite-&gt;bEndpointAddress &amp; USB_DIR_IN)) != USB_DIR_IN) {
+				/* not suitable */
+				goto next_interface;
+			}
+			
+			if ((epread-&gt;bEndpointAddress &amp; USB_DIR_IN) != USB_DIR_IN) {
+				/* descriptors are swapped */
+				epread = &amp;ifdata-&gt;endpoint[1].desc;
+				epwrite = &amp;ifdata-&gt;endpoint[0].desc;
+			}
+			dev_dbg(&amp;intf-&gt;dev, "found data interface at %d\n", j);
+			break;
+		} else {
+next_interface:
+			ifdata = NULL;
+			data = NULL;
+		}
+	}
+
+	/* there's been a problem */
+	if (!ifdata) {
+		dev_dbg(&amp;intf-&gt;dev, "data interface not found\n");
+		return -ENODEV;
+
+	}
+
+	for (minor = 0; minor &lt; ACM_TTY_MINORS &amp;&amp; acm_table[minor]; minor++);
+	if (acm_table[minor]) {
+		err("no more free acm devices");
+		return -ENODEV;
+	}
+
+	if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
+		dev_dbg(&amp;intf-&gt;dev, "out of memory (acm kmalloc)\n");
+		return -ENOMEM;
+	}
+	
+	memset(acm, 0, sizeof(struct acm));
 
-			usb_fill_bulk_urb(acm-&gt;readurb, dev, usb_rcvbulkpipe(dev, epread-&gt;bEndpointAddress),
-				buf += ctrlsize, readsize, acm_read_bulk, acm);
-			acm-&gt;readurb-&gt;transfer_flags |= URB_NO_FSBR;
-
-			usb_fill_bulk_urb(acm-&gt;writeurb, dev, usb_sndbulkpipe(dev, epwrite-&gt;bEndpointAddress),
-				buf += readsize, acm-&gt;writesize, acm_write_bulk, acm);
-			acm-&gt;writeurb-&gt;transfer_flags |= URB_NO_FSBR;
-
-			dev_info(&amp;intf-&gt;dev, "ttyACM%d: USB ACM device", minor);
-
-			acm_set_control(acm, acm-&gt;ctrlout);
-
-			acm-&gt;line.speed = cpu_to_le32(9600);
-			acm-&gt;line.databits = 8;
-			acm_set_line(acm, &amp;acm-&gt;line);
-
-			if ( (j = usb_driver_claim_interface(&amp;acm_driver, data, acm)) != 0) {
-				err("claim failed");
-				usb_free_urb(acm-&gt;ctrlurb);
-				usb_free_urb(acm-&gt;readurb);
-				usb_free_urb(acm-&gt;writeurb);
-				kfree(acm);
-				kfree(buf);
-				return j;
-			} 
-
-			tty_register_device(acm_tty_driver, minor, &amp;intf-&gt;dev);
-
-			acm_table[minor] = acm;
-			usb_set_intfdata (intf, acm);
-			return 0;
+	ctrlsize = epctrl-&gt;wMaxPacketSize;
+	readsize = epread-&gt;wMaxPacketSize;
+	acm-&gt;writesize = epwrite-&gt;wMaxPacketSize;
+	acm-&gt;control = intf;
+	acm-&gt;data = data;
+	acm-&gt;minor = minor;
+	acm-&gt;dev = dev;
+
+	acm-&gt;bh.func = acm_rx_tasklet;
+	acm-&gt;bh.data = (unsigned long) acm;
+	INIT_WORK(&amp;acm-&gt;work, acm_softint, acm);
+
+	if (!(buf = kmalloc(ctrlsize + readsize + acm-&gt;writesize, GFP_KERNEL))) {
+		dev_dbg(&amp;intf-&gt;dev, "out of memory (buf kmalloc)\n");
+		kfree(acm);
+		return -ENOMEM;
+	}
+
+	acm-&gt;ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!acm-&gt;ctrlurb) {
+		dev_dbg(&amp;intf-&gt;dev, "out of memory (ctrlurb kmalloc)\n");
+		kfree(acm);
+		kfree(buf);
+		return -ENOMEM;
+	}
+	acm-&gt;readurb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!acm-&gt;readurb) {
+		dev_dbg(&amp;intf-&gt;dev, "out of memory (readurb kmalloc)\n");
+		usb_free_urb(acm-&gt;ctrlurb);
+		kfree(acm);
+		kfree(buf);
+		return -ENOMEM;
+	}
+	acm-&gt;writeurb = usb_alloc_urb(0, GFP_KERNEL);
+	if (!acm-&gt;writeurb) {
+		dev_dbg(&amp;intf-&gt;dev, "out of memory (writeurb kmalloc)\n");
+		usb_free_urb(acm-&gt;readurb);
+		usb_free_urb(acm-&gt;ctrlurb);
+		kfree(acm);
+		kfree(buf);
+		return -ENOMEM;
+	}
+
+	usb_fill_int_urb(acm-&gt;ctrlurb, dev, usb_rcvintpipe(dev, epctrl-&gt;bEndpointAddress),
+		buf, ctrlsize, acm_ctrl_irq, acm, epctrl-&gt;bInterval);
+
+	usb_fill_bulk_urb(acm-&gt;readurb, dev, usb_rcvbulkpipe(dev, epread-&gt;bEndpointAddress),
+		buf += ctrlsize, readsize, acm_read_bulk, acm);
+	acm-&gt;readurb-&gt;transfer_flags |= URB_NO_FSBR;
+
+	usb_fill_bulk_urb(acm-&gt;writeurb, dev, usb_sndbulkpipe(dev, epwrite-&gt;bEndpointAddress),
+		buf += readsize, acm-&gt;writesize, acm_write_bulk, acm);
+	acm-&gt;writeurb-&gt;transfer_flags |= URB_NO_FSBR;
+
+	if ( (j = usb_driver_claim_interface(&amp;acm_driver, data, acm)) != 0) {
+		err("claim failed");
+		usb_free_urb(acm-&gt;ctrlurb);
+		usb_free_urb(acm-&gt;readurb);
+		usb_free_urb(acm-&gt;writeurb);
+		kfree(acm);
+		kfree(buf);
+		return j;
+	} 
+
+	tty_register_device(acm_tty_driver, minor, &amp;intf-&gt;dev);
+
+	dev_info(&amp;intf-&gt;dev, "ttyACM%d: USB ACM device\n", minor);
+
+	acm_set_control(acm, acm-&gt;ctrlout);
+
+	acm-&gt;line.speed = cpu_to_le32(9600);
+	acm-&gt;line.databits = 8;
+	acm_set_line(acm, &amp;acm-&gt;line);
+
+	acm_table[minor] = acm;
+	usb_set_intfdata (intf, acm);
+	return 0;
 }
+#undef CHECK_XFERTYPE
 
 static void acm_disconnect(struct usb_interface *intf)
 {
</pre></body></html>