Merge branch 'for-rmk' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux...
[linux-2.6-block.git] / drivers / net / wireless / airo_cs.c
CommitLineData
1da177e4
LT
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
05c9a4cf
JD
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20
1da177e4
LT
21======================================================================*/
22
1da177e4
LT
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
1da177e4
LT
35#include <pcmcia/cistpl.h>
36#include <pcmcia/cisreg.h>
37#include <pcmcia/ds.h>
38
05c9a4cf 39#include <linux/io.h>
1da177e4
LT
40#include <asm/system.h>
41
d3808760
AB
42#include "airo.h"
43
1da177e4
LT
44
45/*====================================================================*/
46
47MODULE_AUTHOR("Benjamin Reed");
05c9a4cf
JD
48MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet "
49 "cards. This is the module that links the PCMCIA card "
50 "with the airo module.");
1da177e4
LT
51MODULE_LICENSE("Dual BSD/GPL");
52MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340 PCMCIA cards");
53
54/*====================================================================*/
55
15b99ac1 56static int airo_config(struct pcmcia_device *link);
fba395ee 57static void airo_release(struct pcmcia_device *link);
1da177e4 58
cc3b4866 59static void airo_detach(struct pcmcia_device *p_dev);
1da177e4 60
1da177e4 61typedef struct local_info_t {
1da177e4
LT
62 struct net_device *eth_dev;
63} local_info_t;
64
15b99ac1 65static int airo_probe(struct pcmcia_device *p_dev)
1da177e4 66{
1da177e4 67 local_info_t *local;
f8cfa618 68
2caff147 69 dev_dbg(&p_dev->dev, "airo_attach()\n");
1da177e4 70
1da177e4 71 /* Allocate space for private device-specific data */
b69a3aa8 72 local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
1da177e4
LT
73 if (!local) {
74 printk(KERN_ERR "airo_cs: no memory for new device\n");
f8cfa618 75 return -ENOMEM;
1da177e4 76 }
fd238232 77 p_dev->priv = local;
f8cfa618 78
15b99ac1 79 return airo_config(p_dev);
1da177e4
LT
80} /* airo_attach */
81
fba395ee 82static void airo_detach(struct pcmcia_device *link)
1da177e4 83{
2caff147 84 dev_dbg(&link->dev, "airo_detach\n");
b4635811 85
e2d40963 86 airo_release(link);
b4635811 87
05c9a4cf
JD
88 if (((local_info_t *)link->priv)->eth_dev) {
89 stop_airo_card(((local_info_t *)link->priv)->eth_dev, 0);
1da177e4 90 }
05c9a4cf 91 ((local_info_t *)link->priv)->eth_dev = NULL;
cc3b4866 92
b4558ea9 93 kfree(link->priv);
1da177e4
LT
94} /* airo_detach */
95
00990e7c 96static int airo_cs_config_check(struct pcmcia_device *p_dev, void *priv_data)
b54bf94b 97{
00990e7c
DB
98 if (p_dev->config_index == 0)
99 return -EINVAL;
b54bf94b 100
00990e7c 101 return pcmcia_request_io(p_dev);
b54bf94b
DB
102}
103
104
15b99ac1 105static int airo_config(struct pcmcia_device *link)
1da177e4 106{
1da177e4 107 local_info_t *dev;
2caff147 108 int ret;
fba395ee 109
1da177e4
LT
110 dev = link->priv;
111
2caff147 112 dev_dbg(&link->dev, "airo_config\n");
e2d40963 113
440eed43 114 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP |
00990e7c 115 CONF_AUTO_AUDIO | CONF_AUTO_SET_IO;
440eed43 116
0f52e86d 117 ret = pcmcia_loop_config(link, airo_cs_config_check, NULL);
2caff147 118 if (ret)
b54bf94b
DB
119 goto failed;
120
eb14120f
DB
121 if (!link->irq)
122 goto failed;
05c9a4cf 123
1ac71e5a 124 ret = pcmcia_enable_device(link);
2caff147
DB
125 if (ret)
126 goto failed;
05c9a4cf 127 ((local_info_t *)link->priv)->eth_dev =
eb14120f 128 init_airo_card(link->irq,
9a017a91 129 link->resource[0]->start, 1, &link->dev);
05c9a4cf 130 if (!((local_info_t *)link->priv)->eth_dev)
2caff147 131 goto failed;
05c9a4cf 132
15b99ac1
DB
133 return 0;
134
b54bf94b 135 failed:
1da177e4 136 airo_release(link);
15b99ac1 137 return -ENODEV;
1da177e4
LT
138} /* airo_config */
139
fba395ee 140static void airo_release(struct pcmcia_device *link)
1da177e4 141{
2caff147 142 dev_dbg(&link->dev, "airo_release\n");
fba395ee 143 pcmcia_disable_device(link);
1da177e4
LT
144}
145
fba395ee 146static int airo_suspend(struct pcmcia_device *link)
98e4c28b 147{
98e4c28b
DB
148 local_info_t *local = link->priv;
149
e2d40963 150 netif_device_detach(local->eth_dev);
98e4c28b
DB
151
152 return 0;
153}
154
fba395ee 155static int airo_resume(struct pcmcia_device *link)
98e4c28b 156{
98e4c28b
DB
157 local_info_t *local = link->priv;
158
e2d40963 159 if (link->open) {
98e4c28b
DB
160 reset_airo_card(local->eth_dev);
161 netif_device_attach(local->eth_dev);
162 }
163
164 return 0;
165}
166
7018d06d
DB
167static struct pcmcia_device_id airo_ids[] = {
168 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a),
169 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005),
170 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007),
171 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0007),
172 PCMCIA_DEVICE_NULL,
173};
174MODULE_DEVICE_TABLE(pcmcia, airo_ids);
175
1da177e4
LT
176static struct pcmcia_driver airo_driver = {
177 .owner = THIS_MODULE,
2e9b981a 178 .name = "airo_cs",
15b99ac1 179 .probe = airo_probe,
cc3b4866 180 .remove = airo_detach,
7018d06d 181 .id_table = airo_ids,
98e4c28b
DB
182 .suspend = airo_suspend,
183 .resume = airo_resume,
1da177e4
LT
184};
185
06b3a1d1 186static int __init airo_cs_init(void)
1da177e4
LT
187{
188 return pcmcia_register_driver(&airo_driver);
189}
190
06b3a1d1 191static void __exit airo_cs_cleanup(void)
1da177e4
LT
192{
193 pcmcia_unregister_driver(&airo_driver);
1da177e4
LT
194}
195
196/*
197 This program is free software; you can redistribute it and/or
198 modify it under the terms of the GNU General Public License
199 as published by the Free Software Foundation; either version 2
200 of the License, or (at your option) any later version.
201
202 This program is distributed in the hope that it will be useful,
203 but WITHOUT ANY WARRANTY; without even the implied warranty of
204 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
205 GNU General Public License for more details.
206
207 In addition:
208
209 Redistribution and use in source and binary forms, with or without
210 modification, are permitted provided that the following conditions
211 are met:
212
213 1. Redistributions of source code must retain the above copyright
214 notice, this list of conditions and the following disclaimer.
215 2. Redistributions in binary form must reproduce the above copyright
216 notice, this list of conditions and the following disclaimer in the
217 documentation and/or other materials provided with the distribution.
218 3. The name of the author may not be used to endorse or promote
219 products derived from this software without specific prior written
220 permission.
221
222 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
223 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
224 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
225 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
226 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
227 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
228 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
229 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
230 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
231 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
05c9a4cf 232 POSSIBILITY OF SUCH DAMAGE.
1da177e4
LT
233*/
234
235module_init(airo_cs_init);
236module_exit(airo_cs_cleanup);