• Home
  • Raw
  • Download

Lines Matching +full:master +full:- +full:stats

8  *	Driver supports SBNI12-02,-04,-05,-10,-11 cards, single and
9 * double-channel, PCI and ISA modifications.
18 * - Fixed bug in probe
20 * - Driver was completely redesigned by Denis I.Timofeev,
21 * - now PCI/Dual, ISA/Dual (with single interrupt line) models are
22 * - supported
24 * - PCI cards support
26 * - Completely rebuilt all the packet storage system
27 * - to work in Ethernet-like style.
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,
85 /* transmitting frame number - from frames qty to 1 */
91 /* count of failed attempts to frame send - 32 attempts do before
92 error - while receiver tunes on opposite side of wire */
109 struct net_device *master; member
168 { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
172 { [0 ... SBNI_MAX_NUM_CARDS-1] = -1 };
180 /* A zero-terminated list of I/O addresses to be probed on ISA bus */
187 #define NET_LOCAL_LOCK(dev) (((struct net_local *)netdev_priv(dev))->lock)
190 * Look for SBNI card which addr stored in dev->base_addr, if nonzero.
191 * Otherwise, look through PCI bus. If none PCI-card was found, scan ISA.
197 if( dev->base_addr > 0x1ff && in sbni_isa_probe()
198 request_region( dev->base_addr, SBNI_IO_EXTENT, dev->name ) && in sbni_isa_probe()
199 sbni_probe1( dev, dev->base_addr, dev->irq ) ) in sbni_isa_probe()
204 dev->base_addr); in sbni_isa_probe()
205 return -ENODEV; in sbni_isa_probe()
222 dev->netdev_ops = &sbni_netdev_ops; in sbni_devsetup()
233 return -ENOMEM; in sbni_probe()
235 dev->netdev_ops = &sbni_netdev_ops; in sbni_probe()
237 sprintf(dev->name, "sbni%d", unit); in sbni_probe()
248 release_region( dev->base_addr, SBNI_IO_EXTENT ); in sbni_probe()
259 if( dev->base_addr ) in sbni_init()
263 if( io[ num ] != -1 ) { in sbni_init()
264 dev->base_addr = io[ num ]; in sbni_init()
265 dev->irq = irq[ num ]; in sbni_init()
266 } else if( scandone || io[ 0 ] != -1 ) { in sbni_init()
267 return -ENODEV; in sbni_init()
270 /* if io[ num ] contains non-zero address, then that is on ISA bus */ in sbni_init()
271 if( dev->base_addr ) in sbni_init()
274 /* ...otherwise - scan PCI first */ in sbni_init()
278 if( io[ num ] == -1 ) { in sbni_init()
279 /* Auto-scan will be stopped when first ISA card were found */ in sbni_init()
282 return -ENODEV; in sbni_init()
287 if( request_region( ioaddr, SBNI_IO_EXTENT, dev->name ) && in sbni_init()
292 return -ENODEV; in sbni_init()
306 if( pdev->vendor != SBNI_PCI_VENDOR && in sbni_pci_probe()
307 pdev->device != SBNI_PCI_DEVICE ) in sbni_pci_probe()
311 pci_irq_line = pdev->irq; in sbni_pci_probe()
314 if( !request_region( pci_ioaddr, SBNI_IO_EXTENT, dev->name ) ) { in sbni_pci_probe()
315 if (pdev->subsystem_device != 2) in sbni_pci_probe()
320 dev->name ) ) in sbni_pci_probe()
330 /* avoiding re-enable dual adapters */ in sbni_pci_probe()
334 return -EIO; in sbni_pci_probe()
337 SET_NETDEV_DEV(dev, &pdev->dev); in sbni_pci_probe()
344 return -ENODEV; in sbni_pci_probe()
371 pr_err("%s: can't detect device irq!\n", dev->name); in sbni_probe1()
378 dev->irq = irq; in sbni_probe1()
379 dev->base_addr = ioaddr; in sbni_probe1()
381 /* Fill in sbni-specific dev fields. */ in sbni_probe1()
384 pr_err("%s: unable to get memory!\n", dev->name); in sbni_probe1()
390 spin_lock_init( &nl->lock ); in sbni_probe1()
393 *(__be16 *)dev->dev_addr = htons( 0x00ff ); in sbni_probe1()
394 *(__be32 *)(dev->dev_addr + 2) = htonl( 0x01000000 | in sbni_probe1()
400 nl->maxframe = DEFAULT_FRAME_LEN; in sbni_probe1()
401 nl->csr1.rate = baud[ num ]; in sbni_probe1()
403 if( (nl->cur_rxl_index = rxl[ num ]) == -1 ) { in sbni_probe1()
405 nl->cur_rxl_index = DEF_RXL; in sbni_probe1()
406 nl->delta_rxl = DEF_RXL_DELTA; in sbni_probe1()
408 nl->delta_rxl = 0; in sbni_probe1()
410 nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ]; in sbni_probe1()
412 nl->state |= FL_SLOW_MODE; in sbni_probe1()
415 dev->name, dev->base_addr, dev->irq, in sbni_probe1()
416 ((u8 *)dev->dev_addr)[3], in sbni_probe1()
417 ((u8 *)dev->dev_addr)[4], in sbni_probe1()
418 ((u8 *)dev->dev_addr)[5]); in sbni_probe1()
421 dev->name, in sbni_probe1()
422 ((nl->state & FL_SLOW_MODE) ? 500000 : 2000000) in sbni_probe1()
423 / (1 << nl->csr1.rate)); in sbni_probe1()
425 if( nl->delta_rxl == 0 ) in sbni_probe1()
426 pr_cont(", receive level 0x%x (fixed)\n", nl->cur_rxl_index); in sbni_probe1()
431 nl->master = dev; in sbni_probe1()
432 nl->link = NULL; in sbni_probe1()
439 /* -------------------------------------------------------------------------- */
453 spin_lock( &nl->lock ); in sbni_start_xmit()
454 if( nl->tx_buf_p || (nl->state & FL_LINE_DOWN) ) { in sbni_start_xmit()
455 p = nl->link; in sbni_start_xmit()
456 spin_unlock( &nl->lock ); in sbni_start_xmit()
460 spin_unlock( &nl->lock ); in sbni_start_xmit()
477 spin_lock( &nl->lock ); in sbni_start_xmit()
481 spin_unlock( &nl->lock ); in sbni_start_xmit()
487 /* -------------------------------------------------------------------------- */
492 * SBNI12D-10, -11/ISA boards within "common interrupt" mode could not
493 * be looked as two independent single-channel devices. Every channel seems
495 * channel ("master") driver only registers the handler. In its struct net_local
501 * this board to be "master".
511 spin_lock( &nl->lock ); in sbni_interrupt()
512 if( nl->second ) in sbni_interrupt()
513 spin_lock(&NET_LOCAL_LOCK(nl->second)); in sbni_interrupt()
517 if( inb( dev->base_addr + CSR0 ) & (RC_RDY | TR_RDY) ) { in sbni_interrupt()
521 if( nl->second && /* second channel present */ in sbni_interrupt()
522 (inb( nl->second->base_addr+CSR0 ) & (RC_RDY | TR_RDY)) ) { in sbni_interrupt()
523 handle_channel( nl->second ); in sbni_interrupt()
528 if( nl->second ) in sbni_interrupt()
529 spin_unlock(&NET_LOCAL_LOCK(nl->second)); in sbni_interrupt()
530 spin_unlock( &nl->lock ); in sbni_interrupt()
539 unsigned long ioaddr = dev->base_addr; in handle_channel()
545 /* Lock the master device because we going to change its local data */ in handle_channel()
546 if( nl->state & FL_SLAVE ) in handle_channel()
547 spin_lock(&NET_LOCAL_LOCK(nl->master)); in handle_channel()
552 nl->timer_ticks = CHANGE_LEVEL_START_TICKS; in handle_channel()
558 req_ans = !(nl->state & FL_PREV_OK); in handle_channel()
572 if( req_ans || nl->tx_frameno != 0 ) in handle_channel()
582 if( nl->state & FL_SLAVE ) in handle_channel()
583 spin_unlock(&NET_LOCAL_LOCK(nl->master)); in handle_channel()
597 unsigned long ioaddr = dev->base_addr; in recv_frame()
614 nl->state |= FL_PREV_OK; in recv_frame()
616 nl->in_stats.all_rx_number++; in recv_frame()
618 nl->state &= ~FL_PREV_OK; in recv_frame()
620 nl->in_stats.all_rx_number++; in recv_frame()
621 nl->in_stats.bad_rx_number++; in recv_frame()
635 if( nl->state & FL_NEED_RESEND ) { in send_frame()
637 /* if frame was sended but not ACK'ed - resend it */ in send_frame()
638 if( nl->trans_errors ) { in send_frame()
639 --nl->trans_errors; in send_frame()
640 if( nl->framelen != 0 ) in send_frame()
641 nl->in_stats.resend_tx_number++; in send_frame()
645 if( (nl->state & FL_SLAVE) || nl->link ) in send_frame()
647 nl->state |= FL_LINE_DOWN; in send_frame()
652 nl->trans_errors = TR_ERROR_COUNT; in send_frame()
655 nl->state |= FL_NEED_RESEND; in send_frame()
662 if( nl->framelen ) { in send_frame()
664 nl->in_stats.all_tx_number++; in send_frame()
665 nl->state |= FL_WAIT_ACK; in send_frame()
668 outsb( dev->base_addr + DAT, (u8 *)&crc, sizeof crc ); in send_frame()
671 outb( inb( dev->base_addr + CSR0 ) & ~TR_REQ, dev->base_addr + CSR0 ); in send_frame()
673 if( nl->tx_frameno ) in send_frame()
674 /* next frame exists - we request card to send it */ in send_frame()
675 outb( inb( dev->base_addr + CSR0 ) | TR_REQ, in send_frame()
676 dev->base_addr + CSR0 ); in send_frame()
689 struct sk_buff *skb = nl->tx_buf_p; in download_data()
691 unsigned len = min_t(unsigned int, skb->len - nl->outpos, nl->framelen); in download_data()
693 outsb( dev->base_addr + DAT, skb->data + nl->outpos, len ); in download_data()
694 *crc_p = calc_crc32( *crc_p, skb->data + nl->outpos, len ); in download_data()
697 for( len = nl->framelen - len; len--; ) { in download_data()
698 outb( 0, dev->base_addr + DAT ); in download_data()
713 nl->wait_frameno = frameno; in upload_data()
714 nl->inppos = 0; in upload_data()
717 if( nl->wait_frameno == frameno ) { in upload_data()
719 if( nl->inppos + framelen <= ETHER_MAX_LEN ) in upload_data()
726 else if( (frame_ok = skip_tail( dev->base_addr, framelen, crc )) in upload_data()
728 nl->wait_frameno = 0; in upload_data()
729 nl->inppos = 0; in upload_data()
731 nl->master->stats.rx_errors++; in upload_data()
732 nl->master->stats.rx_missed_errors++; in upload_data()
734 dev->stats.rx_errors++; in upload_data()
735 dev->stats.rx_missed_errors++; in upload_data()
740 frame_ok = skip_tail( dev->base_addr, framelen, crc ); in upload_data()
747 nl->wait_frameno = 0; in upload_data()
749 nl->master->stats.rx_errors++; in upload_data()
750 nl->master->stats.rx_crc_errors++; in upload_data()
752 dev->stats.rx_errors++; in upload_data()
753 dev->stats.rx_crc_errors++; in upload_data()
767 nl->master->stats.tx_packets++; in send_complete()
768 nl->master->stats.tx_bytes += nl->tx_buf_p->len; in send_complete()
770 dev->stats.tx_packets++; in send_complete()
771 dev->stats.tx_bytes += nl->tx_buf_p->len; in send_complete()
773 dev_consume_skb_irq(nl->tx_buf_p); in send_complete()
775 nl->tx_buf_p = NULL; in send_complete()
777 nl->outpos = 0; in send_complete()
778 nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND); in send_complete()
779 nl->framelen = 0; in send_complete()
789 nl->state &= ~FL_NEED_RESEND; in interpret_ack()
791 if( nl->state & FL_WAIT_ACK ) { in interpret_ack()
792 nl->outpos += nl->framelen; in interpret_ack()
794 if( --nl->tx_frameno ) { in interpret_ack()
795 nl->framelen = min_t(unsigned int, in interpret_ack()
796 nl->maxframe, in interpret_ack()
797 nl->tx_buf_p->len - nl->outpos); in interpret_ack()
801 netif_wake_queue( nl->master ); in interpret_ack()
809 nl->state &= ~FL_WAIT_ACK; in interpret_ack()
825 if( nl->inppos + framelen > ETHER_MAX_LEN ) in append_frame_to_pkt()
828 if( !nl->rx_buf_p && !(nl->rx_buf_p = get_rx_buf( dev )) ) in append_frame_to_pkt()
831 p = nl->rx_buf_p->data + nl->inppos; in append_frame_to_pkt()
832 insb( dev->base_addr + DAT, p, framelen ); in append_frame_to_pkt()
836 nl->inppos += framelen - 4; in append_frame_to_pkt()
837 if( --nl->wait_frameno == 0 ) /* last frame received */ in append_frame_to_pkt()
856 /* nl->tx_buf_p == NULL here! */ in prepare_to_send()
857 if( nl->tx_buf_p ) in prepare_to_send()
860 nl->outpos = 0; in prepare_to_send()
861 nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND); in prepare_to_send()
863 len = skb->len; in prepare_to_send()
867 nl->tx_buf_p = skb; in prepare_to_send()
868 nl->tx_frameno = DIV_ROUND_UP(len, nl->maxframe); in prepare_to_send()
869 nl->framelen = len < nl->maxframe ? len : nl->maxframe; in prepare_to_send()
871 outb( inb( dev->base_addr + CSR0 ) | TR_REQ, dev->base_addr + CSR0 ); in prepare_to_send()
873 netif_trans_update(nl->master); in prepare_to_send()
885 if( nl->tx_buf_p ) { in drop_xmit_queue()
886 dev_kfree_skb_any( nl->tx_buf_p ); in drop_xmit_queue()
887 nl->tx_buf_p = NULL; in drop_xmit_queue()
889 nl->master->stats.tx_errors++; in drop_xmit_queue()
890 nl->master->stats.tx_carrier_errors++; in drop_xmit_queue()
892 dev->stats.tx_errors++; in drop_xmit_queue()
893 dev->stats.tx_carrier_errors++; in drop_xmit_queue()
897 nl->tx_frameno = 0; in drop_xmit_queue()
898 nl->framelen = 0; in drop_xmit_queue()
899 nl->outpos = 0; in drop_xmit_queue()
900 nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND); in drop_xmit_queue()
902 netif_start_queue( nl->master ); in drop_xmit_queue()
903 netif_trans_update(nl->master); in drop_xmit_queue()
917 u32 len_field = nl->framelen + 6; /* CRC + frameno + reserved */ in send_frame_header()
920 if( nl->state & FL_NEED_RESEND ) in send_frame_header()
921 len_field |= FRAME_RETRY; /* non-first attempt... */ in send_frame_header()
923 if( nl->outpos == 0 ) in send_frame_header()
926 len_field |= (nl->state & FL_PREV_OK) ? FRAME_SENT_OK : FRAME_SENT_BAD; in send_frame_header()
927 outb( SBNI_SIG, dev->base_addr + DAT ); in send_frame_header()
930 outb( value, dev->base_addr + DAT ); in send_frame_header()
933 outb( value, dev->base_addr + DAT ); in send_frame_header()
936 outb( nl->tx_frameno, dev->base_addr + DAT ); in send_frame_header()
937 crc = CRC32( nl->tx_frameno, crc ); in send_frame_header()
938 outb( 0, dev->base_addr + DAT ); in send_frame_header()
952 while( tail_len-- ) in skip_tail()
985 *framelen > SBNI_MAX_FRAME - 3 ) in check_fhdr()
993 *framelen -= 2; in check_fhdr()
1017 struct sk_buff *skb = nl->rx_buf_p; in indicate_pkt()
1019 skb_put( skb, nl->inppos ); in indicate_pkt()
1022 skb->protocol = eth_type_trans( skb, nl->master ); in indicate_pkt()
1024 ++nl->master->stats.rx_packets; in indicate_pkt()
1025 nl->master->stats.rx_bytes += nl->inppos; in indicate_pkt()
1027 skb->protocol = eth_type_trans( skb, dev ); in indicate_pkt()
1029 ++dev->stats.rx_packets; in indicate_pkt()
1030 dev->stats.rx_bytes += nl->inppos; in indicate_pkt()
1032 nl->rx_buf_p = NULL; /* protocol driver will clear this sk_buff */ in indicate_pkt()
1036 /* -------------------------------------------------------------------------- */
1047 struct net_device *dev = nl->watchdog_dev; in sbni_watchdog()
1051 spin_lock_irqsave( &nl->lock, flags ); in sbni_watchdog()
1053 csr0 = inb( dev->base_addr + CSR0 ); in sbni_watchdog()
1056 if( nl->timer_ticks ) { in sbni_watchdog()
1059 nl->timer_ticks--; in sbni_watchdog()
1061 nl->in_stats.timeout_number++; in sbni_watchdog()
1062 if( nl->delta_rxl ) in sbni_watchdog()
1065 outb( *(u_char *)&nl->csr1 | PR_RES, in sbni_watchdog()
1066 dev->base_addr + CSR1 ); in sbni_watchdog()
1067 csr0 = inb( dev->base_addr + CSR0 ); in sbni_watchdog()
1070 nl->state &= ~FL_LINE_DOWN; in sbni_watchdog()
1072 outb( csr0 | RC_CHK, dev->base_addr + CSR0 ); in sbni_watchdog()
1076 spin_unlock_irqrestore( &nl->lock, flags ); in sbni_watchdog()
1090 /* -------------------------------------------------------------------------- */
1097 nl->timer_ticks = CHANGE_LEVEL_START_TICKS; in card_start()
1098 nl->state &= ~(FL_WAIT_ACK | FL_NEED_RESEND); in card_start()
1099 nl->state |= FL_PREV_OK; in card_start()
1101 nl->inppos = nl->outpos = 0; in card_start()
1102 nl->wait_frameno = 0; in card_start()
1103 nl->tx_frameno = 0; in card_start()
1104 nl->framelen = 0; in card_start()
1106 outb( *(u_char *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 ); in card_start()
1107 outb( EN_INT, dev->base_addr + CSR0 ); in card_start()
1110 /* -------------------------------------------------------------------------- */
1112 /* Receive level auto-selection */
1119 if( nl->delta_rxl == 0 ) /* do not auto-negotiate RxL */ in change_level()
1122 if( nl->cur_rxl_index == 0 ) in change_level()
1123 nl->delta_rxl = 1; in change_level()
1124 else if( nl->cur_rxl_index == 15 ) in change_level()
1125 nl->delta_rxl = -1; in change_level()
1126 else if( nl->cur_rxl_rcvd < nl->prev_rxl_rcvd ) in change_level()
1127 nl->delta_rxl = -nl->delta_rxl; in change_level()
1129 nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index += nl->delta_rxl ]; in change_level()
1130 inb( dev->base_addr + CSR0 ); /* needs for PCI cards */ in change_level()
1131 outb( *(u8 *)&nl->csr1, dev->base_addr + CSR1 ); in change_level()
1133 nl->prev_rxl_rcvd = nl->cur_rxl_rcvd; in change_level()
1134 nl->cur_rxl_rcvd = 0; in change_level()
1143 nl->cur_rxl_index = timeout_rxl_tab[ nl->timeout_rxl ]; in timeout_change_level()
1144 if( ++nl->timeout_rxl >= 4 ) in timeout_change_level()
1145 nl->timeout_rxl = 0; in timeout_change_level()
1147 nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ]; in timeout_change_level()
1148 inb( dev->base_addr + CSR0 ); in timeout_change_level()
1149 outb( *(unsigned char *)&nl->csr1, dev->base_addr + CSR1 ); in timeout_change_level()
1151 nl->prev_rxl_rcvd = nl->cur_rxl_rcvd; in timeout_change_level()
1152 nl->cur_rxl_rcvd = 0; in timeout_change_level()
1155 /* -------------------------------------------------------------------------- */
1165 struct timer_list *w = &nl->watchdog; in sbni_open()
1172 if( dev->base_addr < 0x400 ) { /* ISA only */ in sbni_open()
1175 if( (*p)->irq == dev->irq && in sbni_open()
1176 ((*p)->base_addr == dev->base_addr + 4 || in sbni_open()
1177 (*p)->base_addr == dev->base_addr - 4) && in sbni_open()
1178 (*p)->flags & IFF_UP ) { in sbni_open()
1181 ->second = dev; in sbni_open()
1183 (*p)->name); in sbni_open()
1184 nl->state |= FL_SECONDARY; in sbni_open()
1189 if( request_irq(dev->irq, sbni_interrupt, IRQF_SHARED, dev->name, dev) ) { in sbni_open()
1190 netdev_err(dev, "unable to get IRQ %d\n", dev->irq); in sbni_open()
1191 return -EAGAIN; in sbni_open()
1196 spin_lock( &nl->lock ); in sbni_open()
1197 memset( &dev->stats, 0, sizeof(struct net_device_stats) ); in sbni_open()
1198 memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) ); in sbni_open()
1205 nl->watchdog_dev = dev; in sbni_open()
1207 w->expires = jiffies + SBNI_TIMEOUT; in sbni_open()
1210 spin_unlock( &nl->lock ); in sbni_open()
1220 if( nl->second && nl->second->flags & IFF_UP ) { in sbni_close()
1222 nl->second->name); in sbni_close()
1223 return -EBUSY; in sbni_close()
1227 if( nl->state & FL_SLAVE ) in sbni_close()
1230 while( nl->link ) /* it's master device! */ in sbni_close()
1231 emancipate( nl->link ); in sbni_close()
1234 spin_lock( &nl->lock ); in sbni_close()
1236 nl->second = NULL; in sbni_close()
1240 del_timer( &nl->watchdog ); in sbni_close()
1242 outb( 0, dev->base_addr + CSR0 ); in sbni_close()
1244 if( !(nl->state & FL_SECONDARY) ) in sbni_close()
1245 free_irq( dev->irq, dev ); in sbni_close()
1246 nl->state &= FL_SECONDARY; in sbni_close()
1248 spin_unlock( &nl->lock ); in sbni_close()
1258 ; 0 ; -
1260 TR_RDY ; 2 ; -
1264 BU_EMP TR_RDY ; 6 ; -
1268 RC_RDY TR_RDY ; 10 ; -
1269 RC_RDY TR_RDY TR_REQ ; 11 ; -
1270 RC_RDY BU_EMP ; 12 ; -
1271 RC_RDY BU_EMP TR_REQ ; 13 ; -
1272 RC_RDY BU_EMP TR_RDY ; 14 ; -
1273 RC_RDY BU_EMP TR_RDY TR_REQ ; 15 ; -
1294 return -ENODEV; in sbni_card_probe()
1297 /* -------------------------------------------------------------------------- */
1313 if (copy_to_user( ifr->ifr_data, &nl->in_stats, in sbni_ioctl()
1315 error = -EFAULT; in sbni_ioctl()
1320 return -EPERM; in sbni_ioctl()
1321 memset( &nl->in_stats, 0, sizeof(struct sbni_in_stats) ); in sbni_ioctl()
1325 flags.mac_addr = *(u32 *)(dev->dev_addr + 3); in sbni_ioctl()
1326 flags.rate = nl->csr1.rate; in sbni_ioctl()
1327 flags.slow_mode = (nl->state & FL_SLOW_MODE) != 0; in sbni_ioctl()
1328 flags.rxl = nl->cur_rxl_index; in sbni_ioctl()
1329 flags.fixed_rxl = nl->delta_rxl == 0; in sbni_ioctl()
1331 if (copy_to_user( ifr->ifr_data, &flags, sizeof flags )) in sbni_ioctl()
1332 error = -EFAULT; in sbni_ioctl()
1337 return -EPERM; in sbni_ioctl()
1339 spin_lock( &nl->lock ); in sbni_ioctl()
1340 flags = *(struct sbni_flags*) &ifr->ifr_ifru; in sbni_ioctl()
1342 nl->delta_rxl = 0; in sbni_ioctl()
1343 nl->cur_rxl_index = flags.rxl; in sbni_ioctl()
1345 nl->delta_rxl = DEF_RXL_DELTA; in sbni_ioctl()
1346 nl->cur_rxl_index = DEF_RXL; in sbni_ioctl()
1349 nl->csr1.rxl = rxl_tab[ nl->cur_rxl_index ]; in sbni_ioctl()
1350 nl->csr1.rate = flags.rate; in sbni_ioctl()
1351 outb( *(u8 *)&nl->csr1 | PR_RES, dev->base_addr + CSR1 ); in sbni_ioctl()
1352 spin_unlock( &nl->lock ); in sbni_ioctl()
1359 return -EPERM; in sbni_ioctl()
1361 if (copy_from_user( slave_name, ifr->ifr_data, sizeof slave_name )) in sbni_ioctl()
1362 return -EFAULT; in sbni_ioctl()
1364 if( !slave_dev || !(slave_dev->flags & IFF_UP) ) { in sbni_ioctl()
1365 netdev_err(dev, "trying to enslave non-active device %s\n", in sbni_ioctl()
1369 return -EPERM; in sbni_ioctl()
1376 return -EPERM; in sbni_ioctl()
1383 return -EOPNOTSUPP; in sbni_ioctl()
1398 if( nl->state & FL_SLAVE ) /* This isn't master or free device */ in enslave()
1399 return -EBUSY; in enslave()
1401 if( snl->state & FL_SLAVE ) /* That was already enslaved */ in enslave()
1402 return -EBUSY; in enslave()
1404 spin_lock( &nl->lock ); in enslave()
1405 spin_lock( &snl->lock ); in enslave()
1408 snl->link = nl->link; in enslave()
1409 nl->link = slave_dev; in enslave()
1410 snl->master = dev; in enslave()
1411 snl->state |= FL_SLAVE; in enslave()
1414 in master's counters */ in enslave()
1415 memset( &slave_dev->stats, 0, sizeof(struct net_device_stats) ); in enslave()
1419 spin_unlock( &snl->lock ); in enslave()
1420 spin_unlock( &nl->lock ); in enslave()
1421 netdev_notice(dev, "slave device (%s) attached\n", slave_dev->name); in enslave()
1430 struct net_device *p = snl->master; in emancipate()
1433 if( !(snl->state & FL_SLAVE) ) in emancipate()
1434 return -EINVAL; in emancipate()
1436 spin_lock( &nl->lock ); in emancipate()
1437 spin_lock( &snl->lock ); in emancipate()
1443 if( t->link == dev ) { in emancipate()
1444 t->link = snl->link; in emancipate()
1447 p = t->link; in emancipate()
1450 snl->link = NULL; in emancipate()
1451 snl->master = dev; in emancipate()
1452 snl->state &= ~FL_SLAVE; in emancipate()
1456 spin_unlock( &snl->lock ); in emancipate()
1457 spin_unlock( &nl->lock ); in emancipate()
1494 sprintf( dev->name, "sbni%d", num ); in init_module()
1503 release_region( dev->base_addr, SBNI_IO_EXTENT ); in init_module()
1509 return *sbni_cards ? 0 : -ENODEV; in init_module()
1521 release_region(dev->base_addr, SBNI_IO_EXTENT); in cleanup_module()
1561 /* -------------------------------------------------------------------------- */
1566 while( len-- ) in calc_crc32()