Lines Matching +full:flow +full:- +full:controlled
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2018 Intel Corporation. */
15 * struct iavf_stats - definition for an ethtool statistic
16 * @stat_string: statistic name to display in ethtool -S output
58 IAVF_QUEUE_STAT("%s-%u.packets", stats.packets),
59 IAVF_QUEUE_STAT("%s-%u.bytes", stats.bytes),
63 * iavf_add_one_ethtool_stat - copy the stat into the supplied buffer
86 p = (char *)pointer + stat->stat_offset; in iavf_add_one_ethtool_stat()
87 switch (stat->sizeof_stat) { in iavf_add_one_ethtool_stat()
102 stat->stat_string); in iavf_add_one_ethtool_stat()
108 * __iavf_add_ethtool_stats - copy stats into the ethtool supplied buffer
132 * iavf_add_ethtool_stats - copy stats into ethtool supplied buffer
148 * iavf_add_queue_stats - copy queue statistics into supplied buffer
172 * non-null before attempting to access its syncp. in iavf_add_queue_stats()
175 start = !ring ? 0 : u64_stats_fetch_begin(&ring->syncp); in iavf_add_queue_stats()
178 } while (ring && u64_stats_fetch_retry(&ring->syncp, start)); in iavf_add_queue_stats()
185 * __iavf_add_stat_strings - copy stat strings into ethtool buffer
209 * iavf_add_stat_strings - copy stat strings into ethtool buffer
246 * iavf_get_link_ksettings - Get Link Speed and Duplex settings
259 cmd->base.autoneg = AUTONEG_DISABLE; in iavf_get_link_ksettings()
260 cmd->base.port = PORT_NONE; in iavf_get_link_ksettings()
261 cmd->base.duplex = DUPLEX_FULL; in iavf_get_link_ksettings()
264 if (adapter->link_speed_mbps && in iavf_get_link_ksettings()
265 adapter->link_speed_mbps < U32_MAX) in iavf_get_link_ksettings()
266 cmd->base.speed = adapter->link_speed_mbps; in iavf_get_link_ksettings()
268 cmd->base.speed = SPEED_UNKNOWN; in iavf_get_link_ksettings()
273 switch (adapter->link_speed) { in iavf_get_link_ksettings()
275 cmd->base.speed = SPEED_40000; in iavf_get_link_ksettings()
278 cmd->base.speed = SPEED_25000; in iavf_get_link_ksettings()
281 cmd->base.speed = SPEED_20000; in iavf_get_link_ksettings()
284 cmd->base.speed = SPEED_10000; in iavf_get_link_ksettings()
287 cmd->base.speed = SPEED_5000; in iavf_get_link_ksettings()
290 cmd->base.speed = SPEED_2500; in iavf_get_link_ksettings()
293 cmd->base.speed = SPEED_1000; in iavf_get_link_ksettings()
296 cmd->base.speed = SPEED_100; in iavf_get_link_ksettings()
306 * iavf_get_sset_count - Get length of string set
316 * use netdev->real_num_tx_queues * 2. The real_num_tx_queues is set in iavf_get_sset_count()
323 netdev->real_num_tx_queues); in iavf_get_sset_count()
325 return -EINVAL; in iavf_get_sset_count()
329 * iavf_get_ethtool_stats - report device statistics
351 for (i = 0; i < adapter->num_active_queues; i++) { in iavf_get_ethtool_stats()
355 ring = &adapter->tx_rings[i]; in iavf_get_ethtool_stats()
359 ring = &adapter->rx_rings[i]; in iavf_get_ethtool_stats()
366 * iavf_get_stat_strings - Get stat strings
381 for (i = 0; i < netdev->real_num_tx_queues; i++) { in iavf_get_stat_strings()
390 * iavf_get_strings - Get string set
409 * iavf_get_msglevel - Get debug message level
418 return adapter->msg_enable; in iavf_get_msglevel()
422 * iavf_set_msglevel - Set debug message level
434 adapter->hw.debug_mask = data; in iavf_set_msglevel()
435 adapter->msg_enable = data; in iavf_set_msglevel()
439 * iavf_get_drvinfo - Get driver info
450 strscpy(drvinfo->driver, iavf_driver_name, 32); in iavf_get_drvinfo()
451 strscpy(drvinfo->fw_version, "N/A", 4); in iavf_get_drvinfo()
452 strscpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); in iavf_get_drvinfo()
456 * iavf_get_ringparam - Get ring parameters
472 ring->rx_max_pending = IAVF_MAX_RXD; in iavf_get_ringparam()
473 ring->tx_max_pending = IAVF_MAX_TXD; in iavf_get_ringparam()
474 ring->rx_pending = adapter->rx_desc_count; in iavf_get_ringparam()
475 ring->tx_pending = adapter->tx_desc_count; in iavf_get_ringparam()
479 * iavf_set_ringparam - Set ring parameters
485 * Sets ring parameters. TX and RX rings are controlled separately, but the
497 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) in iavf_set_ringparam()
498 return -EINVAL; in iavf_set_ringparam()
500 if (ring->tx_pending > IAVF_MAX_TXD || in iavf_set_ringparam()
501 ring->tx_pending < IAVF_MIN_TXD || in iavf_set_ringparam()
502 ring->rx_pending > IAVF_MAX_RXD || in iavf_set_ringparam()
503 ring->rx_pending < IAVF_MIN_RXD) { in iavf_set_ringparam()
504 …netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n", in iavf_set_ringparam()
505 ring->tx_pending, ring->rx_pending, IAVF_MIN_TXD, in iavf_set_ringparam()
507 return -EINVAL; in iavf_set_ringparam()
510 new_tx_count = ALIGN(ring->tx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE); in iavf_set_ringparam()
511 if (new_tx_count != ring->tx_pending) in iavf_set_ringparam()
515 new_rx_count = ALIGN(ring->rx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE); in iavf_set_ringparam()
516 if (new_rx_count != ring->rx_pending) in iavf_set_ringparam()
521 if ((new_tx_count == adapter->tx_desc_count) && in iavf_set_ringparam()
522 (new_rx_count == adapter->rx_desc_count)) { in iavf_set_ringparam()
527 if (new_tx_count != adapter->tx_desc_count) { in iavf_set_ringparam()
529 adapter->tx_desc_count, new_tx_count); in iavf_set_ringparam()
530 adapter->tx_desc_count = new_tx_count; in iavf_set_ringparam()
533 if (new_rx_count != adapter->rx_desc_count) { in iavf_set_ringparam()
535 adapter->rx_desc_count, new_rx_count); in iavf_set_ringparam()
536 adapter->rx_desc_count = new_rx_count; in iavf_set_ringparam()
550 * __iavf_get_coalesce - get per-queue coalesce settings
555 * Gets the per-queue settings for coalescence. Specifically Rx and Tx usecs
570 else if (queue >= adapter->num_active_queues) in __iavf_get_coalesce()
571 return -EINVAL; in __iavf_get_coalesce()
573 rx_ring = &adapter->rx_rings[queue]; in __iavf_get_coalesce()
574 tx_ring = &adapter->tx_rings[queue]; in __iavf_get_coalesce()
576 if (ITR_IS_DYNAMIC(rx_ring->itr_setting)) in __iavf_get_coalesce()
577 ec->use_adaptive_rx_coalesce = 1; in __iavf_get_coalesce()
579 if (ITR_IS_DYNAMIC(tx_ring->itr_setting)) in __iavf_get_coalesce()
580 ec->use_adaptive_tx_coalesce = 1; in __iavf_get_coalesce()
582 ec->rx_coalesce_usecs = rx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in __iavf_get_coalesce()
583 ec->tx_coalesce_usecs = tx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in __iavf_get_coalesce()
589 * iavf_get_coalesce - Get interrupt coalescing settings
597 * this functionality. Note that if per-queue settings have been modified this
605 return __iavf_get_coalesce(netdev, ec, -1); in iavf_get_coalesce()
609 * iavf_get_per_queue_coalesce - get coalesce values for specific queue
623 * iavf_set_itr_per_queue - set ITR values for specific queue
633 struct iavf_ring *rx_ring = &adapter->rx_rings[queue]; in iavf_set_itr_per_queue()
634 struct iavf_ring *tx_ring = &adapter->tx_rings[queue]; in iavf_set_itr_per_queue()
638 itr_setting = rx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
640 if (ec->rx_coalesce_usecs != itr_setting && in iavf_set_itr_per_queue()
641 ec->use_adaptive_rx_coalesce) { in iavf_set_itr_per_queue()
642 netif_info(adapter, drv, adapter->netdev, in iavf_set_itr_per_queue()
643 "Rx interrupt throttling cannot be changed if adaptive-rx is enabled\n"); in iavf_set_itr_per_queue()
644 return -EINVAL; in iavf_set_itr_per_queue()
647 itr_setting = tx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
649 if (ec->tx_coalesce_usecs != itr_setting && in iavf_set_itr_per_queue()
650 ec->use_adaptive_tx_coalesce) { in iavf_set_itr_per_queue()
651 netif_info(adapter, drv, adapter->netdev, in iavf_set_itr_per_queue()
652 "Tx interrupt throttling cannot be changed if adaptive-tx is enabled\n"); in iavf_set_itr_per_queue()
653 return -EINVAL; in iavf_set_itr_per_queue()
656 rx_ring->itr_setting = ITR_REG_ALIGN(ec->rx_coalesce_usecs); in iavf_set_itr_per_queue()
657 tx_ring->itr_setting = ITR_REG_ALIGN(ec->tx_coalesce_usecs); in iavf_set_itr_per_queue()
659 rx_ring->itr_setting |= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
660 if (!ec->use_adaptive_rx_coalesce) in iavf_set_itr_per_queue()
661 rx_ring->itr_setting ^= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
663 tx_ring->itr_setting |= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
664 if (!ec->use_adaptive_tx_coalesce) in iavf_set_itr_per_queue()
665 tx_ring->itr_setting ^= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
667 q_vector = rx_ring->q_vector; in iavf_set_itr_per_queue()
668 q_vector->rx.target_itr = ITR_TO_REG(rx_ring->itr_setting); in iavf_set_itr_per_queue()
670 q_vector = tx_ring->q_vector; in iavf_set_itr_per_queue()
671 q_vector->tx.target_itr = ITR_TO_REG(tx_ring->itr_setting); in iavf_set_itr_per_queue()
681 * __iavf_set_coalesce - set coalesce settings for particular queue
694 if (ec->rx_coalesce_usecs > IAVF_MAX_ITR) { in __iavf_set_coalesce()
695 netif_info(adapter, drv, netdev, "Invalid value, rx-usecs range is 0-8160\n"); in __iavf_set_coalesce()
696 return -EINVAL; in __iavf_set_coalesce()
697 } else if (ec->tx_coalesce_usecs > IAVF_MAX_ITR) { in __iavf_set_coalesce()
698 netif_info(adapter, drv, netdev, "Invalid value, tx-usecs range is 0-8160\n"); in __iavf_set_coalesce()
699 return -EINVAL; in __iavf_set_coalesce()
706 for (i = 0; i < adapter->num_active_queues; i++) in __iavf_set_coalesce()
708 return -EINVAL; in __iavf_set_coalesce()
709 } else if (queue < adapter->num_active_queues) { in __iavf_set_coalesce()
711 return -EINVAL; in __iavf_set_coalesce()
713 netif_info(adapter, drv, netdev, "Invalid queue value, queue range is 0 - %d\n", in __iavf_set_coalesce()
714 adapter->num_active_queues - 1); in __iavf_set_coalesce()
715 return -EINVAL; in __iavf_set_coalesce()
722 * iavf_set_coalesce - Set interrupt coalescing settings
735 return __iavf_set_coalesce(netdev, ec, -1); in iavf_set_coalesce()
739 * iavf_set_per_queue_coalesce - set specific queue's coalesce settings
753 * iavf_fltr_to_ethtool_flow - convert filter type values to ethtool
754 * flow type values
755 * @flow: filter type to be converted
757 * Returns the corresponding ethtool flow type.
759 static int iavf_fltr_to_ethtool_flow(enum iavf_fdir_flow_type flow) in iavf_fltr_to_ethtool_flow() argument
761 switch (flow) { in iavf_fltr_to_ethtool_flow()
789 /* 0 is undefined ethtool flow */ in iavf_fltr_to_ethtool_flow()
795 * iavf_ethtool_flow_to_fltr - convert ethtool flow type to filter enum
796 * @eth: Ethtool flow type to be converted
798 * Returns flow enum
835 * iavf_is_mask_valid - check mask field set
848 * iavf_parse_rx_flow_user_data - deconstruct user-defined data
849 * @fsp: pointer to ethtool Rx flow specification
850 * @fltr: pointer to Flow Director filter for userdef data storage
861 if (!(fsp->flow_type & FLOW_EXT)) in iavf_parse_rx_flow_user_data()
869 u32 value = be32_to_cpu(fsp->h_ext.data[i]); in iavf_parse_rx_flow_user_data()
870 u32 mask = be32_to_cpu(fsp->m_ext.data[i]); in iavf_parse_rx_flow_user_data()
876 return -EINVAL; in iavf_parse_rx_flow_user_data()
882 flex = &fltr->flex_words[cnt++]; in iavf_parse_rx_flow_user_data()
883 flex->word = value & IAVF_USERDEF_FLEX_WORD_M; in iavf_parse_rx_flow_user_data()
884 flex->offset = FIELD_GET(IAVF_USERDEF_FLEX_OFFS_M, value); in iavf_parse_rx_flow_user_data()
885 if (flex->offset > IAVF_USERDEF_FLEX_MAX_OFFS_VAL) in iavf_parse_rx_flow_user_data()
886 return -EINVAL; in iavf_parse_rx_flow_user_data()
889 fltr->flex_cnt = cnt; in iavf_parse_rx_flow_user_data()
895 * iavf_fill_rx_flow_ext_data - fill the additional data
896 * @fsp: pointer to ethtool Rx flow specification
897 * @fltr: pointer to Flow Director filter to get additional data
903 if (!fltr->ext_mask.usr_def[0] && !fltr->ext_mask.usr_def[1]) in iavf_fill_rx_flow_ext_data()
906 fsp->flow_type |= FLOW_EXT; in iavf_fill_rx_flow_ext_data()
908 memcpy(fsp->h_ext.data, fltr->ext_data.usr_def, sizeof(fsp->h_ext.data)); in iavf_fill_rx_flow_ext_data()
909 memcpy(fsp->m_ext.data, fltr->ext_mask.usr_def, sizeof(fsp->m_ext.data)); in iavf_fill_rx_flow_ext_data()
913 * iavf_get_ethtool_fdir_entry - fill ethtool structure with Flow Director filter data
923 struct ethtool_rx_flow_spec *fsp = (struct ethtool_rx_flow_spec *)&cmd->fs; in iavf_get_ethtool_fdir_entry()
927 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_ethtool_fdir_entry()
928 return -EOPNOTSUPP; in iavf_get_ethtool_fdir_entry()
930 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_ethtool_fdir_entry()
932 rule = iavf_find_fdir_fltr(adapter, false, fsp->location); in iavf_get_ethtool_fdir_entry()
934 ret = -EINVAL; in iavf_get_ethtool_fdir_entry()
938 fsp->flow_type = iavf_fltr_to_ethtool_flow(rule->flow_type); in iavf_get_ethtool_fdir_entry()
940 memset(&fsp->m_u, 0, sizeof(fsp->m_u)); in iavf_get_ethtool_fdir_entry()
941 memset(&fsp->m_ext, 0, sizeof(fsp->m_ext)); in iavf_get_ethtool_fdir_entry()
943 switch (fsp->flow_type) { in iavf_get_ethtool_fdir_entry()
947 fsp->h_u.tcp_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
948 fsp->h_u.tcp_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
949 fsp->h_u.tcp_ip4_spec.psrc = rule->ip_data.src_port; in iavf_get_ethtool_fdir_entry()
950 fsp->h_u.tcp_ip4_spec.pdst = rule->ip_data.dst_port; in iavf_get_ethtool_fdir_entry()
951 fsp->h_u.tcp_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
952 fsp->m_u.tcp_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
953 fsp->m_u.tcp_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
954 fsp->m_u.tcp_ip4_spec.psrc = rule->ip_mask.src_port; in iavf_get_ethtool_fdir_entry()
955 fsp->m_u.tcp_ip4_spec.pdst = rule->ip_mask.dst_port; in iavf_get_ethtool_fdir_entry()
956 fsp->m_u.tcp_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
960 fsp->h_u.ah_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
961 fsp->h_u.ah_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
962 fsp->h_u.ah_ip4_spec.spi = rule->ip_data.spi; in iavf_get_ethtool_fdir_entry()
963 fsp->h_u.ah_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
964 fsp->m_u.ah_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
965 fsp->m_u.ah_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
966 fsp->m_u.ah_ip4_spec.spi = rule->ip_mask.spi; in iavf_get_ethtool_fdir_entry()
967 fsp->m_u.ah_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
970 fsp->h_u.usr_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
971 fsp->h_u.usr_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
972 fsp->h_u.usr_ip4_spec.l4_4_bytes = rule->ip_data.l4_header; in iavf_get_ethtool_fdir_entry()
973 fsp->h_u.usr_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
974 fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4; in iavf_get_ethtool_fdir_entry()
975 fsp->h_u.usr_ip4_spec.proto = rule->ip_data.proto; in iavf_get_ethtool_fdir_entry()
976 fsp->m_u.usr_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
977 fsp->m_u.usr_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
978 fsp->m_u.usr_ip4_spec.l4_4_bytes = rule->ip_mask.l4_header; in iavf_get_ethtool_fdir_entry()
979 fsp->m_u.usr_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
980 fsp->m_u.usr_ip4_spec.ip_ver = 0xFF; in iavf_get_ethtool_fdir_entry()
981 fsp->m_u.usr_ip4_spec.proto = rule->ip_mask.proto; in iavf_get_ethtool_fdir_entry()
986 memcpy(fsp->h_u.usr_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
988 memcpy(fsp->h_u.usr_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
990 fsp->h_u.tcp_ip6_spec.psrc = rule->ip_data.src_port; in iavf_get_ethtool_fdir_entry()
991 fsp->h_u.tcp_ip6_spec.pdst = rule->ip_data.dst_port; in iavf_get_ethtool_fdir_entry()
992 fsp->h_u.tcp_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
993 memcpy(fsp->m_u.usr_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
995 memcpy(fsp->m_u.usr_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
997 fsp->m_u.tcp_ip6_spec.psrc = rule->ip_mask.src_port; in iavf_get_ethtool_fdir_entry()
998 fsp->m_u.tcp_ip6_spec.pdst = rule->ip_mask.dst_port; in iavf_get_ethtool_fdir_entry()
999 fsp->m_u.tcp_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1003 memcpy(fsp->h_u.ah_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1005 memcpy(fsp->h_u.ah_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1007 fsp->h_u.ah_ip6_spec.spi = rule->ip_data.spi; in iavf_get_ethtool_fdir_entry()
1008 fsp->h_u.ah_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
1009 memcpy(fsp->m_u.ah_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1011 memcpy(fsp->m_u.ah_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1013 fsp->m_u.ah_ip6_spec.spi = rule->ip_mask.spi; in iavf_get_ethtool_fdir_entry()
1014 fsp->m_u.ah_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1017 memcpy(fsp->h_u.usr_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1019 memcpy(fsp->h_u.usr_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1021 fsp->h_u.usr_ip6_spec.l4_4_bytes = rule->ip_data.l4_header; in iavf_get_ethtool_fdir_entry()
1022 fsp->h_u.usr_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
1023 fsp->h_u.usr_ip6_spec.l4_proto = rule->ip_data.proto; in iavf_get_ethtool_fdir_entry()
1024 memcpy(fsp->m_u.usr_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1026 memcpy(fsp->m_u.usr_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1028 fsp->m_u.usr_ip6_spec.l4_4_bytes = rule->ip_mask.l4_header; in iavf_get_ethtool_fdir_entry()
1029 fsp->m_u.usr_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1030 fsp->m_u.usr_ip6_spec.l4_proto = rule->ip_mask.proto; in iavf_get_ethtool_fdir_entry()
1033 fsp->h_u.ether_spec.h_proto = rule->eth_data.etype; in iavf_get_ethtool_fdir_entry()
1034 fsp->m_u.ether_spec.h_proto = rule->eth_mask.etype; in iavf_get_ethtool_fdir_entry()
1037 ret = -EINVAL; in iavf_get_ethtool_fdir_entry()
1043 if (rule->action == VIRTCHNL_ACTION_DROP) in iavf_get_ethtool_fdir_entry()
1044 fsp->ring_cookie = RX_CLS_FLOW_DISC; in iavf_get_ethtool_fdir_entry()
1046 fsp->ring_cookie = rule->q_index; in iavf_get_ethtool_fdir_entry()
1049 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_ethtool_fdir_entry()
1054 * iavf_get_fdir_fltr_ids - fill buffer with filter IDs of active filters
1069 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_fdir_fltr_ids()
1070 return -EOPNOTSUPP; in iavf_get_fdir_fltr_ids()
1072 cmd->data = IAVF_MAX_FDIR_FILTERS; in iavf_get_fdir_fltr_ids()
1074 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_fdir_fltr_ids()
1076 list_for_each_entry(fltr, &adapter->fdir_list_head, list) { in iavf_get_fdir_fltr_ids()
1080 if (cnt == cmd->rule_cnt) { in iavf_get_fdir_fltr_ids()
1081 val = -EMSGSIZE; in iavf_get_fdir_fltr_ids()
1084 rule_locs[cnt] = fltr->loc; in iavf_get_fdir_fltr_ids()
1089 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_fdir_fltr_ids()
1091 cmd->rule_cnt = cnt; in iavf_get_fdir_fltr_ids()
1097 * iavf_add_fdir_fltr_info - Set the input set for Flow Director filter
1099 * @fsp: pointer to ethtool Rx flow specification
1110 if (fsp->ring_cookie == RX_CLS_FLOW_DISC) { in iavf_add_fdir_fltr_info()
1113 q_index = fsp->ring_cookie; in iavf_add_fdir_fltr_info()
1114 if (q_index >= adapter->num_active_queues) in iavf_add_fdir_fltr_info()
1115 return -EINVAL; in iavf_add_fdir_fltr_info()
1120 fltr->action = act; in iavf_add_fdir_fltr_info()
1121 fltr->loc = fsp->location; in iavf_add_fdir_fltr_info()
1122 fltr->q_index = q_index; in iavf_add_fdir_fltr_info()
1124 if (fsp->flow_type & FLOW_EXT) { in iavf_add_fdir_fltr_info()
1125 memcpy(fltr->ext_data.usr_def, fsp->h_ext.data, in iavf_add_fdir_fltr_info()
1126 sizeof(fltr->ext_data.usr_def)); in iavf_add_fdir_fltr_info()
1127 memcpy(fltr->ext_mask.usr_def, fsp->m_ext.data, in iavf_add_fdir_fltr_info()
1128 sizeof(fltr->ext_mask.usr_def)); in iavf_add_fdir_fltr_info()
1131 flow_type = fsp->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT | FLOW_RSS); in iavf_add_fdir_fltr_info()
1132 fltr->flow_type = iavf_ethtool_flow_to_fltr(flow_type); in iavf_add_fdir_fltr_info()
1138 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.tcp_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1139 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.tcp_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1140 fltr->ip_data.src_port = fsp->h_u.tcp_ip4_spec.psrc; in iavf_add_fdir_fltr_info()
1141 fltr->ip_data.dst_port = fsp->h_u.tcp_ip4_spec.pdst; in iavf_add_fdir_fltr_info()
1142 fltr->ip_data.tos = fsp->h_u.tcp_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1143 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.tcp_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1144 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.tcp_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1145 fltr->ip_mask.src_port = fsp->m_u.tcp_ip4_spec.psrc; in iavf_add_fdir_fltr_info()
1146 fltr->ip_mask.dst_port = fsp->m_u.tcp_ip4_spec.pdst; in iavf_add_fdir_fltr_info()
1147 fltr->ip_mask.tos = fsp->m_u.tcp_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1148 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1152 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.ah_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1153 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.ah_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1154 fltr->ip_data.spi = fsp->h_u.ah_ip4_spec.spi; in iavf_add_fdir_fltr_info()
1155 fltr->ip_data.tos = fsp->h_u.ah_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1156 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.ah_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1157 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.ah_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1158 fltr->ip_mask.spi = fsp->m_u.ah_ip4_spec.spi; in iavf_add_fdir_fltr_info()
1159 fltr->ip_mask.tos = fsp->m_u.ah_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1160 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1163 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.usr_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1164 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.usr_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1165 fltr->ip_data.l4_header = fsp->h_u.usr_ip4_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1166 fltr->ip_data.tos = fsp->h_u.usr_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1167 fltr->ip_data.proto = fsp->h_u.usr_ip4_spec.proto; in iavf_add_fdir_fltr_info()
1168 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.usr_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1169 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.usr_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1170 fltr->ip_mask.l4_header = fsp->m_u.usr_ip4_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1171 fltr->ip_mask.tos = fsp->m_u.usr_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1172 fltr->ip_mask.proto = fsp->m_u.usr_ip4_spec.proto; in iavf_add_fdir_fltr_info()
1173 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1178 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1180 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1182 fltr->ip_data.src_port = fsp->h_u.tcp_ip6_spec.psrc; in iavf_add_fdir_fltr_info()
1183 fltr->ip_data.dst_port = fsp->h_u.tcp_ip6_spec.pdst; in iavf_add_fdir_fltr_info()
1184 fltr->ip_data.tclass = fsp->h_u.tcp_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1185 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1187 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1189 fltr->ip_mask.src_port = fsp->m_u.tcp_ip6_spec.psrc; in iavf_add_fdir_fltr_info()
1190 fltr->ip_mask.dst_port = fsp->m_u.tcp_ip6_spec.pdst; in iavf_add_fdir_fltr_info()
1191 fltr->ip_mask.tclass = fsp->m_u.tcp_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1192 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1196 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.ah_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1198 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.ah_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1200 fltr->ip_data.spi = fsp->h_u.ah_ip6_spec.spi; in iavf_add_fdir_fltr_info()
1201 fltr->ip_data.tclass = fsp->h_u.ah_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1202 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.ah_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1204 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.ah_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1206 fltr->ip_mask.spi = fsp->m_u.ah_ip6_spec.spi; in iavf_add_fdir_fltr_info()
1207 fltr->ip_mask.tclass = fsp->m_u.ah_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1208 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1211 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1213 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1215 fltr->ip_data.l4_header = fsp->h_u.usr_ip6_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1216 fltr->ip_data.tclass = fsp->h_u.usr_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1217 fltr->ip_data.proto = fsp->h_u.usr_ip6_spec.l4_proto; in iavf_add_fdir_fltr_info()
1218 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1220 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1222 fltr->ip_mask.l4_header = fsp->m_u.usr_ip6_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1223 fltr->ip_mask.tclass = fsp->m_u.usr_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1224 fltr->ip_mask.proto = fsp->m_u.usr_ip6_spec.l4_proto; in iavf_add_fdir_fltr_info()
1225 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1228 fltr->eth_data.etype = fsp->h_u.ether_spec.h_proto; in iavf_add_fdir_fltr_info()
1229 fltr->eth_mask.etype = fsp->m_u.ether_spec.h_proto; in iavf_add_fdir_fltr_info()
1232 /* not doing un-parsed flow types */ in iavf_add_fdir_fltr_info()
1233 return -EINVAL; in iavf_add_fdir_fltr_info()
1241 return -EEXIST; in iavf_add_fdir_fltr_info()
1251 * iavf_add_fdir_ethtool - add Flow Director filter
1253 * @cmd: command to add Flow Director filter
1259 struct ethtool_rx_flow_spec *fsp = &cmd->fs; in iavf_add_fdir_ethtool()
1263 netdev_assert_locked(adapter->netdev); in iavf_add_fdir_ethtool()
1265 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_add_fdir_ethtool()
1266 return -EOPNOTSUPP; in iavf_add_fdir_ethtool()
1268 if (fsp->flow_type & FLOW_MAC_EXT) in iavf_add_fdir_ethtool()
1269 return -EINVAL; in iavf_add_fdir_ethtool()
1271 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1272 if (iavf_find_fdir_fltr(adapter, false, fsp->location)) { in iavf_add_fdir_ethtool()
1273 dev_err(&adapter->pdev->dev, "Failed to add Flow Director filter, it already exists\n"); in iavf_add_fdir_ethtool()
1274 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1275 return -EEXIST; in iavf_add_fdir_ethtool()
1277 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1281 return -ENOMEM; in iavf_add_fdir_ethtool()
1294 * iavf_del_fdir_ethtool - delete Flow Director filter
1296 * @cmd: command to delete Flow Director filter
1302 struct ethtool_rx_flow_spec *fsp = (struct ethtool_rx_flow_spec *)&cmd->fs; in iavf_del_fdir_ethtool()
1304 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_del_fdir_ethtool()
1305 return -EOPNOTSUPP; in iavf_del_fdir_ethtool()
1307 return iavf_fdir_del_fltr(adapter, false, fsp->location); in iavf_del_fdir_ethtool()
1314 switch (cmd->flow_type) { in iavf_adv_rss_parse_hdrs()
1351 if (cmd->data & RXH_IP_SRC || cmd->data & RXH_IP_DST) { in iavf_adv_rss_parse_hash_flds()
1352 switch (cmd->flow_type) { in iavf_adv_rss_parse_hash_flds()
1356 if (cmd->data & RXH_IP_SRC) in iavf_adv_rss_parse_hash_flds()
1358 if (cmd->data & RXH_IP_DST) in iavf_adv_rss_parse_hash_flds()
1364 if (cmd->data & RXH_IP_SRC) in iavf_adv_rss_parse_hash_flds()
1366 if (cmd->data & RXH_IP_DST) in iavf_adv_rss_parse_hash_flds()
1374 if (cmd->data & RXH_L4_B_0_1 || cmd->data & RXH_L4_B_2_3) { in iavf_adv_rss_parse_hash_flds()
1375 switch (cmd->flow_type) { in iavf_adv_rss_parse_hash_flds()
1378 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1380 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1385 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1387 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1392 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1394 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1418 netdev_assert_locked(adapter->netdev); in iavf_set_rxfh_fields()
1421 return -EOPNOTSUPP; in iavf_set_rxfh_fields()
1423 symm = !!(adapter->hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC); in iavf_set_rxfh_fields()
1427 return -EINVAL; in iavf_set_rxfh_fields()
1431 return -EINVAL; in iavf_set_rxfh_fields()
1435 return -ENOMEM; in iavf_set_rxfh_fields()
1437 if (iavf_fill_adv_rss_cfg_msg(&rss_new->cfg_msg, hdrs, hash_flds, in iavf_set_rxfh_fields()
1440 return -EINVAL; in iavf_set_rxfh_fields()
1443 spin_lock_bh(&adapter->adv_rss_lock); in iavf_set_rxfh_fields()
1446 if (rss_old->state != IAVF_ADV_RSS_ACTIVE) { in iavf_set_rxfh_fields()
1447 err = -EBUSY; in iavf_set_rxfh_fields()
1448 } else if (rss_old->hash_flds != hash_flds || in iavf_set_rxfh_fields()
1449 rss_old->symm != symm) { in iavf_set_rxfh_fields()
1450 rss_old->state = IAVF_ADV_RSS_ADD_REQUEST; in iavf_set_rxfh_fields()
1451 rss_old->hash_flds = hash_flds; in iavf_set_rxfh_fields()
1452 rss_old->symm = symm; in iavf_set_rxfh_fields()
1453 memcpy(&rss_old->cfg_msg, &rss_new->cfg_msg, in iavf_set_rxfh_fields()
1454 sizeof(rss_new->cfg_msg)); in iavf_set_rxfh_fields()
1456 err = -EEXIST; in iavf_set_rxfh_fields()
1460 rss_new->state = IAVF_ADV_RSS_ADD_REQUEST; in iavf_set_rxfh_fields()
1461 rss_new->packet_hdrs = hdrs; in iavf_set_rxfh_fields()
1462 rss_new->hash_flds = hash_flds; in iavf_set_rxfh_fields()
1463 rss_new->symm = symm; in iavf_set_rxfh_fields()
1464 list_add_tail(&rss_new->list, &adapter->adv_rss_list_head); in iavf_set_rxfh_fields()
1466 spin_unlock_bh(&adapter->adv_rss_lock); in iavf_set_rxfh_fields()
1486 return -EOPNOTSUPP; in iavf_get_rxfh_fields()
1488 cmd->data = 0; in iavf_get_rxfh_fields()
1492 return -EINVAL; in iavf_get_rxfh_fields()
1494 spin_lock_bh(&adapter->adv_rss_lock); in iavf_get_rxfh_fields()
1497 hash_flds = rss->hash_flds; in iavf_get_rxfh_fields()
1500 spin_unlock_bh(&adapter->adv_rss_lock); in iavf_get_rxfh_fields()
1503 return -EINVAL; in iavf_get_rxfh_fields()
1507 cmd->data |= (u64)RXH_IP_SRC; in iavf_get_rxfh_fields()
1511 cmd->data |= (u64)RXH_IP_DST; in iavf_get_rxfh_fields()
1516 cmd->data |= (u64)RXH_L4_B_0_1; in iavf_get_rxfh_fields()
1521 cmd->data |= (u64)RXH_L4_B_2_3; in iavf_get_rxfh_fields()
1527 * iavf_set_rxnfc - command to set Rx flow rules.
1536 int ret = -EOPNOTSUPP; in iavf_set_rxnfc()
1538 switch (cmd->cmd) { in iavf_set_rxnfc()
1553 * iavf_get_rxnfc - command to get RX flow classification rules
1564 int ret = -EOPNOTSUPP; in iavf_get_rxnfc()
1566 switch (cmd->cmd) { in iavf_get_rxnfc()
1568 cmd->data = adapter->num_active_queues; in iavf_get_rxnfc()
1572 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_rxnfc()
1574 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_rxnfc()
1575 cmd->rule_cnt = adapter->fdir_active_fltr; in iavf_get_rxnfc()
1576 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_rxnfc()
1577 cmd->data = IAVF_MAX_FDIR_FILTERS; in iavf_get_rxnfc()
1598 * queue pair. Report one extra channel to match our "other" MSI-X vector.
1606 ch->max_combined = adapter->vsi_res->num_queue_pairs; in iavf_get_channels()
1608 ch->max_other = NONQ_VECS; in iavf_get_channels()
1609 ch->other_count = NONQ_VECS; in iavf_get_channels()
1611 ch->combined_count = adapter->num_active_queues; in iavf_get_channels()
1627 u32 num_req = ch->combined_count; in iavf_set_channels()
1630 if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) && in iavf_set_channels()
1631 adapter->num_tc) { in iavf_set_channels()
1632 dev_info(&adapter->pdev->dev, "Cannot set channels since ADq is enabled.\n"); in iavf_set_channels()
1633 return -EINVAL; in iavf_set_channels()
1639 if (num_req == 0 || num_req > adapter->vsi_res->num_queue_pairs) in iavf_set_channels()
1640 return -EINVAL; in iavf_set_channels()
1642 if (num_req == adapter->num_active_queues) in iavf_set_channels()
1645 if (ch->rx_count || ch->tx_count || ch->other_count != NONQ_VECS) in iavf_set_channels()
1646 return -EINVAL; in iavf_set_channels()
1648 adapter->num_req_queues = num_req; in iavf_set_channels()
1649 adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED; in iavf_set_channels()
1660 * iavf_get_rxfh_key_size - get the RSS hash key size
1669 return adapter->rss_key_size; in iavf_get_rxfh_key_size()
1673 * iavf_get_rxfh_indir_size - get the rx flow hash indirection table size
1682 return adapter->rss_lut_size; in iavf_get_rxfh_indir_size()
1686 * iavf_get_rxfh - get the rx flow hash indirection table
1698 rxfh->hfunc = ETH_RSS_HASH_TOP; in iavf_get_rxfh()
1699 if (adapter->hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC) in iavf_get_rxfh()
1700 rxfh->input_xfrm |= RXH_XFRM_SYM_XOR; in iavf_get_rxfh()
1702 if (rxfh->key) in iavf_get_rxfh()
1703 memcpy(rxfh->key, adapter->rss_key, adapter->rss_key_size); in iavf_get_rxfh()
1705 if (rxfh->indir) in iavf_get_rxfh()
1707 for (i = 0; i < adapter->rss_lut_size; i++) in iavf_get_rxfh()
1708 rxfh->indir[i] = (u32)adapter->rss_lut[i]; in iavf_get_rxfh()
1714 * iavf_set_rxfh - set the rx flow hash indirection table
1719 * Returns -EINVAL if the table specifies an invalid queue id, otherwise
1730 if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE && in iavf_set_rxfh()
1731 rxfh->hfunc != ETH_RSS_HASH_TOP) in iavf_set_rxfh()
1732 return -EOPNOTSUPP; in iavf_set_rxfh()
1734 if ((rxfh->input_xfrm & RXH_XFRM_SYM_XOR) && in iavf_set_rxfh()
1735 adapter->hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC) { in iavf_set_rxfh()
1737 return -EOPNOTSUPP; in iavf_set_rxfh()
1738 adapter->hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC; in iavf_set_rxfh()
1739 adapter->aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC; in iavf_set_rxfh()
1740 } else if (!(rxfh->input_xfrm & RXH_XFRM_SYM_XOR) && in iavf_set_rxfh()
1741 adapter->hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC) { in iavf_set_rxfh()
1742 adapter->hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; in iavf_set_rxfh()
1743 adapter->aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC; in iavf_set_rxfh()
1746 if (!rxfh->key && !rxfh->indir) in iavf_set_rxfh()
1749 if (rxfh->key) in iavf_set_rxfh()
1750 memcpy(adapter->rss_key, rxfh->key, adapter->rss_key_size); in iavf_set_rxfh()
1752 if (rxfh->indir) { in iavf_set_rxfh()
1754 for (i = 0; i < adapter->rss_lut_size; i++) in iavf_set_rxfh()
1755 adapter->rss_lut[i] = (u8)(rxfh->indir[i]); in iavf_set_rxfh()
1792 * iavf_set_ethtool_ops - Initialize ethtool ops struct
1800 netdev->ethtool_ops = &iavf_ethtool_ops; in iavf_set_ethtool_ops()