Commit 7e0cb221 authored by Colin Leroy's avatar Colin Leroy Committed by Greg Kroah-Hartman

[PATCH] USB: cosmetic fixes for cdc-acm

parent c8ae88da
...@@ -567,6 +567,8 @@ static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_ ...@@ -567,6 +567,8 @@ static void acm_tty_set_termios(struct tty_struct *tty, struct termios *termios_
* USB probe and disconnect routines. * USB probe and disconnect routines.
*/ */
#define CHECK_XFERTYPE(descr, xfer_type) (((descr)->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == xfer_type)
static int acm_probe (struct usb_interface *intf, static int acm_probe (struct usb_interface *intf,
const struct usb_device_id *id) const struct usb_device_id *id)
{ {
...@@ -597,24 +599,29 @@ static int acm_probe (struct usb_interface *intf, ...@@ -597,24 +599,29 @@ static int acm_probe (struct usb_interface *intf,
ifdata = cfacm->interface[j]->cur_altsetting; ifdata = cfacm->interface[j]->cur_altsetting;
data = cfacm->interface[j]; data = cfacm->interface[j];
if (ifdata->desc.bInterfaceClass == 10 && if (ifdata->desc.bInterfaceClass == USB_CLASS_CDC_DATA
ifdata->desc.bNumEndpoints == 2) { && ifdata->desc.bNumEndpoints == 2) {
epctrl = &ifcom->endpoint[0].desc; epctrl = &ifcom->endpoint[0].desc;
epread = &ifdata->endpoint[0].desc; epread = &ifdata->endpoint[0].desc;
epwrite = &ifdata->endpoint[1].desc; epwrite = &ifdata->endpoint[1].desc;
if ((epctrl->bEndpointAddress & 0x80) != 0x80 || if ((epctrl->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN
(epctrl->bmAttributes & 3) != 3 || || !CHECK_XFERTYPE(epctrl, USB_ENDPOINT_XFER_INT)
(epread->bmAttributes & 3) != 2 || || !CHECK_XFERTYPE(epread, USB_ENDPOINT_XFER_BULK)
(epwrite->bmAttributes & 3) != 2 || || !CHECK_XFERTYPE(epwrite, USB_ENDPOINT_XFER_BULK)
((epread->bEndpointAddress & 0x80) ^ (epwrite->bEndpointAddress & 0x80)) != 0x80) || ((epread->bEndpointAddress & USB_DIR_IN)
^ (epwrite->bEndpointAddress & USB_DIR_IN)) != USB_DIR_IN) {
/* not suitable */
goto next_interface; goto next_interface;
}
if ((epread->bEndpointAddress & 0x80) != 0x80) { if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) {
/* descriptors are swapped */
epread = &ifdata->endpoint[1].desc; epread = &ifdata->endpoint[1].desc;
epwrite = &ifdata->endpoint[0].desc; epwrite = &ifdata->endpoint[0].desc;
} }
dbg("found data interface at %d\n", j); dev_dbg(&intf->dev, "found data interface at %d\n", j);
break; break;
} else { } else {
next_interface: next_interface:
...@@ -625,7 +632,7 @@ static int acm_probe (struct usb_interface *intf, ...@@ -625,7 +632,7 @@ static int acm_probe (struct usb_interface *intf,
/* there's been a problem */ /* there's been a problem */
if (!ifdata) { if (!ifdata) {
dbg("interface not found (%p)\n", ifdata); dev_dbg(&intf->dev, "data interface not found\n");
return -ENODEV; return -ENODEV;
} }
...@@ -637,9 +644,10 @@ static int acm_probe (struct usb_interface *intf, ...@@ -637,9 +644,10 @@ static int acm_probe (struct usb_interface *intf,
} }
if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) { if (!(acm = kmalloc(sizeof(struct acm), GFP_KERNEL))) {
err("out of memory"); dev_dbg(&intf->dev, "out of memory (acm kmalloc)\n");
return -ENOMEM; return -ENOMEM;
} }
memset(acm, 0, sizeof(struct acm)); memset(acm, 0, sizeof(struct acm));
ctrlsize = epctrl->wMaxPacketSize; ctrlsize = epctrl->wMaxPacketSize;
...@@ -655,21 +663,21 @@ static int acm_probe (struct usb_interface *intf, ...@@ -655,21 +663,21 @@ static int acm_probe (struct usb_interface *intf,
INIT_WORK(&acm->work, acm_softint, acm); INIT_WORK(&acm->work, acm_softint, acm);
if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) { if (!(buf = kmalloc(ctrlsize + readsize + acm->writesize, GFP_KERNEL))) {
err("out of memory"); dev_dbg(&intf->dev, "out of memory (buf kmalloc)\n");
kfree(acm); kfree(acm);
return -ENOMEM; return -ENOMEM;
} }
acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL); acm->ctrlurb = usb_alloc_urb(0, GFP_KERNEL);
if (!acm->ctrlurb) { if (!acm->ctrlurb) {
err("out of memory"); dev_dbg(&intf->dev, "out of memory (ctrlurb kmalloc)\n");
kfree(acm); kfree(acm);
kfree(buf); kfree(buf);
return -ENOMEM; return -ENOMEM;
} }
acm->readurb = usb_alloc_urb(0, GFP_KERNEL); acm->readurb = usb_alloc_urb(0, GFP_KERNEL);
if (!acm->readurb) { if (!acm->readurb) {
err("out of memory"); dev_dbg(&intf->dev, "out of memory (readurb kmalloc)\n");
usb_free_urb(acm->ctrlurb); usb_free_urb(acm->ctrlurb);
kfree(acm); kfree(acm);
kfree(buf); kfree(buf);
...@@ -677,7 +685,7 @@ static int acm_probe (struct usb_interface *intf, ...@@ -677,7 +685,7 @@ static int acm_probe (struct usb_interface *intf,
} }
acm->writeurb = usb_alloc_urb(0, GFP_KERNEL); acm->writeurb = usb_alloc_urb(0, GFP_KERNEL);
if (!acm->writeurb) { if (!acm->writeurb) {
err("out of memory"); dev_dbg(&intf->dev, "out of memory (writeurb kmalloc)\n");
usb_free_urb(acm->readurb); usb_free_urb(acm->readurb);
usb_free_urb(acm->ctrlurb); usb_free_urb(acm->ctrlurb);
kfree(acm); kfree(acm);
...@@ -696,14 +704,6 @@ static int acm_probe (struct usb_interface *intf, ...@@ -696,14 +704,6 @@ static int acm_probe (struct usb_interface *intf,
buf += readsize, acm->writesize, acm_write_bulk, acm); buf += readsize, acm->writesize, acm_write_bulk, acm);
acm->writeurb->transfer_flags |= URB_NO_FSBR; acm->writeurb->transfer_flags |= URB_NO_FSBR;
dev_info(&intf->dev, "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);
if ( (j = usb_driver_claim_interface(&acm_driver, data, acm)) != 0) { if ( (j = usb_driver_claim_interface(&acm_driver, data, acm)) != 0) {
err("claim failed"); err("claim failed");
usb_free_urb(acm->ctrlurb); usb_free_urb(acm->ctrlurb);
...@@ -716,10 +716,19 @@ static int acm_probe (struct usb_interface *intf, ...@@ -716,10 +716,19 @@ static int acm_probe (struct usb_interface *intf,
tty_register_device(acm_tty_driver, minor, &intf->dev); tty_register_device(acm_tty_driver, minor, &intf->dev);
dev_info(&intf->dev, "ttyACM%d: USB ACM device\n", minor);
acm_set_control(acm, acm->ctrlout);
acm->line.speed = cpu_to_le32(9600);
acm->line.databits = 8;
acm_set_line(acm, &acm->line);
acm_table[minor] = acm; acm_table[minor] = acm;
usb_set_intfdata (intf, acm); usb_set_intfdata (intf, acm);
return 0; return 0;
} }
#undef CHECK_XFERTYPE
static void acm_disconnect(struct usb_interface *intf) static void acm_disconnect(struct usb_interface *intf)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment