Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / usb / core / config.c
index 06f667d..a9d89c7 100644 (file)
@@ -1,16 +1,12 @@
 #include <linux/config.h>
-
-#ifdef CONFIG_USB_DEBUG
-#define DEBUG
-#endif
-
 #include <linux/usb.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/device.h>
 #include <asm/byteorder.h>
-
+#include "usb.h"
+#include "hcd.h"
 
 #define USB_MAXALTSETTING              128     /* Hard limit */
 #define USB_MAXENDPOINTS               30      /* Hard limit */
@@ -87,7 +83,7 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
        ++ifp->desc.bNumEndpoints;
 
        memcpy(&endpoint->desc, d, n);
-       le16_to_cpus(&endpoint->desc.wMaxPacketSize);
+       INIT_LIST_HEAD(&endpoint->urb_list);
 
        /* Skip over any Class Specific or Vendor Specific descriptors;
         * find the next endpoint or interface descriptor */
@@ -106,13 +102,17 @@ skip_to_next_endpoint_or_interface_descriptor:
        return buffer - buffer0 + i;
 }
 
-static void usb_release_interface_cache(struct kref *ref)
+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);
 }
 
@@ -187,10 +187,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;
@@ -221,7 +220,7 @@ skip_to_next_interface_descriptor:
        return buffer - buffer0 + i;
 }
 
-int usb_parse_configuration(struct device *ddev, int cfgidx,
+static int usb_parse_configuration(struct device *ddev, int cfgidx,
     struct usb_host_config *config, unsigned char *buffer, int size)
 {
        unsigned char *buffer0 = buffer;
@@ -319,7 +318,7 @@ int usb_parse_configuration(struct device *ddev, int cfgidx,
 
        }       /* for ((buffer2 = buffer, size2 = size); ...) */
        size = buffer2 - buffer;
-       config->desc.wTotalLength = buffer2 - buffer0;
+       config->desc.wTotalLength = cpu_to_le16(buffer2 - buffer0);
 
        if (n != nintf)
                dev_warn(ddev, "config %d has %d interface%s, different from "
@@ -352,11 +351,10 @@ 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, usb_release_interface_cache);
+               kref_init(&intfc->ref);
        }
 
        /* Skip over any Class Specific or Vendor Specific descriptors;
@@ -414,19 +412,21 @@ void usb_destroy_configuration(struct usb_device *dev)
                        kfree(dev->rawdescriptors[i]);
 
                kfree(dev->rawdescriptors);
-               dev->rawdescriptors = 0;
+               dev->rawdescriptors = NULL;
        }
 
        for (c = 0; c < dev->descriptor.bNumConfigurations; c++) {
                struct usb_host_config *cf = &dev->config[c];
 
+               kfree(cf->string);
                for (i = 0; i < cf->desc.bNumInterfaces; i++) {
                        if (cf->intf_cache[i])
-                               kref_put(&cf->intf_cache[i]->ref);
+                               kref_put(&cf->intf_cache[i]->ref, 
+                                         usb_release_interface_cache);
                }
        }
        kfree(dev->config);
-       dev->config = 0;
+       dev->config = NULL;
 }
 
 
@@ -454,16 +454,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)