1 /* sbni.c:  Granch SBNI12 leased line adapters driver for linux
2  *
3  *	Written 2001 by Denis I.Timofeev (timofeev@granch.ru)
4  *
5  *	Previous versions were written by Yaroslav Polyakov,
6  *	Alexey Zverev and Max Khon.
7  *
8  *	Driver supports SBNI12-02,-04,-05,-10,-11 cards, single and
9  *	double-channel, PCI and ISA modifications.
10  *	More info and useful utilities to work with SBNI12 cards you can find
11  *	at http://www.granch.com (English) or http://www.granch.ru (Russian)
12  *
13  *	This software may be used and distributed according to the terms
14  *	of the GNU General Public License.
15  *
16  *
17  *  5.0.1	Jun 22 2001
18  *	  - Fixed bug in probe
19  *  5.0.0	Jun 06 2001
20  *	  - Driver was completely redesigned by Denis I.Timofeev,
21  *	  - now PCI/Dual, ISA/Dual (with single interrupt line) models are
22  *	  - supported
23  *  3.3.0	Thu Feb 24 21:30:28 NOVT 2000
24  *        - PCI cards support
25  *  3.2.0	Mon Dec 13 22:26:53 NOVT 1999
26  * 	  - Completely rebuilt all the packet storage system
27  * 	  -    to work in Ethernet-like style.
28  *  3.1.1	just fixed some bugs (5 aug 1999)
29  *  3.1.0	added balancing feature	(26 apr 1999)
30  *  3.0.1	just fixed some bugs (14 apr 1999).
31  *  3.0.0	Initial Revision, Yaroslav Polyakov (24 Feb 1999)
32  *        - added pre-calculation for CRC, fixed bug with "len-2" frames,
33  *        - removed outbound fragmentation (MTU=1000), written CRC-calculation
34  *        - on asm, added work with hard_headers and now we have our own cache
35  *        - for them, optionally supported word-interchange on some chipsets,
36  *
37  *	Known problem: this driver wasn't tested on multiprocessor machine.
38  */
39 
40 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
41 
42 #include <linux/module.h>
43 #include <linux/kernel.h>
44 #include <linux/ptrace.h>
45 #include <linux/fcntl.h>
46 #include <linux/ioport.h>
47 #include <linux/interrupt.h>
48 #include <linux/string.h>
49 #include <linux/errno.h>
50 #include <linux/netdevice.h>
51 #include <linux/etherdevice.h>
52 #include <linux/pci.h>
53 #include <linux/skbuff.h>
54 #include <linux/timer.h>
55 #include <linux/init.h>
56 #include <linux/delay.h>
57 
58 #include <net/net_namespace.h>
59 #include <net/arp.h>
60 
61 #include <asm/io.h>
62 #include <asm/types.h>
63 #include <asm/byteorder.h>
64 #include <asm/irq.h>
65 #include <asm/uaccess.h>
66 
67 #include "sbni.h"
68 
69 /* device private data */
70 
71 struct net_local {
72 	struct timer_list	watchdog;
73 
74 	spinlock_t	lock;
75 	struct sk_buff  *rx_buf_p;		/* receive buffer ptr */
76 	struct sk_buff  *tx_buf_p;		/* transmit buffer ptr */
77 
78 	unsigned int	framelen;		/* current frame length */
79 	unsigned int	maxframe;		/* maximum valid frame length */
80 	unsigned int	state;
81 	unsigned int	inppos, outpos;		/* positions in rx/tx buffers */
82 
83 	/* transmitting frame number - from frames qty to 1 */
84 	unsigned int	tx_frameno;
85 
86 	/* expected number of next receiving frame */
87 	unsigned int	wait_frameno;
88 
89 	/* count of failed attempts to frame send - 32 attempts do before
90 	   error - while receiver tunes on opposite side of wire */
91 	unsigned int	trans_errors;
92 
93 	/* idle time; send pong when limit exceeded */
94 	unsigned int	timer_ticks;
95 
96 	/* fields used for receive level autoselection */
97 	int	delta_rxl;
98 	unsigned int	cur_rxl_index, timeout_rxl;
99 	unsigned long	cur_rxl_rcvd, prev_rxl_rcvd;
100 
101 	struct sbni_csr1	csr1;		/* current value of CSR1 */
102 	struct sbni_in_stats	in_stats; 	/* internal statistics */
103 
104 	struct net_device		*second;	/* for ISA/dual cards */
105 
106 #ifdef CONFIG_SBNI_MULTILINE
107 	struct net_device		*master;
108 	struct net_device		*link;
109 #endif
110 };
111 
112 
113 static int  sbni_card_probe( unsigned long );
114 static int  sbni_pci_probe( struct net_device  * );
115 static struct net_device  *sbni_probe1(struct net_device *, unsigned long, int);
116 static int  sbni_open( struct net_device * );
117 static int  sbni_close( struct net_device * );
118 static netdev_tx_t sbni_start_xmit(struct sk_buff *,
119 					 struct net_device * );
120 static int  sbni_ioctl( struct net_device *, struct ifreq *, int );
121 static void  set_multicast_list( struct net_device * );
122 
123 static irqreturn_t sbni_interrupt( int, void * );
124 static void  handle_channel( struct net_device * );
125 static int   recv_frame( struct net_device * );
126 static void  send_frame( struct net_device * );
127 static int   upload_data( struct net_device *,
128 			  unsigned, unsigned, unsigned, u32 );
129 static void  download_data( struct net_device *, u32 * );
130 static void  sbni_watchdog( unsigned long );
131 static void  interpret_ack( struct net_device *, unsigned );
132 static int   append_frame_to_pkt( struct net_device *, unsigned, u32 );
133 static void  indicate_pkt( struct net_device * );
134 static void  card_start( struct net_device * );
135 static void  prepare_to_send( struct sk_buff *, struct net_device * );
136 static void  drop_xmit_queue( struct net_device * );
137 static void  send_frame_header( struct net_device *, u32 * );
138 static int   skip_tail( unsigned int, unsigned int, u32 );
139 static int   check_fhdr( u32, u32 *, u32 *, u32 *, u32 *, u32 * );
140 static void  change_level( struct net_device * );
141 static void  timeout_change_level( struct net_device * );
142 static u32   calc_crc32( u32, u8 *, u32 );
143 static struct sk_buff *  get_rx_buf( struct net_device * );
144 static int  sbni_init( struct net_device * );
145 
146 #ifdef CONFIG_SBNI_MULTILINE
147 static int  enslave( struct net_device *, struct net_device * );
148 static int  emancipate( struct net_device * );
149 #endif
150 
151 #ifdef __i386__
152 #define ASM_CRC 1
153 #endif
154 
155 static const char  version[] =
156 	"Granch SBNI12 driver ver 5.0.1  Jun 22 2001  Denis I.Timofeev.\n";
157 
158 static bool skip_pci_probe	__initdata = false;
159 static int  scandone	__initdata = 0;
160 static int  num		__initdata = 0;
161 
162 static unsigned char  rxl_tab[];
163 static u32  crc32tab[];
164 
165 /* A list of all installed devices, for removing the driver module. */
166 static struct net_device  *sbni_cards[ SBNI_MAX_NUM_CARDS ];
167 
168 /* Lists of device's parameters */
169 static u32	io[   SBNI_MAX_NUM_CARDS ] __initdata =
170 	{ [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
171 static u32	irq[  SBNI_MAX_NUM_CARDS ] __initdata;
172 static u32	baud[ SBNI_MAX_NUM_CARDS ] __initdata;
173 static u32	rxl[  SBNI_MAX_NUM_CARDS ] __initdata =
174 	{ [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
175 static u32	mac[  SBNI_MAX_NUM_CARDS ] __initdata;
176 
177 #ifndef MODULE
178 typedef u32  iarr[];
179 static iarr __initdata *dest[5] = { &io, &irq, &baud, &rxl, &mac };
180 #endif
181 
182 /* A zero-terminated list of I/O addresses to be probed on ISA bus */
183 static unsigned int  netcard_portlist[ ] __initdata = {
184 	0x210, 0x214, 0x220, 0x224, 0x230, 0x234, 0x240, 0x244, 0x250, 0x254,
185 	0x260, 0x264, 0x270, 0x274, 0x280, 0x284, 0x290, 0x294, 0x2a0, 0x2a4,
186 	0x2b0, 0x2b4, 0x2c0, 0x2c4, 0x2d0, 0x2d4, 0x2e0, 0x2e4, 0x2f0, 0x2f4,
187 	0 };
188 
189 #define NET_LOCAL_LOCK(dev) (((struct net_local *)netdev_priv(dev))->lock)
190 
191 /*
192  * Look for SBNI card which addr stored in dev->base_addr, if nonzero.
193  * Otherwise, look through PCI bus. If none PCI-card was found, scan ISA.
194  */
195 
196 static inline int __init
sbni_isa_probe(struct net_device * dev)197 sbni_isa_probe( struct net_device  *dev )
198 {
199 	if( dev->base_addr > 0x1ff &&
200 	    request_region( dev->base_addr, SBNI_IO_EXTENT, dev->name ) &&
201 	    sbni_probe1( dev, dev->base_addr, dev->irq ) )
202 
203 		return  0;
204 	else {
205 		pr_err("base address 0x%lx is busy, or adapter is malfunctional!\n",
206 		       dev->base_addr);
207 		return  -ENODEV;
208 	}
209 }
210 
211 static const struct net_device_ops sbni_netdev_ops = {
212 	.ndo_open		= sbni_open,
213 	.ndo_stop		= sbni_close,
214 	.ndo_start_xmit		= sbni_start_xmit,
215 	.ndo_set_rx_mode	= set_multicast_list,
216 	.ndo_do_ioctl		= sbni_ioctl,
217 	.ndo_change_mtu		= eth_change_mtu,
218 	.ndo_set_mac_address 	= eth_mac_addr,
219 	.ndo_validate_addr	= eth_validate_addr,
220 };
221 
sbni_devsetup(struct net_device * dev)222 static void __init sbni_devsetup(struct net_device *dev)
223 {
224 	ether_setup( dev );
225 	dev->netdev_ops = &sbni_netdev_ops;
226 }
227 
sbni_probe(int unit)228 int __init sbni_probe(int unit)
229 {
230 	struct net_device *dev;
231 	int err;
232 
233 	dev = alloc_netdev(sizeof(struct net_local), "sbni", sbni_devsetup);
234 	if (!dev)
235 		return -ENOMEM;
236 
237 	dev->netdev_ops = &sbni_netdev_ops;
238 
239 	sprintf(dev->name, "sbni%d", unit);
240 	netdev_boot_setup_check(dev);
241 
242 	err = sbni_init(dev);
243 	if (err) {
244 		free_netdev(dev);
245 		return err;
246 	}
247 
248 	err = register_netdev(dev);
249 	if (err) {
250 		release_region( dev->base_addr, SBNI_IO_EXTENT );
251 		free_netdev(dev);
252 		return err;
253 	}
254 	pr_info_once("%s", version);
255 	return 0;
256 }
257 
sbni_init(struct net_device * dev)258 static int __init sbni_init(struct net_device *dev)
259 {
260 	int  i;
261 	if( dev->base_addr )
262 		return  sbni_isa_probe( dev );
263 	/* otherwise we have to perform search our adapter */
264 
265 	if( io[ num ] != -1 )
266 		dev->base_addr	= io[ num ],
267 		dev->irq	= irq[ num ];
268 	else if( scandone  ||  io[ 0 ] != -1 )
269 		return  -ENODEV;
270 
271 	/* if io[ num ] contains non-zero address, then that is on ISA bus */
272 	if( dev->base_addr )
273 		return  sbni_isa_probe( dev );
274 
275 	/* ...otherwise - scan PCI first */
276 	if( !skip_pci_probe  &&  !sbni_pci_probe( dev ) )
277 		return  0;
278 
279 	if( io[ num ] == -1 ) {
280 		/* Auto-scan will be stopped when first ISA card were found */
281 		scandone = 1;
282 		if( num > 0 )
283 			return  -ENODEV;
284 	}
285 
286 	for( i = 0;  netcard_portlist[ i ];  ++i ) {
287 		int  ioaddr = netcard_portlist[ i ];
288 		if( request_region( ioaddr, SBNI_IO_EXTENT, dev->name ) &&
289 		    sbni_probe1( dev, ioaddr, 0 ))
290 			return 0;
291 	}
292 
293 	return  -ENODEV;
294 }
295 
296 
297 static int __init
sbni_pci_probe(struct net_device * dev)298 sbni_pci_probe( struct net_device  *dev )
299 {
300 	struct pci_dev  *pdev = NULL;
301 
302 	while( (pdev = pci_get_class( PCI_CLASS_NETWORK_OTHER << 8, pdev ))
303 	       != NULL ) {
304 		int  pci_irq_line;
305 		unsigned long  pci_ioaddr;
306 
307 		if( pdev->vendor != SBNI_PCI_VENDOR &&
308 		    pdev->device != SBNI_PCI_DEVICE )
309 			continue;
310 
311 		pci_ioaddr = pci_resource_start( pdev, 0 );
312 		pci_irq_line = pdev->irq;
313 
314 		/* Avoid already found cards from previous calls */
315 		if( !request_region( pci_ioaddr, SBNI_IO_EXTENT, dev->name ) ) {
316 			if (pdev->subsystem_device != 2)
317 				continue;
318 
319 			/* Dual adapter is present */
320 			if (!request_region(pci_ioaddr += 4, SBNI_IO_EXTENT,
321 							dev->name ) )
322 				continue;
323 		}
324 
325 		if (pci_irq_line <= 0 || pci_irq_line >= nr_irqs)
326 			pr_warn(
327 "WARNING: The PCI BIOS assigned this PCI card to IRQ %d, which is unlikely to work!.\n"
328 "You should use the PCI BIOS setup to assign a valid IRQ line.\n",
329 				pci_irq_line );
330 
331 		/* avoiding re-enable dual adapters */
332 		if( (pci_ioaddr & 7) == 0  &&  pci_enable_device( pdev ) ) {
333 			release_region( pci_ioaddr, SBNI_IO_EXTENT );
334 			pci_dev_put( pdev );
335 			return  -EIO;
336 		}
337 		if( sbni_probe1( dev, pci_ioaddr, pci_irq_line ) ) {
338 			SET_NETDEV_DEV(dev, &pdev->dev);
339 			/* not the best thing to do, but this is all messed up
340 			   for hotplug systems anyway... */
341 			pci_dev_put( pdev );
342 			return  0;
343 		}
344 	}
345 	return  -ENODEV;
346 }
347 
348 
349 static struct net_device * __init
sbni_probe1(struct net_device * dev,unsigned long ioaddr,int irq)350 sbni_probe1( struct net_device  *dev,  unsigned long  ioaddr,  int  irq )
351 {
352 	struct net_local  *nl;
353 
354 	if( sbni_card_probe( ioaddr ) ) {
355 		release_region( ioaddr, SBNI_IO_EXTENT );
356 		return NULL;
357 	}
358 
359 	outb( 0, ioaddr + CSR0 );
360 
361 	if( irq < 2 ) {
362 		unsigned long irq_mask;
363 
364 		irq_mask = probe_irq_on();
365 		outb( EN_INT | TR_REQ, ioaddr + CSR0 );
366 		outb( PR_RES, ioaddr + CSR1 );
367 		mdelay(50);
368 		irq = probe_irq_off(irq_mask);
369 		outb( 0, ioaddr + CSR0 );
370 
371 		if( !irq ) {
372 			pr_err("%s: can't detect device irq!\n", dev->name);
373 			release_region( ioaddr, SBNI_IO_EXTENT );
374 			return NULL;
375 		}
376 	} else if( irq == 2 )
377 		irq = 9;
378 
379 	dev->irq = irq;
380 	dev->base_addr = ioaddr;
381 
382 	/* Fill in sbni-specific dev fields. */
383 	nl = netdev_priv(dev);
384 	if( !nl ) {
385 		pr_err("%s: unable to get memory!\n", dev->name);
386 		release_region( ioaddr, SBNI_IO_EXTENT );
387 		return NULL;
388 	}
389 
390 	memset( nl, 0, sizeof(struct net_local) );
391 	spin_lock_init( &nl->lock );
392 
393 	/* store MAC address (generate if that isn't known) */
394 	*(__be16 *)dev->dev_addr = htons( 0x00ff );
395 	*(__be32 *)(dev->dev_addr + 2) = htonl( 0x01000000 |
396 		((mac[num] ?
397 		mac[num] :
398 		(u32)((long)netdev_priv(dev))) & 0x00ffffff));
399 
400 	/* store link settings (speed, receive level ) */
401 	nl->maxframe  = DEFAULT_FRAME_LEN;
402 	nl->csr1.rate = baud[ num ];
403 
404 	if( (nl->cur_rxl_index = rxl[ num ]) == -1 )
405 		/* autotune rxl */
406 		nl->cur_rxl_index = DEF_RXL,
407 		nl->delta_rxl = DEF_RXL_DELTA;
408 	else
409 		nl->delta_rxl = 0;
410 	nl->csr1.rxl  = rxl_tab[ nl->cur_rxl_index ];
411 	if( inb( ioaddr + CSR0 ) & 0x01 )
412 		nl->state |= FL_SLOW_MODE;
413 
414 	pr_notice("%s: ioaddr %#lx, irq %d, MAC: 00:ff:01:%02x:%02x:%02x\n",
415 		  dev->name, dev->base_addr, dev->irq,
416 		  ((u8 *)dev->dev_addr)[3],
417 		  ((u8 *)dev->dev_addr)[4],
418 		  ((u8 *)dev->dev_addr)[5]);
419 
420 	pr_notice("%s: speed %d",
421 		  dev->name,
422 		  ((nl->state & FL_SLOW_MODE) ? 500000 : 2000000)
423 		  / (1 << nl->csr1.rate));
424 
425 	if( nl->delta_rxl == 0 )
426 		pr_cont(", receive level 0x%x (fixed)\n", nl->cur_rxl_index);
427 	else
428 		pr_cont(", receive level (auto)\n");
429 
430 #ifdef CONFIG_SBNI_MULTILINE
431 	nl->master = dev;
432 	nl->link   = NULL;
433 #endif
434 
435 	sbni_cards[ num++ ] = dev;
436 	return  dev;
437 }
438 
439 /* -------------------------------------------------------------------------- */
440 
441 #ifdef CONFIG_SBNI_MULTILINE
442 
443 static netdev_tx_t
sbni_start_xmit(struct sk_buff * skb,struct net_device * dev)444 sbni_start_xmit( struct sk_buff  *skb,  struct net_device  *dev )
445 {
446 	struct net_device  *p;
447 
448 	netif_stop_queue( dev );
449 
450 	/* Looking for idle device in the list */
451 	for( p = dev;  p; ) {
452 		struct net_local  *nl = netdev_priv(p);
453 		spin_lock( &nl->lock );
454 		if( nl->tx_buf_p  ||  (nl->state & FL_LINE_DOWN) ) {
455 			p = nl->link;
456 			spin_unlock( &nl->lock );
457 		} else {
458 			/* Idle dev is found */
459 			prepare_to_send( skb, p );
460 			spin_unlock( &nl->lock );
461 			netif_start_queue( dev );
462 			return NETDEV_TX_OK;
463 		}
464 	}
465 
466 	return NETDEV_TX_BUSY;
467 }
468 
469 #else	/* CONFIG_SBNI_MULTILINE */
470 
471 static netdev_tx_t
sbni_start_xmit(struct sk_buff * skb,struct net_device * dev)472 sbni_start_xmit( struct sk_buff  *skb,  struct net_device  *dev )
473 {
474 	struct net_local  *nl  = netdev_priv(dev);
475 
476 	netif_stop_queue( dev );
477 	spin_lock( &nl->lock );
478 
479 	prepare_to_send( skb, dev );
480 
481 	spin_unlock( &nl->lock );
482 	return NETDEV_TX_OK;
483 }
484 
485 #endif	/* CONFIG_SBNI_MULTILINE */
486 
487 /* -------------------------------------------------------------------------- */
488 
489 /* interrupt handler */
490 
491 /*
492  * 	SBNI12D-10, -11/ISA boards within "common interrupt" mode could not
493  * be looked as two independent single-channel devices. Every channel seems
494  * as Ethernet interface but interrupt handler must be common. Really, first
495  * channel ("master") driver only registers the handler. In its struct net_local
496  * it has got pointer to "slave" channel's struct net_local and handles that's
497  * interrupts too.
498  *	dev of successfully attached ISA SBNI boards is linked to list.
499  * While next board driver is initialized, it scans this list. If one
500  * has found dev with same irq and ioaddr different by 4 then it assumes
501  * this board to be "master".
502  */
503 
504 static irqreturn_t
sbni_interrupt(int irq,void * dev_id)505 sbni_interrupt( int  irq,  void  *dev_id )
506 {
507 	struct net_device	  *dev = dev_id;
508 	struct net_local  *nl  = netdev_priv(dev);
509 	int	repeat;
510 
511 	spin_lock( &nl->lock );
512 	if( nl->second )
513 		spin_lock(&NET_LOCAL_LOCK(nl->second));
514 
515 	do {
516 		repeat = 0;
517 		if( inb( dev->base_addr + CSR0 ) & (RC_RDY | TR_RDY) )
518 			handle_channel( dev ),
519 			repeat = 1;
520 		if( nl->second  && 	/* second channel present */
521 		    (inb( nl->second->base_addr+CSR0 ) & (RC_RDY | TR_RDY)) )
522 			handle_channel( nl->second ),
523 			repeat = 1;
524 	} while( repeat );
525 
526 	if( nl->second )
527 		spin_unlock(&NET_LOCAL_LOCK(nl->second));
528 	spin_unlock( &nl->lock );
529 	return IRQ_HANDLED;
530 }
531 
532 
533 static void
handle_channel(struct net_device * dev)534 handle_channel( struct net_device  *dev )
535 {
536 	struct net_local	*nl    = netdev_priv(dev);
537 	unsigned long		ioaddr = dev->base_addr;
538 
539 	int  req_ans;
540 	unsigned char  csr0;
541 
542 #ifdef CONFIG_SBNI_MULTILINE
543 	/* Lock the master device because we going to change its local data */
544 	if( nl->state & FL_SLAVE )
545 		spin_lock(&NET_LOCAL_LOCK(nl->master));
546 #endif
547 
548 	outb( (inb( ioaddr + CSR0 ) & ~EN_INT) | TR_REQ, ioaddr + CSR0 );
549 
550 	nl->timer_ticks = CHANGE_LEVEL_START_TICKS;
551 	for(;;) {
552 		csr0 = inb( ioaddr + CSR0 );
553 		if( ( csr0 & (RC_RDY | TR_RDY) ) == 0 )
554 			break;
555 
556 		req_ans = !(nl->state & FL_PREV_OK);
557 
558 		if( csr0 & RC_RDY )
559 			req_ans = recv_frame( dev );
560 
561 		/*
562 		 * TR_RDY always equals 1 here because we have owned the marker,
563 		 * and we set TR_REQ when disabled interrupts
564 		 */
565 		csr0 = inb( ioaddr + CSR0 );
566 		if( !(csr0 & TR_RDY)  ||  (csr0 & RC_RDY) )
567 			netdev_err(dev, "internal error!\n");
568 
569 		/* if state & FL_NEED_RESEND != 0 then tx_frameno != 0 */
570 		if( req_ans  ||  nl->tx_frameno != 0 )
571 			send_frame( dev );
572 		else
573 			/* send marker without any data */
574 			outb( inb( ioaddr + CSR0 ) & ~TR_REQ, ioaddr + CSR0 );
575 	}
576 
577 	outb( inb( ioaddr + CSR0 ) | EN_INT, ioaddr + CSR0 );
578 
579 #ifdef CONFIG_SBNI_MULTILINE
580 	if( nl->state & FL_SLAVE )
581 		spin_unlock(&NET_LOCAL_LOCK(nl->master));
582 #endif
583 }
584 
585 
586 /*
587  * Routine returns 1 if it need to acknoweledge received frame.
588  * Empty frame received without errors won't be acknoweledged.
589  */
590 
591 static int
recv_frame(struct net_device * dev)592 recv_frame( struct net_device  *dev )
593 {
594 	struct net_local  *nl   = netdev_priv(dev);
595 	unsigned long  ioaddr	= dev->base_addr;
596 
597 	u32  crc = CRC32_INITIAL;
598 
599 	unsigned  framelen = 0, frameno, ack;
600 	unsigned  is_first, frame_ok = 0;
601 
602 	if( check_fhdr( ioaddr, &framelen, &frameno, &ack, &is_first, &crc ) ) {
603 		frame_ok = framelen > 4
604 			?  upload_data( dev, framelen, frameno, is_first, crc )
605 			:  skip_tail( ioaddr, framelen, crc );
606 		if( frame_ok )
607 			interpret_ack( dev, ack );
608 	}
609 
610 	outb( inb( ioaddr + CSR0 ) ^ CT_ZER, ioaddr + CSR0 );
611 	if( frame_ok ) {
612 		nl->state |= FL_PREV_OK;
613 		if( framelen > 4 )
614 			nl->in_stats.all_rx_number++;
615 	} else
616 		nl->state &= ~FL_PREV_OK,
617 		change_level( dev ),
618 		nl->in_stats.all_rx_number++,
619 		nl->in_stats.bad_rx_number++;
620 
621 	return  !frame_ok  ||  framelen > 4;
622 }
623 
624 
625 static void
send_frame(struct net_device * dev)626 send_frame( struct net_device  *dev )
627 {
628 	struct net_local  *nl    = netdev_priv(dev);
629 
630 	u32  crc = CRC32_INITIAL;
631 
632 	if( nl->state & FL_NEED_RESEND ) {
633 
634 		/* if frame was sended but not ACK'ed - resend it */
635 		if( nl->trans_errors ) {
636 			--nl->trans_errors;
637 			if( nl->framelen != 0 )
638 				nl->in_stats.resend_tx_number++;
639 		} else {
640 			/* cannot xmit with many attempts */
641 #ifdef CONFIG_SBNI_MULTILINE
642 			if( (nl->state & FL_SLAVE)  ||  nl->link )
643 #endif
644 			nl->state |= FL_LINE_DOWN;
645 			drop_xmit_queue( dev );
646 			goto  do_send;
647 		}
648 	} else
649 		nl->trans_errors = TR_ERROR_COUNT;
650 
651 	send_frame_header( dev, &crc );
652 	nl->state |= FL_NEED_RESEND;
653 	/*
654 	 * FL_NEED_RESEND will be cleared after ACK, but if empty
655 	 * frame sended then in prepare_to_send next frame
656 	 */
657 
658 
659 	if( nl->framelen ) {
660 		download_data( dev, &crc );
661 		nl->in_stats.all_tx_number++;
662 		nl->state |= FL_WAIT_ACK;
663 	}
664 
665 	outsb( dev->base_addr + DAT, (u8 *)&crc, sizeof crc );
666 
667 do_send:
668 	outb( inb( dev->base_addr + CSR0 ) & ~TR_REQ, dev->base_addr + CSR0 );
669 
670 	if( nl->tx_frameno )
671 		/* next frame exists - we request card to send it */
672 		outb( inb( dev->base_addr + CSR0 ) | TR_REQ,
673 		      dev->base_addr + CSR0 );
674 }
675 
676 
677 /*
678  * Write the frame data into adapter's buffer memory, and calculate CRC.
679  * Do padding if necessary.
680  */
681 
682 static void
download_data(struct net_device * dev,u32 * crc_p)683 download_data( struct net_device  *dev,  u32  *crc_p )
684 {
685 	struct net_local  *nl    = netdev_priv(dev);
686 	struct sk_buff    *skb	 = nl->tx_buf_p;
687 
688 	unsigned  len = min_t(unsigned int, skb->len - nl->outpos, nl->framelen);
689 
690 	outsb( dev->base_addr + DAT, skb->data + nl->outpos, len );
691 	*crc_p = calc_crc32( *crc_p, skb->data + nl->outpos, len );
692 
693 	/* if packet too short we should write some more bytes to pad */
694 	for( len = nl->framelen - len;  len--; )
695 		outb( 0, dev->base_addr + DAT ),
696 		*crc_p = CRC32( 0, *crc_p );
697 }
698 
699 
700 static int
upload_data(struct net_device * dev,unsigned framelen,unsigned frameno,unsigned is_first,u32 crc)701 upload_data( struct net_device  *dev,  unsigned  framelen,  unsigned  frameno,
702 	     unsigned  is_first,  u32  crc )
703 {
704 	struct net_local  *nl = netdev_priv(dev);
705 
706 	int  frame_ok;
707 
708 	if( is_first )
709 		nl->wait_frameno = frameno,
710 		nl->inppos = 0;
711 
712 	if( nl->wait_frameno == frameno ) {
713 
714 		if( nl->inppos + framelen  <=  ETHER_MAX_LEN )
715 			frame_ok = append_frame_to_pkt( dev, framelen, crc );
716 
717 		/*
718 		 * if CRC is right but framelen incorrect then transmitter
719 		 * error was occurred... drop entire packet
720 		 */
721 		else if( (frame_ok = skip_tail( dev->base_addr, framelen, crc ))
722 			 != 0 )
723 			nl->wait_frameno = 0,
724 			nl->inppos = 0,
725 #ifdef CONFIG_SBNI_MULTILINE
726 			nl->master->stats.rx_errors++,
727 			nl->master->stats.rx_missed_errors++;
728 #else
729 		        dev->stats.rx_errors++,
730 			dev->stats.rx_missed_errors++;
731 #endif
732 			/* now skip all frames until is_first != 0 */
733 	} else
734 		frame_ok = skip_tail( dev->base_addr, framelen, crc );
735 
736 	if( is_first  &&  !frame_ok )
737 		/*
738 		 * Frame has been broken, but we had already stored
739 		 * is_first... Drop entire packet.
740 		 */
741 		nl->wait_frameno = 0,
742 #ifdef CONFIG_SBNI_MULTILINE
743 		nl->master->stats.rx_errors++,
744 		nl->master->stats.rx_crc_errors++;
745 #else
746 		dev->stats.rx_errors++,
747 		dev->stats.rx_crc_errors++;
748 #endif
749 
750 	return  frame_ok;
751 }
752 
753 
754 static inline void
send_complete(struct net_device * dev)755 send_complete( struct net_device *dev )
756 {
757 	struct net_local  *nl = netdev_priv(dev);
758 
759 #ifdef CONFIG_SBNI_MULTILINE
760 	nl->master->stats.tx_packets++;
761 	nl->master->stats.tx_bytes += nl->tx_buf_p->len;
762 #else
763 	dev->stats.tx_packets++;
764 	dev->stats.tx_bytes += nl->tx_buf_p->len;
765 #endif
766 	dev_kfree_skb_irq( nl->tx_buf_p );
767 
768 	nl->tx_buf_p = NULL;
769 
770 	nl->outpos = 0;
771 	nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
772 	nl->framelen   = 0;
773 }
774 
775 
776 static void
interpret_ack(struct net_device * dev,unsigned ack)777 interpret_ack( struct net_device  *dev,  unsigned  ack )
778 {
779 	struct net_local  *nl = netdev_priv(dev);
780 
781 	if( ack == FRAME_SENT_OK ) {
782 		nl->state &= ~FL_NEED_RESEND;
783 
784 		if( nl->state & FL_WAIT_ACK ) {
785 			nl->outpos += nl->framelen;
786 
787 			if( --nl->tx_frameno )
788 				nl->framelen = min_t(unsigned int,
789 						   nl->maxframe,
790 						   nl->tx_buf_p->len - nl->outpos);
791 			else
792 				send_complete( dev ),
793 #ifdef CONFIG_SBNI_MULTILINE
794 				netif_wake_queue( nl->master );
795 #else
796 				netif_wake_queue( dev );
797 #endif
798 		}
799 	}
800 
801 	nl->state &= ~FL_WAIT_ACK;
802 }
803 
804 
805 /*
806  * Glue received frame with previous fragments of packet.
807  * Indicate packet when last frame would be accepted.
808  */
809 
810 static int
append_frame_to_pkt(struct net_device * dev,unsigned framelen,u32 crc)811 append_frame_to_pkt( struct net_device  *dev,  unsigned  framelen,  u32  crc )
812 {
813 	struct net_local  *nl = netdev_priv(dev);
814 
815 	u8  *p;
816 
817 	if( nl->inppos + framelen  >  ETHER_MAX_LEN )
818 		return  0;
819 
820 	if( !nl->rx_buf_p  &&  !(nl->rx_buf_p = get_rx_buf( dev )) )
821 		return  0;
822 
823 	p = nl->rx_buf_p->data + nl->inppos;
824 	insb( dev->base_addr + DAT, p, framelen );
825 	if( calc_crc32( crc, p, framelen ) != CRC32_REMAINDER )
826 		return  0;
827 
828 	nl->inppos += framelen - 4;
829 	if( --nl->wait_frameno == 0 )		/* last frame received */
830 		indicate_pkt( dev );
831 
832 	return  1;
833 }
834 
835 
836 /*
837  * Prepare to start output on adapter.
838  * Transmitter will be actually activated when marker is accepted.
839  */
840 
841 static void
prepare_to_send(struct sk_buff * skb,struct net_device * dev)842 prepare_to_send( struct sk_buff  *skb,  struct net_device  *dev )
843 {
844 	struct net_local  *nl = netdev_priv(dev);
845 
846 	unsigned int  len;
847 
848 	/* nl->tx_buf_p == NULL here! */
849 	if( nl->tx_buf_p )
850 		netdev_err(dev, "memory leak!\n");
851 
852 	nl->outpos = 0;
853 	nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
854 
855 	len = skb->len;
856 	if( len < SBNI_MIN_LEN )
857 		len = SBNI_MIN_LEN;
858 
859 	nl->tx_buf_p	= skb;
860 	nl->tx_frameno	= DIV_ROUND_UP(len, nl->maxframe);
861 	nl->framelen	= len < nl->maxframe  ?  len  :  nl->maxframe;
862 
863 	outb( inb( dev->base_addr + CSR0 ) | TR_REQ,  dev->base_addr + CSR0 );
864 #ifdef CONFIG_SBNI_MULTILINE
865 	nl->master->trans_start = jiffies;
866 #else
867 	dev->trans_start = jiffies;
868 #endif
869 }
870 
871 
872 static void
drop_xmit_queue(struct net_device * dev)873 drop_xmit_queue( struct net_device  *dev )
874 {
875 	struct net_local  *nl = netdev_priv(dev);
876 
877 	if( nl->tx_buf_p )
878 		dev_kfree_skb_any( nl->tx_buf_p ),
879 		nl->tx_buf_p = NULL,
880 #ifdef CONFIG_SBNI_MULTILINE
881 		nl->master->stats.tx_errors++,
882 		nl->master->stats.tx_carrier_errors++;
883 #else
884 		dev->stats.tx_errors++,
885 		dev->stats.tx_carrier_errors++;
886 #endif
887 
888 	nl->tx_frameno	= 0;
889 	nl->framelen	= 0;
890 	nl->outpos	= 0;
891 	nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
892 #ifdef CONFIG_SBNI_MULTILINE
893 	netif_start_queue( nl->master );
894 	nl->master->trans_start = jiffies;
895 #else
896 	netif_start_queue( dev );
897 	dev->trans_start = jiffies;
898 #endif
899 }
900 
901 
902 static void
send_frame_header(struct net_device * dev,u32 * crc_p)903 send_frame_header( struct net_device  *dev,  u32  *crc_p )
904 {
905 	struct net_local  *nl  = netdev_priv(dev);
906 
907 	u32  crc = *crc_p;
908 	u32  len_field = nl->framelen + 6;	/* CRC + frameno + reserved */
909 	u8   value;
910 
911 	if( nl->state & FL_NEED_RESEND )
912 		len_field |= FRAME_RETRY;	/* non-first attempt... */
913 
914 	if( nl->outpos == 0 )
915 		len_field |= FRAME_FIRST;
916 
917 	len_field |= (nl->state & FL_PREV_OK) ? FRAME_SENT_OK : FRAME_SENT_BAD;
918 	outb( SBNI_SIG, dev->base_addr + DAT );
919 
920 	value = (u8) len_field;
921 	outb( value, dev->base_addr + DAT );
922 	crc = CRC32( value, crc );
923 	value = (u8) (len_field >> 8);
924 	outb( value, dev->base_addr + DAT );
925 	crc = CRC32( value, crc );
926 
927 	outb( nl->tx_frameno, dev->base_addr + DAT );
928 	crc = CRC32( nl->tx_frameno, crc );
929 	outb( 0, dev->base_addr + DAT );
930 	crc = CRC32( 0, crc );
931 	*crc_p = crc;
932 }
933 
934 
935 /*
936  * if frame tail not needed (incorrect number or received twice),
937  * it won't store, but CRC will be calculated
938  */
939 
940 static int
skip_tail(unsigned int ioaddr,unsigned int tail_len,u32 crc)941 skip_tail( unsigned int  ioaddr,  unsigned int  tail_len,  u32 crc )
942 {
943 	while( tail_len-- )
944 		crc = CRC32( inb( ioaddr + DAT ), crc );
945 
946 	return  crc == CRC32_REMAINDER;
947 }
948 
949 
950 /*
951  * Preliminary checks if frame header is correct, calculates its CRC
952  * and split it to simple fields
953  */
954 
955 static int
check_fhdr(u32 ioaddr,u32 * framelen,u32 * frameno,u32 * ack,u32 * is_first,u32 * crc_p)956 check_fhdr( u32  ioaddr,  u32  *framelen,  u32  *frameno,  u32  *ack,
957 	    u32  *is_first,  u32  *crc_p )
958 {
959 	u32  crc = *crc_p;
960 	u8   value;
961 
962 	if( inb( ioaddr + DAT ) != SBNI_SIG )
963 		return  0;
964 
965 	value = inb( ioaddr + DAT );
966 	*framelen = (u32)value;
967 	crc = CRC32( value, crc );
968 	value = inb( ioaddr + DAT );
969 	*framelen |= ((u32)value) << 8;
970 	crc = CRC32( value, crc );
971 
972 	*ack = *framelen & FRAME_ACK_MASK;
973 	*is_first = (*framelen & FRAME_FIRST) != 0;
974 
975 	if( (*framelen &= FRAME_LEN_MASK) < 6 ||
976 	    *framelen > SBNI_MAX_FRAME - 3 )
977 		return  0;
978 
979 	value = inb( ioaddr + DAT );
980 	*frameno = (u32)value;
981 	crc = CRC32( value, crc );
982 
983 	crc = CRC32( inb( ioaddr + DAT ), crc );	/* reserved byte */
984 	*framelen -= 2;
985 
986 	*crc_p = crc;
987 	return  1;
988 }
989 
990 
991 static struct sk_buff *
get_rx_buf(struct net_device * dev)992 get_rx_buf( struct net_device  *dev )
993 {
994 	/* +2 is to compensate for the alignment fixup below */
995 	struct sk_buff  *skb = dev_alloc_skb( ETHER_MAX_LEN + 2 );
996 	if( !skb )
997 		return  NULL;
998 
999 	skb_reserve( skb, 2 );		/* Align IP on longword boundaries */
1000 	return  skb;
1001 }
1002 
1003 
1004 static void
indicate_pkt(struct net_device * dev)1005 indicate_pkt( struct net_device  *dev )
1006 {
1007 	struct net_local  *nl  = netdev_priv(dev);
1008 	struct sk_buff    *skb = nl->rx_buf_p;
1009 
1010 	skb_put( skb, nl->inppos );
1011 
1012 #ifdef CONFIG_SBNI_MULTILINE
1013 	skb->protocol = eth_type_trans( skb, nl->master );
1014 	netif_rx( skb );
1015 	++nl->master->stats.rx_packets;
1016 	nl->master->stats.rx_bytes += nl->inppos;
1017 #else
1018 	skb->protocol = eth_type_trans( skb, dev );
1019 	netif_rx( skb );
1020 	++dev->stats.rx_packets;
1021 	dev->stats.rx_bytes += nl->inppos;
1022 #endif
1023 	nl->rx_buf_p = NULL;	/* protocol driver will clear this sk_buff */
1024 }
1025 
1026 
1027 /* -------------------------------------------------------------------------- */
1028 
1029 /*
1030  * Routine checks periodically wire activity and regenerates marker if
1031  * connect was inactive for a long time.
1032  */
1033 
1034 static void
sbni_watchdog(unsigned long arg)1035 sbni_watchdog( unsigned long  arg )
1036 {
1037 	struct net_device  *dev = (struct net_device *) arg;
1038 	struct net_local   *nl  = netdev_priv(dev);
1039 	struct timer_list  *w   = &nl->watchdog;
1040 	unsigned long	   flags;
1041 	unsigned char	   csr0;
1042 
1043 	spin_lock_irqsave( &nl->lock, flags );
1044 
1045 	csr0 = inb( dev->base_addr + CSR0 );
1046 	if( csr0 & RC_CHK ) {
1047 
1048 		if( nl->timer_ticks ) {
1049 			if( csr0 & (RC_RDY | BU_EMP) )
1050 				/* receiving not active */
1051 				nl->timer_ticks--;
1052 		} else {
1053 			nl->in_stats.timeout_number++;
1054 			if( nl->delta_rxl )
1055 				timeout_change_level( dev );
1056 
1057 			outb( *(u_char *)&nl->csr1 | PR_RES,
1058 			      dev->base_addr + CSR1 );
1059 			csr0 = inb( dev->base_addr + CSR0 );
1060 		}
1061 	} else
1062 		nl->state &= ~FL_LINE_DOWN;
1063 
1064 	outb( csr0 | RC_CHK, dev->base_addr + CSR0 );
1065 
1066 	init_timer( w );
1067 	w->expires	= jiffies + SBNI_TIMEOUT;
1068 	w->data		= arg;
1069 	w->function	= sbni_watchdog;
1070 	add_timer( w );
1071 
1072 	spin_unlock_irqrestore( &nl->lock, flags );
1073 }
1074 
1075 
1076 static unsigned char  rxl_tab[] = {
1077 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08,
1078 	0x0a, 0x0c, 0x0f, 0x16, 0x18, 0x1a, 0x1c, 0x1f
1079 };
1080 
1081 #define SIZE_OF_TIMEOUT_RXL_TAB 4
1082 static unsigned char  timeout_rxl_tab[] = {
1083 	0x03, 0x05, 0x08, 0x0b
1084 };
1085 
1086 /* -------------------------------------------------------------------------- */
1087 
1088 static void
card_start(struct net_device * dev)1089 card_start( struct net_device  *dev )
1090 {
1091 	struct net_local  *nl = netdev_priv(dev);
1092 
1093 	nl->timer_ticks = CHANGE_LEVEL_START_TICKS;
1094 	nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
1095 	nl->state |= FL_PREV_OK;
1096 
1097 	nl->inppos = nl->outpos = 0;
1098 	nl->wait_frameno = 0;
1099 	nl->tx_frameno	 = 0;
1100 	nl->framelen	 = 0;
1101 
1102 	outb( *(u_char *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 );
1103 	outb( EN_INT, dev->base_addr + CSR0 );
1104 }
1105 
1106 /* -------------------------------------------------------------------------- */
1107 
1108 /* Receive level auto-selection */
1109 
1110 static void
change_level(struct net_device * dev)1111 change_level( struct net_device  *dev )
1112 {
1113 	struct net_local  *nl = netdev_priv(dev);
1114 
1115 	if( nl->delta_rxl == 0 )	/* do not auto-negotiate RxL */
1116 		return;
1117 
1118 	if( nl->cur_rxl_index == 0 )
1119 		nl->delta_rxl = 1;
1120 	else if( nl->cur_rxl_index == 15 )
1121 		nl->delta_rxl = -1;
1122 	else if( nl->cur_rxl_rcvd < nl->prev_rxl_rcvd )
1123 		nl->delta_rxl = -nl->delta_rxl;
1124 
1125 	nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index += nl->delta_rxl ];
1126 	inb( dev->base_addr + CSR0 );	/* needs for PCI cards */
1127 	outb( *(u8 *)&nl->csr1, dev->base_addr + CSR1 );
1128 
1129 	nl->prev_rxl_rcvd = nl->cur_rxl_rcvd;
1130 	nl->cur_rxl_rcvd  = 0;
1131 }
1132 
1133 
1134 static void
timeout_change_level(struct net_device * dev)1135 timeout_change_level( struct net_device  *dev )
1136 {
1137 	struct net_local  *nl = netdev_priv(dev);
1138 
1139 	nl->cur_rxl_index = timeout_rxl_tab[ nl->timeout_rxl ];
1140 	if( ++nl->timeout_rxl >= 4 )
1141 		nl->timeout_rxl = 0;
1142 
1143 	nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ];
1144 	inb( dev->base_addr + CSR0 );
1145 	outb( *(unsigned char *)&nl->csr1, dev->base_addr + CSR1 );
1146 
1147 	nl->prev_rxl_rcvd = nl->cur_rxl_rcvd;
1148 	nl->cur_rxl_rcvd  = 0;
1149 }
1150 
1151 /* -------------------------------------------------------------------------- */
1152 
1153 /*
1154  *	Open/initialize the board.
1155  */
1156 
1157 static int
sbni_open(struct net_device * dev)1158 sbni_open( struct net_device  *dev )
1159 {
1160 	struct net_local	*nl = netdev_priv(dev);
1161 	struct timer_list	*w  = &nl->watchdog;
1162 
1163 	/*
1164 	 * For double ISA adapters within "common irq" mode, we have to
1165 	 * determine whether primary or secondary channel is initialized,
1166 	 * and set the irq handler only in first case.
1167 	 */
1168 	if( dev->base_addr < 0x400 ) {		/* ISA only */
1169 		struct net_device  **p = sbni_cards;
1170 		for( ;  *p  &&  p < sbni_cards + SBNI_MAX_NUM_CARDS;  ++p )
1171 			if( (*p)->irq == dev->irq &&
1172 			    ((*p)->base_addr == dev->base_addr + 4 ||
1173 			     (*p)->base_addr == dev->base_addr - 4) &&
1174 			    (*p)->flags & IFF_UP ) {
1175 
1176 				((struct net_local *) (netdev_priv(*p)))
1177 					->second = dev;
1178 				netdev_notice(dev, "using shared irq with %s\n",
1179 					      (*p)->name);
1180 				nl->state |= FL_SECONDARY;
1181 				goto  handler_attached;
1182 			}
1183 	}
1184 
1185 	if( request_irq(dev->irq, sbni_interrupt, IRQF_SHARED, dev->name, dev) ) {
1186 		netdev_err(dev, "unable to get IRQ %d\n", dev->irq);
1187 		return  -EAGAIN;
1188 	}
1189 
1190 handler_attached:
1191 
1192 	spin_lock( &nl->lock );
1193 	memset( &dev->stats, 0, sizeof(struct net_device_stats) );
1194 	memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) );
1195 
1196 	card_start( dev );
1197 
1198 	netif_start_queue( dev );
1199 
1200 	/* set timer watchdog */
1201 	init_timer( w );
1202 	w->expires	= jiffies + SBNI_TIMEOUT;
1203 	w->data		= (unsigned long) dev;
1204 	w->function	= sbni_watchdog;
1205 	add_timer( w );
1206 
1207 	spin_unlock( &nl->lock );
1208 	return 0;
1209 }
1210 
1211 
1212 static int
sbni_close(struct net_device * dev)1213 sbni_close( struct net_device  *dev )
1214 {
1215 	struct net_local  *nl = netdev_priv(dev);
1216 
1217 	if( nl->second  &&  nl->second->flags & IFF_UP ) {
1218 		netdev_notice(dev, "Secondary channel (%s) is active!\n",
1219 			      nl->second->name);
1220 		return  -EBUSY;
1221 	}
1222 
1223 #ifdef CONFIG_SBNI_MULTILINE
1224 	if( nl->state & FL_SLAVE )
1225 		emancipate( dev );
1226 	else
1227 		while( nl->link )	/* it's master device! */
1228 			emancipate( nl->link );
1229 #endif
1230 
1231 	spin_lock( &nl->lock );
1232 
1233 	nl->second = NULL;
1234 	drop_xmit_queue( dev );
1235 	netif_stop_queue( dev );
1236 
1237 	del_timer( &nl->watchdog );
1238 
1239 	outb( 0, dev->base_addr + CSR0 );
1240 
1241 	if( !(nl->state & FL_SECONDARY) )
1242 		free_irq( dev->irq, dev );
1243 	nl->state &= FL_SECONDARY;
1244 
1245 	spin_unlock( &nl->lock );
1246 	return 0;
1247 }
1248 
1249 
1250 /*
1251 	Valid combinations in CSR0 (for probing):
1252 
1253 	VALID_DECODER	0000,0011,1011,1010
1254 
1255 				    	; 0   ; -
1256 				TR_REQ	; 1   ; +
1257 			TR_RDY	    	; 2   ; -
1258 			TR_RDY	TR_REQ	; 3   ; +
1259 		BU_EMP		    	; 4   ; +
1260 		BU_EMP	     	TR_REQ	; 5   ; +
1261 		BU_EMP	TR_RDY	    	; 6   ; -
1262 		BU_EMP	TR_RDY	TR_REQ	; 7   ; +
1263 	RC_RDY 		     		; 8   ; +
1264 	RC_RDY			TR_REQ	; 9   ; +
1265 	RC_RDY		TR_RDY		; 10  ; -
1266 	RC_RDY		TR_RDY	TR_REQ	; 11  ; -
1267 	RC_RDY	BU_EMP			; 12  ; -
1268 	RC_RDY	BU_EMP		TR_REQ	; 13  ; -
1269 	RC_RDY	BU_EMP	TR_RDY		; 14  ; -
1270 	RC_RDY	BU_EMP	TR_RDY	TR_REQ	; 15  ; -
1271 */
1272 
1273 #define VALID_DECODER (2 + 8 + 0x10 + 0x20 + 0x80 + 0x100 + 0x200)
1274 
1275 
1276 static int
sbni_card_probe(unsigned long ioaddr)1277 sbni_card_probe( unsigned long  ioaddr )
1278 {
1279 	unsigned char  csr0;
1280 
1281 	csr0 = inb( ioaddr + CSR0 );
1282 	if( csr0 != 0xff  &&  csr0 != 0x00 ) {
1283 		csr0 &= ~EN_INT;
1284 		if( csr0 & BU_EMP )
1285 			csr0 |= EN_INT;
1286 
1287 		if( VALID_DECODER & (1 << (csr0 >> 4)) )
1288 			return  0;
1289 	}
1290 
1291 	return  -ENODEV;
1292 }
1293 
1294 /* -------------------------------------------------------------------------- */
1295 
1296 static int
sbni_ioctl(struct net_device * dev,struct ifreq * ifr,int cmd)1297 sbni_ioctl( struct net_device  *dev,  struct ifreq  *ifr,  int  cmd )
1298 {
1299 	struct net_local  *nl = netdev_priv(dev);
1300 	struct sbni_flags  flags;
1301 	int  error = 0;
1302 
1303 #ifdef CONFIG_SBNI_MULTILINE
1304 	struct net_device  *slave_dev;
1305 	char  slave_name[ 8 ];
1306 #endif
1307 
1308 	switch( cmd ) {
1309 	case  SIOCDEVGETINSTATS :
1310 		if (copy_to_user( ifr->ifr_data, &nl->in_stats,
1311 					sizeof(struct sbni_in_stats) ))
1312 			error = -EFAULT;
1313 		break;
1314 
1315 	case  SIOCDEVRESINSTATS :
1316 		if (!capable(CAP_NET_ADMIN))
1317 			return  -EPERM;
1318 		memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) );
1319 		break;
1320 
1321 	case  SIOCDEVGHWSTATE :
1322 		flags.mac_addr	= *(u32 *)(dev->dev_addr + 3);
1323 		flags.rate	= nl->csr1.rate;
1324 		flags.slow_mode	= (nl->state & FL_SLOW_MODE) != 0;
1325 		flags.rxl	= nl->cur_rxl_index;
1326 		flags.fixed_rxl	= nl->delta_rxl == 0;
1327 
1328 		if (copy_to_user( ifr->ifr_data, &flags, sizeof flags ))
1329 			error = -EFAULT;
1330 		break;
1331 
1332 	case  SIOCDEVSHWSTATE :
1333 		if (!capable(CAP_NET_ADMIN))
1334 			return  -EPERM;
1335 
1336 		spin_lock( &nl->lock );
1337 		flags = *(struct sbni_flags*) &ifr->ifr_ifru;
1338 		if( flags.fixed_rxl )
1339 			nl->delta_rxl = 0,
1340 			nl->cur_rxl_index = flags.rxl;
1341 		else
1342 			nl->delta_rxl = DEF_RXL_DELTA,
1343 			nl->cur_rxl_index = DEF_RXL;
1344 
1345 		nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ];
1346 		nl->csr1.rate = flags.rate;
1347 		outb( *(u8 *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 );
1348 		spin_unlock( &nl->lock );
1349 		break;
1350 
1351 #ifdef CONFIG_SBNI_MULTILINE
1352 
1353 	case  SIOCDEVENSLAVE :
1354 		if (!capable(CAP_NET_ADMIN))
1355 			return  -EPERM;
1356 
1357 		if (copy_from_user( slave_name, ifr->ifr_data, sizeof slave_name ))
1358 			return -EFAULT;
1359 		slave_dev = dev_get_by_name(&init_net, slave_name );
1360 		if( !slave_dev  ||  !(slave_dev->flags & IFF_UP) ) {
1361 			netdev_err(dev, "trying to enslave non-active device %s\n",
1362 				   slave_name);
1363 			return  -EPERM;
1364 		}
1365 
1366 		return  enslave( dev, slave_dev );
1367 
1368 	case  SIOCDEVEMANSIPATE :
1369 		if (!capable(CAP_NET_ADMIN))
1370 			return  -EPERM;
1371 
1372 		return  emancipate( dev );
1373 
1374 #endif	/* CONFIG_SBNI_MULTILINE */
1375 
1376 	default :
1377 		return  -EOPNOTSUPP;
1378 	}
1379 
1380 	return  error;
1381 }
1382 
1383 
1384 #ifdef CONFIG_SBNI_MULTILINE
1385 
1386 static int
enslave(struct net_device * dev,struct net_device * slave_dev)1387 enslave( struct net_device  *dev,  struct net_device  *slave_dev )
1388 {
1389 	struct net_local  *nl  = netdev_priv(dev);
1390 	struct net_local  *snl = netdev_priv(slave_dev);
1391 
1392 	if( nl->state & FL_SLAVE )	/* This isn't master or free device */
1393 		return  -EBUSY;
1394 
1395 	if( snl->state & FL_SLAVE )	/* That was already enslaved */
1396 		return  -EBUSY;
1397 
1398 	spin_lock( &nl->lock );
1399 	spin_lock( &snl->lock );
1400 
1401 	/* append to list */
1402 	snl->link = nl->link;
1403 	nl->link  = slave_dev;
1404 	snl->master = dev;
1405 	snl->state |= FL_SLAVE;
1406 
1407 	/* Summary statistics of MultiLine operation will be stored
1408 	   in master's counters */
1409 	memset( &slave_dev->stats, 0, sizeof(struct net_device_stats) );
1410 	netif_stop_queue( slave_dev );
1411 	netif_wake_queue( dev );	/* Now we are able to transmit */
1412 
1413 	spin_unlock( &snl->lock );
1414 	spin_unlock( &nl->lock );
1415 	netdev_notice(dev, "slave device (%s) attached\n", slave_dev->name);
1416 	return  0;
1417 }
1418 
1419 
1420 static int
emancipate(struct net_device * dev)1421 emancipate( struct net_device  *dev )
1422 {
1423 	struct net_local   *snl = netdev_priv(dev);
1424 	struct net_device  *p   = snl->master;
1425 	struct net_local   *nl  = netdev_priv(p);
1426 
1427 	if( !(snl->state & FL_SLAVE) )
1428 		return  -EINVAL;
1429 
1430 	spin_lock( &nl->lock );
1431 	spin_lock( &snl->lock );
1432 	drop_xmit_queue( dev );
1433 
1434 	/* exclude from list */
1435 	for(;;) {	/* must be in list */
1436 		struct net_local  *t = netdev_priv(p);
1437 		if( t->link == dev ) {
1438 			t->link = snl->link;
1439 			break;
1440 		}
1441 		p = t->link;
1442 	}
1443 
1444 	snl->link = NULL;
1445 	snl->master = dev;
1446 	snl->state &= ~FL_SLAVE;
1447 
1448 	netif_start_queue( dev );
1449 
1450 	spin_unlock( &snl->lock );
1451 	spin_unlock( &nl->lock );
1452 
1453 	dev_put( dev );
1454 	return  0;
1455 }
1456 
1457 #endif
1458 
1459 static void
set_multicast_list(struct net_device * dev)1460 set_multicast_list( struct net_device  *dev )
1461 {
1462 	return;		/* sbni always operate in promiscuos mode */
1463 }
1464 
1465 
1466 #ifdef MODULE
1467 module_param_array(io, int, NULL, 0);
1468 module_param_array(irq, int, NULL, 0);
1469 module_param_array(baud, int, NULL, 0);
1470 module_param_array(rxl, int, NULL, 0);
1471 module_param_array(mac, int, NULL, 0);
1472 module_param(skip_pci_probe, bool, 0);
1473 
1474 MODULE_LICENSE("GPL");
1475 
1476 
init_module(void)1477 int __init init_module( void )
1478 {
1479 	struct net_device  *dev;
1480 	int err;
1481 
1482 	while( num < SBNI_MAX_NUM_CARDS ) {
1483 		dev = alloc_netdev(sizeof(struct net_local),
1484 				   "sbni%d", sbni_devsetup);
1485 		if( !dev)
1486 			break;
1487 
1488 		sprintf( dev->name, "sbni%d", num );
1489 
1490 		err = sbni_init(dev);
1491 		if (err) {
1492 			free_netdev(dev);
1493 			break;
1494 		}
1495 
1496 		if( register_netdev( dev ) ) {
1497 			release_region( dev->base_addr, SBNI_IO_EXTENT );
1498 			free_netdev( dev );
1499 			break;
1500 		}
1501 	}
1502 
1503 	return  *sbni_cards  ?  0  :  -ENODEV;
1504 }
1505 
1506 void
cleanup_module(void)1507 cleanup_module(void)
1508 {
1509 	int i;
1510 
1511 	for (i = 0;  i < SBNI_MAX_NUM_CARDS;  ++i) {
1512 		struct net_device *dev = sbni_cards[i];
1513 		if (dev != NULL) {
1514 			unregister_netdev(dev);
1515 			release_region(dev->base_addr, SBNI_IO_EXTENT);
1516 			free_netdev(dev);
1517 		}
1518 	}
1519 }
1520 
1521 #else	/* MODULE */
1522 
1523 static int __init
sbni_setup(char * p)1524 sbni_setup( char  *p )
1525 {
1526 	int  n, parm;
1527 
1528 	if( *p++ != '(' )
1529 		goto  bad_param;
1530 
1531 	for( n = 0, parm = 0;  *p  &&  n < 8; ) {
1532 		(*dest[ parm ])[ n ] = simple_strtol( p, &p, 0 );
1533 		if( !*p  ||  *p == ')' )
1534 			return 1;
1535 		if( *p == ';' )
1536 			++p, ++n, parm = 0;
1537 		else if( *p++ != ',' )
1538 			break;
1539 		else
1540 			if( ++parm >= 5 )
1541 				break;
1542 	}
1543 bad_param:
1544 	pr_err("Error in sbni kernel parameter!\n");
1545 	return 0;
1546 }
1547 
1548 __setup( "sbni=", sbni_setup );
1549 
1550 #endif	/* MODULE */
1551 
1552 /* -------------------------------------------------------------------------- */
1553 
1554 #ifdef ASM_CRC
1555 
1556 static u32
calc_crc32(u32 crc,u8 * p,u32 len)1557 calc_crc32( u32  crc,  u8  *p,  u32  len )
1558 {
1559 	register u32  _crc;
1560 	_crc = crc;
1561 
1562 	__asm__ __volatile__ (
1563 		"xorl	%%ebx, %%ebx\n"
1564 		"movl	%2, %%esi\n"
1565 		"movl	%3, %%ecx\n"
1566 		"movl	$crc32tab, %%edi\n"
1567 		"shrl	$2, %%ecx\n"
1568 		"jz	1f\n"
1569 
1570 		".align 4\n"
1571 	"0:\n"
1572 		"movb	%%al, %%bl\n"
1573 		"movl	(%%esi), %%edx\n"
1574 		"shrl	$8, %%eax\n"
1575 		"xorb	%%dl, %%bl\n"
1576 		"shrl	$8, %%edx\n"
1577 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1578 
1579 		"movb	%%al, %%bl\n"
1580 		"shrl	$8, %%eax\n"
1581 		"xorb	%%dl, %%bl\n"
1582 		"shrl	$8, %%edx\n"
1583 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1584 
1585 		"movb	%%al, %%bl\n"
1586 		"shrl	$8, %%eax\n"
1587 		"xorb	%%dl, %%bl\n"
1588 		"movb	%%dh, %%dl\n"
1589 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1590 
1591 		"movb	%%al, %%bl\n"
1592 		"shrl	$8, %%eax\n"
1593 		"xorb	%%dl, %%bl\n"
1594 		"addl	$4, %%esi\n"
1595 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1596 
1597 		"decl	%%ecx\n"
1598 		"jnz	0b\n"
1599 
1600 	"1:\n"
1601 		"movl	%3, %%ecx\n"
1602 		"andl	$3, %%ecx\n"
1603 		"jz	2f\n"
1604 
1605 		"movb	%%al, %%bl\n"
1606 		"shrl	$8, %%eax\n"
1607 		"xorb	(%%esi), %%bl\n"
1608 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1609 
1610 		"decl	%%ecx\n"
1611 		"jz	2f\n"
1612 
1613 		"movb	%%al, %%bl\n"
1614 		"shrl	$8, %%eax\n"
1615 		"xorb	1(%%esi), %%bl\n"
1616 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1617 
1618 		"decl	%%ecx\n"
1619 		"jz	2f\n"
1620 
1621 		"movb	%%al, %%bl\n"
1622 		"shrl	$8, %%eax\n"
1623 		"xorb	2(%%esi), %%bl\n"
1624 		"xorl	(%%edi,%%ebx,4), %%eax\n"
1625 	"2:\n"
1626 		: "=a" (_crc)
1627 		: "0" (_crc), "g" (p), "g" (len)
1628 		: "bx", "cx", "dx", "si", "di"
1629 	);
1630 
1631 	return  _crc;
1632 }
1633 
1634 #else	/* ASM_CRC */
1635 
1636 static u32
calc_crc32(u32 crc,u8 * p,u32 len)1637 calc_crc32( u32  crc,  u8  *p,  u32  len )
1638 {
1639 	while( len-- )
1640 		crc = CRC32( *p++, crc );
1641 
1642 	return  crc;
1643 }
1644 
1645 #endif	/* ASM_CRC */
1646 
1647 
1648 static u32  crc32tab[] __attribute__ ((aligned(8))) = {
1649 	0xD202EF8D,  0xA505DF1B,  0x3C0C8EA1,  0x4B0BBE37,
1650 	0xD56F2B94,  0xA2681B02,  0x3B614AB8,  0x4C667A2E,
1651 	0xDCD967BF,  0xABDE5729,  0x32D70693,  0x45D03605,
1652 	0xDBB4A3A6,  0xACB39330,  0x35BAC28A,  0x42BDF21C,
1653 	0xCFB5FFE9,  0xB8B2CF7F,  0x21BB9EC5,  0x56BCAE53,
1654 	0xC8D83BF0,  0xBFDF0B66,  0x26D65ADC,  0x51D16A4A,
1655 	0xC16E77DB,  0xB669474D,  0x2F6016F7,  0x58672661,
1656 	0xC603B3C2,  0xB1048354,  0x280DD2EE,  0x5F0AE278,
1657 	0xE96CCF45,  0x9E6BFFD3,  0x0762AE69,  0x70659EFF,
1658 	0xEE010B5C,  0x99063BCA,  0x000F6A70,  0x77085AE6,
1659 	0xE7B74777,  0x90B077E1,  0x09B9265B,  0x7EBE16CD,
1660 	0xE0DA836E,  0x97DDB3F8,  0x0ED4E242,  0x79D3D2D4,
1661 	0xF4DBDF21,  0x83DCEFB7,  0x1AD5BE0D,  0x6DD28E9B,
1662 	0xF3B61B38,  0x84B12BAE,  0x1DB87A14,  0x6ABF4A82,
1663 	0xFA005713,  0x8D076785,  0x140E363F,  0x630906A9,
1664 	0xFD6D930A,  0x8A6AA39C,  0x1363F226,  0x6464C2B0,
1665 	0xA4DEAE1D,  0xD3D99E8B,  0x4AD0CF31,  0x3DD7FFA7,
1666 	0xA3B36A04,  0xD4B45A92,  0x4DBD0B28,  0x3ABA3BBE,
1667 	0xAA05262F,  0xDD0216B9,  0x440B4703,  0x330C7795,
1668 	0xAD68E236,  0xDA6FD2A0,  0x4366831A,  0x3461B38C,
1669 	0xB969BE79,  0xCE6E8EEF,  0x5767DF55,  0x2060EFC3,
1670 	0xBE047A60,  0xC9034AF6,  0x500A1B4C,  0x270D2BDA,
1671 	0xB7B2364B,  0xC0B506DD,  0x59BC5767,  0x2EBB67F1,
1672 	0xB0DFF252,  0xC7D8C2C4,  0x5ED1937E,  0x29D6A3E8,
1673 	0x9FB08ED5,  0xE8B7BE43,  0x71BEEFF9,  0x06B9DF6F,
1674 	0x98DD4ACC,  0xEFDA7A5A,  0x76D32BE0,  0x01D41B76,
1675 	0x916B06E7,  0xE66C3671,  0x7F6567CB,  0x0862575D,
1676 	0x9606C2FE,  0xE101F268,  0x7808A3D2,  0x0F0F9344,
1677 	0x82079EB1,  0xF500AE27,  0x6C09FF9D,  0x1B0ECF0B,
1678 	0x856A5AA8,  0xF26D6A3E,  0x6B643B84,  0x1C630B12,
1679 	0x8CDC1683,  0xFBDB2615,  0x62D277AF,  0x15D54739,
1680 	0x8BB1D29A,  0xFCB6E20C,  0x65BFB3B6,  0x12B88320,
1681 	0x3FBA6CAD,  0x48BD5C3B,  0xD1B40D81,  0xA6B33D17,
1682 	0x38D7A8B4,  0x4FD09822,  0xD6D9C998,  0xA1DEF90E,
1683 	0x3161E49F,  0x4666D409,  0xDF6F85B3,  0xA868B525,
1684 	0x360C2086,  0x410B1010,  0xD80241AA,  0xAF05713C,
1685 	0x220D7CC9,  0x550A4C5F,  0xCC031DE5,  0xBB042D73,
1686 	0x2560B8D0,  0x52678846,  0xCB6ED9FC,  0xBC69E96A,
1687 	0x2CD6F4FB,  0x5BD1C46D,  0xC2D895D7,  0xB5DFA541,
1688 	0x2BBB30E2,  0x5CBC0074,  0xC5B551CE,  0xB2B26158,
1689 	0x04D44C65,  0x73D37CF3,  0xEADA2D49,  0x9DDD1DDF,
1690 	0x03B9887C,  0x74BEB8EA,  0xEDB7E950,  0x9AB0D9C6,
1691 	0x0A0FC457,  0x7D08F4C1,  0xE401A57B,  0x930695ED,
1692 	0x0D62004E,  0x7A6530D8,  0xE36C6162,  0x946B51F4,
1693 	0x19635C01,  0x6E646C97,  0xF76D3D2D,  0x806A0DBB,
1694 	0x1E0E9818,  0x6909A88E,  0xF000F934,  0x8707C9A2,
1695 	0x17B8D433,  0x60BFE4A5,  0xF9B6B51F,  0x8EB18589,
1696 	0x10D5102A,  0x67D220BC,  0xFEDB7106,  0x89DC4190,
1697 	0x49662D3D,  0x3E611DAB,  0xA7684C11,  0xD06F7C87,
1698 	0x4E0BE924,  0x390CD9B2,  0xA0058808,  0xD702B89E,
1699 	0x47BDA50F,  0x30BA9599,  0xA9B3C423,  0xDEB4F4B5,
1700 	0x40D06116,  0x37D75180,  0xAEDE003A,  0xD9D930AC,
1701 	0x54D13D59,  0x23D60DCF,  0xBADF5C75,  0xCDD86CE3,
1702 	0x53BCF940,  0x24BBC9D6,  0xBDB2986C,  0xCAB5A8FA,
1703 	0x5A0AB56B,  0x2D0D85FD,  0xB404D447,  0xC303E4D1,
1704 	0x5D677172,  0x2A6041E4,  0xB369105E,  0xC46E20C8,
1705 	0x72080DF5,  0x050F3D63,  0x9C066CD9,  0xEB015C4F,
1706 	0x7565C9EC,  0x0262F97A,  0x9B6BA8C0,  0xEC6C9856,
1707 	0x7CD385C7,  0x0BD4B551,  0x92DDE4EB,  0xE5DAD47D,
1708 	0x7BBE41DE,  0x0CB97148,  0x95B020F2,  0xE2B71064,
1709 	0x6FBF1D91,  0x18B82D07,  0x81B17CBD,  0xF6B64C2B,
1710 	0x68D2D988,  0x1FD5E91E,  0x86DCB8A4,  0xF1DB8832,
1711 	0x616495A3,  0x1663A535,  0x8F6AF48F,  0xF86DC419,
1712 	0x660951BA,  0x110E612C,  0x88073096,  0xFF000000
1713 };
1714 
1715