Merge ../torvalds-2.6/
[pandora-kernel.git] / drivers / pcmcia / ds.c
index 43da2e9..080608c 100644 (file)
@@ -354,6 +354,7 @@ static void pcmcia_release_dev(struct device *dev)
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
        ds_dbg(1, "releasing dev %p\n", p_dev);
        pcmcia_put_socket(p_dev->socket);
+       kfree(p_dev->devname);
        kfree(p_dev);
 }
 
@@ -424,9 +425,13 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
 {
        cistpl_manfid_t manf_id;
        cistpl_funcid_t func_id;
-       cistpl_vers_1_t vers1;
+       cistpl_vers_1_t *vers1;
        unsigned int i;
 
+       vers1 = kmalloc(sizeof(*vers1), GFP_KERNEL);
+       if (!vers1)
+               return -ENOMEM;
+
        if (!pccard_read_tuple(p_dev->socket, p_dev->func,
                               CISTPL_MANFID, &manf_id)) {
                p_dev->manf_id = manf_id.manf;
@@ -443,23 +448,30 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
                /* rule of thumb: cards with no FUNCID, but with
                 * common memory device geometry information, are
                 * probably memory cards (from pcmcia-cs) */
-               cistpl_device_geo_t devgeo;
+               cistpl_device_geo_t *devgeo;
+
+               devgeo = kmalloc(sizeof(*devgeo), GFP_KERNEL);
+               if (!devgeo) {
+                       kfree(vers1);
+                       return -ENOMEM;
+               }
                if (!pccard_read_tuple(p_dev->socket, p_dev->func,
-                                     CISTPL_DEVICE_GEO, &devgeo)) {
+                                     CISTPL_DEVICE_GEO, devgeo)) {
                        ds_dbg(0, "mem device geometry probably means "
                               "FUNCID_MEMORY\n");
                        p_dev->func_id = CISTPL_FUNCID_MEMORY;
                        p_dev->has_func_id = 1;
                }
+               kfree(devgeo);
        }
 
        if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1,
-                              &vers1)) {
-               for (i=0; i < vers1.ns; i++) {
+                              vers1)) {
+               for (i=0; i < vers1->ns; i++) {
                        char *tmp;
                        unsigned int length;
 
-                       tmp = vers1.str + vers1.ofs[i];
+                       tmp = vers1->str + vers1->ofs[i];
 
                        length = strlen(tmp) + 1;
                        if ((length < 3) || (length > 255))
@@ -475,6 +487,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev)
                }
        }
 
+       kfree(vers1);
        return 0;
 }
 
@@ -492,6 +505,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
 {
        struct pcmcia_device *p_dev;
        unsigned long flags;
+       int bus_id_len;
 
        s = pcmcia_get_socket(s);
        if (!s)
@@ -515,7 +529,12 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
        p_dev->dev.bus = &pcmcia_bus_type;
        p_dev->dev.parent = s->dev.dev;
        p_dev->dev.release = pcmcia_release_dev;
-       sprintf (p_dev->dev.bus_id, "%d.%d", p_dev->socket->sock, p_dev->device_no);
+       bus_id_len = sprintf (p_dev->dev.bus_id, "%d.%d", p_dev->socket->sock, p_dev->device_no);
+
+       p_dev->devname = kmalloc(6 + bus_id_len + 1, GFP_KERNEL);
+       if (!p_dev->devname)
+               goto err_free;
+       sprintf (p_dev->devname, "pcmcia%s", p_dev->dev.bus_id);
 
        /* compat */
        p_dev->state = CLIENT_UNBOUND;
@@ -540,6 +559,7 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
        return p_dev;
 
  err_free:
+       kfree(p_dev->devname);
        kfree(p_dev);
        s->device_count--;
  err_put: