]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/net/pcmcia/ibmtr_cs.c
pcmcia: remove obsolete and wrong comments
[mirror_ubuntu-artful-kernel.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
abf0437b 124static int __devinit ibmtr_attach(struct pcmcia_device *link)
1da177e4
LT
125{
126 ibmtr_dev_t *info;
1da177e4 127 struct net_device *dev;
fba395ee 128
dd0fab5b 129 dev_dbg(&link->dev, "ibmtr_attach()\n");
1da177e4
LT
130
131 /* Create new token-ring device */
dd00cc48 132 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 133 if (!info) return -ENOMEM;
1da177e4 134 dev = alloc_trdev(sizeof(struct tok_info));
f8cfa618
DB
135 if (!dev) {
136 kfree(info);
137 return -ENOMEM;
138 }
1da177e4 139
fba395ee 140 info->p_dev = link;
1da177e4
LT
141 link->priv = info;
142 info->ti = netdev_priv(dev);
143
90abdc3b
DB
144 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
145 link->resource[0]->end = 4;
1ac71e5a 146 link->config_flags |= CONF_ENABLE_IRQ;
7feabb64 147 link->config_regs = PRESENT_OPTION;
1da177e4 148
5fa9167a 149 info->dev = dev;
1da177e4 150
fd238232 151 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
1da177e4 152
15b99ac1 153 return ibmtr_config(link);
1da177e4
LT
154} /* ibmtr_attach */
155
fba395ee 156static void ibmtr_detach(struct pcmcia_device *link)
1da177e4
LT
157{
158 struct ibmtr_dev_t *info = link->priv;
b4635811 159 struct net_device *dev = info->dev;
5bebf82f 160 struct tok_info *ti = netdev_priv(dev);
1da177e4 161
dd0fab5b 162 dev_dbg(&link->dev, "ibmtr_detach\n");
5bebf82f
PW
163
164 /*
165 * When the card removal interrupt hits tok_interrupt(),
166 * bail out early, so we don't crash the machine
167 */
168 ti->sram_phys |= 1;
1da177e4 169
c7c2fa07 170 unregister_netdev(dev);
5bebf82f
PW
171
172 del_timer_sync(&(ti->tr_timer));
e2d40963
DB
173
174 ibmtr_release(link);
1da177e4 175
1da177e4 176 free_netdev(dev);
b4635811 177 kfree(info);
1da177e4
LT
178} /* ibmtr_detach */
179
abf0437b 180static int __devinit ibmtr_config(struct pcmcia_device *link)
1da177e4 181{
1da177e4
LT
182 ibmtr_dev_t *info = link->priv;
183 struct net_device *dev = info->dev;
184 struct tok_info *ti = netdev_priv(dev);
dd0fab5b 185 int i, ret;
1da177e4 186
dd0fab5b 187 dev_dbg(&link->dev, "ibmtr_config\n");
1da177e4 188
90abdc3b 189 link->io_lines = 16;
7feabb64 190 link->config_index = 0x61;
1da177e4
LT
191
192 /* Determine if this is PRIMARY or ALTERNATE. */
193
194 /* Try PRIMARY card at 0xA20-0xA23 */
90abdc3b
DB
195 link->resource[0]->start = 0xA20;
196 i = pcmcia_request_io(link);
4c89e88b 197 if (i != 0) {
1da177e4 198 /* Couldn't get 0xA20-0xA23. Try ALTERNATE at 0xA24-0xA27. */
90abdc3b
DB
199 link->resource[0]->start = 0xA24;
200 ret = pcmcia_request_io(link);
dd0fab5b
DB
201 if (ret)
202 goto failed;
1da177e4 203 }
9a017a91 204 dev->base_addr = link->resource[0]->start;
1da177e4 205
eb14120f 206 ret = pcmcia_request_exclusive_irq(link, ibmtr_interrupt);
dd0fab5b
DB
207 if (ret)
208 goto failed;
eb14120f
DB
209 dev->irq = link->irq;
210 ti->irq = link->irq;
1da177e4
LT
211 ti->global_int_enable=GLOBAL_INT_ENABLE+((dev->irq==9) ? 2 : dev->irq);
212
213 /* Allocate the MMIO memory window */
cdb13808
DB
214 link->resource[2]->flags |= WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
215 link->resource[2]->flags |= WIN_USE_WAIT;
216 link->resource[2]->start = 0;
217 link->resource[2]->end = 0x2000;
218 ret = pcmcia_request_window(link, link->resource[2], 250);
dd0fab5b
DB
219 if (ret)
220 goto failed;
1da177e4 221
cdb13808 222 ret = pcmcia_map_mem_page(link, link->resource[2], mmiobase);
dd0fab5b
DB
223 if (ret)
224 goto failed;
cdb13808
DB
225 ti->mmio = ioremap(link->resource[2]->start,
226 resource_size(link->resource[2]));
1da177e4
LT
227
228 /* Allocate the SRAM memory window */
cdb13808
DB
229 link->resource[3]->flags = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE;
230 link->resource[3]->flags |= WIN_USE_WAIT;
231 link->resource[3]->start = 0;
232 link->resource[3]->end = sramsize * 1024;
233 ret = pcmcia_request_window(link, link->resource[3], 250);
dd0fab5b
DB
234 if (ret)
235 goto failed;
1da177e4 236
cdb13808 237 ret = pcmcia_map_mem_page(link, link->resource[3], srambase);
dd0fab5b
DB
238 if (ret)
239 goto failed;
1da177e4 240
b5cb259e 241 ti->sram_base = srambase >> 12;
cdb13808
DB
242 ti->sram_virt = ioremap(link->resource[3]->start,
243 resource_size(link->resource[3]));
244 ti->sram_phys = link->resource[3]->start;
1da177e4 245
1ac71e5a 246 ret = pcmcia_enable_device(link);
dd0fab5b
DB
247 if (ret)
248 goto failed;
1da177e4
LT
249
250 /* Set up the Token-Ring Controller Configuration Register and
251 turn on the card. Check the "Local Area Network Credit Card
252 Adapters Technical Reference" SC30-3585 for this info. */
253 ibmtr_hw_setup(dev, mmiobase);
254
dd2e5a15 255 SET_NETDEV_DEV(dev, &link->dev);
1da177e4
LT
256
257 i = ibmtr_probe_card(dev);
258 if (i != 0) {
259 printk(KERN_NOTICE "ibmtr_cs: register_netdev() failed\n");
1da177e4
LT
260 goto failed;
261 }
262
ad361c98
JP
263 printk(KERN_INFO
264 "%s: port %#3lx, irq %d, mmio %#5lx, sram %#5lx, hwaddr=%pM\n",
265 dev->name, dev->base_addr, dev->irq,
266 (u_long)ti->mmio, (u_long)(ti->sram_base << 12),
267 dev->dev_addr);
15b99ac1 268 return 0;
1da177e4 269
1da177e4
LT
270failed:
271 ibmtr_release(link);
15b99ac1 272 return -ENODEV;
1da177e4
LT
273} /* ibmtr_config */
274
fba395ee 275static void ibmtr_release(struct pcmcia_device *link)
1da177e4 276{
5f2a71fc
DB
277 ibmtr_dev_t *info = link->priv;
278 struct net_device *dev = info->dev;
1da177e4 279
dd0fab5b 280 dev_dbg(&link->dev, "ibmtr_release\n");
1da177e4 281
cdb13808 282 if (link->resource[2]->end) {
5f2a71fc
DB
283 struct tok_info *ti = netdev_priv(dev);
284 iounmap(ti->mmio);
5f2a71fc 285 }
fba395ee 286 pcmcia_disable_device(link);
1da177e4
LT
287}
288
fba395ee 289static int ibmtr_suspend(struct pcmcia_device *link)
98e4c28b 290{
98e4c28b
DB
291 ibmtr_dev_t *info = link->priv;
292 struct net_device *dev = info->dev;
293
e2d40963 294 if (link->open)
8661bb5b 295 netif_device_detach(dev);
98e4c28b
DB
296
297 return 0;
298}
299
8814b505 300static int __devinit ibmtr_resume(struct pcmcia_device *link)
98e4c28b 301{
98e4c28b
DB
302 ibmtr_dev_t *info = link->priv;
303 struct net_device *dev = info->dev;
304
e2d40963 305 if (link->open) {
8661bb5b
DB
306 ibmtr_probe(dev); /* really? */
307 netif_device_attach(dev);
308 }
98e4c28b
DB
309
310 return 0;
311}
312
313
1da177e4
LT
314/*====================================================================*/
315
316static void ibmtr_hw_setup(struct net_device *dev, u_int mmiobase)
317{
318 int i;
319
320 /* Bizarre IBM behavior, there are 16 bits of information we
321 need to set, but the card only allows us to send 4 bits at a
322 time. For each byte sent to base_addr, bits 7-4 tell the
323 card which part of the 16 bits we are setting, bits 3-0 contain
324 the actual information */
325
326 /* First nibble provides 4 bits of mmio */
327 i = (mmiobase >> 16) & 0x0F;
328 outb(i, dev->base_addr);
329
330 /* Second nibble provides 3 bits of mmio */
331 i = 0x10 | ((mmiobase >> 12) & 0x0E);
332 outb(i, dev->base_addr);
333
334 /* Third nibble, hard-coded values */
335 i = 0x26;
336 outb(i, dev->base_addr);
337
338 /* Fourth nibble sets shared ram page size */
339
340 /* 8 = 00, 16 = 01, 32 = 10, 64 = 11 */
341 i = (sramsize >> 4) & 0x07;
342 i = ((i == 4) ? 3 : i) << 2;
343 i |= 0x30;
344
345 if (ringspeed == 16)
346 i |= 2;
347 if (dev->base_addr == 0xA24)
348 i |= 1;
349 outb(i, dev->base_addr);
350
351 /* 0x40 will release the card for use */
352 outb(0x40, dev->base_addr);
1da177e4
LT
353}
354
469bf2b9
DB
355static struct pcmcia_device_id ibmtr_ids[] = {
356 PCMCIA_DEVICE_PROD_ID12("3Com", "TokenLink Velocity PC Card", 0x41240e5b, 0x82c3734e),
357 PCMCIA_DEVICE_PROD_ID12("IBM", "TOKEN RING", 0xb569a6e5, 0xbf8eed47),
358 PCMCIA_DEVICE_NULL,
359};
360MODULE_DEVICE_TABLE(pcmcia, ibmtr_ids);
361
1da177e4
LT
362static struct pcmcia_driver ibmtr_cs_driver = {
363 .owner = THIS_MODULE,
2e9b981a 364 .name = "ibmtr_cs",
f8cfa618 365 .probe = ibmtr_attach,
cc3b4866 366 .remove = ibmtr_detach,
469bf2b9 367 .id_table = ibmtr_ids,
98e4c28b
DB
368 .suspend = ibmtr_suspend,
369 .resume = ibmtr_resume,
1da177e4
LT
370};
371
372static int __init init_ibmtr_cs(void)
373{
374 return pcmcia_register_driver(&ibmtr_cs_driver);
375}
376
377static void __exit exit_ibmtr_cs(void)
378{
379 pcmcia_unregister_driver(&ibmtr_cs_driver);
1da177e4
LT
380}
381
382module_init(init_ibmtr_cs);
383module_exit(exit_ibmtr_cs);