2024-03-18 14:31:25

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 0/7] i40e: cleanups & refactors

This series do following:
Patch 1 - Removes write-only flags field from i40e_veb structure and
from i40e_veb_setup() parameters
Patch 2 - Changes parameter of i40e_notify_client_of_l2_param_changes()
and i40e_notify_client_of_netdev_close()
Patch 3 - Changes parameter of i40e_detect_recover_hung()
Patch 4 - Adds helper i40e_pf_get_main_vsi() to get main VSI and uses it
in existing code
Patch 5 - Consolidates checks whether given VSI is the main one
Patch 6 - Adds helper i40e_pf_get_main_veb() to get main VEB and uses it
in existing code
Patch 7 - Adds helper i40e_vsi_reconfig_tc() to reconfigure TC for
particular and uses it to replace existing open-coded pieces

Ivan Vecera (7):
i40e: Remove flags field from i40e_veb
i40e: Change argument of several client notification functions
i40e: Change argument of i40e_detect_recover_hung()
i40e: Add helper to access main VSI
i40e: Consolidate checks whether given VSI is main
i40e: Add helper to access main VEB
i40e: Add and use helper to reconfigure TC for given VSI

drivers/net/ethernet/intel/i40e/i40e.h | 29 ++-
drivers/net/ethernet/intel/i40e/i40e_client.c | 28 +--
drivers/net/ethernet/intel/i40e/i40e_ddp.c | 3 +-
.../net/ethernet/intel/i40e/i40e_debugfs.c | 36 ++--
.../net/ethernet/intel/i40e/i40e_ethtool.c | 29 ++-
drivers/net/ethernet/intel/i40e/i40e_main.c | 199 ++++++++++--------
drivers/net/ethernet/intel/i40e/i40e_ptp.c | 6 +-
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 16 +-
drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +-
.../ethernet/intel/i40e/i40e_virtchnl_pf.c | 14 +-
10 files changed, 210 insertions(+), 152 deletions(-)

--
2.43.0



2024-03-18 14:31:40

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 1/7] i40e: Remove flags field from i40e_veb

The field is initialized always to zero and it is never read.
Remove it.

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e.h | 3 +--
drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +-
drivers/net/ethernet/intel/i40e/i40e_main.c | 13 +++++--------
3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 2fbabcdb5bb5..5248e78f7849 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -788,7 +788,6 @@ struct i40e_veb {
u16 stats_idx; /* index of VEB parent */
u8 enabled_tc;
u16 bridge_mode; /* Bridge Mode (VEB/VEPA) */
- u16 flags;
u16 bw_limit;
u8 bw_max_quanta;
bool is_abs_credits;
@@ -1213,7 +1212,7 @@ void i40e_vsi_stop_rings(struct i40e_vsi *vsi);
void i40e_vsi_stop_rings_no_wait(struct i40e_vsi *vsi);
int i40e_vsi_wait_queues_disabled(struct i40e_vsi *vsi);
int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count);
-struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, u16 uplink_seid,
+struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 uplink_seid,
u16 downlink_seid, u8 enabled_tc);
void i40e_veb_release(struct i40e_veb *veb);

diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
index f9ba45f596c9..6147c5f128e8 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
@@ -867,7 +867,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
goto command_write_done;
}

- veb = i40e_veb_setup(pf, 0, uplink_seid, vsi_seid, enabled_tc);
+ veb = i40e_veb_setup(pf, uplink_seid, vsi_seid, enabled_tc);
if (veb)
dev_info(&pf->pdev->dev, "added relay %d\n", veb->seid);
else
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 663b2237eb4e..2f1604ae78c7 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -13138,7 +13138,7 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev,

/* Insert a new HW bridge */
if (!veb) {
- veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
+ veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid,
vsi->tc_config.enabled_tc);
if (veb) {
veb->bridge_mode = mode;
@@ -14394,10 +14394,10 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
}

if (vsi->uplink_seid == pf->mac_seid)
- veb = i40e_veb_setup(pf, 0, pf->mac_seid, vsi->seid,
+ veb = i40e_veb_setup(pf, pf->mac_seid, vsi->seid,
vsi->tc_config.enabled_tc);
else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0)
- veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
+ veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid,
vsi->tc_config.enabled_tc);
if (veb) {
if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) {
@@ -14791,7 +14791,6 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
/**
* i40e_veb_setup - Set up a VEB
* @pf: board private structure
- * @flags: VEB setup flags
* @uplink_seid: the switch element to link to
* @vsi_seid: the initial VSI seid
* @enabled_tc: Enabled TC bit-map
@@ -14804,9 +14803,8 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
* Returns pointer to the successfully allocated VEB sw struct on
* success, otherwise returns NULL on failure.
**/
-struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags,
- u16 uplink_seid, u16 vsi_seid,
- u8 enabled_tc)
+struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 uplink_seid,
+ u16 vsi_seid, u8 enabled_tc)
{
struct i40e_vsi *vsi = NULL;
struct i40e_veb *veb;
@@ -14837,7 +14835,6 @@ struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags,
if (veb_idx < 0)
goto err_alloc;
veb = pf->veb[veb_idx];
- veb->flags = flags;
veb->uplink_seid = uplink_seid;
veb->enabled_tc = (enabled_tc ? enabled_tc : 0x1);

--
2.43.0


2024-03-18 14:31:43

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 2/7] i40e: Change argument of several client notification functions

Commit 0ef2d5afb12d ("i40e: KISS the client interface") simplified
the client interface so in practice it supports only one client
per i40e netdev. But we have still 2 notification functions that
uses as parameter a pointer to VSI of netdevice associated with
the client. After the mentioned commit only possible and used
VSI is the main (LAN) VSI.
So change these functions so they are called with PF pointer argument
and the associated VSI (LAN) is taken inside them.

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e.h | 4 ++--
drivers/net/ethernet/intel/i40e/i40e_client.c | 20 +++++++++----------
drivers/net/ethernet/intel/i40e/i40e_main.c | 12 +++++------
3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 5248e78f7849..0792c7324527 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -1236,8 +1236,8 @@ static inline void i40e_dbg_exit(void) {}
int i40e_lan_add_device(struct i40e_pf *pf);
int i40e_lan_del_device(struct i40e_pf *pf);
void i40e_client_subtask(struct i40e_pf *pf);
-void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi);
-void i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool reset);
+void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf);
+void i40e_notify_client_of_netdev_close(struct i40e_pf *pf, bool reset);
void i40e_notify_client_of_vf_enable(struct i40e_pf *pf, u32 num_vfs);
void i40e_notify_client_of_vf_reset(struct i40e_pf *pf, u32 vf_id);
void i40e_client_update_msix_info(struct i40e_pf *pf);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c b/drivers/net/ethernet/intel/i40e/i40e_client.c
index b32071ee84af..93e52138826e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_client.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
@@ -101,25 +101,26 @@ i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id, u8 *msg, u16 len)

/**
* i40e_notify_client_of_l2_param_changes - call the client notify callback
- * @vsi: the VSI with l2 param changes
+ * @pf: PF device pointer
*
- * If there is a client to this VSI, call the client
+ * If there is a client, call its callback
**/
-void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi)
+void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf)
{
- struct i40e_pf *pf = vsi->back;
struct i40e_client_instance *cdev = pf->cinst;
+ struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
struct i40e_params params;

if (!cdev || !cdev->client)
return;
if (!cdev->client->ops || !cdev->client->ops->l2_param_change) {
- dev_dbg(&vsi->back->pdev->dev,
+ dev_dbg(&pf->pdev->dev,
"Cannot locate client instance l2_param_change routine\n");
return;
}
if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
- dev_dbg(&vsi->back->pdev->dev, "Client is not open, abort l2 param change\n");
+ dev_dbg(&pf->pdev->dev,
+ "Client is not open, abort l2 param change\n");
return;
}
memset(&params, 0, sizeof(params));
@@ -157,20 +158,19 @@ static void i40e_client_release_qvlist(struct i40e_info *ldev)

/**
* i40e_notify_client_of_netdev_close - call the client close callback
- * @vsi: the VSI with netdev closed
+ * @pf: PF device pointer
* @reset: true when close called due to a reset pending
*
* If there is a client to this netdev, call the client with close
**/
-void i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool reset)
+void i40e_notify_client_of_netdev_close(struct i40e_pf *pf, bool reset)
{
- struct i40e_pf *pf = vsi->back;
struct i40e_client_instance *cdev = pf->cinst;

if (!cdev || !cdev->client)
return;
if (!cdev->client->ops || !cdev->client->ops->close) {
- dev_dbg(&vsi->back->pdev->dev,
+ dev_dbg(&pf->pdev->dev,
"Cannot locate client instance close routine\n");
return;
}
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 2f1604ae78c7..7fed7fb69d4e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -11283,14 +11283,12 @@ static void i40e_service_task(struct work_struct *work)
i40e_fdir_reinit_subtask(pf);
if (test_and_clear_bit(__I40E_CLIENT_RESET, pf->state)) {
/* Client subtask will reopen next time through. */
- i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi],
- true);
+ i40e_notify_client_of_netdev_close(pf, true);
} else {
i40e_client_subtask(pf);
if (test_and_clear_bit(__I40E_CLIENT_L2_CHANGE,
pf->state))
- i40e_notify_client_of_l2_param_changes(
- pf->vsi[pf->lan_vsi]);
+ i40e_notify_client_of_l2_param_changes(pf);
}
i40e_sync_filters_subtask(pf);
} else {
@@ -16228,7 +16226,7 @@ static void i40e_remove(struct pci_dev *pdev)
/* Client close must be called explicitly here because the timer
* has been stopped.
*/
- i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
+ i40e_notify_client_of_netdev_close(pf, false);

i40e_fdir_teardown(pf);

@@ -16487,7 +16485,7 @@ static void i40e_shutdown(struct pci_dev *pdev)
/* Client close must be called explicitly here because the timer
* has been stopped.
*/
- i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
+ i40e_notify_client_of_netdev_close(pf, false);

if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps) &&
pf->wol_en)
@@ -16541,7 +16539,7 @@ static int i40e_suspend(struct device *dev)
/* Client close must be called explicitly here because the timer
* has been stopped.
*/
- i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false);
+ i40e_notify_client_of_netdev_close(pf, false);

if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps) &&
pf->wol_en)
--
2.43.0


2024-03-18 14:32:10

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 3/7] i40e: Change argument of i40e_detect_recover_hung()

Commit 07d44190a389 ("i40e/i40evf: Detect and recover hung queue
scenario") changes i40e_detect_recover_hung() argument type from
i40e_pf* to i40e_vsi* to be shareable by both i40e and i40evf.
Because the i40evf does not exist anymore and the function is
exclusively used by i40e we can revert this change.

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +-
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 10 ++++++----
drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +-
3 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 7fed7fb69d4e..1ba28893f49e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -11274,7 +11274,7 @@ static void i40e_service_task(struct work_struct *work)
return;

if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) {
- i40e_detect_recover_hung(pf->vsi[pf->lan_vsi]);
+ i40e_detect_recover_hung(pf);
i40e_sync_filters_subtask(pf);
i40e_reset_subtask(pf);
i40e_handle_mdd_event(pf);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index 1a12b732818e..e35a08de16b2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -860,13 +860,15 @@ u32 i40e_get_tx_pending(struct i40e_ring *ring, bool in_sw)

/**
* i40e_detect_recover_hung - Function to detect and recover hung_queues
- * @vsi: pointer to vsi struct with tx queues
+ * @pf: pointer to PF struct
*
- * VSI has netdev and netdev has TX queues. This function is to check each of
- * those TX queues if they are hung, trigger recovery by issuing SW interrupt.
+ * LAN VSI has netdev and netdev has TX queues. This function is to check
+ * each of those TX queues if they are hung, trigger recovery by issuing
+ * SW interrupt.
**/
-void i40e_detect_recover_hung(struct i40e_vsi *vsi)
+void i40e_detect_recover_hung(struct i40e_pf *pf)
{
+ struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
struct i40e_ring *tx_ring = NULL;
struct net_device *netdev;
unsigned int i;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
index 2cdc7de6301c..7c26c9a2bf65 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
@@ -470,7 +470,7 @@ void i40e_free_rx_resources(struct i40e_ring *rx_ring);
int i40e_napi_poll(struct napi_struct *napi, int budget);
void i40e_force_wb(struct i40e_vsi *vsi, struct i40e_q_vector *q_vector);
u32 i40e_get_tx_pending(struct i40e_ring *ring, bool in_sw);
-void i40e_detect_recover_hung(struct i40e_vsi *vsi);
+void i40e_detect_recover_hung(struct i40e_pf *pf);
int __i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size);
bool __i40e_chk_linearize(struct sk_buff *skb);
int i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
--
2.43.0


2024-03-18 14:32:34

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 4/7] i40e: Add helper to access main VSI

Add simple helper i40e_pf_get_main_vsi(pf) to access main VSI
that replaces pattern 'pf->vsi[pf->lan_vsi]'

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e.h | 11 ++
drivers/net/ethernet/intel/i40e/i40e_client.c | 10 +-
drivers/net/ethernet/intel/i40e/i40e_ddp.c | 3 +-
.../net/ethernet/intel/i40e/i40e_debugfs.c | 32 +++---
.../net/ethernet/intel/i40e/i40e_ethtool.c | 8 +-
drivers/net/ethernet/intel/i40e/i40e_main.c | 107 ++++++++++--------
drivers/net/ethernet/intel/i40e/i40e_ptp.c | 6 +-
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 8 +-
.../ethernet/intel/i40e/i40e_virtchnl_pf.c | 14 ++-
9 files changed, 116 insertions(+), 83 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index 0792c7324527..fb0b913692e1 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -1372,6 +1372,17 @@ i40e_pf_get_vsi_by_seid(struct i40e_pf *pf, u16 seid)
return NULL;
}

