~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to drivers/net/tokenring/olympic.c

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *   olympic.c (c) 1999 Peter De Schrijver All Rights Reserved
 
3
 *                 1999/2000 Mike Phillips (mikep@linuxtr.net)
 
4
 *
 
5
 *  Linux driver for IBM PCI tokenring cards based on the Pit/Pit-Phy/Olympic
 
6
 *  chipset. 
 
7
 *
 
8
 *  Base Driver Skeleton:
 
9
 *      Written 1993-94 by Donald Becker.
 
10
 *
 
11
 *      Copyright 1993 United States Government as represented by the
 
12
 *      Director, National Security Agency.
 
13
 *
 
14
 *  Thanks to Erik De Cock, Adrian Bridgett and Frank Fiene for their 
 
15
 *  assistance and perserverance with the testing of this driver.
 
16
 *
 
17
 *  This software may be used and distributed according to the terms
 
18
 *  of the GNU General Public License, incorporated herein by reference.
 
19
 * 
 
20
 *  4/27/99 - Alpha Release 0.1.0
 
21
 *            First release to the public
 
22
 *
 
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
 
27
 *            the pci resource.
 
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 
 
31
 *            squashed.
 
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
 
41
 *
 
42
 * 12/23/00 - Added minimal Cardbus support (Thanks Donald).
 
43
 *
 
44
 * 03/09/01 - Add new pci api, dev_base_lock, general clean up. 
 
45
 *
 
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.
 
48
 *
 
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.
 
51
 * 
 
52
 * 06/02/01 - Clean up, copy skb for small packets
 
53
 * 
 
54
 * 06/22/01 - Add EISR error handling routines 
 
55
 *
 
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.
 
68
 *  To Do:
 
69
 *
 
70
 *           Wake on lan        
 
71
 * 
 
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).
 
76
 */
 
77
 
 
78
/* Change OLYMPIC_DEBUG to 1 to get verbose, and I mean really verbose, messages */
 
79
 
 
80
#define OLYMPIC_DEBUG 0
 
81
 
 
82
 
 
83
#include <linux/module.h>
 
84
#include <linux/kernel.h>
 
85
#include <linux/errno.h>
 
86
#include <linux/timer.h>
 
87
#include <linux/in.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>
 
104
 
 
105
#include <net/checksum.h>
 
106
#include <net/net_namespace.h>
 
107
 
 
108
#include <asm/io.h>
 
109
#include <asm/system.h>
 
110
 
 
111
#include "olympic.h"
 
112
 
 
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
 
117
 * 
 
118
 * Official releases will only have an a.b.c version number format. 
 
119
 */
 
120
 
 
121
static char version[] =
 
122
"Olympic.c v1.0.5 6/04/02 - Peter De Schrijver & Mike Phillips" ; 
 
123
 
 
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",
 
128
                                   "Unknown stage"};
 
129
 
 
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"};
 
135
 
 
136
/* Module parameters */
 
137
 
 
138
MODULE_AUTHOR("Mike Phillips <mikep@linuxtr.net>") ; 
 
139
MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ; 
 
140
 
 
141
/* Ring Speed 0,4,16,100 
 
142
 * 0 = Autosense         
 
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.
 
149
 *
 
150
 * WARNING: Some hubs will allow you to insert
 
151
 * at the wrong speed
 
152
 */
 
153
 
 
154
static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ;
 
155
module_param_array(ringspeed, int, NULL, 0);
 
156
 
 
157
/* Packet buffer size */
 
158
 
 
159
static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ;
 
160
module_param_array(pkt_buf_sz, int, NULL, 0) ;
 
161
 
 
162
/* Message Level */
 
163
 
 
164
static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ; 
 
165
module_param_array(message_level, int, NULL, 0) ;
 
166
 
 
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 
 
172
 */
 
173
static int network_monitor[OLYMPIC_MAX_ADAPTERS] = {0,};
 
174
module_param_array(network_monitor, int, NULL, 0);
 
175
 
 
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 */
 
179
};
 
180
MODULE_DEVICE_TABLE(pci,olympic_pci_tbl) ; 
 
181
 
 
182
 
 
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;
 
198
 
 
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,
 
206
};
 
207
 
 
208
static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
209
{
 
210
        struct net_device *dev ; 
 
211
        struct olympic_private *olympic_priv;
 
212
        static int card_no = -1 ;
 
213
        int i ; 
 
214
 
 
215
        card_no++ ; 
 
216
 
 
217
        if ((i = pci_enable_device(pdev))) {
 
218
                return i ; 
 
219
        }
 
220
 
 
221
        pci_set_master(pdev);
 
222
 
 
223
        if ((i = pci_request_regions(pdev,"olympic"))) { 
 
224
                goto op_disable_dev;
 
225
        }
 
226
 
 
227
        dev = alloc_trdev(sizeof(struct olympic_private)) ; 
 
228
        if (!dev) {
 
229
                i = -ENOMEM; 
 
230
                goto op_release_dev;
 
231
        }
 
232
 
 
233
        olympic_priv = netdev_priv(dev) ;
 
234
        
 
235
        spin_lock_init(&olympic_priv->olympic_lock) ; 
 
236
 
 
237
        init_waitqueue_head(&olympic_priv->srb_wait);
 
238
        init_waitqueue_head(&olympic_priv->trb_wait);
 
239
#if OLYMPIC_DEBUG  
 
240
        printk(KERN_INFO "pci_device: %p, dev:%p, dev->priv: %p\n", pdev, dev, netdev_priv(dev));
 
241
#endif
 
242
        dev->irq=pdev->irq;
 
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) {
 
249
                goto op_free_iomap;
 
250
        }
 
251
                                
 
252
        if ((pkt_buf_sz[card_no] < 100) || (pkt_buf_sz[card_no] > 18000) )
 
253
                olympic_priv->pkt_buf_sz = PKT_BUF_SZ ; 
 
254
        else
 
255
                olympic_priv->pkt_buf_sz = pkt_buf_sz[card_no] ; 
 
256
 
 
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];
 
261
        
 
262
        if ((i = olympic_init(dev))) {
 
263
                goto op_free_iomap;
 
264
        }                               
 
265
 
 
266
        dev->netdev_ops = &olympic_netdev_ops;
 
