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 Fri Jul 18 10:45:27 2003 +++ linux/drivers/net/irda/irda-usb.c Fri Jul 18 10:59:35 2003 @@ -1467,30 +1467,26 @@ static int irda_usb_probe(struct usb_int for (i = 0; i < IU_MAX_RX_URBS; i++) { self->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL); if (!self->rx_urb[i]) { - int j; - for (j = 0; j < i; j++) - usb_free_urb(self->rx_urb[j]); - return -ENOMEM; + ret = -ENOMEM; + goto err_out; } } self->tx_urb = usb_alloc_urb(0, GFP_KERNEL); if (!self->tx_urb) { - for (i = 0; i < IU_MAX_RX_URBS; i++) - usb_free_urb(self->rx_urb[i]); - return -ENOMEM; + ret = -ENOMEM; + goto err_out; } self->speed_urb = usb_alloc_urb(0, GFP_KERNEL); if (!self->speed_urb) { - for (i = 0; i < IU_MAX_RX_URBS; i++) - usb_free_urb(self->rx_urb[i]); - usb_free_urb(self->tx_urb); - return -ENOMEM; + ret = -ENOMEM; + goto err_out; } /* Is this really necessary? */ if (usb_set_configuration (dev, dev->config[0].desc.bConfigurationValue) < 0) { err("set_configuration failed"); - return -EIO; + ret = -EIO; + goto err_out; } /* Is this really necessary? */ @@ -1510,8 +1506,8 @@ static int irda_usb_probe(struct usb_int break; default: IRDA_DEBUG(0, "%s(), Unknown error %d\n", __FUNCTION__, ret); - return -EIO; - break; + ret = -EIO; + goto err_out; } /* Find our endpoints */ @@ -1519,15 +1515,17 @@ static int irda_usb_probe(struct usb_int if(!irda_usb_parse_endpoints(self, interface->endpoint, interface->desc.bNumEndpoints)) { ERROR("%s(), Bogus endpoints...\n", __FUNCTION__); - return -EIO; + ret = -EIO; + goto err_out; } /* Find IrDA class descriptor */ irda_desc = irda_usb_find_class_desc(intf); + ret = -ENODEV; if (irda_desc == NULL) - return -ENODEV; - - self->irda_desc = irda_desc; + goto err_out; + + self->irda_desc = irda_desc; self->present = 1; self->netopen = 0; self->capability = id->driver_info; @@ -1535,10 +1533,25 @@ static int irda_usb_probe(struct usb_int self->usbintf = intf; ret = irda_usb_open(self); if (ret) - return -ENOMEM; + goto err_out; usb_set_intfdata(intf, self); return 0; + +err_out: + /* Free all urbs that we may have created */ + for (i = 0; i < IU_MAX_RX_URBS; i++) { + if (self->rx_urb[i]) + usb_free_urb(self->rx_urb[i]); + } + if (self->tx_urb) { + usb_free_urb(self->tx_urb); + } + if (self->speed_urb) { + usb_free_urb(self->speed_urb); + } + + return ret; } /*------------------------------------------------------------------*/