+/**
+ * i40e_pf_get_main_vsi - get pointer to main VSI
+ * @pf: pointer to a PF
+ *
+ * Return pointer to main VSI or NULL if it does not exist
+ **/
+static inline struct i40e_vsi *i40e_pf_get_main_vsi(struct i40e_pf *pf)
+{
+ return (pf->lan_vsi != I40E_NO_VSI) ? pf->vsi[pf->lan_vsi] : NULL;
+}
+
/**
* i40e_pf_get_veb_by_seid - find VEB by SEID
* @pf: pointer to a PF
diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c b/drivers/net/ethernet/intel/i40e/i40e_client.c
index 93e52138826e..59263551c383 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_client.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
@@ -107,8 +107,8 @@ i40e_notify_client_of_vf_msg(struct i40e_vsi *vsi, u32 vf_id, u8 *msg, u16 len)
**/
void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf)
{
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_client_instance *cdev = pf->cinst;
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
struct i40e_params params;

if (!cdev || !cdev->client)
@@ -333,9 +333,9 @@ static int i40e_register_auxiliary_dev(struct i40e_info *ldev, const char *name)
**/
static void i40e_client_add_instance(struct i40e_pf *pf)
{
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_client_instance *cdev = NULL;
struct netdev_hw_addr *mac = NULL;
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];

cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
if (!cdev)
@@ -399,9 +399,9 @@ void i40e_client_del_instance(struct i40e_pf *pf)
**/
void i40e_client_subtask(struct i40e_pf *pf)
{
- struct i40e_client *client;
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_client_instance *cdev;
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_client *client;
int ret = 0;

if (!test_and_clear_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state))
@@ -665,8 +665,8 @@ static int i40e_client_update_vsi_ctxt(struct i40e_info *ldev,
bool is_vf, u32 vf_id,
u32 flag, u32 valid_flag)
{
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(ldev->pf);
struct i40e_pf *pf = ldev->pf;
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
struct i40e_vsi_context ctxt;
bool update = true;
int err;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ddp.c b/drivers/net/ethernet/intel/i40e/i40e_ddp.c
index 2f53f0f53bc3..daa9f2c42f70 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ddp.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ddp.c
@@ -407,8 +407,9 @@ static int i40e_ddp_load(struct net_device *netdev, const u8 *data, size_t size,
**/
static int i40e_ddp_restore(struct i40e_pf *pf)
{
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
+ struct net_device *netdev = vsi->netdev;
struct i40e_ddp_old_profile_list *entry;
- struct net_device *netdev = pf->vsi[pf->lan_vsi]->netdev;
int status = 0;

if (!list_empty(&pf->ddp_old_prof)) {
diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
index 6147c5f128e8..09db46de2994 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
@@ -53,6 +53,7 @@ static ssize_t i40e_dbg_command_read(struct file *filp, char __user *buffer,
size_t count, loff_t *ppos)
{
struct i40e_pf *pf = filp->private_data;
+ struct i40e_vsi *main_vsi;
int bytes_not_copied;
int buf_size = 256;
char *buf;
@@ -68,8 +69,8 @@ static ssize_t i40e_dbg_command_read(struct file *filp, char __user *buffer,
if (!buf)
return -ENOSPC;

- len = snprintf(buf, buf_size, "%s: %s\n",
- pf->vsi[pf->lan_vsi]->netdev->name,
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ len = snprintf(buf, buf_size, "%s: %s\n", main_vsi->netdev->name,
i40e_dbg_command_buf);

bytes_not_copied = copy_to_user(buffer, buf, len);
@@ -786,7 +787,8 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
if (cnt == 0) {
/* default to PF VSI */
- vsi_seid = pf->vsi[pf->lan_vsi]->seid;
+ vsi = i40e_pf_get_main_vsi(pf);
+ vsi_seid = vsi->seid;
} else if (vsi_seid < 0) {
dev_info(&pf->pdev->dev, "add VSI %d: bad vsi seid\n",
vsi_seid);
@@ -1030,7 +1032,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
goto command_write_done;
}

- vsi = pf->vsi[pf->lan_vsi];
+ vsi = i40e_pf_get_main_vsi(pf);
switch_id =
le16_to_cpu(vsi->info.switch_id) &
I40E_AQ_VSI_SW_ID_MASK;
@@ -1380,6 +1382,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
dev_info(&pf->pdev->dev, "FD current total filter count for this interface: %d\n",
i40e_get_current_fd_count(pf));
} else if (strncmp(cmd_buf, "lldp", 4) == 0) {
+ /* Get main VSI */
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
+
if (strncmp(&cmd_buf[5], "stop", 4) == 0) {
int ret;

@@ -1391,10 +1396,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
goto command_write_done;
}
ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
- pf->hw.mac.addr,
- ETH_P_LLDP, 0,
- pf->vsi[pf->lan_vsi]->seid,
- 0, true, NULL, NULL);
+ pf->hw.mac.addr, ETH_P_LLDP, 0,
+ main_vsi->seid, 0, true, NULL,
+ NULL);
if (ret) {
dev_info(&pf->pdev->dev,
"%s: Add Control Packet Filter AQ command failed =0x%x\n",
@@ -1409,10 +1413,9 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
int ret;

ret = i40e_aq_add_rem_control_packet_filter(&pf->hw,
- pf->hw.mac.addr,
- ETH_P_LLDP, 0,
- pf->vsi[pf->lan_vsi]->seid,
- 0, false, NULL, NULL);
+ pf->hw.mac.addr, ETH_P_LLDP, 0,
+ main_vsi->seid, 0, false, NULL,
+ NULL);
if (ret) {
dev_info(&pf->pdev->dev,
"%s: Remove Control Packet Filter AQ command failed =0x%x\n",
@@ -1639,6 +1642,7 @@ static ssize_t i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
size_t count, loff_t *ppos)
{
struct i40e_pf *pf = filp->private_data;
+ struct i40e_vsi *main_vsi;
int bytes_not_copied;
int buf_size = 256;
char *buf;
@@ -1654,8 +1658,8 @@ static ssize_t i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
if (!buf)
return -ENOSPC;

- len = snprintf(buf, buf_size, "%s: %s\n",
- pf->vsi[pf->lan_vsi]->netdev->name,
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ len = snprintf(buf, buf_size, "%s: %s\n", main_vsi->netdev->name,
i40e_dbg_netdev_ops_buf);

bytes_not_copied = copy_to_user(buffer, buf, len);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 42e7e6cdaa6d..0905c1fb2337 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -2029,7 +2029,7 @@ static void i40e_get_ringparam(struct net_device *netdev,
{
struct i40e_netdev_priv *np = netdev_priv(netdev);
struct i40e_pf *pf = np->vsi->back;
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);

ring->rx_max_pending = i40e_get_max_num_descriptors(pf);
ring->tx_max_pending = i40e_get_max_num_descriptors(pf);
@@ -3370,6 +3370,7 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf,
struct i40e_rx_flow_userdef userdef = {0};
struct i40e_fdir_filter *rule = NULL;
struct hlist_node *node2;
+ struct i40e_vsi *vsi;
u64 input_set;
u16 index;

@@ -3493,9 +3494,8 @@ static int i40e_get_ethtool_fdir_entry(struct i40e_pf *pf,
fsp->flow_type |= FLOW_EXT;
}

- if (rule->dest_vsi != pf->vsi[pf->lan_vsi]->id) {
- struct i40e_vsi *vsi;
-
+ vsi = i40e_pf_get_main_vsi(pf);
+ if (rule->dest_vsi != vsi->id) {
vsi = i40e_find_vsi_from_id(pf, rule->dest_vsi);
if (vsi && vsi->type == I40E_VSI_SRIOV) {
/* VFs are zero-indexed by the driver, but ethtool
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 1ba28893f49e..86bc3fc0579b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -2475,7 +2475,7 @@ i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name,
**/
static int i40e_set_promiscuous(struct i40e_pf *pf, bool promisc)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_hw *hw = &pf->hw;
int aq_ret;

@@ -4330,7 +4330,7 @@ static irqreturn_t i40e_intr(int irq, void *data)

/* only q0 is used in MSI/Legacy mode, and none are used in MSIX */
if (icr0 & I40E_PFINT_ICR0_QUEUE_0_MASK) {
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_q_vector *q_vector = vsi->q_vectors[0];

/* We do not have a way to disarm Queue causes while leaving
@@ -5480,7 +5480,7 @@ static u8 i40e_dcb_get_enabled_tc(struct i40e_dcbx_config *dcbcfg)
**/
static u8 i40e_mqprio_get_enabled_tc(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
u8 num_tc = vsi->mqprio_qopt.qopt.num_tc;
u8 enabled_tc = 1, i;

@@ -5497,13 +5497,14 @@ static u8 i40e_mqprio_get_enabled_tc(struct i40e_pf *pf)
**/
static u8 i40e_pf_get_num_tc(struct i40e_pf *pf)
{
- struct i40e_hw *hw = &pf->hw;
u8 i, enabled_tc = 1;
u8 num_tc = 0;
- struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config;

- if (i40e_is_tc_mqprio_enabled(pf))
- return pf->vsi[pf->lan_vsi]->mqprio_qopt.qopt.num_tc;
+ if (i40e_is_tc_mqprio_enabled(pf)) {
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
+
+ return vsi->mqprio_qopt.qopt.num_tc;
+ }

/* If neither MQPRIO nor DCB is enabled, then always use single TC */
if (!test_bit(I40E_FLAG_DCB_ENA, pf->flags))
@@ -5511,7 +5512,7 @@ static u8 i40e_pf_get_num_tc(struct i40e_pf *pf)

/* SFP mode will be enabled for all TCs on port */
if (!test_bit(I40E_FLAG_MFP_ENA, pf->flags))
- return i40e_dcb_get_num_tc(dcbcfg);
+ return i40e_dcb_get_num_tc(&pf->hw.local_dcbx_config);

/* MFP mode return count of enabled TCs for this PF */
if (pf->hw.func_caps.iscsi)
@@ -6485,6 +6486,7 @@ static inline int i40e_setup_hw_channel(struct i40e_pf *pf,
static bool i40e_setup_channel(struct i40e_pf *pf, struct i40e_vsi *vsi,
struct i40e_channel *ch)
{
+ struct i40e_vsi *main_vsi;
u8 vsi_type;
u16 seid;
int ret;
@@ -6498,7 +6500,8 @@ static bool i40e_setup_channel(struct i40e_pf *pf, struct i40e_vsi *vsi,
}

/* underlying switching element */
- seid = pf->vsi[pf->lan_vsi]->uplink_seid;
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ seid = main_vsi->uplink_seid;

/* create channel (VSI), configure TX rings */
ret = i40e_setup_hw_channel(pf, vsi, ch, seid, vsi_type);
@@ -7055,7 +7058,9 @@ int i40e_hw_dcb_config(struct i40e_pf *pf, struct i40e_dcbx_config *new_cfg)

/* Configure Rx Packet Buffers in HW */
for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
- mfs_tc[i] = pf->vsi[pf->lan_vsi]->netdev->mtu;
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
+
+ mfs_tc[i] = main_vsi->netdev->mtu;
mfs_tc[i] += I40E_PACKET_HDR_PAD;
}

@@ -9812,7 +9817,7 @@ static void i40e_fdir_flush_and_replay(struct i40e_pf *pf)
dev_warn(&pf->pdev->dev, "FD table did not flush, needs more time\n");
} else {
/* replay sideband filters */
- i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]);
+ i40e_fdir_filter_restore(i40e_pf_get_main_vsi(pf));
if (!disable_atr && !pf->fd_tcp4_filter_cnt)
clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state);
clear_bit(__I40E_FD_FLUSH_REQUESTED, pf->state);
@@ -9910,7 +9915,7 @@ static void i40e_veb_link_event(struct i40e_veb *veb, bool link_up)
**/
static void i40e_link_event(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
u8 new_link_speed, old_link_speed;
bool new_link, old_link;
int status;
@@ -10281,7 +10286,7 @@ static void i40e_verify_eeprom(struct i40e_pf *pf)
**/
static void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_vsi_context ctxt;
int ret;

@@ -10317,7 +10322,7 @@ static void i40e_enable_pf_switch_lb(struct i40e_pf *pf)
**/
static void i40e_disable_pf_switch_lb(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_vsi_context ctxt;
int ret;

@@ -10393,7 +10398,7 @@ static int i40e_reconstitute_veb(struct i40e_veb *veb)

if (veb->uplink_seid == pf->mac_seid) {
/* Check that the LAN VSI has VEB owning flag set */
- ctl_vsi = pf->vsi[pf->lan_vsi];
+ ctl_vsi = i40e_pf_get_main_vsi(pf);

if (WARN_ON(ctl_vsi->veb_idx != veb->idx ||
!(ctl_vsi->flags & I40E_VSI_FLAG_VEB_OWNER))) {
@@ -10536,7 +10541,7 @@ static int i40e_vsi_clear(struct i40e_vsi *vsi);
**/
static void i40e_fdir_sb_setup(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi;
+ struct i40e_vsi *main_vsi, *vsi;

/* quick workaround for an NVM issue that leaves a critical register
* uninitialized
@@ -10561,8 +10566,8 @@ static void i40e_fdir_sb_setup(struct i40e_pf *pf)

/* create a new VSI if none exists */
if (!vsi) {
- vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR,
- pf->vsi[pf->lan_vsi]->seid, 0);
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, main_vsi->seid, 0);
if (!vsi) {
dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n");
clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags);
@@ -10841,7 +10846,7 @@ static int i40e_reset(struct i40e_pf *pf)
static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
{
const bool is_recovery_mode_reported = i40e_check_recovery_mode(pf);
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_hw *hw = &pf->hw;
struct i40e_veb *veb;
int ret;
@@ -10850,7 +10855,7 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)

if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) &&
is_recovery_mode_reported)
- i40e_set_ethtool_ops(pf->vsi[pf->lan_vsi]->netdev);
+ i40e_set_ethtool_ops(vsi->netdev);

if (test_bit(__I40E_DOWN, pf->state) &&
!test_bit(__I40E_RECOVERY_MODE, pf->state))
@@ -12402,7 +12407,7 @@ void i40e_fill_rss_lut(struct i40e_pf *pf, u8 *lut,
**/
static int i40e_pf_config_rss(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
u8 seed[I40E_HKEY_ARRAY_SIZE];
u8 *lut;
struct i40e_hw *hw = &pf->hw;
@@ -12474,7 +12479,7 @@ static int i40e_pf_config_rss(struct i40e_pf *pf)
**/
int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
int new_rss_size;

if (!test_bit(I40E_FLAG_RSS_ENA, pf->flags))
@@ -13767,9 +13772,10 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
* the end, which is 4 bytes long, so force truncation of the
* original name by IFNAMSIZ - 4
*/
- snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d",
- IFNAMSIZ - 4,
- pf->vsi[pf->lan_vsi]->netdev->name);
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
+
+ snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d", IFNAMSIZ - 4,
+ main_vsi->netdev->name);
eth_random_addr(mac_addr);

spin_lock_bh(&vsi->mac_filter_hash_lock);
@@ -14281,6 +14287,7 @@ static int i40e_vsi_setup_vectors(struct i40e_vsi *vsi)
**/
static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
{
+ struct i40e_vsi *main_vsi;
u16 alloc_queue_pairs;
struct i40e_pf *pf;
u8 enabled_tc;
@@ -14315,10 +14322,12 @@ static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
/* Update the FW view of the VSI. Force a reset of TC and queue
* layout configurations.
*/
- enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc;
- pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0;
- pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid;
- i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc);
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ enabled_tc = main_vsi->tc_config.enabled_tc;
+ main_vsi->tc_config.enabled_tc = 0;
+ main_vsi->seid = pf->main_vsi_seid;
+ i40e_vsi_config_tc(main_vsi, enabled_tc);
+
if (vsi->type == I40E_VSI_MAIN)
i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr);

@@ -15001,6 +15010,7 @@ int i40e_fetch_switch_configuration(struct i40e_pf *pf, bool printconfig)
**/
static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acquired)
{
+ struct i40e_vsi *main_vsi;
u16 flags = 0;
int ret;

@@ -15045,8 +15055,8 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
}

/* first time setup */
- if (pf->lan_vsi == I40E_NO_VSI || reinit) {
- struct i40e_vsi *vsi = NULL;
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ if (!main_vsi || reinit) {
u16 uplink_seid;

/* Set up the PF VSI associated with the PF's main VSI
@@ -15056,11 +15066,12 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
uplink_seid = pf->veb[pf->lan_veb]->seid;
else
uplink_seid = pf->mac_seid;
- if (pf->lan_vsi == I40E_NO_VSI)
- vsi = i40e_vsi_setup(pf, I40E_VSI_MAIN, uplink_seid, 0);
+ if (!main_vsi)
+ main_vsi = i40e_vsi_setup(pf, I40E_VSI_MAIN,
+ uplink_seid, 0);
else if (reinit)
- vsi = i40e_vsi_reinit_setup(pf->vsi[pf->lan_vsi]);
- if (!vsi) {
+ main_vsi = i40e_vsi_reinit_setup(main_vsi);
+ if (!main_vsi) {
dev_info(&pf->pdev->dev, "setup of MAIN VSI failed\n");
i40e_cloud_filter_exit(pf);
i40e_fdir_teardown(pf);
@@ -15068,13 +15079,13 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
}
} else {
/* force a reset of TC and queue layout configurations */
- u8 enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc;
+ u8 enabled_tc = main_vsi->tc_config.enabled_tc;

- pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0;
- pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid;
- i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc);
+ main_vsi->tc_config.enabled_tc = 0;
+ main_vsi->seid = pf->main_vsi_seid;
+ i40e_vsi_config_tc(main_vsi, enabled_tc);
}
- i40e_vlan_stripping_disable(pf->vsi[pf->lan_vsi]);
+ i40e_vlan_stripping_disable(main_vsi);

i40e_fdir_sb_setup(pf);

@@ -15101,7 +15112,7 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
rtnl_lock();

/* repopulate tunnel port filters */
- udp_tunnel_nic_reset_ntf(pf->vsi[pf->lan_vsi]->netdev);
+ udp_tunnel_nic_reset_ntf(main_vsi->netdev);

if (!lock_acquired)
rtnl_unlock();
@@ -15245,6 +15256,7 @@ static int i40e_setup_pf_filter_control(struct i40e_pf *pf)
#define REMAIN(__x) (INFO_STRING_LEN - (__x))
static void i40e_print_features(struct i40e_pf *pf)
{
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
struct i40e_hw *hw = &pf->hw;
char *buf;
int i;
@@ -15258,8 +15270,7 @@ static void i40e_print_features(struct i40e_pf *pf)
i += scnprintf(&buf[i], REMAIN(i), " VFs: %d", pf->num_req_vfs);
#endif
i += scnprintf(&buf[i], REMAIN(i), " VSIs: %d QP: %d",
- pf->hw.func_caps.num_vsis,
- pf->vsi[pf->lan_vsi]->num_queue_pairs);
+ pf->hw.func_caps.num_vsis, main_vsi->num_queue_pairs);
if (test_bit(I40E_FLAG_RSS_ENA, pf->flags))
i += scnprintf(&buf[i], REMAIN(i), " RSS");
if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags))
@@ -15923,7 +15934,9 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
dev_info(&pdev->dev, "setup_pf_switch failed: %d\n", err);
goto err_vsis;
}
- INIT_LIST_HEAD(&pf->vsi[pf->lan_vsi]->ch_list);
+
+ vsi = i40e_pf_get_main_vsi(pf);
+ INIT_LIST_HEAD(&vsi->ch_list);

/* if FDIR VSI was set up, start it now */
vsi = i40e_find_vsi_by_type(pf, I40E_VSI_FDIR);
@@ -16425,15 +16438,15 @@ static void i40e_pci_error_resume(struct pci_dev *pdev)
**/
static void i40e_enable_mc_magic_wake(struct i40e_pf *pf)
{
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
struct i40e_hw *hw = &pf->hw;
u8 mac_addr[6];
u16 flags = 0;
int ret;

/* Get current MAC address in case it's an LAA */
- if (pf->vsi[pf->lan_vsi] && pf->vsi[pf->lan_vsi]->netdev) {
- ether_addr_copy(mac_addr,
- pf->vsi[pf->lan_vsi]->netdev->dev_addr);
+ if (main_vsi && main_vsi->netdev) {
+ ether_addr_copy(mac_addr, main_vsi->netdev->dev_addr);
} else {
dev_err(&pf->pdev->dev,
"Failed to retrieve MAC address; using default\n");
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ptp.c b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
index e7ebcb09f23c..b72a4b5d76b9 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
@@ -1472,7 +1472,8 @@ void i40e_ptp_restore_hw_time(struct i40e_pf *pf)
**/
void i40e_ptp_init(struct i40e_pf *pf)
{
- struct net_device *netdev = pf->vsi[pf->lan_vsi]->netdev;
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
+ struct net_device *netdev = vsi->netdev;
struct i40e_hw *hw = &pf->hw;
u32 pf_id;
long err;
@@ -1536,6 +1537,7 @@ void i40e_ptp_init(struct i40e_pf *pf)
**/
void i40e_ptp_stop(struct i40e_pf *pf)
{
+ struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
struct i40e_hw *hw = &pf->hw;
u32 regval;

@@ -1555,7 +1557,7 @@ void i40e_ptp_stop(struct i40e_pf *pf)
ptp_clock_unregister(pf->ptp_clock);
pf->ptp_clock = NULL;
dev_info(&pf->pdev->dev, "%s: removed PHC on %s\n", __func__,
- pf->vsi[pf->lan_vsi]->netdev->name);
+ main_vsi->netdev->name);
}

if (i40e_is_ptp_pin_dev(&pf->hw)) {
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
index e35a08de16b2..8f38a969e20e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
@@ -23,7 +23,7 @@ static void i40e_fdir(struct i40e_ring *tx_ring,
{
struct i40e_filter_program_desc *fdir_desc;
struct i40e_pf *pf = tx_ring->vsi->back;
- u32 flex_ptype, dtype_cmd;
+ u32 flex_ptype, dtype_cmd, vsi_id;
u16 i;

/* grab the next descriptor */
@@ -41,8 +41,8 @@ static void i40e_fdir(struct i40e_ring *tx_ring,
flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_PCTYPE_MASK, fdata->pctype);

/* Use LAN VSI Id if not programmed by user */
- flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_DEST_VSI_MASK,
- fdata->dest_vsi ? : pf->vsi[pf->lan_vsi]->id);
+ vsi_id = fdata->dest_vsi ? : i40e_pf_get_main_vsi(pf)->id;
+ flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_DEST_VSI_MASK, vsi_id);

dtype_cmd = I40E_TX_DESC_DTYPE_FILTER_PROG;

@@ -868,7 +868,7 @@ u32 i40e_get_tx_pending(struct i40e_ring *ring, bool in_sw)
**/
void i40e_detect_recover_hung(struct i40e_pf *pf)
{
- struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
+ struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
struct i40e_ring *tx_ring = NULL;
struct net_device *netdev;
unsigned int i;
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 232b65b9c8ea..662622f01e31 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -795,13 +795,13 @@ static int i40e_config_vsi_rx_queue(struct i40e_vf *vf, u16 vsi_id,
static int i40e_alloc_vsi_res(struct i40e_vf *vf, u8 idx)
{
struct i40e_mac_filter *f = NULL;
+ struct i40e_vsi *main_vsi, *vsi;
struct i40e_pf *pf = vf->pf;
- struct i40e_vsi *vsi;
u64 max_tx_rate = 0;
int ret = 0;

- vsi = i40e_vsi_setup(pf, I40E_VSI_SRIOV, pf->vsi[pf->lan_vsi]->seid,
- vf->vf_id);
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ vsi = i40e_vsi_setup(pf, I40E_VSI_SRIOV, main_vsi->seid, vf->vf_id);

if (!vsi) {
dev_err(&pf->pdev->dev,
@@ -3322,8 +3322,9 @@ static int i40e_vc_remove_vlan_msg(struct i40e_vf *vf, u8 *msg)
static int i40e_vc_rdma_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)
{
struct i40e_pf *pf = vf->pf;
- int abs_vf_id = vf->vf_id + pf->hw.func_caps.vf_base_id;
+ struct i40e_vsi *main_vsi;
int aq_ret = 0;
+ int abs_vf_id;

if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
!test_bit(I40E_VF_STATE_RDMAENA, &vf->vf_states)) {
@@ -3331,8 +3332,9 @@ static int i40e_vc_rdma_msg(struct i40e_vf *vf, u8 *msg, u16 msglen)
goto error_param;
}

- i40e_notify_client_of_vf_msg(pf->vsi[pf->lan_vsi], abs_vf_id,
- msg, msglen);
+ main_vsi = i40e_pf_get_main_vsi(pf);
+ abs_vf_id = vf->vf_id + pf->hw.func_caps.vf_base_id;
+ i40e_notify_client_of_vf_msg(main_vsi, abs_vf_id, msg, msglen);

error_param:
/* send the response to the VF */
--
2.43.0


2024-03-18 14:32:39

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 5/7] i40e: Consolidate checks whether given VSI is main

In the driver code there are 3 types of checks whether given
VSI is main or not:
1. vsi->type ==/!= I40E_VSI_MAIN
2. vsi ==/!= pf->vsi[pf->lan_vsi]
3. vsi->seid ==/!= pf->vsi[pf->lan_vsi]->seid

All of them are equivalent and can be consolidated. Convert cases
2 and 3 to case 1.

Signed-off-by: Ivan Vecera <[email protected]>
---
.../net/ethernet/intel/i40e/i40e_debugfs.c | 2 +-
.../net/ethernet/intel/i40e/i40e_ethtool.c | 12 ++++++------
drivers/net/ethernet/intel/i40e/i40e_main.c | 19 +++++++++----------
3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
index 09db46de2994..abf624d770e6 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
@@ -129,7 +129,7 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)
dev_info(&pf->pdev->dev,
" state[%d] = %08lx\n",
i, vsi->state[i]);
- if (vsi == pf->vsi[pf->lan_vsi])
+ if (vsi->type == I40E_VSI_MAIN)
dev_info(&pf->pdev->dev, " MAC address: %pM Port MAC: %pM\n",
pf->hw.mac.addr,
pf->hw.mac.port_addr);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 0905c1fb2337..5cd0d1b45f01 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -1241,7 +1241,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
i40e_partition_setting_complaint(pf);
return -EOPNOTSUPP;
}
- if (vsi != pf->vsi[pf->lan_vsi])
+ if (vsi->type != I40E_VSI_MAIN)
return -EOPNOTSUPP;
if (hw->phy.media_type != I40E_MEDIA_TYPE_BASET &&
hw->phy.media_type != I40E_MEDIA_TYPE_FIBER &&
@@ -1710,7 +1710,7 @@ static int i40e_set_pauseparam(struct net_device *netdev,
return -EOPNOTSUPP;
}

- if (vsi != pf->vsi[pf->lan_vsi])
+ if (vsi->type != I40E_VSI_MAIN)
return -EOPNOTSUPP;

is_an = hw_link_info->an_info & I40E_AQ_AN_COMPLETED;
@@ -2292,7 +2292,7 @@ static int i40e_get_stats_count(struct net_device *netdev)
struct i40e_pf *pf = vsi->back;
int stats_len;

- if (vsi == pf->vsi[pf->lan_vsi] && pf->hw.partition_id == 1)
+ if (vsi->type == I40E_VSI_MAIN && pf->hw.partition_id == 1)
stats_len = I40E_PF_STATS_LEN;
else
stats_len = I40E_VSI_STATS_LEN;
@@ -2422,7 +2422,7 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
}
rcu_read_unlock();

- if (vsi != pf->vsi[pf->lan_vsi] || pf->hw.partition_id != 1)
+ if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1)
goto check_data_pointer;

veb_stats = ((pf->lan_veb != I40E_NO_VEB) &&
@@ -2495,7 +2495,7 @@ static void i40e_get_stat_strings(struct net_device *netdev, u8 *data)
"rx", i);
}

- if (vsi != pf->vsi[pf->lan_vsi] || pf->hw.partition_id != 1)
+ if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1)
goto check_data_pointer;

i40e_add_stat_strings(&data, i40e_gstrings_veb_stats);
@@ -2792,7 +2792,7 @@ static int i40e_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
return -EOPNOTSUPP;
}

- if (vsi != pf->vsi[pf->lan_vsi])
+ if (vsi->type != I40E_VSI_MAIN)
return -EOPNOTSUPP;

/* NVM bit on means WoL disabled for the port */
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 86bc3fc0579b..d6dbd0fd79eb 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -989,7 +989,7 @@ static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
ns->tx_dropped = es->tx_discards;

/* pull in a couple PF stats if this is the main vsi */
- if (vsi == pf->vsi[pf->lan_vsi]) {
+ if (vsi->type == I40E_VSI_MAIN) {
ns->rx_crc_errors = pf->stats.crc_errors;
ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes;
ns->rx_length_errors = pf->stats.rx_length_errors;
@@ -1234,7 +1234,7 @@ void i40e_update_stats(struct i40e_vsi *vsi)
{
struct i40e_pf *pf = vsi->back;

- if (vsi == pf->vsi[pf->lan_vsi])
+ if (vsi->type == I40E_VSI_MAIN)
i40e_update_pf_stats(pf);

i40e_update_vsi_stats(vsi);
@@ -6819,7 +6819,7 @@ static void i40e_dcb_reconfigure(struct i40e_pf *pf)
/* - Enable all TCs for the LAN VSI
* - For all others keep them at TC0 for now
*/
- if (v == pf->lan_vsi)
+ if (vsi->type == I40E_VSI_MAIN)
tc_map = i40e_pf_get_tc_map(pf);
else
tc_map = I40E_DEFAULT_TRAFFIC_CLASS;
@@ -9126,7 +9126,7 @@ int i40e_vsi_open(struct i40e_vsi *vsi)
i40e_vsi_free_rx_resources(vsi);
err_setup_tx:
i40e_vsi_free_tx_resources(vsi);
- if (vsi == pf->vsi[pf->lan_vsi])
+ if (vsi->type == I40E_VSI_MAIN)
i40e_do_reset(pf, I40E_PF_RESET_FLAG, true);

return err;
@@ -12001,7 +12001,7 @@ static int i40e_vsi_alloc_q_vectors(struct i40e_vsi *vsi)
/* if not MSIX, give the one vector only to the LAN VSI */
if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags))
num_q_vectors = vsi->num_q_vectors;
- else if (vsi == pf->vsi[pf->lan_vsi])
+ else if (vsi->type == I40E_VSI_MAIN)
num_q_vectors = 1;
else
return -EINVAL;
@@ -13118,7 +13118,7 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev,
int rem;

/* Only for PF VSI for now */
- if (vsi->seid != pf->vsi[pf->lan_vsi]->seid)
+ if (vsi->type != I40E_VSI_MAIN)
return -EOPNOTSUPP;

/* Find the HW bridge for PF VSI */
@@ -13190,7 +13190,7 @@ static int i40e_ndo_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
struct i40e_veb *veb;

/* Only for PF VSI for now */
- if (vsi->seid != pf->vsi[pf->lan_vsi]->seid)
+ if (vsi->type != I40E_VSI_MAIN)
return -EOPNOTSUPP;

/* Find the HW bridge for the PF VSI */
@@ -14142,8 +14142,7 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
vsi->seid, vsi->uplink_seid);
return -ENODEV;
}
- if (vsi == pf->vsi[pf->lan_vsi] &&
- !test_bit(__I40E_DOWN, pf->state)) {
+ if (vsi->type == I40E_VSI_MAIN && !test_bit(__I40E_DOWN, pf->state)) {
dev_info(&pf->pdev->dev, "Can't remove PF VSI\n");
return -ENODEV;
}
@@ -14407,7 +14406,7 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid,
vsi->tc_config.enabled_tc);
if (veb) {
- if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) {
+ if (vsi->type != I40E_VSI_MAIN) {
dev_info(&vsi->back->pdev->dev,
"New VSI creation error, uplink seid of LAN VSI expected.\n");
return NULL;
--
2.43.0


2024-03-18 14:32:53

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 6/7] i40e: Add helper to access main VEB

Add a helper to access main VEB:

i40e_pf_get_main_veb(pf) replaces 'pf->veb[pf->lan_veb]'

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e.h | 11 ++++++++
.../net/ethernet/intel/i40e/i40e_ethtool.c | 9 +++----
drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++++++++++-------
3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
index fb0b913692e1..2f135db416cf 100644
--- a/drivers/net/ethernet/intel/i40e/i40e.h
+++ b/drivers/net/ethernet/intel/i40e/i40e.h
@@ -1401,4 +1401,15 @@ i40e_pf_get_veb_by_seid(struct i40e_pf *pf, u16 seid)
return NULL;
}

+/**
+ * i40e_pf_get_main_veb - get pointer to main VEB
+ * @pf: pointer to a PF
+ *
+ * Return pointer to main VEB or NULL if it does not exist
+ **/
+static inline struct i40e_veb *i40e_pf_get_main_veb(struct i40e_pf *pf)
+{
+ return (pf->lan_veb != I40E_NO_VEB) ? pf->veb[pf->lan_veb] : NULL;
+}
+
#endif /* _I40E_H_ */
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index 5cd0d1b45f01..4e28785c9fb2 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -2425,14 +2425,11 @@ static void i40e_get_ethtool_stats(struct net_device *netdev,
if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1)
goto check_data_pointer;

- veb_stats = ((pf->lan_veb != I40E_NO_VEB) &&
- (pf->lan_veb < I40E_MAX_VEB) &&
- test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags));
+ veb = i40e_pf_get_main_veb(pf);
+ veb_stats = veb && test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags);

- if (veb_stats) {
- veb = pf->veb[pf->lan_veb];
+ if (veb_stats)
i40e_update_veb_stats(veb);
- }

/* If veb stats aren't enabled, pass NULL instead of the veb so that
* we initialize stats to zero and update the data pointer
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index d6dbd0fd79eb..2e1955064abb 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -2480,7 +2480,7 @@ static int i40e_set_promiscuous(struct i40e_pf *pf, bool promisc)
int aq_ret;

if (vsi->type == I40E_VSI_MAIN &&
- pf->lan_veb != I40E_NO_VEB &&
+ i40e_pf_get_main_veb(pf) &&
!test_bit(I40E_FLAG_MFP_ENA, pf->flags)) {
/* set defport ON for Main VSI instead of true promisc
* this way we will get all unicast/multicast and VLAN
@@ -9916,6 +9916,7 @@ static void i40e_veb_link_event(struct i40e_veb *veb, bool link_up)
static void i40e_link_event(struct i40e_pf *pf)
{
struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
+ struct i40e_veb *veb = i40e_pf_get_main_veb(pf);
u8 new_link_speed, old_link_speed;
bool new_link, old_link;
int status;
@@ -9955,8 +9956,8 @@ static void i40e_link_event(struct i40e_pf *pf)
/* Notify the base of the switch tree connected to
* the link. Floating VEBs are not notified.
*/
- if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])
- i40e_veb_link_event(pf->veb[pf->lan_veb], new_link);
+ if (veb)
+ i40e_veb_link_event(veb, new_link);
else
i40e_vsi_link_event(vsi, new_link);

@@ -14892,7 +14893,8 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf,
/* Main VEB? */
if (uplink_seid != pf->mac_seid)
break;
- if (pf->lan_veb >= I40E_MAX_VEB) {
+ veb = i40e_pf_get_main_veb(pf);
+ if (!veb) {
int v;

/* find existing or else empty VEB */
@@ -14906,12 +14908,15 @@ static void i40e_setup_pf_switch_element(struct i40e_pf *pf,
pf->lan_veb = v;
}
}
- if (pf->lan_veb >= I40E_MAX_VEB)
+
+ /* Try to get again main VEB as pf->lan_veb may have changed */
+ veb = i40e_pf_get_main_veb(pf);
+ if (!veb)
break;

- pf->veb[pf->lan_veb]->seid = seid;
- pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid;
- pf->veb[pf->lan_veb]->pf = pf;
+ veb->seid = seid;
+ veb->uplink_seid = pf->mac_seid;
+ veb->pf = pf;
break;
case I40E_SWITCH_ELEMENT_TYPE_VSI:
if (num_reported != 1)
@@ -15056,13 +15061,15 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
/* first time setup */
main_vsi = i40e_pf_get_main_vsi(pf);
if (!main_vsi || reinit) {
+ struct i40e_veb *veb;
u16 uplink_seid;

/* Set up the PF VSI associated with the PF's main VSI
* that is already in the HW switch
*/
- if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])
- uplink_seid = pf->veb[pf->lan_veb]->seid;
+ veb = i40e_pf_get_main_veb(pf);
+ if (veb)
+ uplink_seid = veb->seid;
else
uplink_seid = pf->mac_seid;
if (!main_vsi)
--
2.43.0


2024-03-18 14:33:16

by Ivan Vecera

[permalink] [raw]
Subject: [PATCH iwl-next 7/7] i40e: Add and use helper to reconfigure TC for given VSI

Add helper i40e_vsi_reconfig_tc(vsi) that configures TC
for given VSI using previously stored TC bitmap.

Effectively replaces open-coded patterns:

enabled_tc = vsi->tc_config.enabled_tc;
vsi->tc_config.enabled_tc = 0;
i40e_vsi_config_tc(vsi, enabled_tc);

Signed-off-by: Ivan Vecera <[email protected]>
---
drivers/net/ethernet/intel/i40e/i40e_main.c | 31 +++++++++++++++------
1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
index 2e1955064abb..6c25d02ea05e 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -5924,6 +5924,27 @@ static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc)
return ret;
}

+/**
+ * i40e_vsi_reconfig_tc - Reconfigure VSI Tx Scheduler for stored TC map
+ * @vsi: VSI to be reconfigured
+ *
+ * This reconfigures a particular VSI for TCs that are mapped to the
+ * TC bitmap stored previously for the VSI.
+ *
+ * NOTE:
+ * It is expected that the VSI queues have been quisced before calling
+ * this function.
+ **/
+static int i40e_vsi_reconfig_tc(struct i40e_vsi *vsi)
+{
+ u8 enabled_tc;
+
+ enabled_tc = vsi->tc_config.enabled_tc;
+ vsi->tc_config.enabled_tc = 0;
+
+ return i40e_vsi_config_tc(vsi, enabled_tc);
+}
+
/**
* i40e_get_link_speed - Returns link speed for the interface
* @vsi: VSI to be configured
@@ -14290,7 +14311,6 @@ static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
struct i40e_vsi *main_vsi;
u16 alloc_queue_pairs;
struct i40e_pf *pf;
- u8 enabled_tc;
int ret;

if (!vsi)
@@ -14323,10 +14343,8 @@ static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
* layout configurations.
*/
main_vsi = i40e_pf_get_main_vsi(pf);
- enabled_tc = main_vsi->tc_config.enabled_tc;
- main_vsi->tc_config.enabled_tc = 0;
main_vsi->seid = pf->main_vsi_seid;
- i40e_vsi_config_tc(main_vsi, enabled_tc);
+ i40e_vsi_reconfig_tc(main_vsi);

if (vsi->type == I40E_VSI_MAIN)
i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr);
@@ -15085,11 +15103,8 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit, bool lock_acqui
}
} else {
/* force a reset of TC and queue layout configurations */
- u8 enabled_tc = main_vsi->tc_config.enabled_tc;
-
- main_vsi->tc_config.enabled_tc = 0;
main_vsi->seid = pf->main_vsi_seid;
- i40e_vsi_config_tc(main_vsi, enabled_tc);
+ i40e_vsi_reconfig_tc(main_vsi);
}
i40e_vlan_stripping_disable(main_vsi);

--
2.43.0


2024-03-19 09:58:43

by Michal Schmidt

[permalink] [raw]
Subject: Re: [PATCH iwl-next 0/7] i40e: cleanups & refactors

On Mon, Mar 18, 2024 at 3:31 PM Ivan Vecera <[email protected]> wrote:
>
> This series do following:
> Patch 1 - Removes write-only flags field from i40e_veb structure and
> from i40e_veb_setup() parameters
> Patch 2 - Changes parameter of i40e_notify_client_of_l2_param_changes()
> and i40e_notify_client_of_netdev_close()
> Patch 3 - Changes parameter of i40e_detect_recover_hung()
> Patch 4 - Adds helper i40e_pf_get_main_vsi() to get main VSI and uses it
> in existing code
> Patch 5 - Consolidates checks whether given VSI is the main one
> Patch 6 - Adds helper i40e_pf_get_main_veb() to get main VEB and uses it
> in existing code
> Patch 7 - Adds helper i40e_vsi_reconfig_tc() to reconfigure TC for
> particular and uses it to replace existing open-coded pieces
>
> Ivan Vecera (7):
> i40e: Remove flags field from i40e_veb
> i40e: Change argument of several client notification functions
> i40e: Change argument of i40e_detect_recover_hung()
> i40e: Add helper to access main VSI
> i40e: Consolidate checks whether given VSI is main
> i40e: Add helper to access main VEB
> i40e: Add and use helper to reconfigure TC for given VSI
>
> drivers/net/ethernet/intel/i40e/i40e.h | 29 ++-
> drivers/net/ethernet/intel/i40e/i40e_client.c | 28 +--
> drivers/net/ethernet/intel/i40e/i40e_ddp.c | 3 +-
> .../net/ethernet/intel/i40e/i40e_debugfs.c | 36 ++--
> .../net/ethernet/intel/i40e/i40e_ethtool.c | 29 ++-
> drivers/net/ethernet/intel/i40e/i40e_main.c | 199 ++++++++++--------
> drivers/net/ethernet/intel/i40e/i40e_ptp.c | 6 +-
> drivers/net/ethernet/intel/i40e/i40e_txrx.c | 16 +-
> drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +-
> .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 14 +-
> 10 files changed, 210 insertions(+), 152 deletions(-)

Series looks OK to me.
Reviewed-by: Michal Schmidt <[email protected]>


2024-03-19 10:17:41

by Paolo Abeni

[permalink] [raw]
Subject: Re: [PATCH iwl-next 5/7] i40e: Consolidate checks whether given VSI is main

On Mon, 2024-03-18 at 15:30 +0100, Ivan Vecera wrote:
> In the driver code there are 3 types of checks whether given
> VSI is main or not:
> 1. vsi->type ==/!= I40E_VSI_MAIN
> 2. vsi ==/!= pf->vsi[pf->lan_vsi]
> 3. vsi->seid ==/!= pf->vsi[pf->lan_vsi]->seid
>
> All of them are equivalent and can be consolidated. Convert cases
> 2 and 3 to case 1.

Minor nit: while at it, what about introducing an helper for such
check?

Reordering the patches you could use it also in i40e_pf_get_main_vsi()

Cheers,

Paolo


2024-03-21 09:33:43

by Ivan Vecera

[permalink] [raw]
Subject: Re: [PATCH iwl-next 5/7] i40e: Consolidate checks whether given VSI is main



On 19. 03. 24 11:17, Paolo Abeni wrote:
> On Mon, 2024-03-18 at 15:30 +0100, Ivan Vecera wrote:
>> In the driver code there are 3 types of checks whether given
>> VSI is main or not:
>> 1. vsi->type ==/!= I40E_VSI_MAIN
>> 2. vsi ==/!= pf->vsi[pf->lan_vsi]
>> 3. vsi->seid ==/!= pf->vsi[pf->lan_vsi]->seid
>>
>> All of them are equivalent and can be consolidated. Convert cases
>> 2 and 3 to case 1.
>
> Minor nit: while at it, what about introducing an helper for such
> check?
> Reordering the patches you could use it also in i40e_pf_get_main_vsi()

No, I couldn't, that helper does not check vsi->type value:

/**
* i40e_pf_get_main_vsi - get pointer to main VSI
* @pf: pointer to a PF
*
* Return pointer to main VSI or NULL if it does not exist
**/
static inline struct i40e_vsi *i40e_pf_get_main_vsi(struct i40e_pf *pf)
{
return (pf->lan_vsi != I40E_NO_VSI) ? pf->vsi[pf->lan_vsi] : NULL;
}

I had an idea with helper like:
static inline bool i40e_is_main_vsi(struct i40e_vsi *vsi)
{
struct i40e_pf *pf = vsi->back;
return (pf->vsi[pf->lan_vsi] == vsi);
}

but I think that `vsi->type == I40E_VSI_MAIN` is simple enough.

Thanks,
Ivan


2024-03-26 16:02:59

by Loktionov, Aleksandr

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH iwl-next 2/7] i40e: Change argument of several client notification functions



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On
> Behalf Of Ivan Vecera
> Sent: Monday, March 18, 2024 3:31 PM
> To: [email protected]
> Cc: open list:NETWORKING DRIVERS <[email protected]>; open
> list <[email protected]>; Eric Dumazet
> <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Jakub Kicinski <[email protected]>;
> Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 2/7] i40e: Change
> argument of several client notification functions
>
Can you rename the title of the commit change -> refactor?
To make it obvious that there is no functionality change, just refactor?


> Commit 0ef2d5afb12d ("i40e: KISS the client interface") simplified
> the client interface so in practice it supports only one client per
> i40e netdev. But we have still 2 notification functions that uses
> as parameter a pointer to VSI of netdevice associated with the
> client. After the mentioned commit only possible and used VSI is
> the main (LAN) VSI.
> So change these functions so they are called with PF pointer
> argument and the associated VSI (LAN) is taken inside them.
>
> Signed-off-by: Ivan Vecera <[email protected]>
> ---
> drivers/net/ethernet/intel/i40e/i40e.h | 4 ++--
> drivers/net/ethernet/intel/i40e/i40e_client.c | 20 +++++++++------
> ----
> drivers/net/ethernet/intel/i40e/i40e_main.c | 12 +++++------
> 3 files changed, 17 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
> b/drivers/net/ethernet/intel/i40e/i40e.h
> index 5248e78f7849..0792c7324527 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -1236,8 +1236,8 @@ static inline void i40e_dbg_exit(void) {}
> int i40e_lan_add_device(struct i40e_pf *pf); int
> i40e_lan_del_device(struct i40e_pf *pf); void
> i40e_client_subtask(struct i40e_pf *pf); -void
> i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi); -void
> i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool
> reset);
> +void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf);
> void
> +i40e_notify_client_of_netdev_close(struct i40e_pf *pf, bool
> reset);
> void i40e_notify_client_of_vf_enable(struct i40e_pf *pf, u32
> num_vfs); void i40e_notify_client_of_vf_reset(struct i40e_pf *pf,
> u32 vf_id); void i40e_client_update_msix_info(struct i40e_pf *pf);
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c
> b/drivers/net/ethernet/intel/i40e/i40e_client.c
> index b32071ee84af..93e52138826e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_client.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
> @@ -101,25 +101,26 @@ i40e_notify_client_of_vf_msg(struct i40e_vsi
> *vsi, u32 vf_id, u8 *msg, u16 len)
>
> /**
> * i40e_notify_client_of_l2_param_changes - call the client notify
> callback
> - * @vsi: the VSI with l2 param changes
> + * @pf: PF device pointer
> *
> - * If there is a client to this VSI, call the client
> + * If there is a client, call its callback
> **/
> -void i40e_notify_client_of_l2_param_changes(struct i40e_vsi *vsi)
> +void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf)
> {
> - struct i40e_pf *pf = vsi->back;
> struct i40e_client_instance *cdev = pf->cinst;
> + struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> struct i40e_params params;
>
> if (!cdev || !cdev->client)
> return;
> if (!cdev->client->ops || !cdev->client->ops-
> >l2_param_change) {
> - dev_dbg(&vsi->back->pdev->dev,
> + dev_dbg(&pf->pdev->dev,
> "Cannot locate client instance l2_param_change
> routine\n");
> return;
> }
> if (!test_bit(__I40E_CLIENT_INSTANCE_OPENED, &cdev->state)) {
> - dev_dbg(&vsi->back->pdev->dev, "Client is not open,
> abort l2 param change\n");
> + dev_dbg(&pf->pdev->dev,
> + "Client is not open, abort l2 param change\n");
> return;
> }
> memset(&params, 0, sizeof(params));
> @@ -157,20 +158,19 @@ static void i40e_client_release_qvlist(struct
> i40e_info *ldev)
>
> /**
> * i40e_notify_client_of_netdev_close - call the client close
> callback
> - * @vsi: the VSI with netdev closed
> + * @pf: PF device pointer
> * @reset: true when close called due to a reset pending
> *
> * If there is a client to this netdev, call the client with close
> **/
> -void i40e_notify_client_of_netdev_close(struct i40e_vsi *vsi, bool
> reset)
> +void i40e_notify_client_of_netdev_close(struct i40e_pf *pf, bool
> reset)
> {
> - struct i40e_pf *pf = vsi->back;
> struct i40e_client_instance *cdev = pf->cinst;
>
> if (!cdev || !cdev->client)
> return;
> if (!cdev->client->ops || !cdev->client->ops->close) {
> - dev_dbg(&vsi->back->pdev->dev,
> + dev_dbg(&pf->pdev->dev,
> "Cannot locate client instance close routine\n");
> return;
> }
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 2f1604ae78c7..7fed7fb69d4e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -11283,14 +11283,12 @@ static void i40e_service_task(struct
> work_struct *work)
> i40e_fdir_reinit_subtask(pf);
> if (test_and_clear_bit(__I40E_CLIENT_RESET, pf->state))
> {
> /* Client subtask will reopen next time through.
> */
> - i40e_notify_client_of_netdev_close(pf->vsi[pf-
> >lan_vsi],
> - true);
> + i40e_notify_client_of_netdev_close(pf, true);
> } else {
> i40e_client_subtask(pf);
> if (test_and_clear_bit(__I40E_CLIENT_L2_CHANGE,
> pf->state))
> - i40e_notify_client_of_l2_param_changes(
> - pf->vsi[pf-
> >lan_vsi]);
> + i40e_notify_client_of_l2_param_changes(pf);
> }
> i40e_sync_filters_subtask(pf);
> } else {
> @@ -16228,7 +16226,7 @@ static void i40e_remove(struct pci_dev
> *pdev)
> /* Client close must be called explicitly here because the
> timer
> * has been stopped.
> */
> - i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi],
> false);
> + i40e_notify_client_of_netdev_close(pf, false);
>
> i40e_fdir_teardown(pf);
>
> @@ -16487,7 +16485,7 @@ static void i40e_shutdown(struct pci_dev
> *pdev)
> /* Client close must be called explicitly here because the
> timer
> * has been stopped.
> */
> - i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi],
> false);
> + i40e_notify_client_of_netdev_close(pf, false);
>
> if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps)
> &&
> pf->wol_en)
> @@ -16541,7 +16539,7 @@ static int i40e_suspend(struct device *dev)
> /* Client close must be called explicitly here because the
> timer
> * has been stopped.
> */
> - i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi],
> false);
> + i40e_notify_client_of_netdev_close(pf, false);
>
> if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps)
> &&
> pf->wol_en)
> --
> 2.43.0


