net/qede: move SPDX tags to source files
[dpdk.git] / drivers / net / qede / base / ecore_iov_api.h
index b34a9c6..29001d7 100644 (file)
@@ -1,42 +1,56 @@
-/*
- * Copyright (c) 2016 QLogic Corporation.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2016 - 2018 Cavium Inc.
  * All rights reserved.
- * www.qlogic.com
- *
- * See LICENSE.qede_pmd for copyright and licensing details.
+ * www.cavium.com
  */
 
 #ifndef __ECORE_SRIOV_API_H__
 #define __ECORE_SRIOV_API_H__
 
+#include "common_hsi.h"
 #include "ecore_status.h"
 
+#define ECORE_ETH_VF_NUM_MAC_FILTERS 1
+#define ECORE_ETH_VF_NUM_VLAN_FILTERS 2
 #define ECORE_VF_ARRAY_LENGTH (3)
 
 #define IS_VF(p_dev)           ((p_dev)->b_is_vf)
 #define IS_PF(p_dev)           (!((p_dev)->b_is_vf))
 #ifdef CONFIG_ECORE_SRIOV
-#define IS_PF_SRIOV(p_hwfn)    (!!((p_hwfn)->p_dev->sriov_info.total_vfs))
+#define IS_PF_SRIOV(p_hwfn)    (!!((p_hwfn)->p_dev->p_iov_info))
 #else
 #define IS_PF_SRIOV(p_hwfn)    (0)
 #endif
 #define IS_PF_SRIOV_ALLOC(p_hwfn)      (!!((p_hwfn)->pf_iov_info))
-#define IS_PF_PDA(p_hwfn)      0       /* @@TBD Michalk */
+#define IS_PF_PDA(p_hwfn)      0 /* @@TBD Michalk */
 
 /* @@@ TBD MichalK - what should this number be*/
 #define ECORE_MAX_VF_CHAINS_PER_PF 16
 
 /* vport update extended feature tlvs flags */
 enum ecore_iov_vport_update_flag {
-       ECORE_IOV_VP_UPDATE_ACTIVATE = 0,
-       ECORE_IOV_VP_UPDATE_VLAN_STRIP = 1,
-       ECORE_IOV_VP_UPDATE_TX_SWITCH = 2,
-       ECORE_IOV_VP_UPDATE_MCAST = 3,
-       ECORE_IOV_VP_UPDATE_ACCEPT_PARAM = 4,
-       ECORE_IOV_VP_UPDATE_RSS = 5,
-       ECORE_IOV_VP_UPDATE_ACCEPT_ANY_VLAN = 6,
-       ECORE_IOV_VP_UPDATE_SGE_TPA = 7,
-       ECORE_IOV_VP_UPDATE_MAX = 8,
+       ECORE_IOV_VP_UPDATE_ACTIVATE            = 0,
+       ECORE_IOV_VP_UPDATE_VLAN_STRIP          = 1,
+       ECORE_IOV_VP_UPDATE_TX_SWITCH           = 2,
+       ECORE_IOV_VP_UPDATE_MCAST               = 3,
+       ECORE_IOV_VP_UPDATE_ACCEPT_PARAM        = 4,
+       ECORE_IOV_VP_UPDATE_RSS                 = 5,
+       ECORE_IOV_VP_UPDATE_ACCEPT_ANY_VLAN     = 6,
+       ECORE_IOV_VP_UPDATE_SGE_TPA             = 7,
+       ECORE_IOV_VP_UPDATE_MAX                 = 8,
+};
+
+/* PF to VF STATUS is part of vfpf-channel API
+ * and must be forward compatible
+*/
+enum ecore_iov_pf_to_vf_status {
+       PFVF_STATUS_WAITING = 0,
+       PFVF_STATUS_SUCCESS,
+       PFVF_STATUS_FAILURE,
+       PFVF_STATUS_NOT_SUPPORTED,
+       PFVF_STATUS_NO_RESOURCE,
+       PFVF_STATUS_FORCED,
+       PFVF_STATUS_MALICIOUS,
 };
 
 struct ecore_mcp_link_params;
