# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.583 -> 1.584 # drivers/usb/misc/usblcd.c 1.2 -> 1.3 # drivers/usb/misc/uss720.c 1.9 -> 1.10 # drivers/usb/misc/tiglusb.c 1.9 -> 1.10 # drivers/usb/misc/rio500.c 1.14 -> 1.15 # drivers/usb/misc/emi26.c 1.5 -> 1.6 # drivers/usb/misc/auerswald.c 1.17 -> 1.18 # drivers/usb/misc/brlvger.c 1.6 -> 1.7 # drivers/usb/misc/speedtouch.c 1.1 -> 1.2 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/09/16 greg@kroah.com 1.584 # USB: convert the drivers/usb/misc files to the new USB driver model. # -------------------------------------------- # diff -Nru a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c --- a/drivers/usb/misc/auerswald.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/auerswald.c Mon Sep 16 15:00:24 2002 @@ -1910,9 +1910,10 @@ class based it might be necessary to parse some more USB descriptors because the device properties can differ in a wide range. */ -static void *auerswald_probe (struct usb_device *usbdev, unsigned int ifnum, - const struct usb_device_id *id) +static int auerswald_probe (struct usb_interface *intf, + const struct usb_device_id *id) { + struct usb_device *usbdev = interface_to_usbdev(intf); pauerswald_t cp = NULL; DECLARE_WAIT_QUEUE_HEAD (wqh); unsigned int dtindex; @@ -1920,14 +1921,16 @@ char *pbuf; int ret; - dbg ("probe: vendor id 0x%x, device id 0x%x ifnum:%d", - usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, ifnum); + dbg ("probe: vendor id 0x%x, device id 0x%x", + usbdev->descriptor.idVendor, usbdev->descriptor.idProduct); /* See if the device offered us matches that we can accept */ - if (usbdev->descriptor.idVendor != ID_AUERSWALD) return NULL; + if (usbdev->descriptor.idVendor != ID_AUERSWALD) + return -ENODEV; /* we use only the first -and only- interface */ - if (ifnum != 0) return NULL; + if (intf->altsetting->bInterfaceNumber != 0) + return -ENODEV; /* prevent module unloading while sleeping */ MOD_INC_USE_COUNT; @@ -2044,12 +2047,13 @@ } /* all OK */ - return cp; + dev_set_drvdata (&intf->dev, cp); + return 0; /* Error exit: clean up the memory */ pfail: auerswald_delete (cp); MOD_DEC_USE_COUNT; - return NULL; + return -EIO; } @@ -2065,10 +2069,14 @@ this device. So especially the usb_device structure must not be used any longer by the usb driver. */ -static void auerswald_disconnect (struct usb_device *usbdev, void *driver_context) +static void auerswald_disconnect (struct usb_interface *intf) { - pauerswald_t cp = (pauerswald_t) driver_context; + pauerswald_t cp = dev_get_drvdata (&intf->dev); unsigned int u; + + dev_set_drvdata (&intf->dev, NULL); + if (!cp) + return; down (&cp->mutex); info ("device /dev/usb/%s now disconnecting", cp->name); diff -Nru a/drivers/usb/misc/brlvger.c b/drivers/usb/misc/brlvger.c --- a/drivers/usb/misc/brlvger.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/brlvger.c Mon Sep 16 15:00:24 2002 @@ -105,9 +105,9 @@ #endif /* Prototypes */ -static void *brlvger_probe (struct usb_device *dev, unsigned ifnum, - const struct usb_device_id *id); -static void brlvger_disconnect(struct usb_device *dev, void *ptr); +static int brlvger_probe (struct usb_interface *intf, + const struct usb_device_id *id); +static void brlvger_disconnect(struct usb_interface *intf); static int brlvger_open(struct inode *inode, struct file *file); static int brlvger_release(struct inode *inode, struct file *file); static ssize_t brlvger_write(struct file *file, const char *buffer, @@ -281,10 +281,11 @@ /* Probe and disconnect functions */ -static void * -brlvger_probe (struct usb_device *dev, unsigned ifnum, +static int +brlvger_probe (struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); struct brlvger_priv *priv = NULL; int i; int retval; @@ -301,14 +302,14 @@ || dev->config->bNumInterfaces != 1 || actifsettings->bNumEndpoints != 1 ) { err ("Bogus braille display config info"); - return NULL; + return -ENODEV; } endpoint = actifsettings->endpoint; if (!(endpoint->bEndpointAddress & 0x80) || ((endpoint->bmAttributes & 3) != 0x03)) { err ("Bogus braille display config info, wrong endpoints"); - return NULL; + return -ENODEV; } down(&reserve_sem); @@ -404,15 +405,20 @@ out: up(&reserve_sem); - return priv; + if (priv) { + dev_set_drvdata (&intf->dev, priv); + return 0; + } + return -EIO; } static void -brlvger_disconnect(struct usb_device *dev, void *ptr) +brlvger_disconnect(struct usb_interface *intf) { - struct brlvger_priv *priv = (struct brlvger_priv *)ptr; + struct brlvger_priv *priv = dev_get_drvdata (&intf->dev); int r; + dev_set_drvdata (&intf->dev, NULL); if(priv){ info("Display %d disconnecting", priv->subminor); diff -Nru a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c --- a/drivers/usb/misc/emi26.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/emi26.c Mon Sep 16 15:00:24 2002 @@ -41,8 +41,8 @@ static int emi26_writememory( struct usb_device *dev, int address, unsigned char *data, int length, __u8 bRequest); static int emi26_set_reset(struct usb_device *dev, unsigned char reset_bit); static int emi26_load_firmware (struct usb_device *dev); -static void *emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id); -static void emi26_disconnect(struct usb_device *dev, void *drv_context); +static int emi26_probe(struct usb_interface *intf, const struct usb_device_id *id); +static void emi26_disconnect(struct usb_interface *intf); static int __init emi26_init (void); static void __exit emi26_exit (void); @@ -195,8 +195,10 @@ MODULE_DEVICE_TABLE (usb, id_table); -static void * emi26_probe(struct usb_device *dev, unsigned int if_num, const struct usb_device_id *id) +static int emi26_probe(struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); + info("%s start", __FUNCTION__); if((dev->descriptor.idVendor == EMI26_VENDOR_ID) && (dev->descriptor.idProduct == EMI26_PRODUCT_ID)) { @@ -204,10 +206,10 @@ } /* do not return the driver context, let real audio driver do that */ - return 0; + return -EIO; } -static void emi26_disconnect(struct usb_device *dev, void *drv_context) +static void emi26_disconnect(struct usb_interface *intf) { } diff -Nru a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c --- a/drivers/usb/misc/rio500.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/rio500.c Mon Sep 16 15:00:24 2002 @@ -450,9 +450,10 @@ .release = close_rio, }; -static void *probe_rio(struct usb_device *dev, unsigned int ifnum, - const struct usb_device_id *id) +static int probe_rio(struct usb_interface *intf, + const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); struct rio_usb_data *rio = &rio_instance; int retval; @@ -461,7 +462,7 @@ retval = usb_register_dev(&usb_rio_fops, RIO_MINOR, 1, &rio->minor); if (retval) { err("Not able to get a minor for this device."); - return NULL; + return -ENOMEM; } rio->present = 1; @@ -469,14 +470,14 @@ if (!(rio->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) { err("probe_rio: Not enough memory for the output buffer"); - return NULL; + return -ENOMEM; } dbg("probe_rio: obuf address:%p", rio->obuf); if (!(rio->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) { err("probe_rio: Not enough memory for the input buffer"); kfree(rio->obuf); - return NULL; + return -ENOMEM; } dbg("probe_rio: ibuf address:%p", rio->ibuf); @@ -490,31 +491,35 @@ init_MUTEX(&(rio->lock)); - return rio; + dev_set_drvdata (&intf->dev, rio); + return 0; } -static void disconnect_rio(struct usb_device *dev, void *ptr) +static void disconnect_rio(struct usb_interface *intf) { - struct rio_usb_data *rio = (struct rio_usb_data *) ptr; + struct rio_usb_data *rio = dev_get_drvdata (&intf->dev); - devfs_unregister(rio->devfs); - usb_deregister_dev(1, rio->minor); + dev_set_drvdata (&intf->dev, NULL); + if (rio) { + devfs_unregister(rio->devfs); + usb_deregister_dev(1, rio->minor); + + down(&(rio->lock)); + if (rio->isopen) { + rio->isopen = 0; + /* better let it finish - the release will do whats needed */ + rio->rio_dev = NULL; + up(&(rio->lock)); + return; + } + kfree(rio->ibuf); + kfree(rio->obuf); + + info("USB Rio disconnected."); - down(&(rio->lock)); - if (rio->isopen) { - rio->isopen = 0; - /* better let it finish - the release will do whats needed */ - rio->rio_dev = NULL; + rio->present = 0; up(&(rio->lock)); - return; } - kfree(rio->ibuf); - kfree(rio->obuf); - - info("USB Rio disconnected."); - - rio->present = 0; - up(&(rio->lock)); } static struct usb_device_id rio_table [] = { diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c --- a/drivers/usb/misc/speedtouch.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/speedtouch.c Mon Sep 16 15:00:24 2002 @@ -177,20 +177,20 @@ /* * usb driver prototypes and structures */ -static void *udsl_usb_probe (struct usb_device *dev, unsigned int ifnum, - const struct usb_device_id *id); -static void udsl_usb_disconnect (struct usb_device *dev, void *ptr); +static int udsl_usb_probe (struct usb_interface *intf, + const struct usb_device_id *id); +static void udsl_usb_disconnect (struct usb_interface *intf); int udsl_usb_send_data (struct udsl_instance_data *instance, struct atm_vcc *vcc, struct sk_buff *skb); static int udsl_usb_ioctl (struct usb_device *hub, unsigned int code, void *user_data); static int udsl_usb_cancelsends (struct udsl_instance_data *instance, struct atm_vcc *vcc); static struct usb_driver udsl_usb_driver = { - name:udsl_driver_name, - probe:udsl_usb_probe, - disconnect:udsl_usb_disconnect, - ioctl:udsl_usb_ioctl, - id_table:udsl_usb_ids, + .name = udsl_driver_name, + .probe = udsl_usb_probe, + .disconnect = udsl_usb_disconnect, + .ioctl = udsl_usb_ioctl, + .id_table = udsl_usb_ids, }; /************ @@ -828,7 +828,7 @@ return 0; } -int udsl_usb_data_exit (struct udsl_instance_data *instance) +static int udsl_usb_data_exit (struct udsl_instance_data *instance) { int i; @@ -913,8 +913,10 @@ return -EINVAL; } -void *udsl_usb_probe (struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id) +static int udsl_usb_probe (struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); + int ifnum = intf->altsetting->bInterfaceNumber; int i; unsigned char mac[6]; unsigned char mac_str[13]; @@ -926,7 +928,7 @@ if ((dev->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) || (dev->descriptor.idVendor != SPEEDTOUCH_VENDORID) || (dev->descriptor.idProduct != SPEEDTOUCH_PRODUCTID) || (ifnum != 1)) - return NULL; + return -ENODEV; MOD_INC_USE_COUNT; @@ -936,7 +938,7 @@ if (i >= MAX_UDSL) { printk (KERN_INFO "No minor table space available for SpeedTouch USB\n"); - return NULL; + return -ENOMEM; }; PDEBUG ("Device Accepted, assigning minor %d\n", i); @@ -945,7 +947,7 @@ instance = kmalloc (sizeof (struct udsl_instance_data), GFP_KERNEL); if (!instance) { PDEBUG ("No memory for Instance data!\n"); - return NULL; + return -ENOMEM; } /* initialize structure */ @@ -969,32 +971,37 @@ minor_data[instance->minor] = instance; - return instance; + dev_set_drvdata (&intf->dev, instance); + return 0; } -void udsl_usb_disconnect (struct usb_device *dev, void *ptr) +static void udsl_usb_disconnect (struct usb_interface *intf) { - struct udsl_instance_data *instance = (struct udsl_instance_data *) ptr; - int i = instance->minor; - - /* unlinking receive buffers */ - udsl_usb_data_exit (instance); + struct udsl_instance_data *instance = dev_get_drvdata (&intf->dev); + int i; - /* removing atm device */ - if (instance->atm_dev) - udsl_atm_stopdevice (instance); + dev_set_drvdata (&intf->dev, NULL); + if (instance) { + i = instance->minor; + /* unlinking receive buffers */ + udsl_usb_data_exit (instance); + + /* removing atm device */ + if (instance->atm_dev) + udsl_atm_stopdevice (instance); - PDEBUG ("disconnecting minor %d\n", i); + PDEBUG ("disconnecting minor %d\n", i); - while (MOD_IN_USE > 1) { - current->state = TASK_INTERRUPTIBLE; - schedule_timeout (1); - } + while (MOD_IN_USE > 1) { + current->state = TASK_INTERRUPTIBLE; + schedule_timeout (1); + } - kfree (instance); - minor_data[i] = NULL; + kfree (instance); + minor_data[i] = NULL; - MOD_DEC_USE_COUNT; + MOD_DEC_USE_COUNT; + } } /*************************************************************************** diff -Nru a/drivers/usb/misc/tiglusb.c b/drivers/usb/misc/tiglusb.c --- a/drivers/usb/misc/tiglusb.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/tiglusb.c Mon Sep 16 15:00:24 2002 @@ -326,17 +326,18 @@ /* --- initialisation code ------------------------------------- */ -static void * -tiglusb_probe (struct usb_device *dev, unsigned int ifnum, +static int +tiglusb_probe (struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); int minor = -1; int i; ptiglusb_t s; char name[8]; - dbg ("probing vendor id 0x%x, device id 0x%x ifnum:%d", - dev->descriptor.idVendor, dev->descriptor.idProduct, ifnum); + dbg ("probing vendor id 0x%x, device id 0x%x", + dev->descriptor.idVendor, dev->descriptor.idProduct); /* * We don't handle multiple configurations. As of version 0x0103 of @@ -344,15 +345,15 @@ */ if (dev->descriptor.bNumConfigurations != 1) - return NULL; + return -ENODEV; if ((dev->descriptor.idProduct != 0xe001) && (dev->descriptor.idVendor != 0x451)) - return NULL; + return -ENODEV; if (usb_set_configuration (dev, dev->config[0].bConfigurationValue) < 0) { err ("tiglusb_probe: set_configuration failed"); - return NULL; + return -ENODEV; } /* @@ -367,7 +368,7 @@ } if (minor == -1) - return NULL; + return -ENODEV; s = &tiglusb[minor]; @@ -375,7 +376,7 @@ s->remove_pending = 0; s->dev = dev; up (&s->mutex); - dbg ("bound to interface: %d", ifnum); + dbg ("bound to interface"); sprintf (name, "%d", s->minor); dbg ("registering to devfs : major = %d, minor = %d, node = %s", @@ -390,16 +391,20 @@ dev->descriptor.bcdDevice >> 8, dev->descriptor.bcdDevice & 0xff); - return s; + dev_set_drvdata (&intf->dev, s); + return 0; } static void -tiglusb_disconnect (struct usb_device *dev, void *drv_context) +tiglusb_disconnect (struct usb_interface *intf) { - ptiglusb_t s = (ptiglusb_t) drv_context; + ptiglusb_t s = dev_get_drvdata (&intf->dev); - if (!s || !s->dev) + dev_set_drvdata (&intf->dev, NULL); + if (!s || !s->dev) { info ("bogus disconnect"); + return; + } s->remove_pending = 1; wake_up (&s->wait); diff -Nru a/drivers/usb/misc/usblcd.c b/drivers/usb/misc/usblcd.c --- a/drivers/usb/misc/usblcd.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/usblcd.c Mon Sep 16 15:00:24 2002 @@ -245,20 +245,21 @@ .release = close_lcd, }; -static void *probe_lcd(struct usb_device *dev, unsigned int ifnum) +static int probe_lcd(struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *dev = interface_to_usbdev(intf); struct lcd_usb_data *lcd = &lcd_instance; int i; int retval; if (dev->descriptor.idProduct != 0x0001 ) { warn(KERN_INFO "USBLCD model not supported."); - return NULL; + return -ENODEV; } if (lcd->present == 1) { warn(KERN_INFO "Multiple USBLCDs are not supported!"); - return NULL; + return -ENODEV; } i = dev->descriptor.bcdDevice; @@ -270,7 +271,7 @@ retval = usb_register_dev(&usb_lcd_fops, USBLCD_MINOR, 1, &lcd->minor); if (retval) { err("Not able to get a minor for this device."); - return NULL; + return -ENOMEM; } lcd->present = 1; @@ -278,38 +279,42 @@ if (!(lcd->obuf = (char *) kmalloc(OBUF_SIZE, GFP_KERNEL))) { err("probe_lcd: Not enough memory for the output buffer"); - return NULL; + return -ENOMEM; } dbg("probe_lcd: obuf address:%p", lcd->obuf); if (!(lcd->ibuf = (char *) kmalloc(IBUF_SIZE, GFP_KERNEL))) { err("probe_lcd: Not enough memory for the input buffer"); kfree(lcd->obuf); - return NULL; + return -ENOMEM; } dbg("probe_lcd: ibuf address:%p", lcd->ibuf); - return lcd; + dev_set_drvdata (&intf->dev, lcd); + return 0; } -static void disconnect_lcd(struct usb_device *dev, void *ptr) +static void disconnect_lcd(struct usb_interface *intf) { - struct lcd_usb_data *lcd = (struct lcd_usb_data *) ptr; + struct lcd_usb_data *lcd = dev_get_drvdata (&intf->dev); - usb_deregister_dev(1, lcd->minor); - - if (lcd->isopen) { - lcd->isopen = 0; - /* better let it finish - the release will do whats needed */ - lcd->lcd_dev = NULL; - return; - } - kfree(lcd->ibuf); - kfree(lcd->obuf); + dev_set_drvdata (&intf->dev, NULL); + if (lcd) { + usb_deregister_dev(1, lcd->minor); + + if (lcd->isopen) { + lcd->isopen = 0; + /* better let it finish - the release will do whats needed */ + lcd->lcd_dev = NULL; + return; + } + kfree(lcd->ibuf); + kfree(lcd->obuf); - info("USBLCD disconnected."); + info("USBLCD disconnected."); - lcd->present = 0; + lcd->present = 0; + } } static struct usb_device_id id_table [] = { diff -Nru a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c --- a/drivers/usb/misc/uss720.c Mon Sep 16 15:00:24 2002 +++ b/drivers/usb/misc/uss720.c Mon Sep 16 15:00:24 2002 @@ -545,9 +545,10 @@ /* --------------------------------------------------------------------- */ -static void * uss720_probe(struct usb_device *usbdev, unsigned int ifnum, - const struct usb_device_id *id) +static int uss720_probe(struct usb_interface *intf, + const struct usb_device_id *id) { + struct usb_device *usbdev = interface_to_usbdev(intf); struct usb_interface_descriptor *interface; struct usb_endpoint_descriptor *endpoint; struct parport_uss720_private *priv; @@ -558,13 +559,13 @@ usbdev->descriptor.idVendor, usbdev->descriptor.idProduct); /* our known interfaces have 3 alternate settings */ - if (usbdev->actconfig->interface[ifnum].num_altsetting != 3) - return NULL; + if (intf->num_altsetting != 3) + return -ENODEV; - i = usb_set_interface(usbdev, ifnum, 2); + i = usb_set_interface(usbdev, intf->altsetting->bInterfaceNumber, 2); printk(KERN_DEBUG "uss720: set inteface result %d\n", i); - interface = &usbdev->actconfig->interface[ifnum].altsetting[2]; + interface = &intf->altsetting[2]; /* * Allocate parport interface @@ -572,7 +573,7 @@ printk(KERN_INFO "uss720: (C) 1999 by Thomas Sailer, \n"); if (!(priv = kmalloc(sizeof(struct parport_uss720_private), GFP_KERNEL))) - return NULL; + return -ENOMEM; if (!(pp = parport_register_port(0, PARPORT_IRQ_NONE, PARPORT_DMA_NONE, &parport_uss720_ops))) { printk(KERN_WARNING "usb-uss720: could not register parport\n"); goto probe_abort; @@ -607,7 +608,8 @@ parport_announce_port(pp); MOD_INC_USE_COUNT; - return pp; + dev_set_drvdata (&intf->dev, pp); + return 0; #if 0 probe_abort_port: @@ -615,22 +617,26 @@ #endif probe_abort: kfree(priv); - return NULL; + return -ENODEV; } -static void uss720_disconnect(struct usb_device *usbdev, void *ptr) +static void uss720_disconnect(struct usb_interface *intf) { - struct parport *pp = (struct parport *)ptr; - struct parport_uss720_private *priv = pp->private_data; + struct parport *pp = dev_get_drvdata (&intf->dev); + struct parport_uss720_private *priv; + dev_set_drvdata (&intf->dev, NULL); + if (pp) { + priv = pp->private_data; #if 0 - usb_release_irq(usbdev, priv->irqhandle, priv->irqpipe); + usb_release_irq(usbdev, priv->irqhandle, priv->irqpipe); #endif - priv->usbdev = NULL; - parport_proc_unregister(pp); - parport_unregister_port(pp); - kfree(priv); - MOD_DEC_USE_COUNT; + priv->usbdev = NULL; + parport_proc_unregister(pp); + parport_unregister_port(pp); + kfree(priv); + MOD_DEC_USE_COUNT; + } } /* table of cables that work through this driver */