From: Tilman Schmidt , Hansjoerg Lipp Correct the way the Gigaset drivers create their sysfs entries. Signed-off-by: Hansjoerg Lipp Signed-off-by: Tilman Schmidt Cc: Karsten Keil Signed-off-by: Andrew Morton --- drivers/isdn/gigaset/bas-gigaset.c | 20 ++++++++++---------- drivers/isdn/gigaset/common.c | 6 ++++++ drivers/isdn/gigaset/gigaset.h | 4 ++-- drivers/isdn/gigaset/proc.c | 16 ++++++---------- drivers/isdn/gigaset/usb-gigaset.c | 23 +++++++++++------------ 5 files changed, 35 insertions(+), 34 deletions(-) diff -puN drivers/isdn/gigaset/bas-gigaset.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage drivers/isdn/gigaset/bas-gigaset.c --- devel/drivers/isdn/gigaset/bas-gigaset.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage 2006-04-03 17:50:12.000000000 -0700 +++ devel-akpm/drivers/isdn/gigaset/bas-gigaset.c 2006-04-03 17:50:12.000000000 -0700 @@ -2217,7 +2217,7 @@ static int gigaset_probe(struct usb_inte usb_get_dev(udev); ucs->udev = udev; ucs->interface = interface; - cs->dev = &udev->dev; + cs->dev = &interface->dev; /* allocate URBs: * - one for the interrupt pipe @@ -2289,14 +2289,13 @@ static int gigaset_probe(struct usb_inte /* tell common part that the device is ready */ if (startmode == SM_LOCKED) atomic_set(&cs->mstate, MS_LOCKED); - if (!gigaset_start(cs)) - goto error; /* save address of controller structure */ usb_set_intfdata(interface, cs); - /* set up device sysfs */ - gigaset_init_dev_sysfs(interface); + if (!gigaset_start(cs)) + goto error; + return 0; error: @@ -2313,23 +2312,24 @@ static void gigaset_disconnect(struct us struct cardstate *cs; struct bas_cardstate *ucs; - /* clear device sysfs */ - gigaset_free_dev_sysfs(interface); - cs = usb_get_intfdata(interface); - usb_set_intfdata(interface, NULL); IFNULLRET(cs); ucs = cs->hw.bas; IFNULLRET(ucs); - dev_info(cs->dev, "disconnecting GigaSet base"); + dev_info(cs->dev, "disconnecting Gigaset base\n"); gigaset_stop(cs); freeurbs(cs); + usb_set_intfdata(interface, NULL); kfree(ucs->rcvbuf); ucs->rcvbuf = NULL; ucs->rcvbuf_size = 0; atomic_set(&ucs->basstate, 0); + usb_put_dev(ucs->udev); + ucs->interface = NULL; + ucs->udev = NULL; + cs->dev = NULL; gigaset_unassign(cs); } diff -puN drivers/isdn/gigaset/common.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage drivers/isdn/gigaset/common.c --- devel/drivers/isdn/gigaset/common.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage 2006-04-03 17:50:12.000000000 -0700 +++ devel-akpm/drivers/isdn/gigaset/common.c 2006-04-03 17:50:12.000000000 -0700 @@ -833,6 +833,9 @@ int gigaset_start(struct cardstate *cs) wait_event(cs->waitqueue, !cs->waiting); + /* set up device sysfs */ + gigaset_init_dev_sysfs(cs); + up(&cs->sem); return 1; @@ -882,6 +885,9 @@ void gigaset_stop(struct cardstate *cs) { down(&cs->sem); + /* clear device sysfs */ + gigaset_free_dev_sysfs(cs); + atomic_set(&cs->connected, 0); cs->waiting = 1; diff -puN drivers/isdn/gigaset/gigaset.h~isdn4linux-siemens-gigaset-drivers-sysfs-usage drivers/isdn/gigaset/gigaset.h --- devel/drivers/isdn/gigaset/gigaset.h~isdn4linux-siemens-gigaset-drivers-sysfs-usage 2006-04-03 17:50:12.000000000 -0700 +++ devel-akpm/drivers/isdn/gigaset/gigaset.h 2006-04-03 17:50:12.000000000 -0700 @@ -778,8 +778,8 @@ void gigaset_handle_modem_response(struc */ /* initialize sysfs for device */ -void gigaset_init_dev_sysfs(struct usb_interface *interface); -void gigaset_free_dev_sysfs(struct usb_interface *interface); +void gigaset_init_dev_sysfs(struct cardstate *cs); +void gigaset_free_dev_sysfs(struct cardstate *cs); /* =========================================================================== * Functions implemented in common.c/gigaset.h diff -puN drivers/isdn/gigaset/proc.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage drivers/isdn/gigaset/proc.c --- devel/drivers/isdn/gigaset/proc.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage 2006-04-03 17:50:12.000000000 -0700 +++ devel-akpm/drivers/isdn/gigaset/proc.c 2006-04-03 17:50:12.000000000 -0700 @@ -19,16 +19,14 @@ static ssize_t show_cidmode(struct device *dev, struct device_attribute *attr, char *buf) { - struct usb_interface *intf = to_usb_interface(dev); - struct cardstate *cs = usb_get_intfdata(intf); + struct cardstate *cs = dev_get_drvdata(dev); return sprintf(buf, "%d\n", atomic_read(&cs->cidmode)); } static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct usb_interface *intf = to_usb_interface(dev); - struct cardstate *cs = usb_get_intfdata(intf); + struct cardstate *cs = dev_get_drvdata(dev); long int value; char *end; @@ -63,17 +61,15 @@ static ssize_t set_cidmode(struct device static DEVICE_ATTR(cidmode, S_IRUGO|S_IWUSR, show_cidmode, set_cidmode); /* free sysfs for device */ -void gigaset_free_dev_sysfs(struct usb_interface *interface) +void gigaset_free_dev_sysfs(struct cardstate *cs) { gig_dbg(DEBUG_INIT, "removing sysfs entries"); - device_remove_file(&interface->dev, &dev_attr_cidmode); + device_remove_file(cs->dev, &dev_attr_cidmode); } -EXPORT_SYMBOL_GPL(gigaset_free_dev_sysfs); /* initialize sysfs for device */ -void gigaset_init_dev_sysfs(struct usb_interface *interface) +void gigaset_init_dev_sysfs(struct cardstate *cs) { gig_dbg(DEBUG_INIT, "setting up sysfs"); - device_create_file(&interface->dev, &dev_attr_cidmode); + device_create_file(cs->dev, &dev_attr_cidmode); } -EXPORT_SYMBOL_GPL(gigaset_init_dev_sysfs); diff -puN drivers/isdn/gigaset/usb-gigaset.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage drivers/isdn/gigaset/usb-gigaset.c --- devel/drivers/isdn/gigaset/usb-gigaset.c~isdn4linux-siemens-gigaset-drivers-sysfs-usage 2006-04-03 17:50:12.000000000 -0700 +++ devel-akpm/drivers/isdn/gigaset/usb-gigaset.c 2006-04-03 17:50:12.000000000 -0700 @@ -748,7 +748,10 @@ static int gigaset_probe(struct usb_inte usb_get_dev(udev); ucs->udev = udev; ucs->interface = interface; - cs->dev = &udev->dev; + cs->dev = &interface->dev; + + /* save address of controller structure */ + usb_set_intfdata(interface, cs); // dev_set_drvdata(&interface->dev, cs); endpoint = &hostif->endpoint[0].desc; @@ -805,17 +808,12 @@ static int gigaset_probe(struct usb_inte /* tell common part that the device is ready */ if (startmode == SM_LOCKED) atomic_set(&cs->mstate, MS_LOCKED); + if (!gigaset_start(cs)) { tasklet_kill(&cs->write_tasklet); retval = -ENODEV; //FIXME goto error; } - - /* save address of controller structure */ - usb_set_intfdata(interface, cs); - - /* set up device sysfs */ - gigaset_init_dev_sysfs(interface); return 0; error: @@ -827,6 +825,7 @@ error: kfree(cs->inbuf[0].rcvbuf); if (ucs->read_urb != NULL) usb_free_urb(ucs->read_urb); + usb_set_intfdata(interface, NULL); ucs->read_urb = ucs->bulk_out_urb = NULL; cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; usb_put_dev(ucs->udev); @@ -845,16 +844,12 @@ static void gigaset_disconnect(struct us struct usb_cardstate *ucs; cs = usb_get_intfdata(interface); - - /* clear device sysfs */ - gigaset_free_dev_sysfs(interface); - - usb_set_intfdata(interface, NULL); ucs = cs->hw.usb; usb_kill_urb(ucs->read_urb); gigaset_stop(cs); + usb_set_intfdata(interface, NULL); tasklet_kill(&cs->write_tasklet); usb_kill_urb(ucs->bulk_out_urb); /* FIXME: only if active? */ @@ -868,6 +863,10 @@ static void gigaset_disconnect(struct us ucs->read_urb = ucs->bulk_out_urb = NULL; cs->inbuf[0].rcvbuf = ucs->bulk_out_buffer = NULL; + usb_put_dev(ucs->udev); + ucs->interface = NULL; + ucs->udev = NULL; + cs->dev = NULL; gigaset_unassign(cs); } _