2024-03-26 16:05:32

by Loktionov, Aleksandr

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH iwl-next 1/7] i40e: Remove flags field from i40e_veb



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On
> Behalf Of Ivan Vecera
> Sent: Monday, March 18, 2024 3:31 PM
> To: [email protected]
> Cc: open list:NETWORKING DRIVERS <[email protected]>; open
> list <[email protected]>; Eric Dumazet
> <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Jakub Kicinski <[email protected]>;
> Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 1/7] i40e: Remove flags
> field from i40e_veb
>
> The field is initialized always to zero and it is never read.
> Remove it.
>
> Signed-off-by: Ivan Vecera <[email protected]>
> ---
Reviewed-by: Aleksandr Loktionov <[email protected]>

> drivers/net/ethernet/intel/i40e/i40e.h | 3 +--
> drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +-
> drivers/net/ethernet/intel/i40e/i40e_main.c | 13 +++++--------
> 3 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
> b/drivers/net/ethernet/intel/i40e/i40e.h
> index 2fbabcdb5bb5..5248e78f7849 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -788,7 +788,6 @@ struct i40e_veb {
> u16 stats_idx; /* index of VEB parent */
> u8 enabled_tc;
> u16 bridge_mode; /* Bridge Mode (VEB/VEPA) */
> - u16 flags;
> u16 bw_limit;
> u8 bw_max_quanta;
> bool is_abs_credits;
> @@ -1213,7 +1212,7 @@ void i40e_vsi_stop_rings(struct i40e_vsi
> *vsi); void i40e_vsi_stop_rings_no_wait(struct i40e_vsi *vsi);
> int i40e_vsi_wait_queues_disabled(struct i40e_vsi *vsi); int
> i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count); -
> struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, u16
> uplink_seid,
> +struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16
> uplink_seid,
> u16 downlink_seid, u8 enabled_tc);
> void i40e_veb_release(struct i40e_veb *veb);
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> index f9ba45f596c9..6147c5f128e8 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> @@ -867,7 +867,7 @@ static ssize_t i40e_dbg_command_write(struct
> file *filp,
> goto command_write_done;
> }
>
> - veb = i40e_veb_setup(pf, 0, uplink_seid, vsi_seid,
> enabled_tc);
> + veb = i40e_veb_setup(pf, uplink_seid, vsi_seid,
> enabled_tc);
> if (veb)
> dev_info(&pf->pdev->dev, "added relay %d\n", veb-
> >seid);
> else
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 663b2237eb4e..2f1604ae78c7 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -13138,7 +13138,7 @@ static int i40e_ndo_bridge_setlink(struct
> net_device *dev,
>
> /* Insert a new HW bridge */
> if (!veb) {
> - veb = i40e_veb_setup(pf, 0, vsi->uplink_seid,
> vsi->seid,
> + veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi-
> >seid,
> vsi->tc_config.enabled_tc);
> if (veb) {
> veb->bridge_mode = mode;
> @@ -14394,10 +14394,10 @@ struct i40e_vsi *i40e_vsi_setup(struct
> i40e_pf *pf, u8 type,
> }
>
> if (vsi->uplink_seid == pf->mac_seid)
> - veb = i40e_veb_setup(pf, 0, pf->mac_seid, vsi-
> >seid,
> + veb = i40e_veb_setup(pf, pf->mac_seid, vsi->seid,
> vsi->tc_config.enabled_tc);
> else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0)
> - veb = i40e_veb_setup(pf, 0, vsi->uplink_seid,
> vsi->seid,
> + veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi-
> >seid,
> vsi->tc_config.enabled_tc);
> if (veb) {
> if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) { @@
> -14791,7 +14791,6 @@ static int i40e_add_veb(struct i40e_veb *veb,
> struct i40e_vsi *vsi)
> /**
> * i40e_veb_setup - Set up a VEB
> * @pf: board private structure
> - * @flags: VEB setup flags
> * @uplink_seid: the switch element to link to
> * @vsi_seid: the initial VSI seid
> * @enabled_tc: Enabled TC bit-map
> @@ -14804,9 +14803,8 @@ static int i40e_add_veb(struct i40e_veb
> *veb, struct i40e_vsi *vsi)
> * Returns pointer to the successfully allocated VEB sw struct on
> * success, otherwise returns NULL on failure.
> **/
> -struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags,
> - u16 uplink_seid, u16 vsi_seid,
> - u8 enabled_tc)
> +struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16
> uplink_seid,
> + u16 vsi_seid, u8 enabled_tc)
> {
> struct i40e_vsi *vsi = NULL;
> struct i40e_veb *veb;
> @@ -14837,7 +14835,6 @@ struct i40e_veb *i40e_veb_setup(struct
> i40e_pf *pf, u16 flags,
> if (veb_idx < 0)
> goto err_alloc;
> veb = pf->veb[veb_idx];
> - veb->flags = flags;
> veb->uplink_seid = uplink_seid;
> veb->enabled_tc = (enabled_tc ? enabled_tc : 0x1);
>
> --
> 2.43.0


2024-03-26 17:16:49

by Loktionov, Aleksandr

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH iwl-next 3/7] i40e: Change argument of i40e_detect_recover_hung()



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On
> Behalf Of Ivan Vecera
> Sent: Monday, March 18, 2024 3:31 PM
> To: [email protected]
> Cc: open list:NETWORKING DRIVERS <[email protected]>; open
> list <[email protected]>; Eric Dumazet
> <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Jakub Kicinski <[email protected]>;
> Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 3/7] i40e: Change
> argument of i40e_detect_recover_hung()
>
Please change title into Change -> refactor to make it obvious you don't change any functionality, but just refactor.

> Commit 07d44190a389 ("i40e/i40evf: Detect and recover hung queue
> scenario") changes i40e_detect_recover_hung() argument type from
> i40e_pf* to i40e_vsi* to be shareable by both i40e and i40evf.
> Because the i40evf does not exist anymore and the function is
> exclusively used by i40e we can revert this change.
>
> Signed-off-by: Ivan Vecera <[email protected]>
> ---
> drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +-
> drivers/net/ethernet/intel/i40e/i40e_txrx.c | 10 ++++++----
> drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 +-
> 3 files changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 7fed7fb69d4e..1ba28893f49e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -11274,7 +11274,7 @@ static void i40e_service_task(struct
> work_struct *work)
> return;
>
> if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) {
> - i40e_detect_recover_hung(pf->vsi[pf->lan_vsi]);
> + i40e_detect_recover_hung(pf);
> i40e_sync_filters_subtask(pf);
> i40e_reset_subtask(pf);
> i40e_handle_mdd_event(pf);
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> index 1a12b732818e..e35a08de16b2 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> @@ -860,13 +860,15 @@ u32 i40e_get_tx_pending(struct i40e_ring
> *ring, bool in_sw)
>
> /**
> * i40e_detect_recover_hung - Function to detect and recover
> hung_queues
> - * @vsi: pointer to vsi struct with tx queues
> + * @pf: pointer to PF struct
> *
> - * VSI has netdev and netdev has TX queues. This function is to
> check each of
> - * those TX queues if they are hung, trigger recovery by issuing
> SW interrupt.
> + * LAN VSI has netdev and netdev has TX queues. This function is
> to
> + check
> + * each of those TX queues if they are hung, trigger recovery by
> + issuing
> + * SW interrupt.
> **/
> -void i40e_detect_recover_hung(struct i40e_vsi *vsi)
> +void i40e_detect_recover_hung(struct i40e_pf *pf)
> {
> + struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> struct i40e_ring *tx_ring = NULL;
> struct net_device *netdev;
> unsigned int i;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> index 2cdc7de6301c..7c26c9a2bf65 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.h
> @@ -470,7 +470,7 @@ void i40e_free_rx_resources(struct i40e_ring
> *rx_ring); int i40e_napi_poll(struct napi_struct *napi, int
> budget); void i40e_force_wb(struct i40e_vsi *vsi, struct
> i40e_q_vector *q_vector);
> u32 i40e_get_tx_pending(struct i40e_ring *ring, bool in_sw); -void
> i40e_detect_recover_hung(struct i40e_vsi *vsi);
> +void i40e_detect_recover_hung(struct i40e_pf *pf);
> int __i40e_maybe_stop_tx(struct i40e_ring *tx_ring, int size);
> bool __i40e_chk_linearize(struct sk_buff *skb); int
> i40e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame
> **frames,
> --
> 2.43.0


2024-03-26 20:08:39

by Kalesh Anakkur Purayil

[permalink] [raw]
Subject: Re: [PATCH iwl-next 1/7] i40e: Remove flags field from i40e_veb

On Mon, Mar 18, 2024 at 8:01 PM Ivan Vecera <[email protected]> wrote:
>
> The field is initialized always to zero and it is never read.
> Remove it.
>
> Signed-off-by: Ivan Vecera <[email protected]>
> ---
LGTM
Reviewed-by: Kalesh AP <[email protected]>

> drivers/net/ethernet/intel/i40e/i40e.h | 3 +--
> drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 2 +-
> drivers/net/ethernet/intel/i40e/i40e_main.c | 13 +++++--------
> 3 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h
> index 2fbabcdb5bb5..5248e78f7849 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -788,7 +788,6 @@ struct i40e_veb {
> u16 stats_idx; /* index of VEB parent */
> u8 enabled_tc;
> u16 bridge_mode; /* Bridge Mode (VEB/VEPA) */
> - u16 flags;
> u16 bw_limit;
> u8 bw_max_quanta;
> bool is_abs_credits;
> @@ -1213,7 +1212,7 @@ void i40e_vsi_stop_rings(struct i40e_vsi *vsi);
> void i40e_vsi_stop_rings_no_wait(struct i40e_vsi *vsi);
> int i40e_vsi_wait_queues_disabled(struct i40e_vsi *vsi);
> int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count);
> -struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, u16 uplink_seid,
> +struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 uplink_seid,
> u16 downlink_seid, u8 enabled_tc);
> void i40e_veb_release(struct i40e_veb *veb);
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> index f9ba45f596c9..6147c5f128e8 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> @@ -867,7 +867,7 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
> goto command_write_done;
> }
>
> - veb = i40e_veb_setup(pf, 0, uplink_seid, vsi_seid, enabled_tc);
> + veb = i40e_veb_setup(pf, uplink_seid, vsi_seid, enabled_tc);
> if (veb)
> dev_info(&pf->pdev->dev, "added relay %d\n", veb->seid);
> else
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 663b2237eb4e..2f1604ae78c7 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -13138,7 +13138,7 @@ static int i40e_ndo_bridge_setlink(struct net_device *dev,
>
> /* Insert a new HW bridge */
> if (!veb) {
> - veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
> + veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid,
> vsi->tc_config.enabled_tc);
> if (veb) {
> veb->bridge_mode = mode;
> @@ -14394,10 +14394,10 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
> }
>
> if (vsi->uplink_seid == pf->mac_seid)
> - veb = i40e_veb_setup(pf, 0, pf->mac_seid, vsi->seid,
> + veb = i40e_veb_setup(pf, pf->mac_seid, vsi->seid,
> vsi->tc_config.enabled_tc);
> else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0)
> - veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid,
> + veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid,
> vsi->tc_config.enabled_tc);
> if (veb) {
> if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) {
> @@ -14791,7 +14791,6 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
> /**
> * i40e_veb_setup - Set up a VEB
> * @pf: board private structure
> - * @flags: VEB setup flags
> * @uplink_seid: the switch element to link to
> * @vsi_seid: the initial VSI seid
> * @enabled_tc: Enabled TC bit-map
> @@ -14804,9 +14803,8 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)
> * Returns pointer to the successfully allocated VEB sw struct on
> * success, otherwise returns NULL on failure.
> **/
> -struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags,
> - u16 uplink_seid, u16 vsi_seid,
> - u8 enabled_tc)
> +struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 uplink_seid,
> + u16 vsi_seid, u8 enabled_tc)
> {
> struct i40e_vsi *vsi = NULL;
> struct i40e_veb *veb;
> @@ -14837,7 +14835,6 @@ struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags,
> if (veb_idx < 0)
> goto err_alloc;
> veb = pf->veb[veb_idx];
> - veb->flags = flags;
> veb->uplink_seid = uplink_seid;
> veb->enabled_tc = (enabled_tc ? enabled_tc : 0x1);
>
> --
> 2.43.0
>
>


--
Regards,
Kalesh A P


Attachments:
smime.p7s (4.14 kB)
S/MIME Cryptographic Signature

2024-03-26 20:19:54

by Loktionov, Aleksandr

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH iwl-next 6/7] i40e: Add helper to access main VEB



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On
> Behalf Of Ivan Vecera
> Sent: Monday, March 18, 2024 3:31 PM
> To: [email protected]
> Cc: open list:NETWORKING DRIVERS <[email protected]>; open
> list <[email protected]>; Eric Dumazet
> <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Jakub Kicinski <[email protected]>;
> Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 6/7] i40e: Add helper to
> access main VEB
>
> Add a helper to access main VEB:
>
> i40e_pf_get_main_veb(pf) replaces 'pf->veb[pf->lan_veb]'
>
> Signed-off-by: Ivan Vecera <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>

