pcmcia: pcmcia_config_loop() improvement by passing vcc
[deliverable/linux.git] / drivers / net / wireless / hostap / hostap_cs.c
index 2abaa90b799d7b14df74fd50c757578aa3d0f8d5..c768d42d5177542c9f692b45109fface680a7537 100644 (file)
@@ -536,24 +536,17 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 /* run after a CARD_INSERTION event is received to configure the PCMCIA
  * socket and make the device available to the system */
 
-struct prism2_config_data {
-       cistpl_cftable_entry_t dflt;
-       config_info_t conf;
-};
-
 static int prism2_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
+                              cistpl_cftable_entry_t *dflt,
+                              unsigned int vcc,
                               void *priv_data)
 {
-       struct prism2_config_data *cfg_mem = priv_data;
-
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               cfg_mem->dflt = *cfg;
        if (cfg->index == 0)
                return -ENODEV;
 
        PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X "
-              "(default 0x%02X)\n", cfg->index, cfg_mem->dflt.index);
+              "(default 0x%02X)\n", cfg->index, dflt->index);
 
        /* Does this card need audio output? */
        if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
@@ -564,14 +557,14 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
        /* 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] /
+               if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] /
                    10000 && !ignore_cis_vcc) {
                        PDEBUG(DEBUG_EXTRA, "  Vcc mismatch - skipping"
                               " this entry\n");
                        return -ENODEV;
                }
-       } else if (cfg_mem->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
-               if (cfg_mem->conf.Vcc != cfg_mem->dflt.vcc.param[CISTPL_POWER_VNOM] /
+       } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+               if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] /
                    10000 && !ignore_cis_vcc) {
                        PDEBUG(DEBUG_EXTRA, "  Vcc (default) mismatch "
                               "- skipping this entry\n");
@@ -581,11 +574,11 @@ static int prism2_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))
-               p_dev->conf.Vpp = cfg_mem->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
+       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
+               p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
 
        /* Do we need to allocate an interrupt? */
-       if (cfg->irq.IRQInfo1 || cfg_mem->dflt.irq.IRQInfo1)
+       if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
                p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
        else if (!(p_dev->conf.Attributes & CONF_ENABLE_IRQ)) {
                /* At least Compaq WL200 does not have IRQInfo1 set,
@@ -597,11 +590,11 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
 
        /* IO window settings */
        PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d "
-              "cfg_mem->dflt.io.nwin=%d\n",
-              cfg->io.nwin, cfg_mem->dflt.io.nwin);
+              "dflt->io.nwin=%d\n",
+              cfg->io.nwin, dflt->io.nwin);
        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;
                PDEBUG(DEBUG_EXTRA, "io->flags = 0x%04X, "
                       "io.base=0x%04x, len=%d\n", io->flags,
@@ -629,7 +622,6 @@ static int prism2_config(struct pcmcia_device *link)
 {
        struct net_device *dev;
        struct hostap_interface *iface;
-       struct prism2_config_data *cfg_mem;
        local_info_t *local;
        int ret = 1;
        int last_fn, last_ret;
@@ -637,21 +629,14 @@ static int prism2_config(struct pcmcia_device *link)
 
        PDEBUG(DEBUG_FLOW, "prism2_config()\n");
 
-       cfg_mem = kzalloc(sizeof(struct prism2_config_data), GFP_KERNEL);
-       if (!cfg_mem)
-               return -ENOMEM;
-
        hw_priv = kzalloc(sizeof(*hw_priv), GFP_KERNEL);
        if (hw_priv == NULL) {
                ret = -ENOMEM;
                goto failed;
        }
 
-       CS_CHECK(GetConfigurationInfo,
-                pcmcia_get_configuration_info(link, &cfg_mem->conf));
-
        /* Look for an appropriate configuration table entry in the CIS */
-       last_ret = pcmcia_loop_config(link, prism2_config_check, cfg_mem);
+       last_ret = pcmcia_loop_config(link, prism2_config_check, NULL);
        if (last_ret) {
                if (!ignore_cis_vcc)
                        printk(KERN_ERR "GetNextTuple(): No matching "
@@ -726,7 +711,6 @@ static int prism2_config(struct pcmcia_device *link)
                if (ret == 0 && local->ddev)
                        strcpy(hw_priv->node.dev_name, local->ddev->name);
        }
-       kfree(cfg_mem);
        return ret;
 
  cs_failed:
@@ -734,7 +718,6 @@ static int prism2_config(struct pcmcia_device *link)
 
  failed:
        kfree(hw_priv);
-       kfree(cfg_mem);
        prism2_release((u_long)link);
        return ret;
 }
This page took 0.029531 seconds and 5 git commands to generate.