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 <[EMAIL PROTECTED]>
---
 drivers/ata/pata_pcmcia.c               |   29 +++++++----------
 drivers/bluetooth/bt3c_cs.c             |    2 +
 drivers/bluetooth/btuart_cs.c           |    2 +
 drivers/bluetooth/dtl1_cs.c             |    1 +
 drivers/char/pcmcia/cm4000_cs.c         |    1 +
 drivers/char/pcmcia/cm4040_cs.c         |    1 +
 drivers/ide/legacy/ide-cs.c             |   29 +++++++----------
 drivers/isdn/hardware/avm/avm_cs.c      |    1 +
 drivers/isdn/hisax/avma1_cs.c           |    5 ++-
 drivers/isdn/hisax/elsa_cs.c            |    1 +
 drivers/isdn/hisax/sedlbauer_cs.c       |   22 ++++++-------
 drivers/isdn/hisax/teles_cs.c           |    1 +
 drivers/net/pcmcia/axnet_cs.c           |    1 +
 drivers/net/pcmcia/pcnet_cs.c           |    1 +
 drivers/net/pcmcia/smc91c92_cs.c        |    2 +
 drivers/net/pcmcia/xirc2ps_cs.c         |    2 +
 drivers/net/wireless/airo_cs.c          |   51 +++++++++++++-----------------
 drivers/net/wireless/atmel_cs.c         |    9 ++----
 drivers/net/wireless/hostap/hostap_cs.c |   24 +++++++--------
 drivers/net/wireless/orinoco_cs.c       |   18 +++++------
 drivers/net/wireless/spectrum_cs.c      |   18 +++++------
 drivers/parport/parport_cs.c            |   12 ++-----
 drivers/pcmcia/pcmcia_resource.c        |    7 ++++-
 drivers/scsi/pcmcia/aha152x_stub.c      |    5 ++-
 drivers/scsi/pcmcia/fdomain_stub.c      |    5 ++-
 drivers/scsi/pcmcia/nsp_cs.c            |   22 ++++++-------
 drivers/scsi/pcmcia/qlogic_stub.c       |    5 ++-
 drivers/scsi/pcmcia/sym53c500_cs.c      |    1 +
 drivers/serial/serial_cs.c              |    4 ++
 drivers/telephony/ixj_pcmcia.c          |    8 +----
 drivers/usb/host/sl811_cs.c             |   19 +++++-------
 include/pcmcia/cistpl.h                 |    1 +
 32 files changed, 149 insertions(+), 161 deletions(-)

diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index 4b8bd20..d2b7dd6 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -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;
@@ -167,20 +167,20 @@ static int pcmcia_check_one_config(struct pcmcia_device 
*pdev,
        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;
+                               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 +190,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 +260,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 */
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c
index de1a4c1..cb9e304 100644
--- a/drivers/bluetooth/bt3c_cs.c
+++ b/drivers/bluetooth/bt3c_cs.c
@@ -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;
@@ -697,6 +698,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 };
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c
index b167512..0226233 100644
--- a/drivers/bluetooth/btuart_cs.c
+++ b/drivers/bluetooth/btuart_cs.c
@@ -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;
@@ -626,6 +627,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 };
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c
index 1846e2a..1830ebd 100644
--- a/drivers/bluetooth/dtl1_cs.c
+++ b/drivers/bluetooth/dtl1_cs.c
@@ -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)) {
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
index 7eafd2f..7785fbb 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -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)
diff --git a/drivers/char/pcmcia/cm4040_cs.c b/drivers/char/pcmcia/cm4040_cs.c
index 71ca8c4..468ddef 100644
--- a/drivers/char/pcmcia/cm4040_cs.c
+++ b/drivers/char/pcmcia/cm4040_cs.c
@@ -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;
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c
index cfd5bd4..f0b2bcc 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -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;
@@ -238,20 +238,20 @@ static int pcmcia_check_one_config(struct pcmcia_device 
*pdev,
        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;
+                               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 +262,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;
 }
 
@@ -304,7 +300,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 */
diff --git a/drivers/isdn/hardware/avm/avm_cs.c 
b/drivers/isdn/hardware/avm/avm_cs.c
index 3569c68..a8d6949 100644
--- a/drivers/isdn/hardware/avm/avm_cs.c
+++ b/drivers/isdn/hardware/avm/avm_cs.c
@@ -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)
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c
index 76164d6..7ce1aab 100644
--- a/drivers/isdn/hisax/avma1_cs.c
+++ b/drivers/isdn/hisax/avma1_cs.c
@@ -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;
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c
index 99ef941..d0f0d54 100644
--- a/drivers/isdn/hisax/elsa_cs.c
+++ b/drivers/isdn/hisax/elsa_cs.c
@@ -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;
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c 
b/drivers/isdn/hisax/sedlbauer_cs.c
index 2c611f9..fd6baca 100644
--- a/drivers/isdn/hisax/sedlbauer_cs.c
+++ b/drivers/isdn/hisax/sedlbauer_cs.c
@@ -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;
 
