Lines Matching +full:100 +full:base +full:- +full:fx

3  *	Copyright 1996-1999 Thomas Bogendoerfer
85 static int tx_start = 1; /* Mapping -- 0:20, 1:64, 2:128, 3:~220 (depends on chip vers) */
113 PCNET32_PORT_ASEL, /* 0 Auto-select */
117 PCNET32_PORT_10BT | PCNET32_PORT_FD, /* 4 10baseT-FD */
123 PCNET32_PORT_MII | PCNET32_PORT_FD, /* 10 MII 10baseT-FD */
126 PCNET32_PORT_MII | PCNET32_PORT_100, /* 13 MII 100BaseTx */
127 /* 14 MII 100BaseTx-FD */
175 #define PKT_BUF_SIZE (PKT_BUF_SKB - NET_IP_ALIGN)
177 #define NEG_BUF_SIZE (NET_IP_ALIGN - PKT_BUF_SKB)
179 /* Offsets from base I/O address. */
213 __le32 base; member
221 __le32 base; member
228 /* The PCNET32 32-Bit initialization block, described in databook. */
235 /* Receive and transmit ring base, along with extra bits. */
257 /* The Tx and Rx ring entries must be aligned on 16-byte boundaries in 32bit mode. */
264 /* The saved address of a sent-in-place packet/buffer, for skfree(). */
451 napi_disable(&lp->napi); in pcnet32_netif_stop()
458 ulong ioaddr = dev->base_addr; in pcnet32_netif_start()
462 val = lp->a->read_csr(ioaddr, CSR3); in pcnet32_netif_start()
464 lp->a->write_csr(ioaddr, CSR3, val); in pcnet32_netif_start()
465 napi_enable(&lp->napi); in pcnet32_netif_start()
473 * Must be called with lp->lock held.
488 dma_alloc_coherent(&lp->pci_dev->dev, in pcnet32_realloc_tx_ring()
502 kfree(lp->tx_skbuff); in pcnet32_realloc_tx_ring()
503 kfree(lp->tx_dma_addr); in pcnet32_realloc_tx_ring()
504 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_realloc_tx_ring()
505 sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, in pcnet32_realloc_tx_ring()
506 lp->tx_ring, lp->tx_ring_dma_addr); in pcnet32_realloc_tx_ring()
508 lp->tx_ring_size = entries; in pcnet32_realloc_tx_ring()
509 lp->tx_mod_mask = lp->tx_ring_size - 1; in pcnet32_realloc_tx_ring()
510 lp->tx_len_bits = (size << 12); in pcnet32_realloc_tx_ring()
511 lp->tx_ring = new_tx_ring; in pcnet32_realloc_tx_ring()
512 lp->tx_ring_dma_addr = new_ring_dma_addr; in pcnet32_realloc_tx_ring()
513 lp->tx_dma_addr = new_dma_addr_list; in pcnet32_realloc_tx_ring()
514 lp->tx_skbuff = new_skb_list; in pcnet32_realloc_tx_ring()
520 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_realloc_tx_ring()
527 * Re-use old receive buffers.
533 * Must be called with lp->lock held.
547 dma_alloc_coherent(&lp->pci_dev->dev, in pcnet32_realloc_rx_ring()
562 overlap = min(entries, lp->rx_ring_size); in pcnet32_realloc_rx_ring()
564 new_rx_ring[new] = lp->rx_ring[new]; in pcnet32_realloc_rx_ring()
565 new_dma_addr_list[new] = lp->rx_dma_addr[new]; in pcnet32_realloc_rx_ring()
566 new_skb_list[new] = lp->rx_skbuff[new]; in pcnet32_realloc_rx_ring()
582 dma_map_single(&lp->pci_dev->dev, rx_skbuff->data, in pcnet32_realloc_rx_ring()
584 if (dma_mapping_error(&lp->pci_dev->dev, new_dma_addr_list[new])) { in pcnet32_realloc_rx_ring()
590 new_rx_ring[new].base = cpu_to_le32(new_dma_addr_list[new]); in pcnet32_realloc_rx_ring()
595 for (; new < lp->rx_ring_size; new++) { in pcnet32_realloc_rx_ring()
596 if (lp->rx_skbuff[new]) { in pcnet32_realloc_rx_ring()
597 if (!dma_mapping_error(&lp->pci_dev->dev, lp->rx_dma_addr[new])) in pcnet32_realloc_rx_ring()
598 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_realloc_rx_ring()
599 lp->rx_dma_addr[new], in pcnet32_realloc_rx_ring()
602 dev_kfree_skb(lp->rx_skbuff[new]); in pcnet32_realloc_rx_ring()
606 kfree(lp->rx_skbuff); in pcnet32_realloc_rx_ring()
607 kfree(lp->rx_dma_addr); in pcnet32_realloc_rx_ring()
608 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_realloc_rx_ring()
609 sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, in pcnet32_realloc_rx_ring()
610 lp->rx_ring, lp->rx_ring_dma_addr); in pcnet32_realloc_rx_ring()
612 lp->rx_ring_size = entries; in pcnet32_realloc_rx_ring()
613 lp->rx_mod_mask = lp->rx_ring_size - 1; in pcnet32_realloc_rx_ring()
614 lp->rx_len_bits = (size << 4); in pcnet32_realloc_rx_ring()
615 lp->rx_ring = new_rx_ring; in pcnet32_realloc_rx_ring()
616 lp->rx_ring_dma_addr = new_ring_dma_addr; in pcnet32_realloc_rx_ring()
617 lp->rx_dma_addr = new_dma_addr_list; in pcnet32_realloc_rx_ring()
618 lp->rx_skbuff = new_skb_list; in pcnet32_realloc_rx_ring()
622 while (--new >= lp->rx_ring_size) { in pcnet32_realloc_rx_ring()
624 if (!dma_mapping_error(&lp->pci_dev->dev, new_dma_addr_list[new])) in pcnet32_realloc_rx_ring()
625 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_realloc_rx_ring()
636 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_realloc_rx_ring()
647 for (i = 0; i < lp->rx_ring_size; i++) { in pcnet32_purge_rx_ring()
648 lp->rx_ring[i].status = 0; /* CPU owns buffer */ in pcnet32_purge_rx_ring()
650 if (lp->rx_skbuff[i]) { in pcnet32_purge_rx_ring()
651 if (!dma_mapping_error(&lp->pci_dev->dev, lp->rx_dma_addr[i])) in pcnet32_purge_rx_ring()
652 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_purge_rx_ring()
653 lp->rx_dma_addr[i], in pcnet32_purge_rx_ring()
656 dev_kfree_skb_any(lp->rx_skbuff[i]); in pcnet32_purge_rx_ring()
658 lp->rx_skbuff[i] = NULL; in pcnet32_purge_rx_ring()
659 lp->rx_dma_addr[i] = 0; in pcnet32_purge_rx_ring()
666 disable_irq(dev->irq); in pcnet32_poll_controller()
668 enable_irq(dev->irq); in pcnet32_poll_controller()
673 * lp->lock must be held.
680 const struct pcnet32_access *a = lp->a; in pcnet32_suspend()
681 ulong ioaddr = dev->base_addr; in pcnet32_suspend()
685 if (lp->chip_version < PCNET32_79C970A) in pcnet32_suspend()
688 /* set SUSPEND (SPND) - CSR5 bit 0 */ in pcnet32_suspend()
689 csr5 = a->read_csr(ioaddr, CSR5); in pcnet32_suspend()
690 a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); in pcnet32_suspend()
694 while (!(a->read_csr(ioaddr, CSR5) & CSR5_SUSPEND)) { in pcnet32_suspend()
695 spin_unlock_irqrestore(&lp->lock, *flags); in pcnet32_suspend()
700 spin_lock_irqsave(&lp->lock, *flags); in pcnet32_suspend()
713 int csr5 = lp->a->read_csr(ioaddr, CSR5); in pcnet32_clr_suspend()
714 /* clear SUSPEND (SPND) - CSR5 bit 0 */ in pcnet32_clr_suspend()
715 lp->a->write_csr(ioaddr, CSR5, csr5 & ~CSR5_SUSPEND); in pcnet32_clr_suspend()
724 spin_lock_irqsave(&lp->lock, flags); in pcnet32_get_link_ksettings()
725 if (lp->mii) { in pcnet32_get_link_ksettings()
726 mii_ethtool_get_link_ksettings(&lp->mii_if, cmd); in pcnet32_get_link_ksettings()
727 } else if (lp->chip_version == PCNET32_79C970A) { in pcnet32_get_link_ksettings()
728 if (lp->autoneg) { in pcnet32_get_link_ksettings()
729 cmd->base.autoneg = AUTONEG_ENABLE; in pcnet32_get_link_ksettings()
730 if (lp->a->read_bcr(dev->base_addr, 4) == 0xc0) in pcnet32_get_link_ksettings()
731 cmd->base.port = PORT_AUI; in pcnet32_get_link_ksettings()
733 cmd->base.port = PORT_TP; in pcnet32_get_link_ksettings()
735 cmd->base.autoneg = AUTONEG_DISABLE; in pcnet32_get_link_ksettings()
736 cmd->base.port = lp->port_tp ? PORT_TP : PORT_AUI; in pcnet32_get_link_ksettings()
738 cmd->base.duplex = lp->fdx ? DUPLEX_FULL : DUPLEX_HALF; in pcnet32_get_link_ksettings()
739 cmd->base.speed = SPEED_10; in pcnet32_get_link_ksettings()
741 cmd->link_modes.supported, in pcnet32_get_link_ksettings()
744 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_get_link_ksettings()
752 ulong ioaddr = dev->base_addr; in pcnet32_set_link_ksettings()
754 int r = -EOPNOTSUPP; in pcnet32_set_link_ksettings()
757 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_link_ksettings()
758 if (lp->mii) { in pcnet32_set_link_ksettings()
759 r = mii_ethtool_set_link_ksettings(&lp->mii_if, cmd); in pcnet32_set_link_ksettings()
760 } else if (lp->chip_version == PCNET32_79C970A) { in pcnet32_set_link_ksettings()
763 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); in pcnet32_set_link_ksettings()
765 lp->autoneg = cmd->base.autoneg == AUTONEG_ENABLE; in pcnet32_set_link_ksettings()
766 bcr2 = lp->a->read_bcr(ioaddr, 2); in pcnet32_set_link_ksettings()
767 if (cmd->base.autoneg == AUTONEG_ENABLE) { in pcnet32_set_link_ksettings()
768 lp->a->write_bcr(ioaddr, 2, bcr2 | 0x0002); in pcnet32_set_link_ksettings()
770 lp->a->write_bcr(ioaddr, 2, bcr2 & ~0x0002); in pcnet32_set_link_ksettings()
772 lp->port_tp = cmd->base.port == PORT_TP; in pcnet32_set_link_ksettings()
773 csr15 = lp->a->read_csr(ioaddr, CSR15) & ~0x0180; in pcnet32_set_link_ksettings()
774 if (cmd->base.port == PORT_TP) in pcnet32_set_link_ksettings()
776 lp->a->write_csr(ioaddr, CSR15, csr15); in pcnet32_set_link_ksettings()
777 lp->init_block->mode = cpu_to_le16(csr15); in pcnet32_set_link_ksettings()
779 lp->fdx = cmd->base.duplex == DUPLEX_FULL; in pcnet32_set_link_ksettings()
780 bcr9 = lp->a->read_bcr(ioaddr, 9) & ~0x0003; in pcnet32_set_link_ksettings()
781 if (cmd->base.duplex == DUPLEX_FULL) in pcnet32_set_link_ksettings()
783 lp->a->write_bcr(ioaddr, 9, bcr9); in pcnet32_set_link_ksettings()
791 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_link_ksettings()
800 strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); in pcnet32_get_drvinfo()
801 if (lp->pci_dev) in pcnet32_get_drvinfo()
802 strlcpy(info->bus_info, pci_name(lp->pci_dev), in pcnet32_get_drvinfo()
803 sizeof(info->bus_info)); in pcnet32_get_drvinfo()
805 snprintf(info->bus_info, sizeof(info->bus_info), in pcnet32_get_drvinfo()
806 "VLB 0x%lx", dev->base_addr); in pcnet32_get_drvinfo()
815 spin_lock_irqsave(&lp->lock, flags); in pcnet32_get_link()
816 if (lp->mii) { in pcnet32_get_link()
817 r = mii_link_ok(&lp->mii_if); in pcnet32_get_link()
818 } else if (lp->chip_version == PCNET32_79C970A) { in pcnet32_get_link()
819 ulong ioaddr = dev->base_addr; /* card base I/O address */ in pcnet32_get_link()
821 if (!lp->autoneg && lp->port_tp) in pcnet32_get_link()
822 r = (lp->a->read_bcr(ioaddr, 4) != 0xc0); in pcnet32_get_link()
825 } else if (lp->chip_version > PCNET32_79C970A) { in pcnet32_get_link()
826 ulong ioaddr = dev->base_addr; /* card base I/O address */ in pcnet32_get_link()
827 r = (lp->a->read_bcr(ioaddr, 4) != 0xc0); in pcnet32_get_link()
831 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_get_link()
839 return lp->msg_enable; in pcnet32_get_msglevel()
845 lp->msg_enable = value; in pcnet32_set_msglevel()
852 int r = -EOPNOTSUPP; in pcnet32_nway_reset()
854 if (lp->mii) { in pcnet32_nway_reset()
855 spin_lock_irqsave(&lp->lock, flags); in pcnet32_nway_reset()
856 r = mii_nway_restart(&lp->mii_if); in pcnet32_nway_reset()
857 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_nway_reset()
867 ering->tx_max_pending = TX_MAX_RING_SIZE; in pcnet32_get_ringparam()
868 ering->tx_pending = lp->tx_ring_size; in pcnet32_get_ringparam()
869 ering->rx_max_pending = RX_MAX_RING_SIZE; in pcnet32_get_ringparam()
870 ering->rx_pending = lp->rx_ring_size; in pcnet32_get_ringparam()
879 ulong ioaddr = dev->base_addr; in pcnet32_set_ringparam()
882 if (ering->rx_mini_pending || ering->rx_jumbo_pending) in pcnet32_set_ringparam()
883 return -EINVAL; in pcnet32_set_ringparam()
888 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_ringparam()
889 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ in pcnet32_set_ringparam()
891 size = min(ering->tx_pending, (unsigned int)TX_MAX_RING_SIZE); in pcnet32_set_ringparam()
900 if ((1 << i) != lp->tx_ring_size) in pcnet32_set_ringparam()
903 size = min(ering->rx_pending, (unsigned int)RX_MAX_RING_SIZE); in pcnet32_set_ringparam()
908 if ((1 << i) != lp->rx_ring_size) in pcnet32_set_ringparam()
911 lp->napi.weight = lp->rx_ring_size / 2; in pcnet32_set_ringparam()
918 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_ringparam()
921 lp->rx_ring_size, lp->tx_ring_size); in pcnet32_set_ringparam()
938 return -EOPNOTSUPP; in pcnet32_get_sset_count()
948 if (test->flags == ETH_TEST_FL_OFFLINE) { in pcnet32_ethtool_test()
953 test->flags |= ETH_TEST_FL_FAILED; in pcnet32_ethtool_test()
965 const struct pcnet32_access *a = lp->a; /* access to registers */ in pcnet32_loopback_test()
966 ulong ioaddr = dev->base_addr; /* card base I/O address */ in pcnet32_loopback_test()
984 spin_lock_irqsave(&lp->lock, flags); in pcnet32_loopback_test()
985 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ in pcnet32_loopback_test()
987 numbuffs = min(numbuffs, (int)min(lp->rx_ring_size, lp->tx_ring_size)); in pcnet32_loopback_test()
990 lp->a->reset(ioaddr); in pcnet32_loopback_test()
991 lp->a->write_csr(ioaddr, CSR4, 0x0915); /* auto tx pad */ in pcnet32_loopback_test()
994 lp->a->write_bcr(ioaddr, 20, 2); in pcnet32_loopback_test()
999 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ in pcnet32_loopback_test()
1011 packet = skb->data; in pcnet32_loopback_test()
1013 lp->tx_skbuff[x] = skb; in pcnet32_loopback_test()
1014 lp->tx_ring[x].length = cpu_to_le16(-skb->len); in pcnet32_loopback_test()
1015 lp->tx_ring[x].misc = 0; in pcnet32_loopback_test()
1019 *packet++ = dev->dev_addr[i]; in pcnet32_loopback_test()
1021 *packet++ = dev->dev_addr[i]; in pcnet32_loopback_test()
1031 lp->tx_dma_addr[x] = in pcnet32_loopback_test()
1032 dma_map_single(&lp->pci_dev->dev, skb->data, skb->len, in pcnet32_loopback_test()
1034 if (dma_mapping_error(&lp->pci_dev->dev, lp->tx_dma_addr[x])) { in pcnet32_loopback_test()
1040 lp->tx_ring[x].base = cpu_to_le32(lp->tx_dma_addr[x]); in pcnet32_loopback_test()
1042 lp->tx_ring[x].status = cpu_to_le16(status); in pcnet32_loopback_test()
1045 x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ in pcnet32_loopback_test()
1046 a->write_bcr(ioaddr, 32, x | 0x0002); in pcnet32_loopback_test()
1049 x = a->read_csr(ioaddr, CSR15) & 0xfffc; in pcnet32_loopback_test()
1050 lp->a->write_csr(ioaddr, CSR15, x | 0x0044); in pcnet32_loopback_test()
1053 lp->a->write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ in pcnet32_loopback_test()
1059 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { in pcnet32_loopback_test()
1060 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_loopback_test()
1062 spin_lock_irqsave(&lp->lock, flags); in pcnet32_loopback_test()
1072 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ in pcnet32_loopback_test()
1079 skb = lp->rx_skbuff[x]; in pcnet32_loopback_test()
1081 pr_cont(" %02x", *(skb->data + i)); in pcnet32_loopback_test()
1089 skb = lp->rx_skbuff[x]; in pcnet32_loopback_test()
1090 packet = lp->tx_skbuff[x]->data; in pcnet32_loopback_test()
1092 if (*(skb->data + i) != packet[i]) { in pcnet32_loopback_test()
1094 "Error in compare! %2x - %02x %02x\n", in pcnet32_loopback_test()
1095 i, *(skb->data + i), packet[i]); in pcnet32_loopback_test()
1107 x = a->read_csr(ioaddr, CSR15); in pcnet32_loopback_test()
1108 a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ in pcnet32_loopback_test()
1110 x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ in pcnet32_loopback_test()
1111 a->write_bcr(ioaddr, 32, (x & ~0x0002)); in pcnet32_loopback_test()
1118 lp->a->write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ in pcnet32_loopback_test()
1120 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_loopback_test()
1129 const struct pcnet32_access *a = lp->a; in pcnet32_set_phys_id()
1130 ulong ioaddr = dev->base_addr; in pcnet32_set_phys_id()
1137 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_phys_id()
1139 lp->save_regs[i - 4] = a->read_bcr(ioaddr, i); in pcnet32_set_phys_id()
1140 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_phys_id()
1146 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_phys_id()
1148 a->write_bcr(ioaddr, i, a->read_bcr(ioaddr, i) ^ 0x4000); in pcnet32_set_phys_id()
1149 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_phys_id()
1154 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_phys_id()
1156 a->write_bcr(ioaddr, i, lp->save_regs[i - 4]); in pcnet32_set_phys_id()
1157 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_phys_id()
1171 int status = (short)le16_to_cpu(rxp->status) >> 8; in pcnet32_rx_entry()
1179 * <murf@perftech.com> to Russ Nelson: Even with full-sized in pcnet32_rx_entry()
1184 dev->stats.rx_errors++; /* end of a packet. */ in pcnet32_rx_entry()
1186 dev->stats.rx_frame_errors++; in pcnet32_rx_entry()
1188 dev->stats.rx_over_errors++; in pcnet32_rx_entry()
1190 dev->stats.rx_crc_errors++; in pcnet32_rx_entry()
1192 dev->stats.rx_fifo_errors++; in pcnet32_rx_entry()
1196 pkt_len = (le32_to_cpu(rxp->msg_length) & 0xfff) - 4; in pcnet32_rx_entry()
1202 dev->stats.rx_errors++; in pcnet32_rx_entry()
1207 dev->stats.rx_errors++; in pcnet32_rx_entry()
1222 new_dma_addr = dma_map_single(&lp->pci_dev->dev, in pcnet32_rx_entry()
1223 newskb->data, in pcnet32_rx_entry()
1226 if (dma_mapping_error(&lp->pci_dev->dev, new_dma_addr)) { in pcnet32_rx_entry()
1232 skb = lp->rx_skbuff[entry]; in pcnet32_rx_entry()
1233 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_rx_entry()
1234 lp->rx_dma_addr[entry], in pcnet32_rx_entry()
1238 lp->rx_skbuff[entry] = newskb; in pcnet32_rx_entry()
1239 lp->rx_dma_addr[entry] = new_dma_addr; in pcnet32_rx_entry()
1240 rxp->base = cpu_to_le32(new_dma_addr); in pcnet32_rx_entry()
1249 dev->stats.rx_dropped++; in pcnet32_rx_entry()
1255 dma_sync_single_for_cpu(&lp->pci_dev->dev, in pcnet32_rx_entry()
1256 lp->rx_dma_addr[entry], pkt_len, in pcnet32_rx_entry()
1259 (unsigned char *)(lp->rx_skbuff[entry]->data), in pcnet32_rx_entry()
1261 dma_sync_single_for_device(&lp->pci_dev->dev, in pcnet32_rx_entry()
1262 lp->rx_dma_addr[entry], pkt_len, in pcnet32_rx_entry()
1265 dev->stats.rx_bytes += skb->len; in pcnet32_rx_entry()
1266 skb->protocol = eth_type_trans(skb, dev); in pcnet32_rx_entry()
1268 dev->stats.rx_packets++; in pcnet32_rx_entry()
1274 int entry = lp->cur_rx & lp->rx_mod_mask; in pcnet32_rx()
1275 struct pcnet32_rx_head *rxp = &lp->rx_ring[entry]; in pcnet32_rx()
1279 while (npackets < budget && (short)le16_to_cpu(rxp->status) >= 0) { in pcnet32_rx()
1286 rxp->buf_length = cpu_to_le16(NEG_BUF_SIZE); in pcnet32_rx()
1288 rxp->status = cpu_to_le16(0x8000); in pcnet32_rx()
1289 entry = (++lp->cur_rx) & lp->rx_mod_mask; in pcnet32_rx()
1290 rxp = &lp->rx_ring[entry]; in pcnet32_rx()
1299 unsigned int dirty_tx = lp->dirty_tx; in pcnet32_tx()
1303 while (dirty_tx != lp->cur_tx) { in pcnet32_tx()
1304 int entry = dirty_tx & lp->tx_mod_mask; in pcnet32_tx()
1305 int status = (short)le16_to_cpu(lp->tx_ring[entry].status); in pcnet32_tx()
1310 lp->tx_ring[entry].base = 0; in pcnet32_tx()
1314 int err_status = le32_to_cpu(lp->tx_ring[entry].misc); in pcnet32_tx()
1315 dev->stats.tx_errors++; in pcnet32_tx()
1320 dev->stats.tx_aborted_errors++; in pcnet32_tx()
1322 dev->stats.tx_carrier_errors++; in pcnet32_tx()
1324 dev->stats.tx_window_errors++; in pcnet32_tx()
1327 dev->stats.tx_fifo_errors++; in pcnet32_tx()
1335 dev->stats.tx_fifo_errors++; in pcnet32_tx()
1336 if (!lp->dxsuflo) { /* If controller doesn't recover ... */ in pcnet32_tx()
1346 dev->stats.collisions++; in pcnet32_tx()
1347 dev->stats.tx_packets++; in pcnet32_tx()
1351 if (lp->tx_skbuff[entry]) { in pcnet32_tx()
1352 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_tx()
1353 lp->tx_dma_addr[entry], in pcnet32_tx()
1354 lp->tx_skbuff[entry]->len, in pcnet32_tx()
1356 dev_kfree_skb_any(lp->tx_skbuff[entry]); in pcnet32_tx()
1357 lp->tx_skbuff[entry] = NULL; in pcnet32_tx()
1358 lp->tx_dma_addr[entry] = 0; in pcnet32_tx()
1363 delta = (lp->cur_tx - dirty_tx) & (lp->tx_mod_mask + lp->tx_ring_size); in pcnet32_tx()
1364 if (delta > lp->tx_ring_size) { in pcnet32_tx()
1365 netif_err(lp, drv, dev, "out-of-sync dirty pointer, %d vs. %d, full=%d\n", in pcnet32_tx()
1366 dirty_tx, lp->cur_tx, lp->tx_full); in pcnet32_tx()
1367 dirty_tx += lp->tx_ring_size; in pcnet32_tx()
1368 delta -= lp->tx_ring_size; in pcnet32_tx()
1371 if (lp->tx_full && in pcnet32_tx()
1373 delta < lp->tx_ring_size - 2) { in pcnet32_tx()
1375 lp->tx_full = 0; in pcnet32_tx()
1378 lp->dirty_tx = dirty_tx; in pcnet32_tx()
1386 struct net_device *dev = lp->dev; in pcnet32_poll()
1387 unsigned long ioaddr = dev->base_addr; in pcnet32_poll()
1394 spin_lock_irqsave(&lp->lock, flags); in pcnet32_poll()
1397 lp->a->reset(ioaddr); in pcnet32_poll()
1398 lp->a->write_csr(ioaddr, CSR4, 0x0915); /* auto tx pad */ in pcnet32_poll()
1405 val = lp->a->read_csr(ioaddr, CSR3); in pcnet32_poll()
1407 lp->a->write_csr(ioaddr, CSR3, val); in pcnet32_poll()
1410 lp->a->write_csr(ioaddr, CSR0, CSR0_INTEN); in pcnet32_poll()
1413 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_poll()
1422 int j = lp->phycount * PCNET32_REGS_PER_PHY; in pcnet32_get_regs_len()
1433 const struct pcnet32_access *a = lp->a; in pcnet32_get_regs()
1434 ulong ioaddr = dev->base_addr; in pcnet32_get_regs()
1437 spin_lock_irqsave(&lp->lock, flags); in pcnet32_get_regs()
1439 csr0 = a->read_csr(ioaddr, CSR0); in pcnet32_get_regs()
1449 *buff++ = a->read_csr(ioaddr, i); in pcnet32_get_regs()
1451 *buff++ = a->read_csr(ioaddr, 112); in pcnet32_get_regs()
1452 *buff++ = a->read_csr(ioaddr, 114); in pcnet32_get_regs()
1456 *buff++ = a->read_bcr(ioaddr, i); in pcnet32_get_regs()
1461 *buff++ = a->read_bcr(ioaddr, i); in pcnet32_get_regs()
1464 if (lp->mii) { in pcnet32_get_regs()
1467 if (lp->phymask & (1 << j)) { in pcnet32_get_regs()
1469 lp->a->write_bcr(ioaddr, 33, in pcnet32_get_regs()
1471 *buff++ = lp->a->read_bcr(ioaddr, 34); in pcnet32_get_regs()
1480 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_get_regs()
1501 /* only probes for non-PCI devices, the rest are handled by
1532 pr_err("failed to enable device -- err=%d\n", err); in pcnet32_probe_pci()
1540 err = -ENODEV; in pcnet32_probe_pci()
1544 err = dma_set_mask(&pdev->dev, PCNET32_DMA_MASK); in pcnet32_probe_pci()
1555 err = -EBUSY; in pcnet32_probe_pci()
1598 int ret = -ENODEV; in pcnet32_probe1()
1603 /* NOTE: 16-bit check is first, otherwise some older PCnet chips fail */ in pcnet32_probe1()
1619 a->read_csr(ioaddr, 88) | (a->read_csr(ioaddr, 89) << 16); in pcnet32_probe1()
1673 media = a->read_bcr(ioaddr, 49); in pcnet32_probe1()
1680 a->write_bcr(ioaddr, 49, media); in pcnet32_probe1()
1703 * one for latency - although on PCI this isn't a big loss. Older chips in pcnet32_probe1()
1709 a->write_bcr(ioaddr, 18, (a->read_bcr(ioaddr, 18) | 0x0860)); in pcnet32_probe1()
1710 a->write_csr(ioaddr, 80, in pcnet32_probe1()
1711 (a->read_csr(ioaddr, 80) & 0x0C00) | 0x0c00); in pcnet32_probe1()
1725 * to the datasheet, each bit corresponds to a 512-byte in pcnet32_probe1()
1727 * holds the value of the upper 8 bits of the 16-bit SRAM size. in pcnet32_probe1()
1728 * The low 8-bits start at 0x00 and end at 0xff. So the in pcnet32_probe1()
1734 a->write_bcr(ioaddr, 25, 0x17); in pcnet32_probe1()
1735 a->write_bcr(ioaddr, 26, 0xc); in pcnet32_probe1()
1737 a->write_bcr(ioaddr, 18, a->read_bcr(ioaddr, 18) | (1 << 11)); in pcnet32_probe1()
1742 ret = -ENOMEM; in pcnet32_probe1()
1747 SET_NETDEV_DEV(dev, &pdev->dev); in pcnet32_probe1()
1753 * station address PROM at the base address and programmed into the in pcnet32_probe1()
1754 * "Physical Address Registers" CSR12-14. in pcnet32_probe1()
1761 val = a->read_csr(ioaddr, i + 12) & 0x0ffff; in pcnet32_probe1()
1763 dev->dev_addr[2 * i] = val & 0x0ff; in pcnet32_probe1()
1764 dev->dev_addr[2 * i + 1] = (val >> 8) & 0x0ff; in pcnet32_probe1()
1771 if (!ether_addr_equal(promaddr, dev->dev_addr) || in pcnet32_probe1()
1772 !is_valid_ether_addr(dev->dev_addr)) { in pcnet32_probe1()
1778 memcpy(dev->dev_addr, promaddr, ETH_ALEN); in pcnet32_probe1()
1783 if (!is_valid_ether_addr(dev->dev_addr)) in pcnet32_probe1()
1784 eth_zero_addr(dev->dev_addr); in pcnet32_probe1()
1787 pr_cont(" %pM", dev->dev_addr); in pcnet32_probe1()
1791 i = a->read_csr(ioaddr, 80) & 0x0C00; /* Check tx_start_pt */ in pcnet32_probe1()
1807 i = a->read_bcr(ioaddr, 18); /* Check Burst/Bus control */ in pcnet32_probe1()
1817 i = a->read_bcr(ioaddr, 25); in pcnet32_probe1()
1819 i = a->read_bcr(ioaddr, 26); in pcnet32_probe1()
1821 i = a->read_bcr(ioaddr, 27); in pcnet32_probe1()
1827 dev->base_addr = ioaddr; in pcnet32_probe1()
1829 /* dma_alloc_coherent returns page-aligned memory, so we do not have to check the alignment */ in pcnet32_probe1()
1830 lp->init_block = dma_alloc_coherent(&pdev->dev, in pcnet32_probe1()
1831 sizeof(*lp->init_block), in pcnet32_probe1()
1832 &lp->init_dma_addr, GFP_KERNEL); in pcnet32_probe1()
1833 if (!lp->init_block) { in pcnet32_probe1()
1836 ret = -ENOMEM; in pcnet32_probe1()
1839 lp->pci_dev = pdev; in pcnet32_probe1()
1841 lp->dev = dev; in pcnet32_probe1()
1843 spin_lock_init(&lp->lock); in pcnet32_probe1()
1845 lp->name = chipname; in pcnet32_probe1()
1846 lp->shared_irq = shared; in pcnet32_probe1()
1847 lp->tx_ring_size = TX_RING_SIZE; /* default tx ring size */ in pcnet32_probe1()
1848 lp->rx_ring_size = RX_RING_SIZE; /* default rx ring size */ in pcnet32_probe1()
1849 lp->tx_mod_mask = lp->tx_ring_size - 1; in pcnet32_probe1()
1850 lp->rx_mod_mask = lp->rx_ring_size - 1; in pcnet32_probe1()
1851 lp->tx_len_bits = (PCNET32_LOG_TX_BUFFERS << 12); in pcnet32_probe1()
1852 lp->rx_len_bits = (PCNET32_LOG_RX_BUFFERS << 4); in pcnet32_probe1()
1853 lp->mii_if.full_duplex = fdx; in pcnet32_probe1()
1854 lp->mii_if.phy_id_mask = 0x1f; in pcnet32_probe1()
1855 lp->mii_if.reg_num_mask = 0x1f; in pcnet32_probe1()
1856 lp->dxsuflo = dxsuflo; in pcnet32_probe1()
1857 lp->mii = mii; in pcnet32_probe1()
1858 lp->chip_version = chip_version; in pcnet32_probe1()
1859 lp->msg_enable = pcnet32_debug; in pcnet32_probe1()
1862 lp->options = PCNET32_PORT_ASEL; in pcnet32_probe1()
1864 lp->options = options_mapping[options[cards_found]]; in pcnet32_probe1()
1866 if (lp->chip_version == PCNET32_79C970A) in pcnet32_probe1()
1867 lp->options = PCNET32_PORT_10BT; in pcnet32_probe1()
1868 lp->mii_if.dev = dev; in pcnet32_probe1()
1869 lp->mii_if.mdio_read = mdio_read; in pcnet32_probe1()
1870 lp->mii_if.mdio_write = mdio_write; in pcnet32_probe1()
1872 /* napi.weight is used in both the napi and non-napi cases */ in pcnet32_probe1()
1873 lp->napi.weight = lp->rx_ring_size / 2; in pcnet32_probe1()
1875 netif_napi_add(dev, &lp->napi, pcnet32_poll, lp->rx_ring_size / 2); in pcnet32_probe1()
1877 if (fdx && !(lp->options & PCNET32_PORT_ASEL) && in pcnet32_probe1()
1879 lp->options |= PCNET32_PORT_FD; in pcnet32_probe1()
1881 lp->a = a; in pcnet32_probe1()
1883 /* prior to register_netdev, dev->name is not yet correct */ in pcnet32_probe1()
1884 if (pcnet32_alloc_ring(dev, pci_name(lp->pci_dev))) { in pcnet32_probe1()
1885 ret = -ENOMEM; in pcnet32_probe1()
1889 if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 && in pcnet32_probe1()
1890 dev->dev_addr[2] == 0x75) in pcnet32_probe1()
1891 lp->options = PCNET32_PORT_FD | PCNET32_PORT_GPSI; in pcnet32_probe1()
1893 lp->init_block->mode = cpu_to_le16(0x0003); /* Disable Rx and Tx. */ in pcnet32_probe1()
1894 lp->init_block->tlen_rlen = in pcnet32_probe1()
1895 cpu_to_le16(lp->tx_len_bits | lp->rx_len_bits); in pcnet32_probe1()
1897 lp->init_block->phys_addr[i] = dev->dev_addr[i]; in pcnet32_probe1()
1898 lp->init_block->filter[0] = 0x00000000; in pcnet32_probe1()
1899 lp->init_block->filter[1] = 0x00000000; in pcnet32_probe1()
1900 lp->init_block->rx_ring = cpu_to_le32(lp->rx_ring_dma_addr); in pcnet32_probe1()
1901 lp->init_block->tx_ring = cpu_to_le32(lp->tx_ring_dma_addr); in pcnet32_probe1()
1904 a->write_bcr(ioaddr, 20, 2); in pcnet32_probe1()
1906 a->write_csr(ioaddr, 1, (lp->init_dma_addr & 0xffff)); in pcnet32_probe1()
1907 a->write_csr(ioaddr, 2, (lp->init_dma_addr >> 16)); in pcnet32_probe1()
1910 dev->irq = pdev->irq; in pcnet32_probe1()
1912 pr_cont(" assigned IRQ %d\n", dev->irq); in pcnet32_probe1()
1917 * To auto-IRQ we enable the initialization-done and DMA error in pcnet32_probe1()
1922 a->write_csr(ioaddr, CSR0, CSR0_INTEN | CSR0_INIT); in pcnet32_probe1()
1925 dev->irq = probe_irq_off(irq_mask); in pcnet32_probe1()
1926 if (!dev->irq) { in pcnet32_probe1()
1929 ret = -ENODEV; in pcnet32_probe1()
1933 pr_cont(", probed IRQ %d\n", dev->irq); in pcnet32_probe1()
1937 if (lp->mii) { in pcnet32_probe1()
1938 /* lp->phycount and lp->phymask are set to 0 by memset above */ in pcnet32_probe1()
1940 lp->mii_if.phy_id = ((lp->a->read_bcr(ioaddr, 33)) >> 5) & 0x1f; in pcnet32_probe1()
1953 lp->phycount++; in pcnet32_probe1()
1954 lp->phymask |= (1 << i); in pcnet32_probe1()
1955 lp->mii_if.phy_id = i; in pcnet32_probe1()
1960 lp->a->write_bcr(ioaddr, 33, (lp->mii_if.phy_id) << 5); in pcnet32_probe1()
1961 if (lp->phycount > 1) in pcnet32_probe1()
1962 lp->options |= PCNET32_PORT_MII; in pcnet32_probe1()
1965 timer_setup(&lp->watchdog_timer, pcnet32_watchdog, 0); in pcnet32_probe1()
1967 /* The PCNET32-specific entries in the device structure. */ in pcnet32_probe1()
1968 dev->netdev_ops = &pcnet32_netdev_ops; in pcnet32_probe1()
1969 dev->ethtool_ops = &pcnet32_ethtool_ops; in pcnet32_probe1()
1970 dev->watchdog_timeo = (5 * HZ); in pcnet32_probe1()
1979 lp->next = pcnet32_dev; in pcnet32_probe1()
1984 pr_info("%s: registered as %s\n", dev->name, lp->name); in pcnet32_probe1()
1988 a->write_bcr(ioaddr, 2, a->read_bcr(ioaddr, 2) | 0x1000); in pcnet32_probe1()
1994 dma_free_coherent(&lp->pci_dev->dev, sizeof(*lp->init_block), in pcnet32_probe1()
1995 lp->init_block, lp->init_dma_addr); in pcnet32_probe1()
2008 lp->tx_ring = dma_alloc_coherent(&lp->pci_dev->dev, in pcnet32_alloc_ring()
2009 sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, in pcnet32_alloc_ring()
2010 &lp->tx_ring_dma_addr, GFP_KERNEL); in pcnet32_alloc_ring()
2011 if (lp->tx_ring == NULL) { in pcnet32_alloc_ring()
2013 return -ENOMEM; in pcnet32_alloc_ring()
2016 lp->rx_ring = dma_alloc_coherent(&lp->pci_dev->dev, in pcnet32_alloc_ring()
2017 sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, in pcnet32_alloc_ring()
2018 &lp->rx_ring_dma_addr, GFP_KERNEL); in pcnet32_alloc_ring()
2019 if (lp->rx_ring == NULL) { in pcnet32_alloc_ring()
2021 return -ENOMEM; in pcnet32_alloc_ring()
2024 lp->tx_dma_addr = kcalloc(lp->tx_ring_size, sizeof(dma_addr_t), in pcnet32_alloc_ring()
2026 if (!lp->tx_dma_addr) in pcnet32_alloc_ring()
2027 return -ENOMEM; in pcnet32_alloc_ring()
2029 lp->rx_dma_addr = kcalloc(lp->rx_ring_size, sizeof(dma_addr_t), in pcnet32_alloc_ring()
2031 if (!lp->rx_dma_addr) in pcnet32_alloc_ring()
2032 return -ENOMEM; in pcnet32_alloc_ring()
2034 lp->tx_skbuff = kcalloc(lp->tx_ring_size, sizeof(struct sk_buff *), in pcnet32_alloc_ring()
2036 if (!lp->tx_skbuff) in pcnet32_alloc_ring()
2037 return -ENOMEM; in pcnet32_alloc_ring()
2039 lp->rx_skbuff = kcalloc(lp->rx_ring_size, sizeof(struct sk_buff *), in pcnet32_alloc_ring()
2041 if (!lp->rx_skbuff) in pcnet32_alloc_ring()
2042 return -ENOMEM; in pcnet32_alloc_ring()
2051 kfree(lp->tx_skbuff); in pcnet32_free_ring()
2052 lp->tx_skbuff = NULL; in pcnet32_free_ring()
2054 kfree(lp->rx_skbuff); in pcnet32_free_ring()
2055 lp->rx_skbuff = NULL; in pcnet32_free_ring()
2057 kfree(lp->tx_dma_addr); in pcnet32_free_ring()
2058 lp->tx_dma_addr = NULL; in pcnet32_free_ring()
2060 kfree(lp->rx_dma_addr); in pcnet32_free_ring()
2061 lp->rx_dma_addr = NULL; in pcnet32_free_ring()
2063 if (lp->tx_ring) { in pcnet32_free_ring()
2064 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_free_ring()
2065 sizeof(struct pcnet32_tx_head) * lp->tx_ring_size, in pcnet32_free_ring()
2066 lp->tx_ring, lp->tx_ring_dma_addr); in pcnet32_free_ring()
2067 lp->tx_ring = NULL; in pcnet32_free_ring()
2070 if (lp->rx_ring) { in pcnet32_free_ring()
2071 dma_free_coherent(&lp->pci_dev->dev, in pcnet32_free_ring()
2072 sizeof(struct pcnet32_rx_head) * lp->rx_ring_size, in pcnet32_free_ring()
2073 lp->rx_ring, lp->rx_ring_dma_addr); in pcnet32_free_ring()
2074 lp->rx_ring = NULL; in pcnet32_free_ring()
2081 struct pci_dev *pdev = lp->pci_dev; in pcnet32_open()
2082 unsigned long ioaddr = dev->base_addr; in pcnet32_open()
2088 if (request_irq(dev->irq, pcnet32_interrupt, in pcnet32_open()
2089 lp->shared_irq ? IRQF_SHARED : 0, dev->name, in pcnet32_open()
2091 return -EAGAIN; in pcnet32_open()
2094 spin_lock_irqsave(&lp->lock, flags); in pcnet32_open()
2096 if (!is_valid_ether_addr(dev->dev_addr)) { in pcnet32_open()
2097 rc = -EINVAL; in pcnet32_open()
2102 lp->a->reset(ioaddr); in pcnet32_open()
2105 lp->a->write_bcr(ioaddr, 20, 2); in pcnet32_open()
2109 __func__, dev->irq, (u32) (lp->tx_ring_dma_addr), in pcnet32_open()
2110 (u32) (lp->rx_ring_dma_addr), in pcnet32_open()
2111 (u32) (lp->init_dma_addr)); in pcnet32_open()
2113 lp->autoneg = !!(lp->options & PCNET32_PORT_ASEL); in pcnet32_open()
2114 lp->port_tp = !!(lp->options & PCNET32_PORT_10BT); in pcnet32_open()
2115 lp->fdx = !!(lp->options & PCNET32_PORT_FD); in pcnet32_open()
2118 val = lp->a->read_bcr(ioaddr, 2) & ~2; in pcnet32_open()
2119 if (lp->options & PCNET32_PORT_ASEL) in pcnet32_open()
2121 lp->a->write_bcr(ioaddr, 2, val); in pcnet32_open()
2124 if (lp->mii_if.full_duplex) { in pcnet32_open()
2125 val = lp->a->read_bcr(ioaddr, 9) & ~3; in pcnet32_open()
2126 if (lp->options & PCNET32_PORT_FD) { in pcnet32_open()
2128 if (lp->options == (PCNET32_PORT_FD | PCNET32_PORT_AUI)) in pcnet32_open()
2130 } else if (lp->options & PCNET32_PORT_ASEL) { in pcnet32_open()
2132 if (lp->chip_version == 0x2627) in pcnet32_open()
2135 lp->a->write_bcr(ioaddr, 9, val); in pcnet32_open()
2139 val = lp->a->read_csr(ioaddr, 124) & ~0x10; in pcnet32_open()
2140 if ((lp->options & PCNET32_PORT_PORTSEL) == PCNET32_PORT_GPSI) in pcnet32_open()
2142 lp->a->write_csr(ioaddr, 124, val); in pcnet32_open()
2144 /* Allied Telesyn AT 2700/2701 FX are 100Mbit only and do not negotiate */ in pcnet32_open()
2145 if (pdev && pdev->subsystem_vendor == PCI_VENDOR_ID_AT && in pcnet32_open()
2146 (pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2700FX || in pcnet32_open()
2147 pdev->subsystem_device == PCI_SUBDEVICE_ID_AT_2701FX)) { in pcnet32_open()
2148 if (lp->options & PCNET32_PORT_ASEL) { in pcnet32_open()
2149 lp->options = PCNET32_PORT_FD | PCNET32_PORT_100; in pcnet32_open()
2151 "Setting 100Mb-Full Duplex\n"); in pcnet32_open()
2154 if (lp->phycount < 2) { in pcnet32_open()
2160 if (lp->mii && !(lp->options & PCNET32_PORT_ASEL)) { in pcnet32_open()
2161 lp->a->write_bcr(ioaddr, 32, in pcnet32_open()
2162 lp->a->read_bcr(ioaddr, 32) | 0x0080); in pcnet32_open()
2164 val = lp->a->read_bcr(ioaddr, 32) & ~0xb8; in pcnet32_open()
2165 if (lp->options & PCNET32_PORT_FD) in pcnet32_open()
2167 if (lp->options & PCNET32_PORT_100) in pcnet32_open()
2169 lp->a->write_bcr(ioaddr, 32, val); in pcnet32_open()
2171 if (lp->options & PCNET32_PORT_ASEL) { in pcnet32_open()
2172 lp->a->write_bcr(ioaddr, 32, in pcnet32_open()
2173 lp->a->read_bcr(ioaddr, in pcnet32_open()
2176 val = lp->a->read_bcr(ioaddr, 32) & ~0x98; in pcnet32_open()
2178 lp->a->write_bcr(ioaddr, 32, val); in pcnet32_open()
2182 int first_phy = -1; in pcnet32_open()
2191 val = lp->a->read_bcr(ioaddr, 2); in pcnet32_open()
2192 lp->a->write_bcr(ioaddr, 2, val & ~2); in pcnet32_open()
2193 val = lp->a->read_bcr(ioaddr, 32); in pcnet32_open()
2194 lp->a->write_bcr(ioaddr, 32, val & ~(1 << 7)); /* stop MII manager */ in pcnet32_open()
2196 if (!(lp->options & PCNET32_PORT_ASEL)) { in pcnet32_open()
2202 (lp->options & PCNET32_PORT_100) ? in pcnet32_open()
2204 bcr9 = lp->a->read_bcr(ioaddr, 9); in pcnet32_open()
2206 if (lp->options & PCNET32_PORT_FD) { in pcnet32_open()
2213 lp->a->write_bcr(ioaddr, 9, bcr9); in pcnet32_open()
2217 if (lp->phymask & (1 << i)) { in pcnet32_open()
2220 if (first_phy == -1) { in pcnet32_open()
2229 lp->mii_if.phy_id = i; in pcnet32_open()
2231 if (lp->options & PCNET32_PORT_ASEL) { in pcnet32_open()
2232 mii_ethtool_gset(&lp->mii_if, &ecmd); in pcnet32_open()
2235 mii_ethtool_sset(&lp->mii_if, &ecmd); in pcnet32_open()
2238 lp->mii_if.phy_id = first_phy; in pcnet32_open()
2243 if (lp->dxsuflo) { /* Disable transmit stop on underflow */ in pcnet32_open()
2244 val = lp->a->read_csr(ioaddr, CSR3); in pcnet32_open()
2246 lp->a->write_csr(ioaddr, CSR3, val); in pcnet32_open()
2250 lp->init_block->mode = in pcnet32_open()
2251 cpu_to_le16((lp->options & PCNET32_PORT_PORTSEL) << 7); in pcnet32_open()
2255 rc = -ENOMEM; in pcnet32_open()
2259 napi_enable(&lp->napi); in pcnet32_open()
2261 /* Re-initialize the PCNET32, and start it when done. */ in pcnet32_open()
2262 lp->a->write_csr(ioaddr, 1, (lp->init_dma_addr & 0xffff)); in pcnet32_open()
2263 lp->a->write_csr(ioaddr, 2, (lp->init_dma_addr >> 16)); in pcnet32_open()
2265 lp->a->write_csr(ioaddr, CSR4, 0x0915); /* auto tx pad */ in pcnet32_open()
2266 lp->a->write_csr(ioaddr, CSR0, CSR0_INIT); in pcnet32_open()
2270 if (lp->chip_version >= PCNET32_79C970A) { in pcnet32_open()
2273 mod_timer(&lp->watchdog_timer, PCNET32_WATCHDOG_TIMEOUT); in pcnet32_open()
2277 while (i++ < 100) in pcnet32_open()
2278 if (lp->a->read_csr(ioaddr, CSR0) & CSR0_IDON) in pcnet32_open()
2284 lp->a->write_csr(ioaddr, CSR0, CSR0_NORMAL); in pcnet32_open()
2289 (u32) (lp->init_dma_addr), in pcnet32_open()
2290 lp->a->read_csr(ioaddr, CSR0)); in pcnet32_open()
2292 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_open()
2304 lp->a->write_bcr(ioaddr, 20, 4); in pcnet32_open()
2307 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_open()
2308 free_irq(dev->irq, dev); in pcnet32_open()
2315 * etc.). Modern LANCE variants always reload their ring-buffer
2319 * sent (in effect, drop the packets on the floor) - the higher-level
2321 * these skbs to a temp list and then actually re-Tx them after
2330 for (i = 0; i < lp->tx_ring_size; i++) { in pcnet32_purge_tx_ring()
2331 lp->tx_ring[i].status = 0; /* CPU owns buffer */ in pcnet32_purge_tx_ring()
2333 if (lp->tx_skbuff[i]) { in pcnet32_purge_tx_ring()
2334 if (!dma_mapping_error(&lp->pci_dev->dev, lp->tx_dma_addr[i])) in pcnet32_purge_tx_ring()
2335 dma_unmap_single(&lp->pci_dev->dev, in pcnet32_purge_tx_ring()
2336 lp->tx_dma_addr[i], in pcnet32_purge_tx_ring()
2337 lp->tx_skbuff[i]->len, in pcnet32_purge_tx_ring()
2339 dev_kfree_skb_any(lp->tx_skbuff[i]); in pcnet32_purge_tx_ring()
2341 lp->tx_skbuff[i] = NULL; in pcnet32_purge_tx_ring()
2342 lp->tx_dma_addr[i] = 0; in pcnet32_purge_tx_ring()
2352 lp->tx_full = 0; in pcnet32_init_ring()
2353 lp->cur_rx = lp->cur_tx = 0; in pcnet32_init_ring()
2354 lp->dirty_rx = lp->dirty_tx = 0; in pcnet32_init_ring()
2356 for (i = 0; i < lp->rx_ring_size; i++) { in pcnet32_init_ring()
2357 struct sk_buff *rx_skbuff = lp->rx_skbuff[i]; in pcnet32_init_ring()
2359 lp->rx_skbuff[i] = netdev_alloc_skb(dev, PKT_BUF_SKB); in pcnet32_init_ring()
2360 rx_skbuff = lp->rx_skbuff[i]; in pcnet32_init_ring()
2365 return -1; in pcnet32_init_ring()
2371 if (lp->rx_dma_addr[i] == 0) { in pcnet32_init_ring()
2372 lp->rx_dma_addr[i] = in pcnet32_init_ring()
2373 dma_map_single(&lp->pci_dev->dev, rx_skbuff->data, in pcnet32_init_ring()
2375 if (dma_mapping_error(&lp->pci_dev->dev, lp->rx_dma_addr[i])) { in pcnet32_init_ring()
2380 return -1; in pcnet32_init_ring()
2383 lp->rx_ring[i].base = cpu_to_le32(lp->rx_dma_addr[i]); in pcnet32_init_ring()
2384 lp->rx_ring[i].buf_length = cpu_to_le16(NEG_BUF_SIZE); in pcnet32_init_ring()
2386 lp->rx_ring[i].status = cpu_to_le16(0x8000); in pcnet32_init_ring()
2390 for (i = 0; i < lp->tx_ring_size; i++) { in pcnet32_init_ring()
2391 lp->tx_ring[i].status = 0; /* CPU owns buffer */ in pcnet32_init_ring()
2393 lp->tx_ring[i].base = 0; in pcnet32_init_ring()
2394 lp->tx_dma_addr[i] = 0; in pcnet32_init_ring()
2397 lp->init_block->tlen_rlen = in pcnet32_init_ring()
2398 cpu_to_le16(lp->tx_len_bits | lp->rx_len_bits); in pcnet32_init_ring()
2400 lp->init_block->phys_addr[i] = dev->dev_addr[i]; in pcnet32_init_ring()
2401 lp->init_block->rx_ring = cpu_to_le32(lp->rx_ring_dma_addr); in pcnet32_init_ring()
2402 lp->init_block->tx_ring = cpu_to_le32(lp->tx_ring_dma_addr); in pcnet32_init_ring()
2408 * then flush the pending transmit operations, re-initialize the ring,
2414 unsigned long ioaddr = dev->base_addr; in pcnet32_restart()
2418 for (i = 0; i < 100; i++) in pcnet32_restart()
2419 if (lp->a->read_csr(ioaddr, CSR0) & CSR0_STOP) in pcnet32_restart()
2422 if (i >= 100) in pcnet32_restart()
2431 lp->a->write_csr(ioaddr, CSR0, CSR0_INIT); in pcnet32_restart()
2434 if (lp->a->read_csr(ioaddr, CSR0) & CSR0_IDON) in pcnet32_restart()
2437 lp->a->write_csr(ioaddr, CSR0, csr0_bits); in pcnet32_restart()
2443 unsigned long ioaddr = dev->base_addr, flags; in pcnet32_tx_timeout()
2445 spin_lock_irqsave(&lp->lock, flags); in pcnet32_tx_timeout()
2449 dev->name, lp->a->read_csr(ioaddr, CSR0)); in pcnet32_tx_timeout()
2450 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); in pcnet32_tx_timeout()
2451 dev->stats.tx_errors++; in pcnet32_tx_timeout()
2456 lp->dirty_tx, lp->cur_tx, lp->tx_full ? " (full)" : "", in pcnet32_tx_timeout()
2457 lp->cur_rx); in pcnet32_tx_timeout()
2458 for (i = 0; i < lp->rx_ring_size; i++) in pcnet32_tx_timeout()
2460 le32_to_cpu(lp->rx_ring[i].base), in pcnet32_tx_timeout()
2461 (-le16_to_cpu(lp->rx_ring[i].buf_length)) & in pcnet32_tx_timeout()
2462 0xffff, le32_to_cpu(lp->rx_ring[i].msg_length), in pcnet32_tx_timeout()
2463 le16_to_cpu(lp->rx_ring[i].status)); in pcnet32_tx_timeout()
2464 for (i = 0; i < lp->tx_ring_size; i++) in pcnet32_tx_timeout()
2466 le32_to_cpu(lp->tx_ring[i].base), in pcnet32_tx_timeout()
2467 (-le16_to_cpu(lp->tx_ring[i].length)) & 0xffff, in pcnet32_tx_timeout()
2468 le32_to_cpu(lp->tx_ring[i].misc), in pcnet32_tx_timeout()
2469 le16_to_cpu(lp->tx_ring[i].status)); in pcnet32_tx_timeout()
2477 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_tx_timeout()
2484 unsigned long ioaddr = dev->base_addr; in pcnet32_start_xmit()
2489 spin_lock_irqsave(&lp->lock, flags); in pcnet32_start_xmit()
2493 __func__, lp->a->read_csr(ioaddr, CSR0)); in pcnet32_start_xmit()
2495 /* Default status -- will not enable Successful-TxDone in pcnet32_start_xmit()
2503 entry = lp->cur_tx & lp->tx_mod_mask; in pcnet32_start_xmit()
2508 lp->tx_ring[entry].length = cpu_to_le16(-skb->len); in pcnet32_start_xmit()
2510 lp->tx_ring[entry].misc = 0x00000000; in pcnet32_start_xmit()
2512 lp->tx_dma_addr[entry] = in pcnet32_start_xmit()
2513 dma_map_single(&lp->pci_dev->dev, skb->data, skb->len, in pcnet32_start_xmit()
2515 if (dma_mapping_error(&lp->pci_dev->dev, lp->tx_dma_addr[entry])) { in pcnet32_start_xmit()
2517 dev->stats.tx_dropped++; in pcnet32_start_xmit()
2520 lp->tx_skbuff[entry] = skb; in pcnet32_start_xmit()
2521 lp->tx_ring[entry].base = cpu_to_le32(lp->tx_dma_addr[entry]); in pcnet32_start_xmit()
2523 lp->tx_ring[entry].status = cpu_to_le16(status); in pcnet32_start_xmit()
2525 lp->cur_tx++; in pcnet32_start_xmit()
2526 dev->stats.tx_bytes += skb->len; in pcnet32_start_xmit()
2529 lp->a->write_csr(ioaddr, CSR0, CSR0_INTEN | CSR0_TXPOLL); in pcnet32_start_xmit()
2531 if (lp->tx_ring[(entry + 1) & lp->tx_mod_mask].base != 0) { in pcnet32_start_xmit()
2532 lp->tx_full = 1; in pcnet32_start_xmit()
2536 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_start_xmit()
2550 ioaddr = dev->base_addr; in pcnet32_interrupt()
2553 spin_lock(&lp->lock); in pcnet32_interrupt()
2555 csr0 = lp->a->read_csr(ioaddr, CSR0); in pcnet32_interrupt()
2556 while ((csr0 & 0x8f00) && --boguscnt >= 0) { in pcnet32_interrupt()
2560 lp->a->write_csr(ioaddr, CSR0, csr0 & ~0x004f); in pcnet32_interrupt()
2564 csr0, lp->a->read_csr(ioaddr, CSR0)); in pcnet32_interrupt()
2568 dev->stats.tx_errors++; /* Tx babble. */ in pcnet32_interrupt()
2581 dev->stats.rx_errors++; /* Missed a Rx frame. */ in pcnet32_interrupt()
2588 if (napi_schedule_prep(&lp->napi)) { in pcnet32_interrupt()
2591 val = lp->a->read_csr(ioaddr, CSR3); in pcnet32_interrupt()
2593 lp->a->write_csr(ioaddr, CSR3, val); in pcnet32_interrupt()
2595 __napi_schedule(&lp->napi); in pcnet32_interrupt()
2598 csr0 = lp->a->read_csr(ioaddr, CSR0); in pcnet32_interrupt()
2603 lp->a->read_csr(ioaddr, CSR0)); in pcnet32_interrupt()
2605 spin_unlock(&lp->lock); in pcnet32_interrupt()
2612 unsigned long ioaddr = dev->base_addr; in pcnet32_close()
2616 del_timer_sync(&lp->watchdog_timer); in pcnet32_close()
2619 napi_disable(&lp->napi); in pcnet32_close()
2621 spin_lock_irqsave(&lp->lock, flags); in pcnet32_close()
2623 dev->stats.rx_missed_errors = lp->a->read_csr(ioaddr, 112); in pcnet32_close()
2627 lp->a->read_csr(ioaddr, CSR0)); in pcnet32_close()
2629 /* We stop the PCNET32 here -- it occasionally polls memory if we don't. */ in pcnet32_close()
2630 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); in pcnet32_close()
2636 lp->a->write_bcr(ioaddr, 20, 4); in pcnet32_close()
2638 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_close()
2640 free_irq(dev->irq, dev); in pcnet32_close()
2642 spin_lock_irqsave(&lp->lock, flags); in pcnet32_close()
2647 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_close()
2655 unsigned long ioaddr = dev->base_addr; in pcnet32_get_stats()
2658 spin_lock_irqsave(&lp->lock, flags); in pcnet32_get_stats()
2659 dev->stats.rx_missed_errors = lp->a->read_csr(ioaddr, 112); in pcnet32_get_stats()
2660 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_get_stats()
2662 return &dev->stats; in pcnet32_get_stats()
2669 volatile struct pcnet32_init_block *ib = lp->init_block; in pcnet32_load_multicast()
2670 volatile __le16 *mcast_table = (__le16 *)ib->filter; in pcnet32_load_multicast()
2672 unsigned long ioaddr = dev->base_addr; in pcnet32_load_multicast()
2677 if (dev->flags & IFF_ALLMULTI) { in pcnet32_load_multicast()
2678 ib->filter[0] = cpu_to_le32(~0U); in pcnet32_load_multicast()
2679 ib->filter[1] = cpu_to_le32(~0U); in pcnet32_load_multicast()
2680 lp->a->write_csr(ioaddr, PCNET32_MC_FILTER, 0xffff); in pcnet32_load_multicast()
2681 lp->a->write_csr(ioaddr, PCNET32_MC_FILTER+1, 0xffff); in pcnet32_load_multicast()
2682 lp->a->write_csr(ioaddr, PCNET32_MC_FILTER+2, 0xffff); in pcnet32_load_multicast()
2683 lp->a->write_csr(ioaddr, PCNET32_MC_FILTER+3, 0xffff); in pcnet32_load_multicast()
2687 ib->filter[0] = 0; in pcnet32_load_multicast()
2688 ib->filter[1] = 0; in pcnet32_load_multicast()
2692 crc = ether_crc_le(6, ha->addr); in pcnet32_load_multicast()
2697 lp->a->write_csr(ioaddr, PCNET32_MC_FILTER + i, in pcnet32_load_multicast()
2706 unsigned long ioaddr = dev->base_addr, flags; in pcnet32_set_multicast_list()
2710 spin_lock_irqsave(&lp->lock, flags); in pcnet32_set_multicast_list()
2712 csr15 = lp->a->read_csr(ioaddr, CSR15); in pcnet32_set_multicast_list()
2713 if (dev->flags & IFF_PROMISC) { in pcnet32_set_multicast_list()
2716 lp->init_block->mode = in pcnet32_set_multicast_list()
2717 cpu_to_le16(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << in pcnet32_set_multicast_list()
2719 lp->a->write_csr(ioaddr, CSR15, csr15 | 0x8000); in pcnet32_set_multicast_list()
2721 lp->init_block->mode = in pcnet32_set_multicast_list()
2722 cpu_to_le16((lp->options & PCNET32_PORT_PORTSEL) << 7); in pcnet32_set_multicast_list()
2723 lp->a->write_csr(ioaddr, CSR15, csr15 & 0x7fff); in pcnet32_set_multicast_list()
2730 lp->a->write_csr(ioaddr, CSR0, CSR0_STOP); in pcnet32_set_multicast_list()
2735 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_set_multicast_list()
2738 /* This routine assumes that the lp->lock is held */
2742 unsigned long ioaddr = dev->base_addr; in mdio_read()
2745 if (!lp->mii) in mdio_read()
2748 lp->a->write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); in mdio_read()
2749 val_out = lp->a->read_bcr(ioaddr, 34); in mdio_read()
2754 /* This routine assumes that the lp->lock is held */
2758 unsigned long ioaddr = dev->base_addr; in mdio_write()
2760 if (!lp->mii) in mdio_write()
2763 lp->a->write_bcr(ioaddr, 33, ((phy_id & 0x1f) << 5) | (reg_num & 0x1f)); in mdio_write()
2764 lp->a->write_bcr(ioaddr, 34, val); in mdio_write()
2774 if (lp->mii) { in pcnet32_ioctl()
2775 spin_lock_irqsave(&lp->lock, flags); in pcnet32_ioctl()
2776 rc = generic_mii_ioctl(&lp->mii_if, if_mii(rq), cmd, NULL); in pcnet32_ioctl()
2777 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_ioctl()
2779 rc = -EOPNOTSUPP; in pcnet32_ioctl()
2788 struct mii_if_info mii = lp->mii_if; in pcnet32_check_otherphy()
2793 if (i == lp->mii_if.phy_id) in pcnet32_check_otherphy()
2795 if (lp->phymask & (1 << i)) { in pcnet32_check_otherphy()
2804 mdio_read(dev, lp->mii_if.phy_id, MII_BMCR); in pcnet32_check_otherphy()
2805 mdio_write(dev, lp->mii_if.phy_id, MII_BMCR, in pcnet32_check_otherphy()
2808 /* de-isolate new phy */ in pcnet32_check_otherphy()
2814 lp->mii_if.phy_id = i; in pcnet32_check_otherphy()
2827 * Caller is assumed to hold and release the lp->lock.
2837 if (lp->mii) { in pcnet32_check_media()
2838 curr_link = mii_link_ok(&lp->mii_if); in pcnet32_check_media()
2839 } else if (lp->chip_version == PCNET32_79C970A) { in pcnet32_check_media()
2840 ulong ioaddr = dev->base_addr; /* card base I/O address */ in pcnet32_check_media()
2842 if (!lp->autoneg && lp->port_tp) in pcnet32_check_media()
2843 curr_link = (lp->a->read_bcr(ioaddr, 4) != 0xc0); in pcnet32_check_media()
2847 ulong ioaddr = dev->base_addr; /* card base I/O address */ in pcnet32_check_media()
2848 curr_link = (lp->a->read_bcr(ioaddr, 4) != 0xc0); in pcnet32_check_media()
2855 if (lp->phycount > 1) { in pcnet32_check_media()
2860 if (lp->mii) { in pcnet32_check_media()
2864 mii_ethtool_gset(&lp->mii_if, &ecmd); in pcnet32_check_media()
2865 netdev_info(dev, "link up, %uMbps, %s-duplex\n", in pcnet32_check_media()
2870 bcr9 = lp->a->read_bcr(dev->base_addr, 9); in pcnet32_check_media()
2871 if ((bcr9 & (1 << 0)) != lp->mii_if.full_duplex) { in pcnet32_check_media()
2872 if (lp->mii_if.full_duplex) in pcnet32_check_media()
2876 lp->a->write_bcr(dev->base_addr, 9, bcr9); in pcnet32_check_media()
2892 struct net_device *dev = lp->dev; in pcnet32_watchdog()
2896 spin_lock_irqsave(&lp->lock, flags); in pcnet32_watchdog()
2898 spin_unlock_irqrestore(&lp->lock, flags); in pcnet32_watchdog()
2900 mod_timer(&lp->watchdog_timer, round_jiffies(PCNET32_WATCHDOG_TIMEOUT)); in pcnet32_watchdog()
2936 release_region(dev->base_addr, PCNET32_TOTAL_SIZE); in pcnet32_remove_one()
2937 dma_free_coherent(&lp->pci_dev->dev, sizeof(*lp->init_block), in pcnet32_remove_one()
2938 lp->init_block, lp->init_dma_addr); in pcnet32_remove_one()
2957 static int debug = -1;
2958 static int tx_start_pt = -1;
2968 DRV_NAME " copy breakpoint for copy-only-tiny-frames");
2970 MODULE_PARM_DESC(tx_start_pt, DRV_NAME " transmit start point (0-3)");
2974 MODULE_PARM_DESC(options, DRV_NAME " initial option setting(s) (0-15)");
3007 return (pcnet32_have_pci + cards_found) ? 0 : -ENODEV; in pcnet32_init_module()
3016 next_dev = lp->next; in pcnet32_cleanup_module()
3019 release_region(pcnet32_dev->base_addr, PCNET32_TOTAL_SIZE); in pcnet32_cleanup_module()
3020 dma_free_coherent(&lp->pci_dev->dev, sizeof(*lp->init_block), in pcnet32_cleanup_module()
3021 lp->init_block, lp->init_dma_addr); in pcnet32_cleanup_module()