pcmcia: simplify pccard_validate_cis
[pandora-kernel.git] / drivers / pcmcia / ds.c
index 15c18f5..0f56cb5 100644 (file)
@@ -741,9 +741,8 @@ struct pcmcia_device * pcmcia_device_add(struct pcmcia_socket *s, unsigned int f
 
 static int pcmcia_card_add(struct pcmcia_socket *s)
 {
-       cisinfo_t cisinfo;
        cistpl_longlink_mfc_t mfc;
-       unsigned int no_funcs, i;
+       unsigned int no_funcs, i, no_chains;
        int ret = 0;
 
        if (!(s->resource_setup_done)) {
@@ -757,8 +756,8 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
                return -EAGAIN; /* try again, but later... */
        }
 
-       ret = pccard_validate_cis(s, BIND_FN_ALL, &cisinfo);
-       if (ret || !cisinfo.Chains) {
+       ret = pccard_validate_cis(s, BIND_FN_ALL, &no_chains);
+       if (ret || !no_chains) {
                ds_dbg(0, "invalid CIS or invalid resources\n");
                return -ENODEV;
        }
@@ -865,11 +864,12 @@ static int pcmcia_load_firmware(struct pcmcia_device *dev, char * filename)
        ds_dbg(1, "trying to load CIS file %s\n", filename);
 
        if (strlen(filename) > 14) {
-               printk(KERN_WARNING "pcmcia: CIS filename is too long\n");
+               printk(KERN_WARNING "pcmcia: CIS filename is too long [%s]\n",
+                       filename);
                return -EINVAL;
        }
 
-       snprintf(path, 20, "%s", filename);
+       snprintf(path, sizeof(path), "%s", filename);
 
        if (request_firmware(&fw, path, &dev->dev) == 0) {
                if (fw->size >= CISTPL_MAX_CIS_SIZE) {
@@ -1130,8 +1130,6 @@ static int runtime_suspend(struct device *dev)
        down(&dev->sem);
        rc = pcmcia_dev_suspend(dev, PMSG_SUSPEND);
        up(&dev->sem);
-       if (!rc)
-               dev->power.power_state.event = PM_EVENT_SUSPEND;
        return rc;
 }
 
@@ -1142,8 +1140,6 @@ static void runtime_resume(struct device *dev)
        down(&dev->sem);
        rc = pcmcia_dev_resume(dev);
        up(&dev->sem);
-       if (!rc)
-               dev->power.power_state.event = PM_EVENT_ON;
 }
 
 /************************ per-device sysfs output ***************************/
@@ -1265,6 +1261,9 @@ static int pcmcia_dev_suspend(struct device * dev, pm_message_t state)
        struct pcmcia_driver *p_drv = NULL;
        int ret = 0;
 
+       if (p_dev->suspended)
+               return 0;
+
        ds_dbg(2, "suspending %s\n", dev->bus_id);
 
        if (dev->driver)
@@ -1301,6 +1300,9 @@ static int pcmcia_dev_resume(struct device * dev)
         struct pcmcia_driver *p_drv = NULL;
        int ret = 0;
 
+       if (!p_dev->suspended)
+               return 0;
+
        ds_dbg(2, "resuming %s\n", dev->bus_id);
 
        if (dev->driver)
@@ -1517,7 +1519,7 @@ static void pcmcia_bus_remove_socket(struct device *dev,
 
 
 /* the pcmcia_bus_interface is used to handle pcmcia socket devices */
-static struct class_interface pcmcia_bus_interface = {
+static struct class_interface pcmcia_bus_interface __refdata = {
        .class = &pcmcia_socket_class,
        .add_dev = &pcmcia_bus_add_socket,
        .remove_dev = &pcmcia_bus_remove_socket,