pcmcia: pcmcia_config_loop() default CIS entry handling
authorDominik Brodowski <linux@dominikbrodowski.net>
Sat, 2 Aug 2008 13:30:31 +0000 (15:30 +0200)
committerDominik Brodowski <linux@dominikbrodowski.net>
Fri, 22 Aug 2008 23:22:00 +0000 (01:22 +0200)
Many drivers use the default CIS entry within their pcmcia_config_loop()
callback function. Therefore, factor the default CIS entry handling out.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
32 files changed:
drivers/ata/pata_pcmcia.c
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/dtl1_cs.c
drivers/char/pcmcia/cm4000_cs.c
drivers/char/pcmcia/cm4040_cs.c
drivers/ide/legacy/ide-cs.c
drivers/isdn/hardware/avm/avm_cs.c
drivers/isdn/hisax/avma1_cs.c
drivers/isdn/hisax/elsa_cs.c
drivers/isdn/hisax/sedlbauer_cs.c
drivers/isdn/hisax/teles_cs.c
drivers/net/pcmcia/axnet_cs.c
drivers/net/pcmcia/pcnet_cs.c
drivers/net/pcmcia/smc91c92_cs.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/wireless/airo_cs.c
drivers/net/wireless/atmel_cs.c
drivers/net/wireless/hostap/hostap_cs.c
drivers/net/wireless/orinoco_cs.c
drivers/net/wireless/spectrum_cs.c
drivers/parport/parport_cs.c
drivers/pcmcia/pcmcia_resource.c
drivers/scsi/pcmcia/aha152x_stub.c
drivers/scsi/pcmcia/fdomain_stub.c
drivers/scsi/pcmcia/nsp_cs.c
drivers/scsi/pcmcia/qlogic_stub.c
drivers/scsi/pcmcia/sym53c500_cs.c
drivers/serial/serial_cs.c
drivers/telephony/ixj_pcmcia.c
drivers/usb/host/sl811_cs.c
include/pcmcia/cistpl.h

