pcmcia: pcmcia_config_loop() improvement by passing vcc
[deliverable/linux.git] / drivers / net / wireless / orinoco_cs.c
index 67a172dfb2db4840b9fe28b25cd675d309b66f17..c7b57d9d499dfcabfbbf90cadb67474983298f07 100644 (file)
@@ -164,33 +164,26 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
                last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; \
        } while (0)
 
-struct orinoco_cs_config_data {
-       cistpl_cftable_entry_t dflt;
-       config_info_t conf;
-};
-
 static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
                                   cistpl_cftable_entry_t *cfg,
+                                  cistpl_cftable_entry_t *dflt,
+                                  unsigned int vcc,
                                   void *priv_data)
 {
-       struct orinoco_cs_config_data *cfg_mem = priv_data;
-
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               cfg_mem->dflt = *cfg;
        if (cfg->index == 0)
                goto next_entry;
 
        /* Use power settings for Vcc and Vpp if present */
        /* Note that the CIS values need to be rescaled */
        if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (cfg_mem->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "spectrum_cs_config: Vcc mismatch (cfg_mem->conf.Vcc = %d, CIS = %d)\n",  cfg_mem->conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
+               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
+                       DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n",  vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
                        if (!ignore_cis_vcc)
                                goto next_entry;
                }
-       } else if (cfg_mem->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (cfg_mem->conf.Vcc != cfg_mem->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) {
-                       DEBUG(2, "spectrum_cs_config: Vcc mismatch (cfg_mem->conf.Vcc = %d, CIS = %d)\n",  cfg_mem->conf.Vcc, cfg_mem->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000);
+       } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) {
+                       DEBUG(2, "spectrum_cs_config: Vcc mismatch (vcc = %d, CIS = %d)\n",  vcc, dflt->vcc.param[CISTPL_POWER_VNOM] / 10000);
                        if (!ignore_cis_vcc)
                                goto next_entry;
                }
@@ -199,17 +192,17 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
        if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->conf.Vpp =
                        cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (cfg_mem->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))
+       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
                p_dev->conf.Vpp =
-                       cfg_mem->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
+                       dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
 
        /* Do we need to allocate an interrupt? */
        p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
 
        /* IO window settings */
        p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
-       if ((cfg->io.nwin > 0) || (cfg_mem->dflt.io.nwin > 0)) {
-               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &cfg_mem->dflt.io;
+       if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
+               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
                if (!(io->flags & CISTPL_IO_8BIT))
                        p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
@@ -238,7 +231,6 @@ next_entry:
 static int
 orinoco_cs_config(struct pcmcia_device *link)
 {
-       struct orinoco_cs_config_data *cfg_mem;
        struct net_device *dev = link->priv;
        struct orinoco_private *priv = netdev_priv(dev);
        struct orinoco_pccard *card = priv->card;
@@ -246,14 +238,6 @@ orinoco_cs_config(struct pcmcia_device *link)
        int last_fn, last_ret;
        void __iomem *mem;
 
-       cfg_mem = kzalloc(sizeof(struct orinoco_cs_config_data), GFP_KERNEL);
-       if (!cfg_mem)
-               return -ENOMEM;
-
-       /* Look up the current Vcc */
-       CS_CHECK(GetConfigurationInfo,
-                pcmcia_get_configuration_info(link, &cfg_mem->conf));
-
        /*
         * In this loop, we scan the CIS for configuration table
         * entries, each of which describes a valid card
@@ -268,7 +252,7 @@ orinoco_cs_config(struct pcmcia_device *link)
         * and most client drivers will only use the CIS to fill in
         * implementation-defined details.
         */
-       last_ret = pcmcia_loop_config(link, orinoco_cs_config_check, cfg_mem);
+       last_ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL);
        if (last_ret) {
                if (!ignore_cis_vcc)
                        printk(KERN_ERR PFX "GetNextTuple(): No matching "
@@ -326,7 +310,6 @@ orinoco_cs_config(struct pcmcia_device *link)
               "0x%04x-0x%04x\n", dev->name, dev->dev.parent->bus_id,
               link->irq.AssignedIRQ, link->io.BasePort1,
               link->io.BasePort1 + link->io.NumPorts1 - 1);
-       kfree(cfg_mem);
        return 0;
 
  cs_failed:
@@ -334,7 +317,6 @@ orinoco_cs_config(struct pcmcia_device *link)
 
  failed:
        orinoco_cs_release(link);
-       kfree(cfg_mem);
        return -ENODEV;
 }                              /* orinoco_cs_config */
 
This page took 0.027209 seconds and 5 git commands to generate.