sbni.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:43k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. #include <linux/module.h>
  40. #include <linux/kernel.h>
  41. #include <linux/sched.h>
  42. #include <linux/ptrace.h>
  43. #include <linux/fcntl.h>
  44. #include <linux/ioport.h>
  45. #include <linux/interrupt.h>
  46. #include <linux/slab.h>
  47. #include <linux/string.h>
  48. #include <linux/errno.h>
  49. #include <asm/io.h>
  50. #include <asm/types.h>
  51. #include <asm/byteorder.h>
  52. #include <asm/irq.h>
  53. #include <asm/uaccess.h>
  54. #include <linux/netdevice.h>
  55. #include <linux/etherdevice.h>
  56. #include <linux/skbuff.h>
  57. #include <linux/timer.h>
  58. #include <linux/init.h>
  59. #include <net/arp.h>
  60. #include <linux/pci.h>
  61. #ifndef MODULE
  62. #include <linux/string.h>
  63. #endif
  64. #include <linux/config.h>
  65. #include "sbni.h"
  66. /* device private data */
  67. struct net_local {
  68. struct net_device_stats stats;
  69. struct timer_list watchdog;
  70. spinlock_t lock;
  71. struct sk_buff  *rx_buf_p; /* receive buffer ptr */
  72. struct sk_buff  *tx_buf_p; /* transmit buffer ptr */
  73. unsigned int framelen; /* current frame length */
  74. unsigned int maxframe; /* maximum valid frame length */
  75. unsigned int state;
  76. unsigned int inppos, outpos; /* positions in rx/tx buffers */
  77. /* transmitting frame number - from frames qty to 1 */
  78. unsigned int tx_frameno;
  79. /* expected number of next receiving frame */
  80. unsigned int wait_frameno;
  81. /* count of failed attempts to frame send - 32 attempts do before
  82.    error - while receiver tunes on opposite side of wire */
  83. unsigned int trans_errors;
  84. /* idle time; send pong when limit exceeded */
  85. unsigned int timer_ticks;
  86. /* fields used for receive level autoselection */
  87. int delta_rxl;
  88. unsigned int cur_rxl_index, timeout_rxl;
  89. unsigned long cur_rxl_rcvd, prev_rxl_rcvd;
  90. struct sbni_csr1 csr1; /* current value of CSR1 */
  91. struct sbni_in_stats in_stats;  /* internal statistics */ 
  92. struct net_device *second; /* for ISA/dual cards */
  93. #ifdef CONFIG_SBNI_MULTILINE
  94. struct net_device *master;
  95. struct net_device *link;
  96. #endif
  97. };
  98. static int  sbni_card_probe( unsigned long );
  99. static int  sbni_pci_probe( struct net_device  * );
  100. static struct net_device  *sbni_probe1(struct net_device *, unsigned long, int);
  101. static int  sbni_open( struct net_device * );
  102. static int  sbni_close( struct net_device * );
  103. static int  sbni_start_xmit( struct sk_buff *, struct net_device * );
  104. static int  sbni_ioctl( struct net_device *, struct ifreq *, int );
  105. static struct net_device_stats  *sbni_get_stats( struct net_device * );
  106. static void  set_multicast_list( struct net_device * );
  107. static void  sbni_interrupt( int, void *, struct pt_regs * );
  108. static void  handle_channel( struct net_device * );
  109. static int   recv_frame( struct net_device * );
  110. static void  send_frame( struct net_device * );
  111. static int   upload_data( struct net_device *,
  112.   unsigned, unsigned, unsigned, u32 );
  113. static void  download_data( struct net_device *, u32 * );
  114. static void  sbni_watchdog( unsigned long );
  115. static void  interpret_ack( struct net_device *, unsigned );
  116. static int   append_frame_to_pkt( struct net_device *, unsigned, u32 );
  117. static void  indicate_pkt( struct net_device * );
  118. static void  card_start( struct net_device * );
  119. static void  prepare_to_send( struct sk_buff *, struct net_device * );
  120. static void  drop_xmit_queue( struct net_device * );
  121. static void  send_frame_header( struct net_device *, u32 * );
  122. static int   skip_tail( unsigned int, unsigned int, u32 );
  123. static int   check_fhdr( u32, u32 *, u32 *, u32 *, u32 *, u32 * );
  124. static void  change_level( struct net_device * );
  125. static void  timeout_change_level( struct net_device * );
  126. static u32   calc_crc32( u32, u8 *, u32 );
  127. static struct sk_buff *  get_rx_buf( struct net_device * );
  128. #ifdef CONFIG_SBNI_MULTILINE
  129. static int  enslave( struct net_device *, struct net_device * );
  130. static int  emancipate( struct net_device * );
  131. #endif
  132. #ifdef __i386__
  133. #define ASM_CRC 1
  134. #endif
  135. static const char  version[] =
  136. "Granch SBNI12 driver ver 5.0.1  Jun 22 2001  Denis I.Timofeev.n";
  137. static int  skip_pci_probe __initdata = 0;
  138. static int  scandone __initdata = 0;
  139. static int  num __initdata = 0;
  140. static unsigned char  rxl_tab[];
  141. static u32  crc32tab[];
  142. /* A list of all installed devices, for removing the driver module. */
  143. static struct net_device  *sbni_cards[ SBNI_MAX_NUM_CARDS ];
  144. /* Lists of device's parameters */
  145. static u32 io[   SBNI_MAX_NUM_CARDS ] __initdata =
  146. { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
  147. static u32 irq[  SBNI_MAX_NUM_CARDS ] __initdata;
  148. static u32 baud[ SBNI_MAX_NUM_CARDS ] __initdata;
  149. static u32 rxl[  SBNI_MAX_NUM_CARDS ] __initdata =
  150. { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
  151. static u32 mac[  SBNI_MAX_NUM_CARDS ] __initdata;
  152. #ifndef MODULE
  153. typedef u32  iarr[];
  154. static iarr  *dest[5] = { &io, &irq, &baud, &rxl, &mac };
  155. #endif
  156. /* A zero-terminated list of I/O addresses to be probed on ISA bus */
  157. static unsigned int  netcard_portlist[ ] __initdata = { 
  158. 0x210, 0x214, 0x220, 0x224, 0x230, 0x234, 0x240, 0x244, 0x250, 0x254,
  159. 0x260, 0x264, 0x270, 0x274, 0x280, 0x284, 0x290, 0x294, 0x2a0, 0x2a4,
  160. 0x2b0, 0x2b4, 0x2c0, 0x2c4, 0x2d0, 0x2d4, 0x2e0, 0x2e4, 0x2f0, 0x2f4,
  161. 0 };
  162. /*
  163.  * Look for SBNI card which addr stored in dev->base_addr, if nonzero.
  164.  * Otherwise, look through PCI bus. If none PCI-card was found, scan ISA.
  165.  */
  166. static inline int __init
  167. sbni_isa_probe( struct net_device  *dev )
  168. {
  169. if( dev->base_addr > 0x1ff
  170.     &&  !check_region( dev->base_addr, SBNI_IO_EXTENT )
  171.     &&  sbni_probe1( dev, dev->base_addr, dev->irq ) )
  172. return  0;
  173. else {
  174. printk( KERN_ERR "sbni: base address 0x%lx is busy, or adapter "
  175. "is malfunctional!n", dev->base_addr );
  176. return  -ENODEV;
  177. }
  178. }
  179. int __init
  180. sbni_probe( struct net_device  *dev )
  181. {
  182. int  i;
  183. static unsigned  version_printed __initdata = 0;
  184. if( version_printed++ == 0 )
  185. printk( KERN_INFO "%s", version );
  186. if( !dev ) { /* simple sanity check */
  187. printk( KERN_ERR "sbni: NULL device!n" );
  188. return  -ENODEV;
  189. }
  190. SET_MODULE_OWNER( dev );
  191. if( dev->base_addr )
  192. return  sbni_isa_probe( dev );
  193. /* otherwise we have to perform search our adapter */
  194. if( io[ num ] != -1 )
  195. dev->base_addr = io[ num ],
  196. dev->irq = irq[ num ];
  197. else if( scandone  ||  io[ 0 ] != -1 )
  198. return  -ENODEV;
  199. /* if io[ num ] contains non-zero address, then that is on ISA bus */
  200. if( dev->base_addr )
  201. return  sbni_isa_probe( dev );
  202. /* ...otherwise - scan PCI first */
  203. if( !skip_pci_probe  &&  !sbni_pci_probe( dev ) )
  204. return  0;
  205. if( io[ num ] == -1 ) {
  206. /* Auto-scan will be stopped when first ISA card were found */
  207. scandone = 1;
  208. if( num > 0 )
  209. return  -ENODEV;
  210. }
  211. for( i = 0;  netcard_portlist[ i ];  ++i ) {
  212. int  ioaddr = netcard_portlist[ i ];
  213. if( !check_region( ioaddr, SBNI_IO_EXTENT )
  214.     &&  sbni_probe1( dev, ioaddr, 0 ))
  215. return 0;
  216. }
  217. return  -ENODEV;
  218. }
  219. int __init
  220. sbni_pci_probe( struct net_device  *dev )
  221. {
  222. struct pci_dev  *pdev = NULL;
  223. if( !pci_present( ) )
  224. return  -ENODEV;
  225. while( (pdev = pci_find_class( PCI_CLASS_NETWORK_OTHER << 8, pdev ))
  226.        != NULL ) {
  227. int  pci_irq_line;
  228. unsigned long  pci_ioaddr;
  229. u16  subsys;
  230. if( pdev->vendor != SBNI_PCI_VENDOR
  231.     &&  pdev->device != SBNI_PCI_DEVICE )
  232. continue;
  233. pci_ioaddr = pci_resource_start( pdev, 0 );
  234. pci_irq_line = pdev->irq;
  235. /* Avoid already found cards from previous calls */
  236. if( check_region( pci_ioaddr, SBNI_IO_EXTENT ) ) {
  237. pci_read_config_word( pdev, PCI_SUBSYSTEM_ID, &subsys );
  238. if( subsys != 2  || /* Dual adapter is present */
  239.     check_region( pci_ioaddr += 4, SBNI_IO_EXTENT ) )
  240. continue;
  241. }
  242. if( pci_irq_line <= 0  ||  pci_irq_line >= NR_IRQS )
  243. printk( KERN_WARNING "  WARNING: The PCI BIOS assigned "
  244. "this PCI card to IRQ %d, which is unlikely "
  245. "to work!.n"
  246. KERN_WARNING " You should use the PCI BIOS "
  247. "setup to assign a valid IRQ line.n",
  248. pci_irq_line );
  249. /* avoiding re-enable dual adapters */
  250. if( (pci_ioaddr & 7) == 0  &&  pci_enable_device( pdev ) )
  251. return  -EIO;
  252. if( sbni_probe1( dev, pci_ioaddr, pci_irq_line ) )
  253. return  0;
  254. }
  255. return  -ENODEV;
  256. }
  257. static struct net_device * __init
  258. sbni_probe1( struct net_device  *dev,  unsigned long  ioaddr,  int  irq )
  259. {
  260. struct net_local  *nl;
  261. if( !request_region( ioaddr, SBNI_IO_EXTENT, dev->name ) )
  262. return  0;
  263. if( sbni_card_probe( ioaddr ) ) {
  264. release_region( ioaddr, SBNI_IO_EXTENT );
  265. return  0;
  266. }
  267. outb( 0, ioaddr + CSR0 );
  268. if( irq < 2 ) {
  269. autoirq_setup( 5 );
  270. outb( EN_INT | TR_REQ, ioaddr + CSR0 );
  271. outb( PR_RES, ioaddr + CSR1 );
  272. irq = autoirq_report( 5 );
  273. outb( 0, ioaddr + CSR0 );
  274. if( !irq ) {
  275. printk( KERN_ERR "%s: can't detect device irq!n",
  276. dev->name );
  277. release_region( ioaddr, SBNI_IO_EXTENT );
  278. return  0;
  279. }
  280. } else if( irq == 2 )
  281. irq = 9;
  282. dev->irq = irq;
  283. dev->base_addr = ioaddr;
  284. /* Allocate dev->priv and fill in sbni-specific dev fields. */
  285. nl = (struct net_local *) kmalloc(sizeof(struct net_local), GFP_KERNEL);
  286. if( !nl ) {
  287. printk( KERN_ERR "%s: unable to get memory!n", dev->name );
  288. release_region( ioaddr, SBNI_IO_EXTENT );
  289. return  0;
  290. }
  291. dev->priv = nl;
  292. memset( nl, 0, sizeof(struct net_local) );
  293. spin_lock_init( &nl->lock );
  294. /* store MAC address (generate if that isn't known) */
  295. *(u16 *)dev->dev_addr = htons( 0x00ff );
  296. *(u32 *)(dev->dev_addr + 2) = htonl( 0x01000000 |
  297. ( (mac[num]  ?  mac[num]  :  (u32)((long)dev->priv)) & 0x00ffffff) );
  298. /* store link settings (speed, receive level ) */
  299. nl->maxframe  = DEFAULT_FRAME_LEN;
  300. nl->csr1.rate = baud[ num ];
  301. if( (nl->cur_rxl_index = rxl[ num ]) == -1 )
  302. /* autotune rxl */
  303. nl->cur_rxl_index = DEF_RXL,
  304. nl->delta_rxl = DEF_RXL_DELTA;
  305. else
  306. nl->delta_rxl = 0;
  307. nl->csr1.rxl  = rxl_tab[ nl->cur_rxl_index ];
  308. if( inb( ioaddr + CSR0 ) & 0x01 )
  309. nl->state |= FL_SLOW_MODE;
  310. printk( KERN_NOTICE "%s: ioaddr %#lx, irq %d, "
  311. "MAC: 00:ff:01:%02x:%02x:%02xn", 
  312. dev->name, dev->base_addr, dev->irq,
  313. ((u8 *) dev->dev_addr) [3],
  314. ((u8 *) dev->dev_addr) [4],
  315. ((u8 *) dev->dev_addr) [5] );
  316. printk( KERN_NOTICE "%s: speed %d, receive level ", dev->name,
  317. ( (nl->state & FL_SLOW_MODE)  ?  500000 : 2000000)
  318. / (1 << nl->csr1.rate) );
  319. if( nl->delta_rxl == 0 )
  320. printk( "0x%x (fixed)n", nl->cur_rxl_index ); 
  321. else
  322. printk( "(auto)n");
  323. #ifdef CONFIG_SBNI_MULTILINE
  324. nl->master = dev;
  325. nl->link   = NULL;
  326. #endif
  327.    
  328. dev->open = &sbni_open;
  329. dev->stop = &sbni_close;
  330. dev->hard_start_xmit = &sbni_start_xmit;
  331. dev->get_stats = &sbni_get_stats;
  332. dev->set_multicast_list = &set_multicast_list;
  333. dev->do_ioctl = &sbni_ioctl;
  334. ether_setup( dev );
  335. sbni_cards[ num++ ] = dev;
  336. return  dev;
  337. }
  338. /* -------------------------------------------------------------------------- */
  339. #ifdef CONFIG_SBNI_MULTILINE
  340. static int
  341. sbni_start_xmit( struct sk_buff  *skb,  struct net_device  *dev )
  342. {
  343. struct net_device  *p;
  344. netif_stop_queue( dev );
  345. /* Looking for idle device in the list */
  346. for( p = dev;  p; ) {
  347. struct net_local  *nl = (struct net_local *) p->priv;
  348. spin_lock( &nl->lock );
  349. if( nl->tx_buf_p  ||  (nl->state & FL_LINE_DOWN) ) {
  350. p = nl->link;
  351. spin_unlock( &nl->lock );
  352. } else {
  353. /* Idle dev is found */
  354. prepare_to_send( skb, p );
  355. spin_unlock( &nl->lock );
  356. netif_start_queue( dev );
  357. return  0;
  358. }
  359. }
  360. return  1;
  361. }
  362. #else /* CONFIG_SBNI_MULTILINE */
  363. static int
  364. sbni_start_xmit( struct sk_buff  *skb,  struct net_device  *dev )
  365. {
  366. struct net_local  *nl  = (struct net_local *) dev->priv;
  367. netif_stop_queue( dev );
  368. spin_lock( &nl->lock );
  369. prepare_to_send( skb, dev );
  370. spin_unlock( &nl->lock );
  371. return  0;
  372. }
  373. #endif /* CONFIG_SBNI_MULTILINE */
  374. /* -------------------------------------------------------------------------- */
  375. /* interrupt handler */
  376. /*
  377.  *  SBNI12D-10, -11/ISA boards within "common interrupt" mode could not
  378.  * be looked as two independent single-channel devices. Every channel seems
  379.  * as Ethernet interface but interrupt handler must be common. Really, first
  380.  * channel ("master") driver only registers the handler. In its struct net_local
  381.  * it has got pointer to "slave" channel's struct net_local and handles that's
  382.  * interrupts too.
  383.  * dev of successfully attached ISA SBNI boards is linked to list.
  384.  * While next board driver is initialized, it scans this list. If one
  385.  * has found dev with same irq and ioaddr different by 4 then it assumes
  386.  * this board to be "master".
  387.  */ 
  388. static void
  389. sbni_interrupt( int  irq,  void  *dev_id,  struct pt_regs  *regs )
  390. {
  391. struct net_device   *dev = (struct net_device *) dev_id;
  392. struct net_local  *nl  = (struct net_local *) dev->priv;
  393. int repeat;
  394. spin_lock( &nl->lock );
  395. if( nl->second )
  396. spin_lock( &((struct net_local *) nl->second->priv)->lock );
  397. do {
  398. repeat = 0;
  399. if( inb( dev->base_addr + CSR0 ) & (RC_RDY | TR_RDY) )
  400. handle_channel( dev ),
  401. repeat = 1;
  402. if( nl->second  &&  /* second channel present */
  403.     (inb( nl->second->base_addr+CSR0 ) & (RC_RDY | TR_RDY)) )
  404. handle_channel( nl->second ),
  405. repeat = 1;
  406. } while( repeat );
  407. if( nl->second )
  408. spin_unlock( &((struct net_local *)nl->second->priv)->lock );
  409. spin_unlock( &nl->lock );
  410. }
  411. static void
  412. handle_channel( struct net_device  *dev )
  413. {
  414. struct net_local *nl    = (struct net_local *) dev->priv;
  415. unsigned long ioaddr = dev->base_addr;
  416. int  req_ans;
  417. unsigned char  csr0;
  418. #ifdef CONFIG_SBNI_MULTILINE
  419. /* Lock the master device because we going to change its local data */
  420. if( nl->state & FL_SLAVE )
  421. spin_lock( &((struct net_local *) nl->master->priv)->lock );
  422. #endif
  423. outb( (inb( ioaddr + CSR0 ) & ~EN_INT) | TR_REQ, ioaddr + CSR0 );
  424. nl->timer_ticks = CHANGE_LEVEL_START_TICKS;
  425. for(;;) {
  426. csr0 = inb( ioaddr + CSR0 );
  427. if( ( csr0 & (RC_RDY | TR_RDY) ) == 0 )
  428. break;
  429. req_ans = !(nl->state & FL_PREV_OK);
  430. if( csr0 & RC_RDY )
  431. req_ans = recv_frame( dev );
  432. /*
  433.  * TR_RDY always equals 1 here because we have owned the marker,
  434.  * and we set TR_REQ when disabled interrupts
  435.  */
  436. csr0 = inb( ioaddr + CSR0 );
  437. if( !(csr0 & TR_RDY)  ||  (csr0 & RC_RDY) )
  438. printk( KERN_ERR "%s: internal error!n", dev->name );
  439. /* if state & FL_NEED_RESEND != 0 then tx_frameno != 0 */
  440. if( req_ans  ||  nl->tx_frameno != 0 )
  441. send_frame( dev );
  442. else
  443. /* send marker without any data */
  444. outb( inb( ioaddr + CSR0 ) & ~TR_REQ, ioaddr + CSR0 );
  445. }
  446. outb( inb( ioaddr + CSR0 ) | EN_INT, ioaddr + CSR0 );
  447. #ifdef CONFIG_SBNI_MULTILINE
  448. if( nl->state & FL_SLAVE )
  449. spin_unlock( &((struct net_local *) nl->master->priv)->lock );
  450. #endif
  451. }
  452. /*
  453.  * Routine returns 1 if it need to acknoweledge received frame.
  454.  * Empty frame received without errors won't be acknoweledged.
  455.  */
  456. static int
  457. recv_frame( struct net_device  *dev )
  458. {
  459. struct net_local  *nl   = (struct net_local *) dev->priv;
  460. unsigned long  ioaddr = dev->base_addr;
  461. u32  crc = CRC32_INITIAL;
  462. unsigned  framelen, frameno, ack;
  463. unsigned  is_first, frame_ok;
  464. if( check_fhdr( ioaddr, &framelen, &frameno, &ack, &is_first, &crc ) ) {
  465. frame_ok = framelen > 4
  466. ?  upload_data( dev, framelen, frameno, is_first, crc )
  467. :  skip_tail( ioaddr, framelen, crc );
  468. if( frame_ok )
  469. interpret_ack( dev, ack );
  470. } else
  471. frame_ok = 0;
  472. outb( inb( ioaddr + CSR0 ) ^ CT_ZER, ioaddr + CSR0 );
  473. if( frame_ok ) {
  474. nl->state |= FL_PREV_OK;
  475. if( framelen > 4 )
  476. nl->in_stats.all_rx_number++;
  477. } else
  478. nl->state &= ~FL_PREV_OK,
  479. change_level( dev ),
  480. nl->in_stats.all_rx_number++,
  481. nl->in_stats.bad_rx_number++;
  482. return  !frame_ok  ||  framelen > 4;
  483. }
  484. static void
  485. send_frame( struct net_device  *dev )
  486. {
  487. struct net_local  *nl    = (struct net_local *) dev->priv;
  488. u32  crc = CRC32_INITIAL;
  489. if( nl->state & FL_NEED_RESEND ) {
  490. /* if frame was sended but not ACK'ed - resend it */
  491. if( nl->trans_errors ) {
  492. --nl->trans_errors;
  493. if( nl->framelen != 0 )
  494. nl->in_stats.resend_tx_number++;
  495. } else {
  496. /* cannot xmit with many attempts */
  497. #ifdef CONFIG_SBNI_MULTILINE
  498. if( (nl->state & FL_SLAVE)  ||  nl->link )
  499. #endif
  500. nl->state |= FL_LINE_DOWN;
  501. drop_xmit_queue( dev );
  502. goto  do_send;
  503. }
  504. } else
  505. nl->trans_errors = TR_ERROR_COUNT;
  506. send_frame_header( dev, &crc );
  507. nl->state |= FL_NEED_RESEND;
  508. /*
  509.  * FL_NEED_RESEND will be cleared after ACK, but if empty
  510.  * frame sended then in prepare_to_send next frame
  511.  */
  512. if( nl->framelen ) {
  513. download_data( dev, &crc );
  514. nl->in_stats.all_tx_number++;
  515. nl->state |= FL_WAIT_ACK;
  516. }
  517. outsb( dev->base_addr + DAT, (u8 *)&crc, sizeof crc );
  518. do_send:
  519. outb( inb( dev->base_addr + CSR0 ) & ~TR_REQ, dev->base_addr + CSR0 );
  520. if( nl->tx_frameno )
  521. /* next frame exists - we request card to send it */
  522. outb( inb( dev->base_addr + CSR0 ) | TR_REQ,
  523.       dev->base_addr + CSR0 );
  524. }
  525. /*
  526.  * Write the frame data into adapter's buffer memory, and calculate CRC.
  527.  * Do padding if necessary.
  528.  */
  529. static void
  530. download_data( struct net_device  *dev,  u32  *crc_p )
  531. {
  532. struct net_local  *nl    = (struct net_local *) dev->priv;
  533. struct sk_buff    *skb  = nl->tx_buf_p;
  534. unsigned  len = min_t(unsigned int, skb->len - nl->outpos, nl->framelen);
  535. outsb( dev->base_addr + DAT, skb->data + nl->outpos, len );
  536. *crc_p = calc_crc32( *crc_p, skb->data + nl->outpos, len );
  537. /* if packet too short we should write some more bytes to pad */
  538. for( len = nl->framelen - len;  len--; )
  539. outb( 0, dev->base_addr + DAT ),
  540. *crc_p = CRC32( 0, *crc_p );
  541. }
  542. static int
  543. upload_data( struct net_device  *dev,  unsigned  framelen,  unsigned  frameno,
  544.      unsigned  is_first,  u32  crc )
  545. {
  546. struct net_local  *nl = (struct net_local *) dev->priv;
  547. int  frame_ok;
  548. if( is_first )
  549. nl->wait_frameno = frameno,
  550. nl->inppos = 0;
  551. if( nl->wait_frameno == frameno ) {
  552. if( nl->inppos + framelen  <=  ETHER_MAX_LEN )
  553. frame_ok = append_frame_to_pkt( dev, framelen, crc );
  554. /*
  555.  * if CRC is right but framelen incorrect then transmitter
  556.  * error was occured... drop entire packet
  557.  */
  558. else if( (frame_ok = skip_tail( dev->base_addr, framelen, crc ))
  559.  != 0 )
  560. nl->wait_frameno = 0,
  561. nl->inppos = 0,
  562. #ifdef CONFIG_SBNI_MULTILINE
  563. ((struct net_local *) nl->master->priv)
  564. ->stats.rx_errors++,
  565. ((struct net_local *) nl->master->priv)
  566. ->stats.rx_missed_errors++;
  567. #else
  568. nl->stats.rx_errors++,
  569. nl->stats.rx_missed_errors++;
  570. #endif
  571. /* now skip all frames until is_first != 0 */
  572. } else
  573. frame_ok = skip_tail( dev->base_addr, framelen, crc );
  574. if( is_first  &&  !frame_ok )
  575. /*
  576.  * Frame has been broken, but we had already stored
  577.  * is_first... Drop entire packet.
  578.  */
  579. nl->wait_frameno = 0,
  580. #ifdef CONFIG_SBNI_MULTILINE
  581. ((struct net_local *) nl->master->priv)->stats.rx_errors++,
  582. ((struct net_local *) nl->master->priv)->stats.rx_crc_errors++;
  583. #else
  584. nl->stats.rx_errors++,
  585. nl->stats.rx_crc_errors++;
  586. #endif
  587. return  frame_ok;
  588. }
  589. static __inline void
  590. send_complete( struct net_local  *nl )
  591. {
  592. #ifdef CONFIG_SBNI_MULTILINE
  593. ((struct net_local *) nl->master->priv)->stats.tx_packets++;
  594. ((struct net_local *) nl->master->priv)->stats.tx_bytes
  595. += nl->tx_buf_p->len;
  596. #else
  597. nl->stats.tx_packets++;
  598. nl->stats.tx_bytes += nl->tx_buf_p->len;
  599. #endif
  600. dev_kfree_skb_irq( nl->tx_buf_p );
  601. nl->tx_buf_p = NULL;
  602. nl->outpos = 0;
  603. nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
  604. nl->framelen   = 0;
  605. }
  606. static void
  607. interpret_ack( struct net_device  *dev,  unsigned  ack )
  608. {
  609. struct net_local  *nl = (struct net_local *) dev->priv;
  610. if( ack == FRAME_SENT_OK ) {
  611. nl->state &= ~FL_NEED_RESEND;
  612. if( nl->state & FL_WAIT_ACK ) {
  613. nl->outpos += nl->framelen;
  614. if( --nl->tx_frameno )
  615. nl->framelen = min_t(unsigned int,
  616.    nl->maxframe,
  617.    nl->tx_buf_p->len - nl->outpos);
  618. else
  619. send_complete( nl ),
  620. #ifdef CONFIG_SBNI_MULTILINE
  621. netif_wake_queue( nl->master );
  622. #else
  623. netif_wake_queue( dev );
  624. #endif
  625. }
  626. }
  627. nl->state &= ~FL_WAIT_ACK;
  628. }
  629. /*
  630.  * Glue received frame with previous fragments of packet.
  631.  * Indicate packet when last frame would be accepted.
  632.  */
  633. static int
  634. append_frame_to_pkt( struct net_device  *dev,  unsigned  framelen,  u32  crc )
  635. {
  636. struct net_local  *nl = (struct net_local *) dev->priv;
  637. u8  *p;
  638. if( nl->inppos + framelen  >  ETHER_MAX_LEN )
  639. return  0;
  640. if( !nl->rx_buf_p  &&  !(nl->rx_buf_p = get_rx_buf( dev )) )
  641. return  0;
  642. p = nl->rx_buf_p->data + nl->inppos;
  643. insb( dev->base_addr + DAT, p, framelen );
  644. if( calc_crc32( crc, p, framelen ) != CRC32_REMAINDER )
  645. return  0;
  646. nl->inppos += framelen - 4;
  647. if( --nl->wait_frameno == 0 ) /* last frame received */
  648. indicate_pkt( dev );
  649. return  1;
  650. }
  651. /*
  652.  * Prepare to start output on adapter.
  653.  * Transmitter will be actually activated when marker is accepted.
  654.  */
  655. static void
  656. prepare_to_send( struct sk_buff  *skb,  struct net_device  *dev )
  657. {
  658. struct net_local  *nl = (struct net_local *) dev->priv;
  659. unsigned int  len;
  660. /* nl->tx_buf_p == NULL here! */
  661. if( nl->tx_buf_p )
  662. printk( KERN_ERR "%s: memory leak!n", dev->name );
  663. nl->outpos = 0;
  664. nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
  665. len = skb->len;
  666. if( len < SBNI_MIN_LEN )
  667. len = SBNI_MIN_LEN;
  668. nl->tx_buf_p = skb;
  669. nl->tx_frameno = (len + nl->maxframe - 1) / nl->maxframe;
  670. nl->framelen = len < nl->maxframe  ?  len  :  nl->maxframe;
  671. outb( inb( dev->base_addr + CSR0 ) | TR_REQ,  dev->base_addr + CSR0 );
  672. #ifdef CONFIG_SBNI_MULTILINE
  673. nl->master->trans_start = jiffies;
  674. #else
  675. dev->trans_start = jiffies;
  676. #endif
  677. }
  678. static void
  679. drop_xmit_queue( struct net_device  *dev )
  680. {
  681. struct net_local  *nl = (struct net_local *) dev->priv;
  682. if( nl->tx_buf_p )
  683. dev_kfree_skb_any( nl->tx_buf_p ),
  684. nl->tx_buf_p = NULL,
  685. #ifdef CONFIG_SBNI_MULTILINE
  686. ((struct net_local *) nl->master->priv)
  687. ->stats.tx_errors++,
  688. ((struct net_local *) nl->master->priv)
  689. ->stats.tx_carrier_errors++;
  690. #else
  691. nl->stats.tx_errors++,
  692. nl->stats.tx_carrier_errors++;
  693. #endif
  694. nl->tx_frameno = 0;
  695. nl->framelen = 0;
  696. nl->outpos = 0;
  697. nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
  698. #ifdef CONFIG_SBNI_MULTILINE
  699. netif_start_queue( nl->master );
  700. nl->master->trans_start = jiffies;
  701. #else
  702. netif_start_queue( dev );
  703. dev->trans_start = jiffies;
  704. #endif
  705. }
  706. static void
  707. send_frame_header( struct net_device  *dev,  u32  *crc_p )
  708. {
  709. struct net_local  *nl  = (struct net_local *) dev->priv;
  710. u32  crc = *crc_p;
  711. u32  len_field = nl->framelen + 6; /* CRC + frameno + reserved */
  712. u8   value;
  713. if( nl->state & FL_NEED_RESEND )
  714. len_field |= FRAME_RETRY; /* non-first attempt... */
  715. if( nl->outpos == 0 )
  716. len_field |= FRAME_FIRST;
  717. len_field |= (nl->state & FL_PREV_OK) ? FRAME_SENT_OK : FRAME_SENT_BAD;
  718. outb( SBNI_SIG, dev->base_addr + DAT );
  719. value = (u8) len_field;
  720. outb( value, dev->base_addr + DAT );
  721. crc = CRC32( value, crc );
  722. value = (u8) (len_field >> 8);
  723. outb( value, dev->base_addr + DAT );
  724. crc = CRC32( value, crc );
  725. outb( nl->tx_frameno, dev->base_addr + DAT );
  726. crc = CRC32( nl->tx_frameno, crc );
  727. outb( 0, dev->base_addr + DAT );
  728. crc = CRC32( 0, crc );
  729. *crc_p = crc;
  730. }
  731. /*
  732.  * if frame tail not needed (incorrect number or received twice),
  733.  * it won't store, but CRC will be calculated
  734.  */
  735. static int
  736. skip_tail( unsigned int  ioaddr,  unsigned int  tail_len,  u32 crc )
  737. {
  738. while( tail_len-- )
  739. crc = CRC32( inb( ioaddr + DAT ), crc );
  740. return  crc == CRC32_REMAINDER;
  741. }
  742. /*
  743.  * Preliminary checks if frame header is correct, calculates its CRC
  744.  * and split it to simple fields
  745.  */
  746. static int
  747. check_fhdr( u32  ioaddr,  u32  *framelen,  u32  *frameno,  u32  *ack,
  748.     u32  *is_first,  u32  *crc_p )
  749. {
  750. u32  crc = *crc_p;
  751. u8   value;
  752. if( inb( ioaddr + DAT ) != SBNI_SIG )
  753. return  0;
  754. value = inb( ioaddr + DAT );
  755. *framelen = (u32)value;
  756. crc = CRC32( value, crc );
  757. value = inb( ioaddr + DAT );
  758. *framelen |= ((u32)value) << 8;
  759. crc = CRC32( value, crc );
  760. *ack = *framelen & FRAME_ACK_MASK;
  761. *is_first = (*framelen & FRAME_FIRST) != 0;
  762. if( (*framelen &= FRAME_LEN_MASK) < 6
  763.     ||  *framelen > SBNI_MAX_FRAME - 3 )
  764. return  0;
  765. value = inb( ioaddr + DAT );
  766. *frameno = (u32)value;
  767. crc = CRC32( value, crc );
  768. crc = CRC32( inb( ioaddr + DAT ), crc ); /* reserved byte */
  769. *framelen -= 2;
  770. *crc_p = crc;
  771. return  1;
  772. }
  773. static struct sk_buff *
  774. get_rx_buf( struct net_device  *dev )
  775. {
  776. /* +2 is to compensate for the alignment fixup below */
  777. struct sk_buff  *skb = dev_alloc_skb( ETHER_MAX_LEN + 2 );
  778. if( !skb )
  779. return  NULL;
  780. #ifdef CONFIG_SBNI_MULTILINE
  781. skb->dev = ((struct net_local *) dev->priv)->master;
  782. #else
  783. skb->dev = dev;
  784. #endif
  785. skb_reserve( skb, 2 ); /* Align IP on longword boundaries */
  786. return  skb;
  787. }
  788. static void
  789. indicate_pkt( struct net_device  *dev )
  790. {
  791. struct net_local  *nl  = (struct net_local *) dev->priv;
  792. struct sk_buff    *skb = nl->rx_buf_p;
  793. skb_put( skb, nl->inppos );
  794. #ifdef CONFIG_SBNI_MULTILINE
  795. skb->protocol = eth_type_trans( skb, nl->master );
  796. netif_rx( skb );
  797. dev->last_rx = jiffies;
  798. ++((struct net_local *) nl->master->priv)->stats.rx_packets;
  799. ((struct net_local *) nl->master->priv)->stats.rx_bytes += nl->inppos;
  800. #else
  801. skb->protocol = eth_type_trans( skb, dev );
  802. netif_rx( skb );
  803. dev->last_rx = jiffies;
  804. ++nl->stats.rx_packets;
  805. nl->stats.rx_bytes += nl->inppos;
  806. #endif
  807. nl->rx_buf_p = NULL; /* protocol driver will clear this sk_buff */
  808. }
  809. /* -------------------------------------------------------------------------- */
  810. /*
  811.  * Routine checks periodically wire activity and regenerates marker if
  812.  * connect was inactive for a long time.
  813.  */
  814. static void
  815. sbni_watchdog( unsigned long  arg )
  816. {
  817. struct net_device  *dev = (struct net_device *) arg;
  818. struct net_local   *nl  = (struct net_local *) dev->priv;
  819. struct timer_list  *w   = &nl->watchdog; 
  820. unsigned long    flags;
  821. unsigned char    csr0;
  822. spin_lock_irqsave( &nl->lock, flags );
  823. csr0 = inb( dev->base_addr + CSR0 );
  824. if( csr0 & RC_CHK ) {
  825. if( nl->timer_ticks ) {
  826. if( csr0 & (RC_RDY | BU_EMP) )
  827. /* receiving not active */
  828. nl->timer_ticks--;
  829. } else {
  830. nl->in_stats.timeout_number++;
  831. if( nl->delta_rxl )
  832. timeout_change_level( dev );
  833. outb( *(u_char *)&nl->csr1 | PR_RES,
  834.       dev->base_addr + CSR1 );
  835. csr0 = inb( dev->base_addr + CSR0 );
  836. }
  837. } else
  838. nl->state &= ~FL_LINE_DOWN;
  839. outb( csr0 | RC_CHK, dev->base_addr + CSR0 ); 
  840. init_timer( w );
  841. w->expires = jiffies + SBNI_TIMEOUT;
  842. w->data = arg;
  843. w->function = sbni_watchdog;
  844. add_timer( w );
  845. spin_unlock_irqrestore( &nl->lock, flags );
  846. }
  847. static unsigned char  rxl_tab[] = {
  848. 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08,
  849. 0x0a, 0x0c, 0x0f, 0x16, 0x18, 0x1a, 0x1c, 0x1f
  850. };
  851. #define SIZE_OF_TIMEOUT_RXL_TAB 4
  852. static unsigned char  timeout_rxl_tab[] = {
  853. 0x03, 0x05, 0x08, 0x0b
  854. };
  855. /* -------------------------------------------------------------------------- */
  856. static void
  857. card_start( struct net_device  *dev )
  858. {
  859. struct net_local  *nl = (struct net_local *) dev->priv;
  860. nl->timer_ticks = CHANGE_LEVEL_START_TICKS;
  861. nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND);
  862. nl->state |= FL_PREV_OK;
  863. nl->inppos = nl->outpos = 0;
  864. nl->wait_frameno = 0;
  865. nl->tx_frameno  = 0;
  866. nl->framelen  = 0;
  867. outb( *(u_char *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 );
  868. outb( EN_INT, dev->base_addr + CSR0 );
  869. }
  870. /* -------------------------------------------------------------------------- */
  871. /* Receive level auto-selection */
  872. static void
  873. change_level( struct net_device  *dev )
  874. {
  875. struct net_local  *nl = (struct net_local *) dev->priv;
  876. if( nl->delta_rxl == 0 ) /* do not auto-negotiate RxL */
  877. return;
  878. if( nl->cur_rxl_index == 0 )
  879. nl->delta_rxl = 1;
  880. else if( nl->cur_rxl_index == 15 )
  881. nl->delta_rxl = -1;
  882. else if( nl->cur_rxl_rcvd < nl->prev_rxl_rcvd )
  883. nl->delta_rxl = -nl->delta_rxl;
  884. nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index += nl->delta_rxl ];
  885. inb( dev->base_addr + CSR0 ); /* needs for PCI cards */
  886. outb( *(u8 *)&nl->csr1, dev->base_addr + CSR1 );
  887. nl->prev_rxl_rcvd = nl->cur_rxl_rcvd;
  888. nl->cur_rxl_rcvd  = 0;
  889. }
  890. static void
  891. timeout_change_level( struct net_device  *dev )
  892. {
  893. struct net_local  *nl = (struct net_local *) dev->priv;
  894. nl->cur_rxl_index = timeout_rxl_tab[ nl->timeout_rxl ];
  895. if( ++nl->timeout_rxl >= 4 )
  896. nl->timeout_rxl = 0;
  897. nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ];
  898. inb( dev->base_addr + CSR0 );
  899. outb( *(unsigned char *)&nl->csr1, dev->base_addr + CSR1 );
  900. nl->prev_rxl_rcvd = nl->cur_rxl_rcvd;
  901. nl->cur_rxl_rcvd  = 0;
  902. }
  903. /* -------------------------------------------------------------------------- */
  904. /*
  905.  * Open/initialize the board. 
  906.  */
  907. static int
  908. sbni_open( struct net_device  *dev )
  909. {
  910. struct net_local *nl = (struct net_local *) dev->priv;
  911. struct timer_list *w  = &nl->watchdog;
  912. /*
  913.  * For double ISA adapters within "common irq" mode, we have to
  914.  * determine whether primary or secondary channel is initialized,
  915.  * and set the irq handler only in first case.
  916.  */
  917. if( dev->base_addr < 0x400 ) { /* ISA only */
  918. struct net_device  **p = sbni_cards;
  919. for( ;  *p  &&  p < sbni_cards + SBNI_MAX_NUM_CARDS;  ++p )
  920. if( (*p)->irq == dev->irq
  921.     &&  ((*p)->base_addr == dev->base_addr + 4
  922.  ||  (*p)->base_addr == dev->base_addr - 4)
  923.     &&  (*p)->flags & IFF_UP ) {
  924. ((struct net_local *) ((*p)->priv))
  925. ->second = dev;
  926. printk( KERN_NOTICE "%s: using shared irq "
  927. "with %sn", dev->name, (*p)->name );
  928. nl->state |= FL_SECONDARY;
  929. goto  handler_attached;
  930. }
  931. }
  932. if( request_irq(dev->irq, sbni_interrupt, SA_SHIRQ, dev->name, dev) ) {
  933. printk( KERN_ERR "%s: unable to get IRQ %d.n",
  934. dev->name, dev->irq );
  935. return  -EAGAIN;
  936. }
  937. handler_attached:
  938. spin_lock( &nl->lock );
  939. memset( &nl->stats, 0, sizeof(struct net_device_stats) );
  940. memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) );
  941. card_start( dev );
  942. netif_start_queue( dev );
  943. /* set timer watchdog */
  944. init_timer( w );
  945. w->expires = jiffies + SBNI_TIMEOUT;
  946. w->data = (unsigned long) dev;
  947. w->function = sbni_watchdog;
  948. add_timer( w );
  949.    
  950. spin_unlock( &nl->lock );
  951. return 0;
  952. }
  953. static int
  954. sbni_close( struct net_device  *dev )
  955. {
  956. struct net_local  *nl = (struct net_local *) dev->priv;
  957. if( nl->second  &&  nl->second->flags & IFF_UP ) {
  958. printk( KERN_NOTICE "Secondary channel (%s) is active!n",
  959. nl->second->name );
  960. return  -EBUSY;
  961. }
  962. #ifdef CONFIG_SBNI_MULTILINE
  963. if( nl->state & FL_SLAVE )
  964. emancipate( dev );
  965. else
  966. while( nl->link ) /* it's master device! */
  967. emancipate( nl->link );
  968. #endif
  969. spin_lock( &nl->lock );
  970. nl->second = NULL;
  971. drop_xmit_queue( dev );
  972. netif_stop_queue( dev );
  973.    
  974. del_timer( &nl->watchdog );
  975. outb( 0, dev->base_addr + CSR0 );
  976. if( !(nl->state & FL_SECONDARY) )
  977. free_irq( dev->irq, dev );
  978. nl->state &= FL_SECONDARY;
  979. spin_unlock( &nl->lock );
  980. return 0;
  981. }
  982. /*
  983. Valid combinations in CSR0 (for probing):
  984. VALID_DECODER 0000,0011,1011,1010
  985.      ; 0   ; -
  986. TR_REQ ; 1   ; +
  987. TR_RDY      ; 2   ; -
  988. TR_RDY TR_REQ ; 3   ; +
  989. BU_EMP      ; 4   ; +
  990. BU_EMP       TR_REQ ; 5   ; +
  991. BU_EMP TR_RDY      ; 6   ; -
  992. BU_EMP TR_RDY TR_REQ ; 7   ; +
  993. RC_RDY        ; 8   ; +
  994. RC_RDY TR_REQ ; 9   ; +
  995. RC_RDY TR_RDY ; 10  ; -
  996. RC_RDY TR_RDY TR_REQ ; 11  ; -
  997. RC_RDY BU_EMP ; 12  ; -
  998. RC_RDY BU_EMP TR_REQ ; 13  ; -
  999. RC_RDY BU_EMP TR_RDY ; 14  ; -
  1000. RC_RDY BU_EMP TR_RDY TR_REQ ; 15  ; -
  1001. */
  1002. #define VALID_DECODER (2 + 8 + 0x10 + 0x20 + 0x80 + 0x100 + 0x200)
  1003. static int
  1004. sbni_card_probe( unsigned long  ioaddr )
  1005. {
  1006. unsigned char  csr0;
  1007. csr0 = inb( ioaddr + CSR0 );
  1008. if( csr0 != 0xff  &&  csr0 != 0x00 ) {
  1009. csr0 &= ~EN_INT;
  1010. if( csr0 & BU_EMP )
  1011. csr0 |= EN_INT;
  1012.       
  1013. if( VALID_DECODER & (1 << (csr0 >> 4)) )
  1014. return  0;
  1015. }
  1016.    
  1017. return  -ENODEV;
  1018. }
  1019. /* -------------------------------------------------------------------------- */
  1020. static int
  1021. sbni_ioctl( struct net_device  *dev,  struct ifreq  *ifr,  int  cmd )
  1022. {
  1023. struct net_local  *nl = (struct net_local *) dev->priv; 
  1024. struct sbni_flags  flags;
  1025. int  error = 0;
  1026. #ifdef CONFIG_SBNI_MULTILINE
  1027. struct net_device  *slave_dev;
  1028. char  slave_name[ 8 ];
  1029. #endif
  1030.   
  1031. switch( cmd ) {
  1032. case  SIOCDEVGETINSTATS :
  1033. error = verify_area( VERIFY_WRITE, ifr->ifr_data,
  1034.      sizeof(struct sbni_in_stats) );
  1035. if( !error )
  1036. copy_to_user( ifr->ifr_data, &nl->in_stats,
  1037.       sizeof(struct sbni_in_stats) );
  1038. break;
  1039. case  SIOCDEVRESINSTATS :
  1040. if( current->euid != 0 ) /* root only */
  1041. return  -EPERM;
  1042. memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) );
  1043. break;
  1044. case  SIOCDEVGHWSTATE :
  1045. flags.mac_addr = *(u32 *)(dev->dev_addr + 3);
  1046. flags.rate = nl->csr1.rate;
  1047. flags.slow_mode = (nl->state & FL_SLOW_MODE) != 0;
  1048. flags.rxl = nl->cur_rxl_index;
  1049. flags.fixed_rxl = nl->delta_rxl == 0;
  1050. error = verify_area( VERIFY_WRITE, ifr->ifr_data,
  1051.      sizeof flags );
  1052. if( !error )
  1053. copy_to_user( ifr->ifr_data, &flags, sizeof flags );
  1054. break;
  1055. case  SIOCDEVSHWSTATE :
  1056. if( current->euid != 0 ) /* root only */
  1057. return  -EPERM;
  1058. spin_lock( &nl->lock );
  1059. flags = *(struct sbni_flags*) &ifr->ifr_data;
  1060. if( flags.fixed_rxl )
  1061. nl->delta_rxl = 0,
  1062. nl->cur_rxl_index = flags.rxl;
  1063. else
  1064. nl->delta_rxl = DEF_RXL_DELTA,
  1065. nl->cur_rxl_index = DEF_RXL;
  1066. nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ];
  1067. nl->csr1.rate = flags.rate;
  1068. outb( *(u8 *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 );
  1069. spin_unlock( &nl->lock );
  1070. break;
  1071. #ifdef CONFIG_SBNI_MULTILINE
  1072. case  SIOCDEVENSLAVE :
  1073. if( current->euid != 0 ) /* root only */
  1074. return  -EPERM;
  1075. if( (error = verify_area( VERIFY_READ, ifr->ifr_data,
  1076.   sizeof slave_name )) != 0 )
  1077. return  error;
  1078. copy_from_user( slave_name, ifr->ifr_data, sizeof slave_name );
  1079. slave_dev = dev_get_by_name( slave_name );
  1080. if( !slave_dev  ||  !(slave_dev->flags & IFF_UP) ) {
  1081. printk( KERN_ERR "%s: trying to enslave non-active "
  1082. "device %sn", dev->name, slave_name );
  1083. return  -EPERM;
  1084. }
  1085. return  enslave( dev, slave_dev );
  1086. case  SIOCDEVEMANSIPATE :
  1087. if( current->euid != 0 ) /* root only */
  1088. return  -EPERM;
  1089. return  emancipate( dev );
  1090. #endif /* CONFIG_SBNI_MULTILINE */
  1091. default :
  1092. return  -EOPNOTSUPP;
  1093. }
  1094. return  error;
  1095. }
  1096. #ifdef CONFIG_SBNI_MULTILINE
  1097. static int
  1098. enslave( struct net_device  *dev,  struct net_device  *slave_dev )
  1099. {
  1100. struct net_local  *nl  = (struct net_local *) dev->priv;
  1101. struct net_local  *snl = (struct net_local *) slave_dev->priv;
  1102. if( nl->state & FL_SLAVE ) /* This isn't master or free device */
  1103. return  -EBUSY;
  1104. if( snl->state & FL_SLAVE ) /* That was already enslaved */
  1105. return  -EBUSY;
  1106. spin_lock( &nl->lock );
  1107. spin_lock( &snl->lock );
  1108. /* append to list */
  1109. snl->link = nl->link;
  1110. nl->link  = slave_dev;
  1111. snl->master = dev;
  1112. snl->state |= FL_SLAVE;
  1113. /* Summary statistics of MultiLine operation will be stored
  1114.    in master's counters */
  1115. memset( &snl->stats, 0, sizeof(struct net_device_stats) );
  1116. netif_stop_queue( slave_dev );
  1117. netif_wake_queue( dev ); /* Now we are able to transmit */
  1118. spin_unlock( &snl->lock );
  1119. spin_unlock( &nl->lock );
  1120. printk( KERN_NOTICE "%s: slave device (%s) attached.n",
  1121. dev->name, slave_dev->name );
  1122. return  0;
  1123. }
  1124. static int
  1125. emancipate( struct net_device  *dev )
  1126. {
  1127. struct net_local   *snl = (struct net_local *) dev->priv;
  1128. struct net_device  *p   = snl->master;
  1129. struct net_local   *nl  = (struct net_local *) p->priv;
  1130. if( !(snl->state & FL_SLAVE) )
  1131. return  -EINVAL;
  1132. spin_lock( &nl->lock );
  1133. spin_lock( &snl->lock );
  1134. drop_xmit_queue( dev );
  1135. /* exclude from list */
  1136. for(;;) { /* must be in list */
  1137. struct net_local  *t = (struct net_local *) p->priv;
  1138. if( t->link == dev ) {
  1139. t->link = snl->link;
  1140. break;
  1141. }
  1142. p = t->link;
  1143. }
  1144. snl->link = NULL;
  1145. snl->master = dev;
  1146. snl->state &= ~FL_SLAVE;
  1147. netif_start_queue( dev );
  1148. spin_unlock( &snl->lock );
  1149. spin_unlock( &nl->lock );
  1150. dev_put( dev );
  1151. return  0;
  1152. }
  1153. #endif
  1154. static struct net_device_stats *
  1155. sbni_get_stats( struct net_device  *dev )
  1156. {
  1157. return  &((struct net_local *) dev->priv)->stats;
  1158. }
  1159. static void
  1160. set_multicast_list( struct net_device  *dev )
  1161. {
  1162. return; /* sbni always operate in promiscuos mode */
  1163. }
  1164. #ifdef MODULE
  1165. MODULE_PARM( io, "1-" __MODULE_STRING( SBNI_MAX_NUM_CARDS ) "i" );
  1166. MODULE_PARM( irq, "1-" __MODULE_STRING( SBNI_MAX_NUM_CARDS ) "i" );
  1167. MODULE_PARM( baud, "1-" __MODULE_STRING( SBNI_MAX_NUM_CARDS ) "i" );
  1168. MODULE_PARM( rxl, "1-" __MODULE_STRING( SBNI_MAX_NUM_CARDS ) "i" );
  1169. MODULE_PARM( mac, "1-" __MODULE_STRING( SBNI_MAX_NUM_CARDS ) "i" );
  1170. MODULE_PARM( skip_pci_probe, "i" );
  1171. MODULE_LICENSE("GPL");
  1172. int
  1173. init_module( void )
  1174. {
  1175. struct net_device  *dev;
  1176. while( num < SBNI_MAX_NUM_CARDS ) {
  1177. if( !(dev = kmalloc(sizeof(struct net_device), GFP_KERNEL)) ){
  1178. printk( KERN_ERR "sbni: unable to allocate device!n" );
  1179. return  -ENOMEM;
  1180. }
  1181. memset( dev, 0, sizeof(struct net_device) );
  1182. sprintf( dev->name, "sbni%d", num );
  1183. dev->init = sbni_probe;
  1184. if( register_netdev( dev ) ) {
  1185. kfree( dev );
  1186. break;
  1187. }
  1188. }
  1189. return  *sbni_cards  ?  0  :  -ENODEV;
  1190. }
  1191. void
  1192. cleanup_module( void )
  1193. {
  1194. struct net_device  *dev;
  1195. int  num;
  1196. /* No need to check MOD_IN_USE, as sys_delete_module( ) checks. */
  1197. for( num = 0;  num < SBNI_MAX_NUM_CARDS;  ++num )
  1198. if( (dev = sbni_cards[ num ]) != NULL ) {
  1199. unregister_netdev( dev );
  1200. release_region( dev->base_addr, SBNI_IO_EXTENT );
  1201. kfree( dev->priv );
  1202. kfree( dev );
  1203. }
  1204. }
  1205. #else /* MODULE */
  1206. static int __init
  1207. sbni_setup( char  *p )
  1208. {
  1209. int  n, parm;
  1210. if( *p++ != '(' )
  1211. goto  bad_param;
  1212. for( n = 0, parm = 0;  *p  &&  n < 8; ) {
  1213. (*dest[ parm ])[ n ] = simple_strtol( p, &p, 0 );
  1214. if( !*p  ||  *p == ')' )
  1215. return 1;
  1216. if( *p == ';' )
  1217. ++p, ++n, parm = 0;
  1218. else if( *p++ != ',' )
  1219. break;
  1220. else
  1221. if( ++parm >= 5 )
  1222. break;
  1223. }
  1224. bad_param:
  1225. printk( KERN_ERR "Error in sbni kernel parameter!n" );
  1226. return 0;
  1227. }
  1228. __setup( "sbni=", sbni_setup );
  1229. #endif /* MODULE */
  1230. /* -------------------------------------------------------------------------- */
  1231. #ifdef ASM_CRC
  1232. static u32
  1233. calc_crc32( u32  crc,  u8  *p,  u32  len )
  1234. {
  1235. register u32  _crc __asm ( "ax" );
  1236. _crc = crc;
  1237. __asm __volatile (
  1238. "xorl %%ebx, %%ebxn"
  1239. "movl %1, %%esin" 
  1240. "movl %2, %%ecxn" 
  1241. "movl $crc32tab, %%edin"
  1242. "shrl $2, %%ecxn"
  1243. "jz 1fn"
  1244. ".align 4n"
  1245. "0:n"
  1246. "movb %%al, %%bln"
  1247. "movl (%%esi), %%edxn"
  1248. "shrl $8, %%eaxn"
  1249. "xorb %%dl, %%bln"
  1250. "shrl $8, %%edxn"
  1251. "xorl (%%edi,%%ebx,4), %%eaxn"
  1252. "movb %%al, %%bln"
  1253. "shrl $8, %%eaxn"
  1254. "xorb %%dl, %%bln"
  1255. "shrl $8, %%edxn"
  1256. "xorl (%%edi,%%ebx,4), %%eaxn"
  1257. "movb %%al, %%bln"
  1258. "shrl $8, %%eaxn"
  1259. "xorb %%dl, %%bln"
  1260. "movb %%dh, %%dln" 
  1261. "xorl (%%edi,%%ebx,4), %%eaxn"
  1262. "movb %%al, %%bln"
  1263. "shrl $8, %%eaxn"
  1264. "xorb %%dl, %%bln"
  1265. "addl $4, %%esin"
  1266. "xorl (%%edi,%%ebx,4), %%eaxn"
  1267. "decl %%ecxn"
  1268. "jnz 0bn"
  1269. "1:n"
  1270. "movl %2, %%ecxn"
  1271. "andl $3, %%ecxn"
  1272. "jz 2fn"
  1273. "movb %%al, %%bln"
  1274. "shrl $8, %%eaxn"
  1275. "xorb (%%esi), %%bln"
  1276. "xorl (%%edi,%%ebx,4), %%eaxn"
  1277. "decl %%ecxn"
  1278. "jz 2fn"
  1279. "movb %%al, %%bln"
  1280. "shrl $8, %%eaxn"
  1281. "xorb 1(%%esi), %%bln"
  1282. "xorl (%%edi,%%ebx,4), %%eaxn"
  1283. "decl %%ecxn"
  1284. "jz 2fn"
  1285. "movb %%al, %%bln"
  1286. "shrl $8, %%eaxn"
  1287. "xorb 2(%%esi), %%bln"
  1288. "xorl (%%edi,%%ebx,4), %%eaxn"
  1289. "2:n"
  1290. :
  1291. : "a" (_crc), "g" (p), "g" (len)
  1292. : "ax", "bx", "cx", "dx", "si", "di"
  1293. );
  1294. return  _crc;
  1295. }
  1296. #else /* ASM_CRC */
  1297. static u32
  1298. calc_crc32( u32  crc,  u8  *p,  u32  len )
  1299. {
  1300. while( len-- )
  1301. crc = CRC32( *p++, crc );
  1302. return  crc;
  1303. }
  1304. #endif /* ASM_CRC */
  1305. static u32  crc32tab[] __attribute__ ((aligned(8))) = {
  1306. 0xD202EF8D,  0xA505DF1B,  0x3C0C8EA1,  0x4B0BBE37,
  1307. 0xD56F2B94,  0xA2681B02,  0x3B614AB8,  0x4C667A2E,
  1308. 0xDCD967BF,  0xABDE5729,  0x32D70693,  0x45D03605,
  1309. 0xDBB4A3A6,  0xACB39330,  0x35BAC28A,  0x42BDF21C,
  1310. 0xCFB5FFE9,  0xB8B2CF7F,  0x21BB9EC5,  0x56BCAE53,
  1311. 0xC8D83BF0,  0xBFDF0B66,  0x26D65ADC,  0x51D16A4A,
  1312. 0xC16E77DB,  0xB669474D,  0x2F6016F7,  0x58672661,
  1313. 0xC603B3C2,  0xB1048354,  0x280DD2EE,  0x5F0AE278,
  1314. 0xE96CCF45,  0x9E6BFFD3,  0x0762AE69,  0x70659EFF,
  1315. 0xEE010B5C,  0x99063BCA,  0x000F6A70,  0x77085AE6,
  1316. 0xE7B74777,  0x90B077E1,  0x09B9265B,  0x7EBE16CD,
  1317. 0xE0DA836E,  0x97DDB3F8,  0x0ED4E242,  0x79D3D2D4,
  1318. 0xF4DBDF21,  0x83DCEFB7,  0x1AD5BE0D,  0x6DD28E9B,
  1319. 0xF3B61B38,  0x84B12BAE,  0x1DB87A14,  0x6ABF4A82,
  1320. 0xFA005713,  0x8D076785,  0x140E363F,  0x630906A9,
  1321. 0xFD6D930A,  0x8A6AA39C,  0x1363F226,  0x6464C2B0,
  1322. 0xA4DEAE1D,  0xD3D99E8B,  0x4AD0CF31,  0x3DD7FFA7,
  1323. 0xA3B36A04,  0xD4B45A92,  0x4DBD0B28,  0x3ABA3BBE,
  1324. 0xAA05262F,  0xDD0216B9,  0x440B4703,  0x330C7795,
  1325. 0xAD68E236,  0xDA6FD2A0,  0x4366831A,  0x3461B38C,
  1326. 0xB969BE79,  0xCE6E8EEF,  0x5767DF55,  0x2060EFC3,
  1327. 0xBE047A60,  0xC9034AF6,  0x500A1B4C,  0x270D2BDA,
  1328. 0xB7B2364B,  0xC0B506DD,  0x59BC5767,  0x2EBB67F1,
  1329. 0xB0DFF252,  0xC7D8C2C4,  0x5ED1937E,  0x29D6A3E8,
  1330. 0x9FB08ED5,  0xE8B7BE43,  0x71BEEFF9,  0x06B9DF6F,
  1331. 0x98DD4ACC,  0xEFDA7A5A,  0x76D32BE0,  0x01D41B76,
  1332. 0x916B06E7,  0xE66C3671,  0x7F6567CB,  0x0862575D,
  1333. 0x9606C2FE,  0xE101F268,  0x7808A3D2,  0x0F0F9344,
  1334. 0x82079EB1,  0xF500AE27,  0x6C09FF9D,  0x1B0ECF0B,
  1335. 0x856A5AA8,  0xF26D6A3E,  0x6B643B84,  0x1C630B12,
  1336. 0x8CDC1683,  0xFBDB2615,  0x62D277AF,  0x15D54739,
  1337. 0x8BB1D29A,  0xFCB6E20C,  0x65BFB3B6,  0x12B88320,
  1338. 0x3FBA6CAD,  0x48BD5C3B,  0xD1B40D81,  0xA6B33D17,
  1339. 0x38D7A8B4,  0x4FD09822,  0xD6D9C998,  0xA1DEF90E,
  1340. 0x3161E49F,  0x4666D409,  0xDF6F85B3,  0xA868B525,
  1341. 0x360C2086,  0x410B1010,  0xD80241AA,  0xAF05713C,
  1342. 0x220D7CC9,  0x550A4C5F,  0xCC031DE5,  0xBB042D73,
  1343. 0x2560B8D0,  0x52678846,  0xCB6ED9FC,  0xBC69E96A,
  1344. 0x2CD6F4FB,  0x5BD1C46D,  0xC2D895D7,  0xB5DFA541,
  1345. 0x2BBB30E2,  0x5CBC0074,  0xC5B551CE,  0xB2B26158,
  1346. 0x04D44C65,  0x73D37CF3,  0xEADA2D49,  0x9DDD1DDF,
  1347. 0x03B9887C,  0x74BEB8EA,  0xEDB7E950,  0x9AB0D9C6,
  1348. 0x0A0FC457,  0x7D08F4C1,  0xE401A57B,  0x930695ED,
  1349. 0x0D62004E,  0x7A6530D8,  0xE36C6162,  0x946B51F4,
  1350. 0x19635C01,  0x6E646C97,  0xF76D3D2D,  0x806A0DBB,
  1351. 0x1E0E9818,  0x6909A88E,  0xF000F934,  0x8707C9A2,
  1352. 0x17B8D433,  0x60BFE4A5,  0xF9B6B51F,  0x8EB18589,
  1353. 0x10D5102A,  0x67D220BC,  0xFEDB7106,  0x89DC4190,
  1354. 0x49662D3D,  0x3E611DAB,  0xA7684C11,  0xD06F7C87,
  1355. 0x4E0BE924,  0x390CD9B2,  0xA0058808,  0xD702B89E,
  1356. 0x47BDA50F,  0x30BA9599,  0xA9B3C423,  0xDEB4F4B5,
  1357. 0x40D06116,  0x37D75180,  0xAEDE003A,  0xD9D930AC,
  1358. 0x54D13D59,  0x23D60DCF,  0xBADF5C75,  0xCDD86CE3,
  1359. 0x53BCF940,  0x24BBC9D6,  0xBDB2986C,  0xCAB5A8FA,
  1360. 0x5A0AB56B,  0x2D0D85FD,  0xB404D447,  0xC303E4D1,
  1361. 0x5D677172,  0x2A6041E4,  0xB369105E,  0xC46E20C8,
  1362. 0x72080DF5,  0x050F3D63,  0x9C066CD9,  0xEB015C4F,
  1363. 0x7565C9EC,  0x0262F97A,  0x9B6BA8C0,  0xEC6C9856,
  1364. 0x7CD385C7,  0x0BD4B551,  0x92DDE4EB,  0xE5DAD47D,
  1365. 0x7BBE41DE,  0x0CB97148,  0x95B020F2,  0xE2B71064,
  1366. 0x6FBF1D91,  0x18B82D07,  0x81B17CBD,  0xF6B64C2B,
  1367. 0x68D2D988,  0x1FD5E91E,  0x86DCB8A4,  0xF1DB8832,
  1368. 0x616495A3,  0x1663A535,  0x8F6AF48F,  0xF86DC419,
  1369. 0x660951BA,  0x110E612C,  0x88073096,  0xFF000000
  1370. };