267
        SET_NETDEV_DEV(dev, &pdev->dev);
 
268
 
 
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 */ 
 
273
                char proc_name[20] ; 
 
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); 
 
278
        }
 
279
        return  0 ;
 
280
 
 
281
op_free_iomap:
 
282
        if (olympic_priv->olympic_mmio)
 
283
                iounmap(olympic_priv->olympic_mmio); 
 
284
        if (olympic_priv->olympic_lap)
 
285
                iounmap(olympic_priv->olympic_lap);
 
286
 
 
287
        free_netdev(dev);
 
288
op_release_dev:
 
289
        pci_release_regions(pdev); 
 
290
 
 
291
op_disable_dev:
 
292
        pci_disable_device(pdev);
 
293
        return i;
 
294
}
 
295
 
 
296
static int olympic_init(struct net_device *dev)
 
297
{
 
298
        struct olympic_private *olympic_priv;
 
299
        u8 __iomem *olympic_mmio, *init_srb,*adapter_addr;
 
300
        unsigned long t; 
 
301
        unsigned int uaa_addr;
 
302
 
 
303
        olympic_priv=netdev_priv(dev);
 
304
        olympic_mmio=olympic_priv->olympic_mmio;
 
305
 
 
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);
 
308
 
 
309
        writel(readl(olympic_mmio+BCTL) | BCTL_SOFTRESET,olympic_mmio+BCTL);
 
310
        t=jiffies;
 
311
        while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
 
312
                schedule();             
 
313
                if(time_after(jiffies, t + 40*HZ)) {
 
314
                        printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
 
315
                        return -ENODEV;
 
316
                }
 
317
        }
 
318
 
 
319
 
 
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);
 
323
        }
 
324
        
 
325
#if OLYMPIC_DEBUG
 
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));
 
329
#endif
 
330
        /* Aaaahhh, You have got to be real careful setting GPR, the card
 
331
           holds the previous values from flash memory, including autosense 
 
332
           and ring speed */
 
333
 
 
334
        writel(readl(olympic_mmio+BCTL)|BCTL_MIMREB,olympic_mmio+BCTL);
 
335
        
 
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);
 
348
        } 
 
349
        
 
350
        writew(readw(olympic_mmio+GPR)|GPR_NEPTUNE_BF,olympic_mmio+GPR);
 
351
 
 
352
#if OLYMPIC_DEBUG
 
353
        printk("GPR = %x\n",readw(olympic_mmio + GPR) ) ; 
 
354
#endif
 
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.
 
359
         */
 
360
 
 
361
        if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) { 
 
362
                t=jiffies;
 
363
                while (!(readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE)) {
 
364
                        schedule() ; 
 
365
                        if(time_after(jiffies, t + 2*HZ)) {
 
366
                                printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; 
 
367
                                return -ENODEV;
 
368
                        }
 
369
                }
 
370
                writel(readl(olympic_mmio+CLKCTL) & ~CLKCTL_PAUSE, olympic_mmio+CLKCTL) ; 
 
371
        }
 
372
        
 
373
        /* start solo init */
 
374
        writel((1<<15),olympic_mmio+SISR_MASK_SUM);
 
375
 
 
376
        t=jiffies;
 
377
        while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
 
378
                schedule();             
 
379
                if(time_after(jiffies, t + 15*HZ)) {
 
380
                        printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
 
381
                        return -ENODEV;
 
382
                }
 
383
        }
 
384
        
 
385
        writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
 
386
 
 
387
#if OLYMPIC_DEBUG
 
388
        printk("LAPWWO: %x, LAPA: %x\n",readl(olympic_mmio+LAPWWO), readl(olympic_mmio+LAPA));
 
389
#endif
 
390
 
 
391
        init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
 
392
 
 
393
#if OLYMPIC_DEBUG               
 
394
{
 
395
        int i;
 
396
        printk("init_srb(%p): ",init_srb);
 
397
        for(i=0;i<20;i++)
 
398
                printk("%x ",readb(init_srb+i));
 
399
        printk("\n");
 
400
}
 
401
#endif  
 
402
        if(readw(init_srb+6)) {
 
403
                printk(KERN_INFO "tokenring card initialization failed. errorcode : %x\n",readw(init_srb+6));
 
404
                return -ENODEV;
 
405
        }
 
406
 
 
407
        if (olympic_priv->olympic_message_level) {
 
408
                if ( readb(init_srb +2) & 0x40) { 
 
409
                        printk(KERN_INFO "Olympic: Adapter is FDX capable.\n") ;
 
410
                } else { 
 
411
                        printk(KERN_INFO "Olympic: Adapter cannot do FDX.\n");
 
412
                }
 
413
        }
 
414
  
 
415
        uaa_addr=swab16(readw(init_srb+8));
 
416
 
 
417
#if OLYMPIC_DEBUG
 
418
        printk("UAA resides at %x\n",uaa_addr);
 
419
#endif
 
420
 
 
421
        writel(uaa_addr,olympic_mmio+LAPA);
 
422
        adapter_addr=olympic_priv->olympic_lap + (uaa_addr & (~0xf800));
 
423
 
 
424
        memcpy_fromio(&dev->dev_addr[0], adapter_addr,6);
 
425
 
 
426
#if OLYMPIC_DEBUG
 
427
        printk("adapter address: %pM\n", dev->dev_addr);
 
428
#endif
 
429
 
 
430
        olympic_priv->olympic_addr_table_addr = swab16(readw(init_srb + 12)); 
 
431
        olympic_priv->olympic_parms_addr = swab16(readw(init_srb + 14)); 
 
432
 
 
433
        return 0;
 
434
 
 
435
}
 
436
 
 
437
static int olympic_open(struct net_device *dev)
 
