874919cf5965d2a6427bf84defe835bcd674121d
[pandora-kernel.git] / drivers / staging / ft1000 / ft1000-pcmcia / ft1000_cs.c
1 /*---------------------------------------------------------------------------
2    FT1000 driver for Flarion Flash OFDM NIC Device
3
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.
8
9    The initial developer of the original code is David A. Hinds
10    <dahinds@users.sourceforge.net>.  Portions created by David A. Hinds.
11
12    This file was modified to support the Flarion Flash OFDM NIC Device
13    by Wai Chan (w.chan@flarion.com).
14
15    Port for kernel 2.6 created by Patrik Ostrihon (patrik.ostrihon@pwc.sk)
16
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 -----------------------------------------------------------------------------*/
28
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>
38
39 #include <linux/netdevice.h>
40 #include <linux/etherdevice.h>
41
42 #include <pcmcia/cistpl.h>
43 #include <pcmcia/cisreg.h>
44 #include <pcmcia/ds.h>
45
46 #include <asm/io.h>
47 #include <asm/system.h>
48 #include <asm/byteorder.h>
49 #include <asm/uaccess.h>
50
51 /*====================================================================*/
52
53 /* Module parameters */
54
55 #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
56
57 MODULE_AUTHOR("Wai Chan");
58 MODULE_DESCRIPTION("FT1000 PCMCIA driver");
59 MODULE_LICENSE("GPL");
60
61 /* Newer, simpler way of listing specific interrupts */
62
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 */
65
66 /*
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.
71 */
72 #ifdef FT_DEBUG
73 #define DEBUG(n, args...) printk(KERN_DEBUG args)
74 #else
75 #define DEBUG(n, args...)
76 #endif
77
78 /*====================================================================*/
79
80 struct net_device *init_ft1000_card(struct pcmcia_device *link,
81                                         void *ft1000_reset);
82 void stop_ft1000_card(struct net_device *);
83
84 static int ft1000_config(struct pcmcia_device *link);
85 static void ft1000_release(struct pcmcia_device *link);
86
87 /*
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.
91 */
92
93 static void ft1000_detach(struct pcmcia_device *link);
94 static int  ft1000_attach(struct pcmcia_device *link);
95
96 typedef struct local_info_t {
97         struct pcmcia_device *link;
98         struct net_device *dev;
99 } local_info_t;
100
101 #define MAX_ASIC_RESET_CNT     10
102 #define COR_DEFAULT            0x55
103
104 /*====================================================================*/
105
106 static void ft1000_reset(struct pcmcia_device * link)
107 {
108         pcmcia_reset_card(link->socket);
109 }
110
111 /*======================================================================
112
113
114 ======================================================================*/
115
116 static int ft1000_attach(struct pcmcia_device *link)
117 {
118
119         local_info_t *local;
120
121         DEBUG(0, "ft1000_cs: ft1000_attach()\n");
122
123         local = kmalloc(sizeof(local_info_t), GFP_KERNEL);
124         if (!local) {
125                 return -ENOMEM;
126         }
127         memset(local, 0, sizeof(local_info_t));
128         local->link = link;
129
130         link->priv = local;
131         local->dev = NULL;
132
133         link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
134
135         return ft1000_config(link);
136
137 }                               /* ft1000_attach */
138
139 /*======================================================================
140
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.
145
146 ======================================================================*/
147
148 static void ft1000_detach(struct pcmcia_device *link)
149 {
150         struct net_device *dev = ((local_info_t *) link->priv)->dev;
151
152         DEBUG(0, "ft1000_cs: ft1000_detach(0x%p)\n", link);
153
154         if (link == NULL) {
155                 DEBUG(0,"ft1000_cs:ft1000_detach: Got a NULL pointer\n");
156                 return;
157         }
158
159         if (dev) {
160                 stop_ft1000_card(dev);
161         }
162
163         pcmcia_disable_device(link);
164
165         /* This points to the parent local_info_t struct */
166         free_netdev(dev);
167
168 }                               /* ft1000_detach */
169
170 /*======================================================================
171
172    Check if the io window is configured
173
174 ======================================================================*/
175 int ft1000_confcheck(struct pcmcia_device *link, void *priv_data)
176 {
177
178         return pcmcia_request_io(link);
179 }                               /* ft1000_confcheck */
180
181 /*======================================================================
182
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.
186
187 ======================================================================*/
188
189 static int ft1000_config(struct pcmcia_device *link)
190 {
191         int  ret;
192
193         dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link);
194
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;
200         }
201
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;
207         }
208
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;
214         }
215
216         /* Finally, report what we've done */
217
218         return 0;
219 failed:
220         ft1000_release(link);
221         return -ENODEV;
222
223 }                               /* ft1000_config */
224
225 /*======================================================================
226
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.
230
231 ======================================================================*/
232
233 static void ft1000_release(struct pcmcia_device * link)
234 {
235
236         DEBUG(0, "ft1000_cs: ft1000_release(0x%p)\n", link);
237
238         /*
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.
242          */
243
244         /*
245            In a normal driver, additional code may be needed to release
246            other kernel data structures associated with this device.
247          */
248         kfree((local_info_t *) link->priv);
249         /* Don't bother checking to see if these succeed or not */
250
251          pcmcia_disable_device(link);
252 }                               /* ft1000_release */
253
254 /*======================================================================
255
256     The card status event handler.  Mostly, this schedules other
257     stuff to run after an event is received.
258
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.
263
264 ======================================================================*/
265
266 static int ft1000_suspend(struct pcmcia_device *link)
267 {
268         struct net_device *dev = ((local_info_t *) link->priv)->dev;
269
270         DEBUG(1, "ft1000_cs: ft1000_event(0x%06x)\n", event);
271
272         if (link->open)
273                 netif_device_detach(dev);
274         return 0;
275 }
276
277 static int ft1000_resume(struct pcmcia_device *link)
278 {
279 /*      struct net_device *dev = link->priv;
280  */
281         return 0;
282 }
283
284
285
286 /*====================================================================*/
287
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,
293 };
294
295 MODULE_DEVICE_TABLE(pcmcia, ft1000_ids);
296
297 static struct pcmcia_driver ft1000_cs_driver = {
298         .owner = THIS_MODULE,
299         .drv = {
300                 .name = "ft1000_cs",
301                 },
302         .probe      = ft1000_attach,
303         .remove     = ft1000_detach,
304         .id_table       = ft1000_ids,
305         .suspend    = ft1000_suspend,
306         .resume     = ft1000_resume,
307 };
308
309 static int __init init_ft1000_cs(void)
310 {
311         DEBUG(0, "ft1000_cs: loading\n");
312         return pcmcia_register_driver(&ft1000_cs_driver);
313 }
314
315 static void __exit exit_ft1000_cs(void)
316 {
317         DEBUG(0, "ft1000_cs: unloading\n");
318         pcmcia_unregister_driver(&ft1000_cs_driver);
319 }
320
321 module_init(init_ft1000_cs);
322 module_exit(exit_ft1000_cs);