904c5cb04e71b8387db321f2b01c57fef663f10a
[linux-3.10.git] / drivers / net / pcmcia / ibmtr_cs.c
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
60 #include <pcmcia/cs_types.h>
61 #include <pcmcia/cs.h>
62 #include <pcmcia/cistpl.h>
63 #include <pcmcia/ds.h>
64
65 #include <asm/uaccess.h>
66 #include <asm/io.h>
67 #include <asm/system.h>
68
69 #define PCMCIA
70 #include "../tokenring/ibmtr.c"
71
72 #ifdef PCMCIA_DEBUG
73 static int pc_debug = PCMCIA_DEBUG;
74 module_param(pc_debug, int, 0);
75 #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
76 static char *version =
77 "ibmtr_cs.c 1.10   1996/01/06 05:19:00 (Steve Kipisz)\n"
78 "           2.2.7  1999/05/03 12:00:00 (Mike Phillips)\n"
79 "           2.4.2  2001/30/28 Midnight (Burt Silverman)\n";
80 #else
81 #define DEBUG(n, args...)
82 #endif
83
84 /*====================================================================*/
85
86 /* Parameters that can be set with 'insmod' */
87
88 /* MMIO base address */
89 static u_long mmiobase = 0xce000;
90
91 /* SRAM base address */
92 static u_long srambase = 0xd0000;
93
94 /* SRAM size 8,16,32,64 */
95 static u_long sramsize = 64;
96
97 /* Ringspeed 4,16 */
98 static int ringspeed = 16;
99
100 module_param(mmiobase, ulong, 0);
101 module_param(srambase, ulong, 0);
102 module_param(sramsize, ulong, 0);
103 module_param(ringspeed, int, 0);
104 MODULE_LICENSE("GPL");
105
106 /*====================================================================*/
107
108 static void ibmtr_config(dev_link_t *link);
109 static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase);
110 static void ibmtr_release(dev_link_t *link);
111 static void ibmtr_detach(struct pcmcia_device *p_dev);
112
113 /*====================================================================*/
114
115 typedef struct ibmtr_dev_t {
116     dev_link_t          link;
117     struct net_device   *dev;
118     dev_node_t          node;
119     window_handle_t     sram_win_handle;
120     struct tok_info     *ti;
121 } ibmtr_dev_t;
122
123 static void netdev_get_drvinfo(struct net_device *dev,
124                                struct ethtool_drvinfo *info)
125 {
126         strcpy(info->driver, "ibmtr_cs");
127 }
128
129 static struct ethtool_ops netdev_ethtool_ops = {
130         .get_drvinfo            = netdev_get_drvinfo,
131 };
132
133 /*======================================================================
134
135     ibmtr_attach() creates an "instance" of the driver, allocating
136     local data structures for one device.  The device is registered
137     with Card Services.
138
139 ======================================================================*/
140
141 static int ibmtr_attach(struct pcmcia_device *p_dev)
142 {
143     ibmtr_dev_t *info;
144     dev_link_t *link;
145     struct net_device *dev;
146     
147     DEBUG(0, "ibmtr_attach()\n");
148
149     /* Create new token-ring device */
150     info = kmalloc(sizeof(*info), GFP_KERNEL); 
151     if (!info) return -ENOMEM;
152     memset(info,0,sizeof(*info));
153     dev = alloc_trdev(sizeof(struct tok_info));
154     if (!dev) {
155         kfree(info);
156         return -ENOMEM;
157     }
158
159     link = &info->link;
160     link->priv = info;
161     info->ti = netdev_priv(dev);
162
163     link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
164     link->io.NumPorts1 = 4;
165     link->io.IOAddrLines = 16;
166     link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
167     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
168     link->irq.Handler = &tok_interrupt;
169     link->conf.Attributes = CONF_ENABLE_IRQ;
170     link->conf.IntType = INT_MEMORY_AND_IO;
171     link->conf.Present = PRESENT_OPTION;
172
173     link->irq.Instance = info->dev = dev;
174     
175     SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
176
177     link->handle = p_dev;
178     p_dev->instance = link;
179
180     link->state |= DEV_PRESENT;
181     ibmtr_config(link);
182
183     return 0;
184 } /* ibmtr_attach */
185
186 /*======================================================================
187
188     This deletes a driver "instance".  The device is de-registered
189     with Card Services.  If it has been released, all local data
190     structures are freed.  Otherwise, the structures will be freed
191     when the device is released.
192
193 ======================================================================*/
194
195 static void ibmtr_detach(struct pcmcia_device *p_dev)
196 {
197     dev_link_t *link = dev_to_instance(p_dev);
198     struct ibmtr_dev_t *info = link->priv;
199     struct net_device *dev = info->dev;
200
201     DEBUG(0, "ibmtr_detach(0x%p)\n", link);
202
203     if (link->dev)
204         unregister_netdev(dev);
205
206     {
207         struct tok_info *ti = netdev_priv(dev);
208         del_timer_sync(&(ti->tr_timer));
209     }
210     if (link->state & DEV_CONFIG)
211         ibmtr_release(link);
212
213     free_netdev(dev);
214     kfree(info);
215 } /* ibmtr_detach */
216
217 /*======================================================================
218
219     ibmtr_config() is scheduled to run after a CARD_INSERTION event
220     is received, to configure the PCMCIA socket, and to make the
221     token-ring device available to the system.
222
223 ======================================================================*/
224
225 #define CS_CHECK(fn, ret) \
226 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
227
228 static void ibmtr_config(dev_link_t *link)
229 {
230     client_handle_t handle = link->handle;
231     ibmtr_dev_t *info = link->priv;
232     struct net_device *dev = info->dev;
233     struct tok_info *ti = netdev_priv(dev);
234     tuple_t tuple;
235     cisparse_t parse;
236     win_req_t req;
237     memreq_t mem;
238     int i, last_ret, last_fn;
239     u_char buf[64];
240
241     DEBUG(0, "ibmtr_config(0x%p)\n", link);
242
243     tuple.Attributes = 0;
244     tuple.TupleData = buf;
245     tuple.TupleDataMax = 64;
246     tuple.TupleOffset = 0;
247     tuple.DesiredTuple = CISTPL_CONFIG;
248     CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
249     CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
250     CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
251     link->conf.ConfigBase = parse.config.base;
252
253     /* Configure card */
254     link->state |= DEV_CONFIG;
255
256     link->conf.ConfigIndex = 0x61;
257
258     /* Determine if this is PRIMARY or ALTERNATE. */
259
260     /* Try PRIMARY card at 0xA20-0xA23 */
261     link->io.BasePort1 = 0xA20;
262     i = pcmcia_request_io(link->handle, &link->io);
263     if (i != CS_SUCCESS) {
264         /* Couldn't get 0xA20-0xA23.  Try ALTERNATE at 0xA24-0xA27. */
265         link->io.BasePort1 = 0xA24;
266         CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
267     }
268     dev->base_addr = link->io.BasePort1;
269
270     CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
271     dev->irq = link->irq.AssignedIRQ;
272     ti->irq = link->irq.AssignedIRQ;
273     ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
274
275     /* Allocate the MMIO memory window */
276     req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
277     req.Attributes |= WIN_USE_WAIT;
278     req.Base = 0; 
279     req.Size = 0x2000;
280     req.AccessSpeed = 250;
281     CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
282
283     mem.CardOffset = mmiobase;
284     mem.Page = 0;
285     CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
286     ti->mmio = ioremap(req.Base, req.Size);
287
288     /* Allocate the SRAM memory window */
289     req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
290     req.Attributes |= WIN_USE_WAIT;
291     req.Base = 0;
292     req.Size = sramsize * 1024;
293     req.AccessSpeed = 250;
294     CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle));
295
296     mem.CardOffset = srambase;
297     mem.Page = 0;
298     CS_CHECK(MapMemPage, pcmcia_map_mem_page(info->sram_win_handle, &mem));
299
300     ti->sram_base = mem.CardOffset >> 12;
301     ti->sram_virt = ioremap(req.Base, req.Size);
302     ti->sram_phys = req.Base;
303
304     CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
305
306     /*  Set up the Token-Ring Controller Configuration Register and
307         turn on the card.  Check the "Local Area Network Credit Card
308         Adapters Technical Reference"  SC30-3585 for this info.  */
309     ibmtr_hw_setup(dev, mmiobase);
310
311     link->dev = &info->node;
312     link->state &= ~DEV_CONFIG_PENDING;
313     SET_NETDEV_DEV(dev, &handle_to_dev(handle));
314
315     i = ibmtr_probe_card(dev);
316     if (i != 0) {
317         printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
318         link->dev = NULL;
319         goto failed;
320     }
321
322     strcpy(info->node.dev_name, dev->name);
323
324     printk(KERN_INFO "%s: port %#3lx, irq %d,",
325            dev->name, dev->base_addr, dev->irq);
326     printk (" mmio %#5lx,", (u_long)ti->mmio);
327     printk (" sram %#5lx,", (u_long)ti->sram_base << 12);
328     printk ("\n" KERN_INFO "  hwaddr=");
329     for (i = 0; i < TR_ALEN; i++)
330         printk("%02X", dev->dev_addr[i]);
331     printk("\n");
332     return;
333
334 cs_failed:
335     cs_error(link->handle, last_fn, last_ret);
336 failed:
337     ibmtr_release(link);
338 } /* ibmtr_config */
339
340 /*======================================================================
341
342     After a card is removed, ibmtr_release() will unregister the net
343     device, and release the PCMCIA configuration.  If the device is
344     still open, this will be postponed until it is closed.
345
346 ======================================================================*/
347
348 static void ibmtr_release(dev_link_t *link)
349 {
350         ibmtr_dev_t *info = link->priv;
351         struct net_device *dev = info->dev;
352
353         DEBUG(0, "ibmtr_release(0x%p)\n", link);
354
355         if (link->win) {
356                 struct tok_info *ti = netdev_priv(dev);
357                 iounmap(ti->mmio);
358                 pcmcia_release_window(info->sram_win_handle);
359         }
360         pcmcia_disable_device(link->handle);
361 }
362
363 static int ibmtr_suspend(struct pcmcia_device *p_dev)
364 {
365         dev_link_t *link = dev_to_instance(p_dev);
366         ibmtr_dev_t *info = link->priv;
367         struct net_device *dev = info->dev;
368
369         if ((link->state & DEV_CONFIG) && (link->open))
370                 netif_device_detach(dev);
371
372         return 0;
373 }
374
375 static int ibmtr_resume(struct pcmcia_device *p_dev)
376 {
377         dev_link_t *link = dev_to_instance(p_dev);
378         ibmtr_dev_t *info = link->priv;
379         struct net_device *dev = info->dev;
380
381         if ((link->state & DEV_CONFIG) && (link->open)) {
382                 ibmtr_probe(dev);       /* really? */
383                 netif_device_attach(dev);
384         }
385
386         return 0;
387 }
388
389
390 /*====================================================================*/
391
392 static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
393 {
394     int i;
395
396     /* Bizarre IBM behavior, there are 16 bits of information we
397        need to set, but the card only allows us to send 4 bits at a 
398        time.  For each byte sent to base_addr, bits 7-4 tell the
399        card which part of the 16 bits we are setting, bits 3-0 contain 
400        the actual information */
401
402     /* First nibble provides 4 bits of mmio */
403     i = (mmiobase >> 16) & 0x0F;
404     outb(i, dev->base_addr);
405
406     /* Second nibble provides 3 bits of mmio */
407     i = 0x10 | ((mmiobase >> 12) & 0x0E);
408     outb(i, dev->base_addr);
409
410     /* Third nibble, hard-coded values */
411     i = 0x26;
412     outb(i, dev->base_addr);
413
414     /* Fourth nibble sets shared ram page size */
415
416     /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */          
417     i = (sramsize >> 4) & 0x07;
418     i = ((i == 4) ? 3 : i) << 2;
419     i |= 0x30;
420
421     if (ringspeed == 16)
422         i |= 2;
423     if (dev->base_addr == 0xA24)
424         i |= 1;
425     outb(i, dev->base_addr);
426
427     /* 0x40 will release the card for use */
428     outb(0x40, dev->base_addr);
429
430     return;
431 }
432
433 static struct pcmcia_device_id ibmtr_ids[] = {
434         PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
435         PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
436         PCMCIA_DEVICE_NULL,
437 };
438 MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
439
440 static struct pcmcia_driver ibmtr_cs_driver = {
441         .owner          = THIS_MODULE,
442         .drv            = {
443                 .name   = "ibmtr_cs",
444         },
445         .probe          = ibmtr_attach,
446         .remove         = ibmtr_detach,
447         .id_table       = ibmtr_ids,
448         .suspend        = ibmtr_suspend,
449         .resume         = ibmtr_resume,
450 };
451
452 static int __init init_ibmtr_cs(void)
453 {
454         return pcmcia_register_driver(&ibmtr_cs_driver);
455 }
456
457 static void __exit exit_ibmtr_cs(void)
458 {
459         pcmcia_unregister_driver(&ibmtr_cs_driver);
460 }
461
462 module_init(init_ibmtr_cs);
463 module_exit(exit_ibmtr_cs);