@@ -53,6 +67,14 @@ struct ecore_mcp_link_capabilities;
 struct ecore_vf_acquire_sw_info {
        u32 driver_version;
        u8 os_type;
+
+       /* We have several close releases that all use ~same FW with different
+        * versions [making it incompatible as the versioning scheme is still
+        * tied directly to FW version], allow to override the checking. Only
+        * those versions would actually support this feature [so it would not
+        * break forward compatibility with newer HV drivers that are no longer
+        * suited].
+        */
        bool override_fw_version;
 };
 
@@ -64,24 +86,46 @@ struct ecore_public_vf_info {
        u16 forced_vlan;
 };
 
+struct ecore_iov_vf_init_params {
+       u16 rel_vf_id;
+
+       /* Number of requested Queues; Currently, don't support different
+        * number of Rx/Tx queues.
+        */
+       /* TODO - remove this limitation */
+       u16 num_queues;
+
+       /* Allow the client to choose which qzones to use for Rx/Tx,
+        * and which queue_base to use for Tx queues on a per-queue basis.
+        * Notice values should be relative to the PF resources.
+        */
+       u16 req_rx_queue[ECORE_MAX_VF_CHAINS_PER_PF];
+       u16 req_tx_queue[ECORE_MAX_VF_CHAINS_PER_PF];
+
+       u8 vport_id;
+
+       /* Should be set in case RSS is going to be used for VF */
+       u8 rss_eng_id;
+};
+
 #ifdef CONFIG_ECORE_SW_CHANNEL
 /* This is SW channel related only... */
 enum mbx_state {
-       VF_PF_UNKNOWN_STATE = 0,
-       VF_PF_WAIT_FOR_START_REQUEST = 1,
-       VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST = 2,
-       VF_PF_REQUEST_IN_PROCESSING = 3,
-       VF_PF_RESPONSE_READY = 4,
+       VF_PF_UNKNOWN_STATE                     = 0,
+       VF_PF_WAIT_FOR_START_REQUEST            = 1,
+       VF_PF_WAIT_FOR_NEXT_CHUNK_OF_REQUEST    = 2,
+       VF_PF_REQUEST_IN_PROCESSING             = 3,
+       VF_PF_RESPONSE_READY                    = 4,
 };
 
 struct ecore_iov_sw_mbx {
-       enum mbx_state mbx_state;
+       enum mbx_state          mbx_state;
 
-       u32 request_size;
-       u32 request_offset;
+       u32                     request_size;
+       u32                     request_offset;
 
-       u32 response_size;
-       u32 response_offset;
+       u32                     response_size;
+       u32                     response_offset;
 };
 
 /**
@@ -92,32 +136,58 @@ struct ecore_iov_sw_mbx {
  *
  * @return struct ecore_iov_sw_mbx*
  */
-struct ecore_iov_sw_mbx *ecore_iov_get_vf_sw_mbx(struct ecore_hwfn *p_hwfn,
-                                                u16 rel_vf_id);
+struct ecore_iov_sw_mbx*
+ecore_iov_get_vf_sw_mbx(struct ecore_hwfn *p_hwfn,
+                       u16 rel_vf_id);
 #endif
 
+/* This struct is part of ecore_dev and contains data relevant to all hwfns;
+ * Initialized only if SR-IOV cpabability is exposed in PCIe config space.
+ */
+struct ecore_hw_sriov_info {
+       /* standard SRIOV capability fields, mostly for debugging */
+       int     pos;            /* capability position */
+       int     nres;           /* number of resources */
+       u32     cap;            /* SR-IOV Capabilities */
+       u16     ctrl;           /* SR-IOV Control */
+       u16     total_vfs;      /* total VFs associated with the PF */
+       u16     num_vfs;        /* number of vfs that have been started */
+       u16     initial_vfs;    /* initial VFs associated with the PF */
+       u16     nr_virtfn;      /* number of VFs available */
+       u16     offset;         /* first VF Routing ID offset */
+       u16     stride;         /* following VF stride */
+       u16     vf_device_id;   /* VF device id */
+       u32     pgsz;           /* page size for BAR alignment */
+       u8      link;           /* Function Dependency Link */
+
+       u32     first_vf_in_pf;
+};
+
 #ifdef CONFIG_ECORE_SRIOV
+#ifndef LINUX_REMOVE
 /**
  * @brief mark/clear all VFs before/after an incoming PCIe sriov
  *        disable.
  *
- * @param p_hwfn
+ * @param p_dev
  * @param to_disable
  */
