.. | .. |
---|
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) |
---|