Lines Matching +full:adv +full:- +full:extra +full:- +full:delay

1 // SPDX-License-Identifier: GPL-2.0-only
7 * of the original driver such as link fail-over and link management because
19 #include <linux/dma-mapping.h>
29 #include <linux/delay.h>
53 #define RX_MAX_PENDING (RX_LE_SIZE/6 - 2)
69 #define RING_NEXT(x, s) (((x)+1) & ((s)-1))
76 static int debug = -1; /* defaults above */
84 static int disable_msi = -1;
93 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, /* SK-9Sxx */
94 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, /* SK-9Exx */
95 { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E01) }, /* SK-9E21M */
96 { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, /* DGE-560T */
97 { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4001) }, /* DGE-550SX */
98 { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B02) }, /* DGE-560SX */
99 { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4B03) }, /* DGE-550T */
168 dev_warn(&hw->pdev->dev, "%s: phy write timeout\n", hw->dev[port]->name); in gm_phy_write()
169 return -ETIMEDOUT; in gm_phy_write()
172 dev_err(&hw->pdev->dev, "%s: phy I/O error\n", hw->dev[port]->name); in gm_phy_write()
173 return -EIO; in gm_phy_write()
196 dev_warn(&hw->pdev->dev, "%s: phy read timeout\n", hw->dev[port]->name); in __gm_phy_read()
197 return -ETIMEDOUT; in __gm_phy_read()
199 dev_err(&hw->pdev->dev, "%s: phy I/O error\n", hw->dev[port]->name); in __gm_phy_read()
200 return -EIO; in __gm_phy_read()
220 if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > CHIP_REV_YU_XL_A1) in sky2_power_on()
229 if (hw->flags & SKY2_HW_ADV_POWER_CTL) { in sky2_power_on()
248 /* Enable workaround for dev 4.107 on Yukon-Ultra & Extreme */ in sky2_power_on()
262 if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > CHIP_REV_YU_XL_A1) in sky2_power_aux()
273 pci_pme_capable(hw->pdev, PCI_D3cold)) in sky2_power_aux()
326 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); in sky2_phy_init()
327 u16 ctrl, ct1000, adv, pg, ledctrl, ledover, reg; in sky2_phy_init() local
329 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
330 !(hw->flags & SKY2_HW_NEWER_PHY)) { in sky2_phy_init()
338 if (hw->chip_id == CHIP_ID_YUKON_EC) in sky2_phy_init()
350 if (!(hw->flags & SKY2_HW_GIGABIT)) { in sky2_phy_init()
354 if (hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_phy_init()
355 hw->chip_rev == CHIP_REV_YU_FE2_A0) { in sky2_phy_init()
371 if ( (sky2->flags & SKY2_FLAG_AUTO_SPEED) && in sky2_phy_init()
372 (hw->flags & SKY2_HW_NEWER_PHY)) { in sky2_phy_init()
388 if (hw->chip_id == CHIP_ID_YUKON_XL && (hw->flags & SKY2_HW_FIBRE_PHY)) { in sky2_phy_init()
391 /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ in sky2_phy_init()
398 if (hw->pmd_type == 'P') { in sky2_phy_init()
402 /* for SFP-module set SIGDET polarity to low */ in sky2_phy_init()
413 adv = PHY_AN_CSMA; in sky2_phy_init()
416 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) { in sky2_phy_init()
418 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
420 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
422 if (sky2->advertising & ADVERTISED_100baseT_Full) in sky2_phy_init()
423 adv |= PHY_M_AN_100_FD; in sky2_phy_init()
424 if (sky2->advertising & ADVERTISED_100baseT_Half) in sky2_phy_init()
425 adv |= PHY_M_AN_100_HD; in sky2_phy_init()
426 if (sky2->advertising & ADVERTISED_10baseT_Full) in sky2_phy_init()
427 adv |= PHY_M_AN_10_FD; in sky2_phy_init()
428 if (sky2->advertising & ADVERTISED_10baseT_Half) in sky2_phy_init()
429 adv |= PHY_M_AN_10_HD; in sky2_phy_init()
432 if (sky2->advertising & ADVERTISED_1000baseT_Full) in sky2_phy_init()
433 adv |= PHY_M_AN_1000X_AFD; in sky2_phy_init()
434 if (sky2->advertising & ADVERTISED_1000baseT_Half) in sky2_phy_init()
435 adv |= PHY_M_AN_1000X_AHD; in sky2_phy_init()
438 /* Restart Auto-negotiation */ in sky2_phy_init()
447 switch (sky2->speed) { in sky2_phy_init()
458 if (sky2->duplex == DUPLEX_FULL) { in sky2_phy_init()
461 } else if (sky2->speed < SPEED_1000) in sky2_phy_init()
462 sky2->flow_mode = FC_NONE; in sky2_phy_init()
465 if (sky2->flags & SKY2_FLAG_AUTO_PAUSE) { in sky2_phy_init()
467 adv |= copper_fc_adv[sky2->flow_mode]; in sky2_phy_init()
469 adv |= fiber_fc_adv[sky2->flow_mode]; in sky2_phy_init()
472 reg |= gm_fc_disable[sky2->flow_mode]; in sky2_phy_init()
475 if (sky2->flow_mode & FC_RX) in sky2_phy_init()
483 if (hw->flags & SKY2_HW_GIGABIT) in sky2_phy_init()
486 gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv); in sky2_phy_init()
493 switch (hw->chip_id) { in sky2_phy_init()
516 /* set LED2 -> ACT, LED1 -> LINK, LED0 -> SPEED */ in sky2_phy_init()
580 if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_UL_2) { in sky2_phy_init()
584 /* increase differential signal amplitude in 10BASE-T */ in sky2_phy_init()
588 if (hw->chip_id == CHIP_ID_YUKON_EC_U) { in sky2_phy_init()
589 /* fix for IEEE A/B Symmetry failure in 1000BASE-T */ in sky2_phy_init()
596 } else if (hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_phy_init()
597 hw->chip_rev == CHIP_REV_YU_FE2_A0) { in sky2_phy_init()
601 } else if (hw->chip_id == CHIP_ID_YUKON_OPT && hw->chip_rev == 0) { in sky2_phy_init()
611 } else if (hw->chip_id != CHIP_ID_YUKON_EX && in sky2_phy_init()
612 hw->chip_id < CHIP_ID_YUKON_SUPR) { in sky2_phy_init()
613 /* no effect on Yukon-XL */ in sky2_phy_init()
616 if (!(sky2->flags & SKY2_FLAG_AUTO_SPEED) || in sky2_phy_init()
617 sky2->speed == SPEED_100) { in sky2_phy_init()
625 } else if (hw->chip_id == CHIP_ID_YUKON_PRM && in sky2_phy_init()
676 /* Enable 10Base-Te (EEE) */ in sky2_phy_init()
677 if (hw->chip_id >= CHIP_ID_YUKON_PRM) { in sky2_phy_init()
684 /* Enable phy interrupt on auto-negotiation complete (or link up) */ in sky2_phy_init()
685 if (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_phy_init()
702 if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > CHIP_REV_YU_XL_A1) in sky2_phy_power_up()
709 if (hw->chip_id == CHIP_ID_YUKON_FE) in sky2_phy_power_up()
711 else if (hw->flags & SKY2_HW_ADV_POWER_CTL) in sky2_phy_power_up()
726 if (hw->flags & SKY2_HW_NEWER_PHY) { in sky2_phy_power_down()
745 if (hw->chip_id != CHIP_ID_YUKON_EC) { in sky2_phy_power_down()
746 if (hw->chip_id == CHIP_ID_YUKON_EC_U) { in sky2_phy_power_down()
775 reg = gma_read16(sky2->hw, sky2->port, GM_SERIAL_MODE); in sky2_set_ipg()
777 if (sky2->speed > SPEED_100) in sky2_set_ipg()
781 gma_write16(sky2->hw, sky2->port, GM_SERIAL_MODE, reg); in sky2_set_ipg()
787 struct sky2_hw *hw = sky2->hw; in sky2_enable_rx_tx()
788 unsigned port = sky2->port; in sky2_enable_rx_tx()
799 spin_lock_bh(&sky2->phy_lock); in sky2_phy_reinit()
800 sky2_phy_init(sky2->hw, sky2->port); in sky2_phy_reinit()
802 spin_unlock_bh(&sky2->phy_lock); in sky2_phy_reinit()
808 struct sky2_hw *hw = sky2->hw; in sky2_wol_init()
809 unsigned port = sky2->port; in sky2_wol_init()
821 * sky2_reset will re-enable on resume in sky2_wol_init()
823 save_mode = sky2->flow_mode; in sky2_wol_init()
824 ctrl = sky2->advertising; in sky2_wol_init()
826 sky2->advertising &= ~(ADVERTISED_1000baseT_Half|ADVERTISED_1000baseT_Full); in sky2_wol_init()
827 sky2->flow_mode = FC_NONE; in sky2_wol_init()
829 spin_lock_bh(&sky2->phy_lock); in sky2_wol_init()
832 spin_unlock_bh(&sky2->phy_lock); in sky2_wol_init()
834 sky2->flow_mode = save_mode; in sky2_wol_init()
835 sky2->advertising = ctrl; in sky2_wol_init()
843 memcpy_toio(hw->regs + WOL_REGS(port, WOL_MAC_ADDR), in sky2_wol_init()
844 sky2->netdev->dev_addr, ETH_ALEN); in sky2_wol_init()
849 if (sky2->wol & WAKE_PHY) in sky2_wol_init()
854 if (sky2->wol & WAKE_MAGIC) in sky2_wol_init()
865 /* Needed by some broken BIOSes, use PCI rather than PCI-e for WOL */ in sky2_wol_init()
879 struct net_device *dev = hw->dev[port]; in sky2_set_tx_stfwd()
881 if ( (hw->chip_id == CHIP_ID_YUKON_EX && in sky2_set_tx_stfwd()
882 hw->chip_rev != CHIP_REV_YU_EX_A0) || in sky2_set_tx_stfwd()
883 hw->chip_id >= CHIP_ID_YUKON_FE_P) { in sky2_set_tx_stfwd()
884 /* Yukon-Extreme B0 and further Extreme devices */ in sky2_set_tx_stfwd()
886 } else if (dev->mtu > ETH_DATA_LEN) { in sky2_set_tx_stfwd()
898 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); in sky2_mac_init()
902 const u8 *addr = hw->dev[port]->dev_addr; in sky2_mac_init()
909 if (hw->chip_id == CHIP_ID_YUKON_XL && in sky2_mac_init()
910 hw->chip_rev == CHIP_REV_YU_XL_A0 && in sky2_mac_init()
912 /* WA DEV_472 -- looks like crossed wires on port 2 */ in sky2_mac_init()
928 spin_lock_bh(&sky2->phy_lock); in sky2_mac_init()
931 spin_unlock_bh(&sky2->phy_lock); in sky2_mac_init()
962 if (hw->dev[port]->mtu > ETH_DATA_LEN) in sky2_mac_init()
965 if (hw->chip_id == CHIP_ID_YUKON_EC_U && in sky2_mac_init()
966 hw->chip_rev == CHIP_REV_YU_EC_U_B1) in sky2_mac_init()
985 if (hw->chip_id == CHIP_ID_YUKON_EX || in sky2_mac_init()
986 hw->chip_id == CHIP_ID_YUKON_FE_P) in sky2_mac_init()
991 if (hw->chip_id == CHIP_ID_YUKON_XL) { in sky2_mac_init()
992 /* Hardware errata - clear flush mask */ in sky2_mac_init()
1002 if (hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_mac_init()
1003 hw->chip_rev == CHIP_REV_YU_FE2_A0) in sky2_mac_init()
1012 if (!(hw->flags & SKY2_HW_RAM_BUFFER)) { in sky2_mac_init()
1014 if (hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_mac_init()
1015 hw->chip_rev == CHIP_REV_YU_FE2_A0) in sky2_mac_init()
1025 if (hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_mac_init()
1026 hw->chip_rev == CHIP_REV_YU_FE2_A0) { in sky2_mac_init()
1042 end = start + space - 1; in sky2_ramset()
1051 u32 tp = space - space/4; in sky2_ramset()
1060 tp = space - 8192/8; in sky2_ramset()
1101 struct sky2_tx_le *le = sky2->tx_le + *slot; in get_tx_le()
1103 *slot = RING_NEXT(*slot, sky2->tx_ring_size); in get_tx_le()
1104 le->ctrl = 0; in get_tx_le()
1112 sky2->tx_prod = sky2->tx_cons = 0; in tx_init()
1113 sky2->tx_tcpsum = 0; in tx_init()
1114 sky2->tx_last_mss = 0; in tx_init()
1115 netdev_reset_queue(sky2->netdev); in tx_init()
1117 le = get_tx_le(sky2, &sky2->tx_prod); in tx_init()
1118 le->addr = 0; in tx_init()
1119 le->opcode = OP_ADDR64 | HW_OWNER; in tx_init()
1120 sky2->tx_last_upper = 0; in tx_init()
1134 struct sky2_rx_le *le = sky2->rx_le + sky2->rx_put; in sky2_next_rx()
1135 sky2->rx_put = RING_NEXT(sky2->rx_put, RX_LE_SIZE); in sky2_next_rx()
1136 le->ctrl = 0; in sky2_next_rx()
1145 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_threshold()
1148 return (size - 8) / sizeof(u32); in sky2_get_rx_threshold()
1157 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); in sky2_get_rx_data_size()
1159 sky2->rx_nfrags = size >> PAGE_SHIFT; in sky2_get_rx_data_size()
1160 BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr)); in sky2_get_rx_data_size()
1163 size -= sky2->rx_nfrags << PAGE_SHIFT; in sky2_get_rx_data_size()
1182 le->addr = cpu_to_le32(upper_32_bits(map)); in sky2_rx_add()
1183 le->opcode = OP_ADDR64 | HW_OWNER; in sky2_rx_add()
1187 le->addr = cpu_to_le32(lower_32_bits(map)); in sky2_rx_add()
1188 le->length = cpu_to_le16(len); in sky2_rx_add()
1189 le->opcode = op | HW_OWNER; in sky2_rx_add()
1198 sky2_rx_add(sky2, OP_PACKET, re->data_addr, sky2->rx_data_size); in sky2_rx_submit()
1200 for (i = 0; i < skb_shinfo(re->skb)->nr_frags; i++) in sky2_rx_submit()
1201 sky2_rx_add(sky2, OP_BUFFER, re->frag_addr[i], PAGE_SIZE); in sky2_rx_submit()
1208 struct sk_buff *skb = re->skb; in sky2_rx_map_skb()
1211 re->data_addr = dma_map_single(&pdev->dev, skb->data, size, in sky2_rx_map_skb()
1213 if (dma_mapping_error(&pdev->dev, re->data_addr)) in sky2_rx_map_skb()
1218 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in sky2_rx_map_skb()
1219 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in sky2_rx_map_skb()
1221 re->frag_addr[i] = skb_frag_dma_map(&pdev->dev, frag, 0, in sky2_rx_map_skb()
1225 if (dma_mapping_error(&pdev->dev, re->frag_addr[i])) in sky2_rx_map_skb()
1231 while (--i >= 0) { in sky2_rx_map_skb()
1232 dma_unmap_page(&pdev->dev, re->frag_addr[i], in sky2_rx_map_skb()
1233 skb_frag_size(&skb_shinfo(skb)->frags[i]), in sky2_rx_map_skb()
1237 dma_unmap_single(&pdev->dev, re->data_addr, in sky2_rx_map_skb()
1242 dev_warn(&pdev->dev, "%s: rx mapping error\n", in sky2_rx_map_skb()
1243 skb->dev->name); in sky2_rx_map_skb()
1244 return -EIO; in sky2_rx_map_skb()
1249 struct sk_buff *skb = re->skb; in sky2_rx_unmap_skb()
1252 dma_unmap_single(&pdev->dev, re->data_addr, in sky2_rx_unmap_skb()
1255 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) in sky2_rx_unmap_skb()
1256 dma_unmap_page(&pdev->dev, re->frag_addr[i], in sky2_rx_unmap_skb()
1257 skb_frag_size(&skb_shinfo(skb)->frags[i]), in sky2_rx_unmap_skb()
1269 le->addr = cpu_to_le32((ETH_HLEN << 16) | ETH_HLEN); in rx_set_checksum()
1270 le->ctrl = 0; in rx_set_checksum()
1271 le->opcode = OP_TCPSTART | HW_OWNER; in rx_set_checksum()
1273 sky2_write32(sky2->hw, in rx_set_checksum()
1274 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_checksum()
1275 (sky2->netdev->features & NETIF_F_RXCSUM) in rx_set_checksum()
1283 struct sky2_hw *hw = sky2->hw; in rx_set_rss()
1287 if (hw->flags & SKY2_HW_NEW_LE) { in rx_set_rss()
1289 sky2_write32(hw, SK_REG(sky2->port, RSS_CFG), HASH_ALL); in rx_set_rss()
1298 sky2_write32(hw, SK_REG(sky2->port, RSS_KEY + i * 4), in rx_set_rss()
1302 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), in rx_set_rss()
1305 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1308 sky2_write32(hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in rx_set_rss()
1313 * The RX Stop command will not work for Yukon-2 if the BMU does not
1324 struct sky2_hw *hw = sky2->hw; in sky2_rx_stop()
1325 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_stop()
1336 netdev_warn(sky2->netdev, "receiver stop failed\n"); in sky2_rx_stop()
1349 if (sky2->rx_le) in sky2_rx_clean()
1350 memset(sky2->rx_le, 0, RX_LE_BYTES); in sky2_rx_clean()
1352 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_clean()
1353 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_rx_clean()
1355 if (re->skb) { in sky2_rx_clean()
1356 sky2_rx_unmap_skb(sky2->hw->pdev, re); in sky2_rx_clean()
1357 kfree_skb(re->skb); in sky2_rx_clean()
1358 re->skb = NULL; in sky2_rx_clean()
1368 struct sky2_hw *hw = sky2->hw; in sky2_ioctl()
1369 int err = -EOPNOTSUPP; in sky2_ioctl()
1372 return -ENODEV; /* Phy still in reset */ in sky2_ioctl()
1376 data->phy_id = PHY_ADDR_MARV; in sky2_ioctl()
1382 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1383 err = __gm_phy_read(hw, sky2->port, data->reg_num & 0x1f, &val); in sky2_ioctl()
1384 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1386 data->val_out = val; in sky2_ioctl()
1391 spin_lock_bh(&sky2->phy_lock); in sky2_ioctl()
1392 err = gm_phy_write(hw, sky2->port, data->reg_num & 0x1f, in sky2_ioctl()
1393 data->val_in); in sky2_ioctl()
1394 spin_unlock_bh(&sky2->phy_lock); in sky2_ioctl()
1405 struct sky2_hw *hw = sky2->hw; in sky2_vlan_mode()
1406 u16 port = sky2->port; in sky2_vlan_mode()
1419 dev->vlan_features |= SKY2_VLAN_OFFLOADS; in sky2_vlan_mode()
1425 dev->vlan_features &= ~SKY2_VLAN_OFFLOADS; in sky2_vlan_mode()
1432 return (hw->flags & SKY2_HW_RAM_BUFFER) ? 8 : 2; in sky2_rx_pad()
1437 * make the skb non-linear with a fragment list of pages.
1444 skb = __netdev_alloc_skb(sky2->netdev, in sky2_rx_alloc()
1445 sky2->rx_data_size + sky2_rx_pad(sky2->hw), in sky2_rx_alloc()
1450 if (sky2->hw->flags & SKY2_HW_RAM_BUFFER) { in sky2_rx_alloc()
1458 start = PTR_ALIGN(skb->data, 8); in sky2_rx_alloc()
1459 skb_reserve(skb, start - skb->data); in sky2_rx_alloc()
1463 for (i = 0; i < sky2->rx_nfrags; i++) { in sky2_rx_alloc()
1480 sky2_put_idx(sky2->hw, rxq, sky2->rx_put); in sky2_rx_update()
1485 struct sky2_hw *hw = sky2->hw; in sky2_alloc_rx_skbs()
1488 sky2->rx_data_size = sky2_get_rx_data_size(sky2); in sky2_alloc_rx_skbs()
1491 for (i = 0; i < sky2->rx_pending; i++) { in sky2_alloc_rx_skbs()
1492 struct rx_ring_info *re = sky2->rx_ring + i; in sky2_alloc_rx_skbs()
1494 re->skb = sky2_rx_alloc(sky2, GFP_KERNEL); in sky2_alloc_rx_skbs()
1495 if (!re->skb) in sky2_alloc_rx_skbs()
1496 return -ENOMEM; in sky2_alloc_rx_skbs()
1498 if (sky2_rx_map_skb(hw->pdev, re, sky2->rx_data_size)) { in sky2_alloc_rx_skbs()
1499 dev_kfree_skb(re->skb); in sky2_alloc_rx_skbs()
1500 re->skb = NULL; in sky2_alloc_rx_skbs()
1501 return -ENOMEM; in sky2_alloc_rx_skbs()
1514 * extra to avoid wrap.
1518 struct sky2_hw *hw = sky2->hw; in sky2_rx_start()
1520 unsigned rxq = rxqaddr[sky2->port]; in sky2_rx_start()
1523 sky2->rx_put = sky2->rx_next = 0; in sky2_rx_start()
1527 if (pci_is_pcie(hw->pdev)) in sky2_rx_start()
1533 if (hw->chip_id == CHIP_ID_YUKON_EC_U && in sky2_rx_start()
1534 hw->chip_rev > CHIP_REV_YU_EC_U_A0) in sky2_rx_start()
1537 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); in sky2_rx_start()
1539 if (!(hw->flags & SKY2_HW_NEW_LE)) in sky2_rx_start()
1542 if (!(hw->flags & SKY2_HW_RSS_BROKEN)) in sky2_rx_start()
1543 rx_set_rss(sky2->netdev, sky2->netdev->features); in sky2_rx_start()
1546 for (i = 0; i < sky2->rx_pending; i++) { in sky2_rx_start()
1547 re = sky2->rx_ring + i; in sky2_rx_start()
1559 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF); in sky2_rx_start()
1561 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_TR_THR), thresh); in sky2_rx_start()
1562 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_ON); in sky2_rx_start()
1568 if (hw->chip_id == CHIP_ID_YUKON_EX || in sky2_rx_start()
1569 hw->chip_id == CHIP_ID_YUKON_SUPR) { in sky2_rx_start()
1577 sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_MACSEC_FLUSH_OFF); in sky2_rx_start()
1580 if (hw->chip_id >= CHIP_ID_YUKON_SUPR) { in sky2_rx_start()
1582 sky2_write16(hw, SK_REG(sky2->port, RX_GMF_FL_CTRL), in sky2_rx_start()
1586 sky2_write32(hw, Q_ADDR(txqaddr[sky2->port], Q_TEST), in sky2_rx_start()
1593 struct sky2_hw *hw = sky2->hw; in sky2_alloc_buffers()
1596 sky2->tx_le = dma_alloc_coherent(&hw->pdev->dev, in sky2_alloc_buffers()
1597 sky2->tx_ring_size * sizeof(struct sky2_tx_le), in sky2_alloc_buffers()
1598 &sky2->tx_le_map, GFP_KERNEL); in sky2_alloc_buffers()
1599 if (!sky2->tx_le) in sky2_alloc_buffers()
1602 sky2->tx_ring = kcalloc(sky2->tx_ring_size, sizeof(struct tx_ring_info), in sky2_alloc_buffers()
1604 if (!sky2->tx_ring) in sky2_alloc_buffers()
1607 sky2->rx_le = dma_alloc_coherent(&hw->pdev->dev, RX_LE_BYTES, in sky2_alloc_buffers()
1608 &sky2->rx_le_map, GFP_KERNEL); in sky2_alloc_buffers()
1609 if (!sky2->rx_le) in sky2_alloc_buffers()
1612 sky2->rx_ring = kcalloc(sky2->rx_pending, sizeof(struct rx_ring_info), in sky2_alloc_buffers()
1614 if (!sky2->rx_ring) in sky2_alloc_buffers()
1619 return -ENOMEM; in sky2_alloc_buffers()
1624 struct sky2_hw *hw = sky2->hw; in sky2_free_buffers()
1628 if (sky2->rx_le) { in sky2_free_buffers()
1629 dma_free_coherent(&hw->pdev->dev, RX_LE_BYTES, sky2->rx_le, in sky2_free_buffers()
1630 sky2->rx_le_map); in sky2_free_buffers()
1631 sky2->rx_le = NULL; in sky2_free_buffers()
1633 if (sky2->tx_le) { in sky2_free_buffers()
1634 dma_free_coherent(&hw->pdev->dev, in sky2_free_buffers()
1635 sky2->tx_ring_size * sizeof(struct sky2_tx_le), in sky2_free_buffers()
1636 sky2->tx_le, sky2->tx_le_map); in sky2_free_buffers()
1637 sky2->tx_le = NULL; in sky2_free_buffers()
1639 kfree(sky2->tx_ring); in sky2_free_buffers()
1640 kfree(sky2->rx_ring); in sky2_free_buffers()
1642 sky2->tx_ring = NULL; in sky2_free_buffers()
1643 sky2->rx_ring = NULL; in sky2_free_buffers()
1648 struct sky2_hw *hw = sky2->hw; in sky2_hw_up()
1649 unsigned port = sky2->port; in sky2_hw_up()
1652 struct net_device *otherdev = hw->dev[sky2->port^1]; in sky2_hw_up()
1657 * On dual port PCI-X card, there is an problem where status in sky2_hw_up()
1661 (cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PCIX))) { in sky2_hw_up()
1676 netdev_dbg(sky2->netdev, "ram buffer %dK\n", ramsize); in sky2_hw_up()
1680 rxspace = 8 + (2*(ramsize - 16))/3; in sky2_hw_up()
1683 sky2_ramset(hw, txqaddr[port], rxspace, ramsize - rxspace); in sky2_hw_up()
1693 if (hw->chip_id == CHIP_ID_YUKON_EX && hw->chip_rev == CHIP_REV_YU_EX_B0) in sky2_hw_up()
1697 if (hw->chip_id == CHIP_ID_YUKON_EC_U && in sky2_hw_up()
1698 hw->chip_rev == CHIP_REV_YU_EC_U_A0) in sky2_hw_up()
1701 sky2_prefetch_init(hw, txqaddr[port], sky2->tx_le_map, in sky2_hw_up()
1702 sky2->tx_ring_size - 1); in sky2_hw_up()
1704 sky2_vlan_mode(sky2->netdev, sky2->netdev->features); in sky2_hw_up()
1705 netdev_update_features(sky2->netdev); in sky2_hw_up()
1713 struct pci_dev *pdev = hw->pdev; in sky2_setup_irq()
1716 err = request_irq(pdev->irq, sky2_intr, in sky2_setup_irq()
1717 (hw->flags & SKY2_HW_USE_MSI) ? 0 : IRQF_SHARED, in sky2_setup_irq()
1720 dev_err(&pdev->dev, "cannot assign irq %d\n", pdev->irq); in sky2_setup_irq()
1722 hw->flags |= SKY2_HW_IRQ_SETUP; in sky2_setup_irq()
1724 napi_enable(&hw->napi); in sky2_setup_irq()
1737 struct sky2_hw *hw = sky2->hw; in sky2_open()
1738 unsigned port = sky2->port; in sky2_open()
1749 if (hw->ports == 1 && (err = sky2_setup_irq(hw, dev->name))) in sky2_open()
1757 if (hw->chip_id == CHIP_ID_YUKON_OPT || in sky2_open()
1758 hw->chip_id == CHIP_ID_YUKON_PRM || in sky2_open()
1759 hw->chip_id == CHIP_ID_YUKON_OP_2) in sky2_open()
1778 return (sky2->tx_prod - sky2->tx_cons) & (sky2->tx_ring_size - 1); in tx_inuse()
1784 return sky2->tx_pending - tx_inuse(sky2); in tx_avail()
1792 count = (skb_shinfo(skb)->nr_frags + 1) in tx_le_req()
1800 if (skb->ip_summed == CHECKSUM_PARTIAL) in tx_le_req()
1808 if (re->flags & TX_MAP_SINGLE) in sky2_tx_unmap()
1809 dma_unmap_single(&pdev->dev, dma_unmap_addr(re, mapaddr), in sky2_tx_unmap()
1811 else if (re->flags & TX_MAP_PAGE) in sky2_tx_unmap()
1812 dma_unmap_page(&pdev->dev, dma_unmap_addr(re, mapaddr), in sky2_tx_unmap()
1814 re->flags = 0; in sky2_tx_unmap()
1827 struct sky2_hw *hw = sky2->hw; in sky2_xmit_frame()
1841 mapping = dma_map_single(&hw->pdev->dev, skb->data, len, in sky2_xmit_frame()
1844 if (dma_mapping_error(&hw->pdev->dev, mapping)) in sky2_xmit_frame()
1847 slot = sky2->tx_prod; in sky2_xmit_frame()
1849 "tx queued, slot %u, len %d\n", slot, skb->len); in sky2_xmit_frame()
1853 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1855 le->addr = cpu_to_le32(upper); in sky2_xmit_frame()
1856 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1857 le->opcode = OP_ADDR64 | HW_OWNER; in sky2_xmit_frame()
1861 mss = skb_shinfo(skb)->gso_size; in sky2_xmit_frame()
1864 if (!(hw->flags & SKY2_HW_NEW_LE)) in sky2_xmit_frame()
1867 if (mss != sky2->tx_last_mss) { in sky2_xmit_frame()
1869 le->addr = cpu_to_le32(mss); in sky2_xmit_frame()
1871 if (hw->flags & SKY2_HW_NEW_LE) in sky2_xmit_frame()
1872 le->opcode = OP_MSS | HW_OWNER; in sky2_xmit_frame()
1874 le->opcode = OP_LRGLEN | HW_OWNER; in sky2_xmit_frame()
1875 sky2->tx_last_mss = mss; in sky2_xmit_frame()
1885 le->addr = 0; in sky2_xmit_frame()
1886 le->opcode = OP_VLAN|HW_OWNER; in sky2_xmit_frame()
1888 le->opcode |= OP_VLAN; in sky2_xmit_frame()
1889 le->length = cpu_to_be16(skb_vlan_tag_get(skb)); in sky2_xmit_frame()
1894 if (skb->ip_summed == CHECKSUM_PARTIAL) { in sky2_xmit_frame()
1896 if (hw->flags & SKY2_HW_AUTO_TX_SUM) in sky2_xmit_frame()
1903 tcpsum |= offset + skb->csum_offset; /* sum write */ in sky2_xmit_frame()
1906 if (ip_hdr(skb)->protocol == IPPROTO_UDP) in sky2_xmit_frame()
1909 if (tcpsum != sky2->tx_tcpsum) { in sky2_xmit_frame()
1910 sky2->tx_tcpsum = tcpsum; in sky2_xmit_frame()
1913 le->addr = cpu_to_le32(tcpsum); in sky2_xmit_frame()
1914 le->length = 0; /* initial checksum value */ in sky2_xmit_frame()
1915 le->ctrl = 1; /* one packet */ in sky2_xmit_frame()
1916 le->opcode = OP_TCPLISW | HW_OWNER; in sky2_xmit_frame()
1921 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1922 re->flags = TX_MAP_SINGLE; in sky2_xmit_frame()
1927 le->addr = cpu_to_le32(lower_32_bits(mapping)); in sky2_xmit_frame()
1928 le->length = cpu_to_le16(len); in sky2_xmit_frame()
1929 le->ctrl = ctrl; in sky2_xmit_frame()
1930 le->opcode = mss ? (OP_LARGESEND | HW_OWNER) : (OP_PACKET | HW_OWNER); in sky2_xmit_frame()
1933 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { in sky2_xmit_frame()
1934 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in sky2_xmit_frame()
1936 mapping = skb_frag_dma_map(&hw->pdev->dev, frag, 0, in sky2_xmit_frame()
1939 if (dma_mapping_error(&hw->pdev->dev, mapping)) in sky2_xmit_frame()
1943 if (upper != sky2->tx_last_upper) { in sky2_xmit_frame()
1945 le->addr = cpu_to_le32(upper); in sky2_xmit_frame()
1946 sky2->tx_last_upper = upper; in sky2_xmit_frame()
1947 le->opcode = OP_ADDR64 | HW_OWNER; in sky2_xmit_frame()
1950 re = sky2->tx_ring + slot; in sky2_xmit_frame()
1951 re->flags = TX_MAP_PAGE; in sky2_xmit_frame()
1956 le->addr = cpu_to_le32(lower_32_bits(mapping)); in sky2_xmit_frame()
1957 le->length = cpu_to_le16(skb_frag_size(frag)); in sky2_xmit_frame()
1958 le->ctrl = ctrl; in sky2_xmit_frame()
1959 le->opcode = OP_BUFFER | HW_OWNER; in sky2_xmit_frame()
1962 re->skb = skb; in sky2_xmit_frame()
1963 le->ctrl |= EOP; in sky2_xmit_frame()
1965 sky2->tx_prod = slot; in sky2_xmit_frame()
1970 netdev_sent_queue(dev, skb->len); in sky2_xmit_frame()
1971 sky2_put_idx(hw, txqaddr[sky2->port], sky2->tx_prod); in sky2_xmit_frame()
1976 for (i = sky2->tx_prod; i != slot; i = RING_NEXT(i, sky2->tx_ring_size)) { in sky2_xmit_frame()
1977 re = sky2->tx_ring + i; in sky2_xmit_frame()
1979 sky2_tx_unmap(hw->pdev, re); in sky2_xmit_frame()
1984 dev_warn(&hw->pdev->dev, "%s: tx mapping error\n", dev->name); in sky2_xmit_frame()
1993 * 1. The hardware will tell us about partial completion of multi-part
2001 struct net_device *dev = sky2->netdev; in sky2_tx_complete()
2005 BUG_ON(done >= sky2->tx_ring_size); in sky2_tx_complete()
2007 for (idx = sky2->tx_cons; idx != done; in sky2_tx_complete()
2008 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_tx_complete()
2009 struct tx_ring_info *re = sky2->tx_ring + idx; in sky2_tx_complete()
2010 struct sk_buff *skb = re->skb; in sky2_tx_complete()
2012 sky2_tx_unmap(sky2->hw->pdev, re); in sky2_tx_complete()
2019 bytes_compl += skb->len; in sky2_tx_complete()
2021 re->skb = NULL; in sky2_tx_complete()
2024 sky2->tx_next = RING_NEXT(idx, sky2->tx_ring_size); in sky2_tx_complete()
2028 sky2->tx_cons = idx; in sky2_tx_complete()
2033 u64_stats_update_begin(&sky2->tx_stats.syncp); in sky2_tx_complete()
2034 sky2->tx_stats.packets += pkts_compl; in sky2_tx_complete()
2035 sky2->tx_stats.bytes += bytes_compl; in sky2_tx_complete()
2036 u64_stats_update_end(&sky2->tx_stats.syncp); in sky2_tx_complete()
2065 struct sky2_hw *hw = sky2->hw; in sky2_hw_down()
2066 unsigned port = sky2->port; in sky2_hw_down()
2086 if (!(hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0 && in sky2_hw_down()
2087 port == 0 && hw->dev[1] && netif_running(hw->dev[1]))) in sky2_hw_down()
2100 spin_lock_bh(&sky2->phy_lock); in sky2_hw_down()
2102 spin_unlock_bh(&sky2->phy_lock); in sky2_hw_down()
2107 sky2_tx_complete(sky2, sky2->tx_prod); in sky2_hw_down()
2114 struct sky2_hw *hw = sky2->hw; in sky2_close()
2117 if (!sky2->tx_le) in sky2_close()
2122 if (hw->ports == 1) { in sky2_close()
2126 napi_disable(&hw->napi); in sky2_close()
2127 free_irq(hw->pdev->irq, hw); in sky2_close()
2128 hw->flags &= ~SKY2_HW_IRQ_SETUP; in sky2_close()
2134 imask &= ~portirq_msk[sky2->port]; in sky2_close()
2138 synchronize_irq(hw->pdev->irq); in sky2_close()
2139 napi_synchronize(&hw->napi); in sky2_close()
2151 if (hw->flags & SKY2_HW_FIBRE_PHY) in sky2_phy_speed()
2154 if (!(hw->flags & SKY2_HW_GIGABIT)) { in sky2_phy_speed()
2173 struct sky2_hw *hw = sky2->hw; in sky2_link_up()
2174 unsigned port = sky2->port; in sky2_link_up()
2188 netif_carrier_on(sky2->netdev); in sky2_link_up()
2190 mod_timer(&hw->watchdog_timer, jiffies + 1); in sky2_link_up()
2196 netif_info(sky2, link, sky2->netdev, in sky2_link_up()
2198 sky2->speed, in sky2_link_up()
2199 sky2->duplex == DUPLEX_FULL ? "full" : "half", in sky2_link_up()
2200 fc_name[sky2->flow_status]); in sky2_link_up()
2205 struct sky2_hw *hw = sky2->hw; in sky2_link_down()
2206 unsigned port = sky2->port; in sky2_link_down()
2215 netif_carrier_off(sky2->netdev); in sky2_link_down()
2220 netif_info(sky2, link, sky2->netdev, "Link is down\n"); in sky2_link_down()
2235 struct sky2_hw *hw = sky2->hw; in sky2_autoneg_done()
2236 unsigned port = sky2->port; in sky2_autoneg_done()
2242 netdev_err(sky2->netdev, "remote fault\n"); in sky2_autoneg_done()
2243 return -1; in sky2_autoneg_done()
2247 netdev_err(sky2->netdev, "speed/duplex mismatch\n"); in sky2_autoneg_done()
2248 return -1; in sky2_autoneg_done()
2251 sky2->speed = sky2_phy_speed(hw, aux); in sky2_autoneg_done()
2252 sky2->duplex = (aux & PHY_M_PS_FULL_DUP) ? DUPLEX_FULL : DUPLEX_HALF; in sky2_autoneg_done()
2257 if (hw->flags & SKY2_HW_FIBRE_PHY) { in sky2_autoneg_done()
2272 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2275 sky2->flow_status = FC_BOTH; in sky2_autoneg_done()
2277 sky2->flow_status = FC_RX; in sky2_autoneg_done()
2280 sky2->flow_status = FC_TX; in sky2_autoneg_done()
2283 if (sky2->duplex == DUPLEX_HALF && sky2->speed < SPEED_1000 && in sky2_autoneg_done()
2284 !(hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX)) in sky2_autoneg_done()
2285 sky2->flow_status = FC_NONE; in sky2_autoneg_done()
2287 if (sky2->flow_status & FC_TX) in sky2_autoneg_done()
2298 struct net_device *dev = hw->dev[port]; in sky2_phy_intr()
2305 spin_lock(&sky2->phy_lock); in sky2_phy_intr()
2309 netif_info(sky2, intr, sky2->netdev, "phy interrupt status 0x%x 0x%x\n", in sky2_phy_intr()
2320 sky2->speed = sky2_phy_speed(hw, phystat); in sky2_phy_intr()
2323 sky2->duplex = in sky2_phy_intr()
2333 spin_unlock(&sky2->phy_lock); in sky2_phy_intr()
2336 /* Special quick link interrupt (Yukon-2 Optima only) */
2339 struct sky2_port *sky2 = netdev_priv(hw->dev[0]); in sky2_qlink_intr()
2363 struct sky2_hw *hw = sky2->hw; in sky2_tx_timeout()
2368 sky2->tx_cons, sky2->tx_prod, in sky2_tx_timeout()
2369 sky2_read16(hw, sky2->port == 0 ? STAT_TXA1_RIDX : STAT_TXA2_RIDX), in sky2_tx_timeout()
2370 sky2_read16(hw, Q_ADDR(txqaddr[sky2->port], Q_DONE))); in sky2_tx_timeout()
2373 schedule_work(&hw->restart_work); in sky2_tx_timeout()
2379 struct sky2_hw *hw = sky2->hw; in sky2_change_mtu()
2380 unsigned port = sky2->port; in sky2_change_mtu()
2386 dev->mtu = new_mtu; in sky2_change_mtu()
2396 napi_disable(&hw->napi); in sky2_change_mtu()
2399 synchronize_irq(hw->pdev->irq); in sky2_change_mtu()
2401 if (!(hw->flags & SKY2_HW_RAM_BUFFER)) in sky2_change_mtu()
2409 dev->mtu = new_mtu; in sky2_change_mtu()
2413 if (sky2->speed > SPEED_100) in sky2_change_mtu()
2418 if (dev->mtu > ETH_DATA_LEN) in sky2_change_mtu()
2433 napi_enable(&hw->napi); in sky2_change_mtu()
2451 if (!IS_ALIGNED(re->data_addr + ETH_HLEN, sizeof(u32))) in needs_copy()
2464 skb = netdev_alloc_skb_ip_align(sky2->netdev, length); in receive_copy()
2466 dma_sync_single_for_cpu(&sky2->hw->pdev->dev, re->data_addr, in receive_copy()
2468 skb_copy_from_linear_data(re->skb, skb->data, length); in receive_copy()
2469 skb->ip_summed = re->skb->ip_summed; in receive_copy()
2470 skb->csum = re->skb->csum; in receive_copy()
2471 skb_copy_hash(skb, re->skb); in receive_copy()
2472 __vlan_hwaccel_copy_tag(skb, re->skb); in receive_copy()
2474 dma_sync_single_for_device(&sky2->hw->pdev->dev, in receive_copy()
2475 re->data_addr, length, in receive_copy()
2477 __vlan_hwaccel_clear_tag(re->skb); in receive_copy()
2478 skb_clear_hash(re->skb); in receive_copy()
2479 re->skb->ip_summed = CHECKSUM_NONE; in receive_copy()
2494 skb->tail += size; in skb_put_frags()
2495 skb->len += size; in skb_put_frags()
2496 length -= size; in skb_put_frags()
2498 num_frags = skb_shinfo(skb)->nr_frags; in skb_put_frags()
2500 skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; in skb_put_frags()
2505 --skb_shinfo(skb)->nr_frags; in skb_put_frags()
2510 skb->data_len += size; in skb_put_frags()
2511 skb->truesize += PAGE_SIZE; in skb_put_frags()
2512 skb->len += size; in skb_put_frags()
2513 length -= size; in skb_put_frags()
2518 /* Normal packet - take skb from ring element and put in a new one */
2525 unsigned hdr_space = sky2->rx_data_size; in receive_new()
2531 if (sky2_rx_map_skb(sky2->hw->pdev, &nre, hdr_space)) in receive_new()
2534 skb = re->skb; in receive_new()
2535 sky2_rx_unmap_skb(sky2->hw->pdev, re); in receive_new()
2536 prefetch(skb->data); in receive_new()
2539 if (skb_shinfo(skb)->nr_frags) in receive_new()
2559 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; in sky2_receive()
2565 sky2->rx_next, status, length); in sky2_receive()
2567 sky2->rx_next = (sky2->rx_next + 1) % sky2->rx_pending; in sky2_receive()
2568 prefetch(sky2->rx_ring + sky2->rx_next); in sky2_receive()
2570 if (skb_vlan_tag_present(re->skb)) in sky2_receive()
2571 count -= VLAN_HLEN; /* Account for vlan tag */ in sky2_receive()
2577 if (sky2->hw->chip_id == CHIP_ID_YUKON_FE_P && in sky2_receive()
2578 sky2->hw->chip_rev == CHIP_REV_YU_FE2_A0 && in sky2_receive()
2598 dev->stats.rx_dropped += (skb == NULL); in sky2_receive()
2606 ++dev->stats.rx_errors; in sky2_receive()
2632 if (skb->ip_summed == CHECKSUM_NONE) in sky2_skb_rx()
2635 napi_gro_receive(&sky2->hw->napi, skb); in sky2_skb_rx()
2641 struct net_device *dev = hw->dev[port]; in sky2_rx_done()
2647 u64_stats_update_begin(&sky2->rx_stats.syncp); in sky2_rx_done()
2648 sky2->rx_stats.packets += packets; in sky2_rx_done()
2649 sky2->rx_stats.bytes += bytes; in sky2_rx_done()
2650 u64_stats_update_end(&sky2->rx_stats.syncp); in sky2_rx_done()
2652 sky2->last_rx = jiffies; in sky2_rx_done()
2659 BUG_ON(sky2->hw->flags & SKY2_HW_NEW_LE); in sky2_rx_checksum()
2667 struct sk_buff *skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_checksum()
2668 skb->ip_summed = CHECKSUM_COMPLETE; in sky2_rx_checksum()
2669 skb->csum = le16_to_cpu(status); in sky2_rx_checksum()
2671 dev_notice(&sky2->hw->pdev->dev, in sky2_rx_checksum()
2673 sky2->netdev->name, status); in sky2_rx_checksum()
2679 sky2->netdev->features &= ~NETIF_F_RXCSUM; in sky2_rx_checksum()
2680 sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_rx_checksum()
2689 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_tag()
2697 skb = sky2->rx_ring[sky2->rx_next].skb; in sky2_rx_hash()
2714 struct sky2_status_le *le = hw->st_le + hw->st_idx; in sky2_status_intr()
2720 u8 opcode = le->opcode; in sky2_status_intr()
2725 hw->st_idx = RING_NEXT(hw->st_idx, hw->st_size); in sky2_status_intr()
2727 port = le->css & CSS_LINK_BIT; in sky2_status_intr()
2728 dev = hw->dev[port]; in sky2_status_intr()
2730 length = le16_to_cpu(le->length); in sky2_status_intr()
2731 status = le32_to_cpu(le->status); in sky2_status_intr()
2733 le->opcode = 0; in sky2_status_intr()
2744 if (hw->flags & SKY2_HW_NEW_LE) { in sky2_status_intr()
2745 if ((dev->features & NETIF_F_RXCSUM) && in sky2_status_intr()
2746 (le->css & (CSS_ISIPV4 | CSS_ISIPV6)) && in sky2_status_intr()
2747 (le->css & CSS_TCPUDPCSOK)) in sky2_status_intr()
2748 skb->ip_summed = CHECKSUM_UNNECESSARY; in sky2_status_intr()
2750 skb->ip_summed = CHECKSUM_NONE; in sky2_status_intr()
2753 skb->protocol = eth_type_trans(skb, dev); in sky2_status_intr()
2769 if (likely(dev->features & NETIF_F_RXCSUM)) in sky2_status_intr()
2779 sky2_tx_done(hw->dev[0], status & 0xfff); in sky2_status_intr()
2780 if (hw->dev[1]) in sky2_status_intr()
2781 sky2_tx_done(hw->dev[1], in sky2_status_intr()
2790 } while (hw->st_idx != idx); in sky2_status_intr()
2804 struct net_device *dev = hw->dev[port]; in sky2_hw_error()
2844 struct pci_dev *pdev = hw->pdev; in sky2_hw_intr()
2859 dev_err(&pdev->dev, "PCI hardware error (0x%x)\n", in sky2_hw_intr()
2868 /* PCI-Express uncorrectable Error occurred */ in sky2_hw_intr()
2876 dev_err(&pdev->dev, "PCI Express error (0x%x)\n", err); in sky2_hw_intr()
2891 struct net_device *dev = hw->dev[port]; in sky2_mac_intr()
2904 ++dev->stats.rx_fifo_errors; in sky2_mac_intr()
2909 ++dev->stats.tx_fifo_errors; in sky2_mac_intr()
2917 struct net_device *dev = hw->dev[port]; in sky2_le_error()
2920 dev_err(&hw->pdev->dev, "%s: descriptor error q=%#x get=%u put=%u\n", in sky2_le_error()
2921 dev->name, (unsigned) q, (unsigned) idx, in sky2_le_error()
2930 struct sky2_hw *hw = sky2->hw; in sky2_rx_hung()
2931 unsigned port = sky2->port; in sky2_rx_hung()
2939 if (sky2->check.last == sky2->last_rx && in sky2_rx_hung()
2940 ((mac_rp == sky2->check.mac_rp && in sky2_rx_hung()
2941 mac_lev != 0 && mac_lev >= sky2->check.mac_lev) || in sky2_rx_hung()
2943 (fifo_rp == sky2->check.fifo_rp && in sky2_rx_hung()
2944 fifo_lev != 0 && fifo_lev >= sky2->check.fifo_lev))) { in sky2_rx_hung()
2951 sky2->check.last = sky2->last_rx; in sky2_rx_hung()
2952 sky2->check.mac_rp = mac_rp; in sky2_rx_hung()
2953 sky2->check.mac_lev = mac_lev; in sky2_rx_hung()
2954 sky2->check.fifo_rp = fifo_rp; in sky2_rx_hung()
2955 sky2->check.fifo_lev = fifo_lev; in sky2_rx_hung()
2966 napi_schedule(&hw->napi); in sky2_watchdog()
2970 for (i = 0; i < hw->ports; i++) { in sky2_watchdog()
2971 struct net_device *dev = hw->dev[i]; in sky2_watchdog()
2977 if ((hw->flags & SKY2_HW_RAM_BUFFER) && in sky2_watchdog()
2980 schedule_work(&hw->restart_work); in sky2_watchdog()
2989 mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ)); in sky2_watchdog()
2996 dev_warn(&hw->pdev->dev, "error interrupt status=%#x\n", status); in sky2_err_intr()
3039 while ((idx = sky2_read16(hw, STAT_PUT_IDX)) != hw->st_idx) { in sky2_poll()
3040 work_done += sky2_status_intr(hw, work_limit - work_done, idx); in sky2_poll()
3065 prefetch(&hw->st_le[hw->st_idx]); in sky2_intr()
3067 napi_schedule(&hw->napi); in sky2_intr()
3077 napi_schedule(&sky2->hw->napi); in sky2_netpoll()
3084 switch (hw->chip_id) { in sky2_mhz()
3129 hw->chip_id = sky2_read8(hw, B2_CHIP_ID); in sky2_init()
3130 hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; in sky2_init()
3132 switch (hw->chip_id) { in sky2_init()
3134 hw->flags = SKY2_HW_GIGABIT | SKY2_HW_NEWER_PHY; in sky2_init()
3135 if (hw->chip_rev < CHIP_REV_YU_XL_A2) in sky2_init()
3136 hw->flags |= SKY2_HW_RSS_BROKEN; in sky2_init()
3140 hw->flags = SKY2_HW_GIGABIT in sky2_init()
3146 hw->flags = SKY2_HW_GIGABIT in sky2_init()
3153 if (hw->chip_rev != CHIP_REV_YU_EX_B0) in sky2_init()
3154 hw->flags |= SKY2_HW_AUTO_TX_SUM; in sky2_init()
3159 if (hw->chip_rev == CHIP_REV_YU_EC_A1) { in sky2_init()
3160 dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n"); in sky2_init()
3161 return -EOPNOTSUPP; in sky2_init()
3163 hw->flags = SKY2_HW_GIGABIT | SKY2_HW_RSS_BROKEN; in sky2_init()
3167 hw->flags = SKY2_HW_RSS_BROKEN; in sky2_init()
3171 hw->flags = SKY2_HW_NEWER_PHY in sky2_init()
3177 if (hw->chip_rev == CHIP_REV_YU_FE2_A0) in sky2_init()
3178 hw->flags |= SKY2_HW_VLAN_BROKEN | SKY2_HW_RSS_CHKSUM; in sky2_init()
3182 hw->flags = SKY2_HW_GIGABIT in sky2_init()
3188 if (hw->chip_rev == CHIP_REV_YU_SU_A0) in sky2_init()
3189 hw->flags |= SKY2_HW_RSS_CHKSUM; in sky2_init()
3193 hw->flags = SKY2_HW_GIGABIT in sky2_init()
3200 hw->flags = SKY2_HW_GIGABIT in sky2_init()
3206 dev_err(&hw->pdev->dev, "unsupported chip type 0x%x\n", in sky2_init()
3207 hw->chip_id); in sky2_init()
3208 return -EOPNOTSUPP; in sky2_init()
3211 hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); in sky2_init()
3212 if (hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P') in sky2_init()
3213 hw->flags |= SKY2_HW_FIBRE_PHY; in sky2_init()
3215 hw->ports = 1; in sky2_init()
3219 ++hw->ports; in sky2_init()
3223 hw->flags |= SKY2_HW_RAM_BUFFER; in sky2_init()
3230 struct pci_dev *pdev = hw->pdev; in sky2_reset()
3236 if (hw->chip_id == CHIP_ID_YUKON_EX in sky2_reset()
3237 || hw->chip_id == CHIP_ID_YUKON_SUPR) { in sky2_reset()
3244 * - ASF firmware may malfunction in sky2_reset()
3245 * - Yukon-Supreme: Parallel FLASH doesn't support divided clocks in sky2_reset()
3274 dev_info(&pdev->dev, "ignoring stuck error report bit\n"); in sky2_reset()
3282 for (i = 0; i < hw->ports; i++) { in sky2_reset()
3286 if (hw->chip_id == CHIP_ID_YUKON_EX || in sky2_reset()
3287 hw->chip_id == CHIP_ID_YUKON_SUPR) in sky2_reset()
3294 if (hw->chip_id == CHIP_ID_YUKON_SUPR && hw->chip_rev > CHIP_REV_YU_SU_B0) { in sky2_reset()
3299 if (hw->chip_id == CHIP_ID_YUKON_OPT || in sky2_reset()
3300 hw->chip_id == CHIP_ID_YUKON_PRM || in sky2_reset()
3301 hw->chip_id == CHIP_ID_YUKON_OP_2) { in sky2_reset()
3304 if (hw->chip_id == CHIP_ID_YUKON_OPT && hw->chip_rev == 0) { in sky2_reset()
3305 /* disable PCI-E PHY power down (set PHY reg 0x80, bit 7 */ in sky2_reset()
3311 /* re-enable PEX PM in PEX PHY debug reg. 8 (clear bit 12) */ in sky2_reset()
3329 sky2_pci_write16(hw, pdev->pcie_cap + PCI_EXP_LNKCTL, in sky2_reset()
3332 if (hw->chip_id == CHIP_ID_YUKON_PRM && in sky2_reset()
3333 hw->chip_rev == CHIP_REV_YU_PRM_A0) { in sky2_reset()
3345 /* re-enable PEX PM in PEX PHY debug reg. 8 (clear bit 12) */ in sky2_reset()
3364 for (i = 0; i < hw->ports; i++) in sky2_reset()
3368 for (i = 0; i < hw->ports; i++) { in sky2_reset()
3387 for (i = 0; i < hw->ports; i++) in sky2_reset()
3390 memset(hw->st_le, 0, hw->st_size * sizeof(struct sky2_status_le)); in sky2_reset()
3391 hw->st_idx = 0; in sky2_reset()
3396 sky2_write32(hw, STAT_LIST_ADDR_LO, hw->st_dma); in sky2_reset()
3397 sky2_write32(hw, STAT_LIST_ADDR_HI, (u64) hw->st_dma >> 32); in sky2_reset()
3400 sky2_write16(hw, STAT_LAST_IDX, hw->st_size - 1); in sky2_reset()
3405 /* set Status-FIFO ISR watermark */ in sky2_reset()
3406 if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev == 0) in sky2_reset()
3460 if (hw->flags & SKY2_HW_IRQ_SETUP) { in sky2_all_down()
3464 synchronize_irq(hw->pdev->irq); in sky2_all_down()
3465 napi_disable(&hw->napi); in sky2_all_down()
3468 for (i = 0; i < hw->ports; i++) { in sky2_all_down()
3469 struct net_device *dev = hw->dev[i]; in sky2_all_down()
3486 for (i = 0; i < hw->ports; i++) { in sky2_all_up()
3487 struct net_device *dev = hw->dev[i]; in sky2_all_up()
3499 if (hw->flags & SKY2_HW_IRQ_SETUP) { in sky2_all_up()
3503 napi_enable(&hw->napi); in sky2_all_up()
3529 wol->supported = sky2_wol_supported(sky2->hw); in sky2_get_wol()
3530 wol->wolopts = sky2->wol; in sky2_get_wol()
3536 struct sky2_hw *hw = sky2->hw; in sky2_set_wol()
3540 if ((wol->wolopts & ~sky2_wol_supported(sky2->hw)) || in sky2_set_wol()
3541 !device_can_wakeup(&hw->pdev->dev)) in sky2_set_wol()
3542 return -EOPNOTSUPP; in sky2_set_wol()
3544 sky2->wol = wol->wolopts; in sky2_set_wol()
3546 for (i = 0; i < hw->ports; i++) { in sky2_set_wol()
3547 struct net_device *dev = hw->dev[i]; in sky2_set_wol()
3550 if (sky2->wol) in sky2_set_wol()
3553 device_set_wakeup_enable(&hw->pdev->dev, enable_wakeup); in sky2_set_wol()
3566 if (hw->flags & SKY2_HW_GIGABIT) in sky2_supported_modes()
3579 struct sky2_hw *hw = sky2->hw; in sky2_get_link_ksettings()
3583 cmd->base.phy_address = PHY_ADDR_MARV; in sky2_get_link_ksettings()
3585 cmd->base.port = PORT_TP; in sky2_get_link_ksettings()
3586 cmd->base.speed = sky2->speed; in sky2_get_link_ksettings()
3589 cmd->base.speed = SPEED_1000; in sky2_get_link_ksettings()
3590 cmd->base.port = PORT_FIBRE; in sky2_get_link_ksettings()
3594 advertising = sky2->advertising; in sky2_get_link_ksettings()
3595 cmd->base.autoneg = (sky2->flags & SKY2_FLAG_AUTO_SPEED) in sky2_get_link_ksettings()
3597 cmd->base.duplex = sky2->duplex; in sky2_get_link_ksettings()
3599 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported, in sky2_get_link_ksettings()
3601 ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising, in sky2_get_link_ksettings()
3611 const struct sky2_hw *hw = sky2->hw; in sky2_set_link_ksettings()
3616 cmd->link_modes.advertising); in sky2_set_link_ksettings()
3618 if (cmd->base.autoneg == AUTONEG_ENABLE) { in sky2_set_link_ksettings()
3620 return -EINVAL; in sky2_set_link_ksettings()
3623 sky2->advertising = new_advertising | in sky2_set_link_ksettings()
3627 sky2->advertising = new_advertising | in sky2_set_link_ksettings()
3631 sky2->flags |= SKY2_FLAG_AUTO_SPEED; in sky2_set_link_ksettings()
3632 sky2->duplex = -1; in sky2_set_link_ksettings()
3633 sky2->speed = -1; in sky2_set_link_ksettings()
3636 u32 speed = cmd->base.speed; in sky2_set_link_ksettings()
3640 if (cmd->base.duplex == DUPLEX_FULL) in sky2_set_link_ksettings()
3642 else if (cmd->base.duplex == DUPLEX_HALF) in sky2_set_link_ksettings()
3645 return -EINVAL; in sky2_set_link_ksettings()
3648 if (cmd->base.duplex == DUPLEX_FULL) in sky2_set_link_ksettings()
3650 else if (cmd->base.duplex == DUPLEX_HALF) in sky2_set_link_ksettings()
3653 return -EINVAL; in sky2_set_link_ksettings()
3657 if (cmd->base.duplex == DUPLEX_FULL) in sky2_set_link_ksettings()
3659 else if (cmd->base.duplex == DUPLEX_HALF) in sky2_set_link_ksettings()
3662 return -EINVAL; in sky2_set_link_ksettings()
3665 return -EINVAL; in sky2_set_link_ksettings()
3669 return -EINVAL; in sky2_set_link_ksettings()
3671 sky2->speed = speed; in sky2_set_link_ksettings()
3672 sky2->duplex = cmd->base.duplex; in sky2_set_link_ksettings()
3673 sky2->flags &= ~SKY2_FLAG_AUTO_SPEED; in sky2_set_link_ksettings()
3689 strscpy(info->driver, DRV_NAME, sizeof(info->driver)); in sky2_get_drvinfo()
3690 strscpy(info->version, DRV_VERSION, sizeof(info->version)); in sky2_get_drvinfo()
3691 strscpy(info->bus_info, pci_name(sky2->hw->pdev), in sky2_get_drvinfo()
3692 sizeof(info->bus_info)); in sky2_get_drvinfo()
3742 return sky2->msg_enable; in sky2_get_msglevel()
3749 if (!netif_running(dev) || !(sky2->flags & SKY2_FLAG_AUTO_SPEED)) in sky2_nway_reset()
3750 return -EINVAL; in sky2_nway_reset()
3760 struct sky2_hw *hw = sky2->hw; in sky2_phy_stats()
3761 unsigned port = sky2->port; in sky2_phy_stats()
3774 sky2->msg_enable = value; in sky2_set_msglevel()
3783 return -EOPNOTSUPP; in sky2_get_sset_count()
3811 struct sky2_hw *hw = sky2->hw; in sky2_set_mac_address()
3812 unsigned port = sky2->port; in sky2_set_mac_address()
3815 if (!is_valid_ether_addr(addr->sa_data)) in sky2_set_mac_address()
3816 return -EADDRNOTAVAIL; in sky2_set_mac_address()
3818 eth_hw_addr_set(dev, addr->sa_data); in sky2_set_mac_address()
3819 memcpy_toio(hw->regs + B2_MAC_1 + port * 8, in sky2_set_mac_address()
3820 dev->dev_addr, ETH_ALEN); in sky2_set_mac_address()
3821 memcpy_toio(hw->regs + B2_MAC_2 + port * 8, in sky2_set_mac_address()
3822 dev->dev_addr, ETH_ALEN); in sky2_set_mac_address()
3825 gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); in sky2_set_mac_address()
3828 gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); in sky2_set_mac_address()
3844 struct sky2_hw *hw = sky2->hw; in sky2_set_multicast()
3845 unsigned port = sky2->port; in sky2_set_multicast()
3852 rx_pause = (sky2->flow_status == FC_RX || sky2->flow_status == FC_BOTH); in sky2_set_multicast()
3858 if (dev->flags & IFF_PROMISC) /* promiscuous */ in sky2_set_multicast()
3860 else if (dev->flags & IFF_ALLMULTI) in sky2_set_multicast()
3871 sky2_add_filter(filter, ha->addr); in sky2_set_multicast()
3890 struct sky2_hw *hw = sky2->hw; in sky2_get_stats()
3891 unsigned port = sky2->port; in sky2_get_stats()
3896 start = u64_stats_fetch_begin(&sky2->rx_stats.syncp); in sky2_get_stats()
3897 _bytes = sky2->rx_stats.bytes; in sky2_get_stats()
3898 _packets = sky2->rx_stats.packets; in sky2_get_stats()
3899 } while (u64_stats_fetch_retry(&sky2->rx_stats.syncp, start)); in sky2_get_stats()
3901 stats->rx_packets = _packets; in sky2_get_stats()
3902 stats->rx_bytes = _bytes; in sky2_get_stats()
3905 start = u64_stats_fetch_begin(&sky2->tx_stats.syncp); in sky2_get_stats()
3906 _bytes = sky2->tx_stats.bytes; in sky2_get_stats()
3907 _packets = sky2->tx_stats.packets; in sky2_get_stats()
3908 } while (u64_stats_fetch_retry(&sky2->tx_stats.syncp, start)); in sky2_get_stats()
3910 stats->tx_packets = _packets; in sky2_get_stats()
3911 stats->tx_bytes = _bytes; in sky2_get_stats()
3913 stats->multicast = get_stats32(hw, port, GM_RXF_MC_OK) in sky2_get_stats()
3916 stats->collisions = get_stats32(hw, port, GM_TXF_COL); in sky2_get_stats()
3918 stats->rx_length_errors = get_stats32(hw, port, GM_RXF_LNG_ERR); in sky2_get_stats()
3919 stats->rx_crc_errors = get_stats32(hw, port, GM_RXF_FCS_ERR); in sky2_get_stats()
3920 stats->rx_frame_errors = get_stats32(hw, port, GM_RXF_SHT) in sky2_get_stats()
3922 stats->rx_over_errors = get_stats32(hw, port, GM_RXE_FIFO_OV); in sky2_get_stats()
3924 stats->rx_dropped = dev->stats.rx_dropped; in sky2_get_stats()
3925 stats->rx_fifo_errors = dev->stats.rx_fifo_errors; in sky2_get_stats()
3926 stats->tx_fifo_errors = dev->stats.tx_fifo_errors; in sky2_get_stats()
3934 struct sky2_hw *hw = sky2->hw; in sky2_led()
3935 unsigned port = sky2->port; in sky2_led()
3937 spin_lock_bh(&sky2->phy_lock); in sky2_led()
3938 if (hw->chip_id == CHIP_ID_YUKON_EC_U || in sky2_led()
3939 hw->chip_id == CHIP_ID_YUKON_EX || in sky2_led()
3940 hw->chip_id == CHIP_ID_YUKON_SUPR) { in sky2_led()
3985 spin_unlock_bh(&sky2->phy_lock); in sky2_led()
4016 switch (sky2->flow_mode) { in sky2_get_pauseparam()
4018 ecmd->tx_pause = ecmd->rx_pause = 0; in sky2_get_pauseparam()
4021 ecmd->tx_pause = 1, ecmd->rx_pause = 0; in sky2_get_pauseparam()
4024 ecmd->tx_pause = 0, ecmd->rx_pause = 1; in sky2_get_pauseparam()
4027 ecmd->tx_pause = ecmd->rx_pause = 1; in sky2_get_pauseparam()
4030 ecmd->autoneg = (sky2->flags & SKY2_FLAG_AUTO_PAUSE) in sky2_get_pauseparam()
4039 if (ecmd->autoneg == AUTONEG_ENABLE) in sky2_set_pauseparam()
4040 sky2->flags |= SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4042 sky2->flags &= ~SKY2_FLAG_AUTO_PAUSE; in sky2_set_pauseparam()
4044 sky2->flow_mode = sky2_flow(ecmd->rx_pause, ecmd->tx_pause); in sky2_set_pauseparam()
4058 struct sky2_hw *hw = sky2->hw; in sky2_get_coalesce()
4061 ecmd->tx_coalesce_usecs = 0; in sky2_get_coalesce()
4064 ecmd->tx_coalesce_usecs = sky2_clk2us(hw, clks); in sky2_get_coalesce()
4066 ecmd->tx_max_coalesced_frames = sky2_read16(hw, STAT_TX_IDX_TH); in sky2_get_coalesce()
4069 ecmd->rx_coalesce_usecs = 0; in sky2_get_coalesce()
4072 ecmd->rx_coalesce_usecs = sky2_clk2us(hw, clks); in sky2_get_coalesce()
4074 ecmd->rx_max_coalesced_frames = sky2_read8(hw, STAT_FIFO_WM); in sky2_get_coalesce()
4077 ecmd->rx_coalesce_usecs_irq = 0; in sky2_get_coalesce()
4080 ecmd->rx_coalesce_usecs_irq = sky2_clk2us(hw, clks); in sky2_get_coalesce()
4083 ecmd->rx_max_coalesced_frames_irq = sky2_read8(hw, STAT_FIFO_ISR_WM); in sky2_get_coalesce()
4095 struct sky2_hw *hw = sky2->hw; in sky2_set_coalesce()
4098 if (ecmd->tx_coalesce_usecs > tmax || in sky2_set_coalesce()
4099 ecmd->rx_coalesce_usecs > tmax || in sky2_set_coalesce()
4100 ecmd->rx_coalesce_usecs_irq > tmax) in sky2_set_coalesce()
4101 return -EINVAL; in sky2_set_coalesce()
4103 if (ecmd->tx_max_coalesced_frames >= sky2->tx_ring_size-1) in sky2_set_coalesce()
4104 return -EINVAL; in sky2_set_coalesce()
4105 if (ecmd->rx_max_coalesced_frames > RX_MAX_PENDING) in sky2_set_coalesce()
4106 return -EINVAL; in sky2_set_coalesce()
4107 if (ecmd->rx_max_coalesced_frames_irq > RX_MAX_PENDING) in sky2_set_coalesce()
4108 return -EINVAL; in sky2_set_coalesce()
4110 if (ecmd->tx_coalesce_usecs == 0) in sky2_set_coalesce()
4114 sky2_us2clk(hw, ecmd->tx_coalesce_usecs)); in sky2_set_coalesce()
4117 sky2_write16(hw, STAT_TX_IDX_TH, ecmd->tx_max_coalesced_frames); in sky2_set_coalesce()
4119 if (ecmd->rx_coalesce_usecs == 0) in sky2_set_coalesce()
4123 sky2_us2clk(hw, ecmd->rx_coalesce_usecs)); in sky2_set_coalesce()
4126 sky2_write8(hw, STAT_FIFO_WM, ecmd->rx_max_coalesced_frames); in sky2_set_coalesce()
4128 if (ecmd->rx_coalesce_usecs_irq == 0) in sky2_set_coalesce()
4132 sky2_us2clk(hw, ecmd->rx_coalesce_usecs_irq)); in sky2_set_coalesce()
4135 sky2_write8(hw, STAT_FIFO_ISR_WM, ecmd->rx_max_coalesced_frames_irq); in sky2_set_coalesce()
4156 ering->rx_max_pending = RX_MAX_PENDING; in sky2_get_ringparam()
4157 ering->tx_max_pending = TX_MAX_PENDING; in sky2_get_ringparam()
4159 ering->rx_pending = sky2->rx_pending; in sky2_get_ringparam()
4160 ering->tx_pending = sky2->tx_pending; in sky2_get_ringparam()
4170 if (ering->rx_pending > RX_MAX_PENDING || in sky2_set_ringparam()
4171 ering->rx_pending < 8 || in sky2_set_ringparam()
4172 ering->tx_pending < TX_MIN_PENDING || in sky2_set_ringparam()
4173 ering->tx_pending > TX_MAX_PENDING) in sky2_set_ringparam()
4174 return -EINVAL; in sky2_set_ringparam()
4178 sky2->rx_pending = ering->rx_pending; in sky2_set_ringparam()
4179 sky2->tx_pending = ering->tx_pending; in sky2_set_ringparam()
4180 sky2->tx_ring_size = roundup_ring_size(sky2->tx_pending); in sky2_set_ringparam()
4209 return hw->ports > 1; in sky2_reg_access_ok()
4242 const void __iomem *io = sky2->hw->regs; in sky2_get_regs()
4245 regs->version = 1; in sky2_get_regs()
4250 memcpy_fromio(p + 0x10, io + 0x10, 128 - 0x10); in sky2_get_regs()
4251 else if (sky2_reg_access_ok(sky2->hw, b)) in sky2_get_regs()
4264 struct sky2_hw *hw = sky2->hw; in sky2_get_eeprom_len()
4277 eeprom->magic = SKY2_EEPROM_MAGIC; in sky2_get_eeprom()
4278 rc = pci_read_vpd_any(sky2->hw->pdev, eeprom->offset, eeprom->len, in sky2_get_eeprom()
4283 eeprom->len = rc; in sky2_get_eeprom()
4294 if (eeprom->magic != SKY2_EEPROM_MAGIC) in sky2_set_eeprom()
4295 return -EINVAL; in sky2_set_eeprom()
4297 rc = pci_write_vpd_any(sky2->hw->pdev, eeprom->offset, eeprom->len, in sky2_set_eeprom()
4307 const struct sky2_hw *hw = sky2->hw; in sky2_fix_features()
4312 if (dev->mtu > ETH_DATA_LEN && hw->chip_id == CHIP_ID_YUKON_EC_U) { in sky2_fix_features()
4320 (sky2->hw->flags & SKY2_HW_RSS_CHKSUM)) { in sky2_fix_features()
4331 netdev_features_t changed = dev->features ^ features; in sky2_set_features()
4334 !(sky2->hw->flags & SKY2_HW_NEW_LE)) { in sky2_set_features()
4335 sky2_write32(sky2->hw, in sky2_set_features()
4336 Q_ADDR(rxqaddr[sky2->port], Q_CSR), in sky2_set_features()
4387 struct net_device *dev = seq->private; in sky2_debug_show()
4389 struct sky2_hw *hw = sky2->hw; in sky2_debug_show()
4390 unsigned port = sky2->port; in sky2_debug_show()
4404 napi_disable(&hw->napi); in sky2_debug_show()
4407 seq_printf(seq, "Status ring %u\n", hw->st_size); in sky2_debug_show()
4408 if (hw->st_idx == last) in sky2_debug_show()
4412 for (idx = hw->st_idx; idx != last && idx < hw->st_size; in sky2_debug_show()
4413 idx = RING_NEXT(idx, hw->st_size)) { in sky2_debug_show()
4414 const struct sky2_status_le *le = hw->st_le + idx; in sky2_debug_show()
4416 idx, le->opcode, le->length, le->status); in sky2_debug_show()
4422 sky2->tx_cons, sky2->tx_prod, in sky2_debug_show()
4428 for (idx = sky2->tx_next; idx != sky2->tx_prod && idx < sky2->tx_ring_size; in sky2_debug_show()
4429 idx = RING_NEXT(idx, sky2->tx_ring_size)) { in sky2_debug_show()
4430 const struct sky2_tx_le *le = sky2->tx_le + idx; in sky2_debug_show()
4431 u32 a = le32_to_cpu(le->addr); in sky2_debug_show()
4437 switch (le->opcode & ~HW_OWNER) { in sky2_debug_show()
4445 seq_printf(seq, " vlan=%d", be16_to_cpu(le->length)); in sky2_debug_show()
4451 seq_printf(seq, " tso=%#x(%d)", a, le16_to_cpu(le->length)); in sky2_debug_show()
4454 seq_printf(seq, " %#x(%d)", a, le16_to_cpu(le->length)); in sky2_debug_show()
4457 seq_printf(seq, " frag=%#x(%d)", a, le16_to_cpu(le->length)); in sky2_debug_show()
4460 seq_printf(seq, " op=%#x,%#x(%d)", le->opcode, in sky2_debug_show()
4461 a, le16_to_cpu(le->length)); in sky2_debug_show()
4464 if (le->ctrl & EOP) { in sky2_debug_show()
4476 napi_enable(&hw->napi); in sky2_debug_show()
4491 if (dev->netdev_ops->ndo_open != sky2_open || !sky2_debug) in sky2_device_event()
4496 if (sky2->debugfs) { in sky2_device_event()
4497 sky2->debugfs = debugfs_rename(sky2_debug, sky2->debugfs, in sky2_device_event()
4498 sky2_debug, dev->name); in sky2_device_event()
4503 if (sky2->debugfs) { in sky2_device_event()
4505 debugfs_remove(sky2->debugfs); in sky2_device_event()
4506 sky2->debugfs = NULL; in sky2_device_event()
4511 sky2->debugfs = debugfs_create_file(dev->name, 0444, in sky2_device_event()
4514 if (IS_ERR(sky2->debugfs)) in sky2_device_event()
4515 sky2->debugfs = NULL; in sky2_device_event()
4600 SET_NETDEV_DEV(dev, &hw->pdev->dev); in sky2_init_netdev()
4601 dev->irq = hw->pdev->irq; in sky2_init_netdev()
4602 dev->ethtool_ops = &sky2_ethtool_ops; in sky2_init_netdev()
4603 dev->watchdog_timeo = TX_WATCHDOG; in sky2_init_netdev()
4604 dev->netdev_ops = &sky2_netdev_ops[port]; in sky2_init_netdev()
4607 sky2->netdev = dev; in sky2_init_netdev()
4608 sky2->hw = hw; in sky2_init_netdev()
4609 sky2->msg_enable = netif_msg_init(debug, default_msg); in sky2_init_netdev()
4611 u64_stats_init(&sky2->tx_stats.syncp); in sky2_init_netdev()
4612 u64_stats_init(&sky2->rx_stats.syncp); in sky2_init_netdev()
4615 sky2->flags = SKY2_FLAG_AUTO_SPEED | SKY2_FLAG_AUTO_PAUSE; in sky2_init_netdev()
4616 if (hw->chip_id != CHIP_ID_YUKON_XL) in sky2_init_netdev()
4617 dev->hw_features |= NETIF_F_RXCSUM; in sky2_init_netdev()
4619 sky2->flow_mode = FC_BOTH; in sky2_init_netdev()
4621 sky2->duplex = -1; in sky2_init_netdev()
4622 sky2->speed = -1; in sky2_init_netdev()
4623 sky2->advertising = sky2_supported_modes(hw); in sky2_init_netdev()
4624 sky2->wol = wol; in sky2_init_netdev()
4626 spin_lock_init(&sky2->phy_lock); in sky2_init_netdev()
4628 sky2->tx_pending = TX_DEF_PENDING; in sky2_init_netdev()
4629 sky2->tx_ring_size = roundup_ring_size(TX_DEF_PENDING); in sky2_init_netdev()
4630 sky2->rx_pending = RX_DEF_PENDING; in sky2_init_netdev()
4632 hw->dev[port] = dev; in sky2_init_netdev()
4634 sky2->port = port; in sky2_init_netdev()
4636 dev->hw_features |= NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO; in sky2_init_netdev()
4639 dev->features |= NETIF_F_HIGHDMA; in sky2_init_netdev()
4642 if (!(hw->flags & SKY2_HW_RSS_BROKEN)) in sky2_init_netdev()
4643 dev->hw_features |= NETIF_F_RXHASH; in sky2_init_netdev()
4645 if (!(hw->flags & SKY2_HW_VLAN_BROKEN)) { in sky2_init_netdev()
4646 dev->hw_features |= NETIF_F_HW_VLAN_CTAG_TX | in sky2_init_netdev()
4648 dev->vlan_features |= SKY2_VLAN_OFFLOADS; in sky2_init_netdev()
4651 dev->features |= dev->hw_features; in sky2_init_netdev()
4653 /* MTU range: 60 - 1500 or 9000 */ in sky2_init_netdev()
4654 dev->min_mtu = ETH_ZLEN; in sky2_init_netdev()
4655 if (hw->chip_id == CHIP_ID_YUKON_FE || in sky2_init_netdev()
4656 hw->chip_id == CHIP_ID_YUKON_FE_P) in sky2_init_netdev()
4657 dev->max_mtu = ETH_DATA_LEN; in sky2_init_netdev()
4659 dev->max_mtu = ETH_JUMBO_MTU; in sky2_init_netdev()
4665 ret = of_get_ethdev_address(hw->pdev->dev.of_node, dev); in sky2_init_netdev()
4669 memcpy_fromio(addr, hw->regs + B2_MAC_1 + port * 8, ETH_ALEN); in sky2_init_netdev()
4674 if (!is_valid_ether_addr(dev->dev_addr)) { in sky2_init_netdev()
4677 dev_warn(&hw->pdev->dev, "Invalid MAC address, defaulting to random\n"); in sky2_init_netdev()
4679 memcpy(sa.sa_data, dev->dev_addr, ETH_ALEN); in sky2_init_netdev()
4681 dev_warn(&hw->pdev->dev, "Failed to set MAC address.\n"); in sky2_init_netdev()
4691 netif_info(sky2, probe, dev, "addr %pM\n", dev->dev_addr); in sky2_show_addr()
4704 hw->flags |= SKY2_HW_USE_MSI; in sky2_test_intr()
4705 wake_up(&hw->msi_wait); in sky2_test_intr()
4716 struct pci_dev *pdev = hw->pdev; in sky2_test_msi()
4719 init_waitqueue_head(&hw->msi_wait); in sky2_test_msi()
4721 err = request_irq(pdev->irq, sky2_test_intr, 0, DRV_NAME, hw); in sky2_test_msi()
4723 dev_err(&pdev->dev, "cannot assign irq %d\n", pdev->irq); in sky2_test_msi()
4732 wait_event_timeout(hw->msi_wait, (hw->flags & SKY2_HW_USE_MSI), HZ/10); in sky2_test_msi()
4734 if (!(hw->flags & SKY2_HW_USE_MSI)) { in sky2_test_msi()
4736 dev_info(&pdev->dev, "No interrupt generated using MSI, " in sky2_test_msi()
4739 err = -EOPNOTSUPP; in sky2_test_msi()
4746 free_irq(pdev->irq, hw); in sky2_test_msi()
4770 snprintf(buf, sz, "%s", name[chipid - CHIP_ID_YUKON_XL]); in sky2_name()
4785 .ident = "Gateway P-79",
4788 DMI_MATCH(DMI_PRODUCT_NAME, "P-79"),
4825 dev_err(&pdev->dev, "cannot enable PCI device\n"); in sky2_probe()
4836 dev_err(&pdev->dev, "PCI read config failed\n"); in sky2_probe()
4841 dev_err(&pdev->dev, "PCI configuration read error\n"); in sky2_probe()
4842 err = -EIO; in sky2_probe()
4848 dev_err(&pdev->dev, "cannot obtain PCI resources\n"); in sky2_probe()
4855 !dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) { in sky2_probe()
4857 err = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); in sky2_probe()
4859 dev_err(&pdev->dev, "unable to obtain 64 bit DMA " in sky2_probe()
4864 err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); in sky2_probe()
4866 dev_err(&pdev->dev, "no usable DMA configuration\n"); in sky2_probe()
4879 dev_err(&pdev->dev, "PCI write config failed\n"); in sky2_probe()
4884 wol_default = device_may_wakeup(&pdev->dev) ? WAKE_MAGIC : 0; in sky2_probe()
4886 err = -ENOMEM; in sky2_probe()
4893 hw->pdev = pdev; in sky2_probe()
4894 sprintf(hw->irq_name, DRV_NAME "@pci:%s", pci_name(pdev)); in sky2_probe()
4896 hw->regs = ioremap(pci_resource_start(pdev, 0), 0x4000); in sky2_probe()
4897 if (!hw->regs) { in sky2_probe()
4898 dev_err(&pdev->dev, "cannot map device registers\n"); in sky2_probe()
4907 hw->st_size = hw->ports * roundup_pow_of_two(3*RX_MAX_PENDING + TX_MAX_PENDING); in sky2_probe()
4908 hw->st_le = dma_alloc_coherent(&pdev->dev, in sky2_probe()
4909 hw->st_size * sizeof(struct sky2_status_le), in sky2_probe()
4910 &hw->st_dma, GFP_KERNEL); in sky2_probe()
4911 if (!hw->st_le) { in sky2_probe()
4912 err = -ENOMEM; in sky2_probe()
4916 dev_info(&pdev->dev, "Yukon-2 %s chip revision %d\n", in sky2_probe()
4917 sky2_name(hw->chip_id, buf1, sizeof(buf1)), hw->chip_rev); in sky2_probe()
4923 err = -ENOMEM; in sky2_probe()
4927 if (disable_msi == -1) in sky2_probe()
4934 if (err != -EOPNOTSUPP) in sky2_probe()
4939 netif_napi_add(dev, &hw->napi, sky2_poll); in sky2_probe()
4943 dev_err(&pdev->dev, "cannot register net device\n"); in sky2_probe()
4951 if (hw->ports > 1) { in sky2_probe()
4954 err = -ENOMEM; in sky2_probe()
4960 dev_err(&pdev->dev, "cannot register second net device\n"); in sky2_probe()
4964 err = sky2_setup_irq(hw, hw->irq_name); in sky2_probe()
4971 timer_setup(&hw->watchdog_timer, sky2_watchdog, 0); in sky2_probe()
4972 INIT_WORK(&hw->restart_work, sky2_restart); in sky2_probe()
4975 pdev->d3hot_delay = 300; in sky2_probe()
4986 if (hw->flags & SKY2_HW_USE_MSI) in sky2_probe()
4990 dma_free_coherent(&pdev->dev, in sky2_probe()
4991 hw->st_size * sizeof(struct sky2_status_le), in sky2_probe()
4992 hw->st_le, hw->st_dma); in sky2_probe()
4996 iounmap(hw->regs); in sky2_probe()
5015 timer_shutdown_sync(&hw->watchdog_timer); in sky2_remove()
5016 cancel_work_sync(&hw->restart_work); in sky2_remove()
5018 for (i = hw->ports-1; i >= 0; --i) in sky2_remove()
5019 unregister_netdev(hw->dev[i]); in sky2_remove()
5029 if (hw->ports > 1) { in sky2_remove()
5030 napi_disable(&hw->napi); in sky2_remove()
5031 free_irq(pdev->irq, hw); in sky2_remove()
5034 if (hw->flags & SKY2_HW_USE_MSI) in sky2_remove()
5036 dma_free_coherent(&pdev->dev, in sky2_remove()
5037 hw->st_size * sizeof(struct sky2_status_le), in sky2_remove()
5038 hw->st_le, hw->st_dma); in sky2_remove()
5042 for (i = hw->ports-1; i >= 0; --i) in sky2_remove()
5043 free_netdev(hw->dev[i]); in sky2_remove()
5045 iounmap(hw->regs); in sky2_remove()
5057 del_timer_sync(&hw->watchdog_timer); in sky2_suspend()
5058 cancel_work_sync(&hw->restart_work); in sky2_suspend()
5063 for (i = 0; i < hw->ports; i++) { in sky2_suspend()
5064 struct net_device *dev = hw->dev[i]; in sky2_suspend()
5067 if (sky2->wol) in sky2_suspend()
5087 /* Re-enable all clocks */ in sky2_resume()
5090 dev_err(&pdev->dev, "PCI write config failed\n"); in sky2_resume()
5102 dev_err(&pdev->dev, "resume failed (%d)\n", err); in sky2_resume()
5120 for (port = 0; port < hw->ports; port++) { in sky2_shutdown()
5121 struct net_device *ndev = hw->dev[port]; in sky2_shutdown()
5130 sky2_suspend(&pdev->dev); in sky2_shutdown()
5131 pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev)); in sky2_shutdown()
5162 MODULE_AUTHOR("Stephen Hemminger <shemminger@linux-foundation.org>");