-void ecore_iov_set_vfs_to_disable(struct ecore_hwfn *p_hwfn, u8 to_disable);
+void ecore_iov_set_vfs_to_disable(struct ecore_dev *p_dev,
+                                 u8 to_disable);
 
 /**
- * @brief mark/clear chosen VFs before/after an incoming PCIe
+ * @brief mark/clear chosen VF before/after an incoming PCIe
  *        sriov disable.
  *
- * @param p_hwfn
+ * @param p_dev
+ * @param rel_vf_id
  * @param to_disable
  */
-void ecore_iov_set_vf_to_disable(struct ecore_hwfn *p_hwfn,
-                                u16 rel_vf_id, u8 to_disable);
+void ecore_iov_set_vf_to_disable(struct ecore_dev *p_dev,
+                                u16 rel_vf_id,
+                                u8 to_disable);
 
 /**
- *
  * @brief ecore_iov_init_hw_for_vf - initialize the HW for
  *        enabling access of a VF. Also includes preparing the
  *        IGU for VF access. This needs to be called AFTER hw is
@@ -125,14 +195,14 @@ void ecore_iov_set_vf_to_disable(struct ecore_hwfn *p_hwfn,
  *
  * @param p_hwfn
  * @param p_ptt
- * @param rel_vf_id
- * @param num_rx_queues
+ * @param p_params
  *
  * @return enum _ecore_status_t
  */
 enum _ecore_status_t ecore_iov_init_hw_for_vf(struct ecore_hwfn *p_hwfn,
                                              struct ecore_ptt *p_ptt,
-                                             u16 rel_vf_id, u16 num_rx_queues);
+                                             struct ecore_iov_vf_init_params
+                                                    *p_params);
 
 /**
  * @brief ecore_iov_process_mbx_req - process a request received
@@ -143,7 +213,8 @@ enum _ecore_status_t ecore_iov_init_hw_for_vf(struct ecore_hwfn *p_hwfn,
  * @param vfid
  */
 void ecore_iov_process_mbx_req(struct ecore_hwfn *p_hwfn,
-                              struct ecore_ptt *p_ptt, int vfid);
+                              struct ecore_ptt *p_ptt,
+                              int vfid);
 
 /**
  * @brief ecore_iov_release_hw_for_vf - called once upper layer
@@ -161,7 +232,6 @@ enum _ecore_status_t ecore_iov_release_hw_for_vf(struct ecore_hwfn *p_hwfn,
                                                 struct ecore_ptt *p_ptt,
                                                 u16 rel_vf_id);
 
-#ifndef LINUX_REMOVE
 /**
  * @brief ecore_iov_set_vf_ctx - set a context for a given VF
  *
@@ -172,8 +242,8 @@ enum _ecore_status_t ecore_iov_release_hw_for_vf(struct ecore_hwfn *p_hwfn,
  * @return enum _ecore_status_t
  */
 enum _ecore_status_t ecore_iov_set_vf_ctx(struct ecore_hwfn *p_hwfn,
-                                         u16 vf_id, void *ctx);
-#endif
+                                         u16 vf_id,
+                                         void *ctx);
 
 /**
  * @brief FLR cleanup for all VFs
@@ -197,7 +267,8 @@ enum _ecore_status_t ecore_iov_vf_flr_cleanup(struct ecore_hwfn *p_hwfn,
  */
 enum _ecore_status_t
 ecore_iov_single_vf_flr_cleanup(struct ecore_hwfn *p_hwfn,
-                               struct ecore_ptt *p_ptt, u16 rel_vf_id);
+                               struct ecore_ptt *p_ptt,
+                               u16 rel_vf_id);
 
 /**
  * @brief Update the bulletin with link information. Notice this does NOT
@@ -238,7 +309,8 @@ void ecore_iov_get_link(struct ecore_hwfn *p_hwfn,
  *
  * @return bool
  */
