arcnet: Convert printk to pr_<level>
[cascardo/linux.git] / drivers / net / arcnet / com20020-pci.c
1 /*
2  * Linux ARCnet driver - COM20020 PCI support
3  * Contemporary Controls PCI20 and SOHARD SH-ARC PCI
4  *
5  * Written 1994-1999 by Avery Pennarun,
6  *    based on an ISA version by David Woodhouse.
7  * Written 1999-2000 by Martin Mares <mj@ucw.cz>.
8  * 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  *
25  * For more details, see drivers/net/arcnet.c
26  *
27  * **********************
28  */
29
30 #define pr_fmt(fmt) "arcnet:" KBUILD_MODNAME ": " fmt
31
32 #include <linux/module.h>
33 #include <linux/moduleparam.h>
34 #include <linux/kernel.h>
35 #include <linux/types.h>
36 #include <linux/ioport.h>
37 #include <linux/errno.h>
38 #include <linux/netdevice.h>
39 #include <linux/init.h>
40 #include <linux/interrupt.h>
41 #include <linux/pci.h>
42 #include <linux/arcdevice.h>
43 #include <linux/com20020.h>
44 #include <linux/list.h>
45
46 #include <linux/io.h>
47
48 /* Module parameters */
49
50 static int node;
51 static char device[9];          /* use eg. device="arc1" to change name */
52 static int timeout = 3;
53 static int backplane;
54 static int clockp;
55 static int clockm;
56
57 module_param(node, int, 0);
58 module_param_string(device, device, sizeof(device), 0);
59 module_param(timeout, int, 0);
60 module_param(backplane, int, 0);
61 module_param(clockp, int, 0);
62 module_param(clockm, int, 0);
63 MODULE_LICENSE("GPL");
64
65 static void com20020pci_remove(struct pci_dev *pdev);
66
67 static int com20020pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
68 {
69         struct com20020_pci_card_info *ci;
70         struct net_device *dev;
71         struct arcnet_local *lp;
72         struct com20020_priv *priv;
73         int i, ioaddr, ret;
74         struct resource *r;
75
76         if (pci_enable_device(pdev))
77                 return -EIO;
78
79         priv = devm_kzalloc(&pdev->dev, sizeof(struct com20020_priv),
80                             GFP_KERNEL);
81         if (!priv)
82                 return -ENOMEM;
83
84         ci = (struct com20020_pci_card_info *)id->driver_data;
85         priv->ci = ci;
86
87         INIT_LIST_HEAD(&priv->list_dev);
88
89         for (i = 0; i < ci->devcount; i++) {
90                 struct com20020_pci_channel_map *cm = &ci->chan_map_tbl[i];
91                 struct com20020_dev *card;
92
93                 dev = alloc_arcdev(device);
94                 if (!dev) {
95                         ret = -ENOMEM;
96                         goto out_port;
97                 }
98
99                 dev->netdev_ops = &com20020_netdev_ops;
100
101                 lp = netdev_priv(dev);
102
103                 arc_printk(D_NORMAL, dev, "%s Controls\n", ci->name);
104                 ioaddr = pci_resource_start(pdev, cm->bar) + cm->offset;
105
106                 r = devm_request_region(&pdev->dev, ioaddr, cm->size,
107                                         "com20020-pci");
108                 if (!r) {
109                         pr_err("IO region %xh-%xh already allocated\n",
110                                ioaddr, ioaddr + cm->size - 1);
111                         ret = -EBUSY;
112                         goto out_port;
113                 }
114
115                 /* Dummy access after Reset
116                  * ARCNET controller needs
117                  * this access to detect bustype
118                  */
119                 outb(0x00, ioaddr + 1);
120                 inb(ioaddr + 1);
121
122                 dev->base_addr = ioaddr;
123                 dev->dev_addr[0] = node;
124                 dev->irq = pdev->irq;
125                 lp->card_name = "PCI COM20020";
126                 lp->card_flags = ci->flags;
127                 lp->backplane = backplane;
128                 lp->clockp = clockp & 7;
129                 lp->clockm = clockm & 3;
130                 lp->timeout = timeout;
131                 lp->hw.owner = THIS_MODULE;
132
133                 if (ASTATUS() == 0xFF) {
134                         pr_err("IO address %Xh is empty!\n", ioaddr);
135                         ret = -EIO;
136                         goto out_port;
137                 }
138                 if (com20020_check(dev)) {
139                         ret = -EIO;
140                         goto out_port;
141                 }
142
143                 card = devm_kzalloc(&pdev->dev, sizeof(struct com20020_dev),
144                                     GFP_KERNEL);
145                 if (!card) {
146                         pr_err("%s out of memory!\n", __func__);
147                         return -ENOMEM;
148                 }
149
150                 card->index = i;
151                 card->pci_priv = priv;
152                 card->dev = dev;
153
154                 dev_set_drvdata(&dev->dev, card);
155
156                 ret = com20020_found(dev, IRQF_SHARED);
157                 if (ret)
158                         goto out_port;
159
160                 list_add(&card->list, &priv->list_dev);
161         }
162
163         pci_set_drvdata(pdev, priv);
164
165         return 0;
166
167 out_port:
168         com20020pci_remove(pdev);
169         return ret;
170 }
171
172 static void com20020pci_remove(struct pci_dev *pdev)
173 {
174         struct com20020_dev *card, *tmpcard;
175         struct com20020_priv *priv;
176
177         priv = pci_get_drvdata(pdev);
178
179         list_for_each_entry_safe(card, tmpcard, &priv->list_dev, list) {
180                 struct net_device *dev = card->dev;
181
182                 unregister_netdev(dev);
183                 free_irq(dev->irq, dev);
184                 free_netdev(dev);
185         }
186 }
187
188 static struct com20020_pci_card_info card_info_10mbit = {
189         .name = "ARC-PCI",
190         .devcount = 1,
191         .chan_map_tbl = {
192                 { 2, 0x00, 0x08 },
193         },
194         .flags = ARC_CAN_10MBIT,
195 };
196
197 static struct com20020_pci_card_info card_info_5mbit = {
198         .name = "ARC-PCI",
199         .devcount = 1,
200         .chan_map_tbl = {
201                 { 2, 0x00, 0x08 },
202         },
203         .flags = ARC_IS_5MBIT,
204 };
205
206 static struct com20020_pci_card_info card_info_sohard = {
207         .name = "PLX-PCI",
208         .devcount = 1,
209         /* SOHARD needs PCI base addr 4 */
210         .chan_map_tbl = {
211                 {4, 0x00, 0x08},
212         },
213         .flags = ARC_CAN_10MBIT,
214 };
215
216 static struct com20020_pci_card_info card_info_eae_arc1 = {
217         .name = "EAE PLX-PCI ARC1",
218         .devcount = 1,
219         .chan_map_tbl = {
220                 { 2, 0x00, 0x08 },
221         },
222         .flags = ARC_CAN_10MBIT,
223 };
224
225 static struct com20020_pci_card_info card_info_eae_ma1 = {
226         .name = "EAE PLX-PCI MA1",
227         .devcount = 2,
228         .chan_map_tbl = {
229                 { 2, 0x00, 0x08 },
230                 { 2, 0x08, 0x08 }
231         },
232         .flags = ARC_CAN_10MBIT,
233 };
234
235 static const struct pci_device_id com20020pci_id_table[] = {
236         {
237                 0x1571, 0xa001,
238                 PCI_ANY_ID, PCI_ANY_ID,
239                 0, 0,
240                 0,
241         },
242         {
243                 0x1571, 0xa002,
244                 PCI_ANY_ID, PCI_ANY_ID,
245                 0, 0,
246                 0,
247         },
248         {
249                 0x1571, 0xa003,
250                 PCI_ANY_ID, PCI_ANY_ID,
251                 0, 0,
252                 0
253         },
254         {
255                 0x1571, 0xa004,
256                 PCI_ANY_ID, PCI_ANY_ID,
257                 0, 0,
258                 0,
259         },
260         {
261                 0x1571, 0xa005,
262                 PCI_ANY_ID, PCI_ANY_ID,
263                 0, 0,
264                 0
265         },
266         {
267                 0x1571, 0xa006,
268                 PCI_ANY_ID, PCI_ANY_ID,
269                 0, 0,
270                 0
271         },
272         {
273                 0x1571, 0xa007,
274                 PCI_ANY_ID, PCI_ANY_ID,
275                 0, 0,
276                 0
277         },
278         {
279                 0x1571, 0xa008,
280                 PCI_ANY_ID, PCI_ANY_ID,
281                 0, 0,
282                 0
283         },
284         {
285                 0x1571, 0xa009,
286                 PCI_ANY_ID, PCI_ANY_ID,
287                 0, 0,
288                 (kernel_ulong_t)&card_info_5mbit
289         },
290         {
291                 0x1571, 0xa00a,
292                 PCI_ANY_ID, PCI_ANY_ID,
293                 0, 0,
294                 (kernel_ulong_t)&card_info_5mbit
295         },
296         {
297                 0x1571, 0xa00b,
298                 PCI_ANY_ID, PCI_ANY_ID,
299                 0, 0,
300                 (kernel_ulong_t)&card_info_5mbit
301         },
302         {
303                 0x1571, 0xa00c,
304                 PCI_ANY_ID, PCI_ANY_ID,
305                 0, 0,
306                 (kernel_ulong_t)&card_info_5mbit
307         },
308         {
309                 0x1571, 0xa00d,
310                 PCI_ANY_ID, PCI_ANY_ID,
311                 0, 0,
312                 (kernel_ulong_t)&card_info_5mbit
313         },
314         {
315                 0x1571, 0xa00e,
316                 PCI_ANY_ID, PCI_ANY_ID,
317                 0, 0,
318                 (kernel_ulong_t)&card_info_5mbit
319         },
320         {
321                 0x1571, 0xa201,
322                 PCI_ANY_ID, PCI_ANY_ID,
323                 0, 0,
324                 (kernel_ulong_t)&card_info_10mbit
325         },
326         {
327                 0x1571, 0xa202,
328                 PCI_ANY_ID, PCI_ANY_ID,
329                 0, 0,
330                 (kernel_ulong_t)&card_info_10mbit
331         },
332         {
333                 0x1571, 0xa203,
334                 PCI_ANY_ID, PCI_ANY_ID,
335                 0, 0,
336                 (kernel_ulong_t)&card_info_10mbit
337         },
338         {
339                 0x1571, 0xa204,
340                 PCI_ANY_ID, PCI_ANY_ID,
341                 0, 0,
342                 (kernel_ulong_t)&card_info_10mbit
343         },
344         {
345                 0x1571, 0xa205,
346                 PCI_ANY_ID, PCI_ANY_ID,
347                 0, 0,
348                 (kernel_ulong_t)&card_info_10mbit
349         },
350         {
351                 0x1571, 0xa206,
352                 PCI_ANY_ID, PCI_ANY_ID,
353                 0, 0,
354                 (kernel_ulong_t)&card_info_10mbit
355         },
356         {
357                 0x10B5, 0x9030,
358                 0x10B5, 0x2978,
359                 0, 0,
360                 (kernel_ulong_t)&card_info_sohard
361         },
362         {
363                 0x10B5, 0x9050,
364                 0x10B5, 0x2273,
365                 0, 0,
366                 (kernel_ulong_t)&card_info_sohard
367         },
368         {
369                 0x10B5, 0x9050,
370                 0x10B5, 0x3263,
371                 0, 0,
372                 (kernel_ulong_t)&card_info_eae_arc1
373         },
374         {
375                 0x10B5, 0x9050,
376                 0x10B5, 0x3292,
377                 0, 0,
378                 (kernel_ulong_t)&card_info_eae_ma1
379         },
380         {
381                 0x14BA, 0x6000,
382                 PCI_ANY_ID, PCI_ANY_ID,
383                 0, 0,
384                 (kernel_ulong_t)&card_info_10mbit
385         },
386         {
387                 0x10B5, 0x2200,
388                 PCI_ANY_ID, PCI_ANY_ID,
389                 0, 0,
390                 (kernel_ulong_t)&card_info_10mbit
391         },
392         { 0, }
393 };
394
395 MODULE_DEVICE_TABLE(pci, com20020pci_id_table);
396
397 static struct pci_driver com20020pci_driver = {
398         .name           = "com20020",
399         .id_table       = com20020pci_id_table,
400         .probe          = com20020pci_probe,
401         .remove         = com20020pci_remove,
402 };
403
404 static int __init com20020pci_init(void)
405 {
406         if (BUGLVL(D_NORMAL))
407                 pr_info("%s\n", "COM20020 PCI support");
408         return pci_register_driver(&com20020pci_driver);
409 }
410
411 static void __exit com20020pci_cleanup(void)
412 {
413         pci_unregister_driver(&com20020pci_driver);
414 }
415
416 module_init(com20020pci_init)
417 module_exit(com20020pci_cleanup)