Lines Matching +full:msi +full:- +full:base +full:- +full:spi

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2018 Intel Corporation. */
13 * struct iavf_stats - definition for an ethtool statistic
14 * @stat_string: statistic name to display in ethtool -S output
16 * @stat_offset: offsetof() the stat from a base pointer
19 * It defines a statistic as offset from a common base pointer. Stats should
56 IAVF_QUEUE_STAT("%s-%u.packets", stats.packets),
57 IAVF_QUEUE_STAT("%s-%u.bytes", stats.bytes),
61 * iavf_add_one_ethtool_stat - copy the stat into the supplied buffer
84 p = (char *)pointer + stat->stat_offset; in iavf_add_one_ethtool_stat()
85 switch (stat->sizeof_stat) { in iavf_add_one_ethtool_stat()
100 stat->stat_string); in iavf_add_one_ethtool_stat()
106 * __iavf_add_ethtool_stats - copy stats into the ethtool supplied buffer
112 * Copy the stats defined by the stats array using the pointer as a base into
130 * iavf_add_ethtool_stats - copy stats into ethtool supplied buffer
146 * iavf_add_queue_stats - copy queue statistics into supplied buffer
170 * non-null before attempting to access its syncp. in iavf_add_queue_stats()
173 start = !ring ? 0 : u64_stats_fetch_begin(&ring->syncp); in iavf_add_queue_stats()
176 } while (ring && u64_stats_fetch_retry(&ring->syncp, start)); in iavf_add_queue_stats()
183 * __iavf_add_stat_strings - copy stat strings into ethtool buffer
207 * iavf_add_stat_strings - copy stat strings into ethtool buffer
261 IAVF_PRIV_FLAG("legacy-rx", IAVF_FLAG_LEGACY_RX, 0),
267 * iavf_get_link_ksettings - Get Link Speed and Duplex settings
280 cmd->base.autoneg = AUTONEG_DISABLE; in iavf_get_link_ksettings()
281 cmd->base.port = PORT_NONE; in iavf_get_link_ksettings()
282 cmd->base.duplex = DUPLEX_FULL; in iavf_get_link_ksettings()
285 if (adapter->link_speed_mbps && in iavf_get_link_ksettings()
286 adapter->link_speed_mbps < U32_MAX) in iavf_get_link_ksettings()
287 cmd->base.speed = adapter->link_speed_mbps; in iavf_get_link_ksettings()
289 cmd->base.speed = SPEED_UNKNOWN; in iavf_get_link_ksettings()
294 switch (adapter->link_speed) { in iavf_get_link_ksettings()
296 cmd->base.speed = SPEED_40000; in iavf_get_link_ksettings()
299 cmd->base.speed = SPEED_25000; in iavf_get_link_ksettings()
302 cmd->base.speed = SPEED_20000; in iavf_get_link_ksettings()
305 cmd->base.speed = SPEED_10000; in iavf_get_link_ksettings()
308 cmd->base.speed = SPEED_5000; in iavf_get_link_ksettings()
311 cmd->base.speed = SPEED_2500; in iavf_get_link_ksettings()
314 cmd->base.speed = SPEED_1000; in iavf_get_link_ksettings()
317 cmd->base.speed = SPEED_100; in iavf_get_link_ksettings()
327 * iavf_get_sset_count - Get length of string set
337 * use netdev->real_num_tx_queues * 2. The real_num_tx_queues is set in iavf_get_sset_count()
344 netdev->real_num_tx_queues); in iavf_get_sset_count()
348 return -EINVAL; in iavf_get_sset_count()
352 * iavf_get_ethtool_stats - report device statistics
374 for (i = 0; i < adapter->num_active_queues; i++) { in iavf_get_ethtool_stats()
378 ring = &adapter->tx_rings[i]; in iavf_get_ethtool_stats()
382 ring = &adapter->rx_rings[i]; in iavf_get_ethtool_stats()
389 * iavf_get_priv_flag_strings - Get private flag strings
404 * iavf_get_stat_strings - Get stat strings
419 for (i = 0; i < netdev->real_num_tx_queues; i++) { in iavf_get_stat_strings()
428 * iavf_get_strings - Get string set
450 * iavf_get_priv_flags - report device private flags
469 if (priv_flags->flag & adapter->flags) in iavf_get_priv_flags()
477 * iavf_set_priv_flags - set private flags
488 orig_flags = READ_ONCE(adapter->flags); in iavf_set_priv_flags()
497 new_flags |= priv_flags->flag; in iavf_set_priv_flags()
499 new_flags &= ~(priv_flags->flag); in iavf_set_priv_flags()
501 if (priv_flags->read_only && in iavf_set_priv_flags()
503 return -EOPNOTSUPP; in iavf_set_priv_flags()
517 if (cmpxchg(&adapter->flags, orig_flags, new_flags) != orig_flags) { in iavf_set_priv_flags()
518 dev_warn(&adapter->pdev->dev, in iavf_set_priv_flags()
519 "Unable to update adapter->flags as it was modified by another thread...\n"); in iavf_set_priv_flags()
520 return -EAGAIN; in iavf_set_priv_flags()
530 /* issue a reset to force legacy-rx change to take effect */ in iavf_set_priv_flags()
544 * iavf_get_msglevel - Get debug message level
553 return adapter->msg_enable; in iavf_get_msglevel()
557 * iavf_set_msglevel - Set debug message level
569 adapter->hw.debug_mask = data; in iavf_set_msglevel()
570 adapter->msg_enable = data; in iavf_set_msglevel()
574 * iavf_get_drvinfo - Get driver info
585 strscpy(drvinfo->driver, iavf_driver_name, 32); in iavf_get_drvinfo()
586 strscpy(drvinfo->fw_version, "N/A", 4); in iavf_get_drvinfo()
587 strscpy(drvinfo->bus_info, pci_name(adapter->pdev), 32); in iavf_get_drvinfo()
588 drvinfo->n_priv_flags = IAVF_PRIV_FLAGS_STR_LEN; in iavf_get_drvinfo()
592 * iavf_get_ringparam - Get ring parameters
608 ring->rx_max_pending = IAVF_MAX_RXD; in iavf_get_ringparam()
609 ring->tx_max_pending = IAVF_MAX_TXD; in iavf_get_ringparam()
610 ring->rx_pending = adapter->rx_desc_count; in iavf_get_ringparam()
611 ring->tx_pending = adapter->tx_desc_count; in iavf_get_ringparam()
615 * iavf_set_ringparam - Set ring parameters
633 if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) in iavf_set_ringparam()
634 return -EINVAL; in iavf_set_ringparam()
636 if (ring->tx_pending > IAVF_MAX_TXD || in iavf_set_ringparam()
637 ring->tx_pending < IAVF_MIN_TXD || in iavf_set_ringparam()
638 ring->rx_pending > IAVF_MAX_RXD || in iavf_set_ringparam()
639 ring->rx_pending < IAVF_MIN_RXD) { in iavf_set_ringparam()
640 …netdev_err(netdev, "Descriptors requested (Tx: %d / Rx: %d) out of range [%d-%d] (increment %d)\n", in iavf_set_ringparam()
641 ring->tx_pending, ring->rx_pending, IAVF_MIN_TXD, in iavf_set_ringparam()
643 return -EINVAL; in iavf_set_ringparam()
646 new_tx_count = ALIGN(ring->tx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE); in iavf_set_ringparam()
647 if (new_tx_count != ring->tx_pending) in iavf_set_ringparam()
651 new_rx_count = ALIGN(ring->rx_pending, IAVF_REQ_DESCRIPTOR_MULTIPLE); in iavf_set_ringparam()
652 if (new_rx_count != ring->rx_pending) in iavf_set_ringparam()
657 if ((new_tx_count == adapter->tx_desc_count) && in iavf_set_ringparam()
658 (new_rx_count == adapter->rx_desc_count)) { in iavf_set_ringparam()
663 if (new_tx_count != adapter->tx_desc_count) { in iavf_set_ringparam()
665 adapter->tx_desc_count, new_tx_count); in iavf_set_ringparam()
666 adapter->tx_desc_count = new_tx_count; in iavf_set_ringparam()
669 if (new_rx_count != adapter->rx_desc_count) { in iavf_set_ringparam()
671 adapter->rx_desc_count, new_rx_count); in iavf_set_ringparam()
672 adapter->rx_desc_count = new_rx_count; in iavf_set_ringparam()
686 * __iavf_get_coalesce - get per-queue coalesce settings
691 * Gets the per-queue settings for coalescence. Specifically Rx and Tx usecs
706 else if (queue >= adapter->num_active_queues) in __iavf_get_coalesce()
707 return -EINVAL; in __iavf_get_coalesce()
709 rx_ring = &adapter->rx_rings[queue]; in __iavf_get_coalesce()
710 tx_ring = &adapter->tx_rings[queue]; in __iavf_get_coalesce()
712 if (ITR_IS_DYNAMIC(rx_ring->itr_setting)) in __iavf_get_coalesce()
713 ec->use_adaptive_rx_coalesce = 1; in __iavf_get_coalesce()
715 if (ITR_IS_DYNAMIC(tx_ring->itr_setting)) in __iavf_get_coalesce()
716 ec->use_adaptive_tx_coalesce = 1; in __iavf_get_coalesce()
718 ec->rx_coalesce_usecs = rx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in __iavf_get_coalesce()
719 ec->tx_coalesce_usecs = tx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in __iavf_get_coalesce()
725 * iavf_get_coalesce - Get interrupt coalescing settings
733 * this functionality. Note that if per-queue settings have been modified this
741 return __iavf_get_coalesce(netdev, ec, -1); in iavf_get_coalesce()
745 * iavf_get_per_queue_coalesce - get coalesce values for specific queue
759 * iavf_set_itr_per_queue - set ITR values for specific queue
769 struct iavf_ring *rx_ring = &adapter->rx_rings[queue]; in iavf_set_itr_per_queue()
770 struct iavf_ring *tx_ring = &adapter->tx_rings[queue]; in iavf_set_itr_per_queue()
774 itr_setting = rx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
776 if (ec->rx_coalesce_usecs != itr_setting && in iavf_set_itr_per_queue()
777 ec->use_adaptive_rx_coalesce) { in iavf_set_itr_per_queue()
778 netif_info(adapter, drv, adapter->netdev, in iavf_set_itr_per_queue()
779 "Rx interrupt throttling cannot be changed if adaptive-rx is enabled\n"); in iavf_set_itr_per_queue()
780 return -EINVAL; in iavf_set_itr_per_queue()
783 itr_setting = tx_ring->itr_setting & ~IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
785 if (ec->tx_coalesce_usecs != itr_setting && in iavf_set_itr_per_queue()
786 ec->use_adaptive_tx_coalesce) { in iavf_set_itr_per_queue()
787 netif_info(adapter, drv, adapter->netdev, in iavf_set_itr_per_queue()
788 "Tx interrupt throttling cannot be changed if adaptive-tx is enabled\n"); in iavf_set_itr_per_queue()
789 return -EINVAL; in iavf_set_itr_per_queue()
792 rx_ring->itr_setting = ITR_REG_ALIGN(ec->rx_coalesce_usecs); in iavf_set_itr_per_queue()
793 tx_ring->itr_setting = ITR_REG_ALIGN(ec->tx_coalesce_usecs); in iavf_set_itr_per_queue()
795 rx_ring->itr_setting |= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
796 if (!ec->use_adaptive_rx_coalesce) in iavf_set_itr_per_queue()
797 rx_ring->itr_setting ^= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
799 tx_ring->itr_setting |= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
800 if (!ec->use_adaptive_tx_coalesce) in iavf_set_itr_per_queue()
801 tx_ring->itr_setting ^= IAVF_ITR_DYNAMIC; in iavf_set_itr_per_queue()
803 q_vector = rx_ring->q_vector; in iavf_set_itr_per_queue()
804 q_vector->rx.target_itr = ITR_TO_REG(rx_ring->itr_setting); in iavf_set_itr_per_queue()
806 q_vector = tx_ring->q_vector; in iavf_set_itr_per_queue()
807 q_vector->tx.target_itr = ITR_TO_REG(tx_ring->itr_setting); in iavf_set_itr_per_queue()
817 * __iavf_set_coalesce - set coalesce settings for particular queue
830 if (ec->rx_coalesce_usecs > IAVF_MAX_ITR) { in __iavf_set_coalesce()
831 netif_info(adapter, drv, netdev, "Invalid value, rx-usecs range is 0-8160\n"); in __iavf_set_coalesce()
832 return -EINVAL; in __iavf_set_coalesce()
833 } else if (ec->tx_coalesce_usecs > IAVF_MAX_ITR) { in __iavf_set_coalesce()
834 netif_info(adapter, drv, netdev, "Invalid value, tx-usecs range is 0-8160\n"); in __iavf_set_coalesce()
835 return -EINVAL; in __iavf_set_coalesce()
842 for (i = 0; i < adapter->num_active_queues; i++) in __iavf_set_coalesce()
844 return -EINVAL; in __iavf_set_coalesce()
845 } else if (queue < adapter->num_active_queues) { in __iavf_set_coalesce()
847 return -EINVAL; in __iavf_set_coalesce()
849 netif_info(adapter, drv, netdev, "Invalid queue value, queue range is 0 - %d\n", in __iavf_set_coalesce()
850 adapter->num_active_queues - 1); in __iavf_set_coalesce()
851 return -EINVAL; in __iavf_set_coalesce()
858 * iavf_set_coalesce - Set interrupt coalescing settings
871 return __iavf_set_coalesce(netdev, ec, -1); in iavf_set_coalesce()
875 * iavf_set_per_queue_coalesce - set specific queue's coalesce settings
889 * iavf_fltr_to_ethtool_flow - convert filter type values to ethtool
931 * iavf_ethtool_flow_to_fltr - convert ethtool flow type to filter enum
971 * iavf_is_mask_valid - check mask field set
984 * iavf_parse_rx_flow_user_data - deconstruct user-defined data
997 if (!(fsp->flow_type & FLOW_EXT)) in iavf_parse_rx_flow_user_data()
1005 u32 value = be32_to_cpu(fsp->h_ext.data[i]); in iavf_parse_rx_flow_user_data()
1006 u32 mask = be32_to_cpu(fsp->m_ext.data[i]); in iavf_parse_rx_flow_user_data()
1012 return -EINVAL; in iavf_parse_rx_flow_user_data()
1018 flex = &fltr->flex_words[cnt++]; in iavf_parse_rx_flow_user_data()
1019 flex->word = value & IAVF_USERDEF_FLEX_WORD_M; in iavf_parse_rx_flow_user_data()
1020 flex->offset = FIELD_GET(IAVF_USERDEF_FLEX_OFFS_M, value); in iavf_parse_rx_flow_user_data()
1021 if (flex->offset > IAVF_USERDEF_FLEX_MAX_OFFS_VAL) in iavf_parse_rx_flow_user_data()
1022 return -EINVAL; in iavf_parse_rx_flow_user_data()
1025 fltr->flex_cnt = cnt; in iavf_parse_rx_flow_user_data()
1031 * iavf_fill_rx_flow_ext_data - fill the additional data
1039 if (!fltr->ext_mask.usr_def[0] && !fltr->ext_mask.usr_def[1]) in iavf_fill_rx_flow_ext_data()
1042 fsp->flow_type |= FLOW_EXT; in iavf_fill_rx_flow_ext_data()
1044 memcpy(fsp->h_ext.data, fltr->ext_data.usr_def, sizeof(fsp->h_ext.data)); in iavf_fill_rx_flow_ext_data()
1045 memcpy(fsp->m_ext.data, fltr->ext_mask.usr_def, sizeof(fsp->m_ext.data)); in iavf_fill_rx_flow_ext_data()
1049 * iavf_get_ethtool_fdir_entry - fill ethtool structure with Flow Director filter data
1059 struct ethtool_rx_flow_spec *fsp = (struct ethtool_rx_flow_spec *)&cmd->fs; in iavf_get_ethtool_fdir_entry()
1063 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_ethtool_fdir_entry()
1064 return -EOPNOTSUPP; in iavf_get_ethtool_fdir_entry()
1066 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_ethtool_fdir_entry()
1068 rule = iavf_find_fdir_fltr_by_loc(adapter, fsp->location); in iavf_get_ethtool_fdir_entry()
1070 ret = -EINVAL; in iavf_get_ethtool_fdir_entry()
1074 fsp->flow_type = iavf_fltr_to_ethtool_flow(rule->flow_type); in iavf_get_ethtool_fdir_entry()
1076 memset(&fsp->m_u, 0, sizeof(fsp->m_u)); in iavf_get_ethtool_fdir_entry()
1077 memset(&fsp->m_ext, 0, sizeof(fsp->m_ext)); in iavf_get_ethtool_fdir_entry()
1079 switch (fsp->flow_type) { in iavf_get_ethtool_fdir_entry()
1083 fsp->h_u.tcp_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1084 fsp->h_u.tcp_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1085 fsp->h_u.tcp_ip4_spec.psrc = rule->ip_data.src_port; in iavf_get_ethtool_fdir_entry()
1086 fsp->h_u.tcp_ip4_spec.pdst = rule->ip_data.dst_port; in iavf_get_ethtool_fdir_entry()
1087 fsp->h_u.tcp_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
1088 fsp->m_u.tcp_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1089 fsp->m_u.tcp_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1090 fsp->m_u.tcp_ip4_spec.psrc = rule->ip_mask.src_port; in iavf_get_ethtool_fdir_entry()
1091 fsp->m_u.tcp_ip4_spec.pdst = rule->ip_mask.dst_port; in iavf_get_ethtool_fdir_entry()
1092 fsp->m_u.tcp_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
1096 fsp->h_u.ah_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1097 fsp->h_u.ah_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1098 fsp->h_u.ah_ip4_spec.spi = rule->ip_data.spi; in iavf_get_ethtool_fdir_entry()
1099 fsp->h_u.ah_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
1100 fsp->m_u.ah_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1101 fsp->m_u.ah_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1102 fsp->m_u.ah_ip4_spec.spi = rule->ip_mask.spi; in iavf_get_ethtool_fdir_entry()
1103 fsp->m_u.ah_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
1106 fsp->h_u.usr_ip4_spec.ip4src = rule->ip_data.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1107 fsp->h_u.usr_ip4_spec.ip4dst = rule->ip_data.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1108 fsp->h_u.usr_ip4_spec.l4_4_bytes = rule->ip_data.l4_header; in iavf_get_ethtool_fdir_entry()
1109 fsp->h_u.usr_ip4_spec.tos = rule->ip_data.tos; in iavf_get_ethtool_fdir_entry()
1110 fsp->h_u.usr_ip4_spec.ip_ver = ETH_RX_NFC_IP4; in iavf_get_ethtool_fdir_entry()
1111 fsp->h_u.usr_ip4_spec.proto = rule->ip_data.proto; in iavf_get_ethtool_fdir_entry()
1112 fsp->m_u.usr_ip4_spec.ip4src = rule->ip_mask.v4_addrs.src_ip; in iavf_get_ethtool_fdir_entry()
1113 fsp->m_u.usr_ip4_spec.ip4dst = rule->ip_mask.v4_addrs.dst_ip; in iavf_get_ethtool_fdir_entry()
1114 fsp->m_u.usr_ip4_spec.l4_4_bytes = rule->ip_mask.l4_header; in iavf_get_ethtool_fdir_entry()
1115 fsp->m_u.usr_ip4_spec.tos = rule->ip_mask.tos; in iavf_get_ethtool_fdir_entry()
1116 fsp->m_u.usr_ip4_spec.ip_ver = 0xFF; in iavf_get_ethtool_fdir_entry()
1117 fsp->m_u.usr_ip4_spec.proto = rule->ip_mask.proto; in iavf_get_ethtool_fdir_entry()
1122 memcpy(fsp->h_u.usr_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1124 memcpy(fsp->h_u.usr_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1126 fsp->h_u.tcp_ip6_spec.psrc = rule->ip_data.src_port; in iavf_get_ethtool_fdir_entry()
1127 fsp->h_u.tcp_ip6_spec.pdst = rule->ip_data.dst_port; in iavf_get_ethtool_fdir_entry()
1128 fsp->h_u.tcp_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
1129 memcpy(fsp->m_u.usr_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1131 memcpy(fsp->m_u.usr_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1133 fsp->m_u.tcp_ip6_spec.psrc = rule->ip_mask.src_port; in iavf_get_ethtool_fdir_entry()
1134 fsp->m_u.tcp_ip6_spec.pdst = rule->ip_mask.dst_port; in iavf_get_ethtool_fdir_entry()
1135 fsp->m_u.tcp_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1139 memcpy(fsp->h_u.ah_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1141 memcpy(fsp->h_u.ah_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1143 fsp->h_u.ah_ip6_spec.spi = rule->ip_data.spi; in iavf_get_ethtool_fdir_entry()
1144 fsp->h_u.ah_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
1145 memcpy(fsp->m_u.ah_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1147 memcpy(fsp->m_u.ah_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1149 fsp->m_u.ah_ip6_spec.spi = rule->ip_mask.spi; in iavf_get_ethtool_fdir_entry()
1150 fsp->m_u.ah_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1153 memcpy(fsp->h_u.usr_ip6_spec.ip6src, &rule->ip_data.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1155 memcpy(fsp->h_u.usr_ip6_spec.ip6dst, &rule->ip_data.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1157 fsp->h_u.usr_ip6_spec.l4_4_bytes = rule->ip_data.l4_header; in iavf_get_ethtool_fdir_entry()
1158 fsp->h_u.usr_ip6_spec.tclass = rule->ip_data.tclass; in iavf_get_ethtool_fdir_entry()
1159 fsp->h_u.usr_ip6_spec.l4_proto = rule->ip_data.proto; in iavf_get_ethtool_fdir_entry()
1160 memcpy(fsp->m_u.usr_ip6_spec.ip6src, &rule->ip_mask.v6_addrs.src_ip, in iavf_get_ethtool_fdir_entry()
1162 memcpy(fsp->m_u.usr_ip6_spec.ip6dst, &rule->ip_mask.v6_addrs.dst_ip, in iavf_get_ethtool_fdir_entry()
1164 fsp->m_u.usr_ip6_spec.l4_4_bytes = rule->ip_mask.l4_header; in iavf_get_ethtool_fdir_entry()
1165 fsp->m_u.usr_ip6_spec.tclass = rule->ip_mask.tclass; in iavf_get_ethtool_fdir_entry()
1166 fsp->m_u.usr_ip6_spec.l4_proto = rule->ip_mask.proto; in iavf_get_ethtool_fdir_entry()
1169 fsp->h_u.ether_spec.h_proto = rule->eth_data.etype; in iavf_get_ethtool_fdir_entry()
1170 fsp->m_u.ether_spec.h_proto = rule->eth_mask.etype; in iavf_get_ethtool_fdir_entry()
1173 ret = -EINVAL; in iavf_get_ethtool_fdir_entry()
1179 if (rule->action == VIRTCHNL_ACTION_DROP) in iavf_get_ethtool_fdir_entry()
1180 fsp->ring_cookie = RX_CLS_FLOW_DISC; in iavf_get_ethtool_fdir_entry()
1182 fsp->ring_cookie = rule->q_index; in iavf_get_ethtool_fdir_entry()
1185 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_ethtool_fdir_entry()
1190 * iavf_get_fdir_fltr_ids - fill buffer with filter IDs of active filters
1205 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_fdir_fltr_ids()
1206 return -EOPNOTSUPP; in iavf_get_fdir_fltr_ids()
1208 cmd->data = IAVF_MAX_FDIR_FILTERS; in iavf_get_fdir_fltr_ids()
1210 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_fdir_fltr_ids()
1212 list_for_each_entry(fltr, &adapter->fdir_list_head, list) { in iavf_get_fdir_fltr_ids()
1213 if (cnt == cmd->rule_cnt) { in iavf_get_fdir_fltr_ids()
1214 val = -EMSGSIZE; in iavf_get_fdir_fltr_ids()
1217 rule_locs[cnt] = fltr->loc; in iavf_get_fdir_fltr_ids()
1222 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_fdir_fltr_ids()
1224 cmd->rule_cnt = cnt; in iavf_get_fdir_fltr_ids()
1230 * iavf_add_fdir_fltr_info - Set the input set for Flow Director filter
1243 if (fsp->ring_cookie == RX_CLS_FLOW_DISC) { in iavf_add_fdir_fltr_info()
1246 q_index = fsp->ring_cookie; in iavf_add_fdir_fltr_info()
1247 if (q_index >= adapter->num_active_queues) in iavf_add_fdir_fltr_info()
1248 return -EINVAL; in iavf_add_fdir_fltr_info()
1253 fltr->action = act; in iavf_add_fdir_fltr_info()
1254 fltr->loc = fsp->location; in iavf_add_fdir_fltr_info()
1255 fltr->q_index = q_index; in iavf_add_fdir_fltr_info()
1257 if (fsp->flow_type & FLOW_EXT) { in iavf_add_fdir_fltr_info()
1258 memcpy(fltr->ext_data.usr_def, fsp->h_ext.data, in iavf_add_fdir_fltr_info()
1259 sizeof(fltr->ext_data.usr_def)); in iavf_add_fdir_fltr_info()
1260 memcpy(fltr->ext_mask.usr_def, fsp->m_ext.data, in iavf_add_fdir_fltr_info()
1261 sizeof(fltr->ext_mask.usr_def)); in iavf_add_fdir_fltr_info()
1264 flow_type = fsp->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT | FLOW_RSS); in iavf_add_fdir_fltr_info()
1265 fltr->flow_type = iavf_ethtool_flow_to_fltr(flow_type); in iavf_add_fdir_fltr_info()
1271 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.tcp_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1272 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.tcp_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1273 fltr->ip_data.src_port = fsp->h_u.tcp_ip4_spec.psrc; in iavf_add_fdir_fltr_info()
1274 fltr->ip_data.dst_port = fsp->h_u.tcp_ip4_spec.pdst; in iavf_add_fdir_fltr_info()
1275 fltr->ip_data.tos = fsp->h_u.tcp_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1276 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.tcp_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1277 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.tcp_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1278 fltr->ip_mask.src_port = fsp->m_u.tcp_ip4_spec.psrc; in iavf_add_fdir_fltr_info()
1279 fltr->ip_mask.dst_port = fsp->m_u.tcp_ip4_spec.pdst; in iavf_add_fdir_fltr_info()
1280 fltr->ip_mask.tos = fsp->m_u.tcp_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1281 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1285 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.ah_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1286 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.ah_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1287 fltr->ip_data.spi = fsp->h_u.ah_ip4_spec.spi; in iavf_add_fdir_fltr_info()
1288 fltr->ip_data.tos = fsp->h_u.ah_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1289 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.ah_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1290 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.ah_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1291 fltr->ip_mask.spi = fsp->m_u.ah_ip4_spec.spi; in iavf_add_fdir_fltr_info()
1292 fltr->ip_mask.tos = fsp->m_u.ah_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1293 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1296 fltr->ip_data.v4_addrs.src_ip = fsp->h_u.usr_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1297 fltr->ip_data.v4_addrs.dst_ip = fsp->h_u.usr_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1298 fltr->ip_data.l4_header = fsp->h_u.usr_ip4_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1299 fltr->ip_data.tos = fsp->h_u.usr_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1300 fltr->ip_data.proto = fsp->h_u.usr_ip4_spec.proto; in iavf_add_fdir_fltr_info()
1301 fltr->ip_mask.v4_addrs.src_ip = fsp->m_u.usr_ip4_spec.ip4src; in iavf_add_fdir_fltr_info()
1302 fltr->ip_mask.v4_addrs.dst_ip = fsp->m_u.usr_ip4_spec.ip4dst; in iavf_add_fdir_fltr_info()
1303 fltr->ip_mask.l4_header = fsp->m_u.usr_ip4_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1304 fltr->ip_mask.tos = fsp->m_u.usr_ip4_spec.tos; in iavf_add_fdir_fltr_info()
1305 fltr->ip_mask.proto = fsp->m_u.usr_ip4_spec.proto; in iavf_add_fdir_fltr_info()
1306 fltr->ip_ver = 4; in iavf_add_fdir_fltr_info()
1311 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1313 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1315 fltr->ip_data.src_port = fsp->h_u.tcp_ip6_spec.psrc; in iavf_add_fdir_fltr_info()
1316 fltr->ip_data.dst_port = fsp->h_u.tcp_ip6_spec.pdst; in iavf_add_fdir_fltr_info()
1317 fltr->ip_data.tclass = fsp->h_u.tcp_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1318 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1320 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1322 fltr->ip_mask.src_port = fsp->m_u.tcp_ip6_spec.psrc; in iavf_add_fdir_fltr_info()
1323 fltr->ip_mask.dst_port = fsp->m_u.tcp_ip6_spec.pdst; in iavf_add_fdir_fltr_info()
1324 fltr->ip_mask.tclass = fsp->m_u.tcp_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1325 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1329 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.ah_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1331 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.ah_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1333 fltr->ip_data.spi = fsp->h_u.ah_ip6_spec.spi; in iavf_add_fdir_fltr_info()
1334 fltr->ip_data.tclass = fsp->h_u.ah_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1335 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.ah_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1337 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.ah_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1339 fltr->ip_mask.spi = fsp->m_u.ah_ip6_spec.spi; in iavf_add_fdir_fltr_info()
1340 fltr->ip_mask.tclass = fsp->m_u.ah_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1341 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1344 memcpy(&fltr->ip_data.v6_addrs.src_ip, fsp->h_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1346 memcpy(&fltr->ip_data.v6_addrs.dst_ip, fsp->h_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1348 fltr->ip_data.l4_header = fsp->h_u.usr_ip6_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1349 fltr->ip_data.tclass = fsp->h_u.usr_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1350 fltr->ip_data.proto = fsp->h_u.usr_ip6_spec.l4_proto; in iavf_add_fdir_fltr_info()
1351 memcpy(&fltr->ip_mask.v6_addrs.src_ip, fsp->m_u.usr_ip6_spec.ip6src, in iavf_add_fdir_fltr_info()
1353 memcpy(&fltr->ip_mask.v6_addrs.dst_ip, fsp->m_u.usr_ip6_spec.ip6dst, in iavf_add_fdir_fltr_info()
1355 fltr->ip_mask.l4_header = fsp->m_u.usr_ip6_spec.l4_4_bytes; in iavf_add_fdir_fltr_info()
1356 fltr->ip_mask.tclass = fsp->m_u.usr_ip6_spec.tclass; in iavf_add_fdir_fltr_info()
1357 fltr->ip_mask.proto = fsp->m_u.usr_ip6_spec.l4_proto; in iavf_add_fdir_fltr_info()
1358 fltr->ip_ver = 6; in iavf_add_fdir_fltr_info()
1361 fltr->eth_data.etype = fsp->h_u.ether_spec.h_proto; in iavf_add_fdir_fltr_info()
1362 fltr->eth_mask.etype = fsp->m_u.ether_spec.h_proto; in iavf_add_fdir_fltr_info()
1365 /* not doing un-parsed flow types */ in iavf_add_fdir_fltr_info()
1366 return -EINVAL; in iavf_add_fdir_fltr_info()
1374 return -EEXIST; in iavf_add_fdir_fltr_info()
1384 * iavf_add_fdir_ethtool - add Flow Director filter
1392 struct ethtool_rx_flow_spec *fsp = &cmd->fs; in iavf_add_fdir_ethtool()
1397 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_add_fdir_ethtool()
1398 return -EOPNOTSUPP; in iavf_add_fdir_ethtool()
1400 if (fsp->flow_type & FLOW_MAC_EXT) in iavf_add_fdir_ethtool()
1401 return -EINVAL; in iavf_add_fdir_ethtool()
1403 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1404 if (adapter->fdir_active_fltr >= IAVF_MAX_FDIR_FILTERS) { in iavf_add_fdir_ethtool()
1405 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1406 dev_err(&adapter->pdev->dev, in iavf_add_fdir_ethtool()
1409 return -ENOSPC; in iavf_add_fdir_ethtool()
1412 if (iavf_find_fdir_fltr_by_loc(adapter, fsp->location)) { in iavf_add_fdir_ethtool()
1413 dev_err(&adapter->pdev->dev, "Failed to add Flow Director filter, it already exists\n"); in iavf_add_fdir_ethtool()
1414 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1415 return -EEXIST; in iavf_add_fdir_ethtool()
1417 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1421 return -ENOMEM; in iavf_add_fdir_ethtool()
1423 while (!mutex_trylock(&adapter->crit_lock)) { in iavf_add_fdir_ethtool()
1424 if (--count == 0) { in iavf_add_fdir_ethtool()
1426 return -EINVAL; in iavf_add_fdir_ethtool()
1435 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1437 adapter->fdir_active_fltr++; in iavf_add_fdir_ethtool()
1439 if (adapter->link_up) in iavf_add_fdir_ethtool()
1440 fltr->state = IAVF_FDIR_FLTR_ADD_REQUEST; in iavf_add_fdir_ethtool()
1442 fltr->state = IAVF_FDIR_FLTR_INACTIVE; in iavf_add_fdir_ethtool()
1443 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_add_fdir_ethtool()
1445 if (adapter->link_up) in iavf_add_fdir_ethtool()
1451 mutex_unlock(&adapter->crit_lock); in iavf_add_fdir_ethtool()
1456 * iavf_del_fdir_ethtool - delete Flow Director filter
1464 struct ethtool_rx_flow_spec *fsp = (struct ethtool_rx_flow_spec *)&cmd->fs; in iavf_del_fdir_ethtool()
1468 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_del_fdir_ethtool()
1469 return -EOPNOTSUPP; in iavf_del_fdir_ethtool()
1471 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_del_fdir_ethtool()
1472 fltr = iavf_find_fdir_fltr_by_loc(adapter, fsp->location); in iavf_del_fdir_ethtool()
1474 if (fltr->state == IAVF_FDIR_FLTR_ACTIVE) { in iavf_del_fdir_ethtool()
1475 fltr->state = IAVF_FDIR_FLTR_DEL_REQUEST; in iavf_del_fdir_ethtool()
1476 } else if (fltr->state == IAVF_FDIR_FLTR_INACTIVE) { in iavf_del_fdir_ethtool()
1477 list_del(&fltr->list); in iavf_del_fdir_ethtool()
1479 adapter->fdir_active_fltr--; in iavf_del_fdir_ethtool()
1482 err = -EBUSY; in iavf_del_fdir_ethtool()
1484 } else if (adapter->fdir_active_fltr) { in iavf_del_fdir_ethtool()
1485 err = -EINVAL; in iavf_del_fdir_ethtool()
1487 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_del_fdir_ethtool()
1489 if (fltr && fltr->state == IAVF_FDIR_FLTR_DEL_REQUEST) in iavf_del_fdir_ethtool()
1496 * iavf_adv_rss_parse_hdrs - parses headers from RSS hash input
1506 switch (cmd->flow_type) { in iavf_adv_rss_parse_hdrs()
1539 * iavf_adv_rss_parse_hash_flds - parses hash fields from RSS hash input
1550 if (cmd->data & RXH_IP_SRC || cmd->data & RXH_IP_DST) { in iavf_adv_rss_parse_hash_flds()
1551 switch (cmd->flow_type) { in iavf_adv_rss_parse_hash_flds()
1555 if (cmd->data & RXH_IP_SRC) in iavf_adv_rss_parse_hash_flds()
1557 if (cmd->data & RXH_IP_DST) in iavf_adv_rss_parse_hash_flds()
1563 if (cmd->data & RXH_IP_SRC) in iavf_adv_rss_parse_hash_flds()
1565 if (cmd->data & RXH_IP_DST) in iavf_adv_rss_parse_hash_flds()
1573 if (cmd->data & RXH_L4_B_0_1 || cmd->data & RXH_L4_B_2_3) { in iavf_adv_rss_parse_hash_flds()
1574 switch (cmd->flow_type) { in iavf_adv_rss_parse_hash_flds()
1577 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1579 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1584 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1586 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1591 if (cmd->data & RXH_L4_B_0_1) in iavf_adv_rss_parse_hash_flds()
1593 if (cmd->data & RXH_L4_B_2_3) in iavf_adv_rss_parse_hash_flds()
1605 * iavf_set_adv_rss_hash_opt - Enable/Disable flow types for RSS hash
1623 return -EOPNOTSUPP; in iavf_set_adv_rss_hash_opt()
1625 symm = !!(adapter->hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC); in iavf_set_adv_rss_hash_opt()
1629 return -EINVAL; in iavf_set_adv_rss_hash_opt()
1633 return -EINVAL; in iavf_set_adv_rss_hash_opt()
1637 return -ENOMEM; in iavf_set_adv_rss_hash_opt()
1639 if (iavf_fill_adv_rss_cfg_msg(&rss_new->cfg_msg, hdrs, hash_flds, in iavf_set_adv_rss_hash_opt()
1642 return -EINVAL; in iavf_set_adv_rss_hash_opt()
1645 while (!mutex_trylock(&adapter->crit_lock)) { in iavf_set_adv_rss_hash_opt()
1646 if (--count == 0) { in iavf_set_adv_rss_hash_opt()
1648 return -EINVAL; in iavf_set_adv_rss_hash_opt()
1654 spin_lock_bh(&adapter->adv_rss_lock); in iavf_set_adv_rss_hash_opt()
1657 if (rss_old->state != IAVF_ADV_RSS_ACTIVE) { in iavf_set_adv_rss_hash_opt()
1658 err = -EBUSY; in iavf_set_adv_rss_hash_opt()
1659 } else if (rss_old->hash_flds != hash_flds || in iavf_set_adv_rss_hash_opt()
1660 rss_old->symm != symm) { in iavf_set_adv_rss_hash_opt()
1661 rss_old->state = IAVF_ADV_RSS_ADD_REQUEST; in iavf_set_adv_rss_hash_opt()
1662 rss_old->hash_flds = hash_flds; in iavf_set_adv_rss_hash_opt()
1663 rss_old->symm = symm; in iavf_set_adv_rss_hash_opt()
1664 memcpy(&rss_old->cfg_msg, &rss_new->cfg_msg, in iavf_set_adv_rss_hash_opt()
1665 sizeof(rss_new->cfg_msg)); in iavf_set_adv_rss_hash_opt()
1667 err = -EEXIST; in iavf_set_adv_rss_hash_opt()
1671 rss_new->state = IAVF_ADV_RSS_ADD_REQUEST; in iavf_set_adv_rss_hash_opt()
1672 rss_new->packet_hdrs = hdrs; in iavf_set_adv_rss_hash_opt()
1673 rss_new->hash_flds = hash_flds; in iavf_set_adv_rss_hash_opt()
1674 rss_new->symm = symm; in iavf_set_adv_rss_hash_opt()
1675 list_add_tail(&rss_new->list, &adapter->adv_rss_list_head); in iavf_set_adv_rss_hash_opt()
1677 spin_unlock_bh(&adapter->adv_rss_lock); in iavf_set_adv_rss_hash_opt()
1682 mutex_unlock(&adapter->crit_lock); in iavf_set_adv_rss_hash_opt()
1691 * iavf_get_adv_rss_hash_opt - Retrieve hash fields for a given flow-type
1706 return -EOPNOTSUPP; in iavf_get_adv_rss_hash_opt()
1708 cmd->data = 0; in iavf_get_adv_rss_hash_opt()
1712 return -EINVAL; in iavf_get_adv_rss_hash_opt()
1714 spin_lock_bh(&adapter->adv_rss_lock); in iavf_get_adv_rss_hash_opt()
1717 hash_flds = rss->hash_flds; in iavf_get_adv_rss_hash_opt()
1720 spin_unlock_bh(&adapter->adv_rss_lock); in iavf_get_adv_rss_hash_opt()
1723 return -EINVAL; in iavf_get_adv_rss_hash_opt()
1727 cmd->data |= (u64)RXH_IP_SRC; in iavf_get_adv_rss_hash_opt()
1731 cmd->data |= (u64)RXH_IP_DST; in iavf_get_adv_rss_hash_opt()
1736 cmd->data |= (u64)RXH_L4_B_0_1; in iavf_get_adv_rss_hash_opt()
1741 cmd->data |= (u64)RXH_L4_B_2_3; in iavf_get_adv_rss_hash_opt()
1747 * iavf_set_rxnfc - command to set Rx flow rules.
1756 int ret = -EOPNOTSUPP; in iavf_set_rxnfc()
1758 switch (cmd->cmd) { in iavf_set_rxnfc()
1776 * iavf_get_rxnfc - command to get RX flow classification rules
1787 int ret = -EOPNOTSUPP; in iavf_get_rxnfc()
1789 switch (cmd->cmd) { in iavf_get_rxnfc()
1791 cmd->data = adapter->num_active_queues; in iavf_get_rxnfc()
1795 if (!(adapter->flags & IAVF_FLAG_FDIR_ENABLED)) in iavf_get_rxnfc()
1797 spin_lock_bh(&adapter->fdir_fltr_lock); in iavf_get_rxnfc()
1798 cmd->rule_cnt = adapter->fdir_active_fltr; in iavf_get_rxnfc()
1799 spin_unlock_bh(&adapter->fdir_fltr_lock); in iavf_get_rxnfc()
1800 cmd->data = IAVF_MAX_FDIR_FILTERS; in iavf_get_rxnfc()
1824 * queue pair. Report one extra channel to match our "other" MSI-X vector.
1832 ch->max_combined = adapter->vsi_res->num_queue_pairs; in iavf_get_channels()
1834 ch->max_other = NONQ_VECS; in iavf_get_channels()
1835 ch->other_count = NONQ_VECS; in iavf_get_channels()
1837 ch->combined_count = adapter->num_active_queues; in iavf_get_channels()
1853 u32 num_req = ch->combined_count; in iavf_set_channels()
1856 if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) && in iavf_set_channels()
1857 adapter->num_tc) { in iavf_set_channels()
1858 dev_info(&adapter->pdev->dev, "Cannot set channels since ADq is enabled.\n"); in iavf_set_channels()
1859 return -EINVAL; in iavf_set_channels()
1865 if (num_req == 0 || num_req > adapter->vsi_res->num_queue_pairs) in iavf_set_channels()
1866 return -EINVAL; in iavf_set_channels()
1868 if (num_req == adapter->num_active_queues) in iavf_set_channels()
1871 if (ch->rx_count || ch->tx_count || ch->other_count != NONQ_VECS) in iavf_set_channels()
1872 return -EINVAL; in iavf_set_channels()
1874 adapter->num_req_queues = num_req; in iavf_set_channels()
1875 adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED; in iavf_set_channels()
1886 * iavf_get_rxfh_key_size - get the RSS hash key size
1895 return adapter->rss_key_size; in iavf_get_rxfh_key_size()
1899 * iavf_get_rxfh_indir_size - get the rx flow hash indirection table size
1908 return adapter->rss_lut_size; in iavf_get_rxfh_indir_size()
1912 * iavf_get_rxfh - get the rx flow hash indirection table
1924 rxfh->hfunc = ETH_RSS_HASH_TOP; in iavf_get_rxfh()
1925 if (adapter->hfunc == VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC) in iavf_get_rxfh()
1926 rxfh->input_xfrm |= RXH_XFRM_SYM_XOR; in iavf_get_rxfh()
1928 if (rxfh->key) in iavf_get_rxfh()
1929 memcpy(rxfh->key, adapter->rss_key, adapter->rss_key_size); in iavf_get_rxfh()
1931 if (rxfh->indir) in iavf_get_rxfh()
1933 for (i = 0; i < adapter->rss_lut_size; i++) in iavf_get_rxfh()
1934 rxfh->indir[i] = (u32)adapter->rss_lut[i]; in iavf_get_rxfh()
1940 * iavf_set_rxfh - set the rx flow hash indirection table
1945 * Returns -EINVAL if the table specifies an invalid queue id, otherwise
1956 if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE && in iavf_set_rxfh()
1957 rxfh->hfunc != ETH_RSS_HASH_TOP) in iavf_set_rxfh()
1958 return -EOPNOTSUPP; in iavf_set_rxfh()
1960 if ((rxfh->input_xfrm & RXH_XFRM_SYM_XOR) && in iavf_set_rxfh()
1961 adapter->hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC) { in iavf_set_rxfh()
1963 return -EOPNOTSUPP; in iavf_set_rxfh()
1964 adapter->hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_SYMMETRIC; in iavf_set_rxfh()
1965 adapter->aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC; in iavf_set_rxfh()
1966 } else if (!(rxfh->input_xfrm & RXH_XFRM_SYM_XOR) && in iavf_set_rxfh()
1967 adapter->hfunc != VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC) { in iavf_set_rxfh()
1968 adapter->hfunc = VIRTCHNL_RSS_ALG_TOEPLITZ_ASYMMETRIC; in iavf_set_rxfh()
1969 adapter->aq_required |= IAVF_FLAG_AQ_SET_RSS_HFUNC; in iavf_set_rxfh()
1972 if (!rxfh->key && !rxfh->indir) in iavf_set_rxfh()
1975 if (rxfh->key) in iavf_set_rxfh()
1976 memcpy(adapter->rss_key, rxfh->key, adapter->rss_key_size); in iavf_set_rxfh()
1978 if (rxfh->indir) { in iavf_set_rxfh()
1980 for (i = 0; i < adapter->rss_lut_size; i++) in iavf_set_rxfh()
1981 adapter->rss_lut[i] = (u8)(rxfh->indir[i]); in iavf_set_rxfh()
2018 * iavf_set_ethtool_ops - Initialize ethtool ops struct
2026 netdev->ethtool_ops = &iavf_ethtool_ops; in iavf_set_ethtool_ops()