2
* olympic.c (c) 1999 Peter De Schrijver All Rights Reserved
3
* 1999/2000 Mike Phillips (mikep@linuxtr.net)
5
* Linux driver for IBM PCI tokenring cards based on the Pit/Pit-Phy/Olympic
8
* Base Driver Skeleton:
9
* Written 1993-94 by Donald Becker.
11
* Copyright 1993 United States Government as represented by the
12
* Director, National Security Agency.
14
* Thanks to Erik De Cock, Adrian Bridgett and Frank Fiene for their
15
* assistance and perserverance with the testing of this driver.
17
* This software may be used and distributed according to the terms
18
* of the GNU General Public License, incorporated herein by reference.
20
* 4/27/99 - Alpha Release 0.1.0
21
* First release to the public
23
* 6/8/99 - Official Release 0.2.0
24
* Merged into the kernel code
25
* 8/18/99 - Updated driver for 2.3.13 kernel to use new pci
26
* resource. Driver also reports the card name returned by
28
* 1/11/00 - Added spinlocks for smp
29
* 2/23/00 - Updated to dev_kfree_irq
30
* 3/10/00 - Fixed FDX enable which triggered other bugs also
32
* 5/20/00 - Changes to handle Olympic on LinuxPPC. Endian changes.
33
* The odd thing about the changes is that the fix for
34
* endian issues with the big-endian data in the arb, asb...
35
* was to always swab() the bytes, no matter what CPU.
36
* That's because the read[wl]() functions always swap the
37
* bytes on the way in on PPC.
38
* Fixing the hardware descriptors was another matter,
39
* because they weren't going through read[wl](), there all
40
* the results had to be in memory in le32 values. kdaaker
42
* 12/23/00 - Added minimal Cardbus support (Thanks Donald).
44
* 03/09/01 - Add new pci api, dev_base_lock, general clean up.
46
* 03/27/01 - Add new dma pci (Thanks to Kyle Lucke) and alloc_trdev
47
* Change proc_fs behaviour, now one entry per adapter.
49
* 04/09/01 - Couple of bug fixes to the dma unmaps and ejecting the
50
* adapter when live does not take the system down with it.
52
* 06/02/01 - Clean up, copy skb for small packets
54
* 06/22/01 - Add EISR error handling routines
56
* 07/19/01 - Improve bad LAA reporting, strip out freemem
57
* into a separate function, its called from 3
58
* different places now.
59
* 02/09/02 - Replaced sleep_on.
60
* 03/01/02 - Replace access to several registers from 32 bit to
61
* 16 bit. Fixes alignment errors on PPC 64 bit machines.
62
* Thanks to Al Trautman for this one.
63
* 03/10/02 - Fix BUG in arb_cmd. Bug was there all along but was
64
* silently ignored until the error checking code
65
* went into version 1.0.0
66
* 06/04/02 - Add correct start up sequence for the cardbus adapters.
67
* Required for strict compliance with pci power mgmt specs.
72
* If Problems do Occur
73
* Most problems can be rectified by either closing and opening the interface
74
* (ifconfig down and up) or rmmod and insmod'ing the driver (a bit difficult
75
* if compiled into the kernel).
78
/* Change OLYMPIC_DEBUG to 1 to get verbose, and I mean really verbose, messages */
80
#define OLYMPIC_DEBUG 0
83
#include <linux/module.h>
84
#include <linux/kernel.h>
85
#include <linux/errno.h>
86
#include <linux/timer.h>
88
#include <linux/ioport.h>
89
#include <linux/seq_file.h>
90
#include <linux/string.h>
91
#include <linux/proc_fs.h>
92
#include <linux/ptrace.h>
93
#include <linux/skbuff.h>
94
#include <linux/interrupt.h>
95
#include <linux/delay.h>
96
#include <linux/netdevice.h>
97
#include <linux/trdevice.h>
98
#include <linux/stddef.h>
99
#include <linux/init.h>
100
#include <linux/pci.h>
101
#include <linux/spinlock.h>
102
#include <linux/bitops.h>
103
#include <linux/jiffies.h>
105
#include <net/checksum.h>
106
#include <net/net_namespace.h>
109
#include <asm/system.h>
113
/* I've got to put some intelligence into the version number so that Peter and I know
114
* which version of the code somebody has got.
115
* Version Number = a.b.c.d where a.b.c is the level of code and d is the latest author.
116
* So 0.0.1.pds = Peter, 0.0.1.mlp = Mike
118
* Official releases will only have an a.b.c version number format.
121
static char version[] =
122
"Olympic.c v1.0.5 6/04/02 - Peter De Schrijver & Mike Phillips" ;
124
static char *open_maj_error[] = {"No error", "Lobe Media Test", "Physical Insertion",
125
"Address Verification", "Neighbor Notification (Ring Poll)",
126
"Request Parameters","FDX Registration Request",
127
"FDX Duplicate Address Check", "Station registration Query Wait",
130
static char *open_min_error[] = {"No error", "Function Failure", "Signal Lost", "Wire Fault",
131
"Ring Speed Mismatch", "Timeout","Ring Failure","Ring Beaconing",
132
"Duplicate Node Address","Request Parameters","Remove Received",
133
"Reserved", "Reserved", "No Monitor Detected for RPL",
134
"Monitor Contention failer for RPL", "FDX Protocol Error"};
136
/* Module parameters */
138
MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ;
139
MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ;
141
/* Ring Speed 0,4,16,100
143
* 4,16 = Selected speed only, no autosense
144
* This allows the card to be the first on the ring
145
* and become the active monitor.
146
* 100 = Nothing at present, 100mbps is autodetected
147
* if FDX is turned on. May be implemented in the future to
148
* fail if 100mpbs is not detected.
150
* WARNING: Some hubs will allow you to insert
154
static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ;
155
module_param_array(ringspeed, int, NULL, 0);
157
/* Packet buffer size */
159
static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ;
160
module_param_array(pkt_buf_sz, int, NULL, 0) ;
164
static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ;
165
module_param_array(message_level, int, NULL, 0) ;
167
/* Change network_monitor to receive mac frames through the arb channel.
168
* Will also create a /proc/net/olympic_tr%d entry, where %d is the tr
169
* device, i.e. tr0, tr1 etc.
170
* Intended to be used to create a ring-error reporting network module
171
* i.e. it will give you the source address of beaconers on the ring
173
static int network_monitor[OLYMPIC_MAX_ADAPTERS] = {0,};
174
module_param_array(network_monitor, int, NULL, 0);
176
static DEFINE_PCI_DEVICE_TABLE(olympic_pci_tbl) = {
177
{PCI_VENDOR_ID_IBM,PCI_DEVICE_ID_IBM_TR_WAKE,PCI_ANY_ID,PCI_ANY_ID,},
178
{ } /* Terminating Entry */
180
MODULE_DEVICE_TABLE(pci,olympic_pci_tbl) ;
183
static int olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
184
static int olympic_init(struct net_device *dev);
185
static int olympic_open(struct net_device *dev);
186
static netdev_tx_t olympic_xmit(struct sk_buff *skb,
187
struct net_device *dev);
188
static int olympic_close(struct net_device *dev);
189
static void olympic_set_rx_mode(struct net_device *dev);
190
static void olympic_freemem(struct net_device *dev) ;
191
static irqreturn_t olympic_interrupt(int irq, void *dev_id);
192
static int olympic_set_mac_address(struct net_device *dev, void *addr) ;
193
static void olympic_arb_cmd(struct net_device *dev);
194
static int olympic_change_mtu(struct net_device *dev, int mtu);
195
static void olympic_srb_bh(struct net_device *dev) ;
196
static void olympic_asb_bh(struct net_device *dev) ;
197
static const struct file_operations olympic_proc_ops;
199
static const struct net_device_ops olympic_netdev_ops = {
200
.ndo_open = olympic_open,
201
.ndo_stop = olympic_close,
202
.ndo_start_xmit = olympic_xmit,
203
.ndo_change_mtu = olympic_change_mtu,
204
.ndo_set_rx_mode = olympic_set_rx_mode,
205
.ndo_set_mac_address = olympic_set_mac_address,
208
static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
210
struct net_device *dev ;
211
struct olympic_private *olympic_priv;
212
static int card_no = -1 ;
217
if ((i = pci_enable_device(pdev))) {
221
pci_set_master(pdev);
223
if ((i = pci_request_regions(pdev,"olympic"))) {
227
dev = alloc_trdev(sizeof(struct olympic_private)) ;
233
olympic_priv = netdev_priv(dev) ;
235
spin_lock_init(&olympic_priv->olympic_lock) ;
237
init_waitqueue_head(&olympic_priv->srb_wait);
238
init_waitqueue_head(&olympic_priv->trb_wait);
240
printk(KERN_INFO "pci_device: %p, dev:%p, dev->priv: %p\n", pdev, dev, netdev_priv(dev));
243
dev->base_addr=pci_resource_start(pdev, 0);
244
olympic_priv->olympic_card_name = pci_name(pdev);
245
olympic_priv->pdev = pdev;
246
olympic_priv->olympic_mmio = ioremap(pci_resource_start(pdev,1),256);
247
olympic_priv->olympic_lap = ioremap(pci_resource_start(pdev,2),2048);
248
if (!olympic_priv->olympic_mmio || !olympic_priv->olympic_lap) {
252
if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) )
253
olympic_priv->pkt_buf_sz = PKT_BUF_SZ ;
255
olympic_priv->pkt_buf_sz = pkt_buf_sz[card_no] ;
257
dev->mtu = olympic_priv->pkt_buf_sz - TR_HLEN ;
258
olympic_priv->olympic_ring_speed = ringspeed[card_no] ;
259
olympic_priv->olympic_message_level = message_level[card_no] ;
260
olympic_priv->olympic_network_monitor = network_monitor[card_no];
262
if ((i = olympic_init(dev))) {
266
dev->netdev_ops = &olympic_netdev_ops;
267
SET_NETDEV_DEV(dev, &pdev->dev);
269
pci_set_drvdata(pdev,dev) ;
270
register_netdev(dev) ;
271
printk("Olympic: %s registered as: %s\n",olympic_priv->olympic_card_name,dev->name);
272
if (olympic_priv->olympic_network_monitor) { /* Must go after register_netdev as we need the device name */
274
strcpy(proc_name,"olympic_") ;
275
strcat(proc_name,dev->name) ;
276
proc_create_data(proc_name, 0, init_net.proc_net, &olympic_proc_ops, dev);
277
printk("Olympic: Network Monitor information: /proc/%s\n",proc_name);
282
if (olympic_priv->olympic_mmio)
283
iounmap(olympic_priv->olympic_mmio);
284
if (olympic_priv->olympic_lap)
285
iounmap(olympic_priv->olympic_lap);
289
pci_release_regions(pdev);
292
pci_disable_device(pdev);
296
static int olympic_init(struct net_device *dev)
298
struct olympic_private *olympic_priv;
299
u8 __iomem *olympic_mmio, *init_srb,*adapter_addr;
301
unsigned int uaa_addr;
303
olympic_priv=netdev_priv(dev);
304
olympic_mmio=olympic_priv->olympic_mmio;
306
printk("%s\n", version);
307
printk("%s. I/O at %hx, MMIO at %p, LAP at %p, using irq %d\n", olympic_priv->olympic_card_name, (unsigned int) dev->base_addr,olympic_priv->olympic_mmio, olympic_priv->olympic_lap, dev->irq);
309
writel(readl(olympic_mmio+BCTL) | BCTL_SOFTRESET,olympic_mmio+BCTL);
311
while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
313
if(time_after(jiffies, t + 40*HZ)) {
314
printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
320
/* Needed for cardbus */
321
if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) {
322
writel(readl(olympic_priv->olympic_mmio+FERMASK)|FERMASK_INT_BIT, olympic_mmio+FERMASK);
326
printk("BCTL: %x\n",readl(olympic_mmio+BCTL));
327
printk("GPR: %x\n",readw(olympic_mmio+GPR));
328
printk("SISRMASK: %x\n",readl(olympic_mmio+SISR_MASK));
330
/* Aaaahhh, You have got to be real careful setting GPR, the card
331
holds the previous values from flash memory, including autosense
334
writel(readl(olympic_mmio+BCTL)|BCTL_MIMREB,olympic_mmio+BCTL);
336
if (olympic_priv->olympic_ring_speed == 0) { /* Autosense */
337
writew(readw(olympic_mmio+GPR)|GPR_AUTOSENSE,olympic_mmio+GPR);
338
if (olympic_priv->olympic_message_level)
339
printk(KERN_INFO "%s: Ringspeed autosense mode on\n",olympic_priv->olympic_card_name);
340
} else if (olympic_priv->olympic_ring_speed == 16) {
341
if (olympic_priv->olympic_message_level)
342
printk(KERN_INFO "%s: Trying to open at 16 Mbps as requested\n", olympic_priv->olympic_card_name);
343
writew(GPR_16MBPS, olympic_mmio+GPR);
344
} else if (olympic_priv->olympic_ring_speed == 4) {
345
if (olympic_priv->olympic_message_level)
346
printk(KERN_INFO "%s: Trying to open at 4 Mbps as requested\n", olympic_priv->olympic_card_name) ;
347
writew(0, olympic_mmio+GPR);
350
writew(readw(olympic_mmio+GPR)|GPR_NEPTUNE_BF,olympic_mmio+GPR);
353
printk("GPR = %x\n",readw(olympic_mmio + GPR) ) ;
355
/* Solo has been paused to meet the Cardbus power
356
* specs if the adapter is cardbus. Check to
357
* see its been paused and then restart solo. The
358
* adapter should set the pause bit within 1 second.
361
if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) {
363
while (!(readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE)) {
365
if(time_after(jiffies, t + 2*HZ)) {
366
printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ;
370
writel(readl(olympic_mmio+CLKCTL) & ~CLKCTL_PAUSE, olympic_mmio+CLKCTL) ;
373
/* start solo init */
374
writel((1<<15),olympic_mmio+SISR_MASK_SUM);
377
while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
379
if(time_after(jiffies, t + 15*HZ)) {
380
printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
385
writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
388
printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
391
init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
396
printk("init_srb(%p): ",init_srb);
398
printk("%x ",readb(init_srb+i));
402
if(readw(init_srb+6)) {
403
printk(KERN_INFO "tokenring card initialization failed. errorcode : %x\n",readw(init_srb+6));
407
if (olympic_priv->olympic_message_level) {
408
if ( readb(init_srb +2) & 0x40) {
409
printk(KERN_INFO "Olympic: Adapter is FDX capable.\n") ;
411
printk(KERN_INFO "Olympic: Adapter cannot do FDX.\n");
415
uaa_addr=swab16(readw(init_srb+8));
418
printk("UAA resides at %x\n",uaa_addr);
421
writel(uaa_addr,olympic_mmio+LAPA);
422
adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
424
memcpy_fromio(&dev->dev_addr[0], adapter_addr,6);
427
printk("adapter address: %pM\n", dev->dev_addr);
430
olympic_priv->olympic_addr_table_addr = swab16(readw(init_srb + 12));
431
olympic_priv->olympic_parms_addr = swab16(readw(init_srb + 14));
437
static int olympic_open(struct net_device *dev)
439
struct olympic_private *olympic_priv=netdev_priv(dev);
440
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*init_srb;
441
unsigned long flags, t;
442
int i, open_finished = 1 ;
445
DECLARE_WAITQUEUE(wait,current) ;
449
if (request_irq(dev->irq, olympic_interrupt, IRQF_SHARED , "olympic",
454
printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
455
printk("pending ints: %x\n",readl(olympic_mmio+SISR_RR));
458
writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
460
writel(SISR_MI | SISR_SRB_REPLY, olympic_mmio+SISR_MASK); /* more ints later, doesn't stop arb cmd interrupt */
462
writel(LISR_LIE,olympic_mmio+LISR); /* more ints later */
464
/* adapter is closed, so SRB is pointed to by LAPWWO */
466
writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
467
init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
470
printk("LAPWWO: %x, LAPA: %x\n",readw(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
471
printk("SISR Mask = %04x\n", readl(olympic_mmio+SISR_MASK));
472
printk("Before the open command\n");
475
memset_io(init_srb,0,SRB_COMMAND_SIZE);
477
writeb(SRB_OPEN_ADAPTER,init_srb) ; /* open */
478
writeb(OLYMPIC_CLEAR_RET_CODE,init_srb+2);
480
/* If Network Monitor, instruct card to copy MAC frames through the ARB */
481
if (olympic_priv->olympic_network_monitor)
482
writew(swab16(OPEN_ADAPTER_ENABLE_FDX | OPEN_ADAPTER_PASS_ADC_MAC | OPEN_ADAPTER_PASS_ATT_MAC | OPEN_ADAPTER_PASS_BEACON), init_srb+8);
484
writew(swab16(OPEN_ADAPTER_ENABLE_FDX), init_srb+8);
486
/* Test OR of first 3 bytes as its totally possible for
487
* someone to set the first 2 bytes to be zero, although this
488
* is an error, the first byte must have bit 6 set to 1 */
490
if (olympic_priv->olympic_laa[0] | olympic_priv->olympic_laa[1] | olympic_priv->olympic_laa[2]) {
491
writeb(olympic_priv->olympic_laa[0],init_srb+12);
492
writeb(olympic_priv->olympic_laa[1],init_srb+13);
493
writeb(olympic_priv->olympic_laa[2],init_srb+14);
494
writeb(olympic_priv->olympic_laa[3],init_srb+15);
495
writeb(olympic_priv->olympic_laa[4],init_srb+16);
496
writeb(olympic_priv->olympic_laa[5],init_srb+17);
497
memcpy(dev->dev_addr,olympic_priv->olympic_laa,dev->addr_len) ;
499
writeb(1,init_srb+30);
501
spin_lock_irqsave(&olympic_priv->olympic_lock,flags);
502
olympic_priv->srb_queued=1;
504
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
505
spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
509
add_wait_queue(&olympic_priv->srb_wait,&wait) ;
510
set_current_state(TASK_INTERRUPTIBLE) ;
512
while(olympic_priv->srb_queued) {
514
if(signal_pending(current)) {
515
printk(KERN_WARNING "%s: Signal received in open.\n",
517
printk(KERN_WARNING "SISR=%x LISR=%x\n",
518
readl(olympic_mmio+SISR),
519
readl(olympic_mmio+LISR));
520
olympic_priv->srb_queued=0;
523
if (time_after(jiffies, t + 10*HZ)) {
524
printk(KERN_WARNING "%s: SRB timed out.\n",dev->name);
525
olympic_priv->srb_queued=0;
528
set_current_state(TASK_INTERRUPTIBLE) ;
530
remove_wait_queue(&olympic_priv->srb_wait,&wait) ;
531
set_current_state(TASK_RUNNING) ;
532
olympic_priv->srb_queued = 0 ;
534
printk("init_srb(%p): ",init_srb);
536
printk("%02x ",readb(init_srb+i));
540
/* If we get the same return response as we set, the interrupt wasn't raised and the open
544
switch (resp = readb(init_srb+2)) {
545
case OLYMPIC_CLEAR_RET_CODE:
546
printk(KERN_WARNING "%s: Adapter Open time out or error.\n", dev->name) ;
552
if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */
553
printk(KERN_WARNING "%s: Retrying at different ring speed\n", dev->name);
558
err = readb(init_srb+7);
560
if (!olympic_priv->olympic_ring_speed && ((err & 0x0f) == 0x0d)) {
561
printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name);
562
printk(KERN_WARNING "%s: Please try again with a specified ring speed\n",dev->name);
564
printk(KERN_WARNING "%s: %s - %s\n", dev->name,
565
open_maj_error[(err & 0xf0) >> 4],
566
open_min_error[(err & 0x0f)]);
571
printk(KERN_WARNING "%s: Invalid LAA: %pM\n",
572
dev->name, olympic_priv->olympic_laa);
576
printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name, resp);
580
} while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */
582
if (readb(init_srb+18) & (1<<3))
583
if (olympic_priv->olympic_message_level)
584
printk(KERN_INFO "%s: Opened in FDX Mode\n",dev->name);
586
if (readb(init_srb+18) & (1<<1))
587
olympic_priv->olympic_ring_speed = 100 ;
588
else if (readb(init_srb+18) & 1)
589
olympic_priv->olympic_ring_speed = 16 ;
591
olympic_priv->olympic_ring_speed = 4 ;
593
if (olympic_priv->olympic_message_level)
594
printk(KERN_INFO "%s: Opened in %d Mbps mode\n",dev->name, olympic_priv->olympic_ring_speed);
596
olympic_priv->asb = swab16(readw(init_srb+8));
597
olympic_priv->srb = swab16(readw(init_srb+10));
598
olympic_priv->arb = swab16(readw(init_srb+12));
599
olympic_priv->trb = swab16(readw(init_srb+16));
601
olympic_priv->olympic_receive_options = 0x01 ;
602
olympic_priv->olympic_copy_all_options = 0 ;
606
writel((3<<16),olympic_mmio+BMCTL_RWM); /* Ensure end of frame generated interrupts */
608
writel(BMCTL_RX_DIS|3,olympic_mmio+BMCTL_RWM); /* Yes, this the enables RX channel */
610
for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
614
skb=dev_alloc_skb(olympic_priv->pkt_buf_sz);
620
olympic_priv->olympic_rx_ring[i].buffer = cpu_to_le32(pci_map_single(olympic_priv->pdev,
621
skb->data,olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE)) ;
622
olympic_priv->olympic_rx_ring[i].res_length = cpu_to_le32(olympic_priv->pkt_buf_sz);
623
olympic_priv->rx_ring_skb[i]=skb;
627
printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
631
olympic_priv->rx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_rx_ring,
632
sizeof(struct olympic_rx_desc) * OLYMPIC_RX_RING_SIZE, PCI_DMA_TODEVICE);
633
writel(olympic_priv->rx_ring_dma_addr, olympic_mmio+RXDESCQ);
634
writel(olympic_priv->rx_ring_dma_addr, olympic_mmio+RXCDA);
635
writew(i, olympic_mmio+RXDESCQCNT);
637
olympic_priv->rx_status_ring_dma_addr = pci_map_single(olympic_priv->pdev, olympic_priv->olympic_rx_status_ring,
638
sizeof(struct olympic_rx_status) * OLYMPIC_RX_RING_SIZE, PCI_DMA_FROMDEVICE);
639
writel(olympic_priv->rx_status_ring_dma_addr, olympic_mmio+RXSTATQ);
640
writel(olympic_priv->rx_status_ring_dma_addr, olympic_mmio+RXCSA);
642
olympic_priv->rx_ring_last_received = OLYMPIC_RX_RING_SIZE - 1; /* last processed rx status */
643
olympic_priv->rx_status_last_received = OLYMPIC_RX_RING_SIZE - 1;
645
writew(i, olympic_mmio+RXSTATQCNT);
648
printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
649
printk("RXCSA: %x, rx_status_ring[0]: %p\n",readl(olympic_mmio+RXCSA),&olympic_priv->olympic_rx_status_ring[0]);
650
printk(" stat_ring[1]: %p, stat_ring[2]: %p, stat_ring[3]: %p\n", &(olympic_priv->olympic_rx_status_ring[1]), &(olympic_priv->olympic_rx_status_ring[2]), &(olympic_priv->olympic_rx_status_ring[3]) );
651
printk(" stat_ring[4]: %p, stat_ring[5]: %p, stat_ring[6]: %p\n", &(olympic_priv->olympic_rx_status_ring[4]), &(olympic_priv->olympic_rx_status_ring[5]), &(olympic_priv->olympic_rx_status_ring[6]) );
652
printk(" stat_ring[7]: %p\n", &(olympic_priv->olympic_rx_status_ring[7]) );
654
printk("RXCDA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCDA),&olympic_priv->olympic_rx_ring[0]);
655
printk("Rx_ring_dma_addr = %08x, rx_status_dma_addr = %08x\n",
656
olympic_priv->rx_ring_dma_addr,olympic_priv->rx_status_ring_dma_addr) ;
659
writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | i,olympic_mmio+RXENQ);
662
printk("# of rx buffers: %d, RXENQ: %x\n",i, readw(olympic_mmio+RXENQ));
663
printk("RXCSA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCSA),&olympic_priv->olympic_rx_status_ring[0]);
664
printk("RXCDA: %x, rx_ring[0]: %p\n",readl(olympic_mmio+RXCDA),&olympic_priv->olympic_rx_ring[0]);
667
writel(SISR_RX_STATUS | SISR_RX_NOBUF,olympic_mmio+SISR_MASK_SUM);
671
writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */
672
for(i=0;i<OLYMPIC_TX_RING_SIZE;i++)
673
olympic_priv->olympic_tx_ring[i].buffer=cpu_to_le32(0xdeadbeef);
675
olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE;
676
olympic_priv->tx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_tx_ring,
677
sizeof(struct olympic_tx_desc) * OLYMPIC_TX_RING_SIZE,PCI_DMA_TODEVICE) ;
678
writel(olympic_priv->tx_ring_dma_addr, olympic_mmio+TXDESCQ_1);
679
writel(olympic_priv->tx_ring_dma_addr, olympic_mmio+TXCDA_1);
680
writew(OLYMPIC_TX_RING_SIZE, olympic_mmio+TXDESCQCNT_1);
682
olympic_priv->tx_status_ring_dma_addr = pci_map_single(olympic_priv->pdev, olympic_priv->olympic_tx_status_ring,
683
sizeof(struct olympic_tx_status) * OLYMPIC_TX_RING_SIZE, PCI_DMA_FROMDEVICE);
684
writel(olympic_priv->tx_status_ring_dma_addr,olympic_mmio+TXSTATQ_1);
685
writel(olympic_priv->tx_status_ring_dma_addr,olympic_mmio+TXCSA_1);
686
writew(OLYMPIC_TX_RING_SIZE,olympic_mmio+TXSTATQCNT_1);
688
olympic_priv->tx_ring_free=0; /* next entry in tx ring to use */
689
olympic_priv->tx_ring_last_status=OLYMPIC_TX_RING_SIZE-1; /* last processed tx status */
691
writel(0xffffffff, olympic_mmio+EISR_RWM) ; /* clean the eisr */
692
writel(0,olympic_mmio+EISR) ;
693
writel(EISR_MASK_OPTIONS,olympic_mmio+EISR_MASK) ; /* enables most of the TX error interrupts */
694
writel(SISR_TX1_EOF | SISR_ADAPTER_CHECK | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_ASB_FREE | SISR_ERR,olympic_mmio+SISR_MASK_SUM);
697
printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
698
printk("SISR MASK: %x\n",readl(olympic_mmio+SISR_MASK));
701
if (olympic_priv->olympic_network_monitor) {
705
oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr);
706
opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr);
708
for (i = 0; i < 6; i++)
709
addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr)+i);
710
printk("%s: Node Address: %pM\n", dev->name, addr);
711
printk("%s: Functional Address: %02x:%02x:%02x:%02x\n",dev->name,
712
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)),
713
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
714
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
715
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
717
for (i = 0; i < 6; i++)
718
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, up_node_addr)+i);
719
printk("%s: NAUN Address: %pM\n", dev->name, addr);
722
netif_start_queue(dev);
726
free_irq(dev->irq, dev);
731
* When we enter the rx routine we do not know how many frames have been
732
* queued on the rx channel. Therefore we start at the next rx status
733
* position and travel around the receive ring until we have completed
736
* This means that we may process the frame before we receive the end
737
* of frame interrupt. This is why we always test the status instead
738
* of blindly processing the next frame.
740
* We also remove the last 4 bytes from the packet as well, these are
741
* just token ring trailer info and upset protocols that don't check
742
* their own length, i.e. SNA.
745
static void olympic_rx(struct net_device *dev)
747
struct olympic_private *olympic_priv=netdev_priv(dev);
748
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
749
struct olympic_rx_status *rx_status;
750
struct olympic_rx_desc *rx_desc ;
751
int rx_ring_last_received,length, buffer_cnt, cpy_length, frag_len;
752
struct sk_buff *skb, *skb2;
755
rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ;
757
while (rx_status->status_buffercnt) {
758
u32 l_status_buffercnt;
760
olympic_priv->rx_status_last_received++ ;
761
olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1);
763
printk("rx status: %x rx len: %x\n", le32_to_cpu(rx_status->status_buffercnt), le32_to_cpu(rx_status->fragmentcnt_framelen));
765
length = le32_to_cpu(rx_status->fragmentcnt_framelen) & 0xffff;
766
buffer_cnt = le32_to_cpu(rx_status->status_buffercnt) & 0xffff;
767
i = buffer_cnt ; /* Need buffer_cnt later for rxenq update */
768
frag_len = le32_to_cpu(rx_status->fragmentcnt_framelen) >> 16;
771
printk("length: %x, frag_len: %x, buffer_cnt: %x\n", length, frag_len, buffer_cnt);
773
l_status_buffercnt = le32_to_cpu(rx_status->status_buffercnt);
774
if(l_status_buffercnt & 0xC0000000) {
775
if (l_status_buffercnt & 0x3B000000) {
776
if (olympic_priv->olympic_message_level) {
777
if (l_status_buffercnt & (1<<29)) /* Rx Frame Truncated */
778
printk(KERN_WARNING "%s: Rx Frame Truncated\n",dev->name);
779
if (l_status_buffercnt & (1<<28)) /*Rx receive overrun */
780
printk(KERN_WARNING "%s: Rx Frame Receive overrun\n",dev->name);
781
if (l_status_buffercnt & (1<<27)) /* No receive buffers */
782
printk(KERN_WARNING "%s: No receive buffers\n",dev->name);
783
if (l_status_buffercnt & (1<<25)) /* Receive frame error detect */
784
printk(KERN_WARNING "%s: Receive frame error detect\n",dev->name);
785
if (l_status_buffercnt & (1<<24)) /* Received Error Detect */
786
printk(KERN_WARNING "%s: Received Error Detect\n",dev->name);
788
olympic_priv->rx_ring_last_received += i ;
789
olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ;
790
dev->stats.rx_errors++;
793
if (buffer_cnt == 1) {
794
skb = dev_alloc_skb(max_t(int, olympic_priv->pkt_buf_sz,length)) ;
796
skb = dev_alloc_skb(length) ;
800
printk(KERN_WARNING "%s: Not enough memory to copy packet to upper layers.\n",dev->name) ;
801
dev->stats.rx_dropped++;
802
/* Update counters even though we don't transfer the frame */
803
olympic_priv->rx_ring_last_received += i ;
804
olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1) ;
806
/* Optimise based upon number of buffers used.
807
If only one buffer is used we can simply swap the buffers around.
808
If more than one then we must use the new buffer and copy the information
809
first. Ideally all frames would be in a single buffer, this can be tuned by
810
altering the buffer size. If the length of the packet is less than
811
1500 bytes we're going to copy it over anyway to stop packets getting
812
dropped from sockets with buffers smaller than our pkt_buf_sz. */
815
olympic_priv->rx_ring_last_received++ ;
816
olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
817
rx_ring_last_received = olympic_priv->rx_ring_last_received ;
819
skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ;
821
pci_unmap_single(olympic_priv->pdev,
822
le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
823
olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
824
skb_put(skb2,length-4);
825
skb2->protocol = tr_type_trans(skb2,dev);
826
olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer =
827
cpu_to_le32(pci_map_single(olympic_priv->pdev, skb->data,
828
olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE));
829
olympic_priv->olympic_rx_ring[rx_ring_last_received].res_length =
830
cpu_to_le32(olympic_priv->pkt_buf_sz);
831
olympic_priv->rx_ring_skb[rx_ring_last_received] = skb ;
834
pci_dma_sync_single_for_cpu(olympic_priv->pdev,
835
le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
836
olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
837
skb_copy_from_linear_data(olympic_priv->rx_ring_skb[rx_ring_last_received],
838
skb_put(skb,length - 4),
840
pci_dma_sync_single_for_device(olympic_priv->pdev,
841
le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
842
olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
843
skb->protocol = tr_type_trans(skb,dev) ;
847
do { /* Walk the buffers */
848
olympic_priv->rx_ring_last_received++ ;
849
olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE -1);
850
rx_ring_last_received = olympic_priv->rx_ring_last_received ;
851
pci_dma_sync_single_for_cpu(olympic_priv->pdev,
852
le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
853
olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
854
rx_desc = &(olympic_priv->olympic_rx_ring[rx_ring_last_received]);
855
cpy_length = (i == 1 ? frag_len : le32_to_cpu(rx_desc->res_length));
856
skb_copy_from_linear_data(olympic_priv->rx_ring_skb[rx_ring_last_received],
857
skb_put(skb, cpy_length),
859
pci_dma_sync_single_for_device(olympic_priv->pdev,
860
le32_to_cpu(olympic_priv->olympic_rx_ring[rx_ring_last_received].buffer),
861
olympic_priv->pkt_buf_sz,PCI_DMA_FROMDEVICE) ;
863
skb_trim(skb,skb->len-4) ;
864
skb->protocol = tr_type_trans(skb,dev);
867
dev->stats.rx_packets++ ;
868
dev->stats.rx_bytes += length ;
869
} /* if skb == null */
870
} /* If status & 0x3b */
872
} else { /*if buffercnt & 0xC */
873
olympic_priv->rx_ring_last_received += i ;
874
olympic_priv->rx_ring_last_received &= (OLYMPIC_RX_RING_SIZE - 1) ;
877
rx_status->fragmentcnt_framelen = 0 ;
878
rx_status->status_buffercnt = 0 ;
879
rx_status = &(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received+1) & (OLYMPIC_RX_RING_SIZE -1) ]);
881
writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | buffer_cnt , olympic_mmio+RXENQ);
886
static void olympic_freemem(struct net_device *dev)
888
struct olympic_private *olympic_priv=netdev_priv(dev);
891
for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
892
if (olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] != NULL) {
893
dev_kfree_skb_irq(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]);
894
olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] = NULL;
896
if (olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer != cpu_to_le32(0xdeadbeef)) {
897
pci_unmap_single(olympic_priv->pdev,
898
le32_to_cpu(olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer),
899
olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE);
901
olympic_priv->rx_status_last_received++;
902
olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
905
pci_unmap_single(olympic_priv->pdev, olympic_priv->rx_status_ring_dma_addr,
906
sizeof(struct olympic_rx_status) * OLYMPIC_RX_RING_SIZE, PCI_DMA_FROMDEVICE);
907
pci_unmap_single(olympic_priv->pdev, olympic_priv->rx_ring_dma_addr,
908
sizeof(struct olympic_rx_desc) * OLYMPIC_RX_RING_SIZE, PCI_DMA_TODEVICE);
910
pci_unmap_single(olympic_priv->pdev, olympic_priv->tx_status_ring_dma_addr,
911
sizeof(struct olympic_tx_status) * OLYMPIC_TX_RING_SIZE, PCI_DMA_FROMDEVICE);
912
pci_unmap_single(olympic_priv->pdev, olympic_priv->tx_ring_dma_addr,
913
sizeof(struct olympic_tx_desc) * OLYMPIC_TX_RING_SIZE, PCI_DMA_TODEVICE);
918
static irqreturn_t olympic_interrupt(int irq, void *dev_id)
920
struct net_device *dev= (struct net_device *)dev_id;
921
struct olympic_private *olympic_priv=netdev_priv(dev);
922
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
924
u8 __iomem *adapter_check_area ;
927
* Read sisr but don't reset it yet.
928
* The indication bit may have been set but the interrupt latch
929
* bit may not be set, so we'd lose the interrupt later.
931
sisr=readl(olympic_mmio+SISR) ;
932
if (!(sisr & SISR_MI)) /* Interrupt isn't for us */
934
sisr=readl(olympic_mmio+SISR_RR) ; /* Read & Reset sisr */
936
spin_lock(&olympic_priv->olympic_lock);
938
/* Hotswap gives us this on removal */
939
if (sisr == 0xffffffff) {
940
printk(KERN_WARNING "%s: Hotswap adapter removal.\n",dev->name) ;
941
spin_unlock(&olympic_priv->olympic_lock) ;
945
if (sisr & (SISR_SRB_REPLY | SISR_TX1_EOF | SISR_RX_STATUS | SISR_ADAPTER_CHECK |
946
SISR_ASB_FREE | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_RX_NOBUF | SISR_ERR)) {
948
/* If we ever get this the adapter is seriously dead. Only a reset is going to
949
* bring it back to life. We're talking pci bus errors and such like :( */
950
if((sisr & SISR_ERR) && (readl(olympic_mmio+EISR) & EISR_MASK_OPTIONS)) {
951
printk(KERN_ERR "Olympic: EISR Error, EISR=%08x\n",readl(olympic_mmio+EISR)) ;
952
printk(KERN_ERR "The adapter must be reset to clear this condition.\n") ;
953
printk(KERN_ERR "Please report this error to the driver maintainer and/\n") ;
954
printk(KERN_ERR "or the linux-tr mailing list.\n") ;
955
wake_up_interruptible(&olympic_priv->srb_wait);
956
spin_unlock(&olympic_priv->olympic_lock) ;
960
if(sisr & SISR_SRB_REPLY) {
961
if(olympic_priv->srb_queued==1) {
962
wake_up_interruptible(&olympic_priv->srb_wait);
963
} else if (olympic_priv->srb_queued==2) {
964
olympic_srb_bh(dev) ;
966
olympic_priv->srb_queued=0;
967
} /* SISR_SRB_REPLY */
969
/* We shouldn't ever miss the Tx interrupt, but the you never know, hence the loop to ensure
970
we get all tx completions. */
971
if (sisr & SISR_TX1_EOF) {
972
while(olympic_priv->olympic_tx_status_ring[(olympic_priv->tx_ring_last_status + 1) & (OLYMPIC_TX_RING_SIZE-1)].status) {
973
olympic_priv->tx_ring_last_status++;
974
olympic_priv->tx_ring_last_status &= (OLYMPIC_TX_RING_SIZE-1);
975
olympic_priv->free_tx_ring_entries++;
976
dev->stats.tx_bytes += olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len;
977
dev->stats.tx_packets++ ;
978
pci_unmap_single(olympic_priv->pdev,
979
le32_to_cpu(olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer),
980
olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len,PCI_DMA_TODEVICE);
981
dev_kfree_skb_irq(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]);
982
olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=cpu_to_le32(0xdeadbeef);
983
olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0;
985
netif_wake_queue(dev);
988
if (sisr & SISR_RX_STATUS) {
990
} /* SISR_RX_STATUS */
992
if (sisr & SISR_ADAPTER_CHECK) {
993
netif_stop_queue(dev);
994
printk(KERN_WARNING "%s: Adapter Check Interrupt Raised, 8 bytes of information follow:\n", dev->name);
995
writel(readl(olympic_mmio+LAPWWC),olympic_mmio+LAPA);
996
adapter_check_area = olympic_priv->olympic_lap + ((readl(olympic_mmio+LAPWWC)) & (~0xf800)) ;
997
printk(KERN_WARNING "%s: Bytes %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, readb(adapter_check_area+0), readb(adapter_check_area+1), readb(adapter_check_area+2), readb(adapter_check_area+3), readb(adapter_check_area+4), readb(adapter_check_area+5), readb(adapter_check_area+6), readb(adapter_check_area+7)) ;
998
spin_unlock(&olympic_priv->olympic_lock) ;
1000
} /* SISR_ADAPTER_CHECK */
1002
if (sisr & SISR_ASB_FREE) {
1003
/* Wake up anything that is waiting for the asb response */
1004
if (olympic_priv->asb_queued) {
1005
olympic_asb_bh(dev) ;
1007
} /* SISR_ASB_FREE */
1009
if (sisr & SISR_ARB_CMD) {
1010
olympic_arb_cmd(dev) ;
1011
} /* SISR_ARB_CMD */
1013
if (sisr & SISR_TRB_REPLY) {
1014
/* Wake up anything that is waiting for the trb response */
1015
if (olympic_priv->trb_queued) {
1016
wake_up_interruptible(&olympic_priv->trb_wait);
1018
olympic_priv->trb_queued = 0 ;
1019
} /* SISR_TRB_REPLY */
1021
if (sisr & SISR_RX_NOBUF) {
1022
/* According to the documentation, we don't have to do anything, but trapping it keeps it out of
1023
/var/log/messages. */
1024
} /* SISR_RX_NOBUF */
1026
printk(KERN_WARNING "%s: Unexpected interrupt: %x\n",dev->name, sisr);
1027
printk(KERN_WARNING "%s: SISR_MASK: %x\n",dev->name, readl(olympic_mmio+SISR_MASK)) ;
1028
} /* One if the interrupts we want */
1029
writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
1031
spin_unlock(&olympic_priv->olympic_lock) ;
1035
static netdev_tx_t olympic_xmit(struct sk_buff *skb,
1036
struct net_device *dev)
1038
struct olympic_private *olympic_priv=netdev_priv(dev);
1039
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
1040
unsigned long flags ;
1042
spin_lock_irqsave(&olympic_priv->olympic_lock, flags);
1044
netif_stop_queue(dev);
1046
if(olympic_priv->free_tx_ring_entries) {
1047
olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer =
1048
cpu_to_le32(pci_map_single(olympic_priv->pdev, skb->data, skb->len,PCI_DMA_TODEVICE));
1049
olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length = cpu_to_le32(skb->len | (0x80000000));
1050
olympic_priv->tx_ring_skb[olympic_priv->tx_ring_free]=skb;
1051
olympic_priv->free_tx_ring_entries--;
1053
olympic_priv->tx_ring_free++;
1054
olympic_priv->tx_ring_free &= (OLYMPIC_TX_RING_SIZE-1);
1055
writew((((readw(olympic_mmio+TXENQ_1)) & 0x8000) ^ 0x8000) | 1,olympic_mmio+TXENQ_1);
1056
netif_wake_queue(dev);
1057
spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
1058
return NETDEV_TX_OK;
1060
spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
1061
return NETDEV_TX_BUSY;
1067
static int olympic_close(struct net_device *dev)
1069
struct olympic_private *olympic_priv=netdev_priv(dev);
1070
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*srb;
1071
unsigned long t,flags;
1073
DECLARE_WAITQUEUE(wait,current) ;
1075
netif_stop_queue(dev);
1077
writel(olympic_priv->srb,olympic_mmio+LAPA);
1078
srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
1080
writeb(SRB_CLOSE_ADAPTER,srb+0);
1082
writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
1084
add_wait_queue(&olympic_priv->srb_wait,&wait) ;
1085
set_current_state(TASK_INTERRUPTIBLE) ;
1087
spin_lock_irqsave(&olympic_priv->olympic_lock,flags);
1088
olympic_priv->srb_queued=1;
1090
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
1091
spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
1093
while(olympic_priv->srb_queued) {
1095
t = schedule_timeout_interruptible(60*HZ);
1097
if(signal_pending(current)) {
1098
printk(KERN_WARNING "%s: SRB timed out.\n",dev->name);
1099
printk(KERN_WARNING "SISR=%x MISR=%x\n",readl(olympic_mmio+SISR),readl(olympic_mmio+LISR));
1100
olympic_priv->srb_queued=0;
1105
printk(KERN_WARNING "%s: SRB timed out. May not be fatal.\n",dev->name);
1107
olympic_priv->srb_queued=0;
1109
remove_wait_queue(&olympic_priv->srb_wait,&wait) ;
1111
olympic_priv->rx_status_last_received++;
1112
olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
1114
olympic_freemem(dev) ;
1116
/* reset tx/rx fifo's and busmaster logic */
1118
writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
1120
writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
1125
printk("srb(%p): ",srb);
1127
printk("%x ",readb(srb+i));
1131
free_irq(dev->irq,dev);
1137
static void olympic_set_rx_mode(struct net_device *dev)
1139
struct olympic_private *olympic_priv = netdev_priv(dev);
1140
u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ;
1143
struct netdev_hw_addr *ha;
1144
unsigned char dev_mc_address[4] ;
1146
writel(olympic_priv->srb,olympic_mmio+LAPA);
1147
srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
1148
options = olympic_priv->olympic_copy_all_options;
1150
if (dev->flags&IFF_PROMISC)
1155
/* Only issue the srb if there is a change in options */
1157
if ((options ^ olympic_priv->olympic_copy_all_options)) {
1159
/* Now to issue the srb command to alter the copy.all.options */
1161
writeb(SRB_MODIFY_RECEIVE_OPTIONS,srb);
1163
writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
1165
writeb(olympic_priv->olympic_receive_options,srb+4);
1166
writeb(options,srb+5);
1168
olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
1170
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
1172
olympic_priv->olympic_copy_all_options = options ;
1177
/* Set the functional addresses we need for multicast */
1179
dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ;
1181
netdev_for_each_mc_addr(ha, dev) {
1182
dev_mc_address[0] |= ha->addr[2];
1183
dev_mc_address[1] |= ha->addr[3];
1184
dev_mc_address[2] |= ha->addr[4];
1185
dev_mc_address[3] |= ha->addr[5];
1188
writeb(SRB_SET_FUNC_ADDRESS,srb+0);
1190
writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
1194
writeb(dev_mc_address[0],srb+6);
1195
writeb(dev_mc_address[1],srb+7);
1196
writeb(dev_mc_address[2],srb+8);
1197
writeb(dev_mc_address[3],srb+9);
1199
olympic_priv->srb_queued = 2 ;
1200
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
1204
static void olympic_srb_bh(struct net_device *dev)
1206
struct olympic_private *olympic_priv = netdev_priv(dev);
1207
u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ;
1210
writel(olympic_priv->srb,olympic_mmio+LAPA);
1211
srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
1213
switch (readb(srb)) {
1215
/* SRB_MODIFY_RECEIVE_OPTIONS i.e. set_multicast_list options (promiscuous)
1216
* At some point we should do something if we get an error, such as
1217
* resetting the IFF_PROMISC flag in dev
1220
case SRB_MODIFY_RECEIVE_OPTIONS:
1221
switch (readb(srb+2)) {
1223
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name) ;
1226
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
1229
if (olympic_priv->olympic_message_level)
1230
printk(KERN_WARNING "%s: Receive Options Modified to %x,%x\n",dev->name,olympic_priv->olympic_copy_all_options, olympic_priv->olympic_receive_options) ;
1232
} /* switch srb[2] */
1235
/* SRB_SET_GROUP_ADDRESS - Multicast group setting
1238
case SRB_SET_GROUP_ADDRESS:
1239
switch (readb(srb+2)) {
1243
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1246
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
1249
printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n",dev->name) ;
1251
case 0x3e: /* If we ever implement individual multicast addresses, will need to deal with this */
1252
printk(KERN_WARNING "%s: Group address registers full\n",dev->name) ;
1255
printk(KERN_INFO "%s: Group Address already set.\n",dev->name) ;
1259
} /* switch srb[2] */
1262
/* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
1265
case SRB_RESET_GROUP_ADDRESS:
1266
switch (readb(srb+2)) {
1270
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1273
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
1275
case 0x39: /* Must deal with this if individual multicast addresses used */
1276
printk(KERN_INFO "%s: Group address not found\n",dev->name);
1280
} /* switch srb[2] */
1284
/* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode
1287
case SRB_SET_FUNC_ADDRESS:
1288
switch (readb(srb+2)) {
1290
if (olympic_priv->olympic_message_level)
1291
printk(KERN_INFO "%s: Functional Address Mask Set\n",dev->name);
1294
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1297
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
1301
} /* switch srb[2] */
1304
/* SRB_READ_LOG - Read and reset the adapter error counters
1308
switch (readb(srb+2)) {
1310
if (olympic_priv->olympic_message_level)
1311
printk(KERN_INFO "%s: Read Log issued\n",dev->name) ;
1314
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1317
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
1320
} /* switch srb[2] */
1323
/* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
1325
case SRB_READ_SR_COUNTERS:
1326
switch (readb(srb+2)) {
1328
if (olympic_priv->olympic_message_level)
1329
printk(KERN_INFO "%s: Read Source Routing Counters issued\n",dev->name) ;
1332
printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
1335
printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ;
1339
} /* switch srb[2] */
1343
printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n",dev->name);
1345
} /* switch srb[0] */
1349
static int olympic_set_mac_address (struct net_device *dev, void *addr)
1351
struct sockaddr *saddr = addr ;
1352
struct olympic_private *olympic_priv = netdev_priv(dev);
1354
if (netif_running(dev)) {
1355
printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ;
1359
memcpy(olympic_priv->olympic_laa, saddr->sa_data,dev->addr_len) ;
1361
if (olympic_priv->olympic_message_level) {
1362
printk(KERN_INFO "%s: MAC/LAA Set to = %x.%x.%x.%x.%x.%x\n",dev->name, olympic_priv->olympic_laa[0],
1363
olympic_priv->olympic_laa[1], olympic_priv->olympic_laa[2],
1364
olympic_priv->olympic_laa[3], olympic_priv->olympic_laa[4],
1365
olympic_priv->olympic_laa[5]);
1371
static void olympic_arb_cmd(struct net_device *dev)
1373
struct olympic_private *olympic_priv = netdev_priv(dev);
1374
u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
1375
u8 __iomem *arb_block, *asb_block, *srb ;
1377
u16 frame_len, buffer_len ;
1378
struct sk_buff *mac_frame ;
1379
u8 __iomem *buf_ptr ;
1380
u8 __iomem *frame_data ;
1382
u16 lan_status = 0, lan_status_diff ; /* Initialize to stop compiler warning */
1386
arb_block = (olympic_priv->olympic_lap + olympic_priv->arb) ;
1387
asb_block = (olympic_priv->olympic_lap + olympic_priv->asb) ;
1388
srb = (olympic_priv->olympic_lap + olympic_priv->srb) ;
1390
if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */
1392
header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */
1393
frame_len = swab16(readw(arb_block + 10)) ;
1395
buff_off = swab16(readw(arb_block + 6)) ;
1397
buf_ptr = olympic_priv->olympic_lap + buff_off ;
1402
frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ;
1404
for (i=0 ; i < 14 ; i++) {
1405
printk("Loc %d = %02x\n",i,readb(frame_data + i));
1408
printk("next %04x, fs %02x, len %04x\n",readw(buf_ptr+offsetof(struct mac_receive_buffer,next)), readb(buf_ptr+offsetof(struct mac_receive_buffer,frame_status)), readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length)));
1411
mac_frame = dev_alloc_skb(frame_len) ;
1413
printk(KERN_WARNING "%s: Memory squeeze, dropping frame.\n", dev->name);
1417
/* Walk the buffer chain, creating the frame */
1420
frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ;
1421
buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length)));
1422
memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ;
1423
next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next));
1424
} while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + swab16(next_ptr)));
1426
mac_frame->protocol = tr_type_trans(mac_frame, dev);
1428
if (olympic_priv->olympic_network_monitor) {
1429
struct trh_hdr *mac_hdr;
1430
printk(KERN_WARNING "%s: Received MAC Frame, details:\n",dev->name);
1431
mac_hdr = tr_hdr(mac_frame);
1432
printk(KERN_WARNING "%s: MAC Frame Dest. Addr: %pM\n",
1433
dev->name, mac_hdr->daddr);
1434
printk(KERN_WARNING "%s: MAC Frame Srce. Addr: %pM\n",
1435
dev->name, mac_hdr->saddr);
1437
netif_rx(mac_frame);
1440
/* Now tell the card we have dealt with the received frame */
1442
/* Set LISR Bit 1 */
1443
writel(LISR_ARB_FREE,olympic_priv->olympic_mmio + LISR_SUM);
1445
/* Is the ASB free ? */
1447
if (readb(asb_block + 2) != 0xff) {
1448
olympic_priv->asb_queued = 1 ;
1449
writel(LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
1451
/* Drop out and wait for the bottom half to be run */
1454
writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
1455
writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
1456
writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
1457
writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */
1459
writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
1461
olympic_priv->asb_queued = 2 ;
1465
} else if (readb(arb_block) == ARB_LAN_CHANGE_STATUS) { /* Lan.change.status */
1466
lan_status = swab16(readw(arb_block+6));
1467
fdx_prot_error = readb(arb_block+8) ;
1469
/* Issue ARB Free */
1470
writel(LISR_ARB_FREE,olympic_priv->olympic_mmio+LISR_SUM);
1472
lan_status_diff = olympic_priv->olympic_lan_status ^ lan_status ;
1474
if (lan_status_diff & (LSC_LWF | LSC_ARW | LSC_FPE | LSC_RR) ) {
1475
if (lan_status_diff & LSC_LWF)
1476
printk(KERN_WARNING "%s: Short circuit detected on the lobe\n",dev->name);
1477
if (lan_status_diff & LSC_ARW)
1478
printk(KERN_WARNING "%s: Auto removal error\n",dev->name);
1479
if (lan_status_diff & LSC_FPE)
1480
printk(KERN_WARNING "%s: FDX Protocol Error\n",dev->name);
1481
if (lan_status_diff & LSC_RR)
1482
printk(KERN_WARNING "%s: Force remove MAC frame received\n",dev->name);
1484
/* Adapter has been closed by the hardware */
1486
/* reset tx/rx fifo's and busmaster logic */
1488
writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
1490
writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
1491
netif_stop_queue(dev);
1492
olympic_priv->srb = readw(olympic_priv->olympic_lap + LAPWWO) ;
1493
printk(KERN_WARNING "%s: Adapter has been closed\n", dev->name);
1494
} /* If serious error */
1496
if (olympic_priv->olympic_message_level) {
1497
if (lan_status_diff & LSC_SIG_LOSS)
1498
printk(KERN_WARNING "%s: No receive signal detected\n", dev->name);
1499
if (lan_status_diff & LSC_HARD_ERR)
1500
printk(KERN_INFO "%s: Beaconing\n",dev->name);
1501
if (lan_status_diff & LSC_SOFT_ERR)
1502
printk(KERN_WARNING "%s: Adapter transmitted Soft Error Report Mac Frame\n",dev->name);
1503
if (lan_status_diff & LSC_TRAN_BCN)
1504
printk(KERN_INFO "%s: We are transmitting the beacon, aaah\n",dev->name);
1505
if (lan_status_diff & LSC_SS)
1506
printk(KERN_INFO "%s: Single Station on the ring\n", dev->name);
1507
if (lan_status_diff & LSC_RING_REC)
1508
printk(KERN_INFO "%s: Ring recovery ongoing\n",dev->name);
1509
if (lan_status_diff & LSC_FDX_MODE)
1510
printk(KERN_INFO "%s: Operating in FDX mode\n",dev->name);
1513
if (lan_status_diff & LSC_CO) {
1515
if (olympic_priv->olympic_message_level)
1516
printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
1518
/* Issue READ.LOG command */
1520
writeb(SRB_READ_LOG, srb);
1522
writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
1527
olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
1529
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
1533
if (lan_status_diff & LSC_SR_CO) {
1535
if (olympic_priv->olympic_message_level)
1536
printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
1538
/* Issue a READ.SR.COUNTERS */
1540
writeb(SRB_READ_SR_COUNTERS,srb);
1542
writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
1545
olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
1547
writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
1551
olympic_priv->olympic_lan_status = lan_status ;
1553
} /* Lan.change.status */
1555
printk(KERN_WARNING "%s: Unknown arb command\n", dev->name);
1558
static void olympic_asb_bh(struct net_device *dev)
1560
struct olympic_private *olympic_priv = netdev_priv(dev);
1561
u8 __iomem *arb_block, *asb_block ;
1563
arb_block = (olympic_priv->olympic_lap + olympic_priv->arb) ;
1564
asb_block = (olympic_priv->olympic_lap + olympic_priv->asb) ;
1566
if (olympic_priv->asb_queued == 1) { /* Dropped through the first time */
1568
writeb(ASB_RECEIVE_DATA,asb_block); /* Receive data */
1569
writeb(OLYMPIC_CLEAR_RET_CODE,asb_block+2); /* Necessary ?? */
1570
writeb(readb(arb_block+6),asb_block+6); /* Must send the address back to the adapter */
1571
writeb(readb(arb_block+7),asb_block+7); /* To let it know we have dealt with the data */
1573
writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
1574
olympic_priv->asb_queued = 2 ;
1579
if (olympic_priv->asb_queued == 2) {
1580
switch (readb(asb_block+2)) {
1582
printk(KERN_WARNING "%s: Unrecognized command code\n", dev->name);
1585
printk(KERN_WARNING "%s: Unrecognized buffer address\n", dev->name);
1588
/* Valid response, everything should be ok again */
1591
printk(KERN_WARNING "%s: Invalid return code in asb\n",dev->name);
1595
olympic_priv->asb_queued = 0 ;
1598
static int olympic_change_mtu(struct net_device *dev, int mtu)
1600
struct olympic_private *olympic_priv = netdev_priv(dev);
1603
if (olympic_priv->olympic_ring_speed == 4)
1614
olympic_priv->pkt_buf_sz = mtu + TR_HLEN ;
1619
static int olympic_proc_show(struct seq_file *m, void *v)
1621
struct net_device *dev = m->private;
1622
struct olympic_private *olympic_priv=netdev_priv(dev);
1623
u8 __iomem *oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ;
1624
u8 __iomem *opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ;
1630
"IBM Pit/Pit-Phy/Olympic Chipset Token Ring Adapter %s\n",dev->name);
1631
seq_printf(m, "\n%6s: Adapter Address : Node Address : Functional Addr\n",
1634
for (i = 0 ; i < 6 ; i++)
1635
addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr) + i);
1637
seq_printf(m, "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
1639
dev->dev_addr, addr,
1640
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)),
1641
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+1),
1642
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+2),
1643
readb(oat+offsetof(struct olympic_adapter_addr_table,func_addr)+3));
1645
seq_printf(m, "\n%6s: Token Ring Parameters Table:\n", dev->name);
1647
seq_printf(m, "%6s: Physical Addr : Up Node Address : Poll Address : AccPri : Auth Src : Att Code :\n",
1650
for (i = 0 ; i < 6 ; i++)
1651
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, up_node_addr) + i);
1652
for (i = 0 ; i < 6 ; i++)
1653
addr2[i] = readb(opt+offsetof(struct olympic_parameters_table, poll_addr) + i);
1655
seq_printf(m, "%6s: %02x:%02x:%02x:%02x : %pM : %pM : %04x : %04x : %04x :\n",
1657
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)),
1658
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+1),
1659
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+2),
1660
readb(opt+offsetof(struct olympic_parameters_table, phys_addr)+3),
1662
swab16(readw(opt+offsetof(struct olympic_parameters_table, acc_priority))),
1663
swab16(readw(opt+offsetof(struct olympic_parameters_table, auth_source_class))),
1664
swab16(readw(opt+offsetof(struct olympic_parameters_table, att_code))));
1666
seq_printf(m, "%6s: Source Address : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
1669
for (i = 0 ; i < 6 ; i++)
1670
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, source_addr) + i);
1671
seq_printf(m, "%6s: %pM : %04x : %04x : %04x : %04x : %04x : %04x : \n",
1673
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_type))),
1674
swab16(readw(opt+offsetof(struct olympic_parameters_table, major_vector))),
1675
swab16(readw(opt+offsetof(struct olympic_parameters_table, lan_status))),
1676
swab16(readw(opt+offsetof(struct olympic_parameters_table, local_ring))),
1677
swab16(readw(opt+offsetof(struct olympic_parameters_table, mon_error))),
1678
swab16(readw(opt+offsetof(struct olympic_parameters_table, frame_correl))));
1680
seq_printf(m, "%6s: Beacon Details : Tx : Rx : NAUN Node Address : NAUN Node Phys : \n",
1683
for (i = 0 ; i < 6 ; i++)
1684
addr[i] = readb(opt+offsetof(struct olympic_parameters_table, beacon_naun) + i);
1685
seq_printf(m, "%6s: : %02x : %02x : %pM : %02x:%02x:%02x:%02x : \n",
1687
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
1688
swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
1690
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)),
1691
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+1),
1692
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+2),
1693
readb(opt+offsetof(struct olympic_parameters_table, beacon_phys)+3));
1698
static int olympic_proc_open(struct inode *inode, struct file *file)
1700
return single_open(file, olympic_proc_show, PDE(inode)->data);
1703
static const struct file_operations olympic_proc_ops = {
1704
.open = olympic_proc_open,
1706
.llseek = seq_lseek,
1707
.release = single_release,
1710
static void __devexit olympic_remove_one(struct pci_dev *pdev)
1712
struct net_device *dev = pci_get_drvdata(pdev) ;
1713
struct olympic_private *olympic_priv=netdev_priv(dev);
1715
if (olympic_priv->olympic_network_monitor) {
1716
char proc_name[20] ;
1717
strcpy(proc_name,"olympic_") ;
1718
strcat(proc_name,dev->name) ;
1719
remove_proc_entry(proc_name,init_net.proc_net);
1721
unregister_netdev(dev) ;
1722
iounmap(olympic_priv->olympic_mmio) ;
1723
iounmap(olympic_priv->olympic_lap) ;
1724
pci_release_regions(pdev) ;
1725
pci_set_drvdata(pdev,NULL) ;
1729
static struct pci_driver olympic_driver = {
1731
.id_table = olympic_pci_tbl,
1732
.probe = olympic_probe,
1733
.remove = __devexit_p(olympic_remove_one),
1736
static int __init olympic_pci_init(void)
1738
return pci_register_driver(&olympic_driver) ;
1741
static void __exit olympic_pci_cleanup(void)
1743
pci_unregister_driver(&olympic_driver) ;
1747
module_init(olympic_pci_init) ;
1748
module_exit(olympic_pci_cleanup) ;
1750
MODULE_LICENSE("GPL");