Lines Matching refs:ip

109 static void ioc3_start(struct ioc3_private *ip);
110 static inline void ioc3_stop(struct ioc3_private *ip);
113 static void ioc3_free_rx_bufs(struct ioc3_private *ip);
114 static inline void ioc3_clean_tx_ring(struct ioc3_private *ip);
123 static inline int ioc3_alloc_skb(struct ioc3_private *ip, struct sk_buff **skb, in ioc3_alloc_skb() argument
139 d = dma_map_single(ip->dma_dev, new_skb->data, in ioc3_alloc_skb()
142 if (dma_mapping_error(ip->dma_dev, d)) { in ioc3_alloc_skb()
229 struct ioc3_private *ip = netdev_priv(dev); in __ioc3_set_mac_address() local
233 &ip->regs->emar_h); in __ioc3_set_mac_address()
238 &ip->regs->emar_l); in __ioc3_set_mac_address()
243 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_mac_address() local
248 spin_lock_irq(&ip->ioc3_lock); in ioc3_set_mac_address()
250 spin_unlock_irq(&ip->ioc3_lock); in ioc3_set_mac_address()
260 struct ioc3_private *ip = netdev_priv(dev); in ioc3_mdio_read() local
261 struct ioc3_ethregs *regs = ip->regs; in ioc3_mdio_read()
275 struct ioc3_private *ip = netdev_priv(dev); in ioc3_mdio_write() local
276 struct ioc3_ethregs *regs = ip->regs; in ioc3_mdio_write()
286 static int ioc3_mii_init(struct ioc3_private *ip);
290 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_stats() local
291 struct ioc3_ethregs *regs = ip->regs; in ioc3_get_stats()
367 struct ioc3_private *ip = netdev_priv(dev); in ioc3_rx() local
375 rxr = ip->rxr; /* Ring base */ in ioc3_rx()
376 rx_entry = ip->rx_ci; /* RX consume index */ in ioc3_rx()
377 n_entry = ip->rx_pi; in ioc3_rx()
379 skb = ip->rx_skbs[rx_entry]; in ioc3_rx()
390 if (ioc3_alloc_skb(ip, &new_skb, &rxb, &d)) { in ioc3_rx()
405 dma_unmap_single(ip->dma_dev, rxr[rx_entry], in ioc3_rx()
410 ip->rx_skbs[rx_entry] = NULL; /* Poison */ in ioc3_rx()
429 ip->rx_skbs[n_entry] = new_skb; in ioc3_rx()
436 skb = ip->rx_skbs[rx_entry]; in ioc3_rx()
440 writel((n_entry << 3) | ERPIR_ARM, &ip->regs->erpir); in ioc3_rx()
441 ip->rx_pi = n_entry; in ioc3_rx()
442 ip->rx_ci = rx_entry; in ioc3_rx()
447 struct ioc3_private *ip = netdev_priv(dev); in ioc3_tx() local
448 struct ioc3_ethregs *regs = ip->regs; in ioc3_tx()
454 spin_lock(&ip->ioc3_lock); in ioc3_tx()
458 o_entry = ip->tx_ci; in ioc3_tx()
464 skb = ip->tx_skbs[o_entry]; in ioc3_tx()
467 ip->tx_skbs[o_entry] = NULL; in ioc3_tx()
477 ip->txqlen -= packets; in ioc3_tx()
479 if (netif_queue_stopped(dev) && ip->txqlen < TX_RING_ENTRIES) in ioc3_tx()
482 ip->tx_ci = o_entry; in ioc3_tx()
483 spin_unlock(&ip->ioc3_lock); in ioc3_tx()
494 struct ioc3_private *ip = netdev_priv(dev); in ioc3_error() local
496 spin_lock(&ip->ioc3_lock); in ioc3_error()
511 ioc3_stop(ip); in ioc3_error()
512 ioc3_free_rx_bufs(ip); in ioc3_error()
513 ioc3_clean_tx_ring(ip); in ioc3_error()
518 spin_unlock(&ip->ioc3_lock); in ioc3_error()
521 ioc3_start(ip); in ioc3_error()
522 ioc3_mii_init(ip); in ioc3_error()
526 spin_unlock(&ip->ioc3_lock); in ioc3_error()
534 struct ioc3_private *ip = netdev_priv(dev_id); in ioc3_interrupt() local
535 struct ioc3_ethregs *regs = ip->regs; in ioc3_interrupt()
553 static inline void ioc3_setup_duplex(struct ioc3_private *ip) in ioc3_setup_duplex() argument
555 struct ioc3_ethregs *regs = ip->regs; in ioc3_setup_duplex()
557 spin_lock_irq(&ip->ioc3_lock); in ioc3_setup_duplex()
559 if (ip->mii.full_duplex) { in ioc3_setup_duplex()
561 ip->emcr |= EMCR_DUPLEX; in ioc3_setup_duplex()
564 ip->emcr &= ~EMCR_DUPLEX; in ioc3_setup_duplex()
566 writel(ip->emcr, &regs->emcr); in ioc3_setup_duplex()
568 spin_unlock_irq(&ip->ioc3_lock); in ioc3_setup_duplex()
573 struct ioc3_private *ip = from_timer(ip, t, ioc3_timer); in ioc3_timer() local
576 mii_check_media(&ip->mii, 1, 0); in ioc3_timer()
577 ioc3_setup_duplex(ip); in ioc3_timer()
579 ip->ioc3_timer.expires = jiffies + ((12 * HZ) / 10); /* 1.2s */ in ioc3_timer()
580 add_timer(&ip->ioc3_timer); in ioc3_timer()
587 static int ioc3_mii_init(struct ioc3_private *ip) in ioc3_mii_init() argument
593 word = ioc3_mdio_read(ip->mii.dev, i, MII_PHYSID1); in ioc3_mii_init()
596 ip->mii.phy_id = i; in ioc3_mii_init()
600 ip->mii.phy_id = -1; in ioc3_mii_init()
604 static void ioc3_mii_start(struct ioc3_private *ip) in ioc3_mii_start() argument
606 ip->ioc3_timer.expires = jiffies + (12 * HZ) / 10; /* 1.2 sec. */ in ioc3_mii_start()
607 add_timer(&ip->ioc3_timer); in ioc3_mii_start()
610 static inline void ioc3_tx_unmap(struct ioc3_private *ip, int entry) in ioc3_tx_unmap() argument
615 desc = &ip->txr[entry]; in ioc3_tx_unmap()
620 dma_unmap_single(ip->dma_dev, be64_to_cpu(desc->p1), in ioc3_tx_unmap()
625 dma_unmap_single(ip->dma_dev, be64_to_cpu(desc->p2), in ioc3_tx_unmap()
630 static inline void ioc3_clean_tx_ring(struct ioc3_private *ip) in ioc3_clean_tx_ring() argument
636 skb = ip->tx_skbs[i]; in ioc3_clean_tx_ring()
638 ioc3_tx_unmap(ip, i); in ioc3_clean_tx_ring()
639 ip->tx_skbs[i] = NULL; in ioc3_clean_tx_ring()
642 ip->txr[i].cmd = 0; in ioc3_clean_tx_ring()
644 ip->tx_pi = 0; in ioc3_clean_tx_ring()
645 ip->tx_ci = 0; in ioc3_clean_tx_ring()
648 static void ioc3_free_rx_bufs(struct ioc3_private *ip) in ioc3_free_rx_bufs() argument
653 n_entry = ip->rx_ci; in ioc3_free_rx_bufs()
654 rx_entry = ip->rx_pi; in ioc3_free_rx_bufs()
657 skb = ip->rx_skbs[n_entry]; in ioc3_free_rx_bufs()
659 dma_unmap_single(ip->dma_dev, in ioc3_free_rx_bufs()
660 be64_to_cpu(ip->rxr[n_entry]), in ioc3_free_rx_bufs()
670 struct ioc3_private *ip = netdev_priv(dev); in ioc3_alloc_rx_bufs() local
680 if (ioc3_alloc_skb(ip, &ip->rx_skbs[i], &rxb, &d)) in ioc3_alloc_rx_bufs()
684 ip->rxr[i] = cpu_to_be64(ioc3_map(d, PCI64_ATTR_BAR)); in ioc3_alloc_rx_bufs()
686 ip->rx_ci = 0; in ioc3_alloc_rx_bufs()
687 ip->rx_pi = RX_BUFFS; in ioc3_alloc_rx_bufs()
692 static inline void ioc3_ssram_disc(struct ioc3_private *ip) in ioc3_ssram_disc() argument
694 struct ioc3_ethregs *regs = ip->regs; in ioc3_ssram_disc()
695 u32 *ssram0 = &ip->ssram[0x0000]; in ioc3_ssram_disc()
696 u32 *ssram1 = &ip->ssram[0x4000]; in ioc3_ssram_disc()
709 ip->emcr |= EMCR_RAMPAR; in ioc3_ssram_disc()
712 ip->emcr |= EMCR_BUFSIZ | EMCR_RAMPAR; in ioc3_ssram_disc()
718 struct ioc3_private *ip = netdev_priv(dev); in ioc3_init() local
719 struct ioc3_ethregs *regs = ip->regs; in ioc3_init()
721 del_timer_sync(&ip->ioc3_timer); /* Kill if running */ in ioc3_init()
735 writel(ip->ehar_h, &regs->ehar_h); in ioc3_init()
736 writel(ip->ehar_l, &regs->ehar_l); in ioc3_init()
740 static void ioc3_start(struct ioc3_private *ip) in ioc3_start() argument
742 struct ioc3_ethregs *regs = ip->regs; in ioc3_start()
746 ring = ioc3_map(ip->rxr_dma, PCI64_ATTR_PREC); in ioc3_start()
749 writel(ip->rx_ci << 3, &regs->ercir); in ioc3_start()
750 writel((ip->rx_pi << 3) | ERPIR_ARM, &regs->erpir); in ioc3_start()
752 ring = ioc3_map(ip->txr_dma, PCI64_ATTR_PREC); in ioc3_start()
754 ip->txqlen = 0; /* nothing queued */ in ioc3_start()
759 writel(ip->tx_pi << 7, &regs->etpir); in ioc3_start()
760 writel(ip->tx_ci << 7, &regs->etcir); in ioc3_start()
763 ip->emcr |= ((RX_OFFSET / 2) << EMCR_RXOFF_SHIFT) | EMCR_TXDMAEN | in ioc3_start()
765 writel(ip->emcr, &regs->emcr); in ioc3_start()
772 static inline void ioc3_stop(struct ioc3_private *ip) in ioc3_stop() argument
774 struct ioc3_ethregs *regs = ip->regs; in ioc3_stop()
783 struct ioc3_private *ip = netdev_priv(dev); in ioc3_open() local
785 ip->ehar_h = 0; in ioc3_open()
786 ip->ehar_l = 0; in ioc3_open()
793 ioc3_start(ip); in ioc3_open()
794 ioc3_mii_start(ip); in ioc3_open()
802 struct ioc3_private *ip = netdev_priv(dev); in ioc3_close() local
804 del_timer_sync(&ip->ioc3_timer); in ioc3_close()
808 ioc3_stop(ip); in ioc3_close()
810 ioc3_free_rx_bufs(ip); in ioc3_close()
811 ioc3_clean_tx_ring(ip); in ioc3_close()
831 struct ioc3_private *ip; in ioc3eth_probe() local
852 ip = netdev_priv(dev); in ioc3eth_probe()
853 ip->dma_dev = pdev->dev.parent; in ioc3eth_probe()
854 ip->regs = devm_platform_ioremap_resource(pdev, 0); in ioc3eth_probe()
855 if (IS_ERR(ip->regs)) { in ioc3eth_probe()
856 err = PTR_ERR(ip->regs); in ioc3eth_probe()
860 ip->ssram = devm_platform_ioremap_resource(pdev, 1); in ioc3eth_probe()
861 if (IS_ERR(ip->ssram)) { in ioc3eth_probe()
862 err = PTR_ERR(ip->ssram); in ioc3eth_probe()
879 spin_lock_init(&ip->ioc3_lock); in ioc3eth_probe()
880 timer_setup(&ip->ioc3_timer, ioc3_timer, 0); in ioc3eth_probe()
882 ioc3_stop(ip); in ioc3eth_probe()
885 ip->rxr = dma_alloc_coherent(ip->dma_dev, RX_RING_SIZE, &ip->rxr_dma, in ioc3eth_probe()
887 if (!ip->rxr) { in ioc3eth_probe()
894 ip->tx_ring = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE + SZ_16K - 1, in ioc3eth_probe()
895 &ip->txr_dma, GFP_KERNEL); in ioc3eth_probe()
896 if (!ip->tx_ring) { in ioc3eth_probe()
902 ip->txr = PTR_ALIGN(ip->tx_ring, SZ_16K); in ioc3eth_probe()
903 ip->txr_dma = ALIGN(ip->txr_dma, SZ_16K); in ioc3eth_probe()
907 ip->mii.phy_id_mask = 0x1f; in ioc3eth_probe()
908 ip->mii.reg_num_mask = 0x1f; in ioc3eth_probe()
909 ip->mii.dev = dev; in ioc3eth_probe()
910 ip->mii.mdio_read = ioc3_mdio_read; in ioc3eth_probe()
911 ip->mii.mdio_write = ioc3_mdio_write; in ioc3eth_probe()
913 ioc3_mii_init(ip); in ioc3eth_probe()
915 if (ip->mii.phy_id == -1) { in ioc3eth_probe()
921 ioc3_mii_start(ip); in ioc3eth_probe()
922 ioc3_ssram_disc(ip); in ioc3eth_probe()
932 sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1); in ioc3eth_probe()
933 sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2); in ioc3eth_probe()
939 mii_check_media(&ip->mii, 1, 1); in ioc3eth_probe()
940 ioc3_setup_duplex(ip); in ioc3eth_probe()
946 ip->mii.phy_id, vendor, model, rev); in ioc3eth_probe()
948 ip->emcr & EMCR_BUFSIZ ? 128 : 64); in ioc3eth_probe()
953 del_timer_sync(&ip->ioc3_timer); in ioc3eth_probe()
954 if (ip->rxr) in ioc3eth_probe()
955 dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr, in ioc3eth_probe()
956 ip->rxr_dma); in ioc3eth_probe()
957 if (ip->tx_ring) in ioc3eth_probe()
958 dma_free_coherent(ip->dma_dev, TX_RING_SIZE + SZ_16K - 1, ip->tx_ring, in ioc3eth_probe()
959 ip->txr_dma); in ioc3eth_probe()
968 struct ioc3_private *ip = netdev_priv(dev); in ioc3eth_remove() local
970 dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr, ip->rxr_dma); in ioc3eth_remove()
971 dma_free_coherent(ip->dma_dev, TX_RING_SIZE + SZ_16K - 1, ip->tx_ring, ip->txr_dma); in ioc3eth_remove()
974 del_timer_sync(&ip->ioc3_timer); in ioc3eth_remove()
983 struct ioc3_private *ip = netdev_priv(dev); in ioc3_start_xmit() local
1035 spin_lock_irq(&ip->ioc3_lock); in ioc3_start_xmit()
1040 produce = ip->tx_pi; in ioc3_start_xmit()
1041 desc = &ip->txr[produce]; in ioc3_start_xmit()
1063 d1 = dma_map_single(ip->dma_dev, skb->data, s1, DMA_TO_DEVICE); in ioc3_start_xmit()
1064 if (dma_mapping_error(ip->dma_dev, d1)) in ioc3_start_xmit()
1066 d2 = dma_map_single(ip->dma_dev, (void *)b2, s1, DMA_TO_DEVICE); in ioc3_start_xmit()
1067 if (dma_mapping_error(ip->dma_dev, d2)) { in ioc3_start_xmit()
1068 dma_unmap_single(ip->dma_dev, d1, len, DMA_TO_DEVICE); in ioc3_start_xmit()
1079 d = dma_map_single(ip->dma_dev, skb->data, len, DMA_TO_DEVICE); in ioc3_start_xmit()
1080 if (dma_mapping_error(ip->dma_dev, d)) in ioc3_start_xmit()
1087 ip->tx_skbs[produce] = skb; /* Remember skb */ in ioc3_start_xmit()
1089 ip->tx_pi = produce; in ioc3_start_xmit()
1090 writel(produce << 7, &ip->regs->etpir); /* Fire ... */ in ioc3_start_xmit()
1092 ip->txqlen++; in ioc3_start_xmit()
1094 if (ip->txqlen >= (TX_RING_ENTRIES - 1)) in ioc3_start_xmit()
1097 spin_unlock_irq(&ip->ioc3_lock); in ioc3_start_xmit()
1105 spin_unlock_irq(&ip->ioc3_lock); in ioc3_start_xmit()
1112 struct ioc3_private *ip = netdev_priv(dev); in ioc3_timeout() local
1116 spin_lock_irq(&ip->ioc3_lock); in ioc3_timeout()
1118 ioc3_stop(ip); in ioc3_timeout()
1119 ioc3_free_rx_bufs(ip); in ioc3_timeout()
1120 ioc3_clean_tx_ring(ip); in ioc3_timeout()
1125 spin_unlock_irq(&ip->ioc3_lock); in ioc3_timeout()
1128 ioc3_start(ip); in ioc3_timeout()
1129 ioc3_mii_init(ip); in ioc3_timeout()
1130 ioc3_mii_start(ip); in ioc3_timeout()
1132 spin_unlock_irq(&ip->ioc3_lock); in ioc3_timeout()
1170 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_link_ksettings() local
1172 spin_lock_irq(&ip->ioc3_lock); in ioc3_get_link_ksettings()
1173 mii_ethtool_get_link_ksettings(&ip->mii, cmd); in ioc3_get_link_ksettings()
1174 spin_unlock_irq(&ip->ioc3_lock); in ioc3_get_link_ksettings()
1182 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_link_ksettings() local
1185 spin_lock_irq(&ip->ioc3_lock); in ioc3_set_link_ksettings()
1186 rc = mii_ethtool_set_link_ksettings(&ip->mii, cmd); in ioc3_set_link_ksettings()
1187 spin_unlock_irq(&ip->ioc3_lock); in ioc3_set_link_ksettings()
1194 struct ioc3_private *ip = netdev_priv(dev); in ioc3_nway_reset() local
1197 spin_lock_irq(&ip->ioc3_lock); in ioc3_nway_reset()
1198 rc = mii_nway_restart(&ip->mii); in ioc3_nway_reset()
1199 spin_unlock_irq(&ip->ioc3_lock); in ioc3_nway_reset()
1206 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_link() local
1209 spin_lock_irq(&ip->ioc3_lock); in ioc3_get_link()
1210 rc = mii_link_ok(&ip->mii); in ioc3_get_link()
1211 spin_unlock_irq(&ip->ioc3_lock); in ioc3_get_link()
1226 struct ioc3_private *ip = netdev_priv(dev); in ioc3_ioctl() local
1229 spin_lock_irq(&ip->ioc3_lock); in ioc3_ioctl()
1230 rc = generic_mii_ioctl(&ip->mii, if_mii(rq), cmd, NULL); in ioc3_ioctl()
1231 spin_unlock_irq(&ip->ioc3_lock); in ioc3_ioctl()
1238 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_multicast_list() local
1239 struct ioc3_ethregs *regs = ip->regs; in ioc3_set_multicast_list()
1243 spin_lock_irq(&ip->ioc3_lock); in ioc3_set_multicast_list()
1246 ip->emcr |= EMCR_PROMISC; in ioc3_set_multicast_list()
1247 writel(ip->emcr, &regs->emcr); in ioc3_set_multicast_list()
1250 ip->emcr &= ~EMCR_PROMISC; in ioc3_set_multicast_list()
1251 writel(ip->emcr, &regs->emcr); /* Clear promiscuous. */ in ioc3_set_multicast_list()
1260 ip->ehar_h = 0xffffffff; in ioc3_set_multicast_list()
1261 ip->ehar_l = 0xffffffff; in ioc3_set_multicast_list()
1266 ip->ehar_h = ehar >> 32; in ioc3_set_multicast_list()
1267 ip->ehar_l = ehar & 0xffffffff; in ioc3_set_multicast_list()
1269 writel(ip->ehar_h, &regs->ehar_h); in ioc3_set_multicast_list()
1270 writel(ip->ehar_l, &regs->ehar_l); in ioc3_set_multicast_list()
1273 spin_unlock_irq(&ip->ioc3_lock); in ioc3_set_multicast_list()