-bool ecore_iov_is_vf_pending_flr(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+bool ecore_iov_is_vf_pending_flr(struct ecore_hwfn *p_hwfn,
+                                u16 rel_vf_id);
 
 /**
  * @brief Check if given VF ID @vfid is valid
@@ -249,11 +321,13 @@ bool ecore_iov_is_vf_pending_flr(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  * @param p_hwfn
  * @param rel_vf_id - Relative VF ID
  * @param b_enabled_only - consider only enabled VF
+ * @param b_non_malicious - true iff we want to validate vf isn't malicious.
  *
  * @return bool - true for valid VF ID
  */
 bool ecore_iov_is_valid_vfid(struct ecore_hwfn *p_hwfn,
-                            int rel_vf_id, bool b_enabled_only);
+                            int rel_vf_id,
+                            bool b_enabled_only, bool b_non_malicious);
 
 /**
  * @brief Get VF's public info structure
@@ -264,26 +338,18 @@ bool ecore_iov_is_valid_vfid(struct ecore_hwfn *p_hwfn,
  *
  * @return struct ecore_public_vf_info *
  */
-struct ecore_public_vf_info *ecore_iov_get_public_vf_info(struct ecore_hwfn
-                                                         *p_hwfn, u16 vfid,
-                                                         bool b_enabled_only);
-
-/**
- * @brief Set pending events bitmap for given @vfid
- *
- * @param p_hwfn
- * @param vfid
- */
-void ecore_iov_pf_add_pending_events(struct ecore_hwfn *p_hwfn, u8 vfid);
+struct ecore_public_vf_info*
+ecore_iov_get_public_vf_info(struct ecore_hwfn *p_hwfn,
+                            u16 vfid, bool b_enabled_only);
 
 /**
- * @brief Copy pending events bitmap in @events and clear
- *       original copy of events
+ * @brief fills a bitmask of all VFs which have pending unhandled
+ *        messages.
  *
  * @param p_hwfn
  */
-void ecore_iov_pf_get_and_clear_pending_events(struct ecore_hwfn *p_hwfn,
-                                              u64 *events);
+void ecore_iov_pf_get_pending_events(struct ecore_hwfn *p_hwfn,
+                                    u64 *events);
 
 /**
  * @brief Copy VF's message to PF's buffer
@@ -295,7 +361,8 @@ void ecore_iov_pf_get_and_clear_pending_events(struct ecore_hwfn *p_hwfn,
  * @return enum _ecore_status_t
  */
 enum _ecore_status_t ecore_iov_copy_vf_msg(struct ecore_hwfn *p_hwfn,
-                                          struct ecore_ptt *ptt, int vfid);
+                                          struct ecore_ptt *ptt,
+                                          int vfid);
 /**
  * @brief Set forced MAC address in PFs copy of bulletin board
  *        and configures FW/HW to support the configuration.
@@ -318,17 +385,6 @@ void ecore_iov_bulletin_set_forced_mac(struct ecore_hwfn *p_hwfn,
 enum _ecore_status_t ecore_iov_bulletin_set_mac(struct ecore_hwfn *p_hwfn,
                                                u8 *mac, int vfid);
 
-/**
- * @brief Set forced VLAN [pvid] in PFs copy of bulletin board
- *        and configures FW/HW to support the configuration.
- *        Setting of pvid 0 would clear the feature.
- * @param p_hwfn
- * @param pvid
- * @param vfid
- */
-void ecore_iov_bulletin_set_forced_vlan(struct ecore_hwfn *p_hwfn,
-                                       u16 pvid, int vfid);
-
 /**
  * @brief Set default behaviour of VF in case no vlans are configured for it
  *        whether to accept only untagged traffic or all.
@@ -342,7 +398,9 @@ void ecore_iov_bulletin_set_forced_vlan(struct ecore_hwfn *p_hwfn,
  */
 enum _ecore_status_t
 ecore_iov_bulletin_set_forced_untagged_default(struct ecore_hwfn *p_hwfn,
-                                              bool b_untagged_only, int vfid);
+                                              bool b_untagged_only,
+                                              int vfid);
+
 /**
  * @brief Get VFs opaque fid.
  *
@@ -354,14 +412,15 @@ void ecore_iov_get_vfs_opaque_fid(struct ecore_hwfn *p_hwfn, int vfid,
                                  u16 *opaque_fid);
 
 /**
- * @brief Get VFs VPORT id.
- *
+ * @brief Set forced VLAN [pvid] in PFs copy of bulletin board
+ *        and configures FW/HW to support the configuration.
+ *        Setting of pvid 0 would clear the feature.
  * @param p_hwfn
+ * @param pvid
  * @param vfid
- * @param vport id
  */
