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