438
{
 
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 ;
 
443
        u8 resp, err;
 
444
 
 
445
        DECLARE_WAITQUEUE(wait,current) ; 
 
446
 
 
447
        olympic_init(dev);
 
448
 
 
449
        if (request_irq(dev->irq, olympic_interrupt, IRQF_SHARED , "olympic",
 
450
                        dev))
 
451
                return -EAGAIN;
 
452
 
 
453
#if OLYMPIC_DEBUG
 
454
        printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
 
455
        printk("pending ints: %x\n",readl(olympic_mmio+SISR_RR));
 
456
#endif
 
457
 
 
458
        writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
 
459
 
 
460
        writel(SISR_MI | SISR_SRB_REPLY, olympic_mmio+SISR_MASK); /* more ints later, doesn't stop arb cmd interrupt */
 
461
 
 
462
        writel(LISR_LIE,olympic_mmio+LISR); /* more ints later */
 
463
 
 
464
        /* adapter is closed, so SRB is pointed to by LAPWWO */
 
465
 
 
466
        writel(readw(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
 
467
        init_srb=olympic_priv->olympic_lap + ((readw(olympic_mmio+LAPWWO)) & (~0xf800));
 
468
        
 
469
#if OLYMPIC_DEBUG
 
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");
 
473
#endif  
 
474
        do {
 
475
                memset_io(init_srb,0,SRB_COMMAND_SIZE);
 
476
 
 
477
                writeb(SRB_OPEN_ADAPTER,init_srb) ;     /* open */
 
478
                writeb(OLYMPIC_CLEAR_RET_CODE,init_srb+2);
 
479
 
 
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);
 
483
                else
 
484
                        writew(swab16(OPEN_ADAPTER_ENABLE_FDX), init_srb+8);
 
485
        
 
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  */
 
489
 
 
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) ;  
 
498
                }       
 
499
                writeb(1,init_srb+30);
 
500
 
 
501
                spin_lock_irqsave(&olympic_priv->olympic_lock,flags);   
 
502
                olympic_priv->srb_queued=1;
 
503
 
 
504
                writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
505
                spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
 
506
 
 
507
                t = jiffies ; 
 
508
        
 
509
                add_wait_queue(&olympic_priv->srb_wait,&wait) ;
 
510
                set_current_state(TASK_INTERRUPTIBLE) ; 
 
511
 
 
512
                while(olympic_priv->srb_queued) {        
 
513
                        schedule() ; 
 
514
                        if(signal_pending(current))     {            
 
515
                                printk(KERN_WARNING "%s: Signal received in open.\n",
 
516
                                        dev->name);
 
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;
 
521
                                break;
 
522
                        }
 
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;
 
526
                                break ; 
 
527
                        } 
 
528
                        set_current_state(TASK_INTERRUPTIBLE) ; 
 
529
                }
 
530
                remove_wait_queue(&olympic_priv->srb_wait,&wait) ; 
 
531
                set_current_state(TASK_RUNNING) ; 
 
532
                olympic_priv->srb_queued = 0 ; 
 
533
#if OLYMPIC_DEBUG
 
534
                printk("init_srb(%p): ",init_srb);
 
535
                for(i=0;i<20;i++)
 
536
                        printk("%02x ",readb(init_srb+i));
 
537
                printk("\n");
 
538
#endif
 
539
                
 
540
                /* If we get the same return response as we set, the interrupt wasn't raised and the open
 
541
                 * timed out.
 
542
                 */
 
543
 
 
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) ; 
 
547
                        goto out;
 
548
                case 0:
 
549
                        open_finished = 1;
 
550
                        break;
 
551
                case 0x07:
 
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);
 
554
                                open_finished = 0 ;  
 
555
                                continue;
 
556
                        }
 
557
 
 
558
                        err = readb(init_srb+7);
 
559
 
 
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);
 
563
                        } else {
 
564
                                printk(KERN_WARNING "%s: %s - %s\n", dev->name,
 
565
                                        open_maj_error[(err & 0xf0) >> 4],
 
566
                                        open_min_error[(err & 0x0f)]);
 
567
                        }
 
568
                        goto out;
 
569
 
 
570
                case 0x32:
 
571
                        printk(KERN_WARNING "%s: Invalid LAA: %pM\n",
 
572
                               dev->name, olympic_priv->olympic_laa);
 
573
                        goto out;
 
574
 
 
575
                default:
 
576
                        printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name, resp);
 
577
                        goto out;
 
578
 
 
579
                }
 
580
        } while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */   
 
581
 
 
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);
 
585
 
 
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 ; 
 
590
        else
 
591
                olympic_priv->olympic_ring_speed = 4 ; 
 
592
 
 
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);
 
595
 
 
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));
 
600
 
 
601
        olympic_priv->olympic_receive_options = 0x01 ; 
 
602
        olympic_priv->olympic_copy_all_options = 0 ; 
 
603
        
 
604
        /* setup rx ring */
 
605
        
 
606
        writel((3<<16),olympic_mmio+BMCTL_RWM); /* Ensure end of frame generated interrupts */ 
 
607
 
 
608
        writel(BMCTL_RX_DIS|3,olympic_mmio+BMCTL_RWM); /* Yes, this the enables RX channel */
 
609
 
 
610
        for(i=0;i<OLYMPIC_RX_RING_SIZE;i++) {
 
611
 
 
612
                struct sk_buff *skb;
 
613
                
 
614
                skb=dev_alloc_skb(olympic_priv->pkt_buf_sz);
 
615
                if(skb == NULL)
 
616
                        break;
 
617
 
 
618
                skb->dev = dev;
 
619
 
 
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;
 
624
        }
 
625
 
 
626
        if (i==0) {
 
627
                printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
 
628
                goto out;
 
629
        }
 
630
 
 
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);
 
636
                
 
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);
 
641
        
 
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;  
 
644
 
 
645
        writew(i, olympic_mmio+RXSTATQCNT);
 
646
 
 
647
#if OLYMPIC_DEBUG 
 
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])  );
 
653
 
 
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) ; 
 
657
#endif
 
658
 
 
659
        writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) | i,olympic_mmio+RXENQ);
 
660
 
 
661
#if OLYMPIC_DEBUG 
 
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]);
 
665
#endif 
 
666
 
 
667
        writel(SISR_RX_STATUS | SISR_RX_NOBUF,olympic_mmio+SISR_MASK_SUM);
 
668
 
 
669
        /* setup tx ring */
 
670
 
 
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);
 
674
 
 
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);
 
681
        
 
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);
 
687
                
 
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 */
 
690
 
 
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);
 
695
 
 
696
#if OLYMPIC_DEBUG 
 
697
        printk("BMCTL: %x\n",readl(olympic_mmio+BMCTL_SUM));
 
