drivers/net/pcmcia: Use pr_<level> and netdev_<level>
[deliverable/linux.git] / drivers / net / pcmcia / com20020_cs.c
CommitLineData
1da177e4
LT
1/*
2 * Linux ARCnet driver - COM20020 PCMCIA support
3 *
4 * Written 1994-1999 by Avery Pennarun,
5 * based on an ISA version by David Woodhouse.
6 * Derived from ibmtr_cs.c by Steve Kipisz (pcmcia-cs 3.1.4)
7 * which was derived from pcnet_cs.c by David Hinds.
8 * Some additional portions derived from skeleton.c by Donald Becker.
9 *
10 * Special thanks to Contemporary Controls, Inc. (www.ccontrols.com)
11 * for sponsoring the further development of this driver.
12 *
13 * **********************
14 *
15 * The original copyright of skeleton.c was as follows:
16 *
17 * skeleton.c Written 1993 by Donald Becker.
18 * Copyright 1993 United States Government as represented by the
19 * Director, National Security Agency. This software may only be used
20 * and distributed according to the terms of the GNU General Public License as
21 * modified by SRC, incorporated herein by reference.
22 *
23 * **********************
24 * Changes:
25 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 08/08/2000
26 * - reorganize kmallocs in com20020_attach, checking all for failure
27 * and releasing the previous allocations if one fails
28 * **********************
29 *
30 * For more details, see drivers/net/arcnet.c
31 *
32 * **********************
33 */
34#include <linux/kernel.h>
35#include <linux/init.h>
36#include <linux/ptrace.h>
37#include <linux/slab.h>
38#include <linux/string.h>
39#include <linux/timer.h>
40#include <linux/delay.h>
41#include <linux/module.h>
42#include <linux/netdevice.h>
43#include <linux/arcdevice.h>
44#include <linux/com20020.h>
45
1da177e4
LT
46#include <pcmcia/cs.h>
47#include <pcmcia/cistpl.h>
48#include <pcmcia/ds.h>
49
50#include <asm/io.h>
51#include <asm/system.h>
52
53#define VERSION "arcnet: COM20020 PCMCIA support loaded.\n"
54
1da177e4
LT
55
56static void regdump(struct net_device *dev)
57{
636b8116 58#ifdef DEBUG
1da177e4
LT
59 int ioaddr = dev->base_addr;
60 int count;
61
636b8116 62 netdev_dbg(dev, "register dump:\n");
1da177e4
LT
63 for (count = ioaddr; count < ioaddr + 16; count++)
64 {
65 if (!(count % 16))
636b8116
JP
66 pr_cont("%04X:", count);
67 pr_cont(" %02X", inb(count));
1da177e4 68 }
636b8116 69 pr_cont("\n");
1da177e4 70
636b8116 71 netdev_dbg(dev, "buffer0 dump:\n");
1da177e4
LT
72 /* set up the address register */
73 count = 0;
74 outb((count >> 8) | RDDATAflag | AUTOINCflag, _ADDR_HI);
75 outb(count & 0xff, _ADDR_LO);
76
77 for (count = 0; count < 256+32; count++)
78 {
79 if (!(count % 16))
636b8116 80 pr_cont("%04X:", count);
1da177e4
LT
81
82 /* copy the data */
636b8116 83 pr_cont(" %02X", inb(_MEMDATA));
1da177e4 84 }
636b8116
JP
85 pr_cont("\n");
86#endif
1da177e4
LT
87}
88
1da177e4
LT
89
90
91/*====================================================================*/
92
93/* Parameters that can be set with 'insmod' */
94
95static int node;
96static int timeout = 3;
97static int backplane;
98static int clockp;
99static int clockm;
100
101module_param(node, int, 0);
102module_param(timeout, int, 0);
103module_param(backplane, int, 0);
104module_param(clockp, int, 0);
105module_param(clockm, int, 0);
106
107MODULE_LICENSE("GPL");
108
109/*====================================================================*/
110
15b99ac1 111static int com20020_config(struct pcmcia_device *link);
fba395ee 112static void com20020_release(struct pcmcia_device *link);
1da177e4 113
cc3b4866 114static void com20020_detach(struct pcmcia_device *p_dev);
1da177e4 115
1da177e4
LT
116/*====================================================================*/
117
118typedef struct com20020_dev_t {
119 struct net_device *dev;
1da177e4
LT
120} com20020_dev_t;
121
122/*======================================================================
123
124 com20020_attach() creates an "instance" of the driver, allocating
125 local data structures for one device. The device is registered
126 with Card Services.
127
128======================================================================*/
129
15b99ac1 130static int com20020_probe(struct pcmcia_device *p_dev)
1da177e4 131{
1da177e4
LT
132 com20020_dev_t *info;
133 struct net_device *dev;
1da177e4 134 struct arcnet_local *lp;
f8cfa618 135
dd0fab5b 136 dev_dbg(&p_dev->dev, "com20020_attach()\n");
1da177e4
LT
137
138 /* Create new network device */
dd00cc48 139 info = kzalloc(sizeof(struct com20020_dev_t), GFP_KERNEL);
1da177e4
LT
140 if (!info)
141 goto fail_alloc_info;
142
143 dev = alloc_arcdev("");
144 if (!dev)
145 goto fail_alloc_dev;
146
4cf1653a 147 lp = netdev_priv(dev);
1da177e4
LT
148 lp->timeout = timeout;
149 lp->backplane = backplane;
150 lp->clockp = clockp;
151 lp->clockm = clockm & 3;
152 lp->hw.owner = THIS_MODULE;
153
154 /* fill in our module parameters as defaults */
155 dev->dev_addr[0] = node;
156
90abdc3b
DB
157 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
158 p_dev->resource[0]->end = 16;
fd238232
DB
159 p_dev->conf.Attributes = CONF_ENABLE_IRQ;
160 p_dev->conf.IntType = INT_MEMORY_AND_IO;
1da177e4 161
5fa9167a 162 info->dev = dev;
fd238232 163 p_dev->priv = info;
1da177e4 164
15b99ac1 165 return com20020_config(p_dev);
1da177e4
LT
166
167fail_alloc_dev:
168 kfree(info);
169fail_alloc_info:
f8cfa618 170 return -ENOMEM;
1da177e4
LT
171} /* com20020_attach */
172
173/*======================================================================
174
175 This deletes a driver "instance". The device is de-registered
176 with Card Services. If it has been released, all local data
177 structures are freed. Otherwise, the structures will be freed
178 when the device is released.
179
180======================================================================*/
181
fba395ee 182static void com20020_detach(struct pcmcia_device *link)
1da177e4
LT
183{
184 struct com20020_dev_t *info = link->priv;
b4635811
DB
185 struct net_device *dev = info->dev;
186
dd0fab5b 187 dev_dbg(&link->dev, "detach...\n");
1da177e4 188
dd0fab5b 189 dev_dbg(&link->dev, "com20020_detach\n");
1da177e4 190
c7c2fa07 191 dev_dbg(&link->dev, "unregister...\n");
1da177e4 192
c7c2fa07 193 unregister_netdev(dev);
b4635811 194
c7c2fa07
DB
195 /*
196 * this is necessary because we register our IRQ separately
197 * from card services.
198 */
199 if (dev->irq)
1da177e4 200 free_irq(dev->irq, dev);
1da177e4 201
e2d40963 202 com20020_release(link);
1da177e4 203
1da177e4 204 /* Unlink device structure, free bits */
dd0fab5b 205 dev_dbg(&link->dev, "unlinking...\n");
1da177e4
LT
206 if (link->priv)
207 {
208 dev = info->dev;
209 if (dev)
210 {
dd0fab5b 211 dev_dbg(&link->dev, "kfree...\n");
1da177e4
LT
212 free_netdev(dev);
213 }
dd0fab5b 214 dev_dbg(&link->dev, "kfree2...\n");
1da177e4
LT
215 kfree(info);
216 }
1da177e4
LT
217
218} /* com20020_detach */
219
220/*======================================================================
221
222 com20020_config() is scheduled to run after a CARD_INSERTION event
223 is received, to configure the PCMCIA socket, and to make the
224 device available to the system.
225
226======================================================================*/
227
15b99ac1 228static int com20020_config(struct pcmcia_device *link)
1da177e4
LT
229{
230 struct arcnet_local *lp;
1da177e4
LT
231 com20020_dev_t *info;
232 struct net_device *dev;
dd0fab5b 233 int i, ret;
1da177e4
LT
234 int ioaddr;
235
1da177e4
LT
236 info = link->priv;
237 dev = info->dev;
238
dd0fab5b 239 dev_dbg(&link->dev, "config...\n");
1da177e4 240
dd0fab5b 241 dev_dbg(&link->dev, "com20020_config\n");
1da177e4 242
90abdc3b
DB
243 dev_dbg(&link->dev, "baseport1 is %Xh\n",
244 (unsigned int) link->resource[0]->start);
245
4c89e88b 246 i = -ENODEV;
90abdc3b
DB
247 link->io_lines = 16;
248
249 if (!link->resource[0]->start)
1da177e4
LT
250 {
251 for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)
252 {
90abdc3b
DB
253 link->resource[0]->start = ioaddr;
254 i = pcmcia_request_io(link);
4c89e88b 255 if (i == 0)
1da177e4
LT
256 break;
257 }
258 }
259 else
90abdc3b 260 i = pcmcia_request_io(link);
1da177e4 261
4c89e88b 262 if (i != 0)
1da177e4 263 {
dd0fab5b 264 dev_dbg(&link->dev, "requestIO failed totally!\n");
1da177e4
LT
265 goto failed;
266 }
267
9a017a91 268 ioaddr = dev->base_addr = link->resource[0]->start;
dd0fab5b 269 dev_dbg(&link->dev, "got ioaddr %Xh\n", ioaddr);
1da177e4 270
5fa9167a 271 dev_dbg(&link->dev, "request IRQ %d\n",
eb14120f
DB
272 link->irq);
273 if (!link->irq)
1da177e4 274 {
dd0fab5b 275 dev_dbg(&link->dev, "requestIRQ failed totally!\n");
1da177e4
LT
276 goto failed;
277 }
278
eb14120f 279 dev->irq = link->irq;
1da177e4 280
dd0fab5b
DB
281 ret = pcmcia_request_configuration(link, &link->conf);
282 if (ret)
283 goto failed;
1da177e4
LT
284
285 if (com20020_check(dev))
286 {
287 regdump(dev);
288 goto failed;
289 }
290
4cf1653a 291 lp = netdev_priv(dev);
1da177e4
LT
292 lp->card_name = "PCMCIA COM20020";
293 lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */
294
dd2e5a15 295 SET_NETDEV_DEV(dev, &link->dev);
1da177e4
LT
296
297 i = com20020_found(dev, 0); /* calls register_netdev */
298
299 if (i != 0) {
636b8116
JP
300 dev_notice(&link->dev,
301 "com20020_found() failed\n");
1da177e4
LT
302 goto failed;
303 }
304
636b8116
JP
305 netdev_dbg(dev, "port %#3lx, irq %d\n",
306 dev->base_addr, dev->irq);
15b99ac1 307 return 0;
1da177e4 308
1da177e4 309failed:
dd0fab5b 310 dev_dbg(&link->dev, "com20020_config failed...\n");
1da177e4 311 com20020_release(link);
15b99ac1 312 return -ENODEV;
1da177e4
LT
313} /* com20020_config */
314
315/*======================================================================
316
317 After a card is removed, com20020_release() will unregister the net
318 device, and release the PCMCIA configuration. If the device is
319 still open, this will be postponed until it is closed.
320
321======================================================================*/
322
fba395ee 323static void com20020_release(struct pcmcia_device *link)
1da177e4 324{
dd0fab5b 325 dev_dbg(&link->dev, "com20020_release\n");
fba395ee 326 pcmcia_disable_device(link);
1da177e4
LT
327}
328
fba395ee 329static int com20020_suspend(struct pcmcia_device *link)
98e4c28b 330{
98e4c28b
DB
331 com20020_dev_t *info = link->priv;
332 struct net_device *dev = info->dev;
333
e2d40963 334 if (link->open)
8661bb5b 335 netif_device_detach(dev);
98e4c28b
DB
336
337 return 0;
338}
339
fba395ee 340static int com20020_resume(struct pcmcia_device *link)
98e4c28b 341{
98e4c28b
DB
342 com20020_dev_t *info = link->priv;
343 struct net_device *dev = info->dev;
344
e2d40963 345 if (link->open) {
8661bb5b 346 int ioaddr = dev->base_addr;
4cf1653a 347 struct arcnet_local *lp = netdev_priv(dev);
8661bb5b
DB
348 ARCRESET;
349 }
98e4c28b
DB
350
351 return 0;
352}
353
7fb22bb4 354static struct pcmcia_device_id com20020_ids[] = {
6bb1c39a
MS
355 PCMCIA_DEVICE_PROD_ID12("Contemporary Control Systems, Inc.",
356 "PCM20 Arcnet Adapter", 0x59991666, 0x95dfffaf),
357 PCMCIA_DEVICE_PROD_ID12("SoHard AG",
358 "SH ARC PCMCIA", 0xf8991729, 0x69dff0c7),
7fb22bb4
DB
359 PCMCIA_DEVICE_NULL
360};
361MODULE_DEVICE_TABLE(pcmcia, com20020_ids);
1da177e4
LT
362
363static struct pcmcia_driver com20020_cs_driver = {
364 .owner = THIS_MODULE,
365 .drv = {
366 .name = "com20020_cs",
367 },
15b99ac1 368 .probe = com20020_probe,
cc3b4866 369 .remove = com20020_detach,
7fb22bb4 370 .id_table = com20020_ids,
98e4c28b
DB
371 .suspend = com20020_suspend,
372 .resume = com20020_resume,
1da177e4
LT
373};
374
375static int __init init_com20020_cs(void)
376{
377 return pcmcia_register_driver(&com20020_cs_driver);
378}
379
380static void __exit exit_com20020_cs(void)
381{
382 pcmcia_unregister_driver(&com20020_cs_driver);
1da177e4
LT
383}
384
385module_init(init_com20020_cs);
386module_exit(exit_com20020_cs);
This page took 0.665937 seconds and 5 git commands to generate.