> ---
> drivers/net/ethernet/intel/i40e/i40e.h | 11 ++++++++
> .../net/ethernet/intel/i40e/i40e_ethtool.c | 9 +++----
> drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++++++++++---
> ----
> 3 files changed, 31 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
> b/drivers/net/ethernet/intel/i40e/i40e.h
> index fb0b913692e1..2f135db416cf 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -1401,4 +1401,15 @@ i40e_pf_get_veb_by_seid(struct i40e_pf *pf,
> u16 seid)
> return NULL;
> }
>
> +/**
> + * i40e_pf_get_main_veb - get pointer to main VEB
> + * @pf: pointer to a PF
> + *
> + * Return pointer to main VEB or NULL if it does not exist **/
> static
> +inline struct i40e_veb *i40e_pf_get_main_veb(struct i40e_pf *pf) {
> + return (pf->lan_veb != I40E_NO_VEB) ? pf->veb[pf->lan_veb] :
> NULL; }
> +
> #endif /* _I40E_H_ */
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 5cd0d1b45f01..4e28785c9fb2 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -2425,14 +2425,11 @@ static void i40e_get_ethtool_stats(struct
> net_device *netdev,
> if (vsi->type != I40E_VSI_MAIN || pf->hw.partition_id != 1)
> goto check_data_pointer;
>
> - veb_stats = ((pf->lan_veb != I40E_NO_VEB) &&
> - (pf->lan_veb < I40E_MAX_VEB) &&
> - test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags));
> + veb = i40e_pf_get_main_veb(pf);
> + veb_stats = veb && test_bit(I40E_FLAG_VEB_STATS_ENA, pf-
> >flags);
>
> - if (veb_stats) {
> - veb = pf->veb[pf->lan_veb];
> + if (veb_stats)
> i40e_update_veb_stats(veb);
> - }
>
> /* If veb stats aren't enabled, pass NULL instead of the veb
> so that
> * we initialize stats to zero and update the data pointer
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index d6dbd0fd79eb..2e1955064abb 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -2480,7 +2480,7 @@ static int i40e_set_promiscuous(struct
> i40e_pf *pf, bool promisc)
> int aq_ret;
>
> if (vsi->type == I40E_VSI_MAIN &&
> - pf->lan_veb != I40E_NO_VEB &&
> + i40e_pf_get_main_veb(pf) &&
> !test_bit(I40E_FLAG_MFP_ENA, pf->flags)) {
> /* set defport ON for Main VSI instead of true promisc
> * this way we will get all unicast/multicast and VLAN
> @@ -9916,6 +9916,7 @@ static void i40e_veb_link_event(struct
> i40e_veb *veb, bool link_up) static void i40e_link_event(struct
> i40e_pf *pf) {
> struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> + struct i40e_veb *veb = i40e_pf_get_main_veb(pf);
> u8 new_link_speed, old_link_speed;
> bool new_link, old_link;
> int status;
> @@ -9955,8 +9956,8 @@ static void i40e_link_event(struct i40e_pf
> *pf)
> /* Notify the base of the switch tree connected to
> * the link. Floating VEBs are not notified.
> */
> - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])
> - i40e_veb_link_event(pf->veb[pf->lan_veb], new_link);
> + if (veb)
> + i40e_veb_link_event(veb, new_link);
> else
> i40e_vsi_link_event(vsi, new_link);
>
> @@ -14892,7 +14893,8 @@ static void
> i40e_setup_pf_switch_element(struct i40e_pf *pf,
> /* Main VEB? */
> if (uplink_seid != pf->mac_seid)
> break;
> - if (pf->lan_veb >= I40E_MAX_VEB) {
> + veb = i40e_pf_get_main_veb(pf);
> + if (!veb) {
> int v;
>
> /* find existing or else empty VEB */ @@ -
> 14906,12 +14908,15 @@ static void
> i40e_setup_pf_switch_element(struct i40e_pf *pf,
> pf->lan_veb = v;
> }
> }
> - if (pf->lan_veb >= I40E_MAX_VEB)
> +
> + /* Try to get again main VEB as pf->lan_veb may have
> changed */
> + veb = i40e_pf_get_main_veb(pf);
> + if (!veb)
> break;
>
> - pf->veb[pf->lan_veb]->seid = seid;
> - pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid;
> - pf->veb[pf->lan_veb]->pf = pf;
> + veb->seid = seid;
> + veb->uplink_seid = pf->mac_seid;
> + veb->pf = pf;
> break;
> case I40E_SWITCH_ELEMENT_TYPE_VSI:
> if (num_reported != 1)
> @@ -15056,13 +15061,15 @@ static int i40e_setup_pf_switch(struct
> i40e_pf *pf, bool reinit, bool lock_acqui
> /* first time setup */
> main_vsi = i40e_pf_get_main_vsi(pf);
> if (!main_vsi || reinit) {
> + struct i40e_veb *veb;
> u16 uplink_seid;
>
> /* Set up the PF VSI associated with the PF's main VSI
> * that is already in the HW switch
> */
> - if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb])
> - uplink_seid = pf->veb[pf->lan_veb]->seid;
> + veb = i40e_pf_get_main_veb(pf);
> + if (veb)
> + uplink_seid = veb->seid;
> else
> uplink_seid = pf->mac_seid;
> if (!main_vsi)
> --
> 2.43.0


2024-03-27 10:52:05

by Loktionov, Aleksandr

[permalink] [raw]
Subject: RE: [Intel-wired-lan] [PATCH iwl-next 4/7] i40e: Add helper to access main VSI



> -----Original Message-----
> From: Intel-wired-lan <[email protected]> On
> Behalf Of Ivan Vecera
> Sent: Monday, March 18, 2024 3:31 PM
> To: [email protected]
> Cc: open list:NETWORKING DRIVERS <[email protected]>; Richard
> Cochran <[email protected]>; open list <linux-
> [email protected]>; Eric Dumazet <[email protected]>;
> Nguyen, Anthony L <[email protected]>; Jakub Kicinski
> <[email protected]>; Paolo Abeni <[email protected]>; David S. Miller
> <[email protected]>
> Subject: [Intel-wired-lan] [PATCH iwl-next 4/7] i40e: Add helper to
> access main VSI
>
> Add simple helper i40e_pf_get_main_vsi(pf) to access main VSI that
> replaces pattern 'pf->vsi[pf->lan_vsi]'
>
> Signed-off-by: Ivan Vecera <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
> ---
> drivers/net/ethernet/intel/i40e/i40e.h | 11 ++
> drivers/net/ethernet/intel/i40e/i40e_client.c | 10 +-
> drivers/net/ethernet/intel/i40e/i40e_ddp.c | 3 +-
> .../net/ethernet/intel/i40e/i40e_debugfs.c | 32 +++---
> .../net/ethernet/intel/i40e/i40e_ethtool.c | 8 +-
> drivers/net/ethernet/intel/i40e/i40e_main.c | 107 ++++++++++----
> ----
> drivers/net/ethernet/intel/i40e/i40e_ptp.c | 6 +-
> drivers/net/ethernet/intel/i40e/i40e_txrx.c | 8 +-
> .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 14 ++-
> 9 files changed, 116 insertions(+), 83 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/i40e/i40e.h
> b/drivers/net/ethernet/intel/i40e/i40e.h
> index 0792c7324527..fb0b913692e1 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e.h
> +++ b/drivers/net/ethernet/intel/i40e/i40e.h
> @@ -1372,6 +1372,17 @@ i40e_pf_get_vsi_by_seid(struct i40e_pf *pf,
> u16 seid)
> return NULL;
> }
>
> +/**
> + * i40e_pf_get_main_vsi - get pointer to main VSI
> + * @pf: pointer to a PF
> + *
> + * Return pointer to main VSI or NULL if it does not exist **/
> static
> +inline struct i40e_vsi *i40e_pf_get_main_vsi(struct i40e_pf *pf) {
> + return (pf->lan_vsi != I40E_NO_VSI) ? pf->vsi[pf->lan_vsi] :
> NULL; }
> +
> /**
> * i40e_pf_get_veb_by_seid - find VEB by SEID
> * @pf: pointer to a PF
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_client.c
> b/drivers/net/ethernet/intel/i40e/i40e_client.c
> index 93e52138826e..59263551c383 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_client.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_client.c
> @@ -107,8 +107,8 @@ i40e_notify_client_of_vf_msg(struct i40e_vsi
> *vsi, u32 vf_id, u8 *msg, u16 len)
> **/
> void i40e_notify_client_of_l2_param_changes(struct i40e_pf *pf) {
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_client_instance *cdev = pf->cinst;
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> struct i40e_params params;
>
> if (!cdev || !cdev->client)
> @@ -333,9 +333,9 @@ static int i40e_register_auxiliary_dev(struct
> i40e_info *ldev, const char *name)
> **/
> static void i40e_client_add_instance(struct i40e_pf *pf) {
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_client_instance *cdev = NULL;
> struct netdev_hw_addr *mac = NULL;
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
>
> cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
> if (!cdev)
> @@ -399,9 +399,9 @@ void i40e_client_del_instance(struct i40e_pf
> *pf)
> **/
> void i40e_client_subtask(struct i40e_pf *pf) {
> - struct i40e_client *client;
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_client_instance *cdev;
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_client *client;
> int ret = 0;
>
> if (!test_and_clear_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf-
> >state)) @@ -665,8 +665,8 @@ static int
> i40e_client_update_vsi_ctxt(struct i40e_info *ldev,
> bool is_vf, u32 vf_id,
> u32 flag, u32 valid_flag)
> {
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(ldev->pf);
> struct i40e_pf *pf = ldev->pf;
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> struct i40e_vsi_context ctxt;
> bool update = true;
> int err;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_ddp.c
> b/drivers/net/ethernet/intel/i40e/i40e_ddp.c
> index 2f53f0f53bc3..daa9f2c42f70 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ddp.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ddp.c
> @@ -407,8 +407,9 @@ static int i40e_ddp_load(struct net_device
> *netdev, const u8 *data, size_t size,
> **/
> static int i40e_ddp_restore(struct i40e_pf *pf) {
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> + struct net_device *netdev = vsi->netdev;
> struct i40e_ddp_old_profile_list *entry;
> - struct net_device *netdev = pf->vsi[pf->lan_vsi]->netdev;
> int status = 0;
>
> if (!list_empty(&pf->ddp_old_prof)) {
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> index 6147c5f128e8..09db46de2994 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c
> @@ -53,6 +53,7 @@ static ssize_t i40e_dbg_command_read(struct file
> *filp, char __user *buffer,
> size_t count, loff_t *ppos)
> {
> struct i40e_pf *pf = filp->private_data;
> + struct i40e_vsi *main_vsi;
> int bytes_not_copied;
> int buf_size = 256;
> char *buf;
> @@ -68,8 +69,8 @@ static ssize_t i40e_dbg_command_read(struct file
> *filp, char __user *buffer,
> if (!buf)
> return -ENOSPC;
>
> - len = snprintf(buf, buf_size, "%s: %s\n",
> - pf->vsi[pf->lan_vsi]->netdev->name,
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + len = snprintf(buf, buf_size, "%s: %s\n", main_vsi->netdev-
> >name,
> i40e_dbg_command_buf);
>
> bytes_not_copied = copy_to_user(buffer, buf, len); @@ -786,7
> +787,8 @@ static ssize_t i40e_dbg_command_write(struct file *filp,
> cnt = sscanf(&cmd_buf[7], "%i", &vsi_seid);
> if (cnt == 0) {
> /* default to PF VSI */
> - vsi_seid = pf->vsi[pf->lan_vsi]->seid;
> + vsi = i40e_pf_get_main_vsi(pf);
> + vsi_seid = vsi->seid;
> } else if (vsi_seid < 0) {
> dev_info(&pf->pdev->dev, "add VSI %d: bad vsi
> seid\n",
> vsi_seid);
> @@ -1030,7 +1032,7 @@ static ssize_t i40e_dbg_command_write(struct
> file *filp,
> goto command_write_done;
> }
>
> - vsi = pf->vsi[pf->lan_vsi];
> + vsi = i40e_pf_get_main_vsi(pf);
> switch_id =
> le16_to_cpu(vsi->info.switch_id) &
> I40E_AQ_VSI_SW_ID_MASK;
> @@ -1380,6 +1382,9 @@ static ssize_t i40e_dbg_command_write(struct
> file *filp,
> dev_info(&pf->pdev->dev, "FD current total filter count
> for this interface: %d\n",
> i40e_get_current_fd_count(pf));
> } else if (strncmp(cmd_buf, "lldp", 4) == 0) {
> + /* Get main VSI */
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> +
> if (strncmp(&cmd_buf[5], "stop", 4) == 0) {
> int ret;
>
> @@ -1391,10 +1396,9 @@ static ssize_t i40e_dbg_command_write(struct
> file *filp,
> goto command_write_done;
> }
> ret = i40e_aq_add_rem_control_packet_filter(&pf-
> >hw,
> - pf->hw.mac.addr,
> - ETH_P_LLDP, 0,
> - pf->vsi[pf->lan_vsi]->seid,
> - 0, true, NULL, NULL);
> + pf->hw.mac.addr, ETH_P_LLDP, 0,
> + main_vsi->seid, 0, true, NULL,
> + NULL);
> if (ret) {
> dev_info(&pf->pdev->dev,
> "%s: Add Control Packet Filter AQ
> command failed =0x%x\n", @@ -1409,10 +1413,9 @@ static ssize_t
> i40e_dbg_command_write(struct file *filp,
> int ret;
>
> ret = i40e_aq_add_rem_control_packet_filter(&pf-
> >hw,
> - pf->hw.mac.addr,
> - ETH_P_LLDP, 0,
> - pf->vsi[pf->lan_vsi]->seid,
> - 0, false, NULL, NULL);
> + pf->hw.mac.addr, ETH_P_LLDP, 0,
> + main_vsi->seid, 0, false, NULL,
> + NULL);
> if (ret) {
> dev_info(&pf->pdev->dev,
> "%s: Remove Control Packet Filter AQ
> command failed =0x%x\n", @@ -1639,6 +1642,7 @@ static ssize_t
> i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
> size_t count, loff_t *ppos)
> {
> struct i40e_pf *pf = filp->private_data;
> + struct i40e_vsi *main_vsi;
> int bytes_not_copied;
> int buf_size = 256;
> char *buf;
> @@ -1654,8 +1658,8 @@ static ssize_t
> i40e_dbg_netdev_ops_read(struct file *filp, char __user *buffer,
> if (!buf)
> return -ENOSPC;
>
> - len = snprintf(buf, buf_size, "%s: %s\n",
> - pf->vsi[pf->lan_vsi]->netdev->name,
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + len = snprintf(buf, buf_size, "%s: %s\n", main_vsi->netdev-
> >name,
> i40e_dbg_netdev_ops_buf);
>
> bytes_not_copied = copy_to_user(buffer, buf, len); diff --git
> a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> index 42e7e6cdaa6d..0905c1fb2337 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
> @@ -2029,7 +2029,7 @@ static void i40e_get_ringparam(struct
> net_device *netdev, {
> struct i40e_netdev_priv *np = netdev_priv(netdev);
> struct i40e_pf *pf = np->vsi->back;
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
>
> ring->rx_max_pending = i40e_get_max_num_descriptors(pf);
> ring->tx_max_pending = i40e_get_max_num_descriptors(pf); @@ -
> 3370,6 +3370,7 @@ static int i40e_get_ethtool_fdir_entry(struct
> i40e_pf *pf,
> struct i40e_rx_flow_userdef userdef = {0};
> struct i40e_fdir_filter *rule = NULL;
> struct hlist_node *node2;
> + struct i40e_vsi *vsi;
> u64 input_set;
> u16 index;
>
> @@ -3493,9 +3494,8 @@ static int i40e_get_ethtool_fdir_entry(struct
> i40e_pf *pf,
> fsp->flow_type |= FLOW_EXT;
> }
>
> - if (rule->dest_vsi != pf->vsi[pf->lan_vsi]->id) {
> - struct i40e_vsi *vsi;
> -
> + vsi = i40e_pf_get_main_vsi(pf);
> + if (rule->dest_vsi != vsi->id) {
> vsi = i40e_find_vsi_from_id(pf, rule->dest_vsi);
> if (vsi && vsi->type == I40E_VSI_SRIOV) {
> /* VFs are zero-indexed by the driver, but
> ethtool diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c
> b/drivers/net/ethernet/intel/i40e/i40e_main.c
> index 1ba28893f49e..86bc3fc0579b 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_main.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
> @@ -2475,7 +2475,7 @@ i40e_aqc_broadcast_filter(struct i40e_vsi
> *vsi, const char *vsi_name,
> **/
> static int i40e_set_promiscuous(struct i40e_pf *pf, bool promisc)
> {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_hw *hw = &pf->hw;
> int aq_ret;
>
> @@ -4330,7 +4330,7 @@ static irqreturn_t i40e_intr(int irq, void
> *data)
>
> /* only q0 is used in MSI/Legacy mode, and none are used in
> MSIX */
> if (icr0 & I40E_PFINT_ICR0_QUEUE_0_MASK) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_q_vector *q_vector = vsi->q_vectors[0];
>
> /* We do not have a way to disarm Queue causes while
> leaving @@ -5480,7 +5480,7 @@ static u8
> i40e_dcb_get_enabled_tc(struct i40e_dcbx_config *dcbcfg)
> **/
> static u8 i40e_mqprio_get_enabled_tc(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> u8 num_tc = vsi->mqprio_qopt.qopt.num_tc;
> u8 enabled_tc = 1, i;
>
> @@ -5497,13 +5497,14 @@ static u8 i40e_mqprio_get_enabled_tc(struct
> i40e_pf *pf)
> **/
> static u8 i40e_pf_get_num_tc(struct i40e_pf *pf) {
> - struct i40e_hw *hw = &pf->hw;
> u8 i, enabled_tc = 1;
> u8 num_tc = 0;
> - struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config;
>
> - if (i40e_is_tc_mqprio_enabled(pf))
> - return pf->vsi[pf->lan_vsi]->mqprio_qopt.qopt.num_tc;
> + if (i40e_is_tc_mqprio_enabled(pf)) {
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> +
> + return vsi->mqprio_qopt.qopt.num_tc;
> + }
>
> /* If neither MQPRIO nor DCB is enabled, then always use
> single TC */
> if (!test_bit(I40E_FLAG_DCB_ENA, pf->flags)) @@ -5511,7
> +5512,7 @@ static u8 i40e_pf_get_num_tc(struct i40e_pf *pf)
>
> /* SFP mode will be enabled for all TCs on port */
> if (!test_bit(I40E_FLAG_MFP_ENA, pf->flags))
> - return i40e_dcb_get_num_tc(dcbcfg);
> + return i40e_dcb_get_num_tc(&pf->hw.local_dcbx_config);
>
> /* MFP mode return count of enabled TCs for this PF */
> if (pf->hw.func_caps.iscsi)
> @@ -6485,6 +6486,7 @@ static inline int
> i40e_setup_hw_channel(struct i40e_pf *pf, static bool
> i40e_setup_channel(struct i40e_pf *pf, struct i40e_vsi *vsi,
> struct i40e_channel *ch)
> {
> + struct i40e_vsi *main_vsi;
> u8 vsi_type;
> u16 seid;
> int ret;
> @@ -6498,7 +6500,8 @@ static bool i40e_setup_channel(struct i40e_pf
> *pf, struct i40e_vsi *vsi,
> }
>
> /* underlying switching element */
> - seid = pf->vsi[pf->lan_vsi]->uplink_seid;
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + seid = main_vsi->uplink_seid;
>
> /* create channel (VSI), configure TX rings */
> ret = i40e_setup_hw_channel(pf, vsi, ch, seid, vsi_type); @@
> -7055,7 +7058,9 @@ int i40e_hw_dcb_config(struct i40e_pf *pf,
> struct i40e_dcbx_config *new_cfg)
>
> /* Configure Rx Packet Buffers in HW */
> for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
> - mfs_tc[i] = pf->vsi[pf->lan_vsi]->netdev->mtu;
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> +
> + mfs_tc[i] = main_vsi->netdev->mtu;
> mfs_tc[i] += I40E_PACKET_HDR_PAD;
> }
>
> @@ -9812,7 +9817,7 @@ static void i40e_fdir_flush_and_replay(struct
> i40e_pf *pf)
> dev_warn(&pf->pdev->dev, "FD table did not flush, needs
> more time\n");
> } else {
> /* replay sideband filters */
> - i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]);
> + i40e_fdir_filter_restore(i40e_pf_get_main_vsi(pf));
> if (!disable_atr && !pf->fd_tcp4_filter_cnt)
> clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf-
> >state);
> clear_bit(__I40E_FD_FLUSH_REQUESTED, pf->state); @@ -
> 9910,7 +9915,7 @@ static void i40e_veb_link_event(struct i40e_veb
> *veb, bool link_up)
> **/
> static void i40e_link_event(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> u8 new_link_speed, old_link_speed;
> bool new_link, old_link;
> int status;
> @@ -10281,7 +10286,7 @@ static void i40e_verify_eeprom(struct
> i40e_pf *pf)
> **/
> static void i40e_enable_pf_switch_lb(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_vsi_context ctxt;
> int ret;
>
> @@ -10317,7 +10322,7 @@ static void i40e_enable_pf_switch_lb(struct
> i40e_pf *pf)
> **/
> static void i40e_disable_pf_switch_lb(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_vsi_context ctxt;
> int ret;
>
> @@ -10393,7 +10398,7 @@ static int i40e_reconstitute_veb(struct
> i40e_veb *veb)
>
> if (veb->uplink_seid == pf->mac_seid) {
> /* Check that the LAN VSI has VEB owning flag set */
> - ctl_vsi = pf->vsi[pf->lan_vsi];
> + ctl_vsi = i40e_pf_get_main_vsi(pf);
>
> if (WARN_ON(ctl_vsi->veb_idx != veb->idx ||
> !(ctl_vsi->flags & I40E_VSI_FLAG_VEB_OWNER)))
> { @@ -10536,7 +10541,7 @@ static int i40e_vsi_clear(struct i40e_vsi
> *vsi);
> **/
> static void i40e_fdir_sb_setup(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi;
> + struct i40e_vsi *main_vsi, *vsi;
>
> /* quick workaround for an NVM issue that leaves a critical
> register
> * uninitialized
> @@ -10561,8 +10566,8 @@ static void i40e_fdir_sb_setup(struct
> i40e_pf *pf)
>
> /* create a new VSI if none exists */
> if (!vsi) {
> - vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR,
> - pf->vsi[pf->lan_vsi]->seid, 0);
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, main_vsi->seid,
> 0);
> if (!vsi) {
> dev_info(&pf->pdev->dev, "Couldn't create FDir
> VSI\n");
> clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); @@ -
> 10841,7 +10846,7 @@ static int i40e_reset(struct i40e_pf *pf)
> static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool
> lock_acquired) {
> const bool is_recovery_mode_reported =
> i40e_check_recovery_mode(pf);
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_hw *hw = &pf->hw;
> struct i40e_veb *veb;
> int ret;
> @@ -10850,7 +10855,7 @@ static void i40e_rebuild(struct i40e_pf
> *pf, bool reinit, bool lock_acquired)
>
> if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) &&
> is_recovery_mode_reported)
> - i40e_set_ethtool_ops(pf->vsi[pf->lan_vsi]->netdev);
> + i40e_set_ethtool_ops(vsi->netdev);
>
> if (test_bit(__I40E_DOWN, pf->state) &&
> !test_bit(__I40E_RECOVERY_MODE, pf->state)) @@ -12402,7
> +12407,7 @@ void i40e_fill_rss_lut(struct i40e_pf *pf, u8 *lut,
> **/
> static int i40e_pf_config_rss(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> u8 seed[I40E_HKEY_ARRAY_SIZE];
> u8 *lut;
> struct i40e_hw *hw = &pf->hw;
> @@ -12474,7 +12479,7 @@ static int i40e_pf_config_rss(struct
> i40e_pf *pf)
> **/
> int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count)
> {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> int new_rss_size;
>
> if (!test_bit(I40E_FLAG_RSS_ENA, pf->flags)) @@ -13767,9
> +13772,10 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
> * the end, which is 4 bytes long, so force truncation
> of the
> * original name by IFNAMSIZ - 4
> */
> - snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d",
> - IFNAMSIZ - 4,
> - pf->vsi[pf->lan_vsi]->netdev->name);
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> +
> + snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d", IFNAMSIZ -
> 4,
> + main_vsi->netdev->name);
> eth_random_addr(mac_addr);
>
> spin_lock_bh(&vsi->mac_filter_hash_lock);
> @@ -14281,6 +14287,7 @@ static int i40e_vsi_setup_vectors(struct
> i40e_vsi *vsi)
> **/
> static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi
> *vsi) {
> + struct i40e_vsi *main_vsi;
> u16 alloc_queue_pairs;
> struct i40e_pf *pf;
> u8 enabled_tc;
> @@ -14315,10 +14322,12 @@ static struct i40e_vsi
> *i40e_vsi_reinit_setup(struct i40e_vsi *vsi)
> /* Update the FW view of the VSI. Force a reset of TC and
> queue
> * layout configurations.
> */
> - enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc;
> - pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0;
> - pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid;
> - i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc);
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + enabled_tc = main_vsi->tc_config.enabled_tc;
> + main_vsi->tc_config.enabled_tc = 0;
> + main_vsi->seid = pf->main_vsi_seid;
> + i40e_vsi_config_tc(main_vsi, enabled_tc);
> +
> if (vsi->type == I40E_VSI_MAIN)
> i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr);
>
> @@ -15001,6 +15010,7 @@ int i40e_fetch_switch_configuration(struct
> i40e_pf *pf, bool printconfig)
> **/
> static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit,
> bool lock_acquired) {
> + struct i40e_vsi *main_vsi;
> u16 flags = 0;
> int ret;
>
> @@ -15045,8 +15055,8 @@ static int i40e_setup_pf_switch(struct
> i40e_pf *pf, bool reinit, bool lock_acqui
> }
>
> /* first time setup */
> - if (pf->lan_vsi == I40E_NO_VSI || reinit) {
> - struct i40e_vsi *vsi = NULL;
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + if (!main_vsi || reinit) {
> u16 uplink_seid;
>
> /* Set up the PF VSI associated with the PF's main VSI
> @@ -15056,11 +15066,12 @@ static int i40e_setup_pf_switch(struct
> i40e_pf *pf, bool reinit, bool lock_acqui
> uplink_seid = pf->veb[pf->lan_veb]->seid;
> else
> uplink_seid = pf->mac_seid;
> - if (pf->lan_vsi == I40E_NO_VSI)
> - vsi = i40e_vsi_setup(pf, I40E_VSI_MAIN,
> uplink_seid, 0);
> + if (!main_vsi)
> + main_vsi = i40e_vsi_setup(pf, I40E_VSI_MAIN,
> + uplink_seid, 0);
> else if (reinit)
> - vsi = i40e_vsi_reinit_setup(pf->vsi[pf-
> >lan_vsi]);
> - if (!vsi) {
> + main_vsi = i40e_vsi_reinit_setup(main_vsi);
> + if (!main_vsi) {
> dev_info(&pf->pdev->dev, "setup of MAIN VSI
> failed\n");
> i40e_cloud_filter_exit(pf);
> i40e_fdir_teardown(pf);
> @@ -15068,13 +15079,13 @@ static int i40e_setup_pf_switch(struct
> i40e_pf *pf, bool reinit, bool lock_acqui
> }
> } else {
> /* force a reset of TC and queue layout configurations
> */
> - u8 enabled_tc = pf->vsi[pf->lan_vsi]-
> >tc_config.enabled_tc;
> + u8 enabled_tc = main_vsi->tc_config.enabled_tc;
>
> - pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0;
> - pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid;
> - i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc);
> + main_vsi->tc_config.enabled_tc = 0;
> + main_vsi->seid = pf->main_vsi_seid;
> + i40e_vsi_config_tc(main_vsi, enabled_tc);
> }
> - i40e_vlan_stripping_disable(pf->vsi[pf->lan_vsi]);
> + i40e_vlan_stripping_disable(main_vsi);
>
> i40e_fdir_sb_setup(pf);
>
> @@ -15101,7 +15112,7 @@ static int i40e_setup_pf_switch(struct
> i40e_pf *pf, bool reinit, bool lock_acqui
> rtnl_lock();
>
> /* repopulate tunnel port filters */
> - udp_tunnel_nic_reset_ntf(pf->vsi[pf->lan_vsi]->netdev);
> + udp_tunnel_nic_reset_ntf(main_vsi->netdev);
>
> if (!lock_acquired)
> rtnl_unlock();
> @@ -15245,6 +15256,7 @@ static int
> i40e_setup_pf_filter_control(struct i40e_pf *pf) #define
> REMAIN(__x) (INFO_STRING_LEN - (__x)) static void
> i40e_print_features(struct i40e_pf *pf) {
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_hw *hw = &pf->hw;
> char *buf;
> int i;
> @@ -15258,8 +15270,7 @@ static void i40e_print_features(struct
> i40e_pf *pf)
> i += scnprintf(&buf[i], REMAIN(i), " VFs: %d", pf-
> >num_req_vfs); #endif
> i += scnprintf(&buf[i], REMAIN(i), " VSIs: %d QP: %d",
> - pf->hw.func_caps.num_vsis,
> - pf->vsi[pf->lan_vsi]->num_queue_pairs);
> + pf->hw.func_caps.num_vsis, main_vsi-
> >num_queue_pairs);
> if (test_bit(I40E_FLAG_RSS_ENA, pf->flags))
> i += scnprintf(&buf[i], REMAIN(i), " RSS");
> if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags)) @@ -15923,7
> +15934,9 @@ static int i40e_probe(struct pci_dev *pdev, const
> struct pci_device_id *ent)
> dev_info(&pdev->dev, "setup_pf_switch failed: %d\n",
> err);
> goto err_vsis;
> }
> - INIT_LIST_HEAD(&pf->vsi[pf->lan_vsi]->ch_list);
> +
> + vsi = i40e_pf_get_main_vsi(pf);
> + INIT_LIST_HEAD(&vsi->ch_list);
>
> /* if FDIR VSI was set up, start it now */
> vsi = i40e_find_vsi_by_type(pf, I40E_VSI_FDIR); @@ -16425,15
> +16438,15 @@ static void i40e_pci_error_resume(struct pci_dev
> *pdev)
> **/
> static void i40e_enable_mc_magic_wake(struct i40e_pf *pf) {
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_hw *hw = &pf->hw;
> u8 mac_addr[6];
> u16 flags = 0;
> int ret;
>
> /* Get current MAC address in case it's an LAA */
> - if (pf->vsi[pf->lan_vsi] && pf->vsi[pf->lan_vsi]->netdev) {
> - ether_addr_copy(mac_addr,
> - pf->vsi[pf->lan_vsi]->netdev->dev_addr);
> + if (main_vsi && main_vsi->netdev) {
> + ether_addr_copy(mac_addr, main_vsi->netdev->dev_addr);
> } else {
> dev_err(&pf->pdev->dev,
> "Failed to retrieve MAC address; using
> default\n"); diff --git
> a/drivers/net/ethernet/intel/i40e/i40e_ptp.c
> b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
> index e7ebcb09f23c..b72a4b5d76b9 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_ptp.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_ptp.c
> @@ -1472,7 +1472,8 @@ void i40e_ptp_restore_hw_time(struct i40e_pf
> *pf)
> **/
> void i40e_ptp_init(struct i40e_pf *pf)
> {
> - struct net_device *netdev = pf->vsi[pf->lan_vsi]->netdev;
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> + struct net_device *netdev = vsi->netdev;
It's not visible here, are you sure netdev is used?
Why not just use vsi->netdev directly?

> struct i40e_hw *hw = &pf->hw;
> u32 pf_id;
> long err;
> @@ -1536,6 +1537,7 @@ void i40e_ptp_init(struct i40e_pf *pf)
> **/
> void i40e_ptp_stop(struct i40e_pf *pf)
> {
> + struct i40e_vsi *main_vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_hw *hw = &pf->hw;
> u32 regval;
>
> @@ -1555,7 +1557,7 @@ void i40e_ptp_stop(struct i40e_pf *pf)
> ptp_clock_unregister(pf->ptp_clock);
> pf->ptp_clock = NULL;
> dev_info(&pf->pdev->dev, "%s: removed PHC on %s\n",
> __func__,
> - pf->vsi[pf->lan_vsi]->netdev->name);
> + main_vsi->netdev->name);
> }
>
> if (i40e_is_ptp_pin_dev(&pf->hw)) {
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> index e35a08de16b2..8f38a969e20e 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c
> @@ -23,7 +23,7 @@ static void i40e_fdir(struct i40e_ring *tx_ring,
> {
> struct i40e_filter_program_desc *fdir_desc;
> struct i40e_pf *pf = tx_ring->vsi->back;
> - u32 flex_ptype, dtype_cmd;
> + u32 flex_ptype, dtype_cmd, vsi_id;
> u16 i;
>
> /* grab the next descriptor */
> @@ -41,8 +41,8 @@ static void i40e_fdir(struct i40e_ring *tx_ring,
> flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_PCTYPE_MASK,
> fdata->pctype);
>
> /* Use LAN VSI Id if not programmed by user */
> - flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_DEST_VSI_MASK,
> - fdata->dest_vsi ? : pf->vsi[pf->lan_vsi]-
> >id);
> + vsi_id = fdata->dest_vsi ? : i40e_pf_get_main_vsi(pf)->id;
> + flex_ptype |= FIELD_PREP(I40E_TXD_FLTR_QW0_DEST_VSI_MASK,
> vsi_id);
>
> dtype_cmd = I40E_TX_DESC_DTYPE_FILTER_PROG;
>
> @@ -868,7 +868,7 @@ u32 i40e_get_tx_pending(struct i40e_ring *ring,
> bool in_sw)
> **/
> void i40e_detect_recover_hung(struct i40e_pf *pf) {
> - struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi];
> + struct i40e_vsi *vsi = i40e_pf_get_main_vsi(pf);
> struct i40e_ring *tx_ring = NULL;
> struct net_device *netdev;
> unsigned int i;
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> index 232b65b9c8ea..662622f01e31 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
> @@ -795,13 +795,13 @@ static int i40e_config_vsi_rx_queue(struct
> i40e_vf *vf, u16 vsi_id, static int i40e_alloc_vsi_res(struct
> i40e_vf *vf, u8 idx) {
> struct i40e_mac_filter *f = NULL;
> + struct i40e_vsi *main_vsi, *vsi;
> struct i40e_pf *pf = vf->pf;
> - struct i40e_vsi *vsi;
> u64 max_tx_rate = 0;
> int ret = 0;
>
> - vsi = i40e_vsi_setup(pf, I40E_VSI_SRIOV, pf->vsi[pf-
> >lan_vsi]->seid,
> - vf->vf_id);
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + vsi = i40e_vsi_setup(pf, I40E_VSI_SRIOV, main_vsi->seid, vf-
> >vf_id);
>
> if (!vsi) {
> dev_err(&pf->pdev->dev,
> @@ -3322,8 +3322,9 @@ static int i40e_vc_remove_vlan_msg(struct
> i40e_vf *vf, u8 *msg) static int i40e_vc_rdma_msg(struct i40e_vf
> *vf, u8 *msg, u16 msglen) {
> struct i40e_pf *pf = vf->pf;
> - int abs_vf_id = vf->vf_id + pf->hw.func_caps.vf_base_id;
> + struct i40e_vsi *main_vsi;
> int aq_ret = 0;
> + int abs_vf_id;
>
> if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
> !test_bit(I40E_VF_STATE_RDMAENA, &vf->vf_states)) { @@ -
> 3331,8 +3332,9 @@ static int i40e_vc_rdma_msg(struct i40e_vf *vf,
> u8 *msg, u16 msglen)
> goto error_param;
> }
>
> - i40e_notify_client_of_vf_msg(pf->vsi[pf->lan_vsi], abs_vf_id,
> - msg, msglen);
> + main_vsi = i40e_pf_get_main_vsi(pf);
> + abs_vf_id = vf->vf_id + pf->hw.func_caps.vf_base_id;
> + i40e_notify_client_of_vf_msg(main_vsi, abs_vf_id, msg,
> msglen);
>
> error_param:
> /* send the response to the VF */
> --
> 2.43.0