fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / usb / core / config.c
index 99595e0..bfb3731 100644 (file)
@@ -1,9 +1,3 @@
-#include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#endif
-
 #include <linux/usb.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -112,8 +106,12 @@ void usb_release_interface_cache(struct kref *ref)
        struct usb_interface_cache *intfc = ref_to_usb_interface_cache(ref);
        int j;
 
-       for (j = 0; j < intfc->num_altsetting; j++)
-               kfree(intfc->altsetting[j].endpoint);
+       for (j = 0; j < intfc->num_altsetting; j++) {
+               struct usb_host_interface *alt = &intfc->altsetting[j];
+
+               kfree(alt->endpoint);
+               kfree(alt->string);
+       }
        kfree(intfc);
 }
 
@@ -188,10 +186,9 @@ static int usb_parse_interface(struct device *ddev, int cfgno,
        }
 
        len = sizeof(struct usb_host_endpoint) * num_ep;
-       alt->endpoint = kmalloc(len, GFP_KERNEL);
+       alt->endpoint = kzalloc(len, GFP_KERNEL);
        if (!alt->endpoint)
                return -ENOMEM;
-       memset(alt->endpoint, 0, len);
 
        /* Parse all the endpoint descriptors */
        n = 0;
@@ -353,10 +350,9 @@ static int usb_parse_configuration(struct device *ddev, int cfgidx,
                }
 
                len = sizeof(*intfc) + sizeof(struct usb_host_interface) * j;
-               config->intf_cache[i] = intfc = kmalloc(len, GFP_KERNEL);
+               config->intf_cache[i] = intfc = kzalloc(len, GFP_KERNEL);
                if (!intfc)
                        return -ENOMEM;
-               memset(intfc, 0, len);
                kref_init(&intfc->ref);
        }
 
@@ -422,8 +418,6 @@ void usb_destroy_configuration(struct usb_device *dev)
                struct usb_host_config *cf = &dev->config[c];
 
                kfree(cf->string);
-               cf->string = NULL;
-
                for (i = 0; i < cf->desc.bNumInterfaces; i++) {
                        if (cf->intf_cache[i])
                                kref_put(&cf->intf_cache[i]->ref, 
@@ -459,16 +453,14 @@ int usb_get_configuration(struct usb_device *dev)
        }
 
        length = ncfg * sizeof(struct usb_host_config);
-       dev->config = kmalloc(length, GFP_KERNEL);
+       dev->config = kzalloc(length, GFP_KERNEL);
        if (!dev->config)
                goto err2;
-       memset(dev->config, 0, length);
 
        length = ncfg * sizeof(char *);
-       dev->rawdescriptors = kmalloc(length, GFP_KERNEL);
+       dev->rawdescriptors = kzalloc(length, GFP_KERNEL);
        if (!dev->rawdescriptors)
                goto err2;
-       memset(dev->rawdescriptors, 0, length);
 
        buffer = kmalloc(USB_DT_CONFIG_SIZE, GFP_KERNEL);
        if (!buffer)
@@ -483,7 +475,9 @@ int usb_get_configuration(struct usb_device *dev)
                if (result < 0) {
                        dev_err(ddev, "unable to read config index %d "
                            "descriptor/%s\n", cfgno, "start");
-                       goto err;
+                       dev_err(ddev, "chopping to %d config(s)\n", cfgno);
+                       dev->descriptor.bNumConfigurations = cfgno;
+                       break;
                } else if (result < 4) {
                        dev_err(ddev, "config index %d descriptor too short "
                            "(expected %i, got %i)\n", cfgno,