Lines Matching refs:sky2

338 	struct sky2_port *sky2 = netdev_priv(hw->dev[port]);  in sky2_phy_init()  local
341 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
383 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
428 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) { in sky2_phy_init()
430 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
432 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
434 if (sky2->advertising & ADVERTISED_100baseT_Full) in sky2_phy_init()
436 if (sky2->advertising & ADVERTISED_100baseT_Half) in sky2_phy_init()
438 if (sky2->advertising & ADVERTISED_10baseT_Full) in sky2_phy_init()
440 if (sky2->advertising & ADVERTISED_10baseT_Half) in sky2_phy_init()
444 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
446 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
459 switch (sky2->speed) { in sky2_phy_init()
470 if (sky2->duplex == DUPLEX_FULL) { in sky2_phy_init()
473 } else if (sky2->speed < SPEED_1000) in sky2_phy_init()
474 sky2->flow_mode = FC_NONE; in sky2_phy_init()
477 if (sky2->flags & SKY2_FLAG_AUTO_PAUSE) { in sky2_phy_init()
479 adv |= copper_fc_adv[sky2->flow_mode]; in sky2_phy_init()
481 adv |= fiber_fc_adv[sky2->flow_mode]; in sky2_phy_init()
484 reg |= gm_fc_disable[sky2->flow_mode]; in sky2_phy_init()
487 if (sky2->flow_mode & FC_RX) in sky2_phy_init()
628 if (!(sky2->flags & SKY2_FLAG_AUTO_SPEED) || in sky2_phy_init()
629 sky2->speed == SPEED_100) { in sky2_phy_init()
697 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_phy_init()
783 static void sky2_set_ipg(struct sky2_port *sky2) in sky2_set_ipg() argument
787 reg = gma_read16(sky2->hw, sky2->port, GM_SERIAL_MODE); in sky2_set_ipg()
789 if (sky2->speed > SPEED_100) in sky2_set_ipg()
793 gma_write16(sky2->hw, sky2->port, GM_SERIAL_MODE, reg); in sky2_set_ipg()
797 static void sky2_enable_rx_tx(struct sky2_port *sky2) in sky2_enable_rx_tx() argument
799 struct sky2_hw *hw = sky2->hw; in sky2_enable_rx_tx()
800 unsigned port = sky2->port; in sky2_enable_rx_tx()
809 static void sky2_phy_reinit(struct sky2_port *sky2) in sky2_phy_reinit() argument
811 spin_lock_bh(&sky2->phy_lock); in sky2_phy_reinit()
812 sky2_phy_init(sky2->hw, sky2->port); in sky2_phy_reinit()
813 sky2_enable_rx_tx(sky2); in sky2_phy_reinit()
814 spin_unlock_bh(&sky2->phy_lock); in sky2_phy_reinit()
818 static void sky2_wol_init(struct sky2_port *sky2) in sky2_wol_init() argument
820 struct sky2_hw *hw = sky2->hw; in sky2_wol_init()
821 unsigned port = sky2->port; in sky2_wol_init()
835 save_mode = sky2->flow_mode; in sky2_wol_init()
836 ctrl = sky2->advertising; in sky2_wol_init()
838 sky2->advertising &= ~(ADVERTISED_1000baseT_Half|ADVERTISED_1000baseT_Full); in sky2_wol_init()
839 sky2->flow_mode = FC_NONE; in sky2_wol_init()
841 spin_lock_bh(&sky2->phy_lock); in sky2_wol_init()
844 spin_unlock_bh(&sky2->phy_lock); in sky2_wol_init()
846 sky2->flow_mode = save_mode; in sky2_wol_init()
847 sky2->advertising = ctrl; in sky2_wol_init()
856 sky2->netdev->dev_addr, ETH_ALEN); in sky2_wol_init()
861 if (sky2->wol & WAKE_PHY) in sky2_wol_init()
866 if (sky2->wol & WAKE_MAGIC) in sky2_wol_init()
910 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); in sky2_mac_init() local
940 spin_lock_bh(&sky2->phy_lock); in sky2_mac_init()
943 spin_unlock_bh(&sky2->phy_lock); in sky2_mac_init()
1111 static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) in get_tx_le() argument
1113 struct sky2_tx_le *le = sky2->tx_le + *slot; in get_tx_le()
1115 *slot = RING_NEXT(*slot, sky2->tx_ring_size); in get_tx_le()
1120 static void tx_init(struct sky2_port *sky2) in tx_init() argument
1124 sky2->tx_prod = sky2->tx_cons = 0; in tx_init()
1125 sky2->tx_tcpsum = 0; in tx_init()
1126 sky2->tx_last_mss = 0; in tx_init()
1127 netdev_reset_queue(sky2->netdev); in tx_init()
1129 le = get_tx_le(sky2, &sky2->tx_prod); in tx_init()
1132 sky2->tx_last_upper = 0; in tx_init()
1147 static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2) in sky2_next_rx() argument
1149 struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; in sky2_next_rx()
1150 sky2->rx_put = RING_NEXT(sky2->rx_put, RX_LE_SIZE); in sky2_next_rx()
1155 static unsigned sky2_get_rx_threshold(struct sky2_port *sky2) in sky2_get_rx_threshold() argument
1160 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_threshold()
1166 static unsigned sky2_get_rx_data_size(struct sky2_port *sky2) in sky2_get_rx_data_size() argument
1172 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_data_size()
1174 sky2->rx_nfrags = size >> PAGE_SHIFT; in sky2_get_rx_data_size()
1175 BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr)); in sky2_get_rx_data_size()
1178 size -= sky2->rx_nfrags << PAGE_SHIFT; in sky2_get_rx_data_size()
1190 static void sky2_rx_add(struct sky2_port *sky2, u8 op, in sky2_rx_add() argument
1196 le = sky2_next_rx(sky2); in sky2_rx_add()
1201 le = sky2_next_rx(sky2); in sky2_rx_add()
1208 static void sky2_rx_submit(struct sky2_port *sky2, in sky2_rx_submit() argument
1213 sky2_rx_add(sky2, OP_PACKET, re->data_addr, sky2->rx_data_size); in sky2_rx_submit()
1216 sky2_rx_add(sky2, OP_BUFFER, re->frag_addr[i], PAGE_SIZE); in sky2_rx_submit()
1279 static void rx_set_checksum(struct sky2_port *sky2) in rx_set_checksum() argument
1281 struct sky2_rx_le *le = sky2_next_rx(sky2); in rx_set_checksum()
1287 sky2_write32(sky2->hw, in rx_set_checksum()
1288 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_checksum()
1289 (sky2->netdev->features & NETIF_F_RXCSUM) in rx_set_checksum()
1296 struct sky2_port *sky2 = netdev_priv(dev); in rx_set_rss() local
1297 struct sky2_hw *hw = sky2->hw; in rx_set_rss()
1303 sky2_write32(hw, SK_REG(sky2->port, RSS_CFG), HASH_ALL); in rx_set_rss()
1312 sky2_write32(hw, SK_REG(sky2->port, RSS_KEY + i * 4), in rx_set_rss()
1316 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), in rx_set_rss()
1319 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1322 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1336 static void sky2_rx_stop(struct sky2_port *sky2) in sky2_rx_stop() argument
1338 struct sky2_hw *hw = sky2->hw; in sky2_rx_stop()
1339 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_stop()
1350 netdev_warn(sky2->netdev, "receiver stop failed\n"); in sky2_rx_stop()
1360 static void sky2_rx_clean(struct sky2_port *sky2) in sky2_rx_clean() argument
1364 if (sky2->rx_le) in sky2_rx_clean()
1365 memset(sky2->rx_le, 0, RX_LE_BYTES); in sky2_rx_clean()
1367 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_clean()
1368 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_rx_clean()
1371 sky2_rx_unmap_skb(sky2->hw->pdev, re); in sky2_rx_clean()
1382 struct sky2_port *sky2 = netdev_priv(dev); in sky2_ioctl() local
1383 struct sky2_hw *hw = sky2->hw; in sky2_ioctl()
1397 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1398 err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val); in sky2_ioctl()
1399 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1406 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1407 err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f, in sky2_ioctl()
1409 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1419 struct sky2_port *sky2 = netdev_priv(dev); in sky2_vlan_mode() local
1420 struct sky2_hw *hw = sky2->hw; in sky2_vlan_mode()
1421 u16 port = sky2->port; in sky2_vlan_mode()
1454 static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2, gfp_t gfp) in sky2_rx_alloc() argument
1459 skb = __netdev_alloc_skb(sky2->netdev, in sky2_rx_alloc()
1460 sky2->rx_data_size + sky2_rx_pad(sky2->hw), in sky2_rx_alloc()
1465 if (sky2->hw->flags & SKY2_HW_RAM_BUFFER) { in sky2_rx_alloc()
1478 for (i = 0; i < sky2->rx_nfrags; i++) { in sky2_rx_alloc()
1493 static inline void sky2_rx_update(struct sky2_port *sky2, unsigned rxq) in sky2_rx_update() argument
1495 sky2_put_idx(sky2->hw, rxq, sky2->rx_put); in sky2_rx_update()
1498 static int sky2_alloc_rx_skbs(struct sky2_port *sky2) in sky2_alloc_rx_skbs() argument
1500 struct sky2_hw *hw = sky2->hw; in sky2_alloc_rx_skbs()
1503 sky2->rx_data_size = sky2_get_rx_data_size(sky2); in sky2_alloc_rx_skbs()
1506 for (i = 0; i < sky2->rx_pending; i++) { in sky2_alloc_rx_skbs()
1507 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_alloc_rx_skbs()
1509 re->skb = sky2_rx_alloc(sky2, GFP_KERNEL); in sky2_alloc_rx_skbs()
1513 if (sky2_rx_map_skb(hw->pdev, re, sky2->rx_data_size)) { in sky2_alloc_rx_skbs()
1531 static void sky2_rx_start(struct sky2_port *sky2) in sky2_rx_start() argument
1533 struct sky2_hw *hw = sky2->hw; in sky2_rx_start()
1535 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_start()
1538 sky2->rx_put = sky2->rx_next = 0; in sky2_rx_start()
1551 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); in sky2_rx_start()
1554 rx_set_checksum(sky2); in sky2_rx_start()
1557 rx_set_rss(sky2->netdev, sky2->netdev->features); in sky2_rx_start()
1560 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_start()
1561 re = sky2->rx_ring + i; in sky2_rx_start()
1562 sky2_rx_submit(sky2, re); in sky2_rx_start()
1571 thresh = sky2_get_rx_threshold(sky2); in sky2_rx_start()
1573 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF); in sky2_rx_start()
1575 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_TR_THR), thresh); in sky2_rx_start()
1576 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_ON); in sky2_rx_start()
1580 sky2_rx_update(sky2, rxq); in sky2_rx_start()
1591 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_MACSEC_FLUSH_OFF); in sky2_rx_start()
1596 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_FL_CTRL), in sky2_rx_start()
1600 sky2_write32(hw, Q_ADDR(txqaddr[sky2->port], Q_TEST), in sky2_rx_start()
1605 static int sky2_alloc_buffers(struct sky2_port *sky2) in sky2_alloc_buffers() argument
1607 struct sky2_hw *hw = sky2->hw; in sky2_alloc_buffers()
1610 sky2->tx_le = pci_alloc_consistent(hw->pdev, in sky2_alloc_buffers()
1611 sky2->tx_ring_size * in sky2_alloc_buffers()
1613 &sky2->tx_le_map); in sky2_alloc_buffers()
1614 if (!sky2->tx_le) in sky2_alloc_buffers()
1617 sky2->tx_ring = kcalloc(sky2->tx_ring_size, sizeof(struct tx_ring_info), in sky2_alloc_buffers()
1619 if (!sky2->tx_ring) in sky2_alloc_buffers()
1622 sky2->rx_le = pci_zalloc_consistent(hw->pdev, RX_LE_BYTES, in sky2_alloc_buffers()
1623 &sky2->rx_le_map); in sky2_alloc_buffers()
1624 if (!sky2->rx_le) in sky2_alloc_buffers()
1627 sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct rx_ring_info), in sky2_alloc_buffers()
1629 if (!sky2->rx_ring) in sky2_alloc_buffers()
1632 return sky2_alloc_rx_skbs(sky2); in sky2_alloc_buffers()
1637 static void sky2_free_buffers(struct sky2_port *sky2) in sky2_free_buffers() argument
1639 struct sky2_hw *hw = sky2->hw; in sky2_free_buffers()
1641 sky2_rx_clean(sky2); in sky2_free_buffers()
1643 if (sky2->rx_le) { in sky2_free_buffers()
1645 sky2->rx_le, sky2->rx_le_map); in sky2_free_buffers()
1646 sky2->rx_le = NULL; in sky2_free_buffers()
1648 if (sky2->tx_le) { in sky2_free_buffers()
1650 sky2->tx_ring_size * sizeof(struct sky2_tx_le), in sky2_free_buffers()
1651 sky2->tx_le, sky2->tx_le_map); in sky2_free_buffers()
1652 sky2->tx_le = NULL; in sky2_free_buffers()
1654 kfree(sky2->tx_ring); in sky2_free_buffers()
1655 kfree(sky2->rx_ring); in sky2_free_buffers()
1657 sky2->tx_ring = NULL; in sky2_free_buffers()
1658 sky2->rx_ring = NULL; in sky2_free_buffers()
1661 static void sky2_hw_up(struct sky2_port *sky2) in sky2_hw_up() argument
1663 struct sky2_hw *hw = sky2->hw; in sky2_hw_up()
1664 unsigned port = sky2->port; in sky2_hw_up()
1667 struct net_device *otherdev = hw->dev[sky2->port^1]; in sky2_hw_up()
1669 tx_init(sky2); in sky2_hw_up()
1691 netdev_dbg(sky2->netdev, "ram buffer %dK\n", ramsize); in sky2_hw_up()
1716 sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map, in sky2_hw_up()
1717 sky2->tx_ring_size - 1); in sky2_hw_up()
1719 sky2_vlan_mode(sky2->netdev, sky2->netdev->features); in sky2_hw_up()
1720 netdev_update_features(sky2->netdev); in sky2_hw_up()
1722 sky2_rx_start(sky2); in sky2_hw_up()
1751 struct sky2_port *sky2 = netdev_priv(dev); in sky2_open() local
1752 struct sky2_hw *hw = sky2->hw; in sky2_open()
1753 unsigned port = sky2->port; in sky2_open()
1759 err = sky2_alloc_buffers(sky2); in sky2_open()
1767 sky2_hw_up(sky2); in sky2_open()
1781 netif_info(sky2, ifup, dev, "enabling interface\n"); in sky2_open()
1786 sky2_free_buffers(sky2); in sky2_open()
1791 static inline int tx_inuse(const struct sky2_port *sky2) in tx_inuse() argument
1793 return (sky2->tx_prod - sky2->tx_cons) & (sky2->tx_ring_size - 1); in tx_inuse()
1797 static inline int tx_avail(const struct sky2_port *sky2) in tx_avail() argument
1799 return sky2->tx_pending - tx_inuse(sky2); in tx_avail()
1843 struct sky2_port *sky2 = netdev_priv(dev); in sky2_xmit_frame() local
1844 struct sky2_hw *hw = sky2->hw; in sky2_xmit_frame()
1854 if (unlikely(tx_avail(sky2) < tx_le_req(skb))) in sky2_xmit_frame()
1863 slot = sky2->tx_prod; in sky2_xmit_frame()
1864 netif_printk(sky2, tx_queued, KERN_DEBUG, dev, in sky2_xmit_frame()
1869 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1870 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1872 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1883 if (mss != sky2->tx_last_mss) { in sky2_xmit_frame()
1884 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1891 sky2->tx_last_mss = mss; in sky2_xmit_frame()
1900 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1925 if (tcpsum != sky2->tx_tcpsum) { in sky2_xmit_frame()
1926 sky2->tx_tcpsum = tcpsum; in sky2_xmit_frame()
1928 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1937 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1942 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1959 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1960 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1962 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1966 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1971 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1981 sky2->tx_prod = slot; in sky2_xmit_frame()
1983 if (tx_avail(sky2) <= MAX_SKB_TX_LE) in sky2_xmit_frame()
1987 sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod); in sky2_xmit_frame()
1992 for (i = sky2->tx_prod; i != slot; i = RING_NEXT(i, sky2->tx_ring_size)) { in sky2_xmit_frame()
1993 re = sky2->tx_ring + i; in sky2_xmit_frame()
2015 static void sky2_tx_complete(struct sky2_port *sky2, u16 done) in sky2_tx_complete() argument
2017 struct net_device *dev = sky2->netdev; in sky2_tx_complete()
2021 BUG_ON(done >= sky2->tx_ring_size); in sky2_tx_complete()
2023 for (idx = sky2->tx_cons; idx != done; in sky2_tx_complete()
2024 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_tx_complete()
2025 struct tx_ring_info *re = sky2->tx_ring + idx; in sky2_tx_complete()
2028 sky2_tx_unmap(sky2->hw->pdev, re); in sky2_tx_complete()
2031 netif_printk(sky2, tx_done, KERN_DEBUG, dev, in sky2_tx_complete()
2040 sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size); in sky2_tx_complete()
2044 sky2->tx_cons = idx; in sky2_tx_complete()
2049 u64_stats_update_begin(&sky2->tx_stats.syncp); in sky2_tx_complete()
2050 sky2->tx_stats.packets += pkts_compl; in sky2_tx_complete()
2051 sky2->tx_stats.bytes += bytes_compl; in sky2_tx_complete()
2052 u64_stats_update_end(&sky2->tx_stats.syncp); in sky2_tx_complete()
2079 static void sky2_hw_down(struct sky2_port *sky2) in sky2_hw_down() argument
2081 struct sky2_hw *hw = sky2->hw; in sky2_hw_down()
2082 unsigned port = sky2->port; in sky2_hw_down()
2114 sky2_rx_stop(sky2); in sky2_hw_down()
2116 spin_lock_bh(&sky2->phy_lock); in sky2_hw_down()
2118 spin_unlock_bh(&sky2->phy_lock); in sky2_hw_down()
2123 sky2_tx_complete(sky2, sky2->tx_prod); in sky2_hw_down()
2129 struct sky2_port *sky2 = netdev_priv(dev); in sky2_close() local
2130 struct sky2_hw *hw = sky2->hw; in sky2_close()
2133 if (!sky2->tx_le) in sky2_close()
2136 netif_info(sky2, ifdown, dev, "disabling interface\n"); in sky2_close()
2150 imask &= ~portirq_msk[sky2->port]; in sky2_close()
2158 sky2_hw_down(sky2); in sky2_close()
2160 sky2_free_buffers(sky2); in sky2_close()
2187 static void sky2_link_up(struct sky2_port *sky2) in sky2_link_up() argument
2189 struct sky2_hw *hw = sky2->hw; in sky2_link_up()
2190 unsigned port = sky2->port; in sky2_link_up()
2198 sky2_set_ipg(sky2); in sky2_link_up()
2200 sky2_enable_rx_tx(sky2); in sky2_link_up()
2204 netif_carrier_on(sky2->netdev); in sky2_link_up()
2212 netif_info(sky2, link, sky2->netdev, in sky2_link_up()
2214 sky2->speed, in sky2_link_up()
2215 sky2->duplex == DUPLEX_FULL ? "full" : "half", in sky2_link_up()
2216 fc_name[sky2->flow_status]); in sky2_link_up()
2219 static void sky2_link_down(struct sky2_port *sky2) in sky2_link_down() argument
2221 struct sky2_hw *hw = sky2->hw; in sky2_link_down()
2222 unsigned port = sky2->port; in sky2_link_down()
2231 netif_carrier_off(sky2->netdev); in sky2_link_down()
2236 netif_info(sky2, link, sky2->netdev, "Link is down\n"); in sky2_link_down()
2249 static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux) in sky2_autoneg_done() argument
2251 struct sky2_hw *hw = sky2->hw; in sky2_autoneg_done()
2252 unsigned port = sky2->port; in sky2_autoneg_done()
2258 netdev_err(sky2->netdev, "remote fault\n"); in sky2_autoneg_done()
2263 netdev_err(sky2->netdev, "speed/duplex mismatch\n"); in sky2_autoneg_done()
2267 sky2->speed = sky2_phy_speed(hw, aux); in sky2_autoneg_done()
2268 sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF; in sky2_autoneg_done()
2288 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2291 sky2->flow_status = FC_BOTH; in sky2_autoneg_done()
2293 sky2->flow_status = FC_RX; in sky2_autoneg_done()
2296 sky2->flow_status = FC_TX; in sky2_autoneg_done()
2299 if (sky2->duplex == DUPLEX_HALF && sky2->speed < SPEED_1000 && in sky2_autoneg_done()
2301 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2303 if (sky2->flow_status & FC_TX) in sky2_autoneg_done()
2315 struct sky2_port *sky2 = netdev_priv(dev); in sky2_phy_intr() local
2321 spin_lock(&sky2->phy_lock); in sky2_phy_intr()
2325 netif_info(sky2, intr, sky2->netdev, "phy interrupt status 0x%x 0x%x\n", in sky2_phy_intr()
2329 if (sky2_autoneg_done(sky2, phystat) == 0 && in sky2_phy_intr()
2331 sky2_link_up(sky2); in sky2_phy_intr()
2336 sky2->speed = sky2_phy_speed(hw, phystat); in sky2_phy_intr()
2339 sky2->duplex = in sky2_phy_intr()
2344 sky2_link_up(sky2); in sky2_phy_intr()
2346 sky2_link_down(sky2); in sky2_phy_intr()
2349 spin_unlock(&sky2->phy_lock); in sky2_phy_intr()
2355 struct sky2_port *sky2 = netdev_priv(hw->dev[0]); in sky2_qlink_intr() local
2370 sky2_link_up(sky2); in sky2_qlink_intr()
2378 struct sky2_port *sky2 = netdev_priv(dev); in sky2_tx_timeout() local
2379 struct sky2_hw *hw = sky2->hw; in sky2_tx_timeout()
2381 netif_err(sky2, timer, dev, "tx timeout\n"); in sky2_tx_timeout()
2384 sky2->tx_cons, sky2->tx_prod, in sky2_tx_timeout()
2385 sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX), in sky2_tx_timeout()
2386 sky2_read16(hw, Q_ADDR(txqaddr[sky2->port], Q_DONE))); in sky2_tx_timeout()
2394 struct sky2_port *sky2 = netdev_priv(dev); in sky2_change_mtu() local
2395 struct sky2_hw *hw = sky2->hw; in sky2_change_mtu()
2396 unsigned port = sky2->port; in sky2_change_mtu()
2432 sky2_rx_stop(sky2); in sky2_change_mtu()
2433 sky2_rx_clean(sky2); in sky2_change_mtu()
2439 if (sky2->speed > SPEED_100) in sky2_change_mtu()
2451 err = sky2_alloc_rx_skbs(sky2); in sky2_change_mtu()
2453 sky2_rx_start(sky2); in sky2_change_mtu()
2455 sky2_rx_clean(sky2); in sky2_change_mtu()
2484 static struct sk_buff *receive_copy(struct sky2_port *sky2, in receive_copy() argument
2490 skb = netdev_alloc_skb_ip_align(sky2->netdev, length); in receive_copy()
2492 pci_dma_sync_single_for_cpu(sky2->hw->pdev, re->data_addr, in receive_copy()
2501 pci_dma_sync_single_for_device(sky2->hw->pdev, re->data_addr, in receive_copy()
2546 static struct sk_buff *receive_new(struct sky2_port *sky2, in receive_new() argument
2552 unsigned hdr_space = sky2->rx_data_size; in receive_new()
2554 nre.skb = sky2_rx_alloc(sky2, GFP_ATOMIC); in receive_new()
2558 if (sky2_rx_map_skb(sky2->hw->pdev, &nre, hdr_space)) in receive_new()
2562 sky2_rx_unmap_skb(sky2->hw->pdev, re); in receive_new()
2585 struct sky2_port *sky2 = netdev_priv(dev); in sky2_receive() local
2586 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; in sky2_receive()
2590 netif_printk(sky2, rx_status, KERN_DEBUG, dev, in sky2_receive()
2592 sky2->rx_next, status, length); in sky2_receive()
2594 sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending; in sky2_receive()
2595 prefetch(sky2->rx_ring + sky2->rx_next); in sky2_receive()
2604 if (sky2->hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_receive()
2605 sky2->hw->chip_rev == CHIP_REV_YU_FE2_A0 && in sky2_receive()
2621 skb = receive_copy(sky2, re, length); in sky2_receive()
2623 skb = receive_new(sky2, re, length); in sky2_receive()
2628 sky2_rx_submit(sky2, re); in sky2_receive()
2636 netif_info(sky2, rx_err, dev, in sky2_receive()
2645 struct sky2_port *sky2 = netdev_priv(dev); in sky2_tx_done() local
2648 sky2_tx_complete(sky2, last); in sky2_tx_done()
2651 if (tx_avail(sky2) > MAX_SKB_TX_LE + 4) in sky2_tx_done()
2656 static inline void sky2_skb_rx(const struct sky2_port *sky2, in sky2_skb_rx() argument
2662 napi_gro_receive(&sky2->hw->napi, skb); in sky2_skb_rx()
2669 struct sky2_port *sky2 = netdev_priv(dev); in sky2_rx_done() local
2674 u64_stats_update_begin(&sky2->rx_stats.syncp); in sky2_rx_done()
2675 sky2->rx_stats.packets += packets; in sky2_rx_done()
2676 sky2->rx_stats.bytes += bytes; in sky2_rx_done()
2677 u64_stats_update_end(&sky2->rx_stats.syncp); in sky2_rx_done()
2683 static void sky2_rx_checksum(struct sky2_port *sky2, u32 status) in sky2_rx_checksum() argument
2686 BUG_ON(sky2->hw->flags & SKY2_HW_NEW_LE); in sky2_rx_checksum()
2694 struct sk_buff *skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_checksum()
2698 dev_notice(&sky2->hw->pdev->dev, in sky2_rx_checksum()
2700 sky2->netdev->name, status); in sky2_rx_checksum()
2706 sky2->netdev->features &= ~NETIF_F_RXCSUM; in sky2_rx_checksum()
2707 sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_rx_checksum()
2712 static void sky2_rx_tag(struct sky2_port *sky2, u16 length) in sky2_rx_tag() argument
2716 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_tag()
2720 static void sky2_rx_hash(struct sky2_port *sky2, u32 status) in sky2_rx_hash() argument
2724 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_hash()
2740 struct sky2_port *sky2; in sky2_status_intr() local
2756 sky2 = netdev_priv(dev); in sky2_status_intr()
2781 sky2_skb_rx(sky2, skb); in sky2_status_intr()
2789 sky2_rx_tag(sky2, length); in sky2_status_intr()
2793 sky2_rx_tag(sky2, length); in sky2_status_intr()
2797 sky2_rx_checksum(sky2, status); in sky2_status_intr()
2801 sky2_rx_hash(sky2, status); in sky2_status_intr()
2919 struct sky2_port *sky2 = netdev_priv(dev); in sky2_mac_intr() local
2922 netif_info(sky2, intr, dev, "mac interrupt status 0x%x\n", status); in sky2_mac_intr()
2956 struct sky2_port *sky2 = netdev_priv(dev); in sky2_rx_hung() local
2957 struct sky2_hw *hw = sky2->hw; in sky2_rx_hung()
2958 unsigned port = sky2->port; in sky2_rx_hung()
2966 if (sky2->check.last == dev->last_rx && in sky2_rx_hung()
2967 ((mac_rp == sky2->check.mac_rp && in sky2_rx_hung()
2968 mac_lev != 0 && mac_lev >= sky2->check.mac_lev) || in sky2_rx_hung()
2970 (fifo_rp == sky2->check.fifo_rp && in sky2_rx_hung()
2971 fifo_lev != 0 && fifo_lev >= sky2->check.fifo_lev))) { in sky2_rx_hung()
2978 sky2->check.last = dev->last_rx; in sky2_rx_hung()
2979 sky2->check.mac_rp = mac_rp; in sky2_rx_hung()
2980 sky2->check.mac_lev = mac_lev; in sky2_rx_hung()
2981 sky2->check.fifo_rp = fifo_rp; in sky2_rx_hung()
2982 sky2->check.fifo_lev = fifo_lev; in sky2_rx_hung()
3102 struct sky2_port *sky2 = netdev_priv(dev); in sky2_netpoll() local
3104 napi_schedule(&sky2->hw->napi); in sky2_netpoll()
3497 struct sky2_port *sky2 = netdev_priv(dev); in sky2_all_down() local
3504 sky2_hw_down(sky2); in sky2_all_down()
3515 struct sky2_port *sky2 = netdev_priv(dev); in sky2_all_up() local
3520 sky2_hw_up(sky2); in sky2_all_up()
3554 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_wol() local
3556 wol->supported = sky2_wol_supported(sky2->hw); in sky2_get_wol()
3557 wol->wolopts = sky2->wol; in sky2_get_wol()
3562 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_wol() local
3563 struct sky2_hw *hw = sky2->hw; in sky2_set_wol()
3567 if ((wol->wolopts & ~sky2_wol_supported(sky2->hw)) || in sky2_set_wol()
3571 sky2->wol = wol->wolopts; in sky2_set_wol()
3575 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_wol() local
3577 if (sky2->wol) in sky2_set_wol()
3604 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_settings() local
3605 struct sky2_hw *hw = sky2->hw; in sky2_get_settings()
3612 ethtool_cmd_speed_set(ecmd, sky2->speed); in sky2_get_settings()
3620 ecmd->advertising = sky2->advertising; in sky2_get_settings()
3621 ecmd->autoneg = (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_get_settings()
3623 ecmd->duplex = sky2->duplex; in sky2_get_settings()
3629 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_settings() local
3630 const struct sky2_hw *hw = sky2->hw; in sky2_set_settings()
3638 sky2->advertising = ecmd->advertising | in sky2_set_settings()
3642 sky2->advertising = ecmd->advertising | in sky2_set_settings()
3646 sky2->flags |= SKY2_FLAG_AUTO_SPEED; in sky2_set_settings()
3647 sky2->duplex = -1; in sky2_set_settings()
3648 sky2->speed = -1; in sky2_set_settings()
3686 sky2->speed = speed; in sky2_set_settings()
3687 sky2->duplex = ecmd->duplex; in sky2_set_settings()
3688 sky2->flags &= ~SKY2_FLAG_AUTO_SPEED; in sky2_set_settings()
3692 sky2_phy_reinit(sky2); in sky2_set_settings()
3702 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_drvinfo() local
3706 strlcpy(info->bus_info, pci_name(sky2->hw->pdev), in sky2_get_drvinfo()
3756 struct sky2_port *sky2 = netdev_priv(netdev); in sky2_get_msglevel() local
3757 return sky2->msg_enable; in sky2_get_msglevel()
3762 struct sky2_port *sky2 = netdev_priv(dev); in sky2_nway_reset() local
3764 if (!netif_running(dev) || !(sky2->flags & SKY2_FLAG_AUTO_SPEED)) in sky2_nway_reset()
3767 sky2_phy_reinit(sky2); in sky2_nway_reset()
3773 static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count) in sky2_phy_stats() argument
3775 struct sky2_hw *hw = sky2->hw; in sky2_phy_stats()
3776 unsigned port = sky2->port; in sky2_phy_stats()
3788 struct sky2_port *sky2 = netdev_priv(netdev); in sky2_set_msglevel() local
3789 sky2->msg_enable = value; in sky2_set_msglevel()
3805 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_ethtool_stats() local
3807 sky2_phy_stats(sky2, data, ARRAY_SIZE(sky2_stats)); in sky2_get_ethtool_stats()
3825 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_mac_address() local
3826 struct sky2_hw *hw = sky2->hw; in sky2_set_mac_address()
3827 unsigned port = sky2->port; in sky2_set_mac_address()
3858 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_multicast() local
3859 struct sky2_hw *hw = sky2->hw; in sky2_set_multicast()
3860 unsigned port = sky2->port; in sky2_set_multicast()
3867 rx_pause = (sky2->flow_status == FC_RX || sky2->flow_status == FC_BOTH); in sky2_set_multicast()
3904 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_stats() local
3905 struct sky2_hw *hw = sky2->hw; in sky2_get_stats()
3906 unsigned port = sky2->port; in sky2_get_stats()
3911 start = u64_stats_fetch_begin_irq(&sky2->rx_stats.syncp); in sky2_get_stats()
3912 _bytes = sky2->rx_stats.bytes; in sky2_get_stats()
3913 _packets = sky2->rx_stats.packets; in sky2_get_stats()
3914 } while (u64_stats_fetch_retry_irq(&sky2->rx_stats.syncp, start)); in sky2_get_stats()
3920 start = u64_stats_fetch_begin_irq(&sky2->tx_stats.syncp); in sky2_get_stats()
3921 _bytes = sky2->tx_stats.bytes; in sky2_get_stats()
3922 _packets = sky2->tx_stats.packets; in sky2_get_stats()
3923 } while (u64_stats_fetch_retry_irq(&sky2->tx_stats.syncp, start)); in sky2_get_stats()
3949 static void sky2_led(struct sky2_port *sky2, enum led_mode mode) in sky2_led() argument
3951 struct sky2_hw *hw = sky2->hw; in sky2_led()
3952 unsigned port = sky2->port; in sky2_led()
3954 spin_lock_bh(&sky2->phy_lock); in sky2_led()
4002 spin_unlock_bh(&sky2->phy_lock); in sky2_led()
4009 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_phys_id() local
4015 sky2_led(sky2, MO_LED_NORM); in sky2_set_phys_id()
4018 sky2_led(sky2, MO_LED_ON); in sky2_set_phys_id()
4021 sky2_led(sky2, MO_LED_OFF); in sky2_set_phys_id()
4031 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_pauseparam() local
4033 switch (sky2->flow_mode) { in sky2_get_pauseparam()
4047 ecmd->autoneg = (sky2->flags & SKY2_FLAG_AUTO_PAUSE) in sky2_get_pauseparam()
4054 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_pauseparam() local
4057 sky2->flags |= SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4059 sky2->flags &= ~SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4061 sky2->flow_mode = sky2_flow(ecmd->rx_pause, ecmd->tx_pause); in sky2_set_pauseparam()
4064 sky2_phy_reinit(sky2); in sky2_set_pauseparam()
4072 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_coalesce() local
4073 struct sky2_hw *hw = sky2->hw; in sky2_get_coalesce()
4107 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_coalesce() local
4108 struct sky2_hw *hw = sky2->hw; in sky2_set_coalesce()
4116 if (ecmd->tx_max_coalesced_frames >= sky2->tx_ring_size-1) in sky2_set_coalesce()
4165 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_ringparam() local
4170 ering->rx_pending = sky2->rx_pending; in sky2_get_ringparam()
4171 ering->tx_pending = sky2->tx_pending; in sky2_get_ringparam()
4177 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_ringparam() local
4187 sky2->rx_pending = ering->rx_pending; in sky2_set_ringparam()
4188 sky2->tx_pending = ering->tx_pending; in sky2_set_ringparam()
4189 sky2->tx_ring_size = roundup_ring_size(sky2->tx_pending); in sky2_set_ringparam()
4250 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_regs() local
4251 const void __iomem *io = sky2->hw->regs; in sky2_get_regs()
4260 else if (sky2_reg_access_ok(sky2->hw, b)) in sky2_get_regs()
4272 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_eeprom_len() local
4273 struct sky2_hw *hw = sky2->hw; in sky2_get_eeprom_len()
4342 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_eeprom() local
4343 int cap = pci_find_capability(sky2->hw->pdev, PCI_CAP_ID_VPD); in sky2_get_eeprom()
4350 return sky2_vpd_read(sky2->hw, cap, data, eeprom->offset, eeprom->len); in sky2_get_eeprom()
4356 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_eeprom() local
4357 int cap = pci_find_capability(sky2->hw->pdev, PCI_CAP_ID_VPD); in sky2_set_eeprom()
4369 return sky2_vpd_write(sky2->hw, cap, data, eeprom->offset, eeprom->len); in sky2_set_eeprom()
4375 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_fix_features() local
4376 const struct sky2_hw *hw = sky2->hw; in sky2_fix_features()
4389 (sky2->hw->flags & SKY2_HW_RSS_CHKSUM)) { in sky2_fix_features()
4399 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_features() local
4403 !(sky2->hw->flags & SKY2_HW_NEW_LE)) { in sky2_set_features()
4404 sky2_write32(sky2->hw, in sky2_set_features()
4405 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_set_features()
4533 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_debug_show() local
4534 struct sky2_hw *hw = sky2->hw; in sky2_debug_show()
4535 unsigned port = sky2->port; in sky2_debug_show()
4569 sky2->tx_cons, sky2->tx_prod, in sky2_debug_show()
4575 for (idx = sky2->tx_next; idx != sky2->tx_prod && idx < sky2->tx_ring_size; in sky2_debug_show()
4576 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_debug_show()
4577 const struct sky2_tx_le *le = sky2->tx_le + idx; in sky2_debug_show()
4648 struct sky2_port *sky2 = netdev_priv(dev); in sky2_device_event() local
4655 if (sky2->debugfs) { in sky2_device_event()
4656 sky2->debugfs = debugfs_rename(sky2_debug, sky2->debugfs, in sky2_device_event()
4662 if (sky2->debugfs) { in sky2_device_event()
4664 debugfs_remove(sky2->debugfs); in sky2_device_event()
4665 sky2->debugfs = NULL; in sky2_device_event()
4670 sky2->debugfs = debugfs_create_file(dev->name, S_IRUGO, in sky2_device_event()
4673 if (IS_ERR(sky2->debugfs)) in sky2_device_event()
4674 sky2->debugfs = NULL; in sky2_device_event()
4751 struct sky2_port *sky2; in sky2_init_netdev() local
4752 struct net_device *dev = alloc_etherdev(sizeof(*sky2)); in sky2_init_netdev()
4764 sky2 = netdev_priv(dev); in sky2_init_netdev()
4765 sky2->netdev = dev; in sky2_init_netdev()
4766 sky2->hw = hw; in sky2_init_netdev()
4767 sky2->msg_enable = netif_msg_init(debug, default_msg); in sky2_init_netdev()
4769 u64_stats_init(&sky2->tx_stats.syncp); in sky2_init_netdev()
4770 u64_stats_init(&sky2->rx_stats.syncp); in sky2_init_netdev()
4773 sky2->flags = SKY2_FLAG_AUTO_SPEED | SKY2_FLAG_AUTO_PAUSE; in sky2_init_netdev()
4777 sky2->flow_mode = FC_BOTH; in sky2_init_netdev()
4779 sky2->duplex = -1; in sky2_init_netdev()
4780 sky2->speed = -1; in sky2_init_netdev()
4781 sky2->advertising = sky2_supported_modes(hw); in sky2_init_netdev()
4782 sky2->wol = wol; in sky2_init_netdev()
4784 spin_lock_init(&sky2->phy_lock); in sky2_init_netdev()
4786 sky2->tx_pending = TX_DEF_PENDING; in sky2_init_netdev()
4787 sky2->tx_ring_size = roundup_ring_size(TX_DEF_PENDING); in sky2_init_netdev()
4788 sky2->rx_pending = RX_DEF_PENDING; in sky2_init_netdev()
4792 sky2->port = port; in sky2_init_netdev()
4827 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_show_addr() local
4829 netif_info(sky2, probe, dev, "addr %pM\n", dev->dev_addr); in sky2_show_addr()
5159 struct sky2_port *sky2 = netdev_priv(dev); in sky2_suspend() local
5161 if (sky2->wol) in sky2_suspend()
5162 sky2_wol_init(sky2); in sky2_suspend()