698
        printk("SISR MASK: %x\n",readl(olympic_mmio+SISR_MASK));
 
699
#endif
 
700
 
 
701
        if (olympic_priv->olympic_network_monitor) { 
 
702
                u8 __iomem *oat;
 
703
                u8 __iomem *opt;
 
704
                u8 addr[6];
 
705
                oat = (olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr);
 
706
                opt = (olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr);
 
707
 
 
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));
 
716
 
 
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);
 
720
        }
 
721
        
 
722
        netif_start_queue(dev);
 
723
        return 0;
 
724
 
 
725
out:
 
726
        free_irq(dev->irq, dev);
 
727
        return -EIO;
 
728
}       
 
729
 
 
730
/*
 
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
 
734
 *      all the frames.
 
735
 *
 
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.
 
739
 *
 
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. 
 
743
 *      
 
744
 */
 
745
static void olympic_rx(struct net_device *dev)
 
746
{
 
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;
 
753
        int i;
 
754
 
 
755
        rx_status=&(olympic_priv->olympic_rx_status_ring[(olympic_priv->rx_status_last_received + 1) & (OLYMPIC_RX_RING_SIZE - 1)]) ; 
 
756
 
 
757
        while (rx_status->status_buffercnt) { 
 
758
                u32 l_status_buffercnt;
 
759
 
 
760
                olympic_priv->rx_status_last_received++ ;
 
761
                olympic_priv->rx_status_last_received &= (OLYMPIC_RX_RING_SIZE -1);
 
762
#if OLYMPIC_DEBUG
 
763
                printk("rx status: %x rx len: %x\n", le32_to_cpu(rx_status->status_buffercnt), le32_to_cpu(rx_status->fragmentcnt_framelen));
 
764
#endif
 
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; 
 
769
 
 
770
#if OLYMPIC_DEBUG 
 
771
                printk("length: %x, frag_len: %x, buffer_cnt: %x\n", length, frag_len, buffer_cnt);
 
772
#endif
 
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);
 
787
                                } 
 
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++;
 
791
                        } else {        
 
792
                        
 
793
                                if (buffer_cnt == 1) {
 
794
                                        skb = dev_alloc_skb(max_t(int, olympic_priv->pkt_buf_sz,length)) ; 
 
795
                                } else {
 
796
                                        skb = dev_alloc_skb(length) ; 
 
797
                                }
 
798
 
 
799
                                if (skb == NULL) {
 
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) ;  
 
805
                                } else  {
 
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. */
 
813
                                
 
814
                                        if (buffer_cnt==1) {
 
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 ;
 
818
                                                if (length > 1500) { 
 
819
                                                        skb2=olympic_priv->rx_ring_skb[rx_ring_last_received] ; 
 
820
                                                        /* unmap buffer */
 
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 ; 
 
832
                                                        netif_rx(skb2) ; 
 
833
                                                } else { 
 
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),
 
839
                                                                      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) ; 
 
844
                                                        netif_rx(skb) ; 
 
845
                                                } 
 
846
                                        } else {
 
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),
 
858
                                                                      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) ;
 
862
                                                } while (--i) ; 
 
863
                                                skb_trim(skb,skb->len-4) ; 
 
864
                                                skb->protocol = tr_type_trans(skb,dev);
 
865
                                                netif_rx(skb) ; 
 
866
                                        } 
 
867
                                        dev->stats.rx_packets++ ;
 
868
                                        dev->stats.rx_bytes += length ;
 
869
                                } /* if skb == null */
 
870
                        } /* If status & 0x3b */
 
871
 
 
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) ; 
 
875
                } 
 
876
 
 
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) ]);
 
880
 
 
881
                writew((((readw(olympic_mmio+RXENQ)) & 0x8000) ^ 0x8000) |  buffer_cnt , olympic_mmio+RXENQ); 
 
882
        } /* while */
 
883
 
 
884
}
 
885
 
 
886
static void olympic_freemem(struct net_device *dev) 
 
887
 
888
        struct olympic_private *olympic_priv=netdev_priv(dev);
 
889
        int i;
 
890
                        
 
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;
 
895
                }
 
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);
 
900
                }
 
901
                olympic_priv->rx_status_last_received++;
 
902
                olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
 
903
        }
 
904
        /* unmap rings */
 
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);
 
909
 
 
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);
 
914
 
 
915
        return ; 
 
916
}
 
917
 
 
918
static irqreturn_t olympic_interrupt(int irq, void *dev_id) 
 
919
{
 
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;
 
923
        u32 sisr;
 
924
        u8 __iomem *adapter_check_area ; 
 
925
        
 
926
        /* 
 
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. 
 
930
         */ 
 
931
        sisr=readl(olympic_mmio+SISR) ; 
 
932
        if (!(sisr & SISR_MI)) /* Interrupt isn't for us */ 
 
933
                return IRQ_NONE;
 
934
        sisr=readl(olympic_mmio+SISR_RR) ;  /* Read & Reset sisr */ 
 
935
 
 
936
        spin_lock(&olympic_priv->olympic_lock);
 
937
 
 
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) ; 
 
942
                return IRQ_NONE;
 
943
        } 
 
944
                
 
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)) {  
 
947
        
 
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) ; 
 
957
                        return IRQ_HANDLED;
 
958
                } /* SISR_ERR */
 
959
 
 
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) ; 
 
965
                        }
 
966
                        olympic_priv->srb_queued=0;
 
967
                } /* SISR_SRB_REPLY */
 
968
 
 
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;
 
984
                        }
 
985
                        netif_wake_queue(dev);
 
986
                } /* SISR_TX1_EOF */
 
987
        
 
988
                if (sisr & SISR_RX_STATUS) {
 
989
                        olympic_rx(dev);
 
990
                } /* SISR_RX_STATUS */
 
991
        
 
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) ; 
 
999
                        return IRQ_HANDLED; 
 
1000
                } /* SISR_ADAPTER_CHECK */
 
1001
        
 
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) ; 
 
1006
                        }
 
1007
                } /* SISR_ASB_FREE */
 
1008
        
 
1009
                if (sisr & SISR_ARB_CMD) {
 
1010
                        olympic_arb_cmd(dev) ; 
 
1011
                } /* SISR_ARB_CMD */
 