-void ecore_iov_get_vfs_vport_id(struct ecore_hwfn *p_hwfn, int vfid,
-                               u8 *p_vport_id);
+void ecore_iov_bulletin_set_forced_vlan(struct ecore_hwfn *p_hwfn,
+                                       u16 pvid, int vfid);
 
 /**
  * @brief Check if VF has VPORT instance. This can be used
@@ -457,9 +516,9 @@ void ecore_iov_get_vf_req_virt_mbx_params(struct ecore_hwfn *p_hwfn,
  * @param p_reply_virt_size
  */
 void ecore_iov_get_vf_reply_virt_mbx_params(struct ecore_hwfn *p_hwfn,
-                                           u16 rel_vf_id,
+                                           u16 rel_vf_id,
                                            void **pp_reply_virt_addr,
-                                           u16 *p_reply_virt_size);
+                                           u16 *p_reply_virt_size);
 
 /**
  * @brief Validate if the given length is a valid vfpf message
@@ -478,6 +537,17 @@ bool ecore_iov_is_valid_vfpf_msg_length(u32 length);
  */
 u32 ecore_iov_pfvf_msg_length(void);
 
+/**
+ * @brief Returns MAC address if one is configured
+ *
+ * @parm p_hwfn
+ * @parm rel_vf_id
+ *
+ * @return OSAL_NULL if mac isn't set; Otherwise, returns MAC.
+ */
+u8 *ecore_iov_bulletin_get_mac(struct ecore_hwfn *p_hwfn,
+                              u16 rel_vf_id);
+
 /**
  * @brief Returns forced MAC address if one is configured
  *
@@ -486,7 +556,8 @@ u32 ecore_iov_pfvf_msg_length(void);
  *
  * @return OSAL_NULL if mac isn't forced; Otherwise, returns MAC.
  */
