pcmcia: convert pcmcia_request_configuration to pcmcia_enable_device
[linux-2.6-block.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/cistpl.h>
61#include <pcmcia/ds.h>
62
63#include <asm/uaccess.h>
64#include <asm/io.h>
65#include <asm/system.h>
66
67#define PCMCIA
68#include "../tokenring/ibmtr.c"
69
1da177e4
LT
70
71/*====================================================================*/
72
73/* Parameters that can be set with 'insmod' */
74
75/* MMIO base address */
76static u_long mmiobase = 0xce000;
77
78/* SRAM base address */
79static u_long srambase = 0xd0000;
80
81/* SRAM size 8,16,32,64 */
82static u_long sramsize = 64;
83
84/* Ringspeed 4,16 */
85static int ringspeed = 16;
86
87module_param(mmiobase, ulong, 0);
88module_param(srambase, ulong, 0);
89module_param(sramsize, ulong, 0);
90module_param(ringspeed, int, 0);
91MODULE_LICENSE("GPL");
92
93/*====================================================================*/
94
15b99ac1 95static int ibmtr_config(struct pcmcia_device *link);
1da177e4 96static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase);
fba395ee 97static void ibmtr_release(struct pcmcia_device *link);
cc3b4866 98static void ibmtr_detach(struct pcmcia_device *p_dev);
1da177e4 99
1da177e4
LT
100/*====================================================================*/
101
102typedef struct ibmtr_dev_t {
fd238232 103 struct pcmcia_device *p_dev;
cdb13808
DB
104 struct net_device *dev;
105 struct tok_info *ti;
1da177e4
LT
106} ibmtr_dev_t;
107
108static void netdev_get_drvinfo(struct net_device *dev,
109 struct ethtool_drvinfo *info)
110{
111 strcpy(info->driver, "ibmtr_cs");
112}
113
7282d491 114static const struct ethtool_ops netdev_ethtool_ops = {
1da177e4
LT
115 .get_drvinfo = netdev_get_drvinfo,
116};
117
5fa9167a
DB
118static irqreturn_t ibmtr_interrupt(int irq, void *dev_id) {
119 ibmtr_dev_t *info = dev_id;
120 struct net_device *dev = info->dev;
121 return tok_interrupt(irq, dev);
122};
123
1da177e4
LT
124/*======================================================================
125
126 ibmtr_attach() creates an "instance" of the driver, allocating
127 local data structures for one device. The device is registered
128 with Card Services.
129
130======================================================================*/
131
abf0437b 132static int __devinit ibmtr_attach(struct pcmcia_device *link)
1da177e4
LT
133{
134 ibmtr_dev_t *info;
1da177e4 135 struct net_device *dev;
fba395ee 136
dd0fab5b 137 dev_dbg(&link->dev, "ibmtr_attach()\n");
1da177e4
LT
138
139 /* Create new token-ring device */
dd00cc48 140 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 141 if (!info) return -ENOMEM;
1da177e4 142 dev = alloc_trdev(sizeof(struct tok_info));
f8cfa618
DB
143 if (!dev) {
144 kfree(info);
145 return -ENOMEM;
146 }
1da177e4 147
fba395ee 148 info->p_dev = link;
1da177e4
LT
149 link->priv = info;
150 info->ti = netdev_priv(dev);
151
90abdc3b
DB
152 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
153 link->resource[0]->end = 4;
1ac71e5a 154 link->config_flags |= CONF_ENABLE_IRQ;
7feabb64 155 link->config_regs = PRESENT_OPTION;
1da177e4 156
5fa9167a 157 info->dev = dev;
1da177e4 158
fd238232 159 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
1da177e4 160
15b99ac1 161 return ibmtr_config(link);
1da177e4
LT
162} /* ibmtr_attach */
163
164/*======================================================================
165
166 This deletes a driver "instance". The device is de-registered
167 with Card Services. If it has been released, all local data
168 structures are freed. Otherwise, the structures will be freed
169 when the device is released.
170
171======================================================================*/
172
fba395ee 173static void ibmtr_detach(struct pcmcia_device *link)
1da177e4
LT
174{
175 struct ibmtr_dev_t *info = link->priv;
b4635811 176 struct net_device *dev = info->dev;
5bebf82f 177 struct tok_info *ti = netdev_priv(dev);
1da177e4 178
dd0fab5b 179 dev_dbg(&link->dev, "ibmtr_detach\n");
5bebf82f
PW
180
181 /*
182 * When the card removal interrupt hits tok_interrupt(),
183 * bail out early, so we don't crash the machine
184 */
185 ti->sram_phys |= 1;
1da177e4 186
c7c2fa07 187 unregister_netdev(dev);
5bebf82f
PW
188
189 del_timer_sync(&(ti->tr_timer));
e2d40963
DB
190
191 ibmtr_release(link);
1da177e4 192
1da177e4 193 free_netdev(dev);
b4635811 194 kfree(info);
1da177e4
LT
195} /* ibmtr_detach */
196
197/*======================================================================
198
199 ibmtr_config() is scheduled to run after a CARD_INSERTION event
200 is received, to configure the PCMCIA socket, and to make the
201 token-ring device available to the system.
202
203======================================================================*/
204
abf0437b 205static int __devinit ibmtr_config(struct pcmcia_device *link)
1da177e4 206{
1da177e4
LT
207 ibmtr_dev_t *info = link->priv;
208 struct net_device *dev = info->dev;
209 struct tok_info *ti = netdev_priv(dev);
dd0fab5b 210 int i, ret;
1da177e4 211
dd0fab5b 212 dev_dbg(&link->dev, "ibmtr_config\n");
1da177e4 213
90abdc3b 214 link->io_lines = 16;
7feabb64 215 link->config_index = 0x61;
1da177e4
LT
216
217 /* Determine if this is PRIMARY or ALTERNATE. */
218
219 /* Try PRIMARY card at 0xA20-0xA23 */
90abdc3b
DB
220 link->resource[0]->start = 0xA20;
221 i = pcmcia_request_io(link);
4c89e88b 222 if (i != 0) {
1da177e4 223 /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */
90abdc3b
DB
224 link->resource[0]->start = 0xA24;
225 ret = pcmcia_request_io(link);
dd0fab5b
DB
226 if (ret)
227 goto failed;
1da177e4 228 }
9a017a91 229 dev->base_addr = link->resource[0]->start;
1da177e4 230
eb14120f 231 ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
dd0fab5b
DB
232 if (ret)
233 goto failed;
eb14120f
DB
234 dev->irq = link->irq;
235 ti->irq = link->irq;
1da177e4
LT
236 ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
237
238 /* Allocate the MMIO memory window */
cdb13808
DB
239 link->resource[2]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
240 link->resource[2]->flags |= WIN_USE_WAIT;
241 link->resource[2]->start = 0;
242 link->resource[2]->end = 0x2000;
243 ret = pcmcia_request_window(link, link->resource[2], 250);
dd0fab5b
DB
244 if (ret)
245 goto failed;
1da177e4 246
cdb13808 247 ret = pcmcia_map_mem_page(link, link->resource[2], mmiobase);
dd0fab5b
DB
248 if (ret)
249 goto failed;
cdb13808
DB
250 ti->mmio = ioremap(link->resource[2]->start,
251 resource_size(link->resource[2]));
1da177e4
LT
252
253 /* Allocate the SRAM memory window */
cdb13808
DB
254 link->resource[3]->flags = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
255 link->resource[3]->flags |= WIN_USE_WAIT;
256 link->resource[3]->start = 0;
257 link->resource[3]->end = sramsize * 1024;
258 ret = pcmcia_request_window(link, link->resource[3], 250);
dd0fab5b
DB
259 if (ret)
260 goto failed;
1da177e4 261
cdb13808 262 ret = pcmcia_map_mem_page(link, link->resource[3], srambase);
dd0fab5b
DB
263 if (ret)
264 goto failed;
1da177e4 265
b5cb259e 266 ti->sram_base = srambase >> 12;
cdb13808
DB
267 ti->sram_virt = ioremap(link->resource[3]->start,
268 resource_size(link->resource[3]));
269 ti->sram_phys = link->resource[3]->start;
1da177e4 270
1ac71e5a 271 ret = pcmcia_enable_device(link);
dd0fab5b
DB
272 if (ret)
273 goto failed;
1da177e4
LT
274
275 /* Set up the Token-Ring Controller Configuration Register and
276 turn on the card. Check the "Local Area Network Credit Card
277 Adapters Technical Reference" SC30-3585 for this info. */
278 ibmtr_hw_setup(dev, mmiobase);
279
dd2e5a15 280 SET_NETDEV_DEV(dev, &link->dev);
1da177e4
LT
281
282 i = ibmtr_probe_card(dev);
283 if (i != 0) {
284 printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
1da177e4
LT
285 goto failed;
286 }
287
ad361c98
JP
288 printk(KERN_INFO
289 "%s: port %#3lx, irq %d, mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
290 dev->name, dev->base_addr, dev->irq,
291 (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
292 dev->dev_addr);
15b99ac1 293 return 0;
1da177e4 294
1da177e4
LT
295failed:
296 ibmtr_release(link);
15b99ac1 297 return -ENODEV;
1da177e4
LT
298} /* ibmtr_config */
299
300/*======================================================================
301
302 After a card is removed, ibmtr_release() will unregister the net
303 device, and release the PCMCIA configuration. If the device is
304 still open, this will be postponed until it is closed.
305
306======================================================================*/
307
fba395ee 308static void ibmtr_release(struct pcmcia_device *link)
1da177e4 309{
5f2a71fc
DB
310 ibmtr_dev_t *info = link->priv;
311 struct net_device *dev = info->dev;
1da177e4 312
dd0fab5b 313 dev_dbg(&link->dev, "ibmtr_release\n");
1da177e4 314
cdb13808 315 if (link->resource[2]->end) {
5f2a71fc
DB
316 struct tok_info *ti = netdev_priv(dev);
317 iounmap(ti->mmio);
5f2a71fc 318 }
fba395ee 319 pcmcia_disable_device(link);
1da177e4
LT
320}
321
fba395ee 322static int ibmtr_suspend(struct pcmcia_device *link)
98e4c28b 323{
98e4c28b
DB
324 ibmtr_dev_t *info = link->priv;
325 struct net_device *dev = info->dev;
326
e2d40963 327 if (link->open)
8661bb5b 328 netif_device_detach(dev);
98e4c28b
DB
329
330 return 0;
331}
332
8814b505 333static int __devinit ibmtr_resume(struct pcmcia_device *link)
98e4c28b 334{
98e4c28b
DB
335 ibmtr_dev_t *info = link->priv;
336 struct net_device *dev = info->dev;
337
e2d40963 338 if (link->open) {
8661bb5b
DB
339 ibmtr_probe(dev); /* really? */
340 netif_device_attach(dev);
341 }
98e4c28b
DB
342
343 return 0;
344}
345
346
1da177e4
LT
347/*====================================================================*/
348
349static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
350{
351 int i;
352
353 /* Bizarre IBM behavior, there are 16 bits of information we
354 need to set, but the card only allows us to send 4 bits at a
355 time. For each byte sent to base_addr, bits 7-4 tell the
356 card which part of the 16 bits we are setting, bits 3-0 contain
357 the actual information */
358
359 /* First nibble provides 4 bits of mmio */
360 i = (mmiobase >> 16) & 0x0F;
361 outb(i, dev->base_addr);
362
363 /* Second nibble provides 3 bits of mmio */
364 i = 0x10 | ((mmiobase >> 12) & 0x0E);
365 outb(i, dev->base_addr);
366
367 /* Third nibble, hard-coded values */
368 i = 0x26;
369 outb(i, dev->base_addr);
370
371 /* Fourth nibble sets shared ram page size */
372
373 /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */
374 i = (sramsize >> 4) & 0x07;
375 i = ((i == 4) ? 3 : i) << 2;
376 i |= 0x30;
377
378 if (ringspeed == 16)
379 i |= 2;
380 if (dev->base_addr == 0xA24)
381 i |= 1;
382 outb(i, dev->base_addr);
383
384 /* 0x40 will release the card for use */
385 outb(0x40, dev->base_addr);
1da177e4
LT
386}
387
469bf2b9
DB
388static struct pcmcia_device_id ibmtr_ids[] = {
389 PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
390 PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
391 PCMCIA_DEVICE_NULL,
392};
393MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
394
1da177e4
LT
395static struct pcmcia_driver ibmtr_cs_driver = {
396 .owner = THIS_MODULE,
397 .drv = {
398 .name = "ibmtr_cs",
399 },
f8cfa618 400 .probe = ibmtr_attach,
cc3b4866 401 .remove = ibmtr_detach,
469bf2b9 402 .id_table = ibmtr_ids,
98e4c28b
DB
403 .suspend = ibmtr_suspend,
404 .resume = ibmtr_resume,
1da177e4
LT
405};
406
407static int __init init_ibmtr_cs(void)
408{
409 return pcmcia_register_driver(&ibmtr_cs_driver);
410}
411
412static void __exit exit_ibmtr_cs(void)
413{
414 pcmcia_unregister_driver(&ibmtr_cs_driver);
1da177e4
LT
415}
416
417module_init(init_ibmtr_cs);
418module_exit(exit_ibmtr_cs);