1012
        
 
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);
 
1017
                        }
 
1018
                        olympic_priv->trb_queued = 0 ; 
 
1019
                } /* SISR_TRB_REPLY */  
 
1020
        
 
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 */
 
1025
        } else { 
 
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);
 
1030
        
 
1031
        spin_unlock(&olympic_priv->olympic_lock) ; 
 
1032
        return IRQ_HANDLED;
 
1033
}       
 
1034
 
 
1035
static netdev_tx_t olympic_xmit(struct sk_buff *skb,
 
1036
                                      struct net_device *dev)
 
1037
{
 
1038
        struct olympic_private *olympic_priv=netdev_priv(dev);
 
1039
        u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio;
 
1040
        unsigned long flags ; 
 
1041
 
 
1042
        spin_lock_irqsave(&olympic_priv->olympic_lock, flags);
 
1043
 
 
1044
        netif_stop_queue(dev);
 
1045
        
 
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--;
 
1052
 
 
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;
 
1059
        } else {
 
1060
                spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
 
1061
                return NETDEV_TX_BUSY;
 
1062
        } 
 
1063
 
 
1064
}
 
1065
        
 
1066
 
 
1067
static int olympic_close(struct net_device *dev) 
 
1068
{
 
1069
        struct olympic_private *olympic_priv=netdev_priv(dev);
 
1070
        u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*srb;
 
1071
        unsigned long t,flags;
 
1072
 
 
1073
        DECLARE_WAITQUEUE(wait,current) ; 
 
1074
 
 
1075
        netif_stop_queue(dev);
 
1076
        
 
1077
        writel(olympic_priv->srb,olympic_mmio+LAPA);
 
1078
        srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
 
1079
        
 
1080
        writeb(SRB_CLOSE_ADAPTER,srb+0);
 
1081
        writeb(0,srb+1);
 
1082
        writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
 
1083
 
 
1084
        add_wait_queue(&olympic_priv->srb_wait,&wait) ;
 
1085
        set_current_state(TASK_INTERRUPTIBLE) ; 
 
1086
 
 
1087
        spin_lock_irqsave(&olympic_priv->olympic_lock,flags);
 
1088
        olympic_priv->srb_queued=1;
 
1089
 
 
1090
        writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
1091
        spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
 
1092
 
 
1093
        while(olympic_priv->srb_queued) {
 
1094
 
 
1095
                t = schedule_timeout_interruptible(60*HZ);
 
1096
 
 
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;
 
1101
                        break;
 
1102
                }
 
1103
 
 
1104
                if (t == 0) { 
 
1105
                        printk(KERN_WARNING "%s: SRB timed out. May not be fatal.\n",dev->name);
 
1106
                } 
 
1107
                olympic_priv->srb_queued=0;
 
1108
        }
 
1109
        remove_wait_queue(&olympic_priv->srb_wait,&wait) ; 
 
1110
 
 
1111
        olympic_priv->rx_status_last_received++;
 
1112
        olympic_priv->rx_status_last_received&=OLYMPIC_RX_RING_SIZE-1;
 
1113
 
 
1114
        olympic_freemem(dev) ;  
 
1115
 
 
1116
        /* reset tx/rx fifo's and busmaster logic */
 
1117
 
 
1118
        writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
 
1119
        udelay(1);
 
1120
        writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
 
1121
 
 
1122
#if OLYMPIC_DEBUG
 
1123
        {
 
1124
        int i ; 
 
1125
        printk("srb(%p): ",srb);
 
1126
        for(i=0;i<4;i++)
 
1127
                printk("%x ",readb(srb+i));
 
1128
        printk("\n");
 
1129
        }
 
1130
#endif
 
1131
        free_irq(dev->irq,dev);
 
1132
 
 
1133
        return 0;
 
1134
        
 
1135
}
 
1136
 
 
1137
static void olympic_set_rx_mode(struct net_device *dev) 
 
1138
{
 
1139
        struct olympic_private *olympic_priv = netdev_priv(dev);
 
1140
        u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ; 
 
1141
        u8 options = 0; 
 
1142
        u8 __iomem *srb;
 
1143
        struct netdev_hw_addr *ha;
 
1144
        unsigned char dev_mc_address[4] ; 
 
1145
 
 
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; 
 
1149
 
 
1150
        if (dev->flags&IFF_PROMISC)  
 
1151
                options |= 0x61 ;
 
1152
        else
 
1153
                options &= ~0x61 ; 
 
1154
 
 
1155
        /* Only issue the srb if there is a change in options */
 
1156
 
 
1157
        if ((options ^ olympic_priv->olympic_copy_all_options)) { 
 
1158
        
 
1159
                /* Now to issue the srb command to alter the copy.all.options */
 
1160
        
 
1161
                writeb(SRB_MODIFY_RECEIVE_OPTIONS,srb);
 
1162
                writeb(0,srb+1);
 
1163
                writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
 
1164
                writeb(0,srb+3);
 
1165
                writeb(olympic_priv->olympic_receive_options,srb+4);
 
1166
                writeb(options,srb+5);
 
1167
 
 
1168
                olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
 
1169
 
 
1170
                writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
1171
 
 
1172
                olympic_priv->olympic_copy_all_options = options ;
 
1173
                
 
1174
                return ;  
 
1175
        } 
 
1176
 
 
1177
        /* Set the functional addresses we need for multicast */
 
1178
 
 
1179
        dev_mc_address[0] = dev_mc_address[1] = dev_mc_address[2] = dev_mc_address[3] = 0 ; 
 
1180
 
 
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];
 
1186
        }
 
1187
 
 
1188
        writeb(SRB_SET_FUNC_ADDRESS,srb+0);
 
1189
        writeb(0,srb+1);
 
1190
        writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
 
1191
        writeb(0,srb+3);
 
1192
        writeb(0,srb+4);
 
1193
        writeb(0,srb+5);
 
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);
 
1198
 
 
1199
        olympic_priv->srb_queued = 2 ;
 
1200
        writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
1201
 
 
1202
}
 
1203
 
 
1204
static void olympic_srb_bh(struct net_device *dev) 
 
1205
 
