[media] media: em28xx: Paranoic stack save
[pandora-kernel.git] / drivers / media / video / em28xx / em28xx-cards.c
index 4561cd8..d328616 100644 (file)
@@ -3122,7 +3122,6 @@ static int em28xx_usb_probe(struct usb_interface *interface,
        int i, nr;
        const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
        char *speed;
-       char descr[255] = "";
 
        udev = usb_get_dev(interface_to_usbdev(interface));
 
@@ -3227,21 +3226,11 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                speed = "unknown";
        }
 
-       if (udev->manufacturer)
-               strlcpy(descr, udev->manufacturer, sizeof(descr));
-
-       if (udev->product) {
-               if (*descr)
-                       strlcat(descr, " ", sizeof(descr));
-               strlcat(descr, udev->product, sizeof(descr));
-       }
-
-       if (*descr)
-               strlcat(descr, " ", sizeof(descr));
-
        printk(KERN_INFO DRIVER_NAME
-               ": New device %s@ %s Mbps (%04x:%04x, interface %d, class %d)\n",
-               descr,
+               ": New device %s %s @ %s Mbps "
+               "(%04x:%04x, interface %d, class %d)\n",
+               udev->manufacturer ? udev->manufacturer : "",
+               udev->product ? udev->product : "",
                speed,
                le16_to_cpu(udev->descriptor.idVendor),
                le16_to_cpu(udev->descriptor.idProduct),
@@ -3307,6 +3296,17 @@ static int em28xx_usb_probe(struct usb_interface *interface,
                goto unlock_and_free;
        }
 
+       if (has_dvb) {
+               /* pre-allocate DVB isoc transfer buffers */
+               retval = em28xx_alloc_isoc(dev, EM28XX_DIGITAL_MODE,
+                                          EM28XX_DVB_MAX_PACKETS,
+                                          EM28XX_DVB_NUM_BUFS,
+                                          dev->dvb_max_pkt_size);
+               if (retval) {
+                       goto unlock_and_free;
+               }
+       }
+
        request_modules(dev);
 
        /* Should be the last thing to do, to avoid newer udev's to
@@ -3379,7 +3379,7 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
                     video_device_node_name(dev->vdev));
 
                dev->state |= DEV_MISCONFIGURED;
-               em28xx_uninit_isoc(dev);
+               em28xx_uninit_isoc(dev, dev->mode);
                dev->state |= DEV_DISCONNECTED;
                wake_up_interruptible(&dev->wait_frame);
                wake_up_interruptible(&dev->wait_stream);
@@ -3388,6 +3388,9 @@ static void em28xx_usb_disconnect(struct usb_interface *interface)
                em28xx_release_resources(dev);
        }
 
+       /* free DVB isoc buffers */
+       em28xx_uninit_isoc(dev, EM28XX_DIGITAL_MODE);
+
        mutex_unlock(&dev->lock);
 
        em28xx_close_extension(dev);