diff -u -p linux/include/net/irda/irda-usb.d2.h linux/include/net/irda/irda-usb.h --- linux/include/net/irda/irda-usb.d2.h Mon Nov 5 17:36:33 2001 +++ linux/include/net/irda/irda-usb.h Mon Nov 5 17:37:04 2001 @@ -120,6 +120,11 @@ struct irda_class_desc { __u8 bMaxUnicastList; } __attribute__ ((packed)); +/* class specific interface request to get the IrDA-USB class descriptor + * (6.2.5, USB-IrDA class spec 1.0) */ + +#define IU_REQ_GET_CLASS_DESC 0x06 + struct irda_usb_cb { struct irda_class_desc *irda_desc; struct usb_device *usbdev; /* init: probe_irda */ diff -u -p linux/drivers/net/irda/irda-usb.d2.c linux/drivers/net/irda/irda-usb.c --- linux/drivers/net/irda/irda-usb.d2.c Thu Oct 11 15:55:57 2001 +++ linux/drivers/net/irda/irda-usb.c Mon Nov 5 17:39:51 2001 @@ -279,7 +279,7 @@ static void irda_usb_change_speed_xbofs( purb->timeout = MSECS_TO_JIFFIES(100); if ((ret = usb_submit_urb(purb))) { - IRDA_DEBUG(0, __FUNCTION__ "(), failed Speed URB\n"); + WARNING(__FUNCTION__ "(), failed Speed URB\n"); } spin_unlock_irqrestore(&self->lock, flags); } @@ -296,14 +296,14 @@ static void speed_bulk_callback(purb_t p /* We should always have a context */ if (self == NULL) { - IRDA_DEBUG(0, __FUNCTION__ "(), Bug : self == NULL\n"); + WARNING(__FUNCTION__ "(), Bug : self == NULL\n"); return; } /* Check for timeout and other USB nasties */ if(purb->status != USB_ST_NOERROR) { /* I get a lot of -ECONNABORTED = -103 here - Jean II */ - WARNING(__FUNCTION__ "(), URB complete status %d, transfer_flags 0x%04X\n", purb->status, purb->transfer_flags); + IRDA_DEBUG(0, __FUNCTION__ "(), URB complete status %d, transfer_flags 0x%04X\n", purb->status, purb->transfer_flags); /* Don't do anything here, that might confuse the USB layer. * Instead, we will wait for irda_usb_net_timeout(), the @@ -452,7 +452,7 @@ static int irda_usb_hard_xmit(struct sk_ /* Ask USB to send the packet */ if ((res = usb_submit_urb(purb))) { - IRDA_DEBUG(0, __FUNCTION__ "(), failed Tx URB\n"); + WARNING(__FUNCTION__ "(), failed Tx URB\n"); self->stats.tx_errors++; /* Let USB recover : We will catch that in the watchdog */ /*netif_start_queue(netdev);*/ @@ -481,7 +481,7 @@ static void write_bulk_callback(purb_t p /* We should always have a context */ if (self == NULL) { - IRDA_DEBUG(0, __FUNCTION__ "(), Bug : self == NULL\n"); + WARNING(__FUNCTION__ "(), Bug : self == NULL\n"); return; } @@ -492,7 +492,7 @@ static void write_bulk_callback(purb_t p /* Check for timeout and other USB nasties */ if(purb->status != USB_ST_NOERROR) { /* I get a lot of -ECONNABORTED = -103 here - Jean II */ - WARNING(__FUNCTION__ "(), URB complete status %d, transfer_flags 0x%04X\n", purb->status, purb->transfer_flags); + IRDA_DEBUG(0, __FUNCTION__ "(), URB complete status %d, transfer_flags 0x%04X\n", purb->status, purb->transfer_flags); /* Don't do anything here, that might confuse the USB layer, * and we could go in recursion and blow the kernel stack... @@ -514,7 +514,7 @@ static void write_bulk_callback(purb_t p /* If we need to change the speed or xbofs, do it now */ if ((self->new_speed != -1) || (self->new_xbofs != -1)) { - IRDA_DEBUG(0, __FUNCTION__ "(), Changing speed now...\n"); + IRDA_DEBUG(1, __FUNCTION__ "(), Changing speed now...\n"); irda_usb_change_speed_xbofs(self); } else { /* Otherwise, allow the stack to send more packets */ @@ -548,7 +548,7 @@ static void irda_usb_net_timeout(struct /* Check speed URB */ purb = &(self->speed_urb); if (purb->status != USB_ST_NOERROR) { - WARNING("%s: Speed change timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, purb->status, purb->transfer_flags); + IRDA_DEBUG(0, "%s: Speed change timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, purb->status, purb->transfer_flags); switch (purb->status) { case USB_ST_URB_PENDING: /* -EINPROGRESS == -115 */ @@ -575,7 +575,7 @@ static void irda_usb_net_timeout(struct if (purb->status != USB_ST_NOERROR) { struct sk_buff *skb = purb->context; - WARNING("%s: Tx timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, purb->status, purb->transfer_flags); + IRDA_DEBUG(0, "%s: Tx timed out, urb->status=%d, urb->transfer_flags=0x%04X\n", netdev->name, purb->status, purb->transfer_flags); /* Increase error count */ self->stats.tx_errors++; @@ -694,7 +694,7 @@ static void irda_usb_submit(struct irda_ /* Check that we have an urb */ if (!purb) { - IRDA_DEBUG(0, __FUNCTION__ "(), Bug : purb == NULL\n"); + WARNING(__FUNCTION__ "(), Bug : purb == NULL\n"); return; } @@ -704,7 +704,7 @@ static void irda_usb_submit(struct irda_ if (!skb) { /* If this ever happen, we are in deep s***. * Basically, the Rx path will stop... */ - IRDA_DEBUG(0, __FUNCTION__ "(), Failed to allocate Rx skb\n"); + WARNING(__FUNCTION__ "(), Failed to allocate Rx skb\n"); return; } } else { @@ -734,7 +734,7 @@ static void irda_usb_submit(struct irda_ if (ret) { /* If this ever happen, we are in deep s***. * Basically, the Rx path will stop... */ - IRDA_DEBUG(0, __FUNCTION__ "(), Failed to submit Rx URB %d\n", ret); + WARNING(__FUNCTION__ "(), Failed to submit Rx URB %d\n", ret); } } @@ -775,13 +775,13 @@ static void irda_usb_receive(purb_t purb self->stats.rx_crc_errors++; break; case -ECONNRESET: /* -104 */ - WARNING(__FUNCTION__ "(), Connection Reset (-104), transfer_flags 0x%04X \n", purb->transfer_flags); + IRDA_DEBUG(0, __FUNCTION__ "(), Connection Reset (-104), transfer_flags 0x%04X \n", purb->transfer_flags); /* uhci_cleanup_unlink() is going to kill the Rx * URB just after we return. No problem, at this * point the URB will be idle ;-) - Jean II */ break; default: - WARNING(__FUNCTION__ "(), RX status %d,transfer_flags 0x%04X \n", purb->status, purb->transfer_flags); + IRDA_DEBUG(0, __FUNCTION__ "(), RX status %d,transfer_flags 0x%04X \n", purb->status, purb->transfer_flags); break; } goto done; @@ -893,7 +893,7 @@ static int irda_usb_is_receiving(struct */ static int irda_usb_net_init(struct net_device *dev) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); /* Set up to be a normal IrDA network device driver */ irda_device_setup(dev); @@ -917,7 +917,7 @@ static int irda_usb_net_open(struct net_ char hwname[16]; int i; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); ASSERT(netdev != NULL, return -1;); self = (struct irda_usb_cb *) netdev->priv; @@ -977,7 +977,7 @@ static int irda_usb_net_close(struct net struct irda_usb_cb *self; int i; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); ASSERT(netdev != NULL, return -1;); self = (struct irda_usb_cb *) netdev->priv; @@ -1142,7 +1142,7 @@ static inline int irda_usb_open(struct i struct net_device *netdev; int err; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); spin_lock_init(&self->lock); @@ -1197,7 +1197,7 @@ static inline int irda_usb_open(struct i */ static inline int irda_usb_close(struct irda_usb_cb *self) { - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); ASSERT(self != NULL, return -1;); @@ -1326,39 +1326,43 @@ static inline void irda_usb_dump_class_d */ static inline struct irda_class_desc *irda_usb_find_class_desc(struct usb_device *dev, unsigned int ifnum) { - struct usb_interface_descriptor *interface; - struct irda_class_desc *desc, *ptr; + struct irda_class_desc *desc; int ret; - - desc = kmalloc(sizeof (struct irda_class_desc), GFP_KERNEL); + + desc = kmalloc(sizeof (*desc), GFP_KERNEL); if (desc == NULL) return NULL; - memset(desc, 0, sizeof(struct irda_class_desc)); - - ret = usb_get_class_descriptor(dev, ifnum, USB_DT_IRDA, 0, (void *) desc, sizeof(struct irda_class_desc)); - IRDA_DEBUG(0, __FUNCTION__ "(), ret=%d\n", ret); - if (ret) { - WARNING("usb-irda: usb_get_class_descriptor failed (0x%x)\n", ret); - } + memset(desc, 0, sizeof(*desc)); - /* Check if we found it? */ - if (desc->bDescriptorType == USB_DT_IRDA) - return desc; + /* USB-IrDA class spec 1.0: + * 6.1.3: Standard "Get Descriptor" Device Request is not + * appropriate to retrieve class-specific descriptor + * 6.2.5: Class Specific "Get Class Descriptor" Interface Request + * is mandatory and returns the USB-IrDA class descriptor + */ - IRDA_DEBUG(0, __FUNCTION__ "(), parsing extra descriptors ...\n"); + ret = usb_control_msg(dev, usb_rcvctrlpipe(dev,0), + IU_REQ_GET_CLASS_DESC, + USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 0, ifnum, desc, sizeof(*desc), MSECS_TO_JIFFIES(500)); - /* Check if the class descriptor is interleaved with standard descriptors */ - interface = &dev->actconfig->interface[ifnum].altsetting[0]; - ret = usb_get_extra_descriptor(interface, USB_DT_IRDA, &ptr); - if (ret) { - kfree(desc); - return NULL; + IRDA_DEBUG(1, __FUNCTION__ "(), ret=%d\n", ret); + if (ret < sizeof(*desc)) { + WARNING("usb-irda: class_descriptor read %s (%d)\n", + (ret<0) ? "failed" : "too short", ret); + } + else if (desc->bDescriptorType != USB_DT_IRDA) { + WARNING("usb-irda: bad class_descriptor type\n"); } - *desc = *ptr; + else { #ifdef IU_DUMP_CLASS_DESC - irda_usb_dump_class_desc(desc); + irda_usb_dump_class_desc(desc); #endif /* IU_DUMP_CLASS_DESC */ - return desc; + + return desc; + } + kfree(desc); + return NULL; } /*********************** USB DEVICE CALLBACKS ***********************/ @@ -1389,9 +1393,9 @@ static void *irda_usb_probe(struct usb_d * don't need to check if the dongle is really ours. * Jean II */ - IRDA_DEBUG(0, "Vendor: %x, Product: %x\n", dev->descriptor.idVendor, dev->descriptor.idProduct); - - MESSAGE("IRDA-USB found at address %d\n", dev->devnum); + MESSAGE("IRDA-USB found at address %d, Vendor: %x, Product: %x\n", + dev->devnum, dev->descriptor.idVendor, + dev->descriptor.idProduct); /* Try to cleanup all instance that have a pending disconnect * Instance will be in this state is the disconnect() occurs @@ -1416,7 +1420,7 @@ static void *irda_usb_probe(struct usb_d } } if(self == NULL) { - IRDA_DEBUG(0, "Too many USB IrDA devices !!! (max = %d)\n", + WARNING("Too many USB IrDA devices !!! (max = %d)\n", NIRUSB); return NULL; } @@ -1436,7 +1440,7 @@ static void *irda_usb_probe(struct usb_d * specify an alternate, but very few driver do like this. * Jean II */ ret = usb_set_interface(dev, ifnum, 0); - IRDA_DEBUG(0, "usb-irda: set interface %d result %d\n", ifnum, ret); + IRDA_DEBUG(1, "usb-irda: set interface %d result %d\n", ifnum, ret); switch (ret) { case USB_ST_NOERROR: /* 0 */ break; @@ -1485,7 +1489,7 @@ static void irda_usb_disconnect(struct u struct irda_usb_cb *self = (struct irda_usb_cb *) ptr; int i; - IRDA_DEBUG(0, __FUNCTION__ "()\n"); + IRDA_DEBUG(1, __FUNCTION__ "()\n"); /* Oups ! We are not there any more */ self->present = 0;