1206
        struct olympic_private *olympic_priv = netdev_priv(dev);
 
1207
        u8 __iomem *olympic_mmio = olympic_priv->olympic_mmio ; 
 
1208
        u8 __iomem *srb;
 
1209
 
 
1210
        writel(olympic_priv->srb,olympic_mmio+LAPA);
 
1211
        srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
 
1212
 
 
1213
        switch (readb(srb)) { 
 
1214
 
 
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
 
1218
                 */
 
1219
 
 
1220
                case SRB_MODIFY_RECEIVE_OPTIONS:
 
1221
                        switch (readb(srb+2)) { 
 
1222
                                case 0x01:
 
1223
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name) ; 
 
1224
                                        break ; 
 
1225
                                case 0x04:
 
1226
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name);
 
1227
                                        break ; 
 
1228
                                default:
 
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) ; 
 
1231
                                        break ;         
 
1232
                        } /* switch srb[2] */ 
 
1233
                        break ;
 
1234
                
 
1235
                /* SRB_SET_GROUP_ADDRESS - Multicast group setting 
 
1236
                 */
 
1237
 
 
1238
                case SRB_SET_GROUP_ADDRESS:
 
1239
                        switch (readb(srb+2)) { 
 
1240
                                case 0x00:
 
1241
                                        break ; 
 
1242
                                case 0x01:
 
1243
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
 
1244
                                        break ;
 
1245
                                case 0x04:
 
1246
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name); 
 
1247
                                        break ;
 
1248
                                case 0x3c:
 
1249
                                        printk(KERN_WARNING "%s: Group/Functional address indicator bits not set correctly\n",dev->name) ; 
 
1250
                                        break ;
 
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) ; 
 
1253
                                        break ;  
 
1254
                                case 0x55:
 
1255
                                        printk(KERN_INFO "%s: Group Address already set.\n",dev->name) ; 
 
1256
                                        break ;
 
1257
                                default:
 
1258
                                        break ; 
 
1259
                        } /* switch srb[2] */ 
 
1260
                        break ; 
 
1261
 
 
1262
                /* SRB_RESET_GROUP_ADDRESS - Remove a multicast address from group list
 
1263
                 */
 
1264
 
 
1265
                case SRB_RESET_GROUP_ADDRESS:
 
1266
                        switch (readb(srb+2)) { 
 
1267
                                case 0x00:
 
1268
                                        break ; 
 
1269
                                case 0x01:
 
1270
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
 
1271
                                        break ; 
 
1272
                                case 0x04:
 
1273
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
 
1274
                                        break ; 
 
1275
                                case 0x39: /* Must deal with this if individual multicast addresses used */
 
1276
                                        printk(KERN_INFO "%s: Group address not found\n",dev->name);
 
1277
                                        break ;
 
1278
                                default:
 
1279
                                        break ; 
 
1280
                        } /* switch srb[2] */
 
1281
                        break ; 
 
1282
 
 
1283
                
 
1284
                /* SRB_SET_FUNC_ADDRESS - Called by the set_rx_mode 
 
1285
                 */
 
1286
 
 
1287
                case SRB_SET_FUNC_ADDRESS:
 
1288
                        switch (readb(srb+2)) { 
 
1289
                                case 0x00:
 
1290
                                        if (olympic_priv->olympic_message_level)
 
1291
                                                printk(KERN_INFO "%s: Functional Address Mask Set\n",dev->name);
 
1292
                                        break ;
 
1293
                                case 0x01:
 
1294
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
 
1295
                                        break ; 
 
1296
                                case 0x04:
 
1297
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
 
1298
                                        break ; 
 
1299
                                default:
 
1300
                                        break ; 
 
1301
                        } /* switch srb[2] */
 
1302
                        break ; 
 
1303
        
 
1304
                /* SRB_READ_LOG - Read and reset the adapter error counters
 
1305
                 */
 
1306
 
 
1307
                case SRB_READ_LOG:
 
1308
                        switch (readb(srb+2)) { 
 
1309
                                case 0x00: 
 
1310
                                        if (olympic_priv->olympic_message_level) 
 
1311
                                                printk(KERN_INFO "%s: Read Log issued\n",dev->name) ; 
 
1312
                                        break ; 
 
1313
                                case 0x01:
 
1314
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
 
1315
                                        break ; 
 
1316
                                case 0x04:
 
1317
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
 
1318
                                        break ; 
 
1319
                        
 
1320
                        } /* switch srb[2] */
 
1321
                        break ; 
 
1322
                
 
1323
                /* SRB_READ_SR_COUNTERS - Read and reset the source routing bridge related counters */
 
1324
 
 
1325
                case SRB_READ_SR_COUNTERS:
 
1326
                        switch (readb(srb+2)) { 
 
1327
                                case 0x00: 
 
1328
                                        if (olympic_priv->olympic_message_level) 
 
1329
                                                printk(KERN_INFO "%s: Read Source Routing Counters issued\n",dev->name) ; 
 
1330
                                        break ; 
 
1331
                                case 0x01:
 
1332
                                        printk(KERN_WARNING "%s: Unrecognized srb command\n",dev->name);
 
1333
                                        break ; 
 
1334
                                case 0x04:
 
1335
                                        printk(KERN_WARNING "%s: Adapter must be open for this operation, doh!!\n",dev->name) ; 
 
1336
                                        break ; 
 
1337
                                default:
 
1338
                                        break ; 
 
1339
                        } /* switch srb[2] */
 
1340
                        break ;
 
1341
 
 
1342
                default:
 
1343
                        printk(KERN_WARNING "%s: Unrecognized srb bh return value.\n",dev->name);
 
1344
                        break ; 
 
1345
        } /* switch srb[0] */
 
1346
 
 
1347
 
1348
 
 
1349
static int olympic_set_mac_address (struct net_device *dev, void *addr) 
 
1350
{
 
1351
        struct sockaddr *saddr = addr ; 
 
1352
        struct olympic_private *olympic_priv = netdev_priv(dev);
 
1353
 
 
1354
        if (netif_running(dev)) { 
 
1355
                printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ; 
 
1356
                return -EIO ; 
 
1357
        }
 
1358
 
 
1359
        memcpy(olympic_priv->olympic_laa, saddr->sa_data,dev->addr_len) ; 
 
1360
        
 
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]);
 
