staging: ft1000-pcmcia: Fix compilation errors.
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / staging / ft1000 / ft1000-pcmcia / ft1000_cs.c
blob874919cf5965d2a6427bf84defe835bcd674121d
1 /*---------------------------------------------------------------------------
2 FT1000 driver for Flarion Flash OFDM NIC Device
4 Copyright (C) 1999 David A. Hinds. All Rights Reserved.
5 Copyright (C) 2002 Flarion Technologies, All rights reserved.
6 Copyright (C) 2006 Patrik Ostrihon, All rights reserved.
7 Copyright (C) 2006 ProWeb Consulting, a.s, All rights reserved.
9 The initial developer of the original code is David A. Hinds
10 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds.
12 This file was modified to support the Flarion Flash OFDM NIC Device
13 by Wai Chan (w.chan@flarion.com).
15 Port for kernel 2.6 created by Patrik Ostrihon (patrik.ostrihon@pwc.sk)
17 This program is free software; you can redistribute it and/or modify it
18 under the terms of the GNU General Public License as published by the Free
19 Software Foundation; either version 2 of the License, or (at your option) any
20 later version. This program is distributed in the hope that it will be useful,
21 but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
22 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
23 more details. You should have received a copy of the GNU General Public
24 License along with this program; if not, write to the
25 Free Software Foundation, Inc., 59 Temple Place -
26 Suite 330, Boston, MA 02111-1307, USA.
27 -----------------------------------------------------------------------------*/
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/ptrace.h>
33 #include <linux/slab.h>
34 #include <linux/string.h>
35 #include <linux/timer.h>
36 #include <linux/ioport.h>
37 #include <linux/delay.h>
39 #include <linux/netdevice.h>
40 #include <linux/etherdevice.h>
42 #include <pcmcia/cistpl.h>
43 #include <pcmcia/cisreg.h>
44 #include <pcmcia/ds.h>
46 #include <asm/io.h>
47 #include <asm/system.h>
48 #include <asm/byteorder.h>
49 #include <asm/uaccess.h>
51 /*====================================================================*/
53 /* Module parameters */
55 #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
57 MODULE_AUTHOR("Wai Chan");
58 MODULE_DESCRIPTION("FT1000 PCMCIA driver");
59 MODULE_LICENSE("GPL");
61 /* Newer, simpler way of listing specific interrupts */
63 /* The old way: bit map of interrupts to choose from */
64 /* This means pick from 15, 14, 12, 11, 10, 9, 7, 5, 4, and 3 */
67 All the PCMCIA modules use PCMCIA_DEBUG to control debugging. If
68 you do not define PCMCIA_DEBUG at all, all the debug code will be
69 left out. If you compile with PCMCIA_DEBUG=0, the debug code will
70 be present but disabled.
72 #ifdef FT_DEBUG
73 #define DEBUG(n, args...) printk(KERN_DEBUG args)
74 #else
75 #define DEBUG(n, args...)
76 #endif
78 /*====================================================================*/
80 struct net_device *init_ft1000_card(struct pcmcia_device *link,
81 void *ft1000_reset);
82 void stop_ft1000_card(struct net_device *);
84 static int ft1000_config(struct pcmcia_device *link);
85 static void ft1000_release(struct pcmcia_device *link);
88 The attach() and detach() entry points are used to create and destroy
89 "instances" of the driver, where each instance represents everything
90 needed to manage one actual PCMCIA card.
93 static void ft1000_detach(struct pcmcia_device *link);
94 static int ft1000_attach(struct pcmcia_device *link);
96 typedef struct local_info_t {
97 struct pcmcia_device *link;
98 struct net_device *dev;
99 } local_info_t;
101 #define MAX_ASIC_RESET_CNT 10
102 #define COR_DEFAULT 0x55
104 /*====================================================================*/
106 static void ft1000_reset(struct pcmcia_device * link)
108 pcmcia_reset_card(link->socket);
111 /*======================================================================
114 ======================================================================*/
116 static int ft1000_attach(struct pcmcia_device *link)
119 local_info_t *local;
121 DEBUG(0, "ft1000_cs: ft1000_attach()\n");
123 local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
124 if (!local) {
125 return -ENOMEM;
127 memset(local, 0, sizeof(local_info_t));
128 local->link = link;
130 link->priv = local;
131 local->dev = NULL;
133 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
135 return ft1000_config(link);
137 } /* ft1000_attach */
139 /*======================================================================
141 This deletes a driver "instance". The device is de-registered
142 with Card Services. If it has been released, all local data
143 structures are freed. Otherwise, the structures will be freed
144 when the device is released.
146 ======================================================================*/
148 static void ft1000_detach(struct pcmcia_device *link)
150 struct net_device *dev = ((local_info_t *) link->priv)->dev;
152 DEBUG(0, "ft1000_cs: ft1000_detach(0x%p)\n", link);
154 if (link == NULL) {
155 DEBUG(0,"ft1000_cs:ft1000_detach: Got a NULL pointer\n");
156 return;
159 if (dev) {
160 stop_ft1000_card(dev);
163 pcmcia_disable_device(link);
165 /* This points to the parent local_info_t struct */
166 free_netdev(dev);
168 } /* ft1000_detach */
170 /*======================================================================
172 Check if the io window is configured
174 ======================================================================*/
175 int ft1000_confcheck(struct pcmcia_device *link, void *priv_data)
178 return pcmcia_request_io(link);
179 } /* ft1000_confcheck */
181 /*======================================================================
183 ft1000_config() is scheduled to run after a CARD_INSERTION event
184 is received, to configure the PCMCIA socket, and to make the
185 device available to the system.
187 ======================================================================*/
189 static int ft1000_config(struct pcmcia_device *link)
191 int ret;
193 dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link);
195 /* setup IO window */
196 ret = pcmcia_loop_config(link, ft1000_confcheck, NULL);
197 if (ret) {
198 printk(KERN_INFO "ft1000: Could not configure pcmcia\n");
199 return -ENODEV;
202 /* configure device */
203 ret = pcmcia_enable_device(link);
204 if (ret) {
205 printk(KERN_INFO "ft1000: could not enable pcmcia\n");
206 goto failed;
209 ((local_info_t *) link->priv)->dev = init_ft1000_card(link,
210 &ft1000_reset);
211 if (((local_info_t *) link->priv)->dev == NULL) {
212 printk(KERN_INFO "ft1000: Could not register as network device\n");
213 goto failed;
216 /* Finally, report what we've done */
218 return 0;
219 failed:
220 ft1000_release(link);
221 return -ENODEV;
223 } /* ft1000_config */
225 /*======================================================================
227 After a card is removed, ft1000_release() will unregister the
228 device, and release the PCMCIA configuration. If the device is
229 still open, this will be postponed until it is closed.
231 ======================================================================*/
233 static void ft1000_release(struct pcmcia_device * link)
236 DEBUG(0, "ft1000_cs: ft1000_release(0x%p)\n", link);
239 If the device is currently in use, we won't release until it
240 is actually closed, because until then, we can't be sure that
241 no one will try to access the device or its data structures.
245 In a normal driver, additional code may be needed to release
246 other kernel data structures associated with this device.
248 kfree((local_info_t *) link->priv);
249 /* Don't bother checking to see if these succeed or not */
251 pcmcia_disable_device(link);
252 } /* ft1000_release */
254 /*======================================================================
256 The card status event handler. Mostly, this schedules other
257 stuff to run after an event is received.
259 When a CARD_REMOVAL event is received, we immediately set a
260 private flag to block future accesses to this device. All the
261 functions that actually access the device should check this flag
262 to make sure the card is still present.
264 ======================================================================*/
266 static int ft1000_suspend(struct pcmcia_device *link)
268 struct net_device *dev = ((local_info_t *) link->priv)->dev;
270 DEBUG(1, "ft1000_cs: ft1000_event(0x%06x)\n", event);
272 if (link->open)
273 netif_device_detach(dev);
274 return 0;
277 static int ft1000_resume(struct pcmcia_device *link)
279 /* struct net_device *dev = link->priv;
281 return 0;
286 /*====================================================================*/
288 static struct pcmcia_device_id ft1000_ids[] = {
289 PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x0100),
290 PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1000),
291 PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1300),
292 PCMCIA_DEVICE_NULL,
295 MODULE_DEVICE_TABLE(pcmcia, ft1000_ids);
297 static struct pcmcia_driver ft1000_cs_driver = {
298 .owner = THIS_MODULE,
299 .drv = {
300 .name = "ft1000_cs",
302 .probe = ft1000_attach,
303 .remove = ft1000_detach,
304 .id_table = ft1000_ids,
305 .suspend = ft1000_suspend,
306 .resume = ft1000_resume,
309 static int __init init_ft1000_cs(void)
311 DEBUG(0, "ft1000_cs: loading\n");
312 return pcmcia_register_driver(&ft1000_cs_driver);
315 static void __exit exit_ft1000_cs(void)
317 DEBUG(0, "ft1000_cs: unloading\n");
318 pcmcia_unregister_driver(&ft1000_cs_driver);
321 module_init(init_ft1000_cs);
322 module_exit(exit_ft1000_cs);