diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-13 14:12:40 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-13 14:12:40 -0700 | 
| commit | 2be4ff2f084842839b041b793ed6237e8d1d315a (patch) | |
| tree | 1d776ac1717edeff4ee7d59ab0aea2782cb86dba /drivers/net/wireless/hostap/hostap_cs.c | |
| parent | cf2fa66055d718ae13e62451bb546505f63906a2 (diff) | |
| parent | a45b3fb19ba1e4dfc3fc53563a072612092930a9 (diff) | |
| download | olio-linux-3.10-2be4ff2f084842839b041b793ed6237e8d1d315a.tar.xz olio-linux-3.10-2be4ff2f084842839b041b793ed6237e8d1d315a.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6: (49 commits)
  pcmcia: ioctl-internal definitions
  pcmcia: cistpl header cleanup
  pcmcia: remove unused argument to pcmcia_parse_tuple()
  pcmcia: card services header cleanup
  pcmcia: device_id header cleanup
  pcmcia: encapsulate ioaddr_t
  pcmcia: cleanup device driver header file
  pcmcia: cleanup socket services header file
  pcmcia: merge ds_internal.h into cs_internal.h
  pcmcia: cleanup cs_internal.h
  pcmcia: cs_internal.h is internal
  pcmcia: use dev_printk for cs_error()
  pcmcia: remove CS_ error codes alltogether
  pcmcia: deprecate CS_BAD_TUPLE
  pcmcia: deprecate CS_BAD_ARGS
  pcmcia: deprecate CS_BAD_BASE, CS_BAD_IRQ, CS_BAD_OFFSET and CS_BAD_SIZE
  pcmcia: deprecate CS_BAD_ATTRIBUTE, CS_BAD_TYPE and CS_BAD_PAGE
  pcmcia: deprecate CS_NO_MORE_ITEMS
  pcmcia: deprecate CS_IN_USE
  pcmcia: deprecate CS_CONFIGURATION_LOCKED
  ...
