Merge: net/i40e: Update driver
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/4761 JIRA: https://issues.redhat.com/browse/RHEL-32176 This MR updates the i40e driver to fix the hung task after EEH injection. Tested: http://dashboard.lnst.anl.lab.eng.bos.redhat.com/pipeline/5097 Signed-off-by: Kamal Heib <kheib@redhat.com> Approved-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: José Ignacio Tornos Martínez <jtornosm@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Lucas Zampieri <lzampier@redhat.com>
This commit is contained in:
commit
ad63d307f7
|
@ -0,0 +1,59 @@
|
|||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
====================
|
||||
i40e devlink support
|
||||
====================
|
||||
|
||||
This document describes the devlink features implemented by the ``i40e``
|
||||
device driver.
|
||||
|
||||
Info versions
|
||||
=============
|
||||
|
||||
The ``i40e`` driver reports the following versions
|
||||
|
||||
.. list-table:: devlink info versions implemented
|
||||
:widths: 5 5 5 90
|
||||
|
||||
* - Name
|
||||
- Type
|
||||
- Example
|
||||
- Description
|
||||
* - ``board.id``
|
||||
- fixed
|
||||
- K15190-000
|
||||
- The Product Board Assembly (PBA) identifier of the board.
|
||||
* - ``fw.mgmt``
|
||||
- running
|
||||
- 9.130
|
||||
- 2-digit version number of the management firmware that controls the
|
||||
PHY, link, etc.
|
||||
* - ``fw.mgmt.api``
|
||||
- running
|
||||
- 1.15
|
||||
- 2-digit version number of the API exported over the AdminQ by the
|
||||
management firmware. Used by the driver to identify what commands
|
||||
are supported.
|
||||
* - ``fw.mgmt.build``
|
||||
- running
|
||||
- 73618
|
||||
- Build number of the source for the management firmware.
|
||||
* - ``fw.undi``
|
||||
- running
|
||||
- 1.3429.0
|
||||
- Version of the Option ROM containing the UEFI driver. The version is
|
||||
reported in ``major.minor.patch`` format. The major version is
|
||||
incremented whenever a major breaking change occurs, or when the
|
||||
minor version would overflow. The minor version is incremented for
|
||||
non-breaking changes and reset to 1 when the major version is
|
||||
incremented. The patch version is normally 0 but is incremented when
|
||||
a fix is delivered as a patch against an older base Option ROM.
|
||||
* - ``fw.psid.api``
|
||||
- running
|
||||
- 9.30
|
||||
- Version defining the format of the flash contents.
|
||||
* - ``fw.bundle_id``
|
||||
- running
|
||||
- 0x8000e5f3
|
||||
- Unique identifier of the firmware image file that was loaded onto
|
||||
the device. Also referred to as the EETRACK identifier of the NVM.
|
|
@ -78,6 +78,7 @@ parameters, info versions, and other features it supports.
|
|||
:maxdepth: 1
|
||||
|
||||
bnxt
|
||||
i40e
|
||||
ionic
|
||||
ice
|
||||
mlx4
|
||||
|
|
|
@ -242,6 +242,7 @@ config I40E
|
|||
depends on PTP_1588_CLOCK_OPTIONAL
|
||||
depends on PCI
|
||||
select AUXILIARY_BUS
|
||||
select NET_DEVLINK
|
||||
help
|
||||
This driver supports Intel(R) Ethernet Controller XL710 Family of
|
||||
devices. For more information on how to identify your adapter, go
|
||||
|
|
|
@ -24,6 +24,7 @@ i40e-objs := i40e_main.o \
|
|||
i40e_ddp.o \
|
||||
i40e_client.o \
|
||||
i40e_virtchnl_pf.o \
|
||||
i40e_xsk.o
|
||||
i40e_xsk.o \
|
||||
i40e_devlink.o
|
||||
|
||||
i40e-$(CONFIG_I40E_DCB) += i40e_dcb.o i40e_dcb_nl.o
|
||||
|
|
|
@ -9,10 +9,12 @@
|
|||
#include <linux/types.h>
|
||||
#include <linux/avf/virtchnl.h>
|
||||
#include <linux/net/intel/i40e_client.h>
|
||||
#include <net/devlink.h>
|
||||
#include <net/pkt_cls.h>
|
||||
#include <net/udp_tunnel.h>
|
||||
#include "i40e_dcb.h"
|
||||
#include "i40e_debug.h"
|
||||
#include "i40e_devlink.h"
|
||||
#include "i40e_io.h"
|
||||
#include "i40e_prototype.h"
|
||||
#include "i40e_register.h"
|
||||
|
@ -462,6 +464,7 @@ static inline const u8 *i40e_channel_mac(struct i40e_channel *ch)
|
|||
/* struct that defines the Ethernet device */
|
||||
struct i40e_pf {
|
||||
struct pci_dev *pdev;
|
||||
struct devlink_port devlink_port;
|
||||
struct i40e_hw hw;
|
||||
DECLARE_BITMAP(state, __I40E_STATE_SIZE__);
|
||||
struct msix_entry *msix_entries;
|
||||
|
@ -785,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;
|
||||
|
@ -1210,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);
|
||||
|
||||
|
@ -1234,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);
|
||||
|
@ -1370,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
|
||||
|
@ -1388,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_ */
|
||||
|
|
|
@ -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_vsi *vsi = i40e_pf_get_main_vsi(pf);
|
||||
struct i40e_client_instance *cdev = pf->cinst;
|
||||
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(¶ms, 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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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);
|
||||
|
@ -128,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);
|
||||
|
@ -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);
|
||||
|
@ -867,7 +869,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
|
||||
|
@ -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);
|
||||
|
|
|
@ -0,0 +1,244 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Copyright(c) 2023 Intel Corporation. */
|
||||
|
||||
#include <net/devlink.h>
|
||||
#include "i40e.h"
|
||||
#include "i40e_devlink.h"
|
||||
|
||||
static void i40e_info_get_dsn(struct i40e_pf *pf, char *buf, size_t len)
|
||||
{
|
||||
u8 dsn[8];
|
||||
|
||||
put_unaligned_be64(pci_get_dsn(pf->pdev), dsn);
|
||||
|
||||
snprintf(buf, len, "%8phD", dsn);
|
||||
}
|
||||
|
||||
static void i40e_info_fw_mgmt(struct i40e_hw *hw, char *buf, size_t len)
|
||||
{
|
||||
struct i40e_adminq_info *aq = &hw->aq;
|
||||
|
||||
snprintf(buf, len, "%u.%u", aq->fw_maj_ver, aq->fw_min_ver);
|
||||
}
|
||||
|
||||
static void i40e_info_fw_mgmt_build(struct i40e_hw *hw, char *buf, size_t len)
|
||||
{
|
||||
struct i40e_adminq_info *aq = &hw->aq;
|
||||
|
||||
snprintf(buf, len, "%05d", aq->fw_build);
|
||||
}
|
||||
|
||||
static void i40e_info_fw_api(struct i40e_hw *hw, char *buf, size_t len)
|
||||
{
|
||||
struct i40e_adminq_info *aq = &hw->aq;
|
||||
|
||||
snprintf(buf, len, "%u.%u", aq->api_maj_ver, aq->api_min_ver);
|
||||
}
|
||||
|
||||
static void i40e_info_pba(struct i40e_hw *hw, char *buf, size_t len)
|
||||
{
|
||||
buf[0] = '\0';
|
||||
if (hw->pba_id)
|
||||
strscpy(buf, hw->pba_id, len);
|
||||
}
|
||||
|
||||
enum i40e_devlink_version_type {
|
||||
I40E_DL_VERSION_FIXED,
|
||||
I40E_DL_VERSION_RUNNING,
|
||||
};
|
||||
|
||||
static int i40e_devlink_info_put(struct devlink_info_req *req,
|
||||
enum i40e_devlink_version_type type,
|
||||
const char *key, const char *value)
|
||||
{
|
||||
if (!strlen(value))
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
case I40E_DL_VERSION_FIXED:
|
||||
return devlink_info_version_fixed_put(req, key, value);
|
||||
case I40E_DL_VERSION_RUNNING:
|
||||
return devlink_info_version_running_put(req, key, value);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int i40e_devlink_info_get(struct devlink *dl,
|
||||
struct devlink_info_req *req,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct i40e_pf *pf = devlink_priv(dl);
|
||||
struct i40e_hw *hw = &pf->hw;
|
||||
char buf[32];
|
||||
int err;
|
||||
|
||||
i40e_info_get_dsn(pf, buf, sizeof(buf));
|
||||
err = devlink_info_serial_number_put(req, buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_fw_mgmt(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_fw_mgmt_build(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
"fw.mgmt.build", buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_fw_api(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API,
|
||||
buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_nvm_ver(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
"fw.psid.api", buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_eetrack(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID,
|
||||
buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_civd_ver(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_RUNNING,
|
||||
DEVLINK_INFO_VERSION_GENERIC_FW_UNDI, buf);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
i40e_info_pba(hw, buf, sizeof(buf));
|
||||
err = i40e_devlink_info_put(req, I40E_DL_VERSION_FIXED,
|
||||
DEVLINK_INFO_VERSION_GENERIC_BOARD_ID, buf);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct devlink_ops i40e_devlink_ops = {
|
||||
.info_get = i40e_devlink_info_get,
|
||||
};
|
||||
|
||||
/**
|
||||
* i40e_alloc_pf - Allocate devlink and return i40e_pf structure pointer
|
||||
* @dev: the device to allocate for
|
||||
*
|
||||
* Allocate a devlink instance for this device and return the private
|
||||
* area as the i40e_pf structure.
|
||||
**/
|
||||
struct i40e_pf *i40e_alloc_pf(struct device *dev)
|
||||
{
|
||||
struct devlink *devlink;
|
||||
|
||||
devlink = devlink_alloc(&i40e_devlink_ops, sizeof(struct i40e_pf), dev);
|
||||
if (!devlink)
|
||||
return NULL;
|
||||
|
||||
return devlink_priv(devlink);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_free_pf - Free i40e_pf structure and associated devlink
|
||||
* @pf: the PF structure
|
||||
*
|
||||
* Free i40e_pf structure and devlink allocated by devlink_alloc.
|
||||
**/
|
||||
void i40e_free_pf(struct i40e_pf *pf)
|
||||
{
|
||||
struct devlink *devlink = priv_to_devlink(pf);
|
||||
|
||||
devlink_free(devlink);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_devlink_register - Register devlink interface for this PF
|
||||
* @pf: the PF to register the devlink for.
|
||||
*
|
||||
* Register the devlink instance associated with this physical function.
|
||||
**/
|
||||
void i40e_devlink_register(struct i40e_pf *pf)
|
||||
{
|
||||
devlink_register(priv_to_devlink(pf));
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_devlink_unregister - Unregister devlink resources for this PF.
|
||||
* @pf: the PF structure to cleanup
|
||||
*
|
||||
* Releases resources used by devlink and cleans up associated memory.
|
||||
**/
|
||||
void i40e_devlink_unregister(struct i40e_pf *pf)
|
||||
{
|
||||
devlink_unregister(priv_to_devlink(pf));
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_devlink_set_switch_id - Set unique switch id based on pci dsn
|
||||
* @pf: the PF to create a devlink port for
|
||||
* @ppid: struct with switch id information
|
||||
*/
|
||||
static void i40e_devlink_set_switch_id(struct i40e_pf *pf,
|
||||
struct netdev_phys_item_id *ppid)
|
||||
{
|
||||
u64 id = pci_get_dsn(pf->pdev);
|
||||
|
||||
ppid->id_len = sizeof(id);
|
||||
put_unaligned_be64(id, &ppid->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_devlink_create_port - Create a devlink port for this PF
|
||||
* @pf: the PF to create a port for
|
||||
*
|
||||
* Create and register a devlink_port for this PF. Note that although each
|
||||
* physical function is connected to a separate devlink instance, the port
|
||||
* will still be numbered according to the physical function id.
|
||||
*
|
||||
* Return: zero on success or an error code on failure.
|
||||
**/
|
||||
int i40e_devlink_create_port(struct i40e_pf *pf)
|
||||
{
|
||||
struct devlink *devlink = priv_to_devlink(pf);
|
||||
struct devlink_port_attrs attrs = {};
|
||||
struct device *dev = &pf->pdev->dev;
|
||||
int err;
|
||||
|
||||
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
|
||||
attrs.phys.port_number = pf->hw.pf_id;
|
||||
i40e_devlink_set_switch_id(pf, &attrs.switch_id);
|
||||
devlink_port_attrs_set(&pf->devlink_port, &attrs);
|
||||
err = devlink_port_register(devlink, &pf->devlink_port, pf->hw.pf_id);
|
||||
if (err) {
|
||||
dev_err(dev, "devlink_port_register failed: %d\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_get_devlink_port - Get devlink port from netdev
|
||||
* @netdev: the netdevice structure
|
||||
**/
|
||||
struct devlink_port *i40e_get_devlink_port(struct net_device *netdev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_devlink_destroy_port - Destroy the devlink_port for this PF
|
||||
* @pf: the PF to cleanup
|
||||
*
|
||||
* Unregisters the devlink_port structure associated with this PF.
|
||||
**/
|
||||
void i40e_devlink_destroy_port(struct i40e_pf *pf)
|
||||
{
|
||||
devlink_port_unregister(&pf->devlink_port);
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Copyright (c) 2023, Intel Corporation. */
|
||||
|
||||
#ifndef _I40E_DEVLINK_H_
|
||||
#define _I40E_DEVLINK_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
struct i40e_pf;
|
||||
|
||||
struct i40e_pf *i40e_alloc_pf(struct device *dev);
|
||||
void i40e_free_pf(struct i40e_pf *pf);
|
||||
void i40e_devlink_register(struct i40e_pf *pf);
|
||||
void i40e_devlink_unregister(struct i40e_pf *pf);
|
||||
int i40e_devlink_create_port(struct i40e_pf *pf);
|
||||
struct devlink_port *i40e_get_devlink_port(struct net_device *netdev);
|
||||
void i40e_devlink_destroy_port(struct i40e_pf *pf);
|
||||
|
||||
#endif /* _I40E_DEVLINK_H_ */
|
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,17 +2422,14 @@ 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) &&
|
||||
(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
|
||||
|
@ -2495,7 +2492,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 +2789,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 */
|
||||
|
@ -3370,6 +3367,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 +3491,8 @@ no_input_set:
|
|||
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
|
||||
|
|
|
@ -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);
|
||||
|
@ -2475,12 +2475,12 @@ 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;
|
||||
|
||||
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
|
||||
|
@ -4322,7 +4322,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
|
||||
|
@ -5472,7 +5472,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;
|
||||
|
||||
|
@ -5489,13 +5489,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))
|
||||
|
@ -5503,7 +5504,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)
|
||||
|
@ -5915,6 +5916,28 @@ out:
|
|||
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.
|
||||
*
|
||||
* Context: It is expected that the VSI queues have been quisced before
|
||||
* calling this function.
|
||||
*
|
||||
* Return: 0 on success, negative value on failure
|
||||
**/
|
||||
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
|
||||
|
@ -6477,6 +6500,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;
|
||||
|
@ -6490,7 +6514,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);
|
||||
|
@ -6808,7 +6833,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;
|
||||
|
@ -7047,7 +7072,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;
|
||||
}
|
||||
|
||||
|
@ -9113,7 +9140,7 @@ err_setup_rx:
|
|||
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;
|
||||
|
@ -9804,7 +9831,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);
|
||||
|
@ -9902,7 +9929,8 @@ 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);
|
||||
struct i40e_veb *veb = i40e_pf_get_main_veb(pf);
|
||||
u8 new_link_speed, old_link_speed;
|
||||
bool new_link, old_link;
|
||||
int status;
|
||||
|
@ -9942,8 +9970,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);
|
||||
|
||||
|
@ -10273,7 +10301,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;
|
||||
|
||||
|
@ -10309,7 +10337,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;
|
||||
|
||||
|
@ -10385,7 +10413,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))) {
|
||||
|
@ -10528,7 +10556,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
|
||||
|
@ -10553,8 +10581,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);
|
||||
|
@ -10833,7 +10861,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;
|
||||
|
@ -10842,7 +10870,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))
|
||||
|
@ -11138,6 +11166,8 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit,
|
|||
ret = i40e_reset(pf);
|
||||
if (!ret)
|
||||
i40e_rebuild(pf, reinit, lock_acquired);
|
||||
else
|
||||
dev_err(&pf->pdev->dev, "%s: i40e_reset() FAILED", __func__);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -11266,7 +11296,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);
|
||||
|
@ -11275,14 +11305,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 {
|
||||
|
@ -11990,7 +12018,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;
|
||||
|
@ -12396,7 +12424,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;
|
||||
|
@ -12468,7 +12496,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))
|
||||
|
@ -13107,7 +13135,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 */
|
||||
|
@ -13130,7 +13158,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;
|
||||
|
@ -13179,7 +13207,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 */
|
||||
|
@ -13637,6 +13665,7 @@ static const struct net_device_ops i40e_netdev_ops = {
|
|||
.ndo_xsk_wakeup = i40e_xsk_wakeup,
|
||||
.ndo_dfwd_add_station = i40e_fwd_add,
|
||||
.ndo_dfwd_del_station = i40e_fwd_del,
|
||||
.__rh_deprecated_ndo_get_devlink_port = i40e_get_devlink_port,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -13761,9 +13790,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);
|
||||
|
@ -14130,13 +14160,13 @@ 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;
|
||||
}
|
||||
set_bit(__I40E_VSI_RELEASING, vsi->state);
|
||||
uplink_seid = vsi->uplink_seid;
|
||||
|
||||
if (vsi->type != I40E_VSI_SRIOV) {
|
||||
if (vsi->netdev_registered) {
|
||||
vsi->netdev_registered = false;
|
||||
|
@ -14150,6 +14180,9 @@ int i40e_vsi_release(struct i40e_vsi *vsi)
|
|||
i40e_vsi_disable_irq(vsi);
|
||||
}
|
||||
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
|
||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||
|
||||
/* clear the sync flag on all filters */
|
||||
|
@ -14271,9 +14304,9 @@ vector_setup_out:
|
|||
**/
|
||||
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)
|
||||
|
@ -14305,10 +14338,10 @@ 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);
|
||||
main_vsi->seid = pf->main_vsi_seid;
|
||||
i40e_vsi_reconfig_tc(main_vsi);
|
||||
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr);
|
||||
|
||||
|
@ -14329,6 +14362,8 @@ err_rings:
|
|||
free_netdev(vsi->netdev);
|
||||
vsi->netdev = NULL;
|
||||
}
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
i40e_aq_delete_element(&pf->hw, vsi->seid, NULL);
|
||||
err_vsi:
|
||||
i40e_vsi_clear(vsi);
|
||||
|
@ -14380,13 +14415,13 @@ 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) {
|
||||
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;
|
||||
|
@ -14454,9 +14489,15 @@ struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type,
|
|||
ret = i40e_netif_set_realnum_tx_rx_queues(vsi);
|
||||
if (ret)
|
||||
goto err_netdev;
|
||||
if (vsi->type == I40E_VSI_MAIN) {
|
||||
ret = i40e_devlink_create_port(pf);
|
||||
if (ret)
|
||||
goto err_netdev;
|
||||
SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port);
|
||||
}
|
||||
ret = register_netdev(vsi->netdev);
|
||||
if (ret)
|
||||
goto err_netdev;
|
||||
goto err_dl_port;
|
||||
vsi->netdev_registered = true;
|
||||
netif_carrier_off(vsi->netdev);
|
||||
#ifdef CONFIG_I40E_DCB
|
||||
|
@ -14503,6 +14544,9 @@ err_msix:
|
|||
free_netdev(vsi->netdev);
|
||||
vsi->netdev = NULL;
|
||||
}
|
||||
err_dl_port:
|
||||
if (vsi->type == I40E_VSI_MAIN)
|
||||
i40e_devlink_destroy_port(pf);
|
||||
err_netdev:
|
||||
i40e_aq_delete_element(&pf->hw, vsi->seid, NULL);
|
||||
err_vsi:
|
||||
|
@ -14768,7 +14812,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
|
||||
|
@ -14781,9 +14824,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;
|
||||
|
@ -14814,7 +14856,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);
|
||||
|
||||
|
@ -14866,7 +14907,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 */
|
||||
|
@ -14880,12 +14922,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)
|
||||
|
@ -14983,6 +15028,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;
|
||||
|
||||
|
@ -15027,22 +15073,25 @@ 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) {
|
||||
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 (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);
|
||||
|
@ -15050,13 +15099,10 @@ 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;
|
||||
|
||||
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->seid = pf->main_vsi_seid;
|
||||
i40e_vsi_reconfig_tc(main_vsi);
|
||||
}
|
||||
i40e_vlan_stripping_disable(pf->vsi[pf->lan_vsi]);
|
||||
i40e_vlan_stripping_disable(main_vsi);
|
||||
|
||||
i40e_fdir_sb_setup(pf);
|
||||
|
||||
|
@ -15083,7 +15129,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();
|
||||
|
@ -15227,6 +15273,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;
|
||||
|
@ -15240,8 +15287,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))
|
||||
|
@ -15510,7 +15556,7 @@ err_switch_setup:
|
|||
iounmap(hw->hw_addr);
|
||||
pci_release_mem_regions(pf->pdev);
|
||||
pci_disable_device(pf->pdev);
|
||||
kfree(pf);
|
||||
i40e_free_pf(pf);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -15587,7 +15633,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
* the Admin Queue structures and then querying for the
|
||||
* device's current profile information.
|
||||
*/
|
||||
pf = kzalloc(sizeof(*pf), GFP_KERNEL);
|
||||
pf = i40e_alloc_pf(&pdev->dev);
|
||||
if (!pf) {
|
||||
err = -ENOMEM;
|
||||
goto err_pf_alloc;
|
||||
|
@ -15905,7 +15951,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);
|
||||
|
@ -16112,6 +16160,8 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
/* print a string summarizing features */
|
||||
i40e_print_features(pf);
|
||||
|
||||
i40e_devlink_register(pf);
|
||||
|
||||
return 0;
|
||||
|
||||
/* Unwind what we've done if something failed in the setup */
|
||||
|
@ -16132,7 +16182,7 @@ err_adminq_setup:
|
|||
err_pf_reset:
|
||||
iounmap(hw->hw_addr);
|
||||
err_ioremap:
|
||||
kfree(pf);
|
||||
i40e_free_pf(pf);
|
||||
err_pf_alloc:
|
||||
pci_release_mem_regions(pdev);
|
||||
err_pci_reg:
|
||||
|
@ -16159,6 +16209,8 @@ static void i40e_remove(struct pci_dev *pdev)
|
|||
int ret_code;
|
||||
int i;
|
||||
|
||||
i40e_devlink_unregister(pf);
|
||||
|
||||
i40e_dbg_pf_exit(pf);
|
||||
|
||||
i40e_ptp_stop(pf);
|
||||
|
@ -16204,7 +16256,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);
|
||||
|
||||
|
@ -16278,12 +16330,145 @@ unmap:
|
|||
kfree(pf->vsi);
|
||||
|
||||
iounmap(hw->hw_addr);
|
||||
kfree(pf);
|
||||
i40e_free_pf(pf);
|
||||
pci_release_mem_regions(pdev);
|
||||
|
||||
pci_disable_device(pdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_enable_mc_magic_wake - enable multicast magic packet wake up
|
||||
* using the mac_address_write admin q function
|
||||
* @pf: pointer to i40e_pf struct
|
||||
**/
|
||||
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 (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");
|
||||
ether_addr_copy(mac_addr, hw->mac.addr);
|
||||
}
|
||||
|
||||
/* The FW expects the mac address write cmd to first be called with
|
||||
* one of these flags before calling it again with the multicast
|
||||
* enable flags.
|
||||
*/
|
||||
flags = I40E_AQC_WRITE_TYPE_LAA_WOL;
|
||||
|
||||
if (hw->func_caps.flex10_enable && hw->partition_id != 1)
|
||||
flags = I40E_AQC_WRITE_TYPE_LAA_ONLY;
|
||||
|
||||
ret = i40e_aq_mac_address_write(hw, flags, mac_addr, NULL);
|
||||
if (ret) {
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Failed to update MAC address registers; cannot enable Multicast Magic packet wake up");
|
||||
return;
|
||||
}
|
||||
|
||||
flags = I40E_AQC_MC_MAG_EN
|
||||
| I40E_AQC_WOL_PRESERVE_ON_PFR
|
||||
| I40E_AQC_WRITE_TYPE_UPDATE_MC_MAG;
|
||||
ret = i40e_aq_mac_address_write(hw, flags, mac_addr, NULL);
|
||||
if (ret)
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Failed to enable Multicast Magic Packet wake up\n");
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_io_suspend - suspend all IO operations
|
||||
* @pf: pointer to i40e_pf struct
|
||||
*
|
||||
**/
|
||||
static int i40e_io_suspend(struct i40e_pf *pf)
|
||||
{
|
||||
struct i40e_hw *hw = &pf->hw;
|
||||
|
||||
set_bit(__I40E_DOWN, pf->state);
|
||||
|
||||
/* Ensure service task will not be running */
|
||||
del_timer_sync(&pf->service_timer);
|
||||
cancel_work_sync(&pf->service_task);
|
||||
|
||||
/* Client close must be called explicitly here because the timer
|
||||
* has been stopped.
|
||||
*/
|
||||
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)
|
||||
i40e_enable_mc_magic_wake(pf);
|
||||
|
||||
/* Since we're going to destroy queues during the
|
||||
* i40e_clear_interrupt_scheme() we should hold the RTNL lock for this
|
||||
* whole section
|
||||
*/
|
||||
rtnl_lock();
|
||||
|
||||
i40e_prep_for_reset(pf);
|
||||
|
||||
wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0));
|
||||
wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0));
|
||||
|
||||
/* Clear the interrupt scheme and release our IRQs so that the system
|
||||
* can safely hibernate even when there are a large number of CPUs.
|
||||
* Otherwise hibernation might fail when mapping all the vectors back
|
||||
* to CPU0.
|
||||
*/
|
||||
i40e_clear_interrupt_scheme(pf);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_io_resume - resume IO operations
|
||||
* @pf: pointer to i40e_pf struct
|
||||
*
|
||||
**/
|
||||
static int i40e_io_resume(struct i40e_pf *pf)
|
||||
{
|
||||
struct device *dev = &pf->pdev->dev;
|
||||
int err;
|
||||
|
||||
/* We need to hold the RTNL lock prior to restoring interrupt schemes,
|
||||
* since we're going to be restoring queues
|
||||
*/
|
||||
rtnl_lock();
|
||||
|
||||
/* We cleared the interrupt scheme when we suspended, so we need to
|
||||
* restore it now to resume device functionality.
|
||||
*/
|
||||
err = i40e_restore_interrupt_scheme(pf);
|
||||
if (err) {
|
||||
dev_err(dev, "Cannot restore interrupt scheme: %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
clear_bit(__I40E_DOWN, pf->state);
|
||||
i40e_reset_and_rebuild(pf, false, true);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
/* Clear suspended state last after everything is recovered */
|
||||
clear_bit(__I40E_SUSPENDED, pf->state);
|
||||
|
||||
/* Restart the service task */
|
||||
mod_timer(&pf->service_timer,
|
||||
round_jiffies(jiffies + pf->service_timer_period));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_pci_error_detected - warning that something funky happened in PCI land
|
||||
* @pdev: PCI device information struct
|
||||
|
@ -16308,7 +16493,7 @@ static pci_ers_result_t i40e_pci_error_detected(struct pci_dev *pdev,
|
|||
|
||||
/* shutdown all operations */
|
||||
if (!test_bit(__I40E_SUSPENDED, pf->state))
|
||||
i40e_prep_for_reset(pf);
|
||||
i40e_io_suspend(pf);
|
||||
|
||||
/* Request a slot reset */
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
|
@ -16330,7 +16515,8 @@ static pci_ers_result_t i40e_pci_error_slot_reset(struct pci_dev *pdev)
|
|||
u32 reg;
|
||||
|
||||
dev_dbg(&pdev->dev, "%s\n", __func__);
|
||||
if (pci_enable_device_mem(pdev)) {
|
||||
/* enable I/O and memory of the device */
|
||||
if (pci_enable_device(pdev)) {
|
||||
dev_info(&pdev->dev,
|
||||
"Cannot re-enable PCI device after reset.\n");
|
||||
result = PCI_ERS_RESULT_DISCONNECT;
|
||||
|
@ -16393,54 +16579,7 @@ static void i40e_pci_error_resume(struct pci_dev *pdev)
|
|||
if (test_bit(__I40E_SUSPENDED, pf->state))
|
||||
return;
|
||||
|
||||
i40e_handle_reset_warning(pf, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_enable_mc_magic_wake - enable multicast magic packet wake up
|
||||
* using the mac_address_write admin q function
|
||||
* @pf: pointer to i40e_pf struct
|
||||
**/
|
||||
static void i40e_enable_mc_magic_wake(struct i40e_pf *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);
|
||||
} else {
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Failed to retrieve MAC address; using default\n");
|
||||
ether_addr_copy(mac_addr, hw->mac.addr);
|
||||
}
|
||||
|
||||
/* The FW expects the mac address write cmd to first be called with
|
||||
* one of these flags before calling it again with the multicast
|
||||
* enable flags.
|
||||
*/
|
||||
flags = I40E_AQC_WRITE_TYPE_LAA_WOL;
|
||||
|
||||
if (hw->func_caps.flex10_enable && hw->partition_id != 1)
|
||||
flags = I40E_AQC_WRITE_TYPE_LAA_ONLY;
|
||||
|
||||
ret = i40e_aq_mac_address_write(hw, flags, mac_addr, NULL);
|
||||
if (ret) {
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Failed to update MAC address registers; cannot enable Multicast Magic packet wake up");
|
||||
return;
|
||||
}
|
||||
|
||||
flags = I40E_AQC_MC_MAG_EN
|
||||
| I40E_AQC_WOL_PRESERVE_ON_PFR
|
||||
| I40E_AQC_WRITE_TYPE_UPDATE_MC_MAG;
|
||||
ret = i40e_aq_mac_address_write(hw, flags, mac_addr, NULL);
|
||||
if (ret)
|
||||
dev_err(&pf->pdev->dev,
|
||||
"Failed to enable Multicast Magic Packet wake up\n");
|
||||
i40e_io_resume(pf);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16463,7 +16602,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)
|
||||
|
@ -16502,48 +16641,11 @@ static void i40e_shutdown(struct pci_dev *pdev)
|
|||
static int __maybe_unused i40e_suspend(struct device *dev)
|
||||
{
|
||||
struct i40e_pf *pf = dev_get_drvdata(dev);
|
||||
struct i40e_hw *hw = &pf->hw;
|
||||
|
||||
/* If we're already suspended, then there is nothing to do */
|
||||
if (test_and_set_bit(__I40E_SUSPENDED, pf->state))
|
||||
return 0;
|
||||
|
||||
set_bit(__I40E_DOWN, pf->state);
|
||||
|
||||
/* Ensure service task will not be running */
|
||||
del_timer_sync(&pf->service_timer);
|
||||
cancel_work_sync(&pf->service_task);
|
||||
|
||||
/* 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);
|
||||
|
||||
if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps) &&
|
||||
pf->wol_en)
|
||||
i40e_enable_mc_magic_wake(pf);
|
||||
|
||||
/* Since we're going to destroy queues during the
|
||||
* i40e_clear_interrupt_scheme() we should hold the RTNL lock for this
|
||||
* whole section
|
||||
*/
|
||||
rtnl_lock();
|
||||
|
||||
i40e_prep_for_reset(pf);
|
||||
|
||||
wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0));
|
||||
wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0));
|
||||
|
||||
/* Clear the interrupt scheme and release our IRQs so that the system
|
||||
* can safely hibernate even when there are a large number of CPUs.
|
||||
* Otherwise hibernation might fail when mapping all the vectors back
|
||||
* to CPU0.
|
||||
*/
|
||||
i40e_clear_interrupt_scheme(pf);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
return 0;
|
||||
return i40e_io_suspend(pf);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -16553,39 +16655,11 @@ static int __maybe_unused i40e_suspend(struct device *dev)
|
|||
static int __maybe_unused i40e_resume(struct device *dev)
|
||||
{
|
||||
struct i40e_pf *pf = dev_get_drvdata(dev);
|
||||
int err;
|
||||
|
||||
/* If we're not suspended, then there is nothing to do */
|
||||
if (!test_bit(__I40E_SUSPENDED, pf->state))
|
||||
return 0;
|
||||
|
||||
/* We need to hold the RTNL lock prior to restoring interrupt schemes,
|
||||
* since we're going to be restoring queues
|
||||
*/
|
||||
rtnl_lock();
|
||||
|
||||
/* We cleared the interrupt scheme when we suspended, so we need to
|
||||
* restore it now to resume device functionality.
|
||||
*/
|
||||
err = i40e_restore_interrupt_scheme(pf);
|
||||
if (err) {
|
||||
dev_err(dev, "Cannot restore interrupt scheme: %d\n",
|
||||
err);
|
||||
}
|
||||
|
||||
clear_bit(__I40E_DOWN, pf->state);
|
||||
i40e_reset_and_rebuild(pf, false, true);
|
||||
|
||||
rtnl_unlock();
|
||||
|
||||
/* Clear suspended state last after everything is recovered */
|
||||
clear_bit(__I40E_SUSPENDED, pf->state);
|
||||
|
||||
/* Restart the service task */
|
||||
mod_timer(&pf->service_timer,
|
||||
round_jiffies(jiffies + pf->service_timer_period));
|
||||
|
||||
return 0;
|
||||
return i40e_io_resume(pf);
|
||||
}
|
||||
|
||||
static const struct pci_error_handlers i40e_err_handler = {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
@ -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 = i40e_pf_get_main_vsi(pf);
|
||||
struct i40e_ring *tx_ring = NULL;
|
||||
struct net_device *netdev;
|
||||
unsigned int i;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -795,13 +795,13 @@ error_param:
|
|||
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 @@ error_param:
|
|||
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 */
|
||||
|
|
Loading…
Reference in New Issue