pcmcia: simplify IntType
[deliverable/linux.git] / drivers / net / pcmcia / ibmtr_cs.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A PCMCIA token-ring driver for IBM-based cards
4
5 This driver supports the IBM PCMCIA Token-Ring Card.
6 Written by Steve Kipisz, kipisz@vnet.ibm.com or
7 bungy@ibm.net
8
9 Written 1995,1996.
10
11 This code is based on pcnet_cs.c from David Hinds.
12
13 V2.2.0 February 1999 - Mike Phillips phillim@amtrak.com
14
15 Linux V2.2.x presented significant changes to the underlying
16 ibmtr.c code. Mainly the code became a lot more organized and
17 modular.
18
19 This caused the old PCMCIA Token Ring driver to give up and go
20 home early. Instead of just patching the old code to make it
21 work, the PCMCIA code has been streamlined, updated and possibly
22 improved.
23
24 This code now only contains code required for the Card Services.
25 All we do here is set the card up enough so that the real ibmtr.c
26 driver can find it and work with it properly.
27
28 i.e. We set up the io port, irq, mmio memory and shared ram
29 memory. This enables ibmtr_probe in ibmtr.c to find the card and
30 configure it as though it was a normal ISA and/or PnP card.
31
32 CHANGES
33
34 v2.2.5 April 1999 Mike Phillips (phillim@amtrak.com)
35 Obscure bug fix, required changed to ibmtr.c not ibmtr_cs.c
36
37 v2.2.7 May 1999 Mike Phillips (phillim@amtrak.com)
38 Updated to version 2.2.7 to match the first version of the kernel
39 that the modification to ibmtr.c were incorporated into.
40
41 v2.2.17 July 2000 Burt Silverman (burts@us.ibm.com)
42 Address translation feature of PCMCIA controller is usable so
43 memory windows can be placed in High memory (meaning above
44 0xFFFFF.)
45
46======================================================================*/
47
48#include <linux/kernel.h>
49#include <linux/init.h>
50#include <linux/ptrace.h>
51#include <linux/slab.h>
52#include <linux/string.h>
53#include <linux/timer.h>
54#include <linux/module.h>
55#include <linux/ethtool.h>
56#include <linux/netdevice.h>
57#include <linux/trdevice.h>
58#include <linux/ibmtr.h>
59
1da177e4
LT
60#include <pcmcia/cs.h>
61#include <pcmcia/cistpl.h>
62#include <pcmcia/ds.h>
63
64#include <asm/uaccess.h>
65#include <asm/io.h>
66#include <asm/system.h>
67
68#define PCMCIA
69#include "../tokenring/ibmtr.c"
70
1da177e4
LT
71
72/*====================================================================*/
73
74/* Parameters that can be set with 'insmod' */
75
76/* MMIO base address */
77static u_long mmiobase = 0xce000;
78
79/* SRAM base address */
80static u_long srambase = 0xd0000;
81
82/* SRAM size 8,16,32,64 */
83static u_long sramsize = 64;
84
85/* Ringspeed 4,16 */
86static int ringspeed = 16;
87
88module_param(mmiobase, ulong, 0);
89module_param(srambase, ulong, 0);
90module_param(sramsize, ulong, 0);
91module_param(ringspeed, int, 0);
92MODULE_LICENSE("GPL");
93
94/*====================================================================*/
95
15b99ac1 96static int ibmtr_config(struct pcmcia_device *link);
1da177e4 97static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase);
fba395ee 98static void ibmtr_release(struct pcmcia_device *link);
cc3b4866 99static void ibmtr_detach(struct pcmcia_device *p_dev);
1da177e4 100
1da177e4
LT
101/*====================================================================*/
102
103typedef struct ibmtr_dev_t {
fd238232 104 struct pcmcia_device *p_dev;
cdb13808
DB
105 struct net_device *dev;
106 struct tok_info *ti;
1da177e4
LT
107} ibmtr_dev_t;
108
109static void netdev_get_drvinfo(struct net_device *dev,
110 struct ethtool_drvinfo *info)
111{
112 strcpy(info->driver, "ibmtr_cs");
113}
114
7282d491 115static const struct ethtool_ops netdev_ethtool_ops = {
1da177e4
LT
116 .get_drvinfo = netdev_get_drvinfo,
117};
118
5fa9167a
DB
119static irqreturn_t ibmtr_interrupt(int irq, void *dev_id) {
120 ibmtr_dev_t *info = dev_id;
121 struct net_device *dev = info->dev;
122 return tok_interrupt(irq, dev);
123};
124
1da177e4
LT
125/*======================================================================
126
127 ibmtr_attach() creates an "instance" of the driver, allocating
128 local data structures for one device. The device is registered
129 with Card Services.
130
131======================================================================*/
132
abf0437b 133static int __devinit ibmtr_attach(struct pcmcia_device *link)
1da177e4
LT
134{
135 ibmtr_dev_t *info;
1da177e4 136 struct net_device *dev;
fba395ee 137
dd0fab5b 138 dev_dbg(&link->dev, "ibmtr_attach()\n");
1da177e4
LT
139
140 /* Create new token-ring device */
dd00cc48 141 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 142 if (!info) return -ENOMEM;
1da177e4 143 dev = alloc_trdev(sizeof(struct tok_info));
f8cfa618
DB
144 if (!dev) {
145 kfree(info);
146 return -ENOMEM;
147 }
1da177e4 148
fba395ee 149 info->p_dev = link;
1da177e4
LT
150 link->priv = info;
151 info->ti = netdev_priv(dev);
152
90abdc3b
DB
153 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
154 link->resource[0]->end = 4;
1da177e4 155 link->conf.Attributes = CONF_ENABLE_IRQ;
1da177e4
LT
156 link->conf.Present = PRESENT_OPTION;
157
5fa9167a 158 info->dev = dev;
1da177e4 159
fd238232 160 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
1da177e4 161
15b99ac1 162 return ibmtr_config(link);
1da177e4
LT
163} /* ibmtr_attach */
164
165/*======================================================================
166
167 This deletes a driver "instance". The device is de-registered
168 with Card Services. If it has been released, all local data
169 structures are freed. Otherwise, the structures will be freed
170 when the device is released.
171
172======================================================================*/
173
fba395ee 174static void ibmtr_detach(struct pcmcia_device *link)
1da177e4
LT
175{
176 struct ibmtr_dev_t *info = link->priv;
b4635811 177 struct net_device *dev = info->dev;
5bebf82f 178 struct tok_info *ti = netdev_priv(dev);
1da177e4 179
dd0fab5b 180 dev_dbg(&link->dev, "ibmtr_detach\n");
5bebf82f
PW
181
182 /*
183 * When the card removal interrupt hits tok_interrupt(),
184 * bail out early, so we don't crash the machine
185 */
186 ti->sram_phys |= 1;
1da177e4 187
c7c2fa07 188 unregister_netdev(dev);
5bebf82f
PW
189
190 del_timer_sync(&(ti->tr_timer));
e2d40963
DB
191
192 ibmtr_release(link);
1da177e4 193
1da177e4 194 free_netdev(dev);
b4635811 195 kfree(info);
1da177e4
LT
196} /* ibmtr_detach */
197
198/*======================================================================
199
200 ibmtr_config() is scheduled to run after a CARD_INSERTION event
201 is received, to configure the PCMCIA socket, and to make the
202 token-ring device available to the system.
203
204======================================================================*/
205
abf0437b 206static int __devinit ibmtr_config(struct pcmcia_device *link)
1da177e4 207{
1da177e4
LT
208 ibmtr_dev_t *info = link->priv;
209 struct net_device *dev = info->dev;
210 struct tok_info *ti = netdev_priv(dev);
dd0fab5b 211 int i, ret;
1da177e4 212
dd0fab5b 213 dev_dbg(&link->dev, "ibmtr_config\n");
1da177e4 214
1da177e4 215 link->conf.ConfigIndex = 0x61;
90abdc3b 216 link->io_lines = 16;
1da177e4
LT
217
218 /* Determine if this is PRIMARY or ALTERNATE. */
219
220 /* Try PRIMARY card at 0xA20-0xA23 */
90abdc3b
DB
221 link->resource[0]->start = 0xA20;
222 i = pcmcia_request_io(link);
4c89e88b 223 if (i != 0) {
1da177e4 224 /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */
90abdc3b
DB
225 link->resource[0]->start = 0xA24;
226 ret = pcmcia_request_io(link);
dd0fab5b
DB
227 if (ret)
228 goto failed;
1da177e4 229 }
9a017a91 230 dev->base_addr = link->resource[0]->start;
1da177e4 231
eb14120f 232 ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
dd0fab5b
DB
233 if (ret)
234 goto failed;
eb14120f
DB
235 dev->irq = link->irq;
236 ti->irq = link->irq;
1da177e4
LT
237 ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
238
239 /* Allocate the MMIO memory window */
cdb13808
DB
240 link->resource[2]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
241 link->resource[2]->flags |= WIN_USE_WAIT;
242 link->resource[2]->start = 0;
243 link->resource[2]->end = 0x2000;
244 ret = pcmcia_request_window(link, link->resource[2], 250);
dd0fab5b
DB
245 if (ret)
246 goto failed;
1da177e4 247
cdb13808 248 ret = pcmcia_map_mem_page(link, link->resource[2], mmiobase);
dd0fab5b
DB
249 if (ret)
250 goto failed;
cdb13808
DB
251 ti->mmio = ioremap(link->resource[2]->start,
252 resource_size(link->resource[2]));
1da177e4
LT
253
254 /* Allocate the SRAM memory window */
cdb13808
DB
255 link->resource[3]->flags = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
256 link->resource[3]->flags |= WIN_USE_WAIT;
257 link->resource[3]->start = 0;
258 link->resource[3]->end = sramsize * 1024;
259 ret = pcmcia_request_window(link, link->resource[3], 250);
dd0fab5b
DB
260 if (ret)
261 goto failed;
1da177e4 262
cdb13808 263 ret = pcmcia_map_mem_page(link, link->resource[3], srambase);
dd0fab5b
DB
264 if (ret)
265 goto failed;
1da177e4 266
b5cb259e 267 ti->sram_base = srambase >> 12;
cdb13808
DB
268 ti->sram_virt = ioremap(link->resource[3]->start,
269 resource_size(link->resource[3]));
270 ti->sram_phys = link->resource[3]->start;
1da177e4 271
dd0fab5b
DB
272 ret = pcmcia_request_configuration(link, &link->conf);
273 if (ret)
274 goto failed;
1da177e4
LT
275
276 /* Set up the Token-Ring Controller Configuration Register and
277 turn on the card. Check the "Local Area Network Credit Card
278 Adapters Technical Reference" SC30-3585 for this info. */
279 ibmtr_hw_setup(dev, mmiobase);
280
dd2e5a15 281 SET_NETDEV_DEV(dev, &link->dev);
1da177e4
LT
282
283 i = ibmtr_probe_card(dev);
284 if (i != 0) {
285 printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
1da177e4
LT
286 goto failed;
287 }
288
ad361c98
JP
289 printk(KERN_INFO
290 "%s: port %#3lx, irq %d, mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
291 dev->name, dev->base_addr, dev->irq,
292 (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
293 dev->dev_addr);
15b99ac1 294 return 0;
1da177e4 295
1da177e4
LT
296failed:
297 ibmtr_release(link);
15b99ac1 298 return -ENODEV;
1da177e4
LT
299} /* ibmtr_config */
300
301/*======================================================================
302
303 After a card is removed, ibmtr_release() will unregister the net
304 device, and release the PCMCIA configuration. If the device is
305 still open, this will be postponed until it is closed.
306
307======================================================================*/
308
fba395ee 309static void ibmtr_release(struct pcmcia_device *link)
1da177e4 310{
5f2a71fc
DB
311 ibmtr_dev_t *info = link->priv;
312 struct net_device *dev = info->dev;
1da177e4 313
dd0fab5b 314 dev_dbg(&link->dev, "ibmtr_release\n");
1da177e4 315
cdb13808 316 if (link->resource[2]->end) {
5f2a71fc
DB
317 struct tok_info *ti = netdev_priv(dev);
318 iounmap(ti->mmio);
5f2a71fc 319 }
fba395ee 320 pcmcia_disable_device(link);
1da177e4
LT
321}
322
fba395ee 323static int ibmtr_suspend(struct pcmcia_device *link)
98e4c28b 324{
98e4c28b
DB
325 ibmtr_dev_t *info = link->priv;
326 struct net_device *dev = info->dev;
327
e2d40963 328 if (link->open)
8661bb5b 329 netif_device_detach(dev);
98e4c28b
DB
330
331 return 0;
332}
333
8814b505 334static int __devinit ibmtr_resume(struct pcmcia_device *link)
98e4c28b 335{
98e4c28b
DB
336 ibmtr_dev_t *info = link->priv;
337 struct net_device *dev = info->dev;
338
e2d40963 339 if (link->open) {
8661bb5b
DB
340 ibmtr_probe(dev); /* really? */
341 netif_device_attach(dev);
342 }
98e4c28b
DB
343
344 return 0;
345}
346
347
1da177e4
LT
348/*====================================================================*/
349
350static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
351{
352 int i;
353
354 /* Bizarre IBM behavior, there are 16 bits of information we
355 need to set, but the card only allows us to send 4 bits at a
356 time. For each byte sent to base_addr, bits 7-4 tell the
357 card which part of the 16 bits we are setting, bits 3-0 contain
358 the actual information */
359
360 /* First nibble provides 4 bits of mmio */
361 i = (mmiobase >> 16) & 0x0F;
362 outb(i, dev->base_addr);
363
364 /* Second nibble provides 3 bits of mmio */
365 i = 0x10 | ((mmiobase >> 12) & 0x0E);
366 outb(i, dev->base_addr);
367
368 /* Third nibble, hard-coded values */
369 i = 0x26;
370 outb(i, dev->base_addr);
371
372 /* Fourth nibble sets shared ram page size */
373
374 /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */
375 i = (sramsize >> 4) & 0x07;
376 i = ((i == 4) ? 3 : i) << 2;
377 i |= 0x30;
378
379 if (ringspeed == 16)
380 i |= 2;
381 if (dev->base_addr == 0xA24)
382 i |= 1;
383 outb(i, dev->base_addr);
384
385 /* 0x40 will release the card for use */
386 outb(0x40, dev->base_addr);
1da177e4
LT
387}
388
469bf2b9
DB
389static struct pcmcia_device_id ibmtr_ids[] = {
390 PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
391 PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
392 PCMCIA_DEVICE_NULL,
393};
394MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
395
1da177e4
LT
396static struct pcmcia_driver ibmtr_cs_driver = {
397 .owner = THIS_MODULE,
398 .drv = {
399 .name = "ibmtr_cs",
400 },
f8cfa618 401 .probe = ibmtr_attach,
cc3b4866 402 .remove = ibmtr_detach,
469bf2b9 403 .id_table = ibmtr_ids,
98e4c28b
DB
404 .suspend = ibmtr_suspend,
405 .resume = ibmtr_resume,
1da177e4
LT
406};
407
408static int __init init_ibmtr_cs(void)
409{
410 return pcmcia_register_driver(&ibmtr_cs_driver);
411}
412
413static void __exit exit_ibmtr_cs(void)
414{
415 pcmcia_unregister_driver(&ibmtr_cs_driver);
1da177e4
LT
416}
417
418module_init(init_ibmtr_cs);
419module_exit(exit_ibmtr_cs);
This page took 0.601444 seconds and 5 git commands to generate.