Lines Matching +full:suppress +full:- +full:preamble
8 * -----<snip>-----
12 * Copyright (C) 2000-2001 Toshiba Corporation
15 * -----<snip>-----
21 * (C) Copyright TOSHIBA CORPORATION 2004-2005
122 /* DMA_Ctl bit assign ------------------------------------------------------- */
137 /* RxFragSize bit assign ---------------------------------------------------- */
141 /* MAC_Ctl bit assign ------------------------------------------------------- */
155 /* PROM_Ctl bit assign ------------------------------------------------------ */
165 /* CAM_Ctl bit assign ------------------------------------------------------- */
173 /* CAM_Ena bit assign ------------------------------------------------------- */
175 #define CAM_Ena_Mask ((1<<CAM_ENTRY_MAX)-1) /* CAM Enable bits (Max 21bits) */
181 /* Tx_Ctl bit assign -------------------------------------------------------- */
184 #define Tx_NoPad 0x00000004 /* 1:Suppress Padding */
185 #define Tx_NoCRC 0x00000008 /* 1:Suppress Padding */
186 #define Tx_FBack 0x00000010 /* 1:Fast Back-off */
195 /* Tx_Stat bit assign ------------------------------------------------------- */
211 /* Rx_Ctl bit assign -------------------------------------------------------- */
225 /* Rx_Stat bit assign ------------------------------------------------------- */
241 /* Int_En bit assign -------------------------------------------------------- */
242 #define Int_NRAbtEn 0x00000800 /* 1:Non-recoverable Abort Enable */
256 /* Int_Src bit assign ------------------------------------------------------- */
273 /* MD_CA bit assign --------------------------------------------------------- */
274 #define MD_CA_PreSup 0x00001000 /* 1:Preamble Suppress */
299 /* Frame Descriptor bit assign ---------------------------------------------- */
312 /* Buffer Descriptor bit assign --------------------------------------------- */
326 /* Do not use Rx_StripCRC -- it causes trouble on BLEx/FDAEx condition */
335 #define HAVE_DMA_RXALIGN(lp) likely((lp)->chiptype != TC35815CF)
416 * Receiving: Non-Packing Mode.
441 return lp->fd_buf_dma + ((u8 *)virt - (u8 *)lp->fd_buf); in fd_virt_to_bus()
446 return (void *)((u8 *)lp->fd_buf + (bus - lp->fd_buf_dma)); in fd_bus_to_virt()
457 *dma_handle = dma_map_single(&hwdev->dev, skb->data, RX_BUF_SIZE, in alloc_rxbuf_skb()
459 if (dma_mapping_error(&hwdev->dev, *dma_handle)) { in alloc_rxbuf_skb()
469 dma_unmap_single(&hwdev->dev, dma_handle, RX_BUF_SIZE, in free_rxbuf_skb()
492 /* Example routines you must write ;->. */
504 struct net_device *dev = bus->priv; in tc_mdio_read()
506 (struct tc35815_regs __iomem *)dev->base_addr; in tc_mdio_read()
509 tc_writel(MD_CA_Busy | (mii_id << 5) | (regnum & 0x1f), &tr->MD_CA); in tc_mdio_read()
511 while (tc_readl(&tr->MD_CA) & MD_CA_Busy) { in tc_mdio_read()
513 return -EIO; in tc_mdio_read()
516 return tc_readl(&tr->MD_Data) & 0xffff; in tc_mdio_read()
521 struct net_device *dev = bus->priv; in tc_mdio_write()
523 (struct tc35815_regs __iomem *)dev->base_addr; in tc_mdio_write()
526 tc_writel(val, &tr->MD_Data); in tc_mdio_write()
528 &tr->MD_CA); in tc_mdio_write()
530 while (tc_readl(&tr->MD_CA) & MD_CA_Busy) { in tc_mdio_write()
532 return -EIO; in tc_mdio_write()
541 struct phy_device *phydev = dev->phydev; in tc_handle_link_change()
545 spin_lock_irqsave(&lp->lock, flags); in tc_handle_link_change()
546 if (phydev->link && in tc_handle_link_change()
547 (lp->speed != phydev->speed || lp->duplex != phydev->duplex)) { in tc_handle_link_change()
549 (struct tc35815_regs __iomem *)dev->base_addr; in tc_handle_link_change()
552 reg = tc_readl(&tr->MAC_Ctl); in tc_handle_link_change()
554 tc_writel(reg, &tr->MAC_Ctl); in tc_handle_link_change()
555 if (phydev->duplex == DUPLEX_FULL) in tc_handle_link_change()
559 tc_writel(reg, &tr->MAC_Ctl); in tc_handle_link_change()
561 tc_writel(reg, &tr->MAC_Ctl); in tc_handle_link_change()
572 if (phydev->duplex == DUPLEX_HALF && in tc_handle_link_change()
573 lp->chiptype != TC35815_TX4939) in tc_handle_link_change()
574 tc_writel(tc_readl(&tr->Tx_Ctl) | Tx_EnLCarr, in tc_handle_link_change()
575 &tr->Tx_Ctl); in tc_handle_link_change()
577 lp->speed = phydev->speed; in tc_handle_link_change()
578 lp->duplex = phydev->duplex; in tc_handle_link_change()
582 if (phydev->link != lp->link) { in tc_handle_link_change()
583 if (phydev->link) { in tc_handle_link_change()
585 if (dev->flags & IFF_PROMISC) in tc_handle_link_change()
588 lp->speed = 0; in tc_handle_link_change()
589 lp->duplex = -1; in tc_handle_link_change()
591 lp->link = phydev->link; in tc_handle_link_change()
595 spin_unlock_irqrestore(&lp->lock, flags); in tc_handle_link_change()
600 dev->name, in tc_handle_link_change()
613 phydev = phy_find_first(lp->mii_bus); in tc_mii_probe()
615 printk(KERN_ERR "%s: no PHY found\n", dev->name); in tc_mii_probe()
616 return -ENODEV; in tc_mii_probe()
622 lp->chiptype == TC35815_TX4939 ? PHY_INTERFACE_MODE_RMII : PHY_INTERFACE_MODE_MII); in tc_mii_probe()
624 printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); in tc_mii_probe()
646 linkmode_andnot(phydev->supported, phydev->supported, mask); in tc_mii_probe()
647 linkmode_copy(phydev->advertising, phydev->supported); in tc_mii_probe()
649 lp->link = 0; in tc_mii_probe()
650 lp->speed = 0; in tc_mii_probe()
651 lp->duplex = -1; in tc_mii_probe()
661 lp->mii_bus = mdiobus_alloc(); in tc_mii_init()
662 if (lp->mii_bus == NULL) { in tc_mii_init()
663 err = -ENOMEM; in tc_mii_init()
667 lp->mii_bus->name = "tc35815_mii_bus"; in tc_mii_init()
668 lp->mii_bus->read = tc_mdio_read; in tc_mii_init()
669 lp->mii_bus->write = tc_mdio_write; in tc_mii_init()
670 snprintf(lp->mii_bus->id, MII_BUS_ID_SIZE, "%x", pci_dev_id(lp->pci_dev)); in tc_mii_init()
671 lp->mii_bus->priv = dev; in tc_mii_init()
672 lp->mii_bus->parent = &lp->pci_dev->dev; in tc_mii_init()
673 err = mdiobus_register(lp->mii_bus); in tc_mii_init()
682 mdiobus_unregister(lp->mii_bus); in tc_mii_init()
684 mdiobus_free(lp->mii_bus); in tc_mii_init()
692 * should provide a "tc35815-mac" device with a MAC address in its
699 unsigned int id = pci_dev->irq; in tc35815_mac_match()
700 return !strcmp(plat_dev->name, "tc35815-mac") && plat_dev->id == id; in tc35815_mac_match()
707 lp->pci_dev, tc35815_mac_match); in tc35815_read_plat_dev_addr()
709 if (pd->platform_data) in tc35815_read_plat_dev_addr()
710 eth_hw_addr_set(dev, pd->platform_data); in tc35815_read_plat_dev_addr()
712 return is_valid_ether_addr(dev->dev_addr) ? 0 : -ENODEV; in tc35815_read_plat_dev_addr()
714 return -ENODEV; in tc35815_read_plat_dev_addr()
719 return -ENODEV; in tc35815_read_plat_dev_addr()
726 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_init_dev_addr()
730 while (tc_readl(&tr->PROM_Ctl) & PROM_Busy) in tc35815_init_dev_addr()
734 tc_writel(PROM_Busy | PROM_Read | (i / 2 + 2), &tr->PROM_Ctl); in tc35815_init_dev_addr()
735 while (tc_readl(&tr->PROM_Ctl) & PROM_Busy) in tc35815_init_dev_addr()
737 data = tc_readl(&tr->PROM_Data); in tc35815_init_dev_addr()
742 if (!is_valid_ether_addr(dev->dev_addr)) in tc35815_init_dev_addr()
773 dev_printk(KERN_DEBUG, &pdev->dev, in tc35815_init_one()
778 if (!pdev->irq) { in tc35815_init_one()
779 dev_warn(&pdev->dev, "no IRQ assigned.\n"); in tc35815_init_one()
780 return -ENODEV; in tc35815_init_one()
786 return -ENOMEM; in tc35815_init_one()
788 SET_NETDEV_DEV(dev, &pdev->dev); in tc35815_init_one()
790 lp->dev = dev; in tc35815_init_one()
792 /* enable device (incl. PCI PM wakeup), and bus-mastering */ in tc35815_init_one()
803 dev->netdev_ops = &tc35815_netdev_ops; in tc35815_init_one()
804 dev->ethtool_ops = &tc35815_ethtool_ops; in tc35815_init_one()
805 dev->watchdog_timeo = TC35815_TX_TIMEOUT; in tc35815_init_one()
806 netif_napi_add_weight(dev, &lp->napi, tc35815_poll, NAPI_WEIGHT); in tc35815_init_one()
808 dev->irq = pdev->irq; in tc35815_init_one()
809 dev->base_addr = (unsigned long)ioaddr; in tc35815_init_one()
811 INIT_WORK(&lp->restart_work, tc35815_restart_work); in tc35815_init_one()
812 spin_lock_init(&lp->lock); in tc35815_init_one()
813 spin_lock_init(&lp->rx_lock); in tc35815_init_one()
814 lp->pci_dev = pdev; in tc35815_init_one()
815 lp->chiptype = ent->driver_data; in tc35815_init_one()
817 lp->msg_enable = NETIF_MSG_TX_ERR | NETIF_MSG_HW | NETIF_MSG_DRV | NETIF_MSG_LINK; in tc35815_init_one()
825 dev_warn(&pdev->dev, "not valid ether addr\n"); in tc35815_init_one()
834 dev->name, in tc35815_init_one()
835 chip_info[ent->driver_data].name, in tc35815_init_one()
836 dev->base_addr, in tc35815_init_one()
837 dev->dev_addr, in tc35815_init_one()
838 dev->irq); in tc35815_init_one()
859 phy_disconnect(dev->phydev); in tc35815_remove_one()
860 mdiobus_unregister(lp->mii_bus); in tc35815_remove_one()
861 mdiobus_free(lp->mii_bus); in tc35815_remove_one()
873 if (!lp->fd_buf) { in tc35815_init_queues()
880 lp->fd_buf = dma_alloc_coherent(&lp->pci_dev->dev, in tc35815_init_queues()
882 &lp->fd_buf_dma, GFP_ATOMIC); in tc35815_init_queues()
883 if (!lp->fd_buf) in tc35815_init_queues()
884 return -ENOMEM; in tc35815_init_queues()
886 lp->rx_skbs[i].skb = in tc35815_init_queues()
887 alloc_rxbuf_skb(dev, lp->pci_dev, in tc35815_init_queues()
888 &lp->rx_skbs[i].skb_dma); in tc35815_init_queues()
889 if (!lp->rx_skbs[i].skb) { in tc35815_init_queues()
890 while (--i >= 0) { in tc35815_init_queues()
891 free_rxbuf_skb(lp->pci_dev, in tc35815_init_queues()
892 lp->rx_skbs[i].skb, in tc35815_init_queues()
893 lp->rx_skbs[i].skb_dma); in tc35815_init_queues()
894 lp->rx_skbs[i].skb = NULL; in tc35815_init_queues()
896 dma_free_coherent(&lp->pci_dev->dev, in tc35815_init_queues()
898 lp->fd_buf, lp->fd_buf_dma); in tc35815_init_queues()
899 lp->fd_buf = NULL; in tc35815_init_queues()
900 return -ENOMEM; in tc35815_init_queues()
904 dev->name, lp->fd_buf); in tc35815_init_queues()
908 clear_page((void *)((unsigned long)lp->fd_buf + in tc35815_init_queues()
911 fd_addr = (unsigned long)lp->fd_buf; in tc35815_init_queues()
914 lp->rfd_base = (struct RxFD *)fd_addr; in tc35815_init_queues()
917 lp->rfd_base[i].fd.FDCtl = cpu_to_le32(FD_CownsFD); in tc35815_init_queues()
918 lp->rfd_cur = lp->rfd_base; in tc35815_init_queues()
919 lp->rfd_limit = (struct RxFD *)fd_addr - (RX_FD_RESERVE + 1); in tc35815_init_queues()
922 lp->tfd_base = (struct TxFD *)fd_addr; in tc35815_init_queues()
925 lp->tfd_base[i].fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, &lp->tfd_base[i+1])); in tc35815_init_queues()
926 lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0xffffffff); in tc35815_init_queues()
927 lp->tfd_base[i].fd.FDCtl = cpu_to_le32(0); in tc35815_init_queues()
929 lp->tfd_base[TX_FD_NUM-1].fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, &lp->tfd_base[0])); in tc35815_init_queues()
930 lp->tfd_start = 0; in tc35815_init_queues()
931 lp->tfd_end = 0; in tc35815_init_queues()
934 lp->fbl_ptr = (struct FrFD *)fd_addr; in tc35815_init_queues()
935 lp->fbl_ptr->fd.FDNext = cpu_to_le32(fd_virt_to_bus(lp, lp->fbl_ptr)); in tc35815_init_queues()
936 lp->fbl_ptr->fd.FDCtl = cpu_to_le32(RX_BUF_NUM | FD_CownsFD); in tc35815_init_queues()
942 lp->fbl_count = 0; in tc35815_init_queues()
944 if (lp->rx_skbs[i].skb) { in tc35815_init_queues()
945 if (i != lp->fbl_count) { in tc35815_init_queues()
946 lp->rx_skbs[lp->fbl_count].skb = in tc35815_init_queues()
947 lp->rx_skbs[i].skb; in tc35815_init_queues()
948 lp->rx_skbs[lp->fbl_count].skb_dma = in tc35815_init_queues()
949 lp->rx_skbs[i].skb_dma; in tc35815_init_queues()
951 lp->fbl_count++; in tc35815_init_queues()
955 if (i >= lp->fbl_count) { in tc35815_init_queues()
956 lp->fbl_ptr->bd[i].BuffData = 0; in tc35815_init_queues()
957 lp->fbl_ptr->bd[i].BDCtl = 0; in tc35815_init_queues()
960 lp->fbl_ptr->bd[i].BuffData = in tc35815_init_queues()
961 cpu_to_le32(lp->rx_skbs[i].skb_dma); in tc35815_init_queues()
963 lp->fbl_ptr->bd[i].BDCtl = in tc35815_init_queues()
969 dev->name, lp->tfd_base, lp->rfd_base, lp->fbl_ptr); in tc35815_init_queues()
980 u32 fdsystem = le32_to_cpu(lp->tfd_base[i].fd.FDSystem); in tc35815_clear_queues()
983 lp->tx_skbs[fdsystem].skb : NULL; in tc35815_clear_queues()
985 if (lp->tx_skbs[i].skb != skb) { in tc35815_clear_queues()
986 printk("%s: tx_skbs mismatch(%d).\n", dev->name, i); in tc35815_clear_queues()
990 BUG_ON(lp->tx_skbs[i].skb != skb); in tc35815_clear_queues()
993 dma_unmap_single(&lp->pci_dev->dev, in tc35815_clear_queues()
994 lp->tx_skbs[i].skb_dma, skb->len, in tc35815_clear_queues()
996 lp->tx_skbs[i].skb = NULL; in tc35815_clear_queues()
997 lp->tx_skbs[i].skb_dma = 0; in tc35815_clear_queues()
1000 lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0xffffffff); in tc35815_clear_queues()
1012 if (lp->tfd_base) { in tc35815_free_queues()
1014 u32 fdsystem = le32_to_cpu(lp->tfd_base[i].fd.FDSystem); in tc35815_free_queues()
1017 lp->tx_skbs[fdsystem].skb : NULL; in tc35815_free_queues()
1019 if (lp->tx_skbs[i].skb != skb) { in tc35815_free_queues()
1020 printk("%s: tx_skbs mismatch(%d).\n", dev->name, i); in tc35815_free_queues()
1024 BUG_ON(lp->tx_skbs[i].skb != skb); in tc35815_free_queues()
1027 dma_unmap_single(&lp->pci_dev->dev, in tc35815_free_queues()
1028 lp->tx_skbs[i].skb_dma, in tc35815_free_queues()
1029 skb->len, DMA_TO_DEVICE); in tc35815_free_queues()
1031 lp->tx_skbs[i].skb = NULL; in tc35815_free_queues()
1032 lp->tx_skbs[i].skb_dma = 0; in tc35815_free_queues()
1034 lp->tfd_base[i].fd.FDSystem = cpu_to_le32(0xffffffff); in tc35815_free_queues()
1038 lp->rfd_base = NULL; in tc35815_free_queues()
1039 lp->rfd_limit = NULL; in tc35815_free_queues()
1040 lp->rfd_cur = NULL; in tc35815_free_queues()
1041 lp->fbl_ptr = NULL; in tc35815_free_queues()
1044 if (lp->rx_skbs[i].skb) { in tc35815_free_queues()
1045 free_rxbuf_skb(lp->pci_dev, lp->rx_skbs[i].skb, in tc35815_free_queues()
1046 lp->rx_skbs[i].skb_dma); in tc35815_free_queues()
1047 lp->rx_skbs[i].skb = NULL; in tc35815_free_queues()
1050 if (lp->fd_buf) { in tc35815_free_queues()
1051 dma_free_coherent(&lp->pci_dev->dev, PAGE_SIZE * FD_PAGE_NUM, in tc35815_free_queues()
1052 lp->fd_buf, lp->fd_buf_dma); in tc35815_free_queues()
1053 lp->fd_buf = NULL; in tc35815_free_queues()
1061 le32_to_cpu(fd->fd.FDNext), in dump_txfd()
1062 le32_to_cpu(fd->fd.FDSystem), in dump_txfd()
1063 le32_to_cpu(fd->fd.FDStat), in dump_txfd()
1064 le32_to_cpu(fd->fd.FDCtl)); in dump_txfd()
1067 le32_to_cpu(fd->bd.BuffData), in dump_txfd()
1068 le32_to_cpu(fd->bd.BDCtl)); in dump_txfd()
1075 int i, bd_count = (le32_to_cpu(fd->fd.FDCtl) & FD_BDCnt_MASK) >> FD_BDCnt_SHIFT; in dump_rxfd()
1079 le32_to_cpu(fd->fd.FDNext), in dump_rxfd()
1080 le32_to_cpu(fd->fd.FDSystem), in dump_rxfd()
1081 le32_to_cpu(fd->fd.FDStat), in dump_rxfd()
1082 le32_to_cpu(fd->fd.FDCtl)); in dump_rxfd()
1083 if (le32_to_cpu(fd->fd.FDCtl) & FD_CownsFD) in dump_rxfd()
1088 le32_to_cpu(fd->bd[i].BuffData), in dump_rxfd()
1089 le32_to_cpu(fd->bd[i].BDCtl)); in dump_rxfd()
1100 le32_to_cpu(fd->fd.FDNext), in dump_frfd()
1101 le32_to_cpu(fd->fd.FDSystem), in dump_frfd()
1102 le32_to_cpu(fd->fd.FDStat), in dump_frfd()
1103 le32_to_cpu(fd->fd.FDCtl)); in dump_frfd()
1107 le32_to_cpu(fd->bd[i].BuffData), in dump_frfd()
1108 le32_to_cpu(fd->bd[i].BDCtl)); in dump_frfd()
1119 lp->tfd_base, lp->tfd_start, lp->tfd_end); in panic_queues()
1121 lp->rfd_base, lp->rfd_limit, lp->rfd_cur); in panic_queues()
1122 printk("FrFD %p\n", lp->fbl_ptr); in panic_queues()
1124 dump_txfd(&lp->tfd_base[i]); in panic_queues()
1126 int bd_count = dump_rxfd(&lp->rfd_base[i]); in panic_queues()
1129 dump_frfd(lp->fbl_ptr); in panic_queues()
1130 panic("%s: Illegal queue state.", dev->name); in panic_queues()
1144 return (lp->tfd_start + 1) % TX_FD_NUM == lp->tfd_end; in tc35815_tx_full()
1152 if (dev->phydev) { in tc35815_restart()
1153 ret = phy_init_hw(dev->phydev); in tc35815_restart()
1155 printk(KERN_ERR "%s: PHY init failed.\n", dev->name); in tc35815_restart()
1158 spin_lock_bh(&lp->rx_lock); in tc35815_restart()
1159 spin_lock_irq(&lp->lock); in tc35815_restart()
1165 spin_unlock_irq(&lp->lock); in tc35815_restart()
1166 spin_unlock_bh(&lp->rx_lock); in tc35815_restart()
1175 struct net_device *dev = lp->dev; in tc35815_restart_work()
1184 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_schedule_restart()
1188 spin_lock_irqsave(&lp->lock, flags); in tc35815_schedule_restart()
1189 tc_writel(0, &tr->Int_En); in tc35815_schedule_restart()
1190 tc_writel(tc_readl(&tr->DMA_Ctl) | DMA_IntMask, &tr->DMA_Ctl); in tc35815_schedule_restart()
1191 schedule_work(&lp->restart_work); in tc35815_schedule_restart()
1192 spin_unlock_irqrestore(&lp->lock, flags); in tc35815_schedule_restart()
1198 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_tx_timeout()
1201 dev->name, tc_readl(&tr->Tx_Stat)); in tc35815_tx_timeout()
1205 dev->stats.tx_errors++; in tc35815_tx_timeout()
1214 * there is non-reboot way to recover if something goes wrong.
1223 * See 3c503.c for an example of selecting the IRQ at config-time. in tc35815_open()
1225 if (request_irq(dev->irq, tc35815_interrupt, IRQF_SHARED, in tc35815_open()
1226 dev->name, dev)) in tc35815_open()
1227 return -EAGAIN; in tc35815_open()
1232 free_irq(dev->irq, dev); in tc35815_open()
1233 return -EAGAIN; in tc35815_open()
1236 napi_enable(&lp->napi); in tc35815_open()
1239 spin_lock_irq(&lp->lock); in tc35815_open()
1241 spin_unlock_irq(&lp->lock); in tc35815_open()
1245 phy_start(dev->phydev); in tc35815_open()
1281 spin_lock_irqsave(&lp->lock, flags); in tc35815_send_packet()
1284 if ((lp->tfd_start + TX_FD_NUM - lp->tfd_end) % TX_FD_NUM > in tc35815_send_packet()
1289 print_eth(skb->data); in tc35815_send_packet()
1291 if (lp->tx_skbs[lp->tfd_start].skb) { in tc35815_send_packet()
1292 printk("%s: tx_skbs conflict.\n", dev->name); in tc35815_send_packet()
1296 BUG_ON(lp->tx_skbs[lp->tfd_start].skb); in tc35815_send_packet()
1298 lp->tx_skbs[lp->tfd_start].skb = skb; in tc35815_send_packet()
1299 lp->tx_skbs[lp->tfd_start].skb_dma = dma_map_single(&lp->pci_dev->dev, in tc35815_send_packet()
1300 skb->data, in tc35815_send_packet()
1301 skb->len, in tc35815_send_packet()
1305 txfd = &lp->tfd_base[lp->tfd_start]; in tc35815_send_packet()
1306 txfd->bd.BuffData = cpu_to_le32(lp->tx_skbs[lp->tfd_start].skb_dma); in tc35815_send_packet()
1307 txfd->bd.BDCtl = cpu_to_le32(skb->len); in tc35815_send_packet()
1308 txfd->fd.FDSystem = cpu_to_le32(lp->tfd_start); in tc35815_send_packet()
1309 txfd->fd.FDCtl = cpu_to_le32(FD_CownsFD | (1 << FD_BDCnt_SHIFT)); in tc35815_send_packet()
1311 if (lp->tfd_start == lp->tfd_end) { in tc35815_send_packet()
1313 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_send_packet()
1315 txfd->fd.FDNext |= cpu_to_le32(FD_Next_EOL); in tc35815_send_packet()
1316 txfd->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); in tc35815_send_packet()
1318 printk("%s: starting TxFD.\n", dev->name); in tc35815_send_packet()
1321 tc_writel(fd_virt_to_bus(lp, txfd), &tr->TxFrmPtr); in tc35815_send_packet()
1323 txfd->fd.FDNext &= cpu_to_le32(~FD_Next_EOL); in tc35815_send_packet()
1325 printk("%s: queueing TxFD.\n", dev->name); in tc35815_send_packet()
1329 lp->tfd_start = (lp->tfd_start + 1) % TX_FD_NUM; in tc35815_send_packet()
1337 printk(KERN_WARNING "%s: TxFD Exhausted.\n", dev->name); in tc35815_send_packet()
1345 spin_unlock_irqrestore(&lp->lock, flags); in tc35815_send_packet()
1355 dev->name, status); in tc35815_fatal_error_interrupt()
1364 panic("%s: Too many fatal errors.", dev->name); in tc35815_fatal_error_interrupt()
1365 printk(KERN_WARNING "%s: Resetting ...\n", dev->name); in tc35815_fatal_error_interrupt()
1373 int ret = -1; in tc35815_do_interrupt()
1383 dev_warn(&dev->dev, in tc35815_do_interrupt()
1386 dev->stats.rx_dropped++; in tc35815_do_interrupt()
1391 dev_warn(&dev->dev, in tc35815_do_interrupt()
1394 dev->stats.rx_dropped++; in tc35815_do_interrupt()
1399 dev_warn(&dev->dev, in tc35815_do_interrupt()
1402 dev->stats.rx_length_errors++; in tc35815_do_interrupt()
1410 lp->lstats.rx_ints++; in tc35815_do_interrupt()
1414 lp->lstats.tx_ints++; in tc35815_do_interrupt()
1415 spin_lock_irq(&lp->lock); in tc35815_do_interrupt()
1417 spin_unlock_irq(&lp->lock); in tc35815_do_interrupt()
1433 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_interrupt()
1434 u32 dmactl = tc_readl(&tr->DMA_Ctl); in tc35815_interrupt()
1437 if (napi_schedule_prep(&lp->napi)) { in tc35815_interrupt()
1439 tc_writel(dmactl | DMA_IntMask, &tr->DMA_Ctl); in tc35815_interrupt()
1440 __napi_schedule(&lp->napi); in tc35815_interrupt()
1442 (void)tc_readl(&tr->Int_Src); /* flush */ in tc35815_interrupt()
1451 disable_irq(dev->irq); in tc35815_poll_controller()
1452 tc35815_interrupt(dev->irq, dev); in tc35815_poll_controller()
1453 enable_irq(dev->irq); in tc35815_poll_controller()
1466 while (!((fdctl = le32_to_cpu(lp->rfd_cur->fd.FDCtl)) & FD_CownsFD)) { in tc35815_rx()
1467 int status = le32_to_cpu(lp->rfd_cur->fd.FDStat); in tc35815_rx()
1474 pkt_len -= ETH_FCS_LEN; in tc35815_rx()
1478 dump_rxfd(lp->rfd_cur); in tc35815_rx()
1484 if (--limit < 0) in tc35815_rx()
1487 cur_bd = (le32_to_cpu(lp->rfd_cur->bd[0].BDCtl) in tc35815_rx()
1491 printk("%s: invalid BDID.\n", dev->name); in tc35815_rx()
1494 BUG_ON(lp->rx_skbs[cur_bd].skb_dma != in tc35815_rx()
1495 (le32_to_cpu(lp->rfd_cur->bd[0].BuffData) & ~3)); in tc35815_rx()
1496 if (!lp->rx_skbs[cur_bd].skb) { in tc35815_rx()
1497 printk("%s: NULL skb.\n", dev->name); in tc35815_rx()
1503 skb = lp->rx_skbs[cur_bd].skb; in tc35815_rx()
1504 prefetch(skb->data); in tc35815_rx()
1505 lp->rx_skbs[cur_bd].skb = NULL; in tc35815_rx()
1506 dma_unmap_single(&lp->pci_dev->dev, in tc35815_rx()
1507 lp->rx_skbs[cur_bd].skb_dma, in tc35815_rx()
1510 memmove(skb->data, skb->data - NET_IP_ALIGN, in tc35815_rx()
1515 skb->protocol = eth_type_trans(skb, dev); in tc35815_rx()
1518 dev->stats.rx_packets++; in tc35815_rx()
1519 dev->stats.rx_bytes += pkt_len; in tc35815_rx()
1521 dev->stats.rx_errors++; in tc35815_rx()
1523 dev_info(&dev->dev, "Rx error (status %x)\n", in tc35815_rx()
1531 dev->stats.rx_length_errors++; in tc35815_rx()
1533 dev->stats.rx_fifo_errors++; in tc35815_rx()
1535 dev->stats.rx_crc_errors++; in tc35815_rx()
1537 dev->stats.rx_frame_errors++; in tc35815_rx()
1542 int bdctl = le32_to_cpu(lp->rfd_cur->bd[bd_count - 1].BDCtl); in tc35815_rx()
1547 printk("%s: invalid BDID.\n", dev->name); in tc35815_rx()
1554 lp->fbl_count--; in tc35815_rx()
1555 while (lp->fbl_count < RX_BUF_NUM) in tc35815_rx()
1558 (id + 1 + lp->fbl_count) % RX_BUF_NUM; in tc35815_rx()
1559 struct BDesc *bd = &lp->fbl_ptr->bd[curid]; in tc35815_rx()
1561 bdctl = le32_to_cpu(bd->BDCtl); in tc35815_rx()
1564 dev->name); in tc35815_rx()
1569 if (!lp->rx_skbs[curid].skb) { in tc35815_rx()
1570 lp->rx_skbs[curid].skb = in tc35815_rx()
1572 lp->pci_dev, in tc35815_rx()
1573 &lp->rx_skbs[curid].skb_dma); in tc35815_rx()
1574 if (!lp->rx_skbs[curid].skb) in tc35815_rx()
1576 bd->BuffData = cpu_to_le32(lp->rx_skbs[curid].skb_dma); in tc35815_rx()
1579 bd->BDCtl = cpu_to_le32(BD_CownsBD | in tc35815_rx()
1582 lp->fbl_count++; in tc35815_rx()
1589 le32_to_cpu(lp->rfd_cur->fd.FDNext)); in tc35815_rx()
1590 if (next_rfd < lp->rfd_base || next_rfd > lp->rfd_limit) { in tc35815_rx()
1591 printk("%s: RxFD FDNext invalid.\n", dev->name); in tc35815_rx()
1598 lp->rfd_cur->fd.FDNext = cpu_to_le32(0xdeaddead); in tc35815_rx()
1600 lp->rfd_cur->fd.FDNext = cpu_to_le32(FD_Next_EOL); in tc35815_rx()
1602 lp->rfd_cur->fd.FDCtl = cpu_to_le32(FD_CownsFD); in tc35815_rx()
1603 lp->rfd_cur++; in tc35815_rx()
1605 if (lp->rfd_cur > lp->rfd_limit) in tc35815_rx()
1606 lp->rfd_cur = lp->rfd_base; in tc35815_rx()
1608 if (lp->rfd_cur != next_rfd) in tc35815_rx()
1610 lp->rfd_cur, next_rfd); in tc35815_rx()
1620 struct net_device *dev = lp->dev; in tc35815_poll()
1622 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_poll()
1629 spin_lock(&lp->rx_lock); in tc35815_poll()
1630 status = tc_readl(&tr->Int_Src); in tc35815_poll()
1634 &tr->Int_Src); /* write to clear */ in tc35815_poll()
1636 handled = tc35815_do_interrupt(dev, status, budget - received); in tc35815_poll()
1639 &tr->Int_Src); in tc35815_poll()
1645 status = tc_readl(&tr->Int_Src); in tc35815_poll()
1647 spin_unlock(&lp->rx_lock); in tc35815_poll()
1652 tc_writel(tc_readl(&tr->DMA_Ctl) & ~DMA_IntMask, &tr->DMA_Ctl); in tc35815_poll()
1667 dev->stats.collisions += 16; in tc35815_check_tx_stat()
1669 dev->stats.collisions += status & Tx_TxColl_MASK; in tc35815_check_tx_stat()
1672 if (lp->chiptype == TC35815_TX4939) in tc35815_check_tx_stat()
1675 if (!lp->link || lp->duplex == DUPLEX_FULL) in tc35815_check_tx_stat()
1680 dev->stats.tx_packets++; in tc35815_check_tx_stat()
1684 dev->stats.tx_errors++; in tc35815_check_tx_stat()
1686 dev->stats.tx_aborted_errors++; in tc35815_check_tx_stat()
1690 dev->stats.tx_fifo_errors++; in tc35815_check_tx_stat()
1692 if (lp->lstats.tx_underrun < TX_THRESHOLD_KEEP_LIMIT) { in tc35815_check_tx_stat()
1693 lp->lstats.tx_underrun++; in tc35815_check_tx_stat()
1694 if (lp->lstats.tx_underrun >= TX_THRESHOLD_KEEP_LIMIT) { in tc35815_check_tx_stat()
1696 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_check_tx_stat()
1697 tc_writel(TX_THRESHOLD_MAX, &tr->TxThrsh); in tc35815_check_tx_stat()
1703 dev->stats.tx_fifo_errors++; in tc35815_check_tx_stat()
1707 dev->stats.tx_carrier_errors++; in tc35815_check_tx_stat()
1711 dev->stats.tx_aborted_errors++; in tc35815_check_tx_stat()
1715 dev->stats.tx_fifo_errors++; in tc35815_check_tx_stat()
1719 dev->stats.tx_heartbeat_errors++; in tc35815_check_tx_stat()
1723 printk(KERN_WARNING "%s: %s (%#x)\n", dev->name, msg, status); in tc35815_check_tx_stat()
1736 txfd = &lp->tfd_base[lp->tfd_end]; in tc35815_txdone()
1737 while (lp->tfd_start != lp->tfd_end && in tc35815_txdone()
1738 !((fdctl = le32_to_cpu(txfd->fd.FDCtl)) & FD_CownsFD)) { in tc35815_txdone()
1739 int status = le32_to_cpu(txfd->fd.FDStat); in tc35815_txdone()
1741 unsigned long fdnext = le32_to_cpu(txfd->fd.FDNext); in tc35815_txdone()
1742 u32 fdsystem = le32_to_cpu(txfd->fd.FDSystem); in tc35815_txdone()
1745 printk("%s: complete TxFD.\n", dev->name); in tc35815_txdone()
1751 lp->tx_skbs[fdsystem].skb : NULL; in tc35815_txdone()
1753 if (lp->tx_skbs[lp->tfd_end].skb != skb) { in tc35815_txdone()
1754 printk("%s: tx_skbs mismatch.\n", dev->name); in tc35815_txdone()
1758 BUG_ON(lp->tx_skbs[lp->tfd_end].skb != skb); in tc35815_txdone()
1761 dev->stats.tx_bytes += skb->len; in tc35815_txdone()
1762 dma_unmap_single(&lp->pci_dev->dev, in tc35815_txdone()
1763 lp->tx_skbs[lp->tfd_end].skb_dma, in tc35815_txdone()
1764 skb->len, DMA_TO_DEVICE); in tc35815_txdone()
1765 lp->tx_skbs[lp->tfd_end].skb = NULL; in tc35815_txdone()
1766 lp->tx_skbs[lp->tfd_end].skb_dma = 0; in tc35815_txdone()
1769 txfd->fd.FDSystem = cpu_to_le32(0xffffffff); in tc35815_txdone()
1771 lp->tfd_end = (lp->tfd_end + 1) % TX_FD_NUM; in tc35815_txdone()
1772 txfd = &lp->tfd_base[lp->tfd_end]; in tc35815_txdone()
1775 printk("%s: TxFD FDNext invalid.\n", dev->name); in tc35815_txdone()
1781 if (lp->tfd_end != lp->tfd_start) { in tc35815_txdone()
1783 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_txdone()
1784 int head = (lp->tfd_start + TX_FD_NUM - 1) % TX_FD_NUM; in tc35815_txdone()
1785 struct TxFD *txhead = &lp->tfd_base[head]; in tc35815_txdone()
1786 int qlen = (lp->tfd_start + TX_FD_NUM in tc35815_txdone()
1787 - lp->tfd_end) % TX_FD_NUM; in tc35815_txdone()
1790 if (!(le32_to_cpu(txfd->fd.FDCtl) & FD_CownsFD)) { in tc35815_txdone()
1791 printk("%s: TxFD FDCtl invalid.\n", dev->name); in tc35815_txdone()
1796 if (lp->lstats.max_tx_qlen < qlen) in tc35815_txdone()
1797 lp->lstats.max_tx_qlen = qlen; in tc35815_txdone()
1801 txhead->fd.FDNext |= cpu_to_le32(FD_Next_EOL); in tc35815_txdone()
1802 txhead->fd.FDCtl |= cpu_to_le32(FD_FrmOpt_IntTx); in tc35815_txdone()
1805 dev->name); in tc35815_txdone()
1808 tc_writel(fd_virt_to_bus(lp, txfd), &tr->TxFrmPtr); in tc35815_txdone()
1829 napi_disable(&lp->napi); in tc35815_close()
1830 if (dev->phydev) in tc35815_close()
1831 phy_stop(dev->phydev); in tc35815_close()
1832 cancel_work_sync(&lp->restart_work); in tc35815_close()
1836 free_irq(dev->irq, dev); in tc35815_close()
1851 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_get_stats()
1854 dev->stats.rx_missed_errors += tc_readl(&tr->Miss_Cnt); in tc35815_get_stats()
1856 return &dev->stats; in tc35815_get_stats()
1864 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_set_cam_entry()
1869 saved_addr = tc_readl(&tr->CAM_Adr); in tc35815_set_cam_entry()
1873 dev->name, index, addr); in tc35815_set_cam_entry()
1876 tc_writel(cam_index - 2, &tr->CAM_Adr); in tc35815_set_cam_entry()
1877 cam_data = tc_readl(&tr->CAM_Data) & 0xffff0000; in tc35815_set_cam_entry()
1879 tc_writel(cam_data, &tr->CAM_Data); in tc35815_set_cam_entry()
1881 tc_writel(cam_index + 2, &tr->CAM_Adr); in tc35815_set_cam_entry()
1883 tc_writel(cam_data, &tr->CAM_Data); in tc35815_set_cam_entry()
1886 tc_writel(cam_index, &tr->CAM_Adr); in tc35815_set_cam_entry()
1888 tc_writel(cam_data, &tr->CAM_Data); in tc35815_set_cam_entry()
1890 tc_writel(cam_index + 4, &tr->CAM_Adr); in tc35815_set_cam_entry()
1891 cam_data = tc_readl(&tr->CAM_Data) & 0x0000ffff; in tc35815_set_cam_entry()
1893 tc_writel(cam_data, &tr->CAM_Data); in tc35815_set_cam_entry()
1896 tc_writel(saved_addr, &tr->CAM_Adr); in tc35815_set_cam_entry()
1902 * num_addrs == -1 Promiscuous mode, receive all packets
1905 * and do best-effort filtering.
1911 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_set_multicast_list()
1913 if (dev->flags & IFF_PROMISC) { in tc35815_set_multicast_list()
1919 if (!lp->link) in tc35815_set_multicast_list()
1922 tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc | CAM_StationAcc, &tr->CAM_Ctl); in tc35815_set_multicast_list()
1923 } else if ((dev->flags & IFF_ALLMULTI) || in tc35815_set_multicast_list()
1924 netdev_mc_count(dev) > CAM_ENTRY_MAX - 3) { in tc35815_set_multicast_list()
1927 tc_writel(CAM_CompEn | CAM_BroadAcc | CAM_GroupAcc, &tr->CAM_Ctl); in tc35815_set_multicast_list()
1933 tc_writel(0, &tr->CAM_Ctl); in tc35815_set_multicast_list()
1938 tc35815_set_cam_entry(dev, i + 2, ha->addr); in tc35815_set_multicast_list()
1942 tc_writel(ena_bits, &tr->CAM_Ena); in tc35815_set_multicast_list()
1943 tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl); in tc35815_set_multicast_list()
1945 tc_writel(CAM_Ena_Bit(CAM_ENTRY_SOURCE), &tr->CAM_Ena); in tc35815_set_multicast_list()
1946 tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl); in tc35815_set_multicast_list()
1954 strscpy(info->driver, MODNAME, sizeof(info->driver)); in tc35815_get_drvinfo()
1955 strscpy(info->version, DRV_VERSION, sizeof(info->version)); in tc35815_get_drvinfo()
1956 strscpy(info->bus_info, pci_name(lp->pci_dev), sizeof(info->bus_info)); in tc35815_get_drvinfo()
1962 return lp->msg_enable; in tc35815_get_msglevel()
1968 lp->msg_enable = datum; in tc35815_set_msglevel()
1977 return sizeof(lp->lstats) / sizeof(int); in tc35815_get_sset_count()
1979 return -EOPNOTSUPP; in tc35815_get_sset_count()
1986 data[0] = lp->lstats.max_tx_qlen; in tc35815_get_ethtool_stats()
1987 data[1] = lp->lstats.tx_ints; in tc35815_get_ethtool_stats()
1988 data[2] = lp->lstats.rx_ints; in tc35815_get_ethtool_stats()
1989 data[3] = lp->lstats.tx_underrun; in tc35815_get_ethtool_stats()
2021 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_chip_reset()
2024 tc_writel(MAC_Reset, &tr->MAC_Ctl); in tc35815_chip_reset()
2027 while (tc_readl(&tr->MAC_Ctl) & MAC_Reset) { in tc35815_chip_reset()
2029 printk(KERN_ERR "%s: MAC reset failed.\n", dev->name); in tc35815_chip_reset()
2034 tc_writel(0, &tr->MAC_Ctl); in tc35815_chip_reset()
2037 tc_writel(0, &tr->DMA_Ctl); in tc35815_chip_reset()
2038 tc_writel(0, &tr->TxThrsh); in tc35815_chip_reset()
2039 tc_writel(0, &tr->TxPollCtr); in tc35815_chip_reset()
2040 tc_writel(0, &tr->RxFragSize); in tc35815_chip_reset()
2041 tc_writel(0, &tr->Int_En); in tc35815_chip_reset()
2042 tc_writel(0, &tr->FDA_Bas); in tc35815_chip_reset()
2043 tc_writel(0, &tr->FDA_Lim); in tc35815_chip_reset()
2044 tc_writel(0xffffffff, &tr->Int_Src); /* Write 1 to clear */ in tc35815_chip_reset()
2045 tc_writel(0, &tr->CAM_Ctl); in tc35815_chip_reset()
2046 tc_writel(0, &tr->Tx_Ctl); in tc35815_chip_reset()
2047 tc_writel(0, &tr->Rx_Ctl); in tc35815_chip_reset()
2048 tc_writel(0, &tr->CAM_Ena); in tc35815_chip_reset()
2049 (void)tc_readl(&tr->Miss_Cnt); /* Read to clear */ in tc35815_chip_reset()
2052 tc_writel(DMA_TestMode, &tr->DMA_Ctl); in tc35815_chip_reset()
2054 tc_writel(i, &tr->CAM_Adr); in tc35815_chip_reset()
2055 tc_writel(0, &tr->CAM_Data); in tc35815_chip_reset()
2057 tc_writel(0, &tr->DMA_Ctl); in tc35815_chip_reset()
2064 (struct tc35815_regs __iomem *)dev->base_addr; in tc35815_chip_init()
2068 tc35815_set_cam_entry(dev, CAM_ENTRY_SOURCE, dev->dev_addr); in tc35815_chip_init()
2071 tc_writel(CAM_Ena_Bit(CAM_ENTRY_SOURCE), &tr->CAM_Ena); in tc35815_chip_init()
2072 tc_writel(CAM_CompEn | CAM_BroadAcc, &tr->CAM_Ctl); in tc35815_chip_init()
2074 /* Use DMA_RxAlign_2 to make IP header 4-byte aligned. */ in tc35815_chip_init()
2076 tc_writel(DMA_BURST_SIZE | DMA_RxAlign_2, &tr->DMA_Ctl); in tc35815_chip_init()
2078 tc_writel(DMA_BURST_SIZE, &tr->DMA_Ctl); in tc35815_chip_init()
2079 tc_writel(0, &tr->TxPollCtr); /* Batch mode */ in tc35815_chip_init()
2080 tc_writel(TX_THRESHOLD, &tr->TxThrsh); in tc35815_chip_init()
2081 tc_writel(INT_EN_CMD, &tr->Int_En); in tc35815_chip_init()
2084 tc_writel(fd_virt_to_bus(lp, lp->rfd_base), &tr->FDA_Bas); in tc35815_chip_init()
2085 tc_writel((unsigned long)lp->rfd_limit - (unsigned long)lp->rfd_base, in tc35815_chip_init()
2086 &tr->FDA_Lim); in tc35815_chip_init()
2092 tc_writel(fd_virt_to_bus(lp, lp->fbl_ptr), &tr->BLFrmPtr); /* start DMA receiver */ in tc35815_chip_init()
2093 tc_writel(RX_CTL_CMD, &tr->Rx_Ctl); /* start MAC receiver */ in tc35815_chip_init()
2097 if (lp->chiptype == TC35815_TX4939) in tc35815_chip_init()
2100 if (!dev->phydev || !lp->link || lp->duplex == DUPLEX_FULL) in tc35815_chip_init()
2102 tc_writel(txctl, &tr->Tx_Ctl); in tc35815_chip_init()
2116 if (dev->phydev) in tc35815_suspend()
2117 phy_stop(dev->phydev); in tc35815_suspend()
2118 spin_lock_irqsave(&lp->lock, flags); in tc35815_suspend()
2120 spin_unlock_irqrestore(&lp->lock, flags); in tc35815_suspend()
2135 if (dev->phydev) in tc35815_resume()
2136 phy_start(dev->phydev); in tc35815_resume()