-u8 *ecore_iov_bulletin_get_forced_mac(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+u8 *ecore_iov_bulletin_get_forced_mac(struct ecore_hwfn *p_hwfn,
+                                     u16 rel_vf_id);
 
 /**
  * @brief Returns pvid if one is configured
@@ -535,7 +606,8 @@ enum _ecore_status_t ecore_iov_get_vf_stats(struct ecore_hwfn *p_hwfn,
  *
  * @return num of rxqs chains.
  */
-u8 ecore_iov_get_vf_num_rxqs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+u8 ecore_iov_get_vf_num_rxqs(struct ecore_hwfn *p_hwfn,
+                            u16 rel_vf_id);
 
 /**
  * @brief - Retrieves num of active rxqs chains
@@ -545,7 +617,8 @@ u8 ecore_iov_get_vf_num_rxqs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  *
  * @return
  */
-u8 ecore_iov_get_vf_num_active_rxqs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+u8 ecore_iov_get_vf_num_active_rxqs(struct ecore_hwfn *p_hwfn,
+                                   u16 rel_vf_id);
 
 /**
  * @brief - Retrieves ctx pointer
@@ -555,7 +628,8 @@ u8 ecore_iov_get_vf_num_active_rxqs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  *
  * @return
  */
-void *ecore_iov_get_vf_ctx(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+void *ecore_iov_get_vf_ctx(struct ecore_hwfn *p_hwfn,
+                          u16 rel_vf_id);
 
 /**
  * @brief - Retrieves VF`s num sbs
@@ -565,7 +639,8 @@ void *ecore_iov_get_vf_ctx(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  *
  * @return
  */
-u8 ecore_iov_get_vf_num_sbs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+u8 ecore_iov_get_vf_num_sbs(struct ecore_hwfn *p_hwfn,
+                           u16 rel_vf_id);
 
 /**
  * @brief - Returm true if VF is waiting for acquire
@@ -575,7 +650,8 @@ u8 ecore_iov_get_vf_num_sbs(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  *
  * @return
  */
-bool ecore_iov_is_vf_wait_for_acquire(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+bool ecore_iov_is_vf_wait_for_acquire(struct ecore_hwfn *p_hwfn,
+                                     u16 rel_vf_id);
 
 /**
  * @brief - Returm true if VF is acquired but not initialized
@@ -596,7 +672,19 @@ bool ecore_iov_is_vf_acquired_not_initialized(struct ecore_hwfn *p_hwfn,
  *
  * @return
  */
-bool ecore_iov_is_vf_initialized(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
+bool ecore_iov_is_vf_initialized(struct ecore_hwfn *p_hwfn,
+                                u16 rel_vf_id);
+
+/**
+ * @brief - Returm true if VF has started in FW
+ *
+ * @param p_hwfn
+ * @param rel_vf_id
+ *
+ * @return
+ */
+bool ecore_iov_is_vf_started(struct ecore_hwfn *p_hwfn,
+                            u16 rel_vf_id);
 
 /**
  * @brief - Get VF's vport min rate configured.
@@ -607,327 +695,59 @@ bool ecore_iov_is_vf_initialized(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
  */
 int ecore_iov_get_vf_min_rate(struct ecore_hwfn *p_hwfn, int vfid);
 
+#endif
+
 /**
- * @brief - Configure min rate for VF's vport.
- * @param p_dev
- * @param vfid
- * @param - rate in Mbps
+ * @brief ecore_pf_configure_vf_queue_coalesce - PF configure coalesce
+ *    parameters of VFs for Rx and Tx queue.
+ *    While the API allows setting coalescing per-qid, all queues sharing a SB
+ *    should be in same range [i.e., either 0-0x7f, 0x80-0xff or 0x100-0x1ff]
+ *    otherwise configuration would break.
  *
- * @return
+ * @param p_hwfn
+ * @param rx_coal - Rx Coalesce value in micro seconds.
+ * @param tx_coal - TX Coalesce value in micro seconds.
+ * @param vf_id
+ * @param qid
+ *
+ * @return int
+ **/
+enum _ecore_status_t
+ecore_iov_pf_configure_vf_queue_coalesce(struct ecore_hwfn *p_hwfn,
+                                        u16 rx_coal, u16 tx_coal,
+                                        u16 vf_id, u16 qid);
+
+/**
+ * @brief - Given a VF index, return index of next [including that] active VF.
+ *
+ * @param p_hwfn
+ * @param rel_vf_id
+ *
+ * @return MAX_NUM_VFS_E4 in case no further active VFs, otherwise index.
  */
-enum _ecore_status_t ecore_iov_configure_min_tx_rate(struct ecore_dev *p_dev,
-                                                    int vfid, u32 rate);
-#else
-static OSAL_INLINE void ecore_iov_set_vfs_to_disable(struct ecore_hwfn *p_hwfn,
-                                                    u8 to_disable)
-{
-}
-
-static OSAL_INLINE void ecore_iov_set_vf_to_disable(struct ecore_hwfn *p_hwfn,
-                                                   u16 rel_vf_id,
-                                                   u8 to_disable)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_init_hw_for_vf(struct
-                                                                ecore_hwfn
-                                                                * p_hwfn,
-                                                                struct
-                                                                ecore_ptt
-                                                                * p_ptt,
-                                                                u16 rel_vf_id,
-                                                                u16
-                                                                num_rx_queues)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE void ecore_iov_process_mbx_req(struct ecore_hwfn *p_hwfn,
-                                                 struct ecore_ptt *p_ptt,
-                                                 int vfid)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_release_hw_for_vf(struct
-                                                                   ecore_hwfn
-                                                                   * p_hwfn,
-                                                                   struct
-                                                                   ecore_ptt
-                                                                   * p_ptt,
-                                                                   u16
-                                                                   rel_vf_id)
-{
-       return ECORE_SUCCESS;
-}
+u16 ecore_iov_get_next_active_vf(struct ecore_hwfn *p_hwfn, u16 rel_vf_id);
 
-#ifndef LINUX_REMOVE
-static OSAL_INLINE enum _ecore_status_t ecore_iov_set_vf_ctx(struct ecore_hwfn
-                                                            *p_hwfn, u16 vf_id,
-                                                            void *ctx)
-{
-       return ECORE_INVAL;
-}
-#endif
-static OSAL_INLINE enum _ecore_status_t ecore_iov_vf_flr_cleanup(struct
-                                                                ecore_hwfn
-                                                                * p_hwfn,
-                                                                struct
-                                                                ecore_ptt
-                                                                * p_ptt)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_single_vf_flr_cleanup(
-       struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, u16 rel_vf_id)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE void ecore_iov_set_link(struct ecore_hwfn *p_hwfn, u16 vfid,
-                                          struct ecore_mcp_link_params *params,
-                                          struct ecore_mcp_link_state *link,
-                                          struct ecore_mcp_link_capabilities
-                                          *p_caps)
-{
-}
-
-static OSAL_INLINE void ecore_iov_get_link(struct ecore_hwfn *p_hwfn, u16 vfid,
-                                          struct ecore_mcp_link_params *params,
-                                          struct ecore_mcp_link_state *link,
-                                          struct ecore_mcp_link_capabilities
-                                          *p_caps)
-{
-}
-
-static OSAL_INLINE bool ecore_iov_is_vf_pending_flr(struct ecore_hwfn *p_hwfn,
-                                                   u16 rel_vf_id)
-{
-       return false;
-}
-
-static OSAL_INLINE bool ecore_iov_is_valid_vfid(struct ecore_hwfn *p_hwfn,
-                                               int rel_vf_id,
-                                               bool b_enabled_only)
-{
-       return false;
-}
-
-static OSAL_INLINE struct ecore_public_vf_info *
-       ecore_iov_get_public_vf_info(struct ecore_hwfn *p_hwfn, u16 vfid,
-                                 bool b_enabled_only)
-{
-       return OSAL_NULL;
-}
-
-static OSAL_INLINE void ecore_iov_pf_add_pending_events(struct ecore_hwfn
-                                                       *p_hwfn, u8 vfid)
-{
-}
-
-static OSAL_INLINE void ecore_iov_pf_get_and_clear_pending_events(struct
-                                                                 ecore_hwfn
-                                                                 * p_hwfn,
-                                                                 u64 *events)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_copy_vf_msg(struct ecore_hwfn
-                                                             *p_hwfn,
-                                                             struct ecore_ptt
-                                                             *ptt, int vfid)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE void ecore_iov_bulletin_set_forced_mac(struct ecore_hwfn
-                                                         *p_hwfn, u8 *mac,
-                                                         int vfid)
-{
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_bulletin_set_mac(struct
-                                                                  ecore_hwfn
-                                                                  * p_hwfn,
-                                                                  u8 *mac,
-                                                                  int vfid)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE void ecore_iov_bulletin_set_forced_vlan(struct ecore_hwfn
-                                                          p_hwfn, u16 pvid,
-                                                          int vfid)
-{
-}
-
-static OSAL_INLINE void ecore_iov_get_vfs_opaque_fid(struct ecore_hwfn *p_hwfn,
-                                                    int vfid, u16 *opaque_fid)
-{
-}
-
-static OSAL_INLINE void ecore_iov_get_vfs_vport_id(struct ecore_hwfn *p_hwfn,
-                                                  int vfid, u8 *p_vport_id)
-{
-}
-
-static OSAL_INLINE bool ecore_iov_vf_has_vport_instance(struct ecore_hwfn
-                                                       *p_hwfn, int vfid)
-{
-       return false;
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_post_vf_bulletin(struct
-                                                                  ecore_hwfn
-                                                                  * p_hwfn,
-                                                                  int vfid,
-                                                                  struct
-                                                                  ecore_ptt
-                                                                  * p_ptt)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE bool ecore_iov_is_vf_stopped(struct ecore_hwfn *p_hwfn,
-                                               int vfid)
-{
-       return false;
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_spoofchk_set(struct ecore_hwfn
-                                                              *p_hwfn,
-                                                              int vfid,
-                                                              bool val)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE bool ecore_iov_spoofchk_get(struct ecore_hwfn *p_hwfn,
-                                              int vfid)
-{
-       return false;
-}
-
-static OSAL_INLINE bool ecore_iov_pf_sanity_check(struct ecore_hwfn *p_hwfn,
-                                                 int vfid)
-{
-       return false;
-}
-
-static OSAL_INLINE u8 ecore_iov_vf_chains_per_pf(struct ecore_hwfn *p_hwfn)
-{
-       return 0;
-}
-
-static OSAL_INLINE void ecore_iov_get_vf_req_virt_mbx_params(struct ecore_hwfn
-                                                            *p_hwfn,
-                                                            u16 rel_vf_id,
-                                                            void
-                                                            **pp_req_virt_addr,
-                                                            u16 *
-                                                            p_req_virt_size)
-{
-}
-
-static OSAL_INLINE void ecore_iov_get_vf_reply_virt_mbx_params(struct ecore_hwfn
-                                                              *p_hwfn,
-                                                              u16 rel_vf_id,
-                                                              void
-                                                      **pp_reply_virt_addr,
-                                                              u16 *
-                                                      p_reply_virt_size)
-{
-}
-
-static OSAL_INLINE bool ecore_iov_is_valid_vfpf_msg_length(u32 length)
-{
-       return false;
-}
-
-static OSAL_INLINE u32 ecore_iov_pfvf_msg_length(void)
-{
-       return 0;
-}
-
-static OSAL_INLINE u8 *ecore_iov_bulletin_get_forced_mac(struct ecore_hwfn
-                                                        *p_hwfn, u16 rel_vf_id)
-{
-       return OSAL_NULL;
-}
-
-static OSAL_INLINE u16 ecore_iov_bulletin_get_forced_vlan(struct ecore_hwfn
-                                                         *p_hwfn,
-                                                         u16 rel_vf_id)
-{
-       return 0;
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_configure_tx_rate(struct
-                                                                   ecore_hwfn
-                                                                   * p_hwfn,
-                                                                   struct
-                                                                   ecore_ptt
-                                                                   * p_ptt,
-                                                                   int vfid,
-                                                                   int val)
-{
-       return ECORE_INVAL;
-}
-
-static OSAL_INLINE u8 ecore_iov_get_vf_num_rxqs(struct ecore_hwfn *p_hwfn,
-                                               u16 rel_vf_id)
-{
-       return 0;
-}
-
-static OSAL_INLINE u8 ecore_iov_get_vf_num_active_rxqs(struct ecore_hwfn
-                                                      *p_hwfn, u16 rel_vf_id)
-{
-       return 0;
-}
-
-static OSAL_INLINE void *ecore_iov_get_vf_ctx(struct ecore_hwfn *p_hwfn,
-                                             u16 rel_vf_id)
-{
-       return OSAL_NULL;
-}
-
-static OSAL_INLINE u8 ecore_iov_get_vf_num_sbs(struct ecore_hwfn *p_hwfn,
-                                              u16 rel_vf_id)
-{
-       return 0;
-}
-
-static OSAL_INLINE bool ecore_iov_is_vf_wait_for_acquire(struct ecore_hwfn
-                                                        *p_hwfn, u16 rel_vf_id)
-{
-       return false;
-}
-
-static OSAL_INLINE bool ecore_iov_is_vf_acquired_not_initialized(struct
-                                                                ecore_hwfn
-                                                                * p_hwfn,
-                                                                u16 rel_vf_id)
-{
-       return false;
-}
-
-static OSAL_INLINE bool ecore_iov_is_vf_initialized(struct ecore_hwfn *p_hwfn,
-                                                   u16 rel_vf_id)
-{
-       return false;
-}
-
-static OSAL_INLINE int ecore_iov_get_vf_min_rate(struct ecore_hwfn *p_hwfn,
-                                                int vfid)
-{
-       return 0;
-}
-
-static OSAL_INLINE enum _ecore_status_t ecore_iov_configure_min_tx_rate(
-       struct ecore_dev *p_dev, int vfid, u32 rate)
-{
-       return ECORE_INVAL;
-}
+void ecore_iov_bulletin_set_udp_ports(struct ecore_hwfn *p_hwfn, int vfid,
+                                     u16 vxlan_port, u16 geneve_port);
+
+#ifdef CONFIG_ECORE_SW_CHANNEL
+/**
+ * @brief Set whether PF should communicate with VF using SW/HW channel
+ *        Needs to be called for an enabled VF before acquire is over
+ *        [latest good point for doing that is OSAL_IOV_VF_ACQUIRE()]
+ *
+ * @param p_hwfn
+ * @param vfid - relative vf index
+ * @param b_is_hw - true iff PF is to use HW channel for communication
+ */
+void ecore_iov_set_vf_hw_channel(struct ecore_hwfn *p_hwfn, int vfid,
+                                bool b_is_hw);
 #endif
+#endif /* CONFIG_ECORE_SRIOV */
+
+#define ecore_for_each_vf(_p_hwfn, _i)                                 \
+       for (_i = ecore_iov_get_next_active_vf(_p_hwfn, 0);             \
+            _i < MAX_NUM_VFS_E4;                                       \
+            _i = ecore_iov_get_next_active_vf(_p_hwfn, _i + 1))
+
 #endif