pcmcia: pcmcia_config_loop() default CIS entry handling

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>
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c
index 4b8bd20..2098206 100644
--- a/drivers/ata/pata_pcmcia.c
+++ b/drivers/ata/pata_pcmcia.c
@@ -151,7 +151,6 @@
 
 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 @@
 
 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 @@
 	/* 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 @@
 			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 @@
 	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 3436be1..794a5ef 100644
--- a/drivers/bluetooth/bt3c_cs.c
+++ b/drivers/bluetooth/bt3c_cs.c
@@ -680,6 +680,7 @@
 
 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_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 5e31ea2..32017f9 100644
--- a/drivers/bluetooth/btuart_cs.c
+++ b/drivers/bluetooth/btuart_cs.c
@@ -609,6 +609,7 @@
 
 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_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 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..7785fbb4 100644
--- a/drivers/char/pcmcia/cm4000_cs.c
+++ b/drivers/char/pcmcia/cm4000_cs.c
@@ -1761,6 +1761,7 @@
 
 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 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 8580bec..cc8eeaf 100644
--- a/drivers/ide/legacy/ide-cs.c
+++ b/drivers/ide/legacy/ide-cs.c
@@ -222,7 +222,6 @@
 
 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 @@
 
 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 @@
 	/* 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 @@
 			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 @@
     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 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 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 c9899e5..29c55b0 100644
--- a/drivers/isdn/hisax/elsa_cs.c
+++ b/drivers/isdn/hisax/elsa_cs.c
@@ -206,6 +206,7 @@
 
 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..2746acb 100644
--- a/drivers/isdn/hisax/sedlbauer_cs.c
+++ b/drivers/isdn/hisax/sedlbauer_cs.c
@@ -218,19 +218,17 @@
 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 @@
 	/* 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 @@
 	  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 ecb75ae..f4f2e22 100644
--- a/drivers/isdn/hisax/teles_cs.c
+++ b/drivers/isdn/hisax/teles_cs.c
@@ -196,6 +196,7 @@
 
 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 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 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_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 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 b0de704..a16efa4 100644
--- a/drivers/net/pcmcia/xirc2ps_cs.c
+++ b/drivers/net/pcmcia/xirc2ps_cs.c
@@ -718,6 +718,7 @@
 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 @@
 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 @@
 #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 @@
 	/*  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 @@
 	  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_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 @@
 	 * 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 @@
 		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 12efd44..c71aae9 100644
--- a/drivers/net/wireless/atmel_cs.c
+++ b/drivers/net/wireless/atmel_cs.c
@@ -226,14 +226,12 @@
 
 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 @@
 	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 @@
 	  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 2abaa90..f9595ca 100644
--- a/drivers/net/wireless/hostap/hostap_cs.c
+++ b/drivers/net/wireless/hostap/hostap_cs.c
@@ -537,23 +537,21 @@
  * 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 @@
 			       " 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 @@
 
 	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 @@
 
 	/* 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 @@
 	} 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 @@
 			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 @@
 	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 7536aa91..e28878d 100644
--- a/drivers/net/wireless/spectrum_cs.c
+++ b/drivers/net/wireless/spectrum_cs.c
@@ -634,18 +634,16 @@
  */
 
 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 @@
 			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 @@
 	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 @@
 
 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 @@
 			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 ba34ac8..5ddfd46 100644
--- a/drivers/pcmcia/pcmcia_resource.c
+++ b/drivers/pcmcia/pcmcia_resource.c
@@ -915,6 +915,7 @@
 	tuple_t tuple;
 	cisparse_t parse;
 	u8 buf[256];
+	cistpl_cftable_entry_t dflt;
 };
 
 /**
@@ -933,10 +934,12 @@
 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 @@
 
 		/* 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..2ed3077b 100644
--- a/drivers/scsi/pcmcia/aha152x_stub.c
+++ b/drivers/scsi/pcmcia/aha152x_stub.c
@@ -141,8 +141,9 @@
 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 @@
 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 aee24b7..aa45234 100644
--- a/drivers/scsi/pcmcia/nsp_cs.c
+++ b/drivers/scsi/pcmcia/nsp_cs.c
@@ -1612,17 +1612,15 @@
 	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 @@
 	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 @@
 				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 @@
 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 @@
 
 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 6937381..f865868 100644
--- a/drivers/serial/serial_cs.c
+++ b/drivers/serial/serial_cs.c
@@ -443,6 +443,7 @@
 
 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_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 @@
 
 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_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 ba2c7a2..b41df21 100644
--- a/drivers/telephony/ixj_pcmcia.c
+++ b/drivers/telephony/ixj_pcmcia.c
@@ -126,10 +126,9 @@
 
 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 @@
 			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 @@
 }
 
 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 @@
 		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 @@
 	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;