index 4b8bd20..2098206 100644 (file)
@@ -151,7 +151,6 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 struct pcmcia_config_check {
        config_info_t conf;
-       cistpl_cftable_entry_t dflt;
        unsigned long ctl_base;
        int skip_vcc;
        int is_kme;
@@ -159,6 +158,7 @@ struct pcmcia_config_check {
 
 static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                                   cistpl_cftable_entry_t *cfg,
+                                  cistpl_cftable_entry_t *dflt,
                                   void *priv_data)
 {
        struct pcmcia_config_check *stk = priv_data;
@@ -166,21 +166,23 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
        /* Check for matching Vcc, unless we're desperate */
        if (!stk->skip_vcc) {
                if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (stk->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               goto next_entry;
-               } else if (stk->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (stk->conf.Vcc != stk->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               goto next_entry;
+                       if (stk->conf.Vcc !=
+                           cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
+               } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+                       if (stk->conf.Vcc !=
+                           dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
                }
        }
 
        if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
                pdev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->conf.Vpp = stk->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
+       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
+               pdev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
 
-       if ((cfg->io.nwin > 0) || (stk->dflt.io.nwin > 0)) {
-               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &stk->dflt.io;
+       if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
+               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                pdev->io.BasePort1 = io->win[0].base;
                pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
                if (!(io->flags & CISTPL_IO_16BIT))
@@ -190,23 +192,19 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                        pdev->io.BasePort2 = io->win[1].base;
                        pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
                        if (pcmcia_request_io(pdev, &pdev->io) != 0)
-                               goto next_entry;
+                               return -ENODEV;
                        stk->ctl_base = pdev->io.BasePort2;
                } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
                        pdev->io.NumPorts1 = io->win[0].len;
                        pdev->io.NumPorts2 = 0;
                        if (pcmcia_request_io(pdev, &pdev->io) != 0)
-                               goto next_entry;
+                               return -ENODEV;
                        stk->ctl_base = pdev->io.BasePort1 + 0x0e;
                } else
-                       goto next_entry;
+                       return -ENODEV;
                /* If we've got this far, we're done */
                return 0;
        }
-next_entry:
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               memcpy(&stk->dflt, cfg, sizeof(stk->dflt));
-
        return -ENODEV;
 }
 
@@ -264,7 +262,6 @@ static int pcmcia_init_one(struct pcmcia_device *pdev)
        CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(pdev, &stk->conf));
        stk->skip_vcc = io_base = ctl_base = 0;
        if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk)) {
-               memset(&stk->dflt, 0, sizeof(stk->dflt));
                stk->skip_vcc = 1;
                if (pcmcia_loop_config(pdev, pcmcia_check_one_config, stk))
                        goto failed; /* No suitable config found */
index 3436be1..794a5ef 100644 (file)
@@ -680,6 +680,7 @@ static void bt3c_detach(struct pcmcia_device *link)
 
 static int bt3c_check_config(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cf,
+                            cistpl_cftable_entry_t *dflt,
                             void *priv_data)
 {
        unsigned long try = (unsigned long) priv_data;
@@ -699,6 +700,7 @@ static int bt3c_check_config(struct pcmcia_device *p_dev,
 
 static int bt3c_check_config_notpicky(struct pcmcia_device *p_dev,
                                      cistpl_cftable_entry_t *cf,
+                                     cistpl_cftable_entry_t *dflt,
                                      void *priv_data)
 {
        static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
index 5e31ea2..32017f9 100644 (file)
@@ -609,6 +609,7 @@ static void btuart_detach(struct pcmcia_device *link)
 
 static int btuart_check_config(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        unsigned long try = (unsigned long) priv_data;
@@ -628,6 +629,7 @@ static int btuart_check_config(struct pcmcia_device *p_dev,
 
 static int btuart_check_config_notpicky(struct pcmcia_device *p_dev,
                                        cistpl_cftable_entry_t *cf,
+                                       cistpl_cftable_entry_t *dflt,
                                        void *priv_data)
 {
        static unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
index 1846e2a..1830ebd 100644 (file)
@@ -592,6 +592,7 @@ static void dtl1_detach(struct pcmcia_device *link)
 
 static int dtl1_confcheck(struct pcmcia_device *p_dev,
                          cistpl_cftable_entry_t *cf,
+                         cistpl_cftable_entry_t *dflt,
                          void *priv_data)
 {
        if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) {
index 7eafd2f..7785fbb 100644 (file)
@@ -1761,6 +1761,7 @@ static void cmm_cm4000_release(struct pcmcia_device * link)
 
 static int cm4000_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        if (!cfg->io.nwin)
index 71ca8c4..468ddef 100644 (file)
@@ -528,6 +528,7 @@ static void cm4040_reader_release(struct pcmcia_device *link)
 
 static int cm4040_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        int rc;
index 8580bec..cc8eeaf 100644 (file)
@@ -222,7 +222,6 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 struct pcmcia_config_check {
        config_info_t conf;
-       cistpl_cftable_entry_t dflt;
        unsigned long ctl_base;
        int skip_vcc;
        int is_kme;
@@ -230,6 +229,7 @@ struct pcmcia_config_check {
 
 static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                                   cistpl_cftable_entry_t *cfg,
+                                  cistpl_cftable_entry_t *dflt,
                                   void *priv_data)
 {
        struct pcmcia_config_check *stk = priv_data;
@@ -237,21 +237,23 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
        /* Check for matching Vcc, unless we're desperate */
        if (!stk->skip_vcc) {
                if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (stk->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               goto next_entry;
-               } else if (stk->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
-                       if (stk->conf.Vcc != stk->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000)
-                               goto next_entry;
+                       if (stk->conf.Vcc !=
+                           cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
+               } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
+                       if (stk->conf.Vcc !=
+                           dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
+                               return -ENODEV;
                }
        }
 
        if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
                pdev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
-       else if (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))
-               pdev->conf.Vpp = stk->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
+       else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
+               pdev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
 
-       if ((cfg->io.nwin > 0) || (stk->dflt.io.nwin > 0)) {
-               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &stk->dflt.io;
+       if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
+               cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                pdev->conf.ConfigIndex = cfg->index;
                pdev->io.BasePort1 = io->win[0].base;
                pdev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
@@ -262,23 +264,19 @@ static int pcmcia_check_one_config(struct pcmcia_device *pdev,
                        pdev->io.BasePort2 = io->win[1].base;
                        pdev->io.NumPorts2 = (stk->is_kme) ? 2 : 1;
                        if (pcmcia_request_io(pdev, &pdev->io) != 0)
-                               goto next_entry;
+                               return -ENODEV;
                        stk->ctl_base = pdev->io.BasePort2;
                } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
                        pdev->io.NumPorts1 = io->win[0].len;
                        pdev->io.NumPorts2 = 0;
                        if (pcmcia_request_io(pdev, &pdev->io) != 0)
-                               goto next_entry;
+                               return -ENODEV;
                        stk->ctl_base = pdev->io.BasePort1 + 0x0e;
                } else
-                       goto next_entry;
+                       return -ENODEV;
                /* If we've got this far, we're done */
                return 0;
        }
-next_entry:
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               memcpy(&stk->dflt, cfg, sizeof(stk->dflt));
-
        return -ENODEV;
 }
 
@@ -305,7 +303,6 @@ static int ide_config(struct pcmcia_device *link)
     CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf));
     stk->skip_vcc = io_base = ctl_base = 0;
     if (pcmcia_loop_config(link, pcmcia_check_one_config, stk)) {
-           memset(&stk->dflt, 0, sizeof(stk->dflt));
            stk->skip_vcc = 1;
            if (pcmcia_loop_config(link, pcmcia_check_one_config, stk))
                    goto failed; /* No suitable config found */
index 3569c68..a8d6949 100644 (file)
@@ -156,6 +156,7 @@ static void avmcs_detach(struct pcmcia_device *link)
 
 static int avmcs_configcheck(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cf,
+                            cistpl_cftable_entry_t *dflt,
                             void *priv_data)
 {
        if (cf->io.nwin <= 0)
index 76164d6..7ce1aab 100644 (file)
@@ -175,8 +175,9 @@ static void avma1cs_detach(struct pcmcia_device *link)
 ======================================================================*/
 
 static int avma1cs_configcheck(struct pcmcia_device *p_dev,
-                            cistpl_cftable_entry_t *cf,
-                            void *priv_data)
+                              cistpl_cftable_entry_t *cf,
+                              cistpl_cftable_entry_t *dflt,
+                              void *priv_data)
 {
        if (cf->io.nwin <= 0)
                return -ENODEV;
index c9899e5..29c55b0 100644 (file)
@@ -206,6 +206,7 @@ static void elsa_cs_detach(struct pcmcia_device *link)
 
 static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        int j;
index 2c611f9..2746acb 100644 (file)
@@ -218,19 +218,17 @@ static void sedlbauer_detach(struct pcmcia_device *link)
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 struct sedlbauer_config_data {
-       cistpl_cftable_entry_t dflt;
        config_info_t conf;
        win_req_t req;
 };
 
 static int sedlbauer_config_check(struct pcmcia_device *p_dev,
                                  cistpl_cftable_entry_t *cfg,
+                                 cistpl_cftable_entry_t *dflt,
                                  void *priv_data)
 {
        struct sedlbauer_config_data *cfg_mem = priv_data;
 
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               cfg_mem->dflt = *cfg;
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -243,26 +241,28 @@ static int sedlbauer_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]/10000)
+               if (cfg_mem->conf.Vcc !=
+                   cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
                        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]/10000)
+       } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
+               if (cfg_mem->conf.Vcc !=
+                   dflt->vcc.param[CISTPL_POWER_VNOM]/10000)
                        return -ENODEV;
        }
 
        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;
 
        /* 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;
@@ -291,8 +291,8 @@ static int sedlbauer_config_check(struct pcmcia_device *p_dev,
          needs to be mapped to virtual space with ioremap() before it
          is used.
        */
-       if ((cfg->mem.nwin > 0) || (cfg_mem->dflt.mem.nwin > 0)) {
-               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &cfg_mem->dflt.mem;
+       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
+               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
                memreq_t map;
                cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
                cfg_mem->req.Attributes |= WIN_ENABLE;
index ecb75ae..f4f2e22 100644 (file)
@@ -196,6 +196,7 @@ static void teles_detach(struct pcmcia_device *link)
 
 static int teles_cs_configcheck(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cf,
+                               cistpl_cftable_entry_t *dflt,
                                void *priv_data)
 {
        int j;
index 04ece0b..c99dc5d 100644 (file)
@@ -286,6 +286,7 @@ static int try_io_port(struct pcmcia_device *link)
 
 static int axnet_configcheck(struct pcmcia_device *p_dev,
                             cistpl_cftable_entry_t *cfg,
+                            cistpl_cftable_entry_t *dflt,
                             void *priv_data)
 {
        int i;
index a606087..10fc537 100644 (file)
@@ -514,6 +514,7 @@ static int try_io_port(struct pcmcia_device *link)
 
 static int pcnet_confcheck(struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cfg,
+                          cistpl_cftable_entry_t *dflt,
                           void *priv_data)
 {
        int *has_shmem = priv_data;
index 1e59503..05bca83 100644 (file)
@@ -461,6 +461,7 @@ static int mhz_3288_power(struct pcmcia_device *link)
 
 static int mhz_mfc_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cf,
+                               cistpl_cftable_entry_t *dflt,
                                void *priv_data)
 {
        int k;
@@ -651,6 +652,7 @@ static int mot_setup(struct pcmcia_device *link)
 
 static int smc_configcheck(struct pcmcia_device *p_dev,
                           cistpl_cftable_entry_t *cf,
+                          cistpl_cftable_entry_t *dflt,
                           void *priv_data)
 {
        p_dev->io.BasePort1 = cf->io.win[0].base;
index b0de704..a16efa4 100644 (file)
@@ -718,6 +718,7 @@ has_ce2_string(struct pcmcia_device * p_dev)
 static int
 xirc2ps_config_modem(struct pcmcia_device *p_dev,
                     cistpl_cftable_entry_t *cf,
+                    cistpl_cftable_entry_t *dflt,
                     void *priv_data)
 {
        unsigned int ioaddr;
@@ -736,6 +737,7 @@ xirc2ps_config_modem(struct pcmcia_device *p_dev,
 static int
 xirc2ps_config_check(struct pcmcia_device *p_dev,
                     cistpl_cftable_entry_t *cf,
+                    cistpl_cftable_entry_t *dflt,
                     void *priv_data)
 {
        int *pass = priv_data;
index d721673..657adf8 100644 (file)
@@ -206,19 +206,12 @@ static void airo_detach(struct pcmcia_device *link)
 #define CS_CHECK(fn, ret) \
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
-struct airo_cs_config_data {
-       cistpl_cftable_entry_t dflt;
-       win_req_t req;
-};
-
 static int airo_cs_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
+                               cistpl_cftable_entry_t *dflt,
                                void *priv_data)
 {
-       struct airo_cs_config_data *cfg_mem = priv_data;
-
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               cfg_mem->dflt = *cfg;
+       win_req_t *req = priv_data;
 
        if (cfg->index == 0)
                return -ENODEV;
@@ -233,17 +226,17 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
        /*  Note that the CIS values need to be rescaled */
        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;
 
        /* 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;
@@ -273,14 +266,14 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
          needs to be mapped to virtual space with ioremap() before it
          is used.
        */
-       if ((cfg->mem.nwin > 0) || (cfg_mem->dflt.mem.nwin > 0)) {
-               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &cfg_mem->dflt.mem;
+       if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
+               cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
                memreq_t map;
-               cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
-               cfg_mem->req.Base = mem->win[0].host_addr;
-               cfg_mem->req.Size = mem->win[0].len;
-               cfg_mem->req.AccessSpeed = 0;
-               if (pcmcia_request_window(&p_dev, &cfg_mem->req, &p_dev->win) != 0)
+               req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
+               req->Base = mem->win[0].host_addr;
+               req->Size = mem->win[0].len;
+               req->AccessSpeed = 0;
+               if (pcmcia_request_window(&p_dev, req, &p_dev->win) != 0)
                        return -ENODEV;
                map.Page = 0;
                map.CardOffset = mem->win[0].card_addr;
@@ -295,15 +288,15 @@ static int airo_cs_config_check(struct pcmcia_device *p_dev,
 static int airo_config(struct pcmcia_device *link)
 {
        local_info_t *dev;
-       struct airo_cs_config_data *cfg_mem;
+       win_req_t *req;
        int last_fn, last_ret;
 
        dev = link->priv;
 
        DEBUG(0, "airo_config(0x%p)\n", link);
 
-       cfg_mem = kzalloc(sizeof(struct airo_cs_config_data), GFP_KERNEL);
-       if (!cfg_mem)
+       req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
+       if (!req)
                return -ENOMEM;
 
        /*
@@ -320,7 +313,7 @@ static int airo_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, airo_cs_config_check, cfg_mem);
+       last_ret = pcmcia_loop_config(link, airo_cs_config_check, req);
        if (last_ret)
                goto failed;
 
@@ -365,17 +358,17 @@ static int airo_config(struct pcmcia_device *link)
                printk(" & 0x%04x-0x%04x", link->io.BasePort2,
                       link->io.BasePort2+link->io.NumPorts2-1);
        if (link->win)
-               printk(", mem 0x%06lx-0x%06lx", cfg_mem->req.Base,
-                      cfg_mem->req.Base+cfg_mem->req.Size-1);
+               printk(", mem 0x%06lx-0x%06lx", req->Base,
+                      req->Base+req->Size-1);
        printk("\n");
-       kfree(cfg_mem);
+       kfree(req);
        return 0;
 
  cs_failed:
        cs_error(link, last_fn, last_ret);
  failed:
        airo_release(link);
-       kfree(cfg_mem);
+       kfree(req);
        return -ENODEV;
 } /* airo_config */
 
index 12efd44..c71aae9 100644 (file)
@@ -226,14 +226,12 @@ static int card_present(void *arg)
 
 static int atmel_config_check(struct pcmcia_device *p_dev,
                              cistpl_cftable_entry_t *cfg,
+                             cistpl_cftable_entry_t *dflt,
                              void *priv_data)
 {
-       cistpl_cftable_entry_t *dflt = priv_data;
-
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               *dflt = *cfg;
        if (cfg->index == 0)
                return -ENODEV;
+
        /* Does this card need audio output? */
        if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
                p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
@@ -278,7 +276,6 @@ static int atmel_config(struct pcmcia_device *link)
        local_info_t *dev;
        int last_fn, last_ret;
        struct pcmcia_device_id *did;
-       cistpl_cftable_entry_t dflt = { 0 };
 
        dev = link->priv;
        did = handle_to_dev(link).driver_data;
@@ -297,7 +294,7 @@ static int atmel_config(struct pcmcia_device *link)
          these things without consulting the CIS, and most client drivers
          will only use the CIS to fill in implementation-defined details.
        */
-       if (pcmcia_loop_config(link, atmel_config_check, &dflt))
+       if (pcmcia_loop_config(link, atmel_config_check, NULL))
                goto failed;
 
        /*
index 2abaa90..f9595ca 100644 (file)
@@ -537,23 +537,21 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
  * 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,
                               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) {
@@ -570,8 +568,8 @@ static int prism2_config_check(struct pcmcia_device *p_dev,
                               " 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 (cfg_mem->conf.Vcc != dflt->vcc.param[CISTPL_POWER_VNOM] /
                    10000 && !ignore_cis_vcc) {
                        PDEBUG(DEBUG_EXTRA, "  Vcc (default) mismatch "
                               "- skipping this entry\n");
@@ -581,11 +579,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 +595,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,
index 67a172d..8a367f9 100644 (file)
@@ -165,18 +165,16 @@ static void orinoco_cs_detach(struct pcmcia_device *link)
        } 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,
                                   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;
 
@@ -188,9 +186,9 @@ static int orinoco_cs_config_check(struct pcmcia_device *p_dev,
                        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 (cfg_mem->conf.Vcc != 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, dflt->vcc.param[CISTPL_POWER_VNOM] / 10000);
                        if (!ignore_cis_vcc)
                                goto next_entry;
                }
@@ -199,17 +197,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;
index 7536aa9..e28878d 100644 (file)
@@ -634,18 +634,16 @@ static void spectrum_cs_detach(struct pcmcia_device *link)
  */
 
 struct spectrum_cs_config_data {
-       cistpl_cftable_entry_t dflt;
        config_info_t conf;
 };
 
 static int spectrum_cs_config_check(struct pcmcia_device *p_dev,
                                    cistpl_cftable_entry_t *cfg,
+                                   cistpl_cftable_entry_t *dflt,
                                    void *priv_data)
 {
        struct spectrum_cs_config_data *cfg_mem = priv_data;
 
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               cfg_mem->dflt = *cfg;
        if (cfg->index == 0)
                goto next_entry;
 
@@ -657,9 +655,9 @@ static int spectrum_cs_config_check(struct pcmcia_device *p_dev,
                        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 (cfg_mem->conf.Vcc != 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, dflt->vcc.param[CISTPL_POWER_VNOM] / 10000);
                        if (!ignore_cis_vcc)
                                goto next_entry;
                }
@@ -668,17 +666,17 @@ static int spectrum_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;
index 814c525..05f34e7 100644 (file)
@@ -151,9 +151,9 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int parport_config_check(struct pcmcia_device *p_dev,
                                cistpl_cftable_entry_t *cfg,
+                               cistpl_cftable_entry_t *dflt,
                                void *priv_data)
 {
-       cistpl_cftable_entry_t *dflt = priv_data;
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                if (epp_mode)
@@ -166,26 +166,20 @@ static int parport_config_check(struct pcmcia_device *p_dev,
                        p_dev->io.NumPorts2 = io->win[1].len;
                }
                if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
-                       goto next_entry;
+                       return -ENODEV;
                return 0;
        }
-
-next_entry:
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               *dflt = *cfg;
-       return -ENODEV;
 }
 
 static int parport_config(struct pcmcia_device *link)
 {
     parport_info_t *info = link->priv;
-    cistpl_cftable_entry_t dflt = { 0 };
     struct parport *p;
     int last_ret, last_fn;
 
     DEBUG(0, "parport_config(0x%p)\n", link);
 
-    last_ret = pcmcia_loop_config(link, parport_config_check, &dflt);
+    last_ret = pcmcia_loop_config(link, parport_config_check, NULL);
     if (last_ret) {
            cs_error(link, RequestIO, last_ret);
            goto failed;
index ba34ac8..5ddfd46 100644 (file)
@@ -915,6 +915,7 @@ struct pcmcia_cfg_mem {
        tuple_t tuple;
        cisparse_t parse;
        u8 buf[256];
+       cistpl_cftable_entry_t dflt;
 };
 
 /**
@@ -933,10 +934,12 @@ struct pcmcia_cfg_mem {
 int pcmcia_loop_config(struct pcmcia_device *p_dev,
                       int      (*conf_check)   (struct pcmcia_device *p_dev,
                                                 cistpl_cftable_entry_t *cfg,
+                                                cistpl_cftable_entry_t *dflt,
                                                 void *priv_data),
                       void *priv_data)
 {
        struct pcmcia_cfg_mem *cfg_mem;
+
        tuple_t *tuple;
        int ret = -ENODEV;
 
@@ -963,8 +966,10 @@ int pcmcia_loop_config(struct pcmcia_device *p_dev,
 
                /* default values */
                p_dev->conf.ConfigIndex = cfg->index;
+               if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
+                       cfg_mem->dflt = *cfg;
 
-               ret = conf_check(p_dev, cfg, priv_data);
+               ret = conf_check(p_dev, cfg, &cfg_mem->dflt, priv_data);
                if (!ret)
                        break;
 
index 5e4d8e4..2ed3077 100644 (file)
@@ -141,8 +141,9 @@ static void aha152x_detach(struct pcmcia_device *link)
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int aha152x_config_check(struct pcmcia_device *p_dev,
-                          cistpl_cftable_entry_t *cfg,
-                          void *priv_data)
+                               cistpl_cftable_entry_t *cfg,
+                               cistpl_cftable_entry_t *dflt,
+                               void *priv_data)
 {
        /* For New Media T&J, look for a SCSI window */
        if (cfg->io.win[0].len >= 0x20)
index e3d6937..2b6e92d 100644 (file)
@@ -124,8 +124,9 @@ static void fdomain_detach(struct pcmcia_device *link)
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int fdomain_config_check(struct pcmcia_device *p_dev,
-                                 cistpl_cftable_entry_t *cfg,
-                                 void *priv_data)
+                               cistpl_cftable_entry_t *cfg,
+                               cistpl_cftable_entry_t *dflt,
+                               void *priv_data)
 {
        p_dev->io.BasePort1 = cfg->io.win[0].base;
        return pcmcia_request_io(p_dev, &p_dev->io);
index aee24b7..aa45234 100644 (file)
@@ -1612,17 +1612,15 @@ struct nsp_cs_configdata {
        nsp_hw_data             *data;
        win_req_t               req;
        config_info_t           conf;
-       cistpl_cftable_entry_t  dflt;
 };
 
 static int nsp_cs_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cfg,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        struct nsp_cs_configdata *cfg_mem = priv_data;
 
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               memcpy(&cfg_mem->dflt, cfg, sizeof(cistpl_cftable_entry_t));
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -1637,28 +1635,27 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
        if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {
                if (cfg_mem->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)
                        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]/10000)
+               else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
+                       if (cfg_mem->conf.Vcc != dflt->vcc.param[CISTPL_POWER_VNOM]/10000)
                                return -ENODEV;
                }
 
                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? */
-               if (cfg->irq.IRQInfo1 || cfg_mem->dflt.irq.IRQInfo1) {
+               if (cfg->irq.IRQInfo1 || dflt->irq.IRQInfo1)
                        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;
@@ -1677,10 +1674,10 @@ static int nsp_cs_config_check(struct pcmcia_device *p_dev,
                                goto next_entry;
                }
 
-               if ((cfg->mem.nwin > 0) || (cfg_mem->dflt.mem.nwin > 0)) {
+               if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
                        memreq_t        map;
                        cistpl_mem_t    *mem =
-                               (cfg->mem.nwin) ? &cfg->mem : &cfg_mem->dflt.mem;
+                               (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
                        cfg_mem->req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
                        cfg_mem->req.Attributes |= WIN_ENABLE;
                        cfg_mem->req.Base = mem->win[0].host_addr;
index a361275..da6b360 100644 (file)
@@ -196,8 +196,9 @@ static void qlogic_detach(struct pcmcia_device *link)
 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int qlogic_config_check(struct pcmcia_device *p_dev,
-                                 cistpl_cftable_entry_t *cfg,
-                                 void *priv_data)
+                              cistpl_cftable_entry_t *cfg,
+                              cistpl_cftable_entry_t *dflt,
+                              void *priv_data)
 {
        p_dev->io.BasePort1 = cfg->io.win[0].base;
        p_dev->io.NumPorts1 = cfg->io.win[0].len;
index 23a5219..eba1931 100644 (file)
@@ -702,6 +702,7 @@ do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
 
 static int SYM53C500_config_check(struct pcmcia_device *p_dev,
                                  cistpl_cftable_entry_t *cfg,
+                                 cistpl_cftable_entry_t *dflt,
                                  void *priv_data)
 {
        p_dev->io.BasePort1 = cfg->io.win[0].base;
index 6937381..f865868 100644 (file)
@@ -443,6 +443,7 @@ first_tuple(struct pcmcia_device *handle, tuple_t * tuple, cisparse_t * parse)
 
 static int simple_config_check(struct pcmcia_device *p_dev,
                               cistpl_cftable_entry_t *cf,
+                              cistpl_cftable_entry_t *dflt,
                               void *priv_data)
 {
        static const int size_table[2] = { 8, 16 };
@@ -465,6 +466,7 @@ static int simple_config_check(struct pcmcia_device *p_dev,
 
 static int simple_config_check_notpicky(struct pcmcia_device *p_dev,
                                        cistpl_cftable_entry_t *cf,
+                                       cistpl_cftable_entry_t *dflt,
                                        void *priv_data)
 {
        static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 };
@@ -546,6 +548,7 @@ found_port:
 
 static int multi_config_check(struct pcmcia_device *p_dev,
                              cistpl_cftable_entry_t *cf,
+                             cistpl_cftable_entry_t *dflt,
                              void *priv_data)
 {
        int *base2 = priv_data;
@@ -565,6 +568,7 @@ static int multi_config_check(struct pcmcia_device *p_dev,
 
 static int multi_config_check_notpicky(struct pcmcia_device *p_dev,
                                       cistpl_cftable_entry_t *cf,
+                                      cistpl_cftable_entry_t *dflt,
                                       void *priv_data)
 {
        int *base2 = priv_data;
index ba2c7a2..b41df21 100644 (file)
@@ -126,10 +126,9 @@ static void ixj_get_serial(struct pcmcia_device * link, IXJ * j)
 
 static int ixj_config_check(struct pcmcia_device *p_dev,
                            cistpl_cftable_entry_t *cfg,
+                           cistpl_cftable_entry_t *dflt,
                            void *priv_data)
 {
-       cistpl_cftable_entry_t *dflt = priv_data;
-
        if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
                cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
                p_dev->io.BasePort1 = io->win[0].base;
@@ -138,10 +137,7 @@ static int ixj_config_check(struct pcmcia_device *p_dev,
                        p_dev->io.BasePort2 = io->win[1].base;
                        p_dev->io.NumPorts2 = io->win[1].len;
                }
-               if (pcmcia_request_io(p_dev, &p_dev->io)) {
-                       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-                               *dflt = *cfg;
-               } else
+               if (!pcmcia_request_io(p_dev, &p_dev->io))
                        return 0;
        }
        return -ENODEV;
index 5b55c72..78cc32e 100644 (file)
@@ -156,19 +156,16 @@ static void sl811_cs_release(struct pcmcia_device * link)
 }
 
 struct sl811_css_cfg {
-       cistpl_cftable_entry_t  dflt;
        config_info_t           conf;
 };
 
 static int sl811_cs_config_check(struct pcmcia_device *p_dev,
                                 cistpl_cftable_entry_t *cfg,
+                                cistpl_cftable_entry_t *dflt,
                                 void *priv_data)
 {
        struct sl811_css_cfg    *cfg_mem = priv_data;
 
-       if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
-               memcpy(&cfg_mem->dflt, cfg, sizeof(cistpl_cftable_entry_t));
-
        if (cfg->index == 0)
                return -ENODEV;
 
@@ -178,8 +175,8 @@ static int sl811_cs_config_check(struct pcmcia_device *p_dev,
                if (cfg->vcc.param[CISTPL_POWER_VNOM]/10000 !=
                    cfg_mem->conf.Vcc)
                        return -ENODEV;
-       } else if (cfg_mem->dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {
-               if (cfg_mem->dflt.vcc.param[CISTPL_POWER_VNOM]/10000
+       } else if (dflt->vcc.present & (1<<CISTPL_POWER_VNOM)) {
+               if (dflt->vcc.param[CISTPL_POWER_VNOM]/10000
                    != cfg_mem->conf.Vcc)
                        return -ENODEV;
                }
@@ -187,18 +184,18 @@ static int sl811_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;
 
        /* we need 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;
 
        /* 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_8;
                p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
index b2eb914..0aa7027 100644 (file)
@@ -616,6 +616,7 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned
 int pcmcia_loop_config(struct pcmcia_device *p_dev,
                       int      (*conf_check)   (struct pcmcia_device *p_dev,
                                                 cistpl_cftable_entry_t *cf,
+                                                cistpl_cftable_entry_t *dflt,
                                                 void *priv_data),
                       void *priv_data);