• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/net/wireless/
1/*======================================================================
2
3    Aironet driver for 4500 and 4800 series cards
4
5    This code is released under both the GPL version 2 and BSD licenses.
6    Either license may be used.  The respective licenses are found at
7    the end of this file.
8
9    This code was developed by Benjamin Reed <breed@users.sourceforge.net>
10    including portions of which come from the Aironet PC4500
11    Developer's Reference Manual and used with permission.  Copyright
12    (C) 1999 Benjamin Reed.  All Rights Reserved.  Permission to use
13    code in the Developer's manual was granted for this driver by
14    Aironet.
15
16    In addition this module was derived from dummy_cs.
17    The initial developer of dummy_cs is David A. Hinds
18    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds
19    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.
20
21======================================================================*/
22
23#ifdef __IN_PCMCIA_PACKAGE__
24#include <pcmcia/k_compat.h>
25#endif
26#include <linux/init.h>
27#include <linux/kernel.h>
28#include <linux/module.h>
29#include <linux/ptrace.h>
30#include <linux/slab.h>
31#include <linux/string.h>
32#include <linux/timer.h>
33#include <linux/netdevice.h>
34
35#include <pcmcia/cs.h>
36#include <pcmcia/cistpl.h>
37#include <pcmcia/cisreg.h>
38#include <pcmcia/ds.h>
39
40#include <linux/io.h>
41#include <asm/system.h>
42
43#include "airo.h"
44
45
46/*====================================================================*/
47
48MODULE_AUTHOR("Benjamin Reed");
49MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet "
50		   "cards.  This is the module that links the PCMCIA card "
51		   "with the airo module.");
52MODULE_LICENSE("Dual BSD/GPL");
53MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340 PCMCIA cards");
54
55/*====================================================================*/
56
57/*
58   The event() function is this driver's Card Services event handler.
59   It will be called by Card Services when an appropriate card status
60   event is received.  The config() and release() entry points are
61   used to configure or release a socket, in response to card
62   insertion and ejection events.  They are invoked from the airo_cs
63   event handler.
64*/
65
66static int airo_config(struct pcmcia_device *link);
67static void airo_release(struct pcmcia_device *link);
68
69/*
70   The attach() and detach() entry points are used to create and destroy
71   "instances" of the driver, where each instance represents everything
72   needed to manage one actual PCMCIA card.
73*/
74
75static void airo_detach(struct pcmcia_device *p_dev);
76
77typedef struct local_info_t {
78	struct net_device *eth_dev;
79} local_info_t;
80
81/*======================================================================
82
83  airo_attach() creates an "instance" of the driver, allocating
84  local data structures for one device.  The device is registered
85  with Card Services.
86
87  The dev_link structure is initialized, but we don't actually
88  configure the card at this point -- we wait until we receive a
89  card insertion event.
90
91  ======================================================================*/
92
93static int airo_probe(struct pcmcia_device *p_dev)
94{
95	local_info_t *local;
96
97	dev_dbg(&p_dev->dev, "airo_attach()\n");
98
99	/*
100	  General socket configuration defaults can go here.  In this
101	  client, we assume very little, and rely on the CIS for almost
102	  everything.  In most clients, many details (i.e., number, sizes,
103	  and attributes of IO windows) are fixed by the nature of the
104	  device, and can be hard-wired here.
105	*/
106	p_dev->conf.Attributes = 0;
107	p_dev->conf.IntType = INT_MEMORY_AND_IO;
108
109	/* Allocate space for private device-specific data */
110	local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
111	if (!local) {
112		printk(KERN_ERR "airo_cs: no memory for new device\n");
113		return -ENOMEM;
114	}
115	p_dev->priv = local;
116
117	return airo_config(p_dev);
118} /* airo_attach */
119
120/*======================================================================
121
122  This deletes a driver "instance".  The device is de-registered
123  with Card Services.  If it has been released, all local data
124  structures are freed.  Otherwise, the structures will be freed
125  when the device is released.
126
127  ======================================================================*/
128
129static void airo_detach(struct pcmcia_device *link)
130{
131	dev_dbg(&link->dev, "airo_detach\n");
132
133	airo_release(link);
134
135	if (((local_info_t *)link->priv)->eth_dev) {
136		stop_airo_card(((local_info_t *)link->priv)->eth_dev, 0);
137	}
138	((local_info_t *)link->priv)->eth_dev = NULL;
139
140	kfree(link->priv);
141} /* airo_detach */
142
143/*======================================================================
144
145  airo_config() is scheduled to run after a CARD_INSERTION event
146  is received, to configure the PCMCIA socket, and to make the
147  device available to the system.
148
149  ======================================================================*/
150
151static int airo_cs_config_check(struct pcmcia_device *p_dev,
152				cistpl_cftable_entry_t *cfg,
153				cistpl_cftable_entry_t *dflt,
154				unsigned int vcc,
155				void *priv_data)
156{
157	if (cfg->index == 0)
158		return -ENODEV;
159
160	/* Does this card need audio output? */
161	if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
162		p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
163		p_dev->conf.Status = CCSR_AUDIO_ENA;
164	}
165
166	/* Use power settings for Vcc and Vpp if present */
167	/*  Note that the CIS values need to be rescaled */
168	if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
169		p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
170	else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
171		p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
172
173	p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
174
175	/* IO window settings */
176	p_dev->resource[0]->end = p_dev->resource[1]->end = 0;
177	if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
178		cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
179		p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
180		p_dev->resource[0]->flags |=
181					pcmcia_io_cfg_data_width(io->flags);
182		p_dev->resource[0]->start = io->win[0].base;
183		p_dev->resource[0]->end = io->win[0].len;
184		if (io->nwin > 1) {
185			p_dev->resource[1]->flags = p_dev->resource[0]->flags;
186			p_dev->resource[1]->start = io->win[1].base;
187			p_dev->resource[1]->end = io->win[1].len;
188		}
189	}
190
191	/* This reserves IO space but doesn't actually enable it */
192	if (pcmcia_request_io(p_dev) != 0)
193		return -ENODEV;
194
195	/* If we got this far, we're cool! */
196	return 0;
197}
198
199
200static int airo_config(struct pcmcia_device *link)
201{
202	local_info_t *dev;
203	int ret;
204
205	dev = link->priv;
206
207	dev_dbg(&link->dev, "airo_config\n");
208
209	/*
210	 * In this loop, we scan the CIS for configuration table
211	 * entries, each of which describes a valid card
212	 * configuration, including voltage, IO window, memory window,
213	 * and interrupt settings.
214	 *
215	 * We make no assumptions about the card to be configured: we
216	 * use just the information available in the CIS.  In an ideal
217	 * world, this would work for any PCMCIA card, but it requires
218	 * a complete and accurate CIS.  In practice, a driver usually
219	 * "knows" most of these things without consulting the CIS,
220	 * and most client drivers will only use the CIS to fill in
221	 * implementation-defined details.
222	 */
223	ret = pcmcia_loop_config(link, airo_cs_config_check, NULL);
224	if (ret)
225		goto failed;
226
227	if (!link->irq)
228		goto failed;
229
230	/*
231	  This actually configures the PCMCIA socket -- setting up
232	  the I/O windows and the interrupt mapping, and putting the
233	  card and host interface into "Memory and IO" mode.
234	*/
235	ret = pcmcia_request_configuration(link, &link->conf);
236	if (ret)
237		goto failed;
238	((local_info_t *)link->priv)->eth_dev =
239		init_airo_card(link->irq,
240			       link->resource[0]->start, 1, &link->dev);
241	if (!((local_info_t *)link->priv)->eth_dev)
242		goto failed;
243
244	/* Finally, report what we've done */
245	dev_info(&link->dev, "index 0x%02x: ",
246	       link->conf.ConfigIndex);
247	if (link->conf.Vpp)
248		printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
249	printk(", irq %d", link->irq);
250	if (link->resource[0])
251		printk(" & %pR", link->resource[0]);
252	if (link->resource[1])
253		printk(" & %pR", link->resource[1]);
254	printk("\n");
255	return 0;
256
257 failed:
258	airo_release(link);
259	return -ENODEV;
260} /* airo_config */
261
262/*======================================================================
263
264  After a card is removed, airo_release() will unregister the
265  device, and release the PCMCIA configuration.  If the device is
266  still open, this will be postponed until it is closed.
267
268  ======================================================================*/
269
270static void airo_release(struct pcmcia_device *link)
271{
272	dev_dbg(&link->dev, "airo_release\n");
273	pcmcia_disable_device(link);
274}
275
276static int airo_suspend(struct pcmcia_device *link)
277{
278	local_info_t *local = link->priv;
279
280	netif_device_detach(local->eth_dev);
281
282	return 0;
283}
284
285static int airo_resume(struct pcmcia_device *link)
286{
287	local_info_t *local = link->priv;
288
289	if (link->open) {
290		reset_airo_card(local->eth_dev);
291		netif_device_attach(local->eth_dev);
292	}
293
294	return 0;
295}
296
297static struct pcmcia_device_id airo_ids[] = {
298	PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a),
299	PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005),
300	PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007),
301	PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0007),
302	PCMCIA_DEVICE_NULL,
303};
304MODULE_DEVICE_TABLE(pcmcia, airo_ids);
305
306static struct pcmcia_driver airo_driver = {
307	.owner		= THIS_MODULE,
308	.drv		= {
309		.name	= "airo_cs",
310	},
311	.probe		= airo_probe,
312	.remove		= airo_detach,
313	.id_table       = airo_ids,
314	.suspend	= airo_suspend,
315	.resume		= airo_resume,
316};
317
318static int airo_cs_init(void)
319{
320	return pcmcia_register_driver(&airo_driver);
321}
322
323static void airo_cs_cleanup(void)
324{
325	pcmcia_unregister_driver(&airo_driver);
326}
327
328/*
329    This program is free software; you can redistribute it and/or
330    modify it under the terms of the GNU General Public License
331    as published by the Free Software Foundation; either version 2
332    of the License, or (at your option) any later version.
333
334    This program is distributed in the hope that it will be useful,
335    but WITHOUT ANY WARRANTY; without even the implied warranty of
336    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
337    GNU General Public License for more details.
338
339    In addition:
340
341    Redistribution and use in source and binary forms, with or without
342    modification, are permitted provided that the following conditions
343    are met:
344
345    1. Redistributions of source code must retain the above copyright
346       notice, this list of conditions and the following disclaimer.
347    2. Redistributions in binary form must reproduce the above copyright
348       notice, this list of conditions and the following disclaimer in the
349       documentation and/or other materials provided with the distribution.
350    3. The name of the author may not be used to endorse or promote
351       products derived from this software without specific prior written
352       permission.
353
354    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
355    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
356    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
357    ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
358    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
359    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
360    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
361    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
362    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
363    IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
364    POSSIBILITY OF SUCH DAMAGE.
365*/
366
367module_init(airo_cs_init);
368module_exit(airo_cs_cleanup);
369