Lines Matching refs:ip
109 static inline void ioc3_stop(struct ioc3_private *ip);
401 static void ioc3_get_eaddr_nic(struct ioc3_private *ip) in ioc3_get_eaddr_nic() argument
403 struct ioc3 *ioc3 = ip->regs; in ioc3_get_eaddr_nic()
430 priv_netdev(ip)->dev_addr[i - 2] = nic[i]; in ioc3_get_eaddr_nic()
438 static void ioc3_get_eaddr(struct ioc3_private *ip) in ioc3_get_eaddr() argument
440 ioc3_get_eaddr_nic(ip); in ioc3_get_eaddr()
442 printk("Ethernet address is %pM.\n", priv_netdev(ip)->dev_addr); in ioc3_get_eaddr()
447 struct ioc3_private *ip = netdev_priv(dev); in __ioc3_set_mac_address() local
448 struct ioc3 *ioc3 = ip->regs; in __ioc3_set_mac_address()
457 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_mac_address() local
462 spin_lock_irq(&ip->ioc3_lock); in ioc3_set_mac_address()
464 spin_unlock_irq(&ip->ioc3_lock); in ioc3_set_mac_address()
475 struct ioc3_private *ip = netdev_priv(dev); in ioc3_mdio_read() local
476 struct ioc3 *ioc3 = ip->regs; in ioc3_mdio_read()
487 struct ioc3_private *ip = netdev_priv(dev); in ioc3_mdio_write() local
488 struct ioc3 *ioc3 = ip->regs; in ioc3_mdio_write()
496 static int ioc3_mii_init(struct ioc3_private *ip);
500 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_stats() local
501 struct ioc3 *ioc3 = ip->regs; in ioc3_get_stats()
577 struct ioc3_private *ip = netdev_priv(dev); in ioc3_rx() local
579 struct ioc3 *ioc3 = ip->regs; in ioc3_rx()
585 rxr = ip->rxr; /* Ring base */ in ioc3_rx()
586 rx_entry = ip->rx_ci; /* RX consume index */ in ioc3_rx()
587 n_entry = ip->rx_pi; in ioc3_rx()
589 skb = ip->rx_skbs[rx_entry]; in ioc3_rx()
615 ip->rx_skbs[rx_entry] = NULL; /* Poison */ in ioc3_rx()
636 ip->rx_skbs[n_entry] = new_skb; in ioc3_rx()
643 skb = ip->rx_skbs[rx_entry]; in ioc3_rx()
648 ip->rx_pi = n_entry; in ioc3_rx()
649 ip->rx_ci = rx_entry; in ioc3_rx()
654 struct ioc3_private *ip = netdev_priv(dev); in ioc3_tx() local
656 struct ioc3 *ioc3 = ip->regs; in ioc3_tx()
661 spin_lock(&ip->ioc3_lock); in ioc3_tx()
665 o_entry = ip->tx_ci; in ioc3_tx()
671 skb = ip->tx_skbs[o_entry]; in ioc3_tx()
674 ip->tx_skbs[o_entry] = NULL; in ioc3_tx()
684 ip->txqlen -= packets; in ioc3_tx()
686 if (ip->txqlen < 128) in ioc3_tx()
689 ip->tx_ci = o_entry; in ioc3_tx()
690 spin_unlock(&ip->ioc3_lock); in ioc3_tx()
702 struct ioc3_private *ip = netdev_priv(dev); in ioc3_error() local
705 spin_lock(&ip->ioc3_lock); in ioc3_error()
720 ioc3_stop(ip); in ioc3_error()
722 ioc3_mii_init(ip); in ioc3_error()
726 spin_unlock(&ip->ioc3_lock); in ioc3_error()
734 struct ioc3_private *ip = netdev_priv(dev); in ioc3_interrupt() local
735 struct ioc3 *ioc3 = ip->regs; in ioc3_interrupt()
757 static inline void ioc3_setup_duplex(struct ioc3_private *ip) in ioc3_setup_duplex() argument
759 struct ioc3 *ioc3 = ip->regs; in ioc3_setup_duplex()
761 if (ip->mii.full_duplex) { in ioc3_setup_duplex()
763 ip->emcr |= EMCR_DUPLEX; in ioc3_setup_duplex()
766 ip->emcr &= ~EMCR_DUPLEX; in ioc3_setup_duplex()
768 ioc3_w_emcr(ip->emcr); in ioc3_setup_duplex()
773 struct ioc3_private *ip = (struct ioc3_private *) data; in ioc3_timer() local
776 mii_check_media(&ip->mii, 1, 0); in ioc3_timer()
777 ioc3_setup_duplex(ip); in ioc3_timer()
779 ip->ioc3_timer.expires = jiffies + ((12 * HZ)/10); /* 1.2s */ in ioc3_timer()
780 add_timer(&ip->ioc3_timer); in ioc3_timer()
791 static int ioc3_mii_init(struct ioc3_private *ip) in ioc3_mii_init() argument
793 struct net_device *dev = priv_netdev(ip); in ioc3_mii_init()
811 ip->mii.phy_id = -1; in ioc3_mii_init()
817 ip->mii.phy_id = i; in ioc3_mii_init()
823 static void ioc3_mii_start(struct ioc3_private *ip) in ioc3_mii_start() argument
825 ip->ioc3_timer.expires = jiffies + (12 * HZ)/10; /* 1.2 sec. */ in ioc3_mii_start()
826 ip->ioc3_timer.data = (unsigned long) ip; in ioc3_mii_start()
827 ip->ioc3_timer.function = ioc3_timer; in ioc3_mii_start()
828 add_timer(&ip->ioc3_timer); in ioc3_mii_start()
831 static inline void ioc3_clean_rx_ring(struct ioc3_private *ip) in ioc3_clean_rx_ring() argument
836 for (i = ip->rx_ci; i & 15; i++) { in ioc3_clean_rx_ring()
837 ip->rx_skbs[ip->rx_pi] = ip->rx_skbs[ip->rx_ci]; in ioc3_clean_rx_ring()
838 ip->rxr[ip->rx_pi++] = ip->rxr[ip->rx_ci++]; in ioc3_clean_rx_ring()
840 ip->rx_pi &= 511; in ioc3_clean_rx_ring()
841 ip->rx_ci &= 511; in ioc3_clean_rx_ring()
843 for (i = ip->rx_ci; i != ip->rx_pi; i = (i+1) & 511) { in ioc3_clean_rx_ring()
845 skb = ip->rx_skbs[i]; in ioc3_clean_rx_ring()
851 static inline void ioc3_clean_tx_ring(struct ioc3_private *ip) in ioc3_clean_tx_ring() argument
857 skb = ip->tx_skbs[i]; in ioc3_clean_tx_ring()
859 ip->tx_skbs[i] = NULL; in ioc3_clean_tx_ring()
862 ip->txr[i].cmd = 0; in ioc3_clean_tx_ring()
864 ip->tx_pi = 0; in ioc3_clean_tx_ring()
865 ip->tx_ci = 0; in ioc3_clean_tx_ring()
868 static void ioc3_free_rings(struct ioc3_private *ip) in ioc3_free_rings() argument
873 if (ip->txr) { in ioc3_free_rings()
874 ioc3_clean_tx_ring(ip); in ioc3_free_rings()
875 free_pages((unsigned long)ip->txr, 2); in ioc3_free_rings()
876 ip->txr = NULL; in ioc3_free_rings()
879 if (ip->rxr) { in ioc3_free_rings()
880 n_entry = ip->rx_ci; in ioc3_free_rings()
881 rx_entry = ip->rx_pi; in ioc3_free_rings()
884 skb = ip->rx_skbs[n_entry]; in ioc3_free_rings()
890 free_page((unsigned long)ip->rxr); in ioc3_free_rings()
891 ip->rxr = NULL; in ioc3_free_rings()
897 struct ioc3_private *ip = netdev_priv(dev); in ioc3_alloc_rings() local
902 if (ip->rxr == NULL) { in ioc3_alloc_rings()
904 ip->rxr = (unsigned long *) get_zeroed_page(GFP_ATOMIC); in ioc3_alloc_rings()
905 rxr = ip->rxr; in ioc3_alloc_rings()
921 ip->rx_skbs[i] = skb; in ioc3_alloc_rings()
929 ip->rx_ci = 0; in ioc3_alloc_rings()
930 ip->rx_pi = RX_BUFFS; in ioc3_alloc_rings()
933 if (ip->txr == NULL) { in ioc3_alloc_rings()
935 ip->txr = (struct ioc3_etxd *)__get_free_pages(GFP_KERNEL, 2); in ioc3_alloc_rings()
936 if (!ip->txr) in ioc3_alloc_rings()
938 ip->tx_pi = 0; in ioc3_alloc_rings()
939 ip->tx_ci = 0; in ioc3_alloc_rings()
945 struct ioc3_private *ip = netdev_priv(dev); in ioc3_init_rings() local
946 struct ioc3 *ioc3 = ip->regs; in ioc3_init_rings()
949 ioc3_free_rings(ip); in ioc3_init_rings()
952 ioc3_clean_rx_ring(ip); in ioc3_init_rings()
953 ioc3_clean_tx_ring(ip); in ioc3_init_rings()
956 ring = ioc3_map(ip->rxr, 0); in ioc3_init_rings()
959 ioc3_w_ercir(ip->rx_ci << 3); in ioc3_init_rings()
960 ioc3_w_erpir((ip->rx_pi << 3) | ERPIR_ARM); in ioc3_init_rings()
962 ring = ioc3_map(ip->txr, 0); in ioc3_init_rings()
964 ip->txqlen = 0; /* nothing queued */ in ioc3_init_rings()
969 ioc3_w_etpir(ip->tx_pi << 7); in ioc3_init_rings()
970 ioc3_w_etcir(ip->tx_ci << 7); in ioc3_init_rings()
974 static inline void ioc3_ssram_disc(struct ioc3_private *ip) in ioc3_ssram_disc() argument
976 struct ioc3 *ioc3 = ip->regs; in ioc3_ssram_disc()
990 ip->emcr = EMCR_RAMPAR; in ioc3_ssram_disc()
993 ip->emcr = EMCR_BUFSIZ | EMCR_RAMPAR; in ioc3_ssram_disc()
998 struct ioc3_private *ip = netdev_priv(dev); in ioc3_init() local
999 struct ioc3 *ioc3 = ip->regs; in ioc3_init()
1001 del_timer_sync(&ip->ioc3_timer); /* Kill if running */ in ioc3_init()
1019 ioc3_w_ehar_h(ip->ehar_h); in ioc3_init()
1020 ioc3_w_ehar_l(ip->ehar_l); in ioc3_init()
1025 ip->emcr |= ((RX_OFFSET / 2) << EMCR_RXOFF_SHIFT) | EMCR_TXDMAEN | in ioc3_init()
1027 ioc3_w_emcr(ip->emcr); in ioc3_init()
1034 static inline void ioc3_stop(struct ioc3_private *ip) in ioc3_stop() argument
1036 struct ioc3 *ioc3 = ip->regs; in ioc3_stop()
1045 struct ioc3_private *ip = netdev_priv(dev); in ioc3_open() local
1053 ip->ehar_h = 0; in ioc3_open()
1054 ip->ehar_l = 0; in ioc3_open()
1056 ioc3_mii_start(ip); in ioc3_open()
1064 struct ioc3_private *ip = netdev_priv(dev); in ioc3_close() local
1066 del_timer_sync(&ip->ioc3_timer); in ioc3_close()
1070 ioc3_stop(ip); in ioc3_close()
1073 ioc3_free_rings(ip); in ioc3_close()
1235 struct ioc3_private *ip; in ioc3_probe() local
1279 ip = netdev_priv(dev); in ioc3_probe()
1292 ip->regs = ioc3; in ioc3_probe()
1298 spin_lock_init(&ip->ioc3_lock); in ioc3_probe()
1299 init_timer(&ip->ioc3_timer); in ioc3_probe()
1301 ioc3_stop(ip); in ioc3_probe()
1304 ip->pdev = pdev; in ioc3_probe()
1306 ip->mii.phy_id_mask = 0x1f; in ioc3_probe()
1307 ip->mii.reg_num_mask = 0x1f; in ioc3_probe()
1308 ip->mii.dev = dev; in ioc3_probe()
1309 ip->mii.mdio_read = ioc3_mdio_read; in ioc3_probe()
1310 ip->mii.mdio_write = ioc3_mdio_write; in ioc3_probe()
1312 ioc3_mii_init(ip); in ioc3_probe()
1314 if (ip->mii.phy_id == -1) { in ioc3_probe()
1321 ioc3_mii_start(ip); in ioc3_probe()
1322 ioc3_ssram_disc(ip); in ioc3_probe()
1323 ioc3_get_eaddr(ip); in ioc3_probe()
1332 sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1); in ioc3_probe()
1333 sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2); in ioc3_probe()
1339 mii_check_media(&ip->mii, 1, 1); in ioc3_probe()
1340 ioc3_setup_duplex(ip); in ioc3_probe()
1346 "rev %d.\n", dev->name, ip->mii.phy_id, vendor, model, rev); in ioc3_probe()
1348 ip->emcr & EMCR_BUFSIZ ? 128 : 64); in ioc3_probe()
1353 ioc3_stop(ip); in ioc3_probe()
1354 del_timer_sync(&ip->ioc3_timer); in ioc3_probe()
1355 ioc3_free_rings(ip); in ioc3_probe()
1372 struct ioc3_private *ip = netdev_priv(dev); in ioc3_remove_one() local
1373 struct ioc3 *ioc3 = ip->regs; in ioc3_remove_one()
1376 del_timer_sync(&ip->ioc3_timer); in ioc3_remove_one()
1403 struct ioc3_private *ip = netdev_priv(dev); in ioc3_start_xmit() local
1404 struct ioc3 *ioc3 = ip->regs; in ioc3_start_xmit()
1458 spin_lock_irq(&ip->ioc3_lock); in ioc3_start_xmit()
1463 produce = ip->tx_pi; in ioc3_start_xmit()
1464 desc = &ip->txr[produce]; in ioc3_start_xmit()
1496 ip->tx_skbs[produce] = skb; /* Remember skb */ in ioc3_start_xmit()
1498 ip->tx_pi = produce; in ioc3_start_xmit()
1501 ip->txqlen++; in ioc3_start_xmit()
1503 if (ip->txqlen >= 127) in ioc3_start_xmit()
1506 spin_unlock_irq(&ip->ioc3_lock); in ioc3_start_xmit()
1513 struct ioc3_private *ip = netdev_priv(dev); in ioc3_timeout() local
1517 spin_lock_irq(&ip->ioc3_lock); in ioc3_timeout()
1519 ioc3_stop(ip); in ioc3_timeout()
1521 ioc3_mii_init(ip); in ioc3_timeout()
1522 ioc3_mii_start(ip); in ioc3_timeout()
1524 spin_unlock_irq(&ip->ioc3_lock); in ioc3_timeout()
1555 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_drvinfo() local
1559 strlcpy(info->bus_info, pci_name(ip->pdev), sizeof(info->bus_info)); in ioc3_get_drvinfo()
1564 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_settings() local
1567 spin_lock_irq(&ip->ioc3_lock); in ioc3_get_settings()
1568 rc = mii_ethtool_gset(&ip->mii, cmd); in ioc3_get_settings()
1569 spin_unlock_irq(&ip->ioc3_lock); in ioc3_get_settings()
1576 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_settings() local
1579 spin_lock_irq(&ip->ioc3_lock); in ioc3_set_settings()
1580 rc = mii_ethtool_sset(&ip->mii, cmd); in ioc3_set_settings()
1581 spin_unlock_irq(&ip->ioc3_lock); in ioc3_set_settings()
1588 struct ioc3_private *ip = netdev_priv(dev); in ioc3_nway_reset() local
1591 spin_lock_irq(&ip->ioc3_lock); in ioc3_nway_reset()
1592 rc = mii_nway_restart(&ip->mii); in ioc3_nway_reset()
1593 spin_unlock_irq(&ip->ioc3_lock); in ioc3_nway_reset()
1600 struct ioc3_private *ip = netdev_priv(dev); in ioc3_get_link() local
1603 spin_lock_irq(&ip->ioc3_lock); in ioc3_get_link()
1604 rc = mii_link_ok(&ip->mii); in ioc3_get_link()
1605 spin_unlock_irq(&ip->ioc3_lock); in ioc3_get_link()
1620 struct ioc3_private *ip = netdev_priv(dev); in ioc3_ioctl() local
1623 spin_lock_irq(&ip->ioc3_lock); in ioc3_ioctl()
1624 rc = generic_mii_ioctl(&ip->mii, if_mii(rq), cmd, NULL); in ioc3_ioctl()
1625 spin_unlock_irq(&ip->ioc3_lock); in ioc3_ioctl()
1633 struct ioc3_private *ip = netdev_priv(dev); in ioc3_set_multicast_list() local
1634 struct ioc3 *ioc3 = ip->regs; in ioc3_set_multicast_list()
1640 ip->emcr |= EMCR_PROMISC; in ioc3_set_multicast_list()
1641 ioc3_w_emcr(ip->emcr); in ioc3_set_multicast_list()
1644 ip->emcr &= ~EMCR_PROMISC; in ioc3_set_multicast_list()
1645 ioc3_w_emcr(ip->emcr); /* Clear promiscuous. */ in ioc3_set_multicast_list()
1653 ip->ehar_h = 0xffffffff; in ioc3_set_multicast_list()
1654 ip->ehar_l = 0xffffffff; in ioc3_set_multicast_list()
1659 ip->ehar_h = ehar >> 32; in ioc3_set_multicast_list()
1660 ip->ehar_l = ehar & 0xffffffff; in ioc3_set_multicast_list()
1662 ioc3_w_ehar_h(ip->ehar_h); in ioc3_set_multicast_list()
1663 ioc3_w_ehar_l(ip->ehar_l); in ioc3_set_multicast_list()