Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sbni.c
Go to the documentation of this file.
1 /* sbni.c: Granch SBNI12 leased line adapters driver for linux
2  *
3  * Written 2001 by Denis I.Timofeev ([email protected])
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 {
73 
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 */
170  { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
173 static u32 rxl[ SBNI_MAX_NUM_CARDS ] __initdata =
174  { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
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
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 
222 static void __init sbni_devsetup(struct net_device *dev)
223 {
224  ether_setup( dev );
225  dev->netdev_ops = &sbni_netdev_ops;
226 }
227 
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);
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) {
251  free_netdev(dev);
252  return err;
253  }
254  pr_info_once("%s", version);
255  return 0;
256 }
257 
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
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
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 ) */
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
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
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
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
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 
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
592 recv_frame( struct net_device *dev )
593 {
594  struct net_local *nl = netdev_priv(dev);
595  unsigned long ioaddr = dev->base_addr;
596 
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
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
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
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
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
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
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
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
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
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
873 drop_xmit_queue( struct net_device *dev )
874 {
875  struct net_local *nl = netdev_priv(dev);
876 
877  if( 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
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
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
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 *
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
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
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
1089 card_start( struct net_device *dev )
1090 {
1091  struct net_local *nl = netdev_priv(dev);
1092 
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
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
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
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
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
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
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
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
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
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 
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 ) ) {
1498  free_netdev( dev );
1499  break;
1500  }
1501  }
1502 
1503  return *sbni_cards ? 0 : -ENODEV;
1504 }
1505 
1506 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);
1516  free_netdev(dev);
1517  }
1518  }
1519 }
1520 
1521 #else /* MODULE */
1522 
1523 static int __init
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
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
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