[PATCH] pcmcia: remove dev_link_t and client_handle_t indirection
[safe/jmp/linux-2.6] / drivers / net / wireless / airo_cs.c
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 #include <linux/config.h>
24 #ifdef __IN_PCMCIA_PACKAGE__
25 #include <pcmcia/k_compat.h>
26 #endif
27 #include <linux/init.h>
28 #include <linux/kernel.h>
29 #include <linux/module.h>
30 #include <linux/ptrace.h>
31 #include <linux/slab.h>
32 #include <linux/string.h>
33 #include <linux/timer.h>
34 #include <linux/netdevice.h>
35
36 #include <pcmcia/cs_types.h>
37 #include <pcmcia/cs.h>
38 #include <pcmcia/cistpl.h>
39 #include <pcmcia/cisreg.h>
40 #include <pcmcia/ds.h>
41
42 #include <asm/io.h>
43 #include <asm/system.h>
44
45 #include "airo.h"
46
47 /*
48    All the PCMCIA modules use PCMCIA_DEBUG to control debugging.  If
49    you do not define PCMCIA_DEBUG at all, all the debug code will be
50    left out.  If you compile with PCMCIA_DEBUG=0, the debug code will
51    be present but disabled -- but it can then be enabled for specific
52    modules at load time with a 'pc_debug=#' option to insmod.
53 */
54 #ifdef PCMCIA_DEBUG
55 static int pc_debug = PCMCIA_DEBUG;
56 module_param(pc_debug, int, 0);
57 static char *version = "$Revision: 1.2 $";
58 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args);
59 #else
60 #define DEBUG(n, args...)
61 #endif
62
63 /*====================================================================*/
64
65 MODULE_AUTHOR("Benjamin Reed");
66 MODULE_DESCRIPTION("Support for Cisco/Aironet 802.11 wireless ethernet \
67                    cards.  This is the module that links the PCMCIA card \
68                    with the airo module.");
69 MODULE_LICENSE("Dual BSD/GPL");
70 MODULE_SUPPORTED_DEVICE("Aironet 4500, 4800 and Cisco 340 PCMCIA cards");
71
72 /*====================================================================*/
73
74 /*
75    The event() function is this driver's Card Services event handler.
76    It will be called by Card Services when an appropriate card status
77    event is received.  The config() and release() entry points are
78    used to configure or release a socket, in response to card
79    insertion and ejection events.  They are invoked from the airo_cs
80    event handler. 
81 */
82
83 static void airo_config(struct pcmcia_device *link);
84 static void airo_release(struct pcmcia_device *link);
85
86 /*
87    The attach() and detach() entry points are used to create and destroy
88    "instances" of the driver, where each instance represents everything
89    needed to manage one actual PCMCIA card.
90 */
91
92 static void airo_detach(struct pcmcia_device *p_dev);
93
94 /*
95    You'll also need to prototype all the functions that will actually
96    be used to talk to your device.  See 'pcmem_cs' for a good example
97    of a fully self-sufficient driver; the other drivers rely more or
98    less on other parts of the kernel.
99 */
100
101 /*
102    A linked list of "instances" of the  aironet device.  Each actual
103    PCMCIA card corresponds to one device instance, and is described
104    by one struct pcmcia_device structure (defined in ds.h).
105
106    You may not want to use a linked list for this -- for example, the
107    memory card driver uses an array of struct pcmcia_device pointers, where minor
108    device numbers are used to derive the corresponding array index.
109 */
110
111 /*
112    A driver needs to provide a dev_node_t structure for each device
113    on a card.  In some cases, there is only one device per card (for
114    example, ethernet cards, modems).  In other cases, there may be
115    many actual or logical devices (SCSI adapters, memory cards with
116    multiple partitions).  The dev_node_t structures need to be kept
117    in a linked list starting at the 'dev' field of a struct pcmcia_device
118    structure.  We allocate them in the card's private data structure,
119    because they generally shouldn't be allocated dynamically.
120
121    In this case, we also provide a flag to indicate if a device is
122    "stopped" due to a power management event, or card ejection.  The
123    device IO routines can use a flag like this to throttle IO to a
124    card that is not ready to accept it.
125 */
126    
127 typedef struct local_info_t {
128         dev_node_t      node;
129         struct net_device *eth_dev;
130 } local_info_t;
131
132 /*======================================================================
133   
134   airo_attach() creates an "instance" of the driver, allocating
135   local data structures for one device.  The device is registered
136   with Card Services.
137   
138   The dev_link structure is initialized, but we don't actually
139   configure the card at this point -- we wait until we receive a
140   card insertion event.
141   
142   ======================================================================*/
143
144 static int airo_attach(struct pcmcia_device *p_dev)
145 {
146         local_info_t *local;
147
148         DEBUG(0, "airo_attach()\n");
149
150         /* Interrupt setup */
151         p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
152         p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
153         p_dev->irq.Handler = NULL;
154         
155         /*
156           General socket configuration defaults can go here.  In this
157           client, we assume very little, and rely on the CIS for almost
158           everything.  In most clients, many details (i.e., number, sizes,
159           and attributes of IO windows) are fixed by the nature of the
160           device, and can be hard-wired here.
161         */
162         p_dev->conf.Attributes = 0;
163         p_dev->conf.IntType = INT_MEMORY_AND_IO;
164         
165         /* Allocate space for private device-specific data */
166         local = kzalloc(sizeof(local_info_t), GFP_KERNEL);
167         if (!local) {
168                 printk(KERN_ERR "airo_cs: no memory for new device\n");
169                 return -ENOMEM;
170         }
171         p_dev->priv = local;
172
173         p_dev->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
174         airo_config(p_dev);
175
176         return 0;
177 } /* airo_attach */
178
179 /*======================================================================
180   
181   This deletes a driver "instance".  The device is de-registered
182   with Card Services.  If it has been released, all local data
183   structures are freed.  Otherwise, the structures will be freed
184   when the device is released.
185   
186   ======================================================================*/
187
188 static void airo_detach(struct pcmcia_device *link)
189 {
190         DEBUG(0, "airo_detach(0x%p)\n", link);
191
192         if (link->state & DEV_CONFIG)
193                 airo_release(link);
194
195         if ( ((local_info_t*)link->priv)->eth_dev ) {
196                 stop_airo_card( ((local_info_t*)link->priv)->eth_dev, 0 );
197         }
198         ((local_info_t*)link->priv)->eth_dev = NULL;
199
200         kfree(link->priv);
201 } /* airo_detach */
202
203 /*======================================================================
204   
205   airo_config() is scheduled to run after a CARD_INSERTION event
206   is received, to configure the PCMCIA socket, and to make the
207   device available to the system.
208   
209   ======================================================================*/
210
211 #define CS_CHECK(fn, ret) \
212 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
213
214 static void airo_config(struct pcmcia_device *link)
215 {
216         tuple_t tuple;
217         cisparse_t parse;
218         local_info_t *dev;
219         int last_fn, last_ret;
220         u_char buf[64];
221         win_req_t req;
222         memreq_t map;
223
224         dev = link->priv;
225
226         DEBUG(0, "airo_config(0x%p)\n", link);
227         
228         /*
229           This reads the card's CONFIG tuple to find its configuration
230           registers.
231         */
232         tuple.DesiredTuple = CISTPL_CONFIG;
233         tuple.Attributes = 0;
234         tuple.TupleData = buf;
235         tuple.TupleDataMax = sizeof(buf);
236         tuple.TupleOffset = 0;
237         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
238         CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
239         CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));
240         link->conf.ConfigBase = parse.config.base;
241         link->conf.Present = parse.config.rmask[0];
242         
243         /* Configure card */
244         link->state |= DEV_CONFIG;
245         
246         /*
247           In this loop, we scan the CIS for configuration table entries,
248           each of which describes a valid card configuration, including
249           voltage, IO window, memory window, and interrupt settings.
250           
251           We make no assumptions about the card to be configured: we use
252           just the information available in the CIS.  In an ideal world,
253           this would work for any PCMCIA card, but it requires a complete
254           and accurate CIS.  In practice, a driver usually "knows" most of
255           these things without consulting the CIS, and most client drivers
256           will only use the CIS to fill in implementation-defined details.
257         */
258         tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
259         CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
260         while (1) {
261                 cistpl_cftable_entry_t dflt = { 0 };
262                 cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);
263                 if (pcmcia_get_tuple_data(link, &tuple) != 0 ||
264                                 pcmcia_parse_tuple(link, &tuple, &parse) != 0)
265                         goto next_entry;
266                 
267                 if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;
268                 if (cfg->index == 0) goto next_entry;
269                 link->conf.ConfigIndex = cfg->index;
270                 
271                 /* Does this card need audio output? */
272                 if (cfg->flags & CISTPL_CFTABLE_AUDIO) {
273                         link->conf.Attributes |= CONF_ENABLE_SPKR;
274                         link->conf.Status = CCSR_AUDIO_ENA;
275                 }
276                 
277                 /* Use power settings for Vcc and Vpp if present */
278                 /*  Note that the CIS values need to be rescaled */
279                 if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))
280                         link->conf.Vpp =
281                                 cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;
282                 else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM))
283                         link->conf.Vpp =
284                                 dflt.vpp1.param[CISTPL_POWER_VNOM]/10000;
285                 
286                 /* Do we need to allocate an interrupt? */
287                 if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)
288                         link->conf.Attributes |= CONF_ENABLE_IRQ;
289                 
290                 /* IO window settings */
291                 link->io.NumPorts1 = link->io.NumPorts2 = 0;
292                 if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {
293                         cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;
294                         link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
295                         if (!(io->flags & CISTPL_IO_8BIT))
296                                 link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;
297                         if (!(io->flags & CISTPL_IO_16BIT))
298                                 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
299                         link->io.BasePort1 = io->win[0].base;
300                         link->io.NumPorts1 = io->win[0].len;
301                         if (io->nwin > 1) {
302                                 link->io.Attributes2 = link->io.Attributes1;
303                                 link->io.BasePort2 = io->win[1].base;
304                                 link->io.NumPorts2 = io->win[1].len;
305                         }
306                 }
307                 
308                 /* This reserves IO space but doesn't actually enable it */
309                 if (pcmcia_request_io(link, &link->io) != 0)
310                         goto next_entry;
311                 
312                 /*
313                   Now set up a common memory window, if needed.  There is room
314                   in the struct pcmcia_device structure for one memory window handle,
315                   but if the base addresses need to be saved, or if multiple
316                   windows are needed, the info should go in the private data
317                   structure for this device.
318                   
319                   Note that the memory window base is a physical address, and
320                   needs to be mapped to virtual space with ioremap() before it
321                   is used.
322                 */
323                 if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {
324                         cistpl_mem_t *mem =
325                                 (cfg->mem.nwin) ? &cfg->mem : &dflt.mem;
326                         req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
327                         req.Base = mem->win[0].host_addr;
328                         req.Size = mem->win[0].len;
329                         req.AccessSpeed = 0;
330                         if (pcmcia_request_window(&link, &req, &link->win) != 0)
331                                 goto next_entry;
332                         map.Page = 0; map.CardOffset = mem->win[0].card_addr;
333                         if (pcmcia_map_mem_page(link->win, &map) != 0)
334                                 goto next_entry;
335                 }
336                 /* If we got this far, we're cool! */
337                 break;
338                 
339         next_entry:
340                 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
341         }
342         
343     /*
344       Allocate an interrupt line.  Note that this does not assign a
345       handler to the interrupt, unless the 'Handler' member of the
346       irq structure is initialized.
347     */
348         if (link->conf.Attributes & CONF_ENABLE_IRQ)
349                 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
350         
351         /*
352           This actually configures the PCMCIA socket -- setting up
353           the I/O windows and the interrupt mapping, and putting the
354           card and host interface into "Memory and IO" mode.
355         */
356         CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
357         ((local_info_t*)link->priv)->eth_dev = 
358                 init_airo_card( link->irq.AssignedIRQ,
359                                 link->io.BasePort1, 1, &handle_to_dev(link) );
360         if (!((local_info_t*)link->priv)->eth_dev) goto cs_failed;
361         
362         /*
363           At this point, the dev_node_t structure(s) need to be
364           initialized and arranged in a linked list at link->dev_node.
365         */
366         strcpy(dev->node.dev_name, ((local_info_t*)link->priv)->eth_dev->name );
367         dev->node.major = dev->node.minor = 0;
368         link->dev_node = &dev->node;
369         
370         /* Finally, report what we've done */
371         printk(KERN_INFO "%s: index 0x%02x: ",
372                dev->node.dev_name, link->conf.ConfigIndex);
373         if (link->conf.Vpp)
374                 printk(", Vpp %d.%d", link->conf.Vpp/10, link->conf.Vpp%10);
375         if (link->conf.Attributes & CONF_ENABLE_IRQ)
376                 printk(", irq %d", link->irq.AssignedIRQ);
377         if (link->io.NumPorts1)
378                 printk(", io 0x%04x-0x%04x", link->io.BasePort1,
379                        link->io.BasePort1+link->io.NumPorts1-1);
380         if (link->io.NumPorts2)
381                 printk(" & 0x%04x-0x%04x", link->io.BasePort2,
382                        link->io.BasePort2+link->io.NumPorts2-1);
383         if (link->win)
384                 printk(", mem 0x%06lx-0x%06lx", req.Base,
385                        req.Base+req.Size-1);
386         printk("\n");
387         
388         link->state &= ~DEV_CONFIG_PENDING;
389         return;
390         
391  cs_failed:
392         cs_error(link, last_fn, last_ret);
393         airo_release(link);
394         
395 } /* airo_config */
396
397 /*======================================================================
398   
399   After a card is removed, airo_release() will unregister the
400   device, and release the PCMCIA configuration.  If the device is
401   still open, this will be postponed until it is closed.
402   
403   ======================================================================*/
404
405 static void airo_release(struct pcmcia_device *link)
406 {
407         DEBUG(0, "airo_release(0x%p)\n", link);
408         pcmcia_disable_device(link);
409 }
410
411 static int airo_suspend(struct pcmcia_device *link)
412 {
413         local_info_t *local = link->priv;
414
415         if (link->state & DEV_CONFIG)
416                 netif_device_detach(local->eth_dev);
417
418         return 0;
419 }
420
421 static int airo_resume(struct pcmcia_device *link)
422 {
423         local_info_t *local = link->priv;
424
425         if ((link->state & DEV_CONFIG) && (link->open)) {
426                 reset_airo_card(local->eth_dev);
427                 netif_device_attach(local->eth_dev);
428         }
429
430         return 0;
431 }
432
433 static struct pcmcia_device_id airo_ids[] = {
434         PCMCIA_DEVICE_MANF_CARD(0x015f, 0x000a),
435         PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0005),
436         PCMCIA_DEVICE_MANF_CARD(0x015f, 0x0007),
437         PCMCIA_DEVICE_MANF_CARD(0x0105, 0x0007),
438         PCMCIA_DEVICE_NULL,
439 };
440 MODULE_DEVICE_TABLE(pcmcia, airo_ids);
441
442 static struct pcmcia_driver airo_driver = {
443         .owner          = THIS_MODULE,
444         .drv            = {
445                 .name   = "airo_cs",
446         },
447         .probe          = airo_attach,
448         .remove         = airo_detach,
449         .id_table       = airo_ids,
450         .suspend        = airo_suspend,
451         .resume         = airo_resume,
452 };
453
454 static int airo_cs_init(void)
455 {
456         return pcmcia_register_driver(&airo_driver);
457 }
458
459 static void airo_cs_cleanup(void)
460 {
461         pcmcia_unregister_driver(&airo_driver);
462 }
463
464 /*
465     This program is free software; you can redistribute it and/or
466     modify it under the terms of the GNU General Public License
467     as published by the Free Software Foundation; either version 2
468     of the License, or (at your option) any later version.
469
470     This program is distributed in the hope that it will be useful,
471     but WITHOUT ANY WARRANTY; without even the implied warranty of
472     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
473     GNU General Public License for more details.
474
475     In addition:
476
477     Redistribution and use in source and binary forms, with or without
478     modification, are permitted provided that the following conditions
479     are met:
480
481     1. Redistributions of source code must retain the above copyright
482        notice, this list of conditions and the following disclaimer.
483     2. Redistributions in binary form must reproduce the above copyright
484        notice, this list of conditions and the following disclaimer in the
485        documentation and/or other materials provided with the distribution.
486     3. The name of the author may not be used to endorse or promote
487        products derived from this software without specific prior written
488        permission.
489
490     THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
491     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
492     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
493     ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
494     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
495     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
496     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
497     HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
498     STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
499     IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
500     POSSIBILITY OF SUCH DAMAGE.    
501 */
502
503 module_init(airo_cs_init);
504 module_exit(airo_cs_cleanup);