diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-07-30 03:51:52 -0400 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-09-29 11:20:23 -0400 |
commit | 440eed43e2a95bb842488755683716814da10f2b (patch) | |
tree | 45c49181a077f845cd366cfa7dc07f259fd01078 /drivers/net | |
parent | 9485ee14e143c7076e88deea1e87ca3eb0b2f94e (diff) |
pcmcia: introduce autoconfiguration feature
Introduce an autoconfiguration feature to set certain values in
pcmcia_loop_config(), instead of copying the same code over and over
in each PCMCIA driver. At first, introduce the following options:
CONF_AUTO_CHECK_VCC check or matching Vcc entry
CONF_AUTO_SET_VPP set Vpp
CONF_AUTO_AUDIO enable the speaker line
CC: netdev@vger.kernel.org
CC: linux-wireless@vger.kernel.org
CC: linux-ide@vger.kernel.org
CC: linux-usb@vger.kernel.org
CC: laforge@gnumonks.org
CC: linux-mtd@lists.infradead.org
CC: alsa-devel@alsa-project.org
CC: linux-serial@vger.kernel.org
CC: Jiri Kosina <jkosina@suse.cz>
CC: linux-scsi@vger.kernel.org
Acked-by: Gustavo F. Padovan <padovan@profusion.mobi> (for drivers/bluetooth)
Tested-by: Wolfram Sang <w.sang@pengutronix.de>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/pcmcia/axnet_cs.c | 1 | ||||
-rw-r--r-- | drivers/net/pcmcia/fmvj18x_cs.c | 1 | ||||
-rw-r--r-- | drivers/net/pcmcia/pcnet_cs.c | 1 | ||||
-rw-r--r-- | drivers/net/pcmcia/smc91c92_cs.c | 2 | ||||
-rw-r--r-- | drivers/net/pcmcia/xirc2ps_cs.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/airo_cs.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/atmel_cs.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 27 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/if_cs.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_cs.c | 31 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/spectrum_cs.c | 24 |
11 files changed, 18 insertions, 109 deletions
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index f361d2865e34..17f1040e255e 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
@@ -287,7 +287,6 @@ static int try_io_port(struct pcmcia_device *link) | |||
287 | static int axnet_configcheck(struct pcmcia_device *p_dev, | 287 | static int axnet_configcheck(struct pcmcia_device *p_dev, |
288 | cistpl_cftable_entry_t *cfg, | 288 | cistpl_cftable_entry_t *cfg, |
289 | cistpl_cftable_entry_t *dflt, | 289 | cistpl_cftable_entry_t *dflt, |
290 | unsigned int vcc, | ||
291 | void *priv_data) | 290 | void *priv_data) |
292 | { | 291 | { |
293 | int i; | 292 | int i; |
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index f6865adb126d..c1479e3bfab4 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
@@ -322,7 +322,6 @@ static int ungermann_try_io_port(struct pcmcia_device *link) | |||
322 | static int fmvj18x_ioprobe(struct pcmcia_device *p_dev, | 322 | static int fmvj18x_ioprobe(struct pcmcia_device *p_dev, |
323 | cistpl_cftable_entry_t *cfg, | 323 | cistpl_cftable_entry_t *cfg, |
324 | cistpl_cftable_entry_t *dflt, | 324 | cistpl_cftable_entry_t *dflt, |
325 | unsigned int vcc, | ||
326 | void *priv_data) | 325 | void *priv_data) |
327 | { | 326 | { |
328 | return 0; /* strange, but that's what the code did already before... */ | 327 | return 0; /* strange, but that's what the code did already before... */ |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 4a3b6a43550f..12b028c6abc9 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -503,7 +503,6 @@ static int try_io_port(struct pcmcia_device *link) | |||
503 | static int pcnet_confcheck(struct pcmcia_device *p_dev, | 503 | static int pcnet_confcheck(struct pcmcia_device *p_dev, |
504 | cistpl_cftable_entry_t *cfg, | 504 | cistpl_cftable_entry_t *cfg, |
505 | cistpl_cftable_entry_t *dflt, | 505 | cistpl_cftable_entry_t *dflt, |
506 | unsigned int vcc, | ||
507 | void *priv_data) | 506 | void *priv_data) |
508 | { | 507 | { |
509 | int *priv = priv_data; | 508 | int *priv = priv_data; |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 8c16ba672012..e127d2b546dd 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
@@ -420,7 +420,6 @@ static int mhz_3288_power(struct pcmcia_device *link) | |||
420 | static int mhz_mfc_config_check(struct pcmcia_device *p_dev, | 420 | static int mhz_mfc_config_check(struct pcmcia_device *p_dev, |
421 | cistpl_cftable_entry_t *cf, | 421 | cistpl_cftable_entry_t *cf, |
422 | cistpl_cftable_entry_t *dflt, | 422 | cistpl_cftable_entry_t *dflt, |
423 | unsigned int vcc, | ||
424 | void *priv_data) | 423 | void *priv_data) |
425 | { | 424 | { |
426 | int k; | 425 | int k; |
@@ -590,7 +589,6 @@ static int mot_setup(struct pcmcia_device *link) | |||
590 | static int smc_configcheck(struct pcmcia_device *p_dev, | 589 | static int smc_configcheck(struct pcmcia_device *p_dev, |
591 | cistpl_cftable_entry_t *cf, | 590 | cistpl_cftable_entry_t *cf, |
592 | cistpl_cftable_entry_t *dflt, | 591 | cistpl_cftable_entry_t *dflt, |
593 | unsigned int vcc, | ||
594 | void *priv_data) | 592 | void *priv_data) |
595 | { | 593 | { |
596 | p_dev->resource[0]->start = cf->io.win[0].base; | 594 | p_dev->resource[0]->start = cf->io.win[0].base; |
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 7a4a99b73d17..2bc2eb89c4cd 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
@@ -668,7 +668,6 @@ static int | |||
668 | xirc2ps_config_modem(struct pcmcia_device *p_dev, | 668 | xirc2ps_config_modem(struct pcmcia_device *p_dev, |
669 | cistpl_cftable_entry_t *cf, | 669 | cistpl_cftable_entry_t *cf, |
670 | cistpl_cftable_entry_t *dflt, | 670 | cistpl_cftable_entry_t *dflt, |
671 | unsigned int vcc, | ||
672 | void *priv_data) | 671 | void *priv_data) |
673 | { | 672 | { |
674 | unsigned int ioaddr; | 673 | unsigned int ioaddr; |
@@ -688,7 +687,6 @@ static int | |||
688 | xirc2ps_config_check(struct pcmcia_device *p_dev, | 687 | xirc2ps_config_check(struct pcmcia_device *p_dev, |
689 | cistpl_cftable_entry_t *cf, | 688 | cistpl_cftable_entry_t *cf, |
690 | cistpl_cftable_entry_t *dflt, | 689 | cistpl_cftable_entry_t *dflt, |
691 | unsigned int vcc, | ||
692 | void *priv_data) | 690 | void *priv_data) |
693 | { | 691 | { |
694 | int *pass = priv_data; | 692 | int *pass = priv_data; |
@@ -826,7 +824,8 @@ xirc2ps_config(struct pcmcia_device * link) | |||
826 | * the Mako if (on the first pass) the COR bit 5 is set. | 824 | * the Mako if (on the first pass) the COR bit 5 is set. |
827 | */ | 825 | */ |
828 | for (pass=0; pass < 2; pass++) | 826 | for (pass=0; pass < 2; pass++) |
829 | if (!pcmcia_loop_config(link, xirc2ps_config_check, &pass)) | 827 | if (!pcmcia_loop_config(link, xirc2ps_config_check, |
828 | &pass)) | ||
830 | goto port_found; | 829 | goto port_found; |
831 | /* if special option: | 830 | /* if special option: |
832 | * try to configure as Ethernet only. | 831 | * try to configure as Ethernet only. |
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index 5939d0c7a5c8..63bf662e9c7f 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c | |||
@@ -140,25 +140,11 @@ static void airo_detach(struct pcmcia_device *link) | |||
140 | static int airo_cs_config_check(struct pcmcia_device *p_dev, | 140 | static int airo_cs_config_check(struct pcmcia_device *p_dev, |
141 | cistpl_cftable_entry_t *cfg, | 141 | cistpl_cftable_entry_t *cfg, |
142 | cistpl_cftable_entry_t *dflt, | 142 | cistpl_cftable_entry_t *dflt, |
143 | unsigned int vcc, | ||
144 | void *priv_data) | 143 | void *priv_data) |
145 | { | 144 | { |
146 | if (cfg->index == 0) | 145 | if (cfg->index == 0) |
147 | return -ENODEV; | 146 | return -ENODEV; |
148 | 147 | ||
149 | /* Does this card need audio output? */ | ||
150 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) | ||
151 | p_dev->config_flags |= CONF_ENABLE_SPKR; | ||
152 | |||
153 | /* Use power settings for Vcc and Vpp if present */ | ||
154 | /* Note that the CIS values need to be rescaled */ | ||
155 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
156 | p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
157 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
158 | p_dev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
159 | |||
160 | p_dev->config_flags |= CONF_ENABLE_IRQ; | ||
161 | |||
162 | /* IO window settings */ | 148 | /* IO window settings */ |
163 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; | 149 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
164 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 150 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
@@ -193,6 +179,9 @@ static int airo_config(struct pcmcia_device *link) | |||
193 | 179 | ||
194 | dev_dbg(&link->dev, "airo_config\n"); | 180 | dev_dbg(&link->dev, "airo_config\n"); |
195 | 181 | ||
182 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP | | ||
183 | CONF_AUTO_AUDIO; | ||
184 | |||
196 | /* | 185 | /* |
197 | * In this loop, we scan the CIS for configuration table | 186 | * In this loop, we scan the CIS for configuration table |
198 | * entries, each of which describes a valid card | 187 | * entries, each of which describes a valid card |
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 080266eba985..812decd3fbe9 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c | |||
@@ -157,25 +157,11 @@ static int card_present(void *arg) | |||
157 | static int atmel_config_check(struct pcmcia_device *p_dev, | 157 | static int atmel_config_check(struct pcmcia_device *p_dev, |
158 | cistpl_cftable_entry_t *cfg, | 158 | cistpl_cftable_entry_t *cfg, |
159 | cistpl_cftable_entry_t *dflt, | 159 | cistpl_cftable_entry_t *dflt, |
160 | unsigned int vcc, | ||
161 | void *priv_data) | 160 | void *priv_data) |
162 | { | 161 | { |
163 | if (cfg->index == 0) | 162 | if (cfg->index == 0) |
164 | return -ENODEV; | 163 | return -ENODEV; |
165 | 164 | ||
166 | /* Does this card need audio output? */ | ||
167 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) | ||
168 | p_dev->config_flags |= CONF_ENABLE_SPKR; | ||
169 | |||
170 | /* Use power settings for Vcc and Vpp if present */ | ||
171 | /* Note that the CIS values need to be rescaled */ | ||
172 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
173 | p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
174 | else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
175 | p_dev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
176 | |||
177 | p_dev->config_flags |= CONF_ENABLE_IRQ; | ||
178 | |||
179 | /* IO window settings */ | 165 | /* IO window settings */ |
180 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; | 166 | p_dev->resource[0]->end = p_dev->resource[1]->end = 0; |
181 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { | 167 | if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) { |
@@ -207,6 +193,9 @@ static int atmel_config(struct pcmcia_device *link) | |||
207 | 193 | ||
208 | dev_dbg(&link->dev, "atmel_config\n"); | 194 | dev_dbg(&link->dev, "atmel_config\n"); |
209 | 195 | ||
196 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP | | ||
197 | CONF_AUTO_AUDIO; | ||
198 | |||
210 | /* | 199 | /* |
211 | In this loop, we scan the CIS for configuration table entries, | 200 | In this loop, we scan the CIS for configuration table entries, |
212 | each of which describes a valid card configuration, including | 201 | each of which describes a valid card configuration, including |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 5b0b5828b3cf..d4f19af1757f 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -472,7 +472,6 @@ static void prism2_detach(struct pcmcia_device *link) | |||
472 | static int prism2_config_check(struct pcmcia_device *p_dev, | 472 | static int prism2_config_check(struct pcmcia_device *p_dev, |
473 | cistpl_cftable_entry_t *cfg, | 473 | cistpl_cftable_entry_t *cfg, |
474 | cistpl_cftable_entry_t *dflt, | 474 | cistpl_cftable_entry_t *dflt, |
475 | unsigned int vcc, | ||
476 | void *priv_data) | 475 | void *priv_data) |
477 | { | 476 | { |
478 | if (cfg->index == 0) | 477 | if (cfg->index == 0) |
@@ -481,28 +480,6 @@ static int prism2_config_check(struct pcmcia_device *p_dev, | |||
481 | PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X " | 480 | PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X " |
482 | "(default 0x%02X)\n", cfg->index, dflt->index); | 481 | "(default 0x%02X)\n", cfg->index, dflt->index); |
483 | 482 | ||
484 | /* Does this card need audio output? */ | ||
485 | if (cfg->flags & CISTPL_CFTABLE_AUDIO) | ||
486 | p_dev->config_flags |= CONF_ENABLE_SPKR; | ||
487 | |||
488 | /* Use power settings for Vcc and Vpp if present */ | ||
489 | /* Note that the CIS values need to be rescaled */ | ||
490 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
491 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / | ||
492 | 10000 && !ignore_cis_vcc) { | ||
493 | PDEBUG(DEBUG_EXTRA, " Vcc mismatch - skipping" | ||
494 | " this entry\n"); | ||
495 | return -ENODEV; | ||
496 | } | ||
497 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
498 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / | ||
499 | 10000 && !ignore_cis_vcc) { | ||
500 | PDEBUG(DEBUG_EXTRA, " Vcc (default) mismatch " | ||
501 | "- skipping this entry\n"); | ||
502 | return -ENODEV; | ||
503 | } | ||
504 | } | ||
505 | |||
506 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 483 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
507 | p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 484 | p_dev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
508 | else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 485 | else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
@@ -553,6 +530,10 @@ static int prism2_config(struct pcmcia_device *link) | |||
553 | } | 530 | } |
554 | 531 | ||
555 | /* Look for an appropriate configuration table entry in the CIS */ | 532 | /* Look for an appropriate configuration table entry in the CIS */ |
533 | link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | | ||
534 | CONF_AUTO_CHECK_VCC; | ||
535 | if (ignore_cis_vcc) | ||
536 | link->config_flags &= ~CONF_AUTO_CHECK_VCC; | ||
556 | ret = pcmcia_loop_config(link, prism2_config_check, NULL); | 537 | ret = pcmcia_loop_config(link, prism2_config_check, NULL); |
557 | if (ret) { | 538 | if (ret) { |
558 | if (!ignore_cis_vcc) | 539 | if (!ignore_cis_vcc) |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 6020c19b1bdb..031f3e6da3c9 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
@@ -797,7 +797,6 @@ static void if_cs_release(struct pcmcia_device *p_dev) | |||
797 | static int if_cs_ioprobe(struct pcmcia_device *p_dev, | 797 | static int if_cs_ioprobe(struct pcmcia_device *p_dev, |
798 | cistpl_cftable_entry_t *cfg, | 798 | cistpl_cftable_entry_t *cfg, |
799 | cistpl_cftable_entry_t *dflt, | 799 | cistpl_cftable_entry_t *dflt, |
800 | unsigned int vcc, | ||
801 | void *priv_data) | 800 | void *priv_data) |
802 | { | 801 | { |
803 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; | 802 | p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO; |
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c index 00316a1a1092..b92173827b55 100644 --- a/drivers/net/wireless/orinoco/orinoco_cs.c +++ b/drivers/net/wireless/orinoco/orinoco_cs.c | |||
@@ -145,39 +145,11 @@ static void orinoco_cs_detach(struct pcmcia_device *link) | |||
145 | static int orinoco_cs_config_check(struct pcmcia_device *p_dev, | 145 | static int orinoco_cs_config_check(struct pcmcia_device *p_dev, |
146 | cistpl_cftable_entry_t *cfg, | 146 | cistpl_cftable_entry_t *cfg, |
147 | cistpl_cftable_entry_t *dflt, | 147 | cistpl_cftable_entry_t *dflt, |
148 | unsigned int vcc, | ||
149 | void *priv_data) | 148 | void *priv_data) |
150 | { | 149 | { |
151 | if (cfg->index == 0) | 150 | if (cfg->index == 0) |
152 | goto next_entry; | 151 | goto next_entry; |
153 | 152 | ||
154 | /* Use power settings for Vcc and Vpp if present */ | ||
155 | /* Note that the CIS values need to be rescaled */ | ||
156 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
157 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { | ||
158 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", | ||
159 | __func__, vcc, | ||
160 | cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
161 | if (!ignore_cis_vcc) | ||
162 | goto next_entry; | ||
163 | } | ||
164 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
165 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { | ||
166 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", | ||
167 | __func__, vcc, | ||
168 | dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
169 | if (!ignore_cis_vcc) | ||
170 | goto next_entry; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) | ||
175 | p_dev->vpp = | ||
176 | cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; | ||
177 | else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM)) | ||
178 | p_dev->vpp = | ||
179 | dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000; | ||
180 | |||
181 | /* Do we need to allocate an interrupt? */ | 153 | /* Do we need to allocate an interrupt? */ |
182 | p_dev->config_flags |= CONF_ENABLE_IRQ; | 154 | p_dev->config_flags |= CONF_ENABLE_IRQ; |
183 | 155 | ||
@@ -230,6 +202,9 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
230 | * and most client drivers will only use the CIS to fill in | 202 | * and most client drivers will only use the CIS to fill in |
231 | * implementation-defined details. | 203 | * implementation-defined details. |
232 | */ | 204 | */ |
205 | link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC; | ||
206 | if (ignore_cis_vcc) | ||
207 | link->config_flags &= ~CONF_AUTO_CHECK_VCC; | ||
233 | ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); | 208 | ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); |
234 | if (ret) { | 209 | if (ret) { |
235 | if (!ignore_cis_vcc) | 210 | if (!ignore_cis_vcc) |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index ca2c6c0c5576..f462c78856e9 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
@@ -207,32 +207,11 @@ static void spectrum_cs_detach(struct pcmcia_device *link) | |||
207 | static int spectrum_cs_config_check(struct pcmcia_device *p_dev, | 207 | static int spectrum_cs_config_check(struct pcmcia_device *p_dev, |
208 | cistpl_cftable_entry_t *cfg, | 208 | cistpl_cftable_entry_t *cfg, |
209 | cistpl_cftable_entry_t *dflt, | 209 | cistpl_cftable_entry_t *dflt, |
210 | unsigned int vcc, | ||
211 | void *priv_data) | 210 | void *priv_data) |
212 | { | 211 | { |
213 | if (cfg->index == 0) | 212 | if (cfg->index == 0) |
214 | goto next_entry; | 213 | goto next_entry; |
215 | 214 | ||
216 | /* Use power settings for Vcc and Vpp if present */ | ||
217 | /* Note that the CIS values need to be rescaled */ | ||
218 | if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
219 | if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { | ||
220 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", | ||
221 | __func__, vcc, | ||
222 | cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
223 | if (!ignore_cis_vcc) | ||
224 | goto next_entry; | ||
225 | } | ||
226 | } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { | ||
227 | if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000) { | ||
228 | DEBUG(2, "%s: Vcc mismatch (vcc = %d, CIS = %d)\n", | ||
229 | __func__, vcc, | ||
230 | dflt->vcc.param[CISTPL_POWER_VNOM] / 10000); | ||
231 | if (!ignore_cis_vcc) | ||
232 | goto next_entry; | ||
233 | } | ||
234 | } | ||
235 | |||
236 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 215 | if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
237 | p_dev->vpp = | 216 | p_dev->vpp = |
238 | cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 217 | cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
@@ -292,6 +271,9 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
292 | * and most client drivers will only use the CIS to fill in | 271 | * and most client drivers will only use the CIS to fill in |
293 | * implementation-defined details. | 272 | * implementation-defined details. |
294 | */ | 273 | */ |
274 | link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC; | ||
275 | if (ignore_cis_vcc) | ||
276 | link->config_flags &= ~CONF_AUTO_CHECK_VCC; | ||
295 | ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL); | 277 | ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL); |
296 | if (ret) { | 278 | if (ret) { |
297 | if (!ignore_cis_vcc) | 279 | if (!ignore_cis_vcc) |