1366
        } 
 
1367
 
 
1368
        return 0 ; 
 
1369
}
 
1370
 
 
1371
static void olympic_arb_cmd(struct net_device *dev)
 
1372
{
 
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  ; 
 
1376
        u8 header_len ; 
 
1377
        u16 frame_len, buffer_len ;
 
1378
        struct sk_buff *mac_frame ;  
 
1379
        u8 __iomem *buf_ptr ;
 
1380
        u8 __iomem *frame_data ;  
 
1381
        u16 buff_off ; 
 
1382
        u16 lan_status = 0, lan_status_diff  ; /* Initialize to stop compiler warning */
 
1383
        u8 fdx_prot_error ; 
 
1384
        u16 next_ptr;
 
1385
 
 
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) ; 
 
1389
        
 
1390
        if (readb(arb_block+0) == ARB_RECEIVE_DATA) { /* Receive.data, MAC frames */
 
1391
 
 
1392
                header_len = readb(arb_block+8) ; /* 802.5 Token-Ring Header Length */  
 
1393
                frame_len = swab16(readw(arb_block + 10)) ; 
 
1394
 
 
1395
                buff_off = swab16(readw(arb_block + 6)) ;
 
1396
                
 
1397
                buf_ptr = olympic_priv->olympic_lap + buff_off ; 
 
1398
 
 
1399
#if OLYMPIC_DEBUG
 
1400
{
 
1401
                int i;
 
1402
                frame_data = buf_ptr+offsetof(struct mac_receive_buffer,frame_data) ; 
 
1403
 
 
1404
                for (i=0 ;  i < 14 ; i++) { 
 
1405
                        printk("Loc %d = %02x\n",i,readb(frame_data + i)); 
 
1406
                }
 
1407
 
 
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)));
 
1409
}
 
1410
#endif 
 
1411
                mac_frame = dev_alloc_skb(frame_len) ; 
 
1412
                if (!mac_frame) {
 
1413
                        printk(KERN_WARNING "%s: Memory squeeze, dropping frame.\n", dev->name);
 
1414
                        goto drop_frame;
 
1415
                }
 
1416
 
 
1417
                /* Walk the buffer chain, creating the frame */
 
1418
 
 
1419
                do {
 
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)));
 
1425
 
 
1426
                mac_frame->protocol = tr_type_trans(mac_frame, dev);
 
1427
 
 
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);
 
1436
                }
 
1437
                netif_rx(mac_frame);
 
1438
 
 
1439
drop_frame:
 
1440
                /* Now tell the card we have dealt with the received frame */
 
1441
 
 
1442
                /* Set LISR Bit 1 */
 
1443
                writel(LISR_ARB_FREE,olympic_priv->olympic_mmio + LISR_SUM);
 
1444
 
 
1445
                /* Is the ASB free ? */         
 
1446
                
 
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); 
 
1450
                        return ;        
 
1451
                        /* Drop out and wait for the bottom half to be run */
 
1452
                }
 
1453
                
 
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 */                
 
1458
 
 
1459
                writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
 
1460
                
 
1461
                olympic_priv->asb_queued = 2 ; 
 
1462
        
 
1463
                return ;        
 
1464
                
 
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) ; 
 
1468
                
 
1469
                /* Issue ARB Free */
 
1470
                writel(LISR_ARB_FREE,olympic_priv->olympic_mmio+LISR_SUM);
 
1471
 
 
1472
                lan_status_diff = olympic_priv->olympic_lan_status ^ lan_status ; 
 
1473
 
 
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);
 
1483
                
 
1484
                        /* Adapter has been closed by the hardware */
 
1485
                
 
1486
                        /* reset tx/rx fifo's and busmaster logic */
 
1487
 
 
1488
                        writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
 
1489
                        udelay(1);
 
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 */
 
1495
                
 
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);
 
1511
                }       
 
1512
                
 
1513
                if (lan_status_diff & LSC_CO) { 
 
1514
                                        
 
1515
                                if (olympic_priv->olympic_message_level) 
 
1516
                                        printk(KERN_INFO "%s: Counter Overflow\n", dev->name);
 
1517
                                        
 
1518
                                /* Issue READ.LOG command */
 
1519
 
 
1520
                                writeb(SRB_READ_LOG, srb);
 
1521
                                writeb(0,srb+1);
 
1522
                                writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
 
1523
                                writeb(0,srb+3);
 
1524
                                writeb(0,srb+4);
 
1525
                                writeb(0,srb+5);
 
1526
                                        
 
1527
                                olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
 
1528
 
 
1529
                                writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
1530
                                        
 
1531
                }
 
1532
 
 
1533
                if (lan_status_diff & LSC_SR_CO) { 
 
1534
 
 
1535
                                if (olympic_priv->olympic_message_level)
 
1536
                                        printk(KERN_INFO "%s: Source routing counters overflow\n", dev->name);
 
1537
 
 
1538
                                /* Issue a READ.SR.COUNTERS */
 
1539
                                
 
1540
                                writeb(SRB_READ_SR_COUNTERS,srb);
 
1541
                                writeb(0,srb+1);
 
1542
                                writeb(OLYMPIC_CLEAR_RET_CODE,srb+2);
 
1543
                                writeb(0,srb+3);
 
1544
                                
 
1545
                                olympic_priv->srb_queued=2; /* Can't sleep, use srb_bh */
 
1546
 
 
1547
                                writel(LISR_SRB_CMD,olympic_mmio+LISR_SUM);
 
1548
 
 
1549
                }
 
1550
 
 
1551
                olympic_priv->olympic_lan_status = lan_status ; 
 
1552
        
 
1553
        }  /* Lan.change.status */
 
1554
        else
 
1555
                printk(KERN_WARNING "%s: Unknown arb command\n", dev->name);
 
1556
}
 
1557
 
 
1558
static void olympic_asb_bh(struct net_device *dev) 
 