@@ -245,24 +243,24 @@ static int sedlbauer_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))
-               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 +289,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;
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c
index 86bd20f..34d46d9 100644
--- a/drivers/isdn/hisax/teles_cs.c
+++ b/drivers/isdn/hisax/teles_cs.c
@@ -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;
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
index 04ece0b..c99dc5d 100644
--- a/drivers/net/pcmcia/axnet_cs.c
+++ b/drivers/net/pcmcia/axnet_cs.c
@@ -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;
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
index a606087..10fc537 100644
--- a/drivers/net/pcmcia/pcnet_cs.c
+++ b/drivers/net/pcmcia/pcnet_cs.c
@@ -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;
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c
index 1e59503..05bca83 100644
--- a/drivers/net/pcmcia/smc91c92_cs.c
+++ b/drivers/net/pcmcia/smc91c92_cs.c
@@ -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;
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c
index 9b18958..b3c21f4 100644
--- a/drivers/net/pcmcia/xirc2ps_cs.c
+++ b/drivers/net/pcmcia/xirc2ps_cs.c
@@ -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;
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c
index d721673..657adf8 100644
--- a/drivers/net/wireless/airo_cs.c
+++ b/drivers/net/wireless/airo_cs.c
@@ -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 */
 
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c
index fe8f74e..dd181a3 100644
--- a/drivers/net/wireless/atmel_cs.c
+++ b/drivers/net/wireless/atmel_cs.c
@@ -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;
 
        /*
diff --git a/drivers/net/wireless/hostap/hostap_cs.c 
b/drivers/net/wireless/hostap/hostap_cs.c
index 7ce6bf8..e82d550 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -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,
diff --git a/drivers/net/wireless/orinoco_cs.c 
b/drivers/net/wireless/orinoco_cs.c
index 67a172d..8a367f9 100644
--- a/drivers/net/wireless/orinoco_cs.c
+++ b/drivers/net/wireless/orinoco_cs.c
@@ -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;
diff --git a/drivers/net/wireless/spectrum_cs.c 
b/drivers/net/wireless/spectrum_cs.c
index 7536aa9..e28878d 100644
--- a/drivers/net/wireless/spectrum_cs.c
+++ b/drivers/net/wireless/spectrum_cs.c
@@ -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;
diff --git a/drivers/parport/parport_cs.c b/drivers/parport/parport_cs.c
index 814c525..05f34e7 100644
--- a/drivers/parport/parport_cs.c
+++ b/drivers/parport/parport_cs.c
@@ -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;
diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c
index 59b55f1..ea642c1 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -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;
 
diff --git a/drivers/scsi/pcmcia/aha152x_stub.c 
b/drivers/scsi/pcmcia/aha152x_stub.c
index 5e4d8e4..2ed3077 100644
--- a/drivers/scsi/pcmcia/aha152x_stub.c
+++ b/drivers/scsi/pcmcia/aha152x_stub.c
@@ -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)
diff --git a/drivers/scsi/pcmcia/fdomain_stub.c 
b/drivers/scsi/pcmcia/fdomain_stub.c
index e3d6937..2b6e92d 100644
--- a/drivers/scsi/pcmcia/fdomain_stub.c
+++ b/drivers/scsi/pcmcia/fdomain_stub.c
@@ -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);
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c
index f37ae74..1e721c7 100644
--- a/drivers/scsi/pcmcia/nsp_cs.c
+++ b/drivers/scsi/pcmcia/nsp_cs.c
@@ -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,28 @@ 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 +1675,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;
diff --git a/drivers/scsi/pcmcia/qlogic_stub.c 
b/drivers/scsi/pcmcia/qlogic_stub.c
index a361275..da6b360 100644
--- a/drivers/scsi/pcmcia/qlogic_stub.c
+++ b/drivers/scsi/pcmcia/qlogic_stub.c
@@ -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;
diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c 
b/drivers/scsi/pcmcia/sym53c500_cs.c
index 23a5219..eba1931 100644
--- a/drivers/scsi/pcmcia/sym53c500_cs.c
+++ b/drivers/scsi/pcmcia/sym53c500_cs.c
@@ -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;
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c
index 071614c..9e34ae0 100644
--- a/drivers/serial/serial_cs.c
+++ b/drivers/serial/serial_cs.c
@@ -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;
diff --git a/drivers/telephony/ixj_pcmcia.c b/drivers/telephony/ixj_pcmcia.c
index 03d79a1..4fefb93 100644
--- a/drivers/telephony/ixj_pcmcia.c
+++ b/drivers/telephony/ixj_pcmcia.c
@@ -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;
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c
index 5b55c72..78cc32e 100644
--- a/drivers/usb/host/sl811_cs.c
+++ b/drivers/usb/host/sl811_cs.c
@@ -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;
diff --git a/include/pcmcia/cistpl.h b/include/pcmcia/cistpl.h
index b2eb914..0aa7027 100644
--- a/include/pcmcia/cistpl.h
+++ b/include/pcmcia/cistpl.h
@@ -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);
 
-- 
1.5.4.3


_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia

Reply via email to