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 
olympic_probe(struct pci_dev * pdev,const struct pci_device_id * ent)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 
olympic_init(struct net_device * dev)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 
olympic_open(struct net_device * dev)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  */
olympic_rx(struct net_device * dev)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 
olympic_freemem(struct net_device * dev)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 
olympic_interrupt(int irq,void * dev_id)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 
olympic_xmit(struct sk_buff * skb,struct net_device * dev)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 
olympic_close(struct net_device * dev)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 
olympic_set_rx_mode(struct net_device * dev)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 
olympic_srb_bh(struct net_device * dev)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 
olympic_set_mac_address(struct net_device * dev,void * addr)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 
olympic_arb_cmd(struct net_device * dev)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 
olympic_asb_bh(struct net_device * dev)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 
olympic_change_mtu(struct net_device * dev,int mtu)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 
olympic_proc_show(struct seq_file * m,void * v)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 
olympic_proc_open(struct inode * inode,struct file * file)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 
olympic_remove_one(struct pci_dev * pdev)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 
olympic_pci_init(void)1736 static int __init olympic_pci_init(void)
1737 {
1738 	return pci_register_driver(&olympic_driver) ;
1739 }
1740 
olympic_pci_cleanup(void)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");
1751