Fix trivial conflict in drivers/pcmcia/ds.c manually
Diffstat (limited to 'drivers/net/wireless/hostap/hostap_cs.c')
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 237 | 
1 files changed, 104 insertions, 133 deletions
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 3b4e55cf33c..63374027735 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c @@ -234,7 +234,7 @@ static void sandisk_set_iobase(local_info_t *local)  	reg.Value = hw_priv->link->io.BasePort1 & 0x00ff;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 0 -"  		       " res=%d\n", res);  	} @@ -246,7 +246,7 @@ static void sandisk_set_iobase(local_info_t *local)  	reg.Value = (hw_priv->link->io.BasePort1 & 0xff00) >> 8;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "Prism3 SanDisk - failed to set I/O base 1 -"  		       " res=%d\n", res);  	} @@ -305,7 +305,7 @@ static int sandisk_enable_wireless(struct net_device *dev)  	tuple.DesiredTuple = CISTPL_LONGLINK_MFC;  	if (pcmcia_get_first_tuple(hw_priv->link, &tuple) ||  	    pcmcia_get_tuple_data(hw_priv->link, &tuple) || -	    pcmcia_parse_tuple(hw_priv->link, &tuple, parse) || +	    pcmcia_parse_tuple(&tuple, parse) ||  		parse->longlink_mfc.nfn < 2) {  		/* No multi-function links found */  		ret = -ENODEV; @@ -322,7 +322,7 @@ static int sandisk_enable_wireless(struct net_device *dev)  	reg.Value = COR_SOFT_RESET;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",  		       dev->name, res);  		goto done; @@ -339,7 +339,7 @@ static int sandisk_enable_wireless(struct net_device *dev)  	reg.Value = COR_LEVEL_REQ | 0x8 | COR_ADDR_DECODE | COR_FUNC_ENA;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "%s: SanDisk - COR sreset failed (%d)\n",  		       dev->name, res);  		goto done; @@ -374,7 +374,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local)  	reg.Value = 0;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 1 (%d)\n",  		       res);  		return; @@ -386,7 +386,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local)  	reg.Value |= COR_SOFT_RESET;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 2 (%d)\n",  		       res);  		return; @@ -399,7 +399,7 @@ static void prism2_pccard_cor_sreset(local_info_t *local)  		reg.Value |= COR_IREQ_ENA;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_cor_sreset failed 3 (%d)\n",  		       res);  		return; @@ -433,7 +433,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)  	reg.Value = 0;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 1 "  		       "(%d)\n", res);  		return; @@ -446,7 +446,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)  	reg.Value |= COR_SOFT_RESET;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 2 "  		       "(%d)\n", res);  		return; @@ -460,7 +460,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)  	reg.Offset = CISREG_CCSR;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 3 "  		       "(%d)\n", res);  		return; @@ -472,7 +472,7 @@ static void prism2_pccard_genesis_reset(local_info_t *local, int hcr)  	reg.Value = old_cor & ~COR_SOFT_RESET;  	res = pcmcia_access_configuration_register(hw_priv->link,  						   ®); -	if (res != CS_SUCCESS) { +	if (res != 0) {  		printk(KERN_DEBUG "prism2_pccard_genesis_sreset failed 4 "  		       "(%d)\n", res);  		return; @@ -532,145 +532,118 @@ static void prism2_detach(struct pcmcia_device *link)  #define CS_CHECK(fn, ret) \  do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) -#define CFG_CHECK2(fn, retf) \ -do { int _ret = (retf); \ -if (_ret != 0) { \ -	PDEBUG(DEBUG_EXTRA, "CardServices(" #fn ") returned %d\n", _ret); \ -	cs_error(link, fn, _ret); \ -	goto next_entry; \ -} \ -} while (0) -  /* run after a CARD_INSERTION event is received to configure the PCMCIA   * socket and make the device available to the system */ + +static int prism2_config_check(struct pcmcia_device *p_dev, +			       cistpl_cftable_entry_t *cfg, +			       cistpl_cftable_entry_t *dflt, +			       unsigned int vcc, +			       void *priv_data) +{ +	if (cfg->index == 0) +		return -ENODEV; + +	PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X " +	       "(default 0x%02X)\n", cfg->index, dflt->index); + +	/* Does this card need audio output? */ +	if (cfg->flags & CISTPL_CFTABLE_AUDIO) { +		p_dev->conf.Attributes |= CONF_ENABLE_SPKR; +		p_dev->conf.Status = CCSR_AUDIO_ENA; +	} + +	/* 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 (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / +		    10000 && !ignore_cis_vcc) { +			PDEBUG(DEBUG_EXTRA, "  Vcc mismatch - skipping" +			       " this entry\n"); +			return -ENODEV; +		} +	} else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) { +		if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / +		    10000 && !ignore_cis_vcc) { +			PDEBUG(DEBUG_EXTRA, "  Vcc (default) mismatch " +			       "- skipping this entry\n"); +			return -ENODEV; +		} +	} + +	if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) +		p_dev->conf.Vpp = cfg->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 || 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, +		 * but it does not work without interrupts.. */ +		printk(KERN_WARNING "Config has no IRQ info, but trying to " +		       "enable IRQ anyway..\n"); +		p_dev->conf.Attributes |= CONF_ENABLE_IRQ; +	} + +	/* IO window settings */ +	PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d " +	       "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) || (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, +		       io->win[0].base, io->win[0].len); +		if (!(io->flags & CISTPL_IO_8BIT)) +			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16; +		if (!(io->flags & CISTPL_IO_16BIT)) +			p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8; +		p_dev->io.IOAddrLines = io->flags & +			CISTPL_IO_LINES_MASK; +		p_dev->io.BasePort1 = io->win[0].base; +		p_dev->io.NumPorts1 = io->win[0].len; +		if (io->nwin > 1) { +			p_dev->io.Attributes2 = p_dev->io.Attributes1; +			p_dev->io.BasePort2 = io->win[1].base; +			p_dev->io.NumPorts2 = io->win[1].len; +		} +	} + +	/* This reserves IO space but doesn't actually enable it */ +	return pcmcia_request_io(p_dev, &p_dev->io); +} +  static int prism2_config(struct pcmcia_device *link)  {  	struct net_device *dev;  	struct hostap_interface *iface;  	local_info_t *local;  	int ret = 1; -	tuple_t tuple; -	cisparse_t *parse;  	int last_fn, last_ret; -	u_char buf[64]; -	config_info_t conf; -	cistpl_cftable_entry_t dflt = { 0 };  	struct hostap_cs_priv *hw_priv;  	PDEBUG(DEBUG_FLOW, "prism2_config()\n"); -	parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL);  	hw_priv = kzalloc(sizeof(*hw_priv), GFP_KERNEL); -	if (parse == NULL || hw_priv == NULL) { +	if (hw_priv == NULL) {  		ret = -ENOMEM;  		goto failed;  	} -	tuple.Attributes = 0; -	tuple.TupleData = buf; -	tuple.TupleDataMax = sizeof(buf); -	tuple.TupleOffset = 0; - -	CS_CHECK(GetConfigurationInfo, -		 pcmcia_get_configuration_info(link, &conf)); -  	/* Look for an appropriate configuration table entry in the CIS */ -	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; -	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple)); -	for (;;) { -		cistpl_cftable_entry_t *cfg = &(parse->cftable_entry); -		CFG_CHECK2(GetTupleData, -			   pcmcia_get_tuple_data(link, &tuple)); -		CFG_CHECK2(ParseTuple, -			   pcmcia_parse_tuple(link, &tuple, parse)); - -		if (cfg->flags & CISTPL_CFTABLE_DEFAULT) -			dflt = *cfg; -		if (cfg->index == 0) -			goto next_entry; -		link->conf.ConfigIndex = cfg->index; -		PDEBUG(DEBUG_EXTRA, "Checking CFTABLE_ENTRY 0x%02X " -		       "(default 0x%02X)\n", cfg->index, dflt.index); - -		/* Does this card need audio output? */ -		if (cfg->flags & CISTPL_CFTABLE_AUDIO) { -			link->conf.Attributes |= CONF_ENABLE_SPKR; -			link->conf.Status = CCSR_AUDIO_ENA; -		} - -		/* 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 (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / -			    10000 && !ignore_cis_vcc) { -				PDEBUG(DEBUG_EXTRA, "  Vcc mismatch - skipping" -				       " this entry\n"); -				goto next_entry; -			} -		} else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) { -			if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / -			    10000 && !ignore_cis_vcc) { -				PDEBUG(DEBUG_EXTRA, "  Vcc (default) mismatch " -				       "- skipping this entry\n"); -				goto next_entry; -			} -		} - -		if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM)) -			link->conf.Vpp = -				cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000; -		else if (dflt.vpp1.present & (1 << CISTPL_POWER_VNOM)) -			link->conf.Vpp = -				dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000; - -		/* Do we need to allocate an interrupt? */ -		if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) -			link->conf.Attributes |= CONF_ENABLE_IRQ; -		else if (!(link->conf.Attributes & CONF_ENABLE_IRQ)) { -			/* At least Compaq WL200 does not have IRQInfo1 set, -			 * but it does not work without interrupts.. */ -			printk("Config has no IRQ info, but trying to enable " -			       "IRQ anyway..\n"); -			link->conf.Attributes |= CONF_ENABLE_IRQ; -		} - -		/* IO window settings */ -		PDEBUG(DEBUG_EXTRA, "IO window settings: cfg->io.nwin=%d " -		       "dflt.io.nwin=%d\n", -		       cfg->io.nwin, dflt.io.nwin); -		link->io.NumPorts1 = link->io.NumPorts2 = 0; -		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { -			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; -			link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; -			PDEBUG(DEBUG_EXTRA, "io->flags = 0x%04X, " -			       "io.base=0x%04x, len=%d\n", io->flags, -			       io->win[0].base, io->win[0].len); -			if (!(io->flags & CISTPL_IO_8BIT)) -				link->io.Attributes1 = IO_DATA_PATH_WIDTH_16; -			if (!(io->flags & CISTPL_IO_16BIT)) -				link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; -			link->io.IOAddrLines = io->flags & -				CISTPL_IO_LINES_MASK; -			link->io.BasePort1 = io->win[0].base; -			link->io.NumPorts1 = io->win[0].len; -			if (io->nwin > 1) { -				link->io.Attributes2 = link->io.Attributes1; -				link->io.BasePort2 = io->win[1].base; -				link->io.NumPorts2 = io->win[1].len; -			} -		} - -		/* This reserves IO space but doesn't actually enable it */ -		CFG_CHECK2(RequestIO, -			   pcmcia_request_io(link, &link->io)); - -		/* This configuration table entry is OK */ -		break; - -	next_entry: -		CS_CHECK(GetNextTuple, -			 pcmcia_get_next_tuple(link, &tuple)); +	last_ret = pcmcia_loop_config(link, prism2_config_check, NULL); +	if (last_ret) { +		if (!ignore_cis_vcc) +			printk(KERN_ERR "GetNextTuple(): No matching " +			       "CIS configuration.  Maybe you need the " +			       "ignore_cis_vcc=1 parameter.\n"); +		cs_error(link, RequestIO, last_ret); +		goto failed;  	}  	/* Need to allocate net_device before requesting IRQ handler */ @@ -738,14 +711,12 @@ static int prism2_config(struct pcmcia_device *link)  		if (ret == 0 && local->ddev)  			strcpy(hw_priv->node.dev_name, local->ddev->name);  	} -	kfree(parse);  	return ret;   cs_failed:  	cs_error(link, last_fn, last_ret);   failed: -	kfree(parse);  	kfree(hw_priv);  	prism2_release((u_long)link);  	return ret;  |