Lines Matching +full:bank +full:- +full:ioport
6 Written 1993-2000 by Donald Becker.
16 National Security Agency. Copyright 1994-2000 retained by the original
17 author, Donald Becker. The timer-based reset code was supplied in 1995
37 /* The user-configurable values.
58 This file is a device driver for the RealTek (aka AT-Lan-Tec) pocket
59 ethernet adapter. This is a common low-cost OEM pocket ethernet
64 Vincent Bono of AT-Lan-Tec. Ever try to figure out how a complicated
66 description is written based on guesses and writing lots of special-purpose
84 The station address is stored in a standard bit-serial EEPROM which must be
87 using it.) Unlike built-in devices, a pocket adapter can temporarily lose
99 bank contains only the multicast filter table (now used) and the EEPROM
104 (non-register) transfer modes are provided by the adapter, two in each
115 The data transfer mode is stored in the 'dev->if_port' field. Its default
116 value is '4'. It may be overridden at boot-time using the third parameter
120 register and data access methods. These functions are hand-tuned to
130 #include <linux/ioport.h>
154 module_param_hw_array(io, int, ioport, NULL, 0);
158 MODULE_PARM_DESC(debug, "ATP debug level (0-7)");
214 If dev->base_addr == 0, probe all likely locations.
215 If dev->base_addr == 1, always return failure.
216 If dev->base_addr == 2, allocate space for the device and return success
229 return -ENXIO; in atp_init()
240 return -ENODEV; in atp_init()
297 return -ENODEV; in atp_probe1()
302 return -ENODEV; in atp_probe1()
307 return -ENOMEM; in atp_probe1()
315 dev->irq = irq[0]; in atp_probe1()
317 dev->irq = 7; in atp_probe1()
319 dev->irq = 5; in atp_probe1()
323 dev->base_addr = ioaddr; in atp_probe1()
335 dev->name, dev->base_addr, dev->irq, dev->dev_addr); in atp_probe1()
337 /* Reset the ethernet hardware and activate the printer pass-through. */ in atp_probe1()
341 lp->addr_mode = CMR2h_Normal; in atp_probe1()
342 spin_lock_init(&lp->lock); in atp_probe1()
346 dev->if_port = xcvr[0]; in atp_probe1()
348 dev->if_port = (dev->mem_start & 0xf) ? (dev->mem_start & 0x7) : 4; in atp_probe1()
349 if (dev->mem_end & 0xf) in atp_probe1()
350 net_debug = dev->mem_end & 7; in atp_probe1()
352 dev->netdev_ops = &atp_netdev_ops; in atp_probe1()
353 dev->watchdog_timeo = TX_TIMEOUT; in atp_probe1()
361 lp->next_module = root_atp_dev; in atp_probe1()
367 /* Read the station address PROM, usually a word-wide EEPROM. */
370 long ioaddr = dev->base_addr; in get_node_ID()
382 ((__be16 *)dev->dev_addr)[i] = in get_node_ID()
405 while (--num_bits >= 0) { in eeprom_op()
423 there is non-reboot way to recover if something goes wrong.
426 probed for at boot-time, and we need to probe for it again.
433 /* The interrupt line is turned off (tri-stated) when the device isn't in in net_open()
436 ret = request_irq(dev->irq, atp_interrupt, 0, dev->name, dev); in net_open()
442 lp->dev = dev; in net_open()
443 timer_setup(&lp->timer, atp_timed_checker, 0); in net_open()
444 lp->timer.expires = jiffies + TIMED_CHECKER; in net_open()
445 add_timer(&lp->timer); in net_open()
456 long ioaddr = dev->base_addr; in hardware_init()
465 write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]); in hardware_init()
467 write_reg_high(ioaddr, CMR2, lp->addr_mode); in hardware_init()
470 printk(KERN_DEBUG "%s: Reset: current Rx mode %d.\n", dev->name, in hardware_init()
484 lp->tx_unit_busy = 0; in hardware_init()
485 lp->pac_cnt_in_tx_buf = 0; in hardware_init()
486 lp->saved_tx_size = 0; in hardware_init()
510 } while (--length > pad_len) ; in write_packet()
513 } while (--length > 0) ; in write_packet()
526 while (--length > pad_len) in write_packet()
528 while (--length > 0) in write_packet()
538 long ioaddr = dev->base_addr; in tx_timeout()
540 printk(KERN_WARNING "%s: Transmit timed out, %s?\n", dev->name, in tx_timeout()
543 dev->stats.tx_errors++; in tx_timeout()
548 dev->stats.tx_errors++; in tx_timeout()
555 long ioaddr = dev->base_addr; in atp_send_packet()
559 length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN; in atp_send_packet()
566 spin_lock_irqsave(&lp->lock, flags); in atp_send_packet()
569 spin_unlock_irqrestore(&lp->lock, flags); in atp_send_packet()
571 write_packet(ioaddr, length, skb->data, length-skb->len, dev->if_port); in atp_send_packet()
573 lp->pac_cnt_in_tx_buf++; in atp_send_packet()
574 if (lp->tx_unit_busy == 0) { in atp_send_packet()
576 lp->saved_tx_size = 0; /* Redundant */ in atp_send_packet()
577 lp->re_tx = 0; in atp_send_packet()
578 lp->tx_unit_busy = 1; in atp_send_packet()
580 lp->saved_tx_size = length; in atp_send_packet()
581 /* Re-enable the LPT interrupts. */ in atp_send_packet()
601 ioaddr = dev->base_addr; in atp_interrupt()
604 spin_lock(&lp->lock); in atp_interrupt()
614 printk(KERN_DEBUG "%s: In interrupt ", dev->name); in atp_interrupt()
615 while (--boguscount > 0) { in atp_interrupt()
630 dev->stats.rx_over_errors++; in atp_interrupt()
631 /* Set to no-accept mode long enough to remove a packet. */ in atp_interrupt()
636 write_reg_high(ioaddr, CMR2, lp->addr_mode); in atp_interrupt()
642 } while (--boguscount > 0); in atp_interrupt()
651 dev->stats.collisions++; in atp_interrupt()
652 if (++lp->re_tx > 15) { in atp_interrupt()
653 dev->stats.tx_aborted_errors++; in atp_interrupt()
662 dev->stats.tx_packets++; in atp_interrupt()
663 lp->pac_cnt_in_tx_buf--; in atp_interrupt()
664 if ( lp->saved_tx_size) { in atp_interrupt()
665 trigger_send(ioaddr, lp->saved_tx_size); in atp_interrupt()
666 lp->saved_tx_size = 0; in atp_interrupt()
667 lp->re_tx = 0; in atp_interrupt()
669 lp->tx_unit_busy = 0; in atp_interrupt()
674 time_after(jiffies, lp->last_rx_time + HZ)) { in atp_interrupt()
677 "%ld jiffies status %02x CMR1 %02x.\n", dev->name, in atp_interrupt()
678 num_tx_since_rx, jiffies - lp->last_rx_time, status, in atp_interrupt()
680 dev->stats.rx_missed_errors++; in atp_interrupt()
693 write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]); in atp_interrupt()
695 mod_timer(&lp->timer, jiffies + TIMED_CHECKER); in atp_interrupt()
707 spin_unlock(&lp->lock); in atp_interrupt()
719 struct net_device *dev = lp->dev; in atp_timed_checker()
720 long ioaddr = dev->base_addr; in atp_timed_checker()
721 int tickssofar = jiffies - lp->last_rx_time; in atp_timed_checker()
724 spin_lock(&lp->lock); in atp_timed_checker()
728 write_reg_byte(ioaddr, PAR0 + i, dev->dev_addr[i]); in atp_timed_checker()
729 lp->last_rx_time = jiffies; in atp_timed_checker()
732 if (read_cmd_byte(ioaddr, PAR0 + i) != atp_timed_dev->dev_addr[i]) in atp_timed_checker()
735 write_reg_byte(ioaddr, PAR0 + i, atp_timed_dev->dev_addr[i]); in atp_timed_checker()
737 dev->stats.tx_errors++; in atp_timed_checker()
739 dev->stats.tx_dropped++; in atp_timed_checker()
741 dev->stats.collisions++; in atp_timed_checker()
743 dev->stats.rx_errors++; in atp_timed_checker()
747 spin_unlock(&lp->lock); in atp_timed_checker()
748 lp->timer.expires = jiffies + TIMED_CHECKER; in atp_timed_checker()
749 add_timer(&lp->timer); in atp_timed_checker()
757 long ioaddr = dev->base_addr; in net_rx()
762 read_block(ioaddr, 8, (unsigned char*)&rx_head, dev->if_port); in net_rx()
767 dev->stats.rx_errors++; in net_rx()
768 if (rx_head.rx_status & 0x0004) dev->stats.rx_frame_errors++; in net_rx()
769 else if (rx_head.rx_status & 0x0002) dev->stats.rx_crc_errors++; in net_rx()
772 dev->name, rx_head.rx_status); in net_rx()
774 dev->stats.rx_fifo_errors++; in net_rx()
781 /* Malloc up new buffer. The "-4" omits the FCS (CRC). */ in net_rx()
782 int pkt_len = (rx_head.rx_count & 0x7ff) - 4; in net_rx()
787 dev->stats.rx_dropped++; in net_rx()
792 read_block(ioaddr, pkt_len, skb_put(skb,pkt_len), dev->if_port); in net_rx()
793 skb->protocol = eth_type_trans(skb, dev); in net_rx()
795 dev->stats.rx_packets++; in net_rx()
796 dev->stats.rx_bytes += pkt_len; in net_rx()
800 lp->last_rx_time = jiffies; in net_rx()
810 do { *p++ = read_byte_mode0(ioaddr); } while (--length > 0); in read_block()
812 do { *p++ = read_byte_mode2(ioaddr); } while (--length > 0); in read_block()
815 do { *p++ = read_byte_mode4(ioaddr); } while (--length > 0); in read_block()
817 do { *p++ = read_byte_mode6(ioaddr); } while (--length > 0); in read_block()
829 long ioaddr = dev->base_addr; in net_close()
833 del_timer_sync(&lp->timer); in net_close()
836 lp->addr_mode = CMR2h_OFF; in net_close()
841 free_irq(dev->irq, dev); in net_close()
843 /* Reset the ethernet hardware and activate the printer pass-through. */ in net_close()
855 long ioaddr = dev->base_addr; in set_rx_mode()
857 if (!netdev_mc_empty(dev) || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) in set_rx_mode()
858 lp->addr_mode = CMR2h_PROMISC; in set_rx_mode()
860 lp->addr_mode = CMR2h_Normal; in set_rx_mode()
861 write_reg_high(ioaddr, CMR2, lp->addr_mode); in set_rx_mode()
875 next_dev = atp_local->next_module; in atp_cleanup_module()