]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/net/wireless/airo_cs.c
pcmcia: dev_node removal (drivers with updated printk call)
[mirror_ubuntu-artful-kernel.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/cs_types.h>
36#include <pcmcia/cs.h>
37#include <pcmcia/cistpl.h>
38#include <pcmcia/cisreg.h>
39#include <pcmcia/ds.h>
40
05c9a4cf 41#include <linux/io.h>
1da177e4
LT
42#include <asm/system.h>
43
d3808760
AB
44#include "airo.h"
45
1da177e4
LT
46
47/*====================================================================*/
48
49MODULE_AUTHOR("Benjamin Reed");
05c9a4cf
JD
50MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet "
51 "cards. This is the module that links the PCMCIA card "
52 "with the airo module.");
1da177e4
LT
53MODULE_LICENSE("Dual BSD/GPL");
54MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340 PCMCIA cards");
55
56/*====================================================================*/
57
58/*
59 The event() function is this driver's Card Services event handler.
60 It will be called by Card Services when an appropriate card status
61 event is received. The config() and release() entry points are
62 used to configure or release a socket, in response to card
63 insertion and ejection events. They are invoked from the airo_cs
05c9a4cf 64 event handler.
1da177e4
LT
65*/
66
15b99ac1 67static int airo_config(struct pcmcia_device *link);
fba395ee 68static void airo_release(struct pcmcia_device *link);
1da177e4
LT
69
70/*
71 The attach() and detach() entry points are used to create and destroy
72 "instances" of the driver, where each instance represents everything
73 needed to manage one actual PCMCIA card.
74*/
75
cc3b4866 76static void airo_detach(struct pcmcia_device *p_dev);
1da177e4 77
1da177e4 78typedef struct local_info_t {
1da177e4
LT
79 struct net_device *eth_dev;
80} local_info_t;
81
82/*======================================================================
05c9a4cf 83
1da177e4
LT
84 airo_attach() creates an "instance" of the driver, allocating
85 local data structures for one device. The device is registered
86 with Card Services.
05c9a4cf 87
1da177e4
LT
88 The dev_link structure is initialized, but we don't actually
89 configure the card at this point -- we wait until we receive a
90 card insertion event.
05c9a4cf 91
1da177e4
LT
92 ======================================================================*/
93
15b99ac1 94static int airo_probe(struct pcmcia_device *p_dev)
1da177e4 95{
1da177e4 96 local_info_t *local;
f8cfa618 97
2caff147 98 dev_dbg(&p_dev->dev, "airo_attach()\n");
1da177e4 99
1da177e4
LT
100 /*
101 General socket configuration defaults can go here. In this
102 client, we assume very little, and rely on the CIS for almost
103 everything. In most clients, many details (i.e., number, sizes,
104 and attributes of IO windows) are fixed by the nature of the
105 device, and can be hard-wired here.
106 */
fd238232
DB
107 p_dev->conf.Attributes = 0;
108 p_dev->conf.IntType = INT_MEMORY_AND_IO;
05c9a4cf 109
1da177e4 110 /* Allocate space for private device-specific data */
b69a3aa8 111 local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
1da177e4
LT
112 if (!local) {
113 printk(KERN_ERR "airo_cs: no memory for new device\n");
f8cfa618 114 return -ENOMEM;
1da177e4 115 }
fd238232 116 p_dev->priv = local;
f8cfa618 117
15b99ac1 118 return airo_config(p_dev);
1da177e4
LT
119} /* airo_attach */
120
121/*======================================================================
05c9a4cf 122
1da177e4
LT
123 This deletes a driver "instance". The device is de-registered
124 with Card Services. If it has been released, all local data
125 structures are freed. Otherwise, the structures will be freed
126 when the device is released.
05c9a4cf 127
1da177e4
LT
128 ======================================================================*/
129
fba395ee 130static void airo_detach(struct pcmcia_device *link)
1da177e4 131{
2caff147 132 dev_dbg(&link->dev, "airo_detach\n");
b4635811 133
e2d40963 134 airo_release(link);
b4635811 135
05c9a4cf
JD
136 if (((local_info_t *)link->priv)->eth_dev) {
137 stop_airo_card(((local_info_t *)link->priv)->eth_dev, 0);
1da177e4 138 }
05c9a4cf 139 ((local_info_t *)link->priv)->eth_dev = NULL;
cc3b4866 140
b4558ea9 141 kfree(link->priv);
1da177e4
LT
142} /* airo_detach */
143
144/*======================================================================
05c9a4cf 145
1da177e4
LT
146 airo_config() is scheduled to run after a CARD_INSERTION event
147 is received, to configure the PCMCIA socket, and to make the
148 device available to the system.
05c9a4cf 149
1da177e4
LT
150 ======================================================================*/
151
b54bf94b
DB
152static int airo_cs_config_check(struct pcmcia_device *p_dev,
153 cistpl_cftable_entry_t *cfg,
8e2fc39d 154 cistpl_cftable_entry_t *dflt,
ad913c11 155 unsigned int vcc,
b54bf94b
DB
156 void *priv_data)
157{
8e2fc39d 158 win_req_t *req = priv_data;
b54bf94b
DB
159
160 if (cfg->index == 0)
161 return -ENODEV;
162
b54bf94b
DB
163 /* Does this card need audio output? */
164 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
165 p_dev->conf.Attributes |= CONF_ENABLE_SPKR;
166 p_dev->conf.Status = CCSR_AUDIO_ENA;
167 }
168
169 /* Use power settings for Vcc and Vpp if present */
170 /* Note that the CIS values need to be rescaled */
171 if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
172 p_dev->conf.Vpp = cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
8e2fc39d
DB
173 else if (dflt->vpp1.present & (1<<CISTPL_POWER_VNOM))
174 p_dev->conf.Vpp = dflt->vpp1.param[CISTPL_POWER_VNOM]/10000;
b54bf94b 175
eb14120f 176 p_dev->conf.Attributes |= CONF_ENABLE_IRQ;
b54bf94b
DB
177
178 /* IO window settings */
179 p_dev->io.NumPorts1 = p_dev->io.NumPorts2 = 0;
8e2fc39d
DB
180 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
181 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
b54bf94b
DB
182 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
183 if (!(io->flags & CISTPL_IO_8BIT))
184 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
185 if (!(io->flags & CISTPL_IO_16BIT))
186 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
187 p_dev->io.BasePort1 = io->win[0].base;
188 p_dev->io.NumPorts1 = io->win[0].len;
189 if (io->nwin > 1) {
190 p_dev->io.Attributes2 = p_dev->io.Attributes1;
191 p_dev->io.BasePort2 = io->win[1].base;
192 p_dev->io.NumPorts2 = io->win[1].len;
193 }
194 }
195
196 /* This reserves IO space but doesn't actually enable it */
197 if (pcmcia_request_io(p_dev, &p_dev->io) != 0)
198 return -ENODEV;
199
200 /*
201 Now set up a common memory window, if needed. There is room
202 in the struct pcmcia_device structure for one memory window handle,
203 but if the base addresses need to be saved, or if multiple
204 windows are needed, the info should go in the private data
205 structure for this device.
206
207 Note that the memory window base is a physical address, and
208 needs to be mapped to virtual space with ioremap() before it
209 is used.
210 */
8e2fc39d
DB
211 if ((cfg->mem.nwin > 0) || (dflt->mem.nwin > 0)) {
212 cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &dflt->mem;
b54bf94b 213 memreq_t map;
8e2fc39d
DB
214 req->Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
215 req->Base = mem->win[0].host_addr;
216 req->Size = mem->win[0].len;
217 req->AccessSpeed = 0;
6838b03f 218 if (pcmcia_request_window(p_dev, req, &p_dev->win) != 0)
b54bf94b
DB
219 return -ENODEV;
220 map.Page = 0;
221 map.CardOffset = mem->win[0].card_addr;
868575d1 222 if (pcmcia_map_mem_page(p_dev, p_dev->win, &map) != 0)
b54bf94b
DB
223 return -ENODEV;
224 }
225 /* If we got this far, we're cool! */
226 return 0;
227}
228
229
15b99ac1 230static int airo_config(struct pcmcia_device *link)
1da177e4 231{
1da177e4 232 local_info_t *dev;
8e2fc39d 233 win_req_t *req;
2caff147 234 int ret;
fba395ee 235
1da177e4
LT
236 dev = link->priv;
237
2caff147 238 dev_dbg(&link->dev, "airo_config\n");
e2d40963 239
8e2fc39d
DB
240 req = kzalloc(sizeof(win_req_t), GFP_KERNEL);
241 if (!req)
b54bf94b
DB
242 return -ENOMEM;
243
1da177e4 244 /*
b54bf94b
DB
245 * In this loop, we scan the CIS for configuration table
246 * entries, each of which describes a valid card
247 * configuration, including voltage, IO window, memory window,
248 * and interrupt settings.
249 *
250 * We make no assumptions about the card to be configured: we
251 * use just the information available in the CIS. In an ideal
252 * world, this would work for any PCMCIA card, but it requires
253 * a complete and accurate CIS. In practice, a driver usually
254 * "knows" most of these things without consulting the CIS,
255 * and most client drivers will only use the CIS to fill in
256 * implementation-defined details.
257 */
2caff147
DB
258 ret = pcmcia_loop_config(link, airo_cs_config_check, req);
259 if (ret)
b54bf94b
DB
260 goto failed;
261
eb14120f
DB
262 if (!link->irq)
263 goto failed;
05c9a4cf 264
1da177e4
LT
265 /*
266 This actually configures the PCMCIA socket -- setting up
267 the I/O windows and the interrupt mapping, and putting the
268 card and host interface into "Memory and IO" mode.
269 */
2caff147
DB
270 ret = pcmcia_request_configuration(link, &link->conf);
271 if (ret)
272 goto failed;
05c9a4cf 273 ((local_info_t *)link->priv)->eth_dev =
eb14120f 274 init_airo_card(link->irq,
dd2e5a15 275 link->io.BasePort1, 1, &link->dev);
05c9a4cf 276 if (!((local_info_t *)link->priv)->eth_dev)
2caff147 277 goto failed;
05c9a4cf 278
1da177e4 279 /* Finally, report what we've done */
ded6a1a3
DB
280 dev_info(&link->dev, "index 0x%02x: ",
281 link->conf.ConfigIndex);
70294b46
DB
282 if (link->conf.Vpp)
283 printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
eb14120f 284 printk(", irq %d", link->irq);
1da177e4
LT
285 if (link->io.NumPorts1)
286 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
287 link->io.BasePort1+link->io.NumPorts1-1);
288 if (link->io.NumPorts2)
289 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
290 link->io.BasePort2+link->io.NumPorts2-1);
291 if (link->win)
8e2fc39d
DB
292 printk(", mem 0x%06lx-0x%06lx", req->Base,
293 req->Base+req->Size-1);
1da177e4 294 printk("\n");
8e2fc39d 295 kfree(req);
15b99ac1
DB
296 return 0;
297
b54bf94b 298 failed:
1da177e4 299 airo_release(link);
8e2fc39d 300 kfree(req);
15b99ac1 301 return -ENODEV;
1da177e4
LT
302} /* airo_config */
303
304/*======================================================================
05c9a4cf 305
1da177e4
LT
306 After a card is removed, airo_release() will unregister the
307 device, and release the PCMCIA configuration. If the device is
308 still open, this will be postponed until it is closed.
05c9a4cf 309
1da177e4
LT
310 ======================================================================*/
311
fba395ee 312static void airo_release(struct pcmcia_device *link)
1da177e4 313{
2caff147 314 dev_dbg(&link->dev, "airo_release\n");
fba395ee 315 pcmcia_disable_device(link);
1da177e4
LT
316}
317
fba395ee 318static int airo_suspend(struct pcmcia_device *link)
98e4c28b 319{
98e4c28b
DB
320 local_info_t *local = link->priv;
321
e2d40963 322 netif_device_detach(local->eth_dev);
98e4c28b
DB
323
324 return 0;
325}
326
fba395ee 327static int airo_resume(struct pcmcia_device *link)
98e4c28b 328{
98e4c28b
DB
329 local_info_t *local = link->priv;
330
e2d40963 331 if (link->open) {
98e4c28b
DB
332 reset_airo_card(local->eth_dev);
333 netif_device_attach(local->eth_dev);
334 }
335
336 return 0;
337}
338
7018d06d
DB
339static struct pcmcia_device_id airo_ids[] = {
340 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a),
341 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005),
342 PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007),
343 PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0007),
344 PCMCIA_DEVICE_NULL,
345};
346MODULE_DEVICE_TABLE(pcmcia, airo_ids);
347
1da177e4
LT
348static struct pcmcia_driver airo_driver = {
349 .owner = THIS_MODULE,
350 .drv = {
351 .name = "airo_cs",
352 },
15b99ac1 353 .probe = airo_probe,
cc3b4866 354 .remove = airo_detach,
7018d06d 355 .id_table = airo_ids,
98e4c28b
DB
356 .suspend = airo_suspend,
357 .resume = airo_resume,
1da177e4
LT
358};
359
360static int airo_cs_init(void)
361{
362 return pcmcia_register_driver(&airo_driver);
363}
364
365static void airo_cs_cleanup(void)
366{
367 pcmcia_unregister_driver(&airo_driver);
1da177e4
LT
368}
369
370/*
371 This program is free software; you can redistribute it and/or
372 modify it under the terms of the GNU General Public License
373 as published by the Free Software Foundation; either version 2
374 of the License, or (at your option) any later version.
375
376 This program is distributed in the hope that it will be useful,
377 but WITHOUT ANY WARRANTY; without even the implied warranty of
378 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
379 GNU General Public License for more details.
380
381 In addition:
382
383 Redistribution and use in source and binary forms, with or without
384 modification, are permitted provided that the following conditions
385 are met:
386
387 1. Redistributions of source code must retain the above copyright
388 notice, this list of conditions and the following disclaimer.
389 2. Redistributions in binary form must reproduce the above copyright
390 notice, this list of conditions and the following disclaimer in the
391 documentation and/or other materials provided with the distribution.
392 3. The name of the author may not be used to endorse or promote
393 products derived from this software without specific prior written
394 permission.
395
396 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
397 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
398 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
399 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
400 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
401 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
402 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
403 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
404 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
405 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
05c9a4cf 406 POSSIBILITY OF SUCH DAMAGE.
1da177e4
LT
407*/
408
409module_init(airo_cs_init);
410module_exit(airo_cs_cleanup);