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