V4L/DVB (11652): au0828: fix kernel oops regression on USB disconnect.
authorDevin Heitmueller <dheitmueller@linuxtv.org>
Tue, 28 Apr 2009 16:14:07 +0000 (13:14 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 29 Apr 2009 19:02:51 +0000 (16:02 -0300)
A regression was introduced in hg changeset 33810c734a0d, which resulted in
a kernel panic whenever the device was disconnected from USB.  The call to
4l2_device_register() was overwriting the pointer for usb_set_intfdata(), so
when au0828_usb_disconnect() was called, the usb_get_intfdata() returned a
pointer to the v4l2_device instead of the au0828_dev structure.

Signed-off-by: Devin Heitmueller <dheitmueller@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/au0828/au0828-core.c

index 4cee0b92eeee31b9f9b39d09c308b14da3ef613e..a1e4c0d769a6d014329165764647fc2c4c02568b 100644 (file)
@@ -192,8 +192,6 @@ static int au0828_usb_probe(struct usb_interface *interface,
        dev->usbdev = usbdev;
        dev->boardnr = id->driver_info;
 
-       usb_set_intfdata(interface, dev);
-
        /* Create the v4l2_device */
        retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
        if (retval) {
@@ -222,6 +220,10 @@ static int au0828_usb_probe(struct usb_interface *interface,
        /* Digital TV */
        au0828_dvb_register(dev);
 
+       /* Store the pointer to the au0828_dev so it can be accessed in
+          au0828_usb_disconnect */
+       usb_set_intfdata(interface, dev);
+
        printk(KERN_INFO "Registered device AU0828 [%s]\n",
                dev->board.name == NULL ? "Unset" : dev->board.name);