[PATCH 16/39] pcmcia: pcmcia_config_loop() default CIS entry handling

Dominik Brodowski linux at dominikbrodowski.net
Mon Aug 18 14:53:07 EDT 2008


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 at dominikbrodowski.net>
---
 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




More information about the linux-pcmcia mailing list