[PATCH] pcmcia: embed dev_link_t into struct pcmcia_device
[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         struct pcmcia_device    *p_dev;
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     struct net_device *dev;
145     dev_link_t *link = dev_to_instance(p_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     info->p_dev = p_dev;
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->state |= DEV_PRESENT;
178     ibmtr_config(link);
179
180     return 0;
181 } /* ibmtr_attach */
182
183 /*======================================================================
184
185     This deletes a driver "instance".  The device is de-registered
186     with Card Services.  If it has been released, all local data
187     structures are freed.  Otherwise, the structures will be freed
188     when the device is released.
189
190 ======================================================================*/
191
192 static void ibmtr_detach(struct pcmcia_device *p_dev)
193 {
194     dev_link_t *link = dev_to_instance(p_dev);
195     struct ibmtr_dev_t *info = link->priv;
196     struct net_device *dev = info->dev;
197
198     DEBUG(0, "ibmtr_detach(0x%p)\n", link);
199
200     if (link->dev_node)
201         unregister_netdev(dev);
202
203     {
204         struct tok_info *ti = netdev_priv(dev);
205         del_timer_sync(&(ti->tr_timer));
206     }
207     if (link->state & DEV_CONFIG)
208         ibmtr_release(link);
209
210     free_netdev(dev);
211     kfree(info);
212 } /* ibmtr_detach */
213
214 /*======================================================================
215
216     ibmtr_config() is scheduled to run after a CARD_INSERTION event
217     is received, to configure the PCMCIA socket, and to make the
218     token-ring device available to the system.
219
220 ======================================================================*/
221
222 #define CS_CHECK(fn, ret) \
223 do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
224
225 static void ibmtr_config(dev_link_t *link)
226 {
227     client_handle_t handle = link->handle;
228     ibmtr_dev_t *info = link->priv;
229     struct net_device *dev = info->dev;
230     struct tok_info *ti = netdev_priv(dev);
231     tuple_t tuple;
232     cisparse_t parse;
233     win_req_t req;
234     memreq_t mem;
235     int i, last_ret, last_fn;
236     u_char buf[64];
237
238     DEBUG(0, "ibmtr_config(0x%p)\n", link);
239
240     tuple.Attributes = 0;
241     tuple.TupleData = buf;
242     tuple.TupleDataMax = 64;
243     tuple.TupleOffset = 0;
244     tuple.DesiredTuple = CISTPL_CONFIG;
245     CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));
246     CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));
247     CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));
248     link->conf.ConfigBase = parse.config.base;
249
250     /* Configure card */
251     link->state |= DEV_CONFIG;
252
253     link->conf.ConfigIndex = 0x61;
254
255     /* Determine if this is PRIMARY or ALTERNATE. */
256
257     /* Try PRIMARY card at 0xA20-0xA23 */
258     link->io.BasePort1 = 0xA20;
259     i = pcmcia_request_io(link->handle, &link->io);
260     if (i != CS_SUCCESS) {
261         /* Couldn't get 0xA20-0xA23.  Try ALTERNATE at 0xA24-0xA27. */
262         link->io.BasePort1 = 0xA24;
263         CS_CHECK(RequestIO, pcmcia_request_io(link->handle, &link->io));
264     }
265     dev->base_addr = link->io.BasePort1;
266
267     CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));
268     dev->irq = link->irq.AssignedIRQ;
269     ti->irq = link->irq.AssignedIRQ;
270     ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
271
272     /* Allocate the MMIO memory window */
273     req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
274     req.Attributes |= WIN_USE_WAIT;
275     req.Base = 0; 
276     req.Size = 0x2000;
277     req.AccessSpeed = 250;
278     CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &link->win));
279
280     mem.CardOffset = mmiobase;
281     mem.Page = 0;
282     CS_CHECK(MapMemPage, pcmcia_map_mem_page(link->win, &mem));
283     ti->mmio = ioremap(req.Base, req.Size);
284
285     /* Allocate the SRAM memory window */
286     req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
287     req.Attributes |= WIN_USE_WAIT;
288     req.Base = 0;
289     req.Size = sramsize * 1024;
290     req.AccessSpeed = 250;
291     CS_CHECK(RequestWindow, pcmcia_request_window(&link->handle, &req, &info->sram_win_handle));
292
293     mem.CardOffset = srambase;
294     mem.Page = 0;
295     CS_CHECK(MapMemPage, pcmcia_map_mem_page(info->sram_win_handle, &mem));
296
297     ti->sram_base = mem.CardOffset >> 12;
298     ti->sram_virt = ioremap(req.Base, req.Size);
299     ti->sram_phys = req.Base;
300
301     CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));
302
303     /*  Set up the Token-Ring Controller Configuration Register and
304         turn on the card.  Check the "Local Area Network Credit Card
305         Adapters Technical Reference"  SC30-3585 for this info.  */
306     ibmtr_hw_setup(dev, mmiobase);
307
308     link->dev_node = &info->node;
309     link->state &= ~DEV_CONFIG_PENDING;
310     SET_NETDEV_DEV(dev, &handle_to_dev(handle));
311
312     i = ibmtr_probe_card(dev);
313     if (i != 0) {
314         printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
315         link->dev_node = NULL;
316         goto failed;
317     }
318
319     strcpy(info->node.dev_name, dev->name);
320
321     printk(KERN_INFO "%s: port %#3lx, irq %d,",
322            dev->name, dev->base_addr, dev->irq);
323     printk (" mmio %#5lx,", (u_long)ti->mmio);
324     printk (" sram %#5lx,", (u_long)ti->sram_base << 12);
325     printk ("\n" KERN_INFO "  hwaddr=");
326     for (i = 0; i < TR_ALEN; i++)
327         printk("%02X", dev->dev_addr[i]);
328     printk("\n");
329     return;
330
331 cs_failed:
332     cs_error(link->handle, last_fn, last_ret);
333 failed:
334     ibmtr_release(link);
335 } /* ibmtr_config */
336
337 /*======================================================================
338
339     After a card is removed, ibmtr_release() will unregister the net
340     device, and release the PCMCIA configuration.  If the device is
341     still open, this will be postponed until it is closed.
342
343 ======================================================================*/
344
345 static void ibmtr_release(dev_link_t *link)
346 {
347         ibmtr_dev_t *info = link->priv;
348         struct net_device *dev = info->dev;
349
350         DEBUG(0, "ibmtr_release(0x%p)\n", link);
351
352         if (link->win) {
353                 struct tok_info *ti = netdev_priv(dev);
354                 iounmap(ti->mmio);
355                 pcmcia_release_window(info->sram_win_handle);
356         }
357         pcmcia_disable_device(link->handle);
358 }
359
360 static int ibmtr_suspend(struct pcmcia_device *p_dev)
361 {
362         dev_link_t *link = dev_to_instance(p_dev);
363         ibmtr_dev_t *info = link->priv;
364         struct net_device *dev = info->dev;
365
366         if ((link->state & DEV_CONFIG) && (link->open))
367                 netif_device_detach(dev);
368
369         return 0;
370 }
371
372 static int ibmtr_resume(struct pcmcia_device *p_dev)
373 {
374         dev_link_t *link = dev_to_instance(p_dev);
375         ibmtr_dev_t *info = link->priv;
376         struct net_device *dev = info->dev;
377
378         if ((link->state & DEV_CONFIG) && (link->open)) {
379                 ibmtr_probe(dev);       /* really? */
380                 netif_device_attach(dev);
381         }
382
383         return 0;
384 }
385
386
387 /*====================================================================*/
388
389 static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
390 {
391     int i;
392
393     /* Bizarre IBM behavior, there are 16 bits of information we
394        need to set, but the card only allows us to send 4 bits at a 
395        time.  For each byte sent to base_addr, bits 7-4 tell the
396        card which part of the 16 bits we are setting, bits 3-0 contain 
397        the actual information */
398
399     /* First nibble provides 4 bits of mmio */
400     i = (mmiobase >> 16) & 0x0F;
401     outb(i, dev->base_addr);
402
403     /* Second nibble provides 3 bits of mmio */
404     i = 0x10 | ((mmiobase >> 12) & 0x0E);
405     outb(i, dev->base_addr);
406
407     /* Third nibble, hard-coded values */
408     i = 0x26;
409     outb(i, dev->base_addr);
410
411     /* Fourth nibble sets shared ram page size */
412
413     /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */          
414     i = (sramsize >> 4) & 0x07;
415     i = ((i == 4) ? 3 : i) << 2;
416     i |= 0x30;
417
418     if (ringspeed == 16)
419         i |= 2;
420     if (dev->base_addr == 0xA24)
421         i |= 1;
422     outb(i, dev->base_addr);
423
424     /* 0x40 will release the card for use */
425     outb(0x40, dev->base_addr);
426
427     return;
428 }
429
430 static struct pcmcia_device_id ibmtr_ids[] = {
431         PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
432         PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
433         PCMCIA_DEVICE_NULL,
434 };
435 MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
436
437 static struct pcmcia_driver ibmtr_cs_driver = {
438         .owner          = THIS_MODULE,
439         .drv            = {
440                 .name   = "ibmtr_cs",
441         },
442         .probe          = ibmtr_attach,
443         .remove         = ibmtr_detach,
444         .id_table       = ibmtr_ids,
445         .suspend        = ibmtr_suspend,
446         .resume         = ibmtr_resume,
447 };
448
449 static int __init init_ibmtr_cs(void)
450 {
451         return pcmcia_register_driver(&ibmtr_cs_driver);
452 }
453
454 static void __exit exit_ibmtr_cs(void)
455 {
456         pcmcia_unregister_driver(&ibmtr_cs_driver);
457 }
458
459 module_init(init_ibmtr_cs);
460 module_exit(exit_ibmtr_cs);