| .. | .. |
|---|
| 23 | 23 | int stat_offset; |
|---|
| 24 | 24 | }; |
|---|
| 25 | 25 | |
|---|
| 26 | +static const char e1000e_priv_flags_strings[][ETH_GSTRING_LEN] = { |
|---|
| 27 | +#define E1000E_PRIV_FLAGS_S0IX_ENABLED BIT(0) |
|---|
| 28 | + "s0ix-enabled", |
|---|
| 29 | +}; |
|---|
| 30 | + |
|---|
| 31 | +#define E1000E_PRIV_FLAGS_STR_LEN ARRAY_SIZE(e1000e_priv_flags_strings) |
|---|
| 32 | + |
|---|
| 26 | 33 | #define E1000_STAT(str, m) { \ |
|---|
| 27 | 34 | .stat_string = str, \ |
|---|
| 28 | 35 | .type = E1000_STATS, \ |
|---|
| .. | .. |
|---|
| 633 | 640 | struct e1000_adapter *adapter = netdev_priv(netdev); |
|---|
| 634 | 641 | |
|---|
| 635 | 642 | strlcpy(drvinfo->driver, e1000e_driver_name, sizeof(drvinfo->driver)); |
|---|
| 636 | | - strlcpy(drvinfo->version, e1000e_driver_version, |
|---|
| 637 | | - sizeof(drvinfo->version)); |
|---|
| 638 | 643 | |
|---|
| 639 | 644 | /* EEPROM image version # is reported as firmware version # for |
|---|
| 640 | 645 | * PCI-E controllers |
|---|
| .. | .. |
|---|
| 894 | 899 | case e1000_pch2lan: |
|---|
| 895 | 900 | case e1000_pch_lpt: |
|---|
| 896 | 901 | case e1000_pch_spt: |
|---|
| 897 | | - /* fall through */ |
|---|
| 898 | 902 | case e1000_pch_cnp: |
|---|
| 903 | + case e1000_pch_tgp: |
|---|
| 904 | + case e1000_pch_adp: |
|---|
| 905 | + case e1000_pch_mtp: |
|---|
| 899 | 906 | mask |= BIT(18); |
|---|
| 900 | 907 | break; |
|---|
| 901 | 908 | default: |
|---|
| .. | .. |
|---|
| 1014 | 1021 | /* Disable all the interrupts */ |
|---|
| 1015 | 1022 | ew32(IMC, 0xFFFFFFFF); |
|---|
| 1016 | 1023 | e1e_flush(); |
|---|
| 1017 | | - usleep_range(10000, 20000); |
|---|
| 1024 | + usleep_range(10000, 11000); |
|---|
| 1018 | 1025 | |
|---|
| 1019 | 1026 | /* Test each interrupt */ |
|---|
| 1020 | 1027 | for (i = 0; i < 10; i++) { |
|---|
| .. | .. |
|---|
| 1046 | 1053 | ew32(IMC, mask); |
|---|
| 1047 | 1054 | ew32(ICS, mask); |
|---|
| 1048 | 1055 | e1e_flush(); |
|---|
| 1049 | | - usleep_range(10000, 20000); |
|---|
| 1056 | + usleep_range(10000, 11000); |
|---|
| 1050 | 1057 | |
|---|
| 1051 | 1058 | if (adapter->test_icr & mask) { |
|---|
| 1052 | 1059 | *data = 3; |
|---|
| .. | .. |
|---|
| 1064 | 1071 | ew32(IMS, mask); |
|---|
| 1065 | 1072 | ew32(ICS, mask); |
|---|
| 1066 | 1073 | e1e_flush(); |
|---|
| 1067 | | - usleep_range(10000, 20000); |
|---|
| 1074 | + usleep_range(10000, 11000); |
|---|
| 1068 | 1075 | |
|---|
| 1069 | 1076 | if (!(adapter->test_icr & mask)) { |
|---|
| 1070 | 1077 | *data = 4; |
|---|
| .. | .. |
|---|
| 1082 | 1089 | ew32(IMC, ~mask & 0x00007FFF); |
|---|
| 1083 | 1090 | ew32(ICS, ~mask & 0x00007FFF); |
|---|
| 1084 | 1091 | e1e_flush(); |
|---|
| 1085 | | - usleep_range(10000, 20000); |
|---|
| 1092 | + usleep_range(10000, 11000); |
|---|
| 1086 | 1093 | |
|---|
| 1087 | 1094 | if (adapter->test_icr) { |
|---|
| 1088 | 1095 | *data = 5; |
|---|
| .. | .. |
|---|
| 1094 | 1101 | /* Disable all the interrupts */ |
|---|
| 1095 | 1102 | ew32(IMC, 0xFFFFFFFF); |
|---|
| 1096 | 1103 | e1e_flush(); |
|---|
| 1097 | | - usleep_range(10000, 20000); |
|---|
| 1104 | + usleep_range(10000, 11000); |
|---|
| 1098 | 1105 | |
|---|
| 1099 | 1106 | /* Unhook test interrupt handler */ |
|---|
| 1100 | 1107 | free_irq(irq, netdev); |
|---|
| .. | .. |
|---|
| 1126 | 1133 | buffer_info->dma, |
|---|
| 1127 | 1134 | buffer_info->length, |
|---|
| 1128 | 1135 | DMA_TO_DEVICE); |
|---|
| 1129 | | - if (buffer_info->skb) |
|---|
| 1130 | | - dev_kfree_skb(buffer_info->skb); |
|---|
| 1136 | + dev_kfree_skb(buffer_info->skb); |
|---|
| 1131 | 1137 | } |
|---|
| 1132 | 1138 | } |
|---|
| 1133 | 1139 | |
|---|
| .. | .. |
|---|
| 1139 | 1145 | dma_unmap_single(&pdev->dev, |
|---|
| 1140 | 1146 | buffer_info->dma, |
|---|
| 1141 | 1147 | 2048, DMA_FROM_DEVICE); |
|---|
| 1142 | | - if (buffer_info->skb) |
|---|
| 1143 | | - dev_kfree_skb(buffer_info->skb); |
|---|
| 1148 | + dev_kfree_skb(buffer_info->skb); |
|---|
| 1144 | 1149 | } |
|---|
| 1145 | 1150 | } |
|---|
| 1146 | 1151 | |
|---|
| .. | .. |
|---|
| 1470 | 1475 | */ |
|---|
| 1471 | 1476 | ew32(SCTL, E1000_SCTL_ENABLE_SERDES_LOOPBACK); |
|---|
| 1472 | 1477 | e1e_flush(); |
|---|
| 1473 | | - usleep_range(10000, 20000); |
|---|
| 1478 | + usleep_range(10000, 11000); |
|---|
| 1474 | 1479 | |
|---|
| 1475 | 1480 | return 0; |
|---|
| 1476 | 1481 | } |
|---|
| .. | .. |
|---|
| 1561 | 1566 | switch (hw->mac.type) { |
|---|
| 1562 | 1567 | case e1000_pch_spt: |
|---|
| 1563 | 1568 | case e1000_pch_cnp: |
|---|
| 1569 | + case e1000_pch_tgp: |
|---|
| 1570 | + case e1000_pch_adp: |
|---|
| 1571 | + case e1000_pch_mtp: |
|---|
| 1564 | 1572 | fext_nvm11 = er32(FEXTNVM11); |
|---|
| 1565 | 1573 | fext_nvm11 &= ~E1000_FEXTNVM11_DISABLE_MULR_FIX; |
|---|
| 1566 | 1574 | ew32(FEXTNVM11, fext_nvm11); |
|---|
| .. | .. |
|---|
| 1569 | 1577 | /* set bit 29 (value of MULR requests is now 0) */ |
|---|
| 1570 | 1578 | tarc0 &= 0xcfffffff; |
|---|
| 1571 | 1579 | ew32(TARC(0), tarc0); |
|---|
| 1572 | | - /* fall through */ |
|---|
| 1580 | + fallthrough; |
|---|
| 1573 | 1581 | case e1000_80003es2lan: |
|---|
| 1574 | 1582 | if (hw->phy.media_type == e1000_media_type_fiber || |
|---|
| 1575 | 1583 | hw->phy.media_type == e1000_media_type_internal_serdes) { |
|---|
| .. | .. |
|---|
| 1577 | 1585 | ew32(CTRL_EXT, adapter->tx_fifo_head); |
|---|
| 1578 | 1586 | adapter->tx_fifo_head = 0; |
|---|
| 1579 | 1587 | } |
|---|
| 1580 | | - /* fall through */ |
|---|
| 1588 | + fallthrough; |
|---|
| 1581 | 1589 | case e1000_82571: |
|---|
| 1582 | 1590 | case e1000_82572: |
|---|
| 1583 | 1591 | if (hw->phy.media_type == e1000_media_type_fiber || |
|---|
| 1584 | 1592 | hw->phy.media_type == e1000_media_type_internal_serdes) { |
|---|
| 1585 | 1593 | ew32(SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK); |
|---|
| 1586 | 1594 | e1e_flush(); |
|---|
| 1587 | | - usleep_range(10000, 20000); |
|---|
| 1595 | + usleep_range(10000, 11000); |
|---|
| 1588 | 1596 | break; |
|---|
| 1589 | 1597 | } |
|---|
| 1590 | | - /* Fall Through */ |
|---|
| 1598 | + fallthrough; |
|---|
| 1591 | 1599 | default: |
|---|
| 1592 | 1600 | hw->mac.autoneg = 1; |
|---|
| 1593 | 1601 | if (hw->phy.type == e1000_phy_gg82563) |
|---|
| .. | .. |
|---|
| 1609 | 1617 | memset(skb->data, 0xFF, frame_size); |
|---|
| 1610 | 1618 | frame_size &= ~1; |
|---|
| 1611 | 1619 | memset(&skb->data[frame_size / 2], 0xAA, frame_size / 2 - 1); |
|---|
| 1612 | | - memset(&skb->data[frame_size / 2 + 10], 0xBE, 1); |
|---|
| 1613 | | - memset(&skb->data[frame_size / 2 + 12], 0xAF, 1); |
|---|
| 1620 | + skb->data[frame_size / 2 + 10] = 0xBE; |
|---|
| 1621 | + skb->data[frame_size / 2 + 12] = 0xAF; |
|---|
| 1614 | 1622 | } |
|---|
| 1615 | 1623 | |
|---|
| 1616 | 1624 | static int e1000_check_lbtest_frame(struct sk_buff *skb, |
|---|
| .. | .. |
|---|
| 1775 | 1783 | return E1000_TEST_LEN; |
|---|
| 1776 | 1784 | case ETH_SS_STATS: |
|---|
| 1777 | 1785 | return E1000_STATS_LEN; |
|---|
| 1786 | + case ETH_SS_PRIV_FLAGS: |
|---|
| 1787 | + return E1000E_PRIV_FLAGS_STR_LEN; |
|---|
| 1778 | 1788 | default: |
|---|
| 1779 | 1789 | return -EOPNOTSUPP; |
|---|
| 1780 | 1790 | } |
|---|
| .. | .. |
|---|
| 2096 | 2106 | p += ETH_GSTRING_LEN; |
|---|
| 2097 | 2107 | } |
|---|
| 2098 | 2108 | break; |
|---|
| 2109 | + case ETH_SS_PRIV_FLAGS: |
|---|
| 2110 | + memcpy(data, e1000e_priv_flags_strings, |
|---|
| 2111 | + E1000E_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN); |
|---|
| 2112 | + break; |
|---|
| 2099 | 2113 | } |
|---|
| 2100 | 2114 | } |
|---|
| 2101 | 2115 | |
|---|
| .. | .. |
|---|
| 2122 | 2136 | case TCP_V4_FLOW: |
|---|
| 2123 | 2137 | if (mrqc & E1000_MRQC_RSS_FIELD_IPV4_TCP) |
|---|
| 2124 | 2138 | info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
|---|
| 2125 | | - /* fall through */ |
|---|
| 2139 | + fallthrough; |
|---|
| 2126 | 2140 | case UDP_V4_FLOW: |
|---|
| 2127 | 2141 | case SCTP_V4_FLOW: |
|---|
| 2128 | 2142 | case AH_ESP_V4_FLOW: |
|---|
| .. | .. |
|---|
| 2133 | 2147 | case TCP_V6_FLOW: |
|---|
| 2134 | 2148 | if (mrqc & E1000_MRQC_RSS_FIELD_IPV6_TCP) |
|---|
| 2135 | 2149 | info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3; |
|---|
| 2136 | | - /* fall through */ |
|---|
| 2150 | + fallthrough; |
|---|
| 2137 | 2151 | case UDP_V6_FLOW: |
|---|
| 2138 | 2152 | case SCTP_V6_FLOW: |
|---|
| 2139 | 2153 | case AH_ESP_V6_FLOW: |
|---|
| .. | .. |
|---|
| 2304 | 2318 | return 0; |
|---|
| 2305 | 2319 | } |
|---|
| 2306 | 2320 | |
|---|
| 2321 | +static u32 e1000e_get_priv_flags(struct net_device *netdev) |
|---|
| 2322 | +{ |
|---|
| 2323 | + struct e1000_adapter *adapter = netdev_priv(netdev); |
|---|
| 2324 | + u32 priv_flags = 0; |
|---|
| 2325 | + |
|---|
| 2326 | + if (adapter->flags2 & FLAG2_ENABLE_S0IX_FLOWS) |
|---|
| 2327 | + priv_flags |= E1000E_PRIV_FLAGS_S0IX_ENABLED; |
|---|
| 2328 | + |
|---|
| 2329 | + return priv_flags; |
|---|
| 2330 | +} |
|---|
| 2331 | + |
|---|
| 2332 | +static int e1000e_set_priv_flags(struct net_device *netdev, u32 priv_flags) |
|---|
| 2333 | +{ |
|---|
| 2334 | + struct e1000_adapter *adapter = netdev_priv(netdev); |
|---|
| 2335 | + unsigned int flags2 = adapter->flags2; |
|---|
| 2336 | + |
|---|
| 2337 | + flags2 &= ~FLAG2_ENABLE_S0IX_FLOWS; |
|---|
| 2338 | + if (priv_flags & E1000E_PRIV_FLAGS_S0IX_ENABLED) { |
|---|
| 2339 | + struct e1000_hw *hw = &adapter->hw; |
|---|
| 2340 | + |
|---|
| 2341 | + if (hw->mac.type < e1000_pch_cnp) |
|---|
| 2342 | + return -EINVAL; |
|---|
| 2343 | + flags2 |= FLAG2_ENABLE_S0IX_FLOWS; |
|---|
| 2344 | + } |
|---|
| 2345 | + |
|---|
| 2346 | + if (flags2 != adapter->flags2) |
|---|
| 2347 | + adapter->flags2 = flags2; |
|---|
| 2348 | + |
|---|
| 2349 | + return 0; |
|---|
| 2350 | +} |
|---|
| 2351 | + |
|---|
| 2307 | 2352 | static const struct ethtool_ops e1000_ethtool_ops = { |
|---|
| 2353 | + .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS, |
|---|
| 2308 | 2354 | .get_drvinfo = e1000_get_drvinfo, |
|---|
| 2309 | 2355 | .get_regs_len = e1000_get_regs_len, |
|---|
| 2310 | 2356 | .get_regs = e1000_get_regs, |
|---|
| .. | .. |
|---|
| 2334 | 2380 | .set_eee = e1000e_set_eee, |
|---|
| 2335 | 2381 | .get_link_ksettings = e1000_get_link_ksettings, |
|---|
| 2336 | 2382 | .set_link_ksettings = e1000_set_link_ksettings, |
|---|
| 2383 | + .get_priv_flags = e1000e_get_priv_flags, |
|---|
| 2384 | + .set_priv_flags = e1000e_set_priv_flags, |
|---|
| 2337 | 2385 | }; |
|---|
| 2338 | 2386 | |
|---|
| 2339 | 2387 | void e1000e_set_ethtool_ops(struct net_device *netdev) |
|---|