[NET]: Nuke SET_MODULE_OWNER macro.
[pandora-kernel.git] / drivers / net / tokenring / abyss.c
1 /*
2  *  abyss.c: Network driver for the Madge Smart 16/4 PCI Mk2 token ring card.
3  *
4  *  Written 1999-2000 by Adam Fritzler
5  *
6  *  This software may be used and distributed according to the terms
7  *  of the GNU General Public License, incorporated herein by reference.
8  *
9  *  This driver module supports the following cards:
10  *      - Madge Smart 16/4 PCI Mk2
11  *
12  *  Maintainer(s):
13  *    AF        Adam Fritzler           mid@auk.cx
14  *
15  *  Modification History:
16  *      30-Dec-99       AF      Split off from the tms380tr driver.
17  *      22-Jan-00       AF      Updated to use indirect read/writes 
18  *      23-Nov-00       JG      New PCI API, cleanups
19  *
20  *
21  *  TODO:
22  *      1. See if we can use MMIO instead of inb/outb/inw/outw
23  *      2. Add support for Mk1 (has AT24 attached to the PCI
24  *              config registers)
25  *
26  */
27
28 #include <linux/module.h>
29 #include <linux/kernel.h>
30 #include <linux/errno.h>
31 #include <linux/pci.h>
32 #include <linux/init.h>
33 #include <linux/netdevice.h>
34 #include <linux/trdevice.h>
35
36 #include <asm/system.h>
37 #include <asm/io.h>
38 #include <asm/irq.h>
39
40 #include "tms380tr.h"
41 #include "abyss.h"            /* Madge-specific constants */
42
43 static char version[] __devinitdata =
44 "abyss.c: v1.02 23/11/2000 by Adam Fritzler\n";
45
46 #define ABYSS_IO_EXTENT 64
47
48 static struct pci_device_id abyss_pci_tbl[] = {
49         { PCI_VENDOR_ID_MADGE, PCI_DEVICE_ID_MADGE_MK2,
50           PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_TOKEN_RING << 8, 0x00ffffff, },
51         { }                     /* Terminating entry */
52 };
53 MODULE_DEVICE_TABLE(pci, abyss_pci_tbl);
54
55 MODULE_LICENSE("GPL");
56
57 static int abyss_open(struct net_device *dev);
58 static int abyss_close(struct net_device *dev);
59 static void abyss_enable(struct net_device *dev);
60 static int abyss_chipset_init(struct net_device *dev);
61 static void abyss_read_eeprom(struct net_device *dev);
62 static unsigned short abyss_setnselout_pins(struct net_device *dev);
63
64 static void at24_writedatabyte(unsigned long regaddr, unsigned char byte);
65 static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr);
66 static int at24_sendcmd(unsigned long regaddr, unsigned char cmd);
67 static unsigned char at24_readdatabit(unsigned long regaddr);
68 static unsigned char at24_readdatabyte(unsigned long regaddr);
69 static int at24_waitforack(unsigned long regaddr);
70 static int at24_waitfornack(unsigned long regaddr);
71 static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data);
72 static void at24_start(unsigned long regaddr);
73 static unsigned char at24_readb(unsigned long regaddr, unsigned char addr);
74
75 static unsigned short abyss_sifreadb(struct net_device *dev, unsigned short reg)
76 {
77         return inb(dev->base_addr + reg);
78 }
79
80 static unsigned short abyss_sifreadw(struct net_device *dev, unsigned short reg)
81 {
82         return inw(dev->base_addr + reg);
83 }
84
85 static void abyss_sifwriteb(struct net_device *dev, unsigned short val, unsigned short reg)
86 {
87         outb(val, dev->base_addr + reg);
88 }
89
90 static void abyss_sifwritew(struct net_device *dev, unsigned short val, unsigned short reg)
91 {
92         outw(val, dev->base_addr + reg);
93 }
94
95 static int __devinit abyss_attach(struct pci_dev *pdev, const struct pci_device_id *ent)
96 {       
97         static int versionprinted;
98         struct net_device *dev;
99         struct net_local *tp;
100         int i, ret, pci_irq_line;
101         unsigned long pci_ioaddr;
102         
103         if (versionprinted++ == 0)
104                 printk("%s", version);
105
106         if (pci_enable_device(pdev))
107                 return -EIO;
108
109         /* Remove I/O space marker in bit 0. */
110         pci_irq_line = pdev->irq;
111         pci_ioaddr = pci_resource_start (pdev, 0);
112                 
113         /* At this point we have found a valid card. */
114                 
115         dev = alloc_trdev(sizeof(struct net_local));
116         if (!dev)
117                 return -ENOMEM;
118
119         if (!request_region(pci_ioaddr, ABYSS_IO_EXTENT, dev->name)) {
120                 ret = -EBUSY;
121                 goto err_out_trdev;
122         }
123                 
124         ret = request_irq(pdev->irq, tms380tr_interrupt, IRQF_SHARED,
125                           dev->name, dev);
126         if (ret)
127                 goto err_out_region;
128                 
129         dev->base_addr  = pci_ioaddr;
130         dev->irq        = pci_irq_line;
131                 
132         printk("%s: Madge Smart 16/4 PCI Mk2 (Abyss)\n", dev->name);
133         printk("%s:    IO: %#4lx  IRQ: %d\n",
134                dev->name, pci_ioaddr, dev->irq);
135         /*
136          * The TMS SIF registers lay 0x10 above the card base address.
137          */
138         dev->base_addr += 0x10;
139                 
140         ret = tmsdev_init(dev, &pdev->dev);
141         if (ret) {
142                 printk("%s: unable to get memory for dev->priv.\n", 
143                        dev->name);
144                 goto err_out_irq;
145         }
146
147         abyss_read_eeprom(dev);
148                 
149         printk("%s:    Ring Station Address: ", dev->name);
150         printk("%2.2x", dev->dev_addr[0]);
151         for (i = 1; i < 6; i++)
152                 printk(":%2.2x", dev->dev_addr[i]);
153         printk("\n");
154
155         tp = netdev_priv(dev);
156         tp->setnselout = abyss_setnselout_pins;
157         tp->sifreadb = abyss_sifreadb;
158         tp->sifreadw = abyss_sifreadw;
159         tp->sifwriteb = abyss_sifwriteb;
160         tp->sifwritew = abyss_sifwritew;
161
162         memcpy(tp->ProductID, "Madge PCI 16/4 Mk2", PROD_ID_SIZE + 1);
163                 
164         dev->open = abyss_open;
165         dev->stop = abyss_close;
166
167         pci_set_drvdata(pdev, dev);
168         SET_NETDEV_DEV(dev, &pdev->dev);
169
170         ret = register_netdev(dev);
171         if (ret)
172                 goto err_out_tmsdev;
173         return 0;
174
175 err_out_tmsdev:
176         pci_set_drvdata(pdev, NULL);
177         tmsdev_term(dev);
178 err_out_irq:
179         free_irq(pdev->irq, dev);
180 err_out_region:
181         release_region(pci_ioaddr, ABYSS_IO_EXTENT);
182 err_out_trdev:
183         free_netdev(dev);
184         return ret;
185 }
186
187 static unsigned short abyss_setnselout_pins(struct net_device *dev)
188 {
189         unsigned short val = 0;
190         struct net_local *tp = netdev_priv(dev);
191         
192         if(tp->DataRate == SPEED_4)
193                 val |= 0x01;  /* Set 4Mbps */
194         else
195                 val |= 0x00;  /* Set 16Mbps */
196         
197         return val;
198 }
199
200 /*
201  * The following Madge boards should use this code:
202  *   - Smart 16/4 PCI Mk2 (Abyss)
203  *   - Smart 16/4 PCI Mk1 (PCI T)
204  *   - Smart 16/4 Client Plus PnP (Big Apple)
205  *   - Smart 16/4 Cardbus Mk2
206  *
207  * These access an Atmel AT24 SEEPROM using their glue chip registers. 
208  *
209  */
210 static void at24_writedatabyte(unsigned long regaddr, unsigned char byte)
211 {
212         int i;
213         
214         for (i = 0; i < 8; i++) {
215                 at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);
216                 at24_setlines(regaddr, 1, (byte >> (7-i))&0x01);
217                 at24_setlines(regaddr, 0, (byte >> (7-i))&0x01);
218         }
219 }
220
221 static int at24_sendfullcmd(unsigned long regaddr, unsigned char cmd, unsigned char addr)
222 {
223         if (at24_sendcmd(regaddr, cmd)) {
224                 at24_writedatabyte(regaddr, addr);
225                 return at24_waitforack(regaddr);
226         }
227         return 0;
228 }
229
230 static int at24_sendcmd(unsigned long regaddr, unsigned char cmd)
231 {
232         int i;
233         
234         for (i = 0; i < 10; i++) {
235                 at24_start(regaddr);
236                 at24_writedatabyte(regaddr, cmd);
237                 if (at24_waitforack(regaddr))
238                         return 1;
239         }
240         return 0;
241 }
242
243 static unsigned char at24_readdatabit(unsigned long regaddr)
244 {
245         unsigned char val;
246
247         at24_setlines(regaddr, 0, 1);
248         at24_setlines(regaddr, 1, 1);
249         val = (inb(regaddr) & AT24_DATA)?1:0;
250         at24_setlines(regaddr, 1, 1);
251         at24_setlines(regaddr, 0, 1);
252         return val;
253 }
254
255 static unsigned char at24_readdatabyte(unsigned long regaddr)
256 {
257         unsigned char data = 0;
258         int i;
259         
260         for (i = 0; i < 8; i++) {
261                 data <<= 1;
262                 data |= at24_readdatabit(regaddr);
263         }
264
265         return data;
266 }
267
268 static int at24_waitforack(unsigned long regaddr)
269 {
270         int i;
271         
272         for (i = 0; i < 10; i++) {
273                 if ((at24_readdatabit(regaddr) & 0x01) == 0x00)
274                         return 1;
275         }
276         return 0;
277 }
278
279 static int at24_waitfornack(unsigned long regaddr)
280 {
281         int i;
282         for (i = 0; i < 10; i++) {
283                 if ((at24_readdatabit(regaddr) & 0x01) == 0x01)
284                         return 1;
285         }
286         return 0;
287 }
288
289 static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data)
290 {
291         unsigned char val = AT24_ENABLE;
292         if (clock)
293                 val |= AT24_CLOCK;
294         if (data)
295                 val |= AT24_DATA;
296
297         outb(val, regaddr); 
298         tms380tr_wait(20); /* Very necessary. */
299 }
300
301 static void at24_start(unsigned long regaddr)
302 {
303         at24_setlines(regaddr, 0, 1);
304         at24_setlines(regaddr, 1, 1);
305         at24_setlines(regaddr, 1, 0);
306         at24_setlines(regaddr, 0, 1);
307 }
308
309 static unsigned char at24_readb(unsigned long regaddr, unsigned char addr)
310 {
311         unsigned char data = 0xff;
312         
313         if (at24_sendfullcmd(regaddr, AT24_WRITE, addr)) {
314                 if (at24_sendcmd(regaddr, AT24_READ)) {
315                         data = at24_readdatabyte(regaddr);
316                         if (!at24_waitfornack(regaddr))
317                                 data = 0xff;
318                 }
319         }
320         return data;
321 }
322
323
324 /*
325  * Enable basic functions of the Madge chipset needed
326  * for initialization.
327  */
328 static void abyss_enable(struct net_device *dev)
329 {
330         unsigned char reset_reg;
331         unsigned long ioaddr;
332         
333         ioaddr = dev->base_addr;
334         reset_reg = inb(ioaddr + PCIBM2_RESET_REG);
335         reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
336         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
337         tms380tr_wait(100);
338 }
339
340 /*
341  * Enable the functions of the Madge chipset needed for
342  * full working order. 
343  */
344 static int abyss_chipset_init(struct net_device *dev)
345 {
346         unsigned char reset_reg;
347         unsigned long ioaddr;
348         
349         ioaddr = dev->base_addr;
350         
351         reset_reg = inb(ioaddr + PCIBM2_RESET_REG);
352         
353         reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
354         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
355         
356         reset_reg &= ~(PCIBM2_RESET_REG_CHIP_NRES |
357                        PCIBM2_RESET_REG_FIFO_NRES | 
358                        PCIBM2_RESET_REG_SIF_NRES);
359         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
360         
361         tms380tr_wait(100);
362         
363         reset_reg |= PCIBM2_RESET_REG_CHIP_NRES;
364         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
365         
366         reset_reg |= PCIBM2_RESET_REG_SIF_NRES;
367         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
368
369         reset_reg |= PCIBM2_RESET_REG_FIFO_NRES;
370         outb(reset_reg, ioaddr + PCIBM2_RESET_REG);
371
372         outb(PCIBM2_INT_CONTROL_REG_SINTEN | 
373              PCIBM2_INT_CONTROL_REG_PCI_ERR_ENABLE, 
374              ioaddr + PCIBM2_INT_CONTROL_REG);
375   
376         outb(30, ioaddr + PCIBM2_FIFO_THRESHOLD);
377         
378         return 0;
379 }
380
381 static inline void abyss_chipset_close(struct net_device *dev)
382 {
383         unsigned long ioaddr;
384         
385         ioaddr = dev->base_addr;
386         outb(0, ioaddr + PCIBM2_RESET_REG);
387 }
388
389 /*
390  * Read configuration data from the AT24 SEEPROM on Madge cards.
391  *
392  */
393 static void abyss_read_eeprom(struct net_device *dev)
394 {
395         struct net_local *tp;
396         unsigned long ioaddr;
397         unsigned short val;
398         int i;
399         
400         tp = netdev_priv(dev);
401         ioaddr = dev->base_addr;
402         
403         /* Must enable glue chip first */
404         abyss_enable(dev);
405         
406         val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 
407                          PCIBM2_SEEPROM_RING_SPEED);
408         tp->DataRate = val?SPEED_4:SPEED_16; /* set open speed */
409         printk("%s:    SEEPROM: ring speed: %dMb/sec\n", dev->name, tp->DataRate);
410         
411         val = at24_readb(ioaddr + PCIBM2_SEEPROM_REG,
412                          PCIBM2_SEEPROM_RAM_SIZE) * 128;
413         printk("%s:    SEEPROM: adapter RAM: %dkb\n", dev->name, val);
414         
415         dev->addr_len = 6;
416         for (i = 0; i < 6; i++) 
417                 dev->dev_addr[i] = at24_readb(ioaddr + PCIBM2_SEEPROM_REG, 
418                                               PCIBM2_SEEPROM_BIA+i);
419 }
420
421 static int abyss_open(struct net_device *dev)
422 {  
423         abyss_chipset_init(dev);
424         tms380tr_open(dev);
425         return 0;
426 }
427
428 static int abyss_close(struct net_device *dev)
429 {
430         tms380tr_close(dev);
431         abyss_chipset_close(dev);
432         return 0;
433 }
434
435 static void __devexit abyss_detach (struct pci_dev *pdev)
436 {
437         struct net_device *dev = pci_get_drvdata(pdev);
438         
439         BUG_ON(!dev);
440         unregister_netdev(dev);
441         release_region(dev->base_addr-0x10, ABYSS_IO_EXTENT);
442         free_irq(dev->irq, dev);
443         tmsdev_term(dev);
444         free_netdev(dev);
445         pci_set_drvdata(pdev, NULL);
446 }
447
448 static struct pci_driver abyss_driver = {
449         .name           = "abyss",
450         .id_table       = abyss_pci_tbl,
451         .probe          = abyss_attach,
452         .remove         = __devexit_p(abyss_detach),
453 };
454
455 static int __init abyss_init (void)
456 {
457         return pci_register_driver(&abyss_driver);
458 }
459
460 static void __exit abyss_rmmod (void)
461 {
462         pci_unregister_driver (&abyss_driver);
463 }
464
465 module_init(abyss_init);
466 module_exit(abyss_rmmod);
467