1559
{
 
1560
        struct olympic_private *olympic_priv = netdev_priv(dev);
 
1561
        u8 __iomem *arb_block, *asb_block ; 
 
1562
 
 
1563
        arb_block = (olympic_priv->olympic_lap + olympic_priv->arb) ; 
 
1564
        asb_block = (olympic_priv->olympic_lap + olympic_priv->asb) ; 
 
1565
 
 
1566
        if (olympic_priv->asb_queued == 1) {   /* Dropped through the first time */
 
1567
 
 
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 */                
 
1572
 
 
1573
                writel(LISR_ASB_REPLY | LISR_ASB_FREE_REQ,olympic_priv->olympic_mmio+LISR_SUM);
 
1574
                olympic_priv->asb_queued = 2 ; 
 
1575
 
 
1576
                return ; 
 
1577
        }
 
1578
 
 
1579
        if (olympic_priv->asb_queued == 2) { 
 
1580
                switch (readb(asb_block+2)) {
 
1581
                        case 0x01:
 
1582
                                printk(KERN_WARNING "%s: Unrecognized command code\n", dev->name);
 
1583
                                break ;
 
1584
                        case 0x26:
 
1585
                                printk(KERN_WARNING "%s: Unrecognized buffer address\n", dev->name);
 
1586
                                break ;
 
1587
                        case 0xFF:
 
1588
                                /* Valid response, everything should be ok again */
 
1589
                                break ;
 
1590
                        default:
 
1591
                                printk(KERN_WARNING "%s: Invalid return code in asb\n",dev->name);
 
1592
                                break ;
 
1593
                }
 
1594
        }
 
1595
        olympic_priv->asb_queued = 0 ; 
 
1596
}
 
1597
 
 
1598
static int olympic_change_mtu(struct net_device *dev, int mtu) 
 
1599
{
 
1600
        struct olympic_private *olympic_priv = netdev_priv(dev);
 
1601
        u16 max_mtu ; 
 
1602
 
 
1603
        if (olympic_priv->olympic_ring_speed == 4)
 
1604
                max_mtu = 4500 ; 
 
1605
        else
 
1606
                max_mtu = 18000 ; 
 
1607
        
 
1608
        if (mtu > max_mtu)
 
1609
                return -EINVAL ; 
 
1610
        if (mtu < 100) 
 
1611
                return -EINVAL ; 
 
1612
 
 
1613
        dev->mtu = mtu ; 
 
1614
        olympic_priv->pkt_buf_sz = mtu + TR_HLEN ; 
 
1615
 
 
1616
        return 0 ; 
 
1617
}
 
1618
 
 
1619
static int olympic_proc_show(struct seq_file *m, void *v)
 
1620
{
 
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) ; 
 
1625
        u8 addr[6];
 
1626
        u8 addr2[6];
 
1627
        int i;
 
1628
 
 
1629
        seq_printf(m,
 
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",
 
1632
           dev->name); 
 
1633
 
 
1634
        for (i = 0 ; i < 6 ; i++)
 
1635
                addr[i] = readb(oat+offsetof(struct olympic_adapter_addr_table,node_addr) + i);
 
1636
 
 
1637
        seq_printf(m, "%6s: %pM : %pM : %02x:%02x:%02x:%02x\n",
 
1638
           dev->name,
 
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));
 
1644
         
 
1645
        seq_printf(m, "\n%6s: Token Ring Parameters Table:\n", dev->name);
 
1646
 
 
1647
        seq_printf(m, "%6s: Physical Addr : Up Node Address   : Poll Address      : AccPri : Auth Src : Att Code :\n",
 
1648
          dev->name) ; 
 
1649
 
 
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);
 
1654
 
 
1655
        seq_printf(m, "%6s: %02x:%02x:%02x:%02x   : %pM : %pM : %04x   : %04x     :  %04x    :\n",
 
1656
          dev->name,
 
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),
 
1661
          addr, addr2,
 
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))));
 
1665
 
 
1666
        seq_printf(m, "%6s: Source Address    : Bcn T : Maj. V : Lan St : Lcl Rg : Mon Err : Frame Correl : \n",
 
1667
          dev->name) ; 
 
1668
        
 
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",
 
1672
          dev->name, addr,
 
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))));
 
1679
 
 
1680
        seq_printf(m, "%6s: Beacon Details :  Tx  :  Rx  : NAUN Node Address : NAUN Node Phys : \n",
 
1681
          dev->name) ; 
 
1682
 
 
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",
 
1686
          dev->name,
 
1687
          swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_transmit))),
 
1688
          swab16(readw(opt+offsetof(struct olympic_parameters_table, beacon_receive))),
 
1689
          addr,
 
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));
 
1694
 
 
1695
        return 0;
 
1696
}
 
1697
 
 
1698
static int olympic_proc_open(struct inode *inode, struct file *file)
 
1699
{
 
1700
        return single_open(file, olympic_proc_show, PDE(inode)->data);
 
1701
}
 
1702
 
 
1703
static const struct file_operations olympic_proc_ops = {
 
1704
        .open           = olympic_proc_open,
 
1705
        .read           = seq_read,
 
1706
        .llseek         = seq_lseek,
 
1707
        .release        = single_release,
 
1708
};
 
1709
 
 
1710
static void __devexit olympic_remove_one(struct pci_dev *pdev) 
 
1711
{
 
1712
        struct net_device *dev = pci_get_drvdata(pdev) ; 
 
1713
        struct olympic_private *olympic_priv=netdev_priv(dev);
 
1714
 
 
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);
 
1720
        }
 
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) ;    
 
1726
        free_netdev(dev) ; 
 
1727
}
 
1728
 
 
1729
static struct pci_driver olympic_driver = { 
 
1730
        .name           = "olympic",
 
1731
        .id_table       = olympic_pci_tbl,
 
1732
        .probe          = olympic_probe,
 
1733
        .remove         = __devexit_p(olympic_remove_one),
 
1734
};
 
1735
 
 
1736
static int __init olympic_pci_init(void) 
 
1737
{
 
1738
        return pci_register_driver(&olympic_driver) ;
 
1739
}
 
1740
 
 
1741
static void __exit olympic_pci_cleanup(void)
 
1742
{
 
1743
        pci_unregister_driver(&olympic_driver) ; 
 
1744
}       
 
1745
 
 
1746
 
 
1747
module_init(olympic_pci_init) ; 
 
1748
module_exit(olympic_pci_cleanup) ; 
 
1749
 
 
1750
MODULE_LICENSE("GPL");