Lines Matching refs:sky2
327 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); in sky2_phy_init() local
330 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
372 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
417 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) { in sky2_phy_init()
419 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
421 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
423 if (sky2->advertising & ADVERTISED_100baseT_Full) in sky2_phy_init()
425 if (sky2->advertising & ADVERTISED_100baseT_Half) in sky2_phy_init()
427 if (sky2->advertising & ADVERTISED_10baseT_Full) in sky2_phy_init()
429 if (sky2->advertising & ADVERTISED_10baseT_Half) in sky2_phy_init()
433 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
435 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
448 switch (sky2->speed) { in sky2_phy_init()
459 if (sky2->duplex == DUPLEX_FULL) { in sky2_phy_init()
462 } else if (sky2->speed < SPEED_1000) in sky2_phy_init()
463 sky2->flow_mode = FC_NONE; in sky2_phy_init()
466 if (sky2->flags & SKY2_FLAG_AUTO_PAUSE) { in sky2_phy_init()
468 adv |= copper_fc_adv[sky2->flow_mode]; in sky2_phy_init()
470 adv |= fiber_fc_adv[sky2->flow_mode]; in sky2_phy_init()
473 reg |= gm_fc_disable[sky2->flow_mode]; in sky2_phy_init()
476 if (sky2->flow_mode & FC_RX) in sky2_phy_init()
617 if (!(sky2->flags & SKY2_FLAG_AUTO_SPEED) || in sky2_phy_init()
618 sky2->speed == SPEED_100) { in sky2_phy_init()
686 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_phy_init()
772 static void sky2_set_ipg(struct sky2_port *sky2) in sky2_set_ipg() argument
776 reg = gma_read16(sky2->hw, sky2->port, GM_SERIAL_MODE); in sky2_set_ipg()
778 if (sky2->speed > SPEED_100) in sky2_set_ipg()
782 gma_write16(sky2->hw, sky2->port, GM_SERIAL_MODE, reg); in sky2_set_ipg()
786 static void sky2_enable_rx_tx(struct sky2_port *sky2) in sky2_enable_rx_tx() argument
788 struct sky2_hw *hw = sky2->hw; in sky2_enable_rx_tx()
789 unsigned port = sky2->port; in sky2_enable_rx_tx()
798 static void sky2_phy_reinit(struct sky2_port *sky2) in sky2_phy_reinit() argument
800 spin_lock_bh(&sky2->phy_lock); in sky2_phy_reinit()
801 sky2_phy_init(sky2->hw, sky2->port); in sky2_phy_reinit()
802 sky2_enable_rx_tx(sky2); in sky2_phy_reinit()
803 spin_unlock_bh(&sky2->phy_lock); in sky2_phy_reinit()
807 static void sky2_wol_init(struct sky2_port *sky2) in sky2_wol_init() argument
809 struct sky2_hw *hw = sky2->hw; in sky2_wol_init()
810 unsigned port = sky2->port; in sky2_wol_init()
824 save_mode = sky2->flow_mode; in sky2_wol_init()
825 ctrl = sky2->advertising; in sky2_wol_init()
827 sky2->advertising &= ~(ADVERTISED_1000baseT_Half|ADVERTISED_1000baseT_Full); in sky2_wol_init()
828 sky2->flow_mode = FC_NONE; in sky2_wol_init()
830 spin_lock_bh(&sky2->phy_lock); in sky2_wol_init()
833 spin_unlock_bh(&sky2->phy_lock); in sky2_wol_init()
835 sky2->flow_mode = save_mode; in sky2_wol_init()
836 sky2->advertising = ctrl; in sky2_wol_init()
845 sky2->netdev->dev_addr, ETH_ALEN); in sky2_wol_init()
850 if (sky2->wol & WAKE_PHY) in sky2_wol_init()
855 if (sky2->wol & WAKE_MAGIC) in sky2_wol_init()
899 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); in sky2_mac_init() local
929 spin_lock_bh(&sky2->phy_lock); in sky2_mac_init()
932 spin_unlock_bh(&sky2->phy_lock); in sky2_mac_init()
1100 static inline struct sky2_tx_le *get_tx_le(struct sky2_port *sky2, u16 *slot) in get_tx_le() argument
1102 struct sky2_tx_le *le = sky2->tx_le + *slot; in get_tx_le()
1104 *slot = RING_NEXT(*slot, sky2->tx_ring_size); in get_tx_le()
1109 static void tx_init(struct sky2_port *sky2) in tx_init() argument
1113 sky2->tx_prod = sky2->tx_cons = 0; in tx_init()
1114 sky2->tx_tcpsum = 0; in tx_init()
1115 sky2->tx_last_mss = 0; in tx_init()
1116 netdev_reset_queue(sky2->netdev); in tx_init()
1118 le = get_tx_le(sky2, &sky2->tx_prod); in tx_init()
1121 sky2->tx_last_upper = 0; in tx_init()
1133 static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2) in sky2_next_rx() argument
1135 struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; in sky2_next_rx()
1136 sky2->rx_put = RING_NEXT(sky2->rx_put, RX_LE_SIZE); in sky2_next_rx()
1141 static unsigned sky2_get_rx_threshold(struct sky2_port *sky2) in sky2_get_rx_threshold() argument
1146 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_threshold()
1152 static unsigned sky2_get_rx_data_size(struct sky2_port *sky2) in sky2_get_rx_data_size() argument
1158 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_data_size()
1160 sky2->rx_nfrags = size >> PAGE_SHIFT; in sky2_get_rx_data_size()
1161 BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr)); in sky2_get_rx_data_size()
1164 size -= sky2->rx_nfrags << PAGE_SHIFT; in sky2_get_rx_data_size()
1176 static void sky2_rx_add(struct sky2_port *sky2, u8 op, in sky2_rx_add() argument
1182 le = sky2_next_rx(sky2); in sky2_rx_add()
1187 le = sky2_next_rx(sky2); in sky2_rx_add()
1194 static void sky2_rx_submit(struct sky2_port *sky2, in sky2_rx_submit() argument
1199 sky2_rx_add(sky2, OP_PACKET, re->data_addr, sky2->rx_data_size); in sky2_rx_submit()
1202 sky2_rx_add(sky2, OP_BUFFER, re->frag_addr[i], PAGE_SIZE); in sky2_rx_submit()
1266 static void rx_set_checksum(struct sky2_port *sky2) in rx_set_checksum() argument
1268 struct sky2_rx_le *le = sky2_next_rx(sky2); in rx_set_checksum()
1274 sky2_write32(sky2->hw, in rx_set_checksum()
1275 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_checksum()
1276 (sky2->netdev->features & NETIF_F_RXCSUM) in rx_set_checksum()
1283 struct sky2_port *sky2 = netdev_priv(dev); in rx_set_rss() local
1284 struct sky2_hw *hw = sky2->hw; in rx_set_rss()
1290 sky2_write32(hw, SK_REG(sky2->port, RSS_CFG), HASH_ALL); in rx_set_rss()
1299 sky2_write32(hw, SK_REG(sky2->port, RSS_KEY + i * 4), in rx_set_rss()
1303 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), in rx_set_rss()
1306 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1309 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1323 static void sky2_rx_stop(struct sky2_port *sky2) in sky2_rx_stop() argument
1325 struct sky2_hw *hw = sky2->hw; in sky2_rx_stop()
1326 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_stop()
1337 netdev_warn(sky2->netdev, "receiver stop failed\n"); in sky2_rx_stop()
1346 static void sky2_rx_clean(struct sky2_port *sky2) in sky2_rx_clean() argument
1350 if (sky2->rx_le) in sky2_rx_clean()
1351 memset(sky2->rx_le, 0, RX_LE_BYTES); in sky2_rx_clean()
1353 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_clean()
1354 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_rx_clean()
1357 sky2_rx_unmap_skb(sky2->hw->pdev, re); in sky2_rx_clean()
1368 struct sky2_port *sky2 = netdev_priv(dev); in sky2_ioctl() local
1369 struct sky2_hw *hw = sky2->hw; in sky2_ioctl()
1383 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1384 err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val); in sky2_ioctl()
1385 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1392 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1393 err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f, in sky2_ioctl()
1395 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1405 struct sky2_port *sky2 = netdev_priv(dev); in sky2_vlan_mode() local
1406 struct sky2_hw *hw = sky2->hw; in sky2_vlan_mode()
1407 u16 port = sky2->port; in sky2_vlan_mode()
1440 static struct sk_buff *sky2_rx_alloc(struct sky2_port *sky2, gfp_t gfp) in sky2_rx_alloc() argument
1445 skb = __netdev_alloc_skb(sky2->netdev, in sky2_rx_alloc()
1446 sky2->rx_data_size + sky2_rx_pad(sky2->hw), in sky2_rx_alloc()
1451 if (sky2->hw->flags & SKY2_HW_RAM_BUFFER) { in sky2_rx_alloc()
1464 for (i = 0; i < sky2->rx_nfrags; i++) { in sky2_rx_alloc()
1479 static inline void sky2_rx_update(struct sky2_port *sky2, unsigned rxq) in sky2_rx_update() argument
1481 sky2_put_idx(sky2->hw, rxq, sky2->rx_put); in sky2_rx_update()
1484 static int sky2_alloc_rx_skbs(struct sky2_port *sky2) in sky2_alloc_rx_skbs() argument
1486 struct sky2_hw *hw = sky2->hw; in sky2_alloc_rx_skbs()
1489 sky2->rx_data_size = sky2_get_rx_data_size(sky2); in sky2_alloc_rx_skbs()
1492 for (i = 0; i < sky2->rx_pending; i++) { in sky2_alloc_rx_skbs()
1493 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_alloc_rx_skbs()
1495 re->skb = sky2_rx_alloc(sky2, GFP_KERNEL); in sky2_alloc_rx_skbs()
1499 if (sky2_rx_map_skb(hw->pdev, re, sky2->rx_data_size)) { in sky2_alloc_rx_skbs()
1517 static void sky2_rx_start(struct sky2_port *sky2) in sky2_rx_start() argument
1519 struct sky2_hw *hw = sky2->hw; in sky2_rx_start()
1521 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_start()
1524 sky2->rx_put = sky2->rx_next = 0; in sky2_rx_start()
1538 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); in sky2_rx_start()
1541 rx_set_checksum(sky2); in sky2_rx_start()
1544 rx_set_rss(sky2->netdev, sky2->netdev->features); in sky2_rx_start()
1547 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_start()
1548 re = sky2->rx_ring + i; in sky2_rx_start()
1549 sky2_rx_submit(sky2, re); in sky2_rx_start()
1558 thresh = sky2_get_rx_threshold(sky2); in sky2_rx_start()
1560 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF); in sky2_rx_start()
1562 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_TR_THR), thresh); in sky2_rx_start()
1563 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_ON); in sky2_rx_start()
1567 sky2_rx_update(sky2, rxq); in sky2_rx_start()
1578 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_MACSEC_FLUSH_OFF); in sky2_rx_start()
1583 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_FL_CTRL), in sky2_rx_start()
1587 sky2_write32(hw, Q_ADDR(txqaddr[sky2->port], Q_TEST), in sky2_rx_start()
1592 static int sky2_alloc_buffers(struct sky2_port *sky2) in sky2_alloc_buffers() argument
1594 struct sky2_hw *hw = sky2->hw; in sky2_alloc_buffers()
1597 sky2->tx_le = dma_alloc_coherent(&hw->pdev->dev, in sky2_alloc_buffers()
1598 sky2->tx_ring_size * sizeof(struct sky2_tx_le), in sky2_alloc_buffers()
1599 &sky2->tx_le_map, GFP_KERNEL); in sky2_alloc_buffers()
1600 if (!sky2->tx_le) in sky2_alloc_buffers()
1603 sky2->tx_ring = kcalloc(sky2->tx_ring_size, sizeof(struct tx_ring_info), in sky2_alloc_buffers()
1605 if (!sky2->tx_ring) in sky2_alloc_buffers()
1608 sky2->rx_le = dma_alloc_coherent(&hw->pdev->dev, RX_LE_BYTES, in sky2_alloc_buffers()
1609 &sky2->rx_le_map, GFP_KERNEL); in sky2_alloc_buffers()
1610 if (!sky2->rx_le) in sky2_alloc_buffers()
1613 sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct rx_ring_info), in sky2_alloc_buffers()
1615 if (!sky2->rx_ring) in sky2_alloc_buffers()
1618 return sky2_alloc_rx_skbs(sky2); in sky2_alloc_buffers()
1623 static void sky2_free_buffers(struct sky2_port *sky2) in sky2_free_buffers() argument
1625 struct sky2_hw *hw = sky2->hw; in sky2_free_buffers()
1627 sky2_rx_clean(sky2); in sky2_free_buffers()
1629 if (sky2->rx_le) { in sky2_free_buffers()
1630 dma_free_coherent(&hw->pdev->dev, RX_LE_BYTES, sky2->rx_le, in sky2_free_buffers()
1631 sky2->rx_le_map); in sky2_free_buffers()
1632 sky2->rx_le = NULL; in sky2_free_buffers()
1634 if (sky2->tx_le) { in sky2_free_buffers()
1636 sky2->tx_ring_size * sizeof(struct sky2_tx_le), in sky2_free_buffers()
1637 sky2->tx_le, sky2->tx_le_map); in sky2_free_buffers()
1638 sky2->tx_le = NULL; in sky2_free_buffers()
1640 kfree(sky2->tx_ring); in sky2_free_buffers()
1641 kfree(sky2->rx_ring); in sky2_free_buffers()
1643 sky2->tx_ring = NULL; in sky2_free_buffers()
1644 sky2->rx_ring = NULL; in sky2_free_buffers()
1647 static void sky2_hw_up(struct sky2_port *sky2) in sky2_hw_up() argument
1649 struct sky2_hw *hw = sky2->hw; in sky2_hw_up()
1650 unsigned port = sky2->port; in sky2_hw_up()
1653 struct net_device *otherdev = hw->dev[sky2->port^1]; in sky2_hw_up()
1655 tx_init(sky2); in sky2_hw_up()
1677 netdev_dbg(sky2->netdev, "ram buffer %dK\n", ramsize); in sky2_hw_up()
1702 sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map, in sky2_hw_up()
1703 sky2->tx_ring_size - 1); in sky2_hw_up()
1705 sky2_vlan_mode(sky2->netdev, sky2->netdev->features); in sky2_hw_up()
1706 netdev_update_features(sky2->netdev); in sky2_hw_up()
1708 sky2_rx_start(sky2); in sky2_hw_up()
1737 struct sky2_port *sky2 = netdev_priv(dev); in sky2_open() local
1738 struct sky2_hw *hw = sky2->hw; in sky2_open()
1739 unsigned port = sky2->port; in sky2_open()
1745 err = sky2_alloc_buffers(sky2); in sky2_open()
1753 sky2_hw_up(sky2); in sky2_open()
1767 netif_info(sky2, ifup, dev, "enabling interface\n"); in sky2_open()
1772 sky2_free_buffers(sky2); in sky2_open()
1777 static inline int tx_inuse(const struct sky2_port *sky2) in tx_inuse() argument
1779 return (sky2->tx_prod - sky2->tx_cons) & (sky2->tx_ring_size - 1); in tx_inuse()
1783 static inline int tx_avail(const struct sky2_port *sky2) in tx_avail() argument
1785 return sky2->tx_pending - tx_inuse(sky2); in tx_avail()
1827 struct sky2_port *sky2 = netdev_priv(dev); in sky2_xmit_frame() local
1828 struct sky2_hw *hw = sky2->hw; in sky2_xmit_frame()
1838 if (unlikely(tx_avail(sky2) < tx_le_req(skb))) in sky2_xmit_frame()
1848 slot = sky2->tx_prod; in sky2_xmit_frame()
1849 netif_printk(sky2, tx_queued, KERN_DEBUG, dev, in sky2_xmit_frame()
1854 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1855 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1857 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1868 if (mss != sky2->tx_last_mss) { in sky2_xmit_frame()
1869 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1876 sky2->tx_last_mss = mss; in sky2_xmit_frame()
1885 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1910 if (tcpsum != sky2->tx_tcpsum) { in sky2_xmit_frame()
1911 sky2->tx_tcpsum = tcpsum; in sky2_xmit_frame()
1913 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1922 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1927 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1944 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1945 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1947 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1951 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1956 le = get_tx_le(sky2, &slot); in sky2_xmit_frame()
1966 sky2->tx_prod = slot; in sky2_xmit_frame()
1968 if (tx_avail(sky2) <= MAX_SKB_TX_LE) in sky2_xmit_frame()
1972 sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod); in sky2_xmit_frame()
1977 for (i = sky2->tx_prod; i != slot; i = RING_NEXT(i, sky2->tx_ring_size)) { in sky2_xmit_frame()
1978 re = sky2->tx_ring + i; in sky2_xmit_frame()
2000 static void sky2_tx_complete(struct sky2_port *sky2, u16 done) in sky2_tx_complete() argument
2002 struct net_device *dev = sky2->netdev; in sky2_tx_complete()
2006 BUG_ON(done >= sky2->tx_ring_size); in sky2_tx_complete()
2008 for (idx = sky2->tx_cons; idx != done; in sky2_tx_complete()
2009 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_tx_complete()
2010 struct tx_ring_info *re = sky2->tx_ring + idx; in sky2_tx_complete()
2013 sky2_tx_unmap(sky2->hw->pdev, re); in sky2_tx_complete()
2016 netif_printk(sky2, tx_done, KERN_DEBUG, dev, in sky2_tx_complete()
2025 sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size); in sky2_tx_complete()
2029 sky2->tx_cons = idx; in sky2_tx_complete()
2034 u64_stats_update_begin(&sky2->tx_stats.syncp); in sky2_tx_complete()
2035 sky2->tx_stats.packets += pkts_compl; in sky2_tx_complete()
2036 sky2->tx_stats.bytes += bytes_compl; in sky2_tx_complete()
2037 u64_stats_update_end(&sky2->tx_stats.syncp); in sky2_tx_complete()
2064 static void sky2_hw_down(struct sky2_port *sky2) in sky2_hw_down() argument
2066 struct sky2_hw *hw = sky2->hw; in sky2_hw_down()
2067 unsigned port = sky2->port; in sky2_hw_down()
2099 sky2_rx_stop(sky2); in sky2_hw_down()
2101 spin_lock_bh(&sky2->phy_lock); in sky2_hw_down()
2103 spin_unlock_bh(&sky2->phy_lock); in sky2_hw_down()
2108 sky2_tx_complete(sky2, sky2->tx_prod); in sky2_hw_down()
2114 struct sky2_port *sky2 = netdev_priv(dev); in sky2_close() local
2115 struct sky2_hw *hw = sky2->hw; in sky2_close()
2118 if (!sky2->tx_le) in sky2_close()
2121 netif_info(sky2, ifdown, dev, "disabling interface\n"); in sky2_close()
2135 imask &= ~portirq_msk[sky2->port]; in sky2_close()
2143 sky2_hw_down(sky2); in sky2_close()
2145 sky2_free_buffers(sky2); in sky2_close()
2172 static void sky2_link_up(struct sky2_port *sky2) in sky2_link_up() argument
2174 struct sky2_hw *hw = sky2->hw; in sky2_link_up()
2175 unsigned port = sky2->port; in sky2_link_up()
2183 sky2_set_ipg(sky2); in sky2_link_up()
2185 sky2_enable_rx_tx(sky2); in sky2_link_up()
2189 netif_carrier_on(sky2->netdev); in sky2_link_up()
2197 netif_info(sky2, link, sky2->netdev, in sky2_link_up()
2199 sky2->speed, in sky2_link_up()
2200 sky2->duplex == DUPLEX_FULL ? "full" : "half", in sky2_link_up()
2201 fc_name[sky2->flow_status]); in sky2_link_up()
2204 static void sky2_link_down(struct sky2_port *sky2) in sky2_link_down() argument
2206 struct sky2_hw *hw = sky2->hw; in sky2_link_down()
2207 unsigned port = sky2->port; in sky2_link_down()
2216 netif_carrier_off(sky2->netdev); in sky2_link_down()
2221 netif_info(sky2, link, sky2->netdev, "Link is down\n"); in sky2_link_down()
2234 static int sky2_autoneg_done(struct sky2_port *sky2, u16 aux) in sky2_autoneg_done() argument
2236 struct sky2_hw *hw = sky2->hw; in sky2_autoneg_done()
2237 unsigned port = sky2->port; in sky2_autoneg_done()
2243 netdev_err(sky2->netdev, "remote fault\n"); in sky2_autoneg_done()
2248 netdev_err(sky2->netdev, "speed/duplex mismatch\n"); in sky2_autoneg_done()
2252 sky2->speed = sky2_phy_speed(hw, aux); in sky2_autoneg_done()
2253 sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF; in sky2_autoneg_done()
2273 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2276 sky2->flow_status = FC_BOTH; in sky2_autoneg_done()
2278 sky2->flow_status = FC_RX; in sky2_autoneg_done()
2281 sky2->flow_status = FC_TX; in sky2_autoneg_done()
2284 if (sky2->duplex == DUPLEX_HALF && sky2->speed < SPEED_1000 && in sky2_autoneg_done()
2286 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2288 if (sky2->flow_status & FC_TX) in sky2_autoneg_done()
2300 struct sky2_port *sky2 = netdev_priv(dev); in sky2_phy_intr() local
2306 spin_lock(&sky2->phy_lock); in sky2_phy_intr()
2310 netif_info(sky2, intr, sky2->netdev, "phy interrupt status 0x%x 0x%x\n", in sky2_phy_intr()
2314 if (sky2_autoneg_done(sky2, phystat) == 0 && in sky2_phy_intr()
2316 sky2_link_up(sky2); in sky2_phy_intr()
2321 sky2->speed = sky2_phy_speed(hw, phystat); in sky2_phy_intr()
2324 sky2->duplex = in sky2_phy_intr()
2329 sky2_link_up(sky2); in sky2_phy_intr()
2331 sky2_link_down(sky2); in sky2_phy_intr()
2334 spin_unlock(&sky2->phy_lock); in sky2_phy_intr()
2340 struct sky2_port *sky2 = netdev_priv(hw->dev[0]); in sky2_qlink_intr() local
2355 sky2_link_up(sky2); in sky2_qlink_intr()
2363 struct sky2_port *sky2 = netdev_priv(dev); in sky2_tx_timeout() local
2364 struct sky2_hw *hw = sky2->hw; in sky2_tx_timeout()
2366 netif_err(sky2, timer, dev, "tx timeout\n"); in sky2_tx_timeout()
2369 sky2->tx_cons, sky2->tx_prod, in sky2_tx_timeout()
2370 sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX), in sky2_tx_timeout()
2371 sky2_read16(hw, Q_ADDR(txqaddr[sky2->port], Q_DONE))); in sky2_tx_timeout()
2379 struct sky2_port *sky2 = netdev_priv(dev); in sky2_change_mtu() local
2380 struct sky2_hw *hw = sky2->hw; in sky2_change_mtu()
2381 unsigned port = sky2->port; in sky2_change_mtu()
2407 sky2_rx_stop(sky2); in sky2_change_mtu()
2408 sky2_rx_clean(sky2); in sky2_change_mtu()
2414 if (sky2->speed > SPEED_100) in sky2_change_mtu()
2426 err = sky2_alloc_rx_skbs(sky2); in sky2_change_mtu()
2428 sky2_rx_start(sky2); in sky2_change_mtu()
2430 sky2_rx_clean(sky2); in sky2_change_mtu()
2459 static struct sk_buff *receive_copy(struct sky2_port *sky2, in receive_copy() argument
2465 skb = netdev_alloc_skb_ip_align(sky2->netdev, length); in receive_copy()
2467 dma_sync_single_for_cpu(&sky2->hw->pdev->dev, re->data_addr, in receive_copy()
2475 dma_sync_single_for_device(&sky2->hw->pdev->dev, in receive_copy()
2520 static struct sk_buff *receive_new(struct sky2_port *sky2, in receive_new() argument
2526 unsigned hdr_space = sky2->rx_data_size; in receive_new()
2528 nre.skb = sky2_rx_alloc(sky2, GFP_ATOMIC); in receive_new()
2532 if (sky2_rx_map_skb(sky2->hw->pdev, &nre, hdr_space)) in receive_new()
2536 sky2_rx_unmap_skb(sky2->hw->pdev, re); in receive_new()
2559 struct sky2_port *sky2 = netdev_priv(dev); in sky2_receive() local
2560 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; in sky2_receive()
2564 netif_printk(sky2, rx_status, KERN_DEBUG, dev, in sky2_receive()
2566 sky2->rx_next, status, length); in sky2_receive()
2568 sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending; in sky2_receive()
2569 prefetch(sky2->rx_ring + sky2->rx_next); in sky2_receive()
2578 if (sky2->hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_receive()
2579 sky2->hw->chip_rev == CHIP_REV_YU_FE2_A0 && in sky2_receive()
2595 skb = receive_copy(sky2, re, length); in sky2_receive()
2597 skb = receive_new(sky2, re, length); in sky2_receive()
2602 sky2_rx_submit(sky2, re); in sky2_receive()
2610 netif_info(sky2, rx_err, dev, in sky2_receive()
2619 struct sky2_port *sky2 = netdev_priv(dev); in sky2_tx_done() local
2622 sky2_tx_complete(sky2, last); in sky2_tx_done()
2625 if (tx_avail(sky2) > MAX_SKB_TX_LE + 4) in sky2_tx_done()
2630 static inline void sky2_skb_rx(const struct sky2_port *sky2, in sky2_skb_rx() argument
2636 napi_gro_receive(&sky2->hw->napi, skb); in sky2_skb_rx()
2643 struct sky2_port *sky2 = netdev_priv(dev); in sky2_rx_done() local
2648 u64_stats_update_begin(&sky2->rx_stats.syncp); in sky2_rx_done()
2649 sky2->rx_stats.packets += packets; in sky2_rx_done()
2650 sky2->rx_stats.bytes += bytes; in sky2_rx_done()
2651 u64_stats_update_end(&sky2->rx_stats.syncp); in sky2_rx_done()
2653 sky2->last_rx = jiffies; in sky2_rx_done()
2657 static void sky2_rx_checksum(struct sky2_port *sky2, u32 status) in sky2_rx_checksum() argument
2660 BUG_ON(sky2->hw->flags & SKY2_HW_NEW_LE); in sky2_rx_checksum()
2668 struct sk_buff *skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_checksum()
2672 dev_notice(&sky2->hw->pdev->dev, in sky2_rx_checksum()
2674 sky2->netdev->name, status); in sky2_rx_checksum()
2680 sky2->netdev->features &= ~NETIF_F_RXCSUM; in sky2_rx_checksum()
2681 sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_rx_checksum()
2686 static void sky2_rx_tag(struct sky2_port *sky2, u16 length) in sky2_rx_tag() argument
2690 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_tag()
2694 static void sky2_rx_hash(struct sky2_port *sky2, u32 status) in sky2_rx_hash() argument
2698 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_hash()
2714 struct sky2_port *sky2; in sky2_status_intr() local
2730 sky2 = netdev_priv(dev); in sky2_status_intr()
2755 sky2_skb_rx(sky2, skb); in sky2_status_intr()
2763 sky2_rx_tag(sky2, length); in sky2_status_intr()
2767 sky2_rx_tag(sky2, length); in sky2_status_intr()
2771 sky2_rx_checksum(sky2, status); in sky2_status_intr()
2775 sky2_rx_hash(sky2, status); in sky2_status_intr()
2893 struct sky2_port *sky2 = netdev_priv(dev); in sky2_mac_intr() local
2896 netif_info(sky2, intr, dev, "mac interrupt status 0x%x\n", status); in sky2_mac_intr()
2930 struct sky2_port *sky2 = netdev_priv(dev); in sky2_rx_hung() local
2931 struct sky2_hw *hw = sky2->hw; in sky2_rx_hung()
2932 unsigned port = sky2->port; in sky2_rx_hung()
2940 if (sky2->check.last == sky2->last_rx && in sky2_rx_hung()
2941 ((mac_rp == sky2->check.mac_rp && in sky2_rx_hung()
2942 mac_lev != 0 && mac_lev >= sky2->check.mac_lev) || in sky2_rx_hung()
2944 (fifo_rp == sky2->check.fifo_rp && in sky2_rx_hung()
2945 fifo_lev != 0 && fifo_lev >= sky2->check.fifo_lev))) { in sky2_rx_hung()
2952 sky2->check.last = sky2->last_rx; in sky2_rx_hung()
2953 sky2->check.mac_rp = mac_rp; in sky2_rx_hung()
2954 sky2->check.mac_lev = mac_lev; in sky2_rx_hung()
2955 sky2->check.fifo_rp = fifo_rp; in sky2_rx_hung()
2956 sky2->check.fifo_lev = fifo_lev; in sky2_rx_hung()
3076 struct sky2_port *sky2 = netdev_priv(dev); in sky2_netpoll() local
3078 napi_schedule(&sky2->hw->napi); in sky2_netpoll()
3471 struct sky2_port *sky2 = netdev_priv(dev); in sky2_all_down() local
3478 sky2_hw_down(sky2); in sky2_all_down()
3489 struct sky2_port *sky2 = netdev_priv(dev); in sky2_all_up() local
3494 sky2_hw_up(sky2); in sky2_all_up()
3528 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_wol() local
3530 wol->supported = sky2_wol_supported(sky2->hw); in sky2_get_wol()
3531 wol->wolopts = sky2->wol; in sky2_get_wol()
3536 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_wol() local
3537 struct sky2_hw *hw = sky2->hw; in sky2_set_wol()
3541 if ((wol->wolopts & ~sky2_wol_supported(sky2->hw)) || in sky2_set_wol()
3545 sky2->wol = wol->wolopts; in sky2_set_wol()
3549 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_wol() local
3551 if (sky2->wol) in sky2_set_wol()
3579 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_link_ksettings() local
3580 struct sky2_hw *hw = sky2->hw; in sky2_get_link_ksettings()
3587 cmd->base.speed = sky2->speed; in sky2_get_link_ksettings()
3595 advertising = sky2->advertising; in sky2_get_link_ksettings()
3596 cmd->base.autoneg = (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_get_link_ksettings()
3598 cmd->base.duplex = sky2->duplex; in sky2_get_link_ksettings()
3611 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_link_ksettings() local
3612 const struct sky2_hw *hw = sky2->hw; in sky2_set_link_ksettings()
3624 sky2->advertising = new_advertising | in sky2_set_link_ksettings()
3628 sky2->advertising = new_advertising | in sky2_set_link_ksettings()
3632 sky2->flags |= SKY2_FLAG_AUTO_SPEED; in sky2_set_link_ksettings()
3633 sky2->duplex = -1; in sky2_set_link_ksettings()
3634 sky2->speed = -1; in sky2_set_link_ksettings()
3672 sky2->speed = speed; in sky2_set_link_ksettings()
3673 sky2->duplex = cmd->base.duplex; in sky2_set_link_ksettings()
3674 sky2->flags &= ~SKY2_FLAG_AUTO_SPEED; in sky2_set_link_ksettings()
3678 sky2_phy_reinit(sky2); in sky2_set_link_ksettings()
3688 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_drvinfo() local
3692 strscpy(info->bus_info, pci_name(sky2->hw->pdev), in sky2_get_drvinfo()
3742 struct sky2_port *sky2 = netdev_priv(netdev); in sky2_get_msglevel() local
3743 return sky2->msg_enable; in sky2_get_msglevel()
3748 struct sky2_port *sky2 = netdev_priv(dev); in sky2_nway_reset() local
3750 if (!netif_running(dev) || !(sky2->flags & SKY2_FLAG_AUTO_SPEED)) in sky2_nway_reset()
3753 sky2_phy_reinit(sky2); in sky2_nway_reset()
3759 static void sky2_phy_stats(struct sky2_port *sky2, u64 * data, unsigned count) in sky2_phy_stats() argument
3761 struct sky2_hw *hw = sky2->hw; in sky2_phy_stats()
3762 unsigned port = sky2->port; in sky2_phy_stats()
3774 struct sky2_port *sky2 = netdev_priv(netdev); in sky2_set_msglevel() local
3775 sky2->msg_enable = value; in sky2_set_msglevel()
3791 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_ethtool_stats() local
3793 sky2_phy_stats(sky2, data, ARRAY_SIZE(sky2_stats)); in sky2_get_ethtool_stats()
3811 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_mac_address() local
3812 struct sky2_hw *hw = sky2->hw; in sky2_set_mac_address()
3813 unsigned port = sky2->port; in sky2_set_mac_address()
3844 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_multicast() local
3845 struct sky2_hw *hw = sky2->hw; in sky2_set_multicast()
3846 unsigned port = sky2->port; in sky2_set_multicast()
3853 rx_pause = (sky2->flow_status == FC_RX || sky2->flow_status == FC_BOTH); in sky2_set_multicast()
3890 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_stats() local
3891 struct sky2_hw *hw = sky2->hw; in sky2_get_stats()
3892 unsigned port = sky2->port; in sky2_get_stats()
3897 start = u64_stats_fetch_begin_irq(&sky2->rx_stats.syncp); in sky2_get_stats()
3898 _bytes = sky2->rx_stats.bytes; in sky2_get_stats()
3899 _packets = sky2->rx_stats.packets; in sky2_get_stats()
3900 } while (u64_stats_fetch_retry_irq(&sky2->rx_stats.syncp, start)); in sky2_get_stats()
3906 start = u64_stats_fetch_begin_irq(&sky2->tx_stats.syncp); in sky2_get_stats()
3907 _bytes = sky2->tx_stats.bytes; in sky2_get_stats()
3908 _packets = sky2->tx_stats.packets; in sky2_get_stats()
3909 } while (u64_stats_fetch_retry_irq(&sky2->tx_stats.syncp, start)); in sky2_get_stats()
3933 static void sky2_led(struct sky2_port *sky2, enum led_mode mode) in sky2_led() argument
3935 struct sky2_hw *hw = sky2->hw; in sky2_led()
3936 unsigned port = sky2->port; in sky2_led()
3938 spin_lock_bh(&sky2->phy_lock); in sky2_led()
3986 spin_unlock_bh(&sky2->phy_lock); in sky2_led()
3993 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_phys_id() local
3999 sky2_led(sky2, MO_LED_NORM); in sky2_set_phys_id()
4002 sky2_led(sky2, MO_LED_ON); in sky2_set_phys_id()
4005 sky2_led(sky2, MO_LED_OFF); in sky2_set_phys_id()
4015 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_pauseparam() local
4017 switch (sky2->flow_mode) { in sky2_get_pauseparam()
4031 ecmd->autoneg = (sky2->flags & SKY2_FLAG_AUTO_PAUSE) in sky2_get_pauseparam()
4038 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_pauseparam() local
4041 sky2->flags |= SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4043 sky2->flags &= ~SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4045 sky2->flow_mode = sky2_flow(ecmd->rx_pause, ecmd->tx_pause); in sky2_set_pauseparam()
4048 sky2_phy_reinit(sky2); in sky2_set_pauseparam()
4058 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_coalesce() local
4059 struct sky2_hw *hw = sky2->hw; in sky2_get_coalesce()
4095 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_coalesce() local
4096 struct sky2_hw *hw = sky2->hw; in sky2_set_coalesce()
4104 if (ecmd->tx_max_coalesced_frames >= sky2->tx_ring_size-1) in sky2_set_coalesce()
4155 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_ringparam() local
4160 ering->rx_pending = sky2->rx_pending; in sky2_get_ringparam()
4161 ering->tx_pending = sky2->tx_pending; in sky2_get_ringparam()
4169 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_ringparam() local
4179 sky2->rx_pending = ering->rx_pending; in sky2_set_ringparam()
4180 sky2->tx_pending = ering->tx_pending; in sky2_set_ringparam()
4181 sky2->tx_ring_size = roundup_ring_size(sky2->tx_pending); in sky2_set_ringparam()
4242 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_regs() local
4243 const void __iomem *io = sky2->hw->regs; in sky2_get_regs()
4252 else if (sky2_reg_access_ok(sky2->hw, b)) in sky2_get_regs()
4264 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_eeprom_len() local
4265 struct sky2_hw *hw = sky2->hw; in sky2_get_eeprom_len()
4275 struct sky2_port *sky2 = netdev_priv(dev); in sky2_get_eeprom() local
4279 rc = pci_read_vpd_any(sky2->hw->pdev, eeprom->offset, eeprom->len, in sky2_get_eeprom()
4292 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_eeprom() local
4298 rc = pci_write_vpd_any(sky2->hw->pdev, eeprom->offset, eeprom->len, in sky2_set_eeprom()
4307 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_fix_features() local
4308 const struct sky2_hw *hw = sky2->hw; in sky2_fix_features()
4321 (sky2->hw->flags & SKY2_HW_RSS_CHKSUM)) { in sky2_fix_features()
4331 struct sky2_port *sky2 = netdev_priv(dev); in sky2_set_features() local
4335 !(sky2->hw->flags & SKY2_HW_NEW_LE)) { in sky2_set_features()
4336 sky2_write32(sky2->hw, in sky2_set_features()
4337 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_set_features()
4389 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_debug_show() local
4390 struct sky2_hw *hw = sky2->hw; in sky2_debug_show()
4391 unsigned port = sky2->port; in sky2_debug_show()
4423 sky2->tx_cons, sky2->tx_prod, in sky2_debug_show()
4429 for (idx = sky2->tx_next; idx != sky2->tx_prod && idx < sky2->tx_ring_size; in sky2_debug_show()
4430 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_debug_show()
4431 const struct sky2_tx_le *le = sky2->tx_le + idx; in sky2_debug_show()
4490 struct sky2_port *sky2 = netdev_priv(dev); in sky2_device_event() local
4497 if (sky2->debugfs) { in sky2_device_event()
4498 sky2->debugfs = debugfs_rename(sky2_debug, sky2->debugfs, in sky2_device_event()
4504 if (sky2->debugfs) { in sky2_device_event()
4506 debugfs_remove(sky2->debugfs); in sky2_device_event()
4507 sky2->debugfs = NULL; in sky2_device_event()
4512 sky2->debugfs = debugfs_create_file(dev->name, 0444, in sky2_device_event()
4515 if (IS_ERR(sky2->debugfs)) in sky2_device_event()
4516 sky2->debugfs = NULL; in sky2_device_event()
4594 struct sky2_port *sky2; in sky2_init_netdev() local
4595 struct net_device *dev = alloc_etherdev(sizeof(*sky2)); in sky2_init_netdev()
4607 sky2 = netdev_priv(dev); in sky2_init_netdev()
4608 sky2->netdev = dev; in sky2_init_netdev()
4609 sky2->hw = hw; in sky2_init_netdev()
4610 sky2->msg_enable = netif_msg_init(debug, default_msg); in sky2_init_netdev()
4612 u64_stats_init(&sky2->tx_stats.syncp); in sky2_init_netdev()
4613 u64_stats_init(&sky2->rx_stats.syncp); in sky2_init_netdev()
4616 sky2->flags = SKY2_FLAG_AUTO_SPEED | SKY2_FLAG_AUTO_PAUSE; in sky2_init_netdev()
4620 sky2->flow_mode = FC_BOTH; in sky2_init_netdev()
4622 sky2->duplex = -1; in sky2_init_netdev()
4623 sky2->speed = -1; in sky2_init_netdev()
4624 sky2->advertising = sky2_supported_modes(hw); in sky2_init_netdev()
4625 sky2->wol = wol; in sky2_init_netdev()
4627 spin_lock_init(&sky2->phy_lock); in sky2_init_netdev()
4629 sky2->tx_pending = TX_DEF_PENDING; in sky2_init_netdev()
4630 sky2->tx_ring_size = roundup_ring_size(TX_DEF_PENDING); in sky2_init_netdev()
4631 sky2->rx_pending = RX_DEF_PENDING; in sky2_init_netdev()
4635 sky2->port = port; in sky2_init_netdev()
4690 const struct sky2_port *sky2 = netdev_priv(dev); in sky2_show_addr() local
4692 netif_info(sky2, probe, dev, "addr %pM\n", dev->dev_addr); in sky2_show_addr()
5066 struct sky2_port *sky2 = netdev_priv(dev); in sky2_suspend() local
5068 if (sky2->wol) in sky2_suspend()
5069 sky2_wol_init(sky2); in sky2_suspend()