sbni.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:43k
源码类别:

Linux/Unix编程

开发平台:

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