staging: ft1000-pcmcia: don't crash on load
[platform/kernel/linux-arm64.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 = kzalloc(sizeof(local_info_t), GFP_KERNEL);
124         if (!local) {
125                 return -ENOMEM;
126         }
127         local->link = link;
128
129         link->priv = local;
130         local->dev = NULL;
131
132         link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
133
134         return ft1000_config(link);
135
136 }                               /* ft1000_attach */
137
138 /*======================================================================
139
140     This deletes a driver "instance".  The device is de-registered
141     with Card Services.  If it has been released, all local data
142     structures are freed.  Otherwise, the structures will be freed
143     when the device is released.
144
145 ======================================================================*/
146
147 static void ft1000_detach(struct pcmcia_device *link)
148 {
149         struct net_device *dev = ((local_info_t *) link->priv)->dev;
150
151         DEBUG(0, "ft1000_cs: ft1000_detach(0x%p)\n", link);
152
153         if (link == NULL) {
154                 DEBUG(0,"ft1000_cs:ft1000_detach: Got a NULL pointer\n");
155                 return;
156         }
157
158         if (dev) {
159                 stop_ft1000_card(dev);
160         }
161
162         pcmcia_disable_device(link);
163
164         /* This points to the parent local_info_t struct */
165         free_netdev(dev);
166
167 }                               /* ft1000_detach */
168
169 /*======================================================================
170
171    Check if the io window is configured
172
173 ======================================================================*/
174 int ft1000_confcheck(struct pcmcia_device *link, void *priv_data)
175 {
176
177         return pcmcia_request_io(link);
178 }                               /* ft1000_confcheck */
179
180 /*======================================================================
181
182     ft1000_config() is scheduled to run after a CARD_INSERTION event
183     is received, to configure the PCMCIA socket, and to make the
184     device available to the system.
185
186 ======================================================================*/
187
188 static int ft1000_config(struct pcmcia_device *link)
189 {
190         int  ret;
191
192         dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link);
193
194         /* setup IO window */
195         ret = pcmcia_loop_config(link, ft1000_confcheck, NULL);
196         if (ret) {
197                 printk(KERN_INFO "ft1000: Could not configure pcmcia\n");
198                 return -ENODEV;
199         }
200
201         /* configure device */
202         ret = pcmcia_enable_device(link);
203         if (ret) {
204                 printk(KERN_INFO "ft1000: could not enable pcmcia\n");
205                 goto failed;
206         }
207
208         ((local_info_t *) link->priv)->dev = init_ft1000_card(link,
209                                                                 &ft1000_reset);
210         if (((local_info_t *) link->priv)->dev == NULL) {
211                 printk(KERN_INFO "ft1000: Could not register as network device\n");
212                 goto failed;
213         }
214
215         /* Finally, report what we've done */
216
217         return 0;
218 failed:
219         ft1000_release(link);
220         return -ENODEV;
221
222 }                               /* ft1000_config */
223
224 /*======================================================================
225
226     After a card is removed, ft1000_release() will unregister the
227     device, and release the PCMCIA configuration.  If the device is
228     still open, this will be postponed until it is closed.
229
230 ======================================================================*/
231
232 static void ft1000_release(struct pcmcia_device * link)
233 {
234
235         DEBUG(0, "ft1000_cs: ft1000_release(0x%p)\n", link);
236
237         /*
238            If the device is currently in use, we won't release until it
239            is actually closed, because until then, we can't be sure that
240            no one will try to access the device or its data structures.
241          */
242
243         /*
244            In a normal driver, additional code may be needed to release
245            other kernel data structures associated with this device.
246          */
247         kfree((local_info_t *) link->priv);
248         /* Don't bother checking to see if these succeed or not */
249
250          pcmcia_disable_device(link);
251 }                               /* ft1000_release */
252
253 /*======================================================================
254
255     The card status event handler.  Mostly, this schedules other
256     stuff to run after an event is received.
257
258     When a CARD_REMOVAL event is received, we immediately set a
259     private flag to block future accesses to this device.  All the
260     functions that actually access the device should check this flag
261     to make sure the card is still present.
262
263 ======================================================================*/
264
265 static int ft1000_suspend(struct pcmcia_device *link)
266 {
267         struct net_device *dev = ((local_info_t *) link->priv)->dev;
268
269         DEBUG(1, "ft1000_cs: ft1000_event(0x%06x)\n", event);
270
271         if (link->open)
272                 netif_device_detach(dev);
273         return 0;
274 }
275
276 static int ft1000_resume(struct pcmcia_device *link)
277 {
278 /*      struct net_device *dev = link->priv;
279  */
280         return 0;
281 }
282
283
284
285 /*====================================================================*/
286
287 static const struct pcmcia_device_id ft1000_ids[] = {
288         PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x0100),
289         PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1000),
290         PCMCIA_DEVICE_MANF_CARD(0x02cc, 0x1300),
291         PCMCIA_DEVICE_NULL,
292 };
293
294 MODULE_DEVICE_TABLE(pcmcia, ft1000_ids);
295
296 static struct pcmcia_driver ft1000_cs_driver = {
297         .owner = THIS_MODULE,
298         .name = "ft1000_cs",
299         .probe      = ft1000_attach,
300         .remove     = ft1000_detach,
301         .id_table       = ft1000_ids,
302         .suspend    = ft1000_suspend,
303         .resume     = ft1000_resume,
304 };
305
306 static int __init init_ft1000_cs(void)
307 {
308         DEBUG(0, "ft1000_cs: loading\n");
309         return pcmcia_register_driver(&ft1000_cs_driver);
310 }
311
312 static void __exit exit_ft1000_cs(void)
313 {
314         DEBUG(0, "ft1000_cs: unloading\n");
315         pcmcia_unregister_driver(&ft1000_cs_driver);
316 }
317
318 module_init(init_ft1000_cs);
319 module_exit(exit_ft1000_cs);