Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'net-wangxun-support-to-configure-rss'

Jiawen Wu says:

====================
net: wangxun: support to configure RSS

Implement ethtool ops for RSS configuration, and support multiple RSS
for multiple pools.
====================

Link: https://patch.msgid.link/20250926023843.34340-1-jiawenwu@trustnetic.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+306 -51
+136
drivers/net/ethernet/wangxun/libwx/wx_ethtool.c
··· 481 481 } 482 482 EXPORT_SYMBOL(wx_set_channels); 483 483 484 + u32 wx_rss_indir_size(struct net_device *netdev) 485 + { 486 + struct wx *wx = netdev_priv(netdev); 487 + 488 + return wx_rss_indir_tbl_entries(wx); 489 + } 490 + EXPORT_SYMBOL(wx_rss_indir_size); 491 + 492 + u32 wx_get_rxfh_key_size(struct net_device *netdev) 493 + { 494 + return WX_RSS_KEY_SIZE; 495 + } 496 + EXPORT_SYMBOL(wx_get_rxfh_key_size); 497 + 498 + static void wx_get_reta(struct wx *wx, u32 *indir) 499 + { 500 + u32 reta_size = wx_rss_indir_tbl_entries(wx); 501 + u16 rss_m = wx->ring_feature[RING_F_RSS].mask; 502 + 503 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags)) 504 + rss_m = wx->ring_feature[RING_F_RSS].indices - 1; 505 + 506 + for (u32 i = 0; i < reta_size; i++) 507 + indir[i] = wx->rss_indir_tbl[i] & rss_m; 508 + } 509 + 510 + int wx_get_rxfh(struct net_device *netdev, 511 + struct ethtool_rxfh_param *rxfh) 512 + { 513 + struct wx *wx = netdev_priv(netdev); 514 + 515 + rxfh->hfunc = ETH_RSS_HASH_TOP; 516 + 517 + if (rxfh->indir) 518 + wx_get_reta(wx, rxfh->indir); 519 + 520 + if (rxfh->key) 521 + memcpy(rxfh->key, wx->rss_key, WX_RSS_KEY_SIZE); 522 + 523 + return 0; 524 + } 525 + EXPORT_SYMBOL(wx_get_rxfh); 526 + 527 + int wx_set_rxfh(struct net_device *netdev, 528 + struct ethtool_rxfh_param *rxfh, 529 + struct netlink_ext_ack *extack) 530 + { 531 + struct wx *wx = netdev_priv(netdev); 532 + u32 reta_entries, i; 533 + 534 + if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE && 535 + rxfh->hfunc != ETH_RSS_HASH_TOP) 536 + return -EOPNOTSUPP; 537 + 538 + reta_entries = wx_rss_indir_tbl_entries(wx); 539 + /* Fill out the redirection table */ 540 + if (rxfh->indir) { 541 + for (i = 0; i < reta_entries; i++) 542 + wx->rss_indir_tbl[i] = rxfh->indir[i]; 543 + 544 + wx_store_reta(wx); 545 + } 546 + 547 + /* Fill out the rss hash key */ 548 + if (rxfh->key) { 549 + memcpy(wx->rss_key, rxfh->key, WX_RSS_KEY_SIZE); 550 + wx_store_rsskey(wx); 551 + } 552 + 553 + return 0; 554 + } 555 + EXPORT_SYMBOL(wx_set_rxfh); 556 + 557 + static const struct wx_rss_flow_map rss_flow_table[] = { 558 + { TCP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_TCP }, 559 + { TCP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_TCP }, 560 + { UDP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_UDP }, 561 + { UDP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_UDP }, 562 + { SCTP_V4_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV4_SCTP }, 563 + { SCTP_V6_FLOW, RXH_L4_B_0_1 | RXH_L4_B_2_3, WX_RSS_FIELD_IPV6_SCTP }, 564 + }; 565 + 566 + int wx_get_rxfh_fields(struct net_device *dev, 567 + struct ethtool_rxfh_fields *nfc) 568 + { 569 + struct wx *wx = netdev_priv(dev); 570 + 571 + nfc->data = RXH_IP_SRC | RXH_IP_DST; 572 + 573 + for (u32 i = 0; i < ARRAY_SIZE(rss_flow_table); i++) { 574 + const struct wx_rss_flow_map *entry = &rss_flow_table[i]; 575 + 576 + if (entry->flow_type == nfc->flow_type) { 577 + if (wx->rss_flags & entry->flag) 578 + nfc->data |= entry->data; 579 + break; 580 + } 581 + } 582 + 583 + return 0; 584 + } 585 + EXPORT_SYMBOL(wx_get_rxfh_fields); 586 + 587 + int wx_set_rxfh_fields(struct net_device *dev, 588 + const struct ethtool_rxfh_fields *nfc, 589 + struct netlink_ext_ack *extack) 590 + { 591 + struct wx *wx = netdev_priv(dev); 592 + u8 flags = wx->rss_flags; 593 + 594 + if (!(nfc->data & RXH_IP_SRC) || 595 + !(nfc->data & RXH_IP_DST)) 596 + return -EINVAL; 597 + 598 + for (u32 i = 0; i < ARRAY_SIZE(rss_flow_table); i++) { 599 + const struct wx_rss_flow_map *entry = &rss_flow_table[i]; 600 + 601 + if (entry->flow_type == nfc->flow_type) { 602 + if (nfc->data & entry->data) 603 + flags |= entry->flag; 604 + else 605 + flags &= ~entry->flag; 606 + 607 + if (flags != wx->rss_flags) { 608 + wx->rss_flags = flags; 609 + wx_config_rss_field(wx); 610 + } 611 + 612 + return 0; 613 + } 614 + } 615 + 616 + return -EINVAL; 617 + } 618 + EXPORT_SYMBOL(wx_set_rxfh_fields); 619 + 484 620 u32 wx_get_msglevel(struct net_device *netdev) 485 621 { 486 622 struct wx *wx = netdev_priv(netdev);
+12
drivers/net/ethernet/wangxun/libwx/wx_ethtool.h
··· 38 38 struct ethtool_channels *ch); 39 39 int wx_set_channels(struct net_device *dev, 40 40 struct ethtool_channels *ch); 41 + u32 wx_rss_indir_size(struct net_device *netdev); 42 + u32 wx_get_rxfh_key_size(struct net_device *netdev); 43 + int wx_get_rxfh(struct net_device *netdev, 44 + struct ethtool_rxfh_param *rxfh); 45 + int wx_set_rxfh(struct net_device *netdev, 46 + struct ethtool_rxfh_param *rxfh, 47 + struct netlink_ext_ack *extack); 48 + int wx_get_rxfh_fields(struct net_device *dev, 49 + struct ethtool_rxfh_fields *cmd); 50 + int wx_set_rxfh_fields(struct net_device *dev, 51 + const struct ethtool_rxfh_fields *nfc, 52 + struct netlink_ext_ack *extack); 41 53 u32 wx_get_msglevel(struct net_device *netdev); 42 54 void wx_set_msglevel(struct net_device *netdev, u32 data); 43 55 int wx_get_ts_info(struct net_device *dev,
+99 -38
drivers/net/ethernet/wangxun/libwx/wx_hw.c
··· 1998 1998 wx_vlan_rx_add_vid(wx->netdev, htons(ETH_P_8021Q), vid); 1999 1999 } 2000 2000 2001 - static void wx_store_reta(struct wx *wx) 2001 + u32 wx_rss_indir_tbl_entries(struct wx *wx) 2002 2002 { 2003 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags)) 2004 + return 64; 2005 + else 2006 + return 128; 2007 + } 2008 + 2009 + void wx_store_reta(struct wx *wx) 2010 + { 2011 + u32 reta_entries = wx_rss_indir_tbl_entries(wx); 2003 2012 u8 *indir_tbl = wx->rss_indir_tbl; 2004 2013 u32 reta = 0; 2005 2014 u32 i; ··· 2016 2007 /* Fill out the redirection table as follows: 2017 2008 * - 8 bit wide entries containing 4 bit RSS index 2018 2009 */ 2019 - for (i = 0; i < WX_MAX_RETA_ENTRIES; i++) { 2010 + for (i = 0; i < reta_entries; i++) { 2020 2011 reta |= indir_tbl[i] << (i & 0x3) * 8; 2021 2012 if ((i & 3) == 3) { 2022 - wr32(wx, WX_RDB_RSSTBL(i >> 2), reta); 2013 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags) && 2014 + test_bit(WX_FLAG_MULTI_64_FUNC, wx->flags)) 2015 + wr32(wx, WX_RDB_VMRSSTBL(i >> 2, wx->num_vfs), reta); 2016 + else 2017 + wr32(wx, WX_RDB_RSSTBL(i >> 2), reta); 2023 2018 reta = 0; 2024 2019 } 2025 2020 } 2026 2021 } 2027 2022 2023 + void wx_store_rsskey(struct wx *wx) 2024 + { 2025 + u32 key_size = WX_RSS_KEY_SIZE / 4; 2026 + u32 i; 2027 + 2028 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags) && 2029 + test_bit(WX_FLAG_MULTI_64_FUNC, wx->flags)) { 2030 + for (i = 0; i < key_size; i++) 2031 + wr32(wx, WX_RDB_VMRSSRK(i, wx->num_vfs), 2032 + wx->rss_key[i]); 2033 + } else { 2034 + for (i = 0; i < key_size; i++) 2035 + wr32(wx, WX_RDB_RSSRK(i), wx->rss_key[i]); 2036 + } 2037 + } 2038 + 2028 2039 static void wx_setup_reta(struct wx *wx) 2029 2040 { 2030 - u16 rss_i = wx->ring_feature[RING_F_RSS].indices; 2031 - u32 random_key_size = WX_RSS_KEY_SIZE / 4; 2032 - u32 i, j; 2033 - 2034 - if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags)) { 2035 - if (wx->mac.type == wx_mac_em) 2036 - rss_i = 1; 2037 - else 2038 - rss_i = rss_i < 4 ? 4 : rss_i; 2039 - } 2040 - 2041 2041 /* Fill out hash function seeds */ 2042 - for (i = 0; i < random_key_size; i++) 2043 - wr32(wx, WX_RDB_RSSRK(i), wx->rss_key[i]); 2042 + wx_store_rsskey(wx); 2044 2043 2045 2044 /* Fill out redirection table */ 2046 - memset(wx->rss_indir_tbl, 0, sizeof(wx->rss_indir_tbl)); 2045 + if (!netif_is_rxfh_configured(wx->netdev)) { 2046 + u16 rss_i = wx->ring_feature[RING_F_RSS].indices; 2047 + u32 reta_entries = wx_rss_indir_tbl_entries(wx); 2048 + u32 i, j; 2047 2049 2048 - for (i = 0, j = 0; i < WX_MAX_RETA_ENTRIES; i++, j++) { 2049 - if (j == rss_i) 2050 - j = 0; 2050 + memset(wx->rss_indir_tbl, 0, sizeof(wx->rss_indir_tbl)); 2051 2051 2052 - wx->rss_indir_tbl[i] = j; 2052 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags)) { 2053 + if (test_bit(WX_FLAG_MULTI_64_FUNC, wx->flags)) 2054 + rss_i = rss_i < 2 ? 2 : rss_i; 2055 + else 2056 + rss_i = 1; 2057 + } 2058 + 2059 + for (i = 0, j = 0; i < reta_entries; i++, j++) { 2060 + if (j == rss_i) 2061 + j = 0; 2062 + 2063 + wx->rss_indir_tbl[i] = j; 2064 + } 2053 2065 } 2054 2066 2055 2067 wx_store_reta(wx); 2068 + } 2069 + 2070 + void wx_config_rss_field(struct wx *wx) 2071 + { 2072 + u32 rss_field; 2073 + 2074 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags) && 2075 + test_bit(WX_FLAG_MULTI_64_FUNC, wx->flags)) { 2076 + rss_field = rd32(wx, WX_RDB_PL_CFG(wx->num_vfs)); 2077 + rss_field &= ~WX_RDB_PL_CFG_RSS_MASK; 2078 + rss_field |= FIELD_PREP(WX_RDB_PL_CFG_RSS_MASK, wx->rss_flags); 2079 + wr32(wx, WX_RDB_PL_CFG(wx->num_vfs), rss_field); 2080 + 2081 + /* Enable global RSS and multiple RSS to make the RSS 2082 + * field of each pool take effect. 2083 + */ 2084 + wr32m(wx, WX_RDB_RA_CTL, 2085 + WX_RDB_RA_CTL_MULTI_RSS | WX_RDB_RA_CTL_RSS_EN, 2086 + WX_RDB_RA_CTL_MULTI_RSS | WX_RDB_RA_CTL_RSS_EN); 2087 + } else { 2088 + rss_field = rd32(wx, WX_RDB_RA_CTL); 2089 + rss_field &= ~WX_RDB_RA_CTL_RSS_MASK; 2090 + rss_field |= FIELD_PREP(WX_RDB_RA_CTL_RSS_MASK, wx->rss_flags); 2091 + wr32(wx, WX_RDB_RA_CTL, rss_field); 2092 + } 2093 + } 2094 + 2095 + void wx_enable_rss(struct wx *wx, bool enable) 2096 + { 2097 + if (test_bit(WX_FLAG_SRIOV_ENABLED, wx->flags) && 2098 + test_bit(WX_FLAG_MULTI_64_FUNC, wx->flags)) { 2099 + if (enable) 2100 + wr32m(wx, WX_RDB_PL_CFG(wx->num_vfs), 2101 + WX_RDB_PL_CFG_RSS_EN, WX_RDB_PL_CFG_RSS_EN); 2102 + else 2103 + wr32m(wx, WX_RDB_PL_CFG(wx->num_vfs), 2104 + WX_RDB_PL_CFG_RSS_EN, 0); 2105 + } else { 2106 + if (enable) 2107 + wr32m(wx, WX_RDB_RA_CTL, WX_RDB_RA_CTL_RSS_EN, 2108 + WX_RDB_RA_CTL_RSS_EN); 2109 + else 2110 + wr32m(wx, WX_RDB_RA_CTL, WX_RDB_RA_CTL_RSS_EN, 0); 2111 + } 2056 2112 } 2057 2113 2058 2114 #define WX_RDB_RSS_PL_2 FIELD_PREP(GENMASK(31, 29), 1) ··· 2150 2076 2151 2077 static void wx_setup_mrqc(struct wx *wx) 2152 2078 { 2153 - u32 rss_field = 0; 2154 - 2155 2079 /* Disable indicating checksum in descriptor, enables RSS hash */ 2156 2080 wr32m(wx, WX_PSR_CTL, WX_PSR_CTL_PCSD, WX_PSR_CTL_PCSD); 2157 2081 2158 - /* Perform hash on these packet types */ 2159 - rss_field = WX_RDB_RA_CTL_RSS_IPV4 | 2160 - WX_RDB_RA_CTL_RSS_IPV4_TCP | 2161 - WX_RDB_RA_CTL_RSS_IPV4_UDP | 2162 - WX_RDB_RA_CTL_RSS_IPV6 | 2163 - WX_RDB_RA_CTL_RSS_IPV6_TCP | 2164 - WX_RDB_RA_CTL_RSS_IPV6_UDP; 2165 - 2166 - netdev_rss_key_fill(wx->rss_key, sizeof(wx->rss_key)); 2167 - 2082 + wx_config_rss_field(wx); 2083 + wx_enable_rss(wx, wx->rss_enabled); 2168 2084 wx_setup_reta(wx); 2169 - 2170 - if (wx->rss_enabled) 2171 - rss_field |= WX_RDB_RA_CTL_RSS_EN; 2172 - 2173 - wr32(wx, WX_RDB_RA_CTL, rss_field); 2174 2085 } 2175 2086 2176 2087 /** ··· 2448 2389 wx_err(wx, "rss key allocation failed\n"); 2449 2390 return err; 2450 2391 } 2392 + wx->rss_flags = WX_RSS_FIELD_IPV4 | WX_RSS_FIELD_IPV4_TCP | 2393 + WX_RSS_FIELD_IPV6 | WX_RSS_FIELD_IPV6_TCP; 2451 2394 2452 2395 wx->mac_table = kcalloc(wx->mac.num_rar_entries, 2453 2396 sizeof(struct wx_mac_addr),
+5
drivers/net/ethernet/wangxun/libwx/wx_hw.h
··· 39 39 int wx_change_mtu(struct net_device *netdev, int new_mtu); 40 40 void wx_disable_rx_queue(struct wx *wx, struct wx_ring *ring); 41 41 void wx_enable_rx_queue(struct wx *wx, struct wx_ring *ring); 42 + u32 wx_rss_indir_tbl_entries(struct wx *wx); 43 + void wx_store_reta(struct wx *wx); 44 + void wx_store_rsskey(struct wx *wx); 45 + void wx_config_rss_field(struct wx *wx); 46 + void wx_enable_rss(struct wx *wx, bool enable); 42 47 void wx_configure_rx(struct wx *wx); 43 48 void wx_configure(struct wx *wx); 44 49 void wx_start_hw(struct wx *wx);
+2 -8
drivers/net/ethernet/wangxun/libwx/wx_lib.c
··· 3016 3016 struct wx *wx = netdev_priv(netdev); 3017 3017 bool need_reset = false; 3018 3018 3019 - if (features & NETIF_F_RXHASH) { 3020 - wr32m(wx, WX_RDB_RA_CTL, WX_RDB_RA_CTL_RSS_EN, 3021 - WX_RDB_RA_CTL_RSS_EN); 3022 - wx->rss_enabled = true; 3023 - } else { 3024 - wr32m(wx, WX_RDB_RA_CTL, WX_RDB_RA_CTL_RSS_EN, 0); 3025 - wx->rss_enabled = false; 3026 - } 3019 + wx->rss_enabled = !!(features & NETIF_F_RXHASH); 3020 + wx_enable_rss(wx, wx->rss_enabled); 3027 3021 3028 3022 netdev->features = features; 3029 3023
+17 -5
drivers/net/ethernet/wangxun/libwx/wx_sriov.c
··· 150 150 struct wx *wx = pci_get_drvdata(dev); 151 151 int err = 0, i; 152 152 153 + if (netif_is_rxfh_configured(wx->netdev)) { 154 + wx_err(wx, "Cannot enable SR-IOV while RXFH is configured\n"); 155 + wx_err(wx, "Run 'ethtool -X <if> default' to reset RSS table\n"); 156 + return -EBUSY; 157 + } 158 + 153 159 err = __wx_enable_sriov(wx, num_vfs); 154 160 if (err) 155 161 return err; ··· 179 173 return err; 180 174 } 181 175 182 - static void wx_pci_sriov_disable(struct pci_dev *dev) 176 + static int wx_pci_sriov_disable(struct pci_dev *dev) 183 177 { 184 178 struct wx *wx = pci_get_drvdata(dev); 185 179 180 + if (netif_is_rxfh_configured(wx->netdev)) { 181 + wx_err(wx, "Cannot disable SR-IOV while RXFH is configured\n"); 182 + wx_err(wx, "Run 'ethtool -X <if> default' to reset RSS table\n"); 183 + return -EBUSY; 184 + } 185 + 186 186 wx_disable_sriov(wx); 187 187 wx_sriov_reinit(wx); 188 + 189 + return 0; 188 190 } 189 191 190 192 int wx_pci_sriov_configure(struct pci_dev *pdev, int num_vfs) ··· 201 187 int err; 202 188 203 189 if (!num_vfs) { 204 - if (!pci_vfs_assigned(pdev)) { 205 - wx_pci_sriov_disable(pdev); 206 - return 0; 207 - } 190 + if (!pci_vfs_assigned(pdev)) 191 + return wx_pci_sriov_disable(pdev); 208 192 209 193 wx_err(wx, "can't free VFs because some are assigned to VMs.\n"); 210 194 return -EBUSY;
+23
drivers/net/ethernet/wangxun/libwx/wx_type.h
··· 168 168 #define WX_RDB_PL_CFG_L2HDR BIT(3) 169 169 #define WX_RDB_PL_CFG_TUN_TUNHDR BIT(4) 170 170 #define WX_RDB_PL_CFG_TUN_OUTL2HDR BIT(5) 171 + #define WX_RDB_PL_CFG_RSS_EN BIT(24) 172 + #define WX_RDB_PL_CFG_RSS_MASK GENMASK(23, 16) 171 173 #define WX_RDB_RSSTBL(_i) (0x19400 + ((_i) * 4)) 172 174 #define WX_RDB_RSSRK(_i) (0x19480 + ((_i) * 4)) 173 175 #define WX_RDB_RA_CTL 0x194F4 176 + #define WX_RDB_RA_CTL_MULTI_RSS BIT(0) 174 177 #define WX_RDB_RA_CTL_RSS_EN BIT(2) /* RSS Enable */ 175 178 #define WX_RDB_RA_CTL_RSS_IPV4_TCP BIT(16) 176 179 #define WX_RDB_RA_CTL_RSS_IPV4 BIT(17) ··· 181 178 #define WX_RDB_RA_CTL_RSS_IPV6_TCP BIT(21) 182 179 #define WX_RDB_RA_CTL_RSS_IPV4_UDP BIT(22) 183 180 #define WX_RDB_RA_CTL_RSS_IPV6_UDP BIT(23) 181 + #define WX_RDB_RA_CTL_RSS_MASK GENMASK(23, 16) 184 182 #define WX_RDB_FDIR_MATCH 0x19558 185 183 #define WX_RDB_FDIR_MISS 0x1955C 184 + /* VM RSS */ 185 + #define WX_RDB_VMRSSRK(_i, _p) (0x1A000 + ((_i) * 4) + ((_p) * 0x40)) 186 + #define WX_RDB_VMRSSTBL(_i, _p) (0x1B000 + ((_i) * 4) + ((_p) * 0x40)) 186 187 187 188 /******************************* PSR Registers *******************************/ 188 189 /* psr control */ ··· 1199 1192 u8 vf_macvlan[ETH_ALEN]; 1200 1193 }; 1201 1194 1195 + #define WX_RSS_FIELD_IPV4_TCP BIT(0) 1196 + #define WX_RSS_FIELD_IPV4 BIT(1) 1197 + #define WX_RSS_FIELD_IPV4_SCTP BIT(2) 1198 + #define WX_RSS_FIELD_IPV6_SCTP BIT(3) 1199 + #define WX_RSS_FIELD_IPV6_TCP BIT(4) 1200 + #define WX_RSS_FIELD_IPV6 BIT(5) 1201 + #define WX_RSS_FIELD_IPV4_UDP BIT(6) 1202 + #define WX_RSS_FIELD_IPV6_UDP BIT(7) 1203 + 1204 + struct wx_rss_flow_map { 1205 + u8 flow_type; 1206 + u32 data; 1207 + u8 flag; 1208 + }; 1209 + 1202 1210 enum wx_pf_flags { 1203 1211 WX_FLAG_MULTI_64_FUNC, 1204 1212 WX_FLAG_SWFW_RING, ··· 1324 1302 #define WX_MAX_RETA_ENTRIES 128 1325 1303 #define WX_RSS_INDIR_TBL_MAX 64 1326 1304 u8 rss_indir_tbl[WX_MAX_RETA_ENTRIES]; 1305 + u8 rss_flags; 1327 1306 bool rss_enabled; 1328 1307 #define WX_RSS_KEY_SIZE 40 /* size of RSS Hash Key in bytes */ 1329 1308 u32 *rss_key;
+6
drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c
··· 137 137 .set_coalesce = wx_set_coalesce, 138 138 .get_channels = wx_get_channels, 139 139 .set_channels = ngbe_set_channels, 140 + .get_rxfh_fields = wx_get_rxfh_fields, 141 + .set_rxfh_fields = wx_set_rxfh_fields, 142 + .get_rxfh_indir_size = wx_rss_indir_size, 143 + .get_rxfh_key_size = wx_get_rxfh_key_size, 144 + .get_rxfh = wx_get_rxfh, 145 + .set_rxfh = wx_set_rxfh, 140 146 .get_msglevel = wx_get_msglevel, 141 147 .set_msglevel = wx_set_msglevel, 142 148 .get_ts_info = wx_get_ts_info,
+6
drivers/net/ethernet/wangxun/txgbe/txgbe_ethtool.c
··· 560 560 .set_channels = txgbe_set_channels, 561 561 .get_rxnfc = txgbe_get_rxnfc, 562 562 .set_rxnfc = txgbe_set_rxnfc, 563 + .get_rxfh_fields = wx_get_rxfh_fields, 564 + .set_rxfh_fields = wx_set_rxfh_fields, 565 + .get_rxfh_indir_size = wx_rss_indir_size, 566 + .get_rxfh_key_size = wx_get_rxfh_key_size, 567 + .get_rxfh = wx_get_rxfh, 568 + .set_rxfh = wx_set_rxfh, 563 569 .get_msglevel = wx_get_msglevel, 564 570 .set_msglevel = wx_set_msglevel, 565 571 .get_ts_info = wx_get_ts_info,