Commit 76a84269 authored by David S. Miller's avatar David S. Miller

Merge branch '100GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
100GbE Intel Wired LAN Driver Updates 2022-05-05
This series contains updates to ice driver only.

Wan Jiabing converts an open coded min selection to min_t().

Maciej commonizes on a single find VSI function and removes the
duplicated implementation.

Wojciech adjusts the return value when exceeding ICE_MAX_CHAIN_WORDS to,
a more appropriate, -ENOSPC and allows for the error to be propagated.

Michal adds support for ndo_get_devlink_port().

Jake does some cleanup related to virtualization code. Mainly involving
function header comments and wording changes. NULL checks are added to
ice_get_vf_vsi() calls in order to prevent static analysis tools from
complaining that a NULL value could be dereferenced.
---
v2: Dropped patch 1: "ice: Add support for classid based queue selection"
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 949dfdcf 4eaf1797
...@@ -757,6 +757,21 @@ static inline struct ice_vsi *ice_get_ctrl_vsi(struct ice_pf *pf) ...@@ -757,6 +757,21 @@ static inline struct ice_vsi *ice_get_ctrl_vsi(struct ice_pf *pf)
return pf->vsi[pf->ctrl_vsi_idx]; return pf->vsi[pf->ctrl_vsi_idx];
} }
/**
* ice_find_vsi - Find the VSI from VSI ID
* @pf: The PF pointer to search in
* @vsi_num: The VSI ID to search for
*/
static inline struct ice_vsi *ice_find_vsi(struct ice_pf *pf, u16 vsi_num)
{
int i;
ice_for_each_vsi(pf, i)
if (pf->vsi[i] && pf->vsi[i]->vsi_num == vsi_num)
return pf->vsi[i];
return NULL;
}
/** /**
* ice_is_switchdev_running - check if switchdev is configured * ice_is_switchdev_running - check if switchdev is configured
* @pf: pointer to PF structure * @pf: pointer to PF structure
......
...@@ -647,6 +647,23 @@ void ice_devlink_unregister(struct ice_pf *pf) ...@@ -647,6 +647,23 @@ void ice_devlink_unregister(struct ice_pf *pf)
devlink_unregister(priv_to_devlink(pf)); devlink_unregister(priv_to_devlink(pf));
} }
/**
* ice_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
ice_devlink_set_switch_id(struct ice_pf *pf, struct netdev_phys_item_id *ppid)
{
struct pci_dev *pdev = pf->pdev;
u64 id;
id = pci_get_dsn(pdev);
ppid->id_len = sizeof(id);
put_unaligned_be64(id, &ppid->id);
}
int ice_devlink_register_params(struct ice_pf *pf) int ice_devlink_register_params(struct ice_pf *pf)
{ {
struct devlink *devlink = priv_to_devlink(pf); struct devlink *devlink = priv_to_devlink(pf);
...@@ -704,6 +721,9 @@ int ice_devlink_create_pf_port(struct ice_pf *pf) ...@@ -704,6 +721,9 @@ int ice_devlink_create_pf_port(struct ice_pf *pf)
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL; attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
attrs.phys.port_number = pf->hw.bus.func; attrs.phys.port_number = pf->hw.bus.func;
ice_devlink_set_switch_id(pf, &attrs.switch_id);
devlink_port_attrs_set(devlink_port, &attrs); devlink_port_attrs_set(devlink_port, &attrs);
devlink = priv_to_devlink(pf); devlink = priv_to_devlink(pf);
...@@ -753,13 +773,18 @@ int ice_devlink_create_vf_port(struct ice_vf *vf) ...@@ -753,13 +773,18 @@ int ice_devlink_create_vf_port(struct ice_vf *vf)
pf = vf->pf; pf = vf->pf;
dev = ice_pf_to_dev(pf); dev = ice_pf_to_dev(pf);
vsi = ice_get_vf_vsi(vf);
devlink_port = &vf->devlink_port; devlink_port = &vf->devlink_port;
vsi = ice_get_vf_vsi(vf);
if (!vsi)
return -EINVAL;
attrs.flavour = DEVLINK_PORT_FLAVOUR_PCI_VF; attrs.flavour = DEVLINK_PORT_FLAVOUR_PCI_VF;
attrs.pci_vf.pf = pf->hw.bus.func; attrs.pci_vf.pf = pf->hw.bus.func;
attrs.pci_vf.vf = vf->vf_id; attrs.pci_vf.vf = vf->vf_id;
ice_devlink_set_switch_id(pf, &attrs.switch_id);
devlink_port_attrs_set(devlink_port, &attrs); devlink_port_attrs_set(devlink_port, &attrs);
devlink = priv_to_devlink(pf); devlink = priv_to_devlink(pf);
......
...@@ -76,8 +76,7 @@ static void ice_gnss_read(struct kthread_work *work) ...@@ -76,8 +76,7 @@ static void ice_gnss_read(struct kthread_work *work)
for (i = 0; i < data_len; i += bytes_read) { for (i = 0; i < data_len; i += bytes_read) {
u16 bytes_left = data_len - i; u16 bytes_left = data_len - i;
bytes_read = bytes_left < ICE_MAX_I2C_DATA_SIZE ? bytes_left : bytes_read = min_t(typeof(bytes_left), bytes_left, ICE_MAX_I2C_DATA_SIZE);
ICE_MAX_I2C_DATA_SIZE;
err = ice_aq_read_i2c(hw, link_topo, ICE_GNSS_UBX_I2C_BUS_ADDR, err = ice_aq_read_i2c(hw, link_topo, ICE_GNSS_UBX_I2C_BUS_ADDR,
cpu_to_le16(ICE_GNSS_UBX_EMPTY_DATA), cpu_to_le16(ICE_GNSS_UBX_EMPTY_DATA),
......
...@@ -47,21 +47,6 @@ void ice_send_event_to_aux(struct ice_pf *pf, struct iidc_event *event) ...@@ -47,21 +47,6 @@ void ice_send_event_to_aux(struct ice_pf *pf, struct iidc_event *event)
device_unlock(&pf->adev->dev); device_unlock(&pf->adev->dev);
} }
/**
* ice_find_vsi - Find the VSI from VSI ID
* @pf: The PF pointer to search in
* @vsi_num: The VSI ID to search for
*/
static struct ice_vsi *ice_find_vsi(struct ice_pf *pf, u16 vsi_num)
{
int i;
ice_for_each_vsi(pf, i)
if (pf->vsi[i] && pf->vsi[i]->vsi_num == vsi_num)
return pf->vsi[i];
return NULL;
}
/** /**
* ice_add_rdma_qset - Add Leaf Node for RDMA Qset * ice_add_rdma_qset - Add Leaf Node for RDMA Qset
* @pf: PF struct * @pf: PF struct
......
...@@ -296,6 +296,20 @@ static int ice_clear_promisc(struct ice_vsi *vsi, u8 promisc_m) ...@@ -296,6 +296,20 @@ static int ice_clear_promisc(struct ice_vsi *vsi, u8 promisc_m)
return status; return status;
} }
/**
* ice_get_devlink_port - Get devlink port from netdev
* @netdev: the netdevice structure
*/
static struct devlink_port *ice_get_devlink_port(struct net_device *netdev)
{
struct ice_pf *pf = ice_netdev_to_pf(netdev);
if (!ice_is_switchdev_running(pf))
return NULL;
return &pf->devlink_port;
}
/** /**
* ice_vsi_sync_fltr - Update the VSI filter list to the HW * ice_vsi_sync_fltr - Update the VSI filter list to the HW
* @vsi: ptr to the VSI * @vsi: ptr to the VSI
...@@ -8926,4 +8940,5 @@ static const struct net_device_ops ice_netdev_ops = { ...@@ -8926,4 +8940,5 @@ static const struct net_device_ops ice_netdev_ops = {
.ndo_bpf = ice_xdp, .ndo_bpf = ice_xdp,
.ndo_xdp_xmit = ice_xdp_xmit, .ndo_xdp_xmit = ice_xdp_xmit,
.ndo_xsk_wakeup = ice_xsk_wakeup, .ndo_xsk_wakeup = ice_xsk_wakeup,
.ndo_get_devlink_port = ice_get_devlink_port,
}; };
...@@ -293,8 +293,13 @@ static int ice_repr_add(struct ice_vf *vf) ...@@ -293,8 +293,13 @@ static int ice_repr_add(struct ice_vf *vf)
struct ice_q_vector *q_vector; struct ice_q_vector *q_vector;
struct ice_netdev_priv *np; struct ice_netdev_priv *np;
struct ice_repr *repr; struct ice_repr *repr;
struct ice_vsi *vsi;
int err; int err;
vsi = ice_get_vf_vsi(vf);
if (!vsi)
return -EINVAL;
repr = kzalloc(sizeof(*repr), GFP_KERNEL); repr = kzalloc(sizeof(*repr), GFP_KERNEL);
if (!repr) if (!repr)
return -ENOMEM; return -ENOMEM;
...@@ -313,7 +318,7 @@ static int ice_repr_add(struct ice_vf *vf) ...@@ -313,7 +318,7 @@ static int ice_repr_add(struct ice_vf *vf)
goto err_alloc; goto err_alloc;
} }
repr->src_vsi = ice_get_vf_vsi(vf); repr->src_vsi = vsi;
repr->vf = vf; repr->vf = vf;
vf->repr = repr; vf->repr = repr;
np = netdev_priv(repr->netdev); np = netdev_priv(repr->netdev);
......
...@@ -46,7 +46,12 @@ static void ice_free_vf_entries(struct ice_pf *pf) ...@@ -46,7 +46,12 @@ static void ice_free_vf_entries(struct ice_pf *pf)
*/ */
static void ice_vf_vsi_release(struct ice_vf *vf) static void ice_vf_vsi_release(struct ice_vf *vf)
{ {
ice_vsi_release(ice_get_vf_vsi(vf)); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi))
return;
ice_vsi_release(vsi);
ice_vf_invalidate_vsi(vf); ice_vf_invalidate_vsi(vf);
} }
...@@ -104,6 +109,8 @@ static void ice_dis_vf_mappings(struct ice_vf *vf) ...@@ -104,6 +109,8 @@ static void ice_dis_vf_mappings(struct ice_vf *vf)
hw = &pf->hw; hw = &pf->hw;
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi))
return;
dev = ice_pf_to_dev(pf); dev = ice_pf_to_dev(pf);
wr32(hw, VPINT_ALLOC(vf->vf_id), 0); wr32(hw, VPINT_ALLOC(vf->vf_id), 0);
...@@ -341,6 +348,9 @@ static void ice_ena_vf_q_mappings(struct ice_vf *vf, u16 max_txq, u16 max_rxq) ...@@ -341,6 +348,9 @@ static void ice_ena_vf_q_mappings(struct ice_vf *vf, u16 max_txq, u16 max_rxq)
struct ice_hw *hw = &vf->pf->hw; struct ice_hw *hw = &vf->pf->hw;
u32 reg; u32 reg;
if (WARN_ON(!vsi))
return;
/* set regardless of mapping mode */ /* set regardless of mapping mode */
wr32(hw, VPLAN_TXQ_MAPENA(vf->vf_id), VPLAN_TXQ_MAPENA_TX_ENA_M); wr32(hw, VPLAN_TXQ_MAPENA(vf->vf_id), VPLAN_TXQ_MAPENA_TX_ENA_M);
...@@ -386,6 +396,9 @@ static void ice_ena_vf_mappings(struct ice_vf *vf) ...@@ -386,6 +396,9 @@ static void ice_ena_vf_mappings(struct ice_vf *vf)
{ {
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi))
return;
ice_ena_vf_msix_mappings(vf); ice_ena_vf_msix_mappings(vf);
ice_ena_vf_q_mappings(vf, vsi->alloc_txq, vsi->alloc_rxq); ice_ena_vf_q_mappings(vf, vsi->alloc_txq, vsi->alloc_rxq);
} }
...@@ -1128,6 +1141,8 @@ static struct ice_vf *ice_get_vf_from_pfq(struct ice_pf *pf, u16 pfq) ...@@ -1128,6 +1141,8 @@ static struct ice_vf *ice_get_vf_from_pfq(struct ice_pf *pf, u16 pfq)
u16 rxq_idx; u16 rxq_idx;
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (!vsi)
continue;
ice_for_each_rxq(vsi, rxq_idx) ice_for_each_rxq(vsi, rxq_idx)
if (vsi->rxq_map[rxq_idx] == pfq) { if (vsi->rxq_map[rxq_idx] == pfq) {
...@@ -1521,8 +1536,15 @@ static int ice_calc_all_vfs_min_tx_rate(struct ice_pf *pf) ...@@ -1521,8 +1536,15 @@ static int ice_calc_all_vfs_min_tx_rate(struct ice_pf *pf)
static bool static bool
ice_min_tx_rate_oversubscribed(struct ice_vf *vf, int min_tx_rate) ice_min_tx_rate_oversubscribed(struct ice_vf *vf, int min_tx_rate)
{ {
int link_speed_mbps = ice_get_link_speed_mbps(ice_get_vf_vsi(vf)); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
int all_vfs_min_tx_rate = ice_calc_all_vfs_min_tx_rate(vf->pf); int all_vfs_min_tx_rate;
int link_speed_mbps;
if (WARN_ON(!vsi))
return false;
link_speed_mbps = ice_get_link_speed_mbps(vsi);
all_vfs_min_tx_rate = ice_calc_all_vfs_min_tx_rate(vf->pf);
/* this VF's previous rate is being overwritten */ /* this VF's previous rate is being overwritten */
all_vfs_min_tx_rate -= vf->min_tx_rate; all_vfs_min_tx_rate -= vf->min_tx_rate;
...@@ -1566,6 +1588,10 @@ ice_set_vf_bw(struct net_device *netdev, int vf_id, int min_tx_rate, ...@@ -1566,6 +1588,10 @@ ice_set_vf_bw(struct net_device *netdev, int vf_id, int min_tx_rate,
goto out_put_vf; goto out_put_vf;
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (!vsi) {
ret = -EINVAL;
goto out_put_vf;
}
/* when max_tx_rate is zero that means no max Tx rate limiting, so only /* when max_tx_rate is zero that means no max Tx rate limiting, so only
* check if max_tx_rate is non-zero * check if max_tx_rate is non-zero
......
...@@ -5992,9 +5992,12 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups, ...@@ -5992,9 +5992,12 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
word_cnt++; word_cnt++;
} }
if (!word_cnt || word_cnt > ICE_MAX_CHAIN_WORDS) if (!word_cnt)
return -EINVAL; return -EINVAL;
if (word_cnt > ICE_MAX_CHAIN_WORDS)
return -ENOSPC;
/* locate a dummy packet */ /* locate a dummy packet */
profile = ice_find_dummy_packet(lkups, lkups_cnt, rinfo->tun_type); profile = ice_find_dummy_packet(lkups, lkups_cnt, rinfo->tun_type);
......
...@@ -622,7 +622,6 @@ ice_add_tc_flower_adv_fltr(struct ice_vsi *vsi, ...@@ -622,7 +622,6 @@ ice_add_tc_flower_adv_fltr(struct ice_vsi *vsi,
} else if (ret) { } else if (ret) {
NL_SET_ERR_MSG_MOD(tc_fltr->extack, NL_SET_ERR_MSG_MOD(tc_fltr->extack,
"Unable to add filter due to error"); "Unable to add filter due to error");
ret = -EIO;
goto exit; goto exit;
} }
......
...@@ -220,8 +220,10 @@ static void ice_vf_clear_counters(struct ice_vf *vf) ...@@ -220,8 +220,10 @@ static void ice_vf_clear_counters(struct ice_vf *vf)
{ {
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
if (vsi)
vsi->num_vlan = 0;
vf->num_mac = 0; vf->num_mac = 0;
vsi->num_vlan = 0;
memset(&vf->mdd_tx_events, 0, sizeof(vf->mdd_tx_events)); memset(&vf->mdd_tx_events, 0, sizeof(vf->mdd_tx_events));
memset(&vf->mdd_rx_events, 0, sizeof(vf->mdd_rx_events)); memset(&vf->mdd_rx_events, 0, sizeof(vf->mdd_rx_events));
} }
...@@ -251,6 +253,9 @@ static int ice_vf_rebuild_vsi(struct ice_vf *vf) ...@@ -251,6 +253,9 @@ static int ice_vf_rebuild_vsi(struct ice_vf *vf)
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
struct ice_pf *pf = vf->pf; struct ice_pf *pf = vf->pf;
if (WARN_ON(!vsi))
return -EINVAL;
if (ice_vsi_rebuild(vsi, true)) { if (ice_vsi_rebuild(vsi, true)) {
dev_err(ice_pf_to_dev(pf), "failed to rebuild VF %d VSI\n", dev_err(ice_pf_to_dev(pf), "failed to rebuild VF %d VSI\n",
vf->vf_id); vf->vf_id);
...@@ -354,12 +359,12 @@ ice_vf_clear_vsi_promisc(struct ice_vf *vf, struct ice_vsi *vsi, u8 promisc_m) ...@@ -354,12 +359,12 @@ ice_vf_clear_vsi_promisc(struct ice_vf *vf, struct ice_vsi *vsi, u8 promisc_m)
* ice_reset_all_vfs - reset all allocated VFs in one go * ice_reset_all_vfs - reset all allocated VFs in one go
* @pf: pointer to the PF structure * @pf: pointer to the PF structure
* *
* Reset all VFs at once, in response to a PF or other device reset.
*
* First, tell the hardware to reset each VF, then do all the waiting in one * First, tell the hardware to reset each VF, then do all the waiting in one
* chunk, and finally finish restoring each VF after the wait. This is useful * chunk, and finally finish restoring each VF after the wait. This is useful
* during PF routines which need to reset all VFs, as otherwise it must perform * during PF routines which need to reset all VFs, as otherwise it must perform
* these resets in a serialized fashion. * these resets in a serialized fashion.
*
* Returns true if any VFs were reset, and false otherwise.
*/ */
void ice_reset_all_vfs(struct ice_pf *pf) void ice_reset_all_vfs(struct ice_pf *pf)
{ {
...@@ -472,8 +477,8 @@ static void ice_notify_vf_reset(struct ice_vf *vf) ...@@ -472,8 +477,8 @@ static void ice_notify_vf_reset(struct ice_vf *vf)
* ICE_VF_RESET_NOTIFY - Send VF a notification prior to reset * ICE_VF_RESET_NOTIFY - Send VF a notification prior to reset
* ICE_VF_RESET_LOCK - Acquire VF cfg_lock before resetting * ICE_VF_RESET_LOCK - Acquire VF cfg_lock before resetting
* *
* Returns 0 if the VF is currently in reset, if the resets are disabled, or * Returns 0 if the VF is currently in reset, if resets are disabled, or if
* if the VF resets successfully. Returns an error code if the VF fails to * the VF resets successfully. Returns an error code if the VF fails to
* rebuild. * rebuild.
*/ */
int ice_reset_vf(struct ice_vf *vf, u32 flags) int ice_reset_vf(struct ice_vf *vf, u32 flags)
...@@ -514,6 +519,10 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags) ...@@ -514,6 +519,10 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
ice_trigger_vf_reset(vf, flags & ICE_VF_RESET_VFLR, false); ice_trigger_vf_reset(vf, flags & ICE_VF_RESET_VFLR, false);
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi)) {
err = -EIO;
goto out_unlock;
}
ice_dis_vf_qs(vf); ice_dis_vf_qs(vf);
...@@ -572,6 +581,11 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags) ...@@ -572,6 +581,11 @@ int ice_reset_vf(struct ice_vf *vf, u32 flags)
vf->vf_ops->post_vsi_rebuild(vf); vf->vf_ops->post_vsi_rebuild(vf);
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi)) {
err = -EINVAL;
goto out_unlock;
}
ice_eswitch_update_repr(vsi); ice_eswitch_update_repr(vsi);
ice_eswitch_replay_vf_mac_rule(vf); ice_eswitch_replay_vf_mac_rule(vf);
...@@ -610,6 +624,9 @@ void ice_dis_vf_qs(struct ice_vf *vf) ...@@ -610,6 +624,9 @@ void ice_dis_vf_qs(struct ice_vf *vf)
{ {
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi))
return;
ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, vf->vf_id); ice_vsi_stop_lan_tx_rings(vsi, ICE_NO_RESET, vf->vf_id);
ice_vsi_stop_all_rx_rings(vsi); ice_vsi_stop_all_rx_rings(vsi);
ice_set_vf_state_qs_dis(vf); ice_set_vf_state_qs_dis(vf);
...@@ -640,6 +657,13 @@ struct ice_port_info *ice_vf_get_port_info(struct ice_vf *vf) ...@@ -640,6 +657,13 @@ struct ice_port_info *ice_vf_get_port_info(struct ice_vf *vf)
return vf->pf->hw.port_info; return vf->pf->hw.port_info;
} }
/**
* ice_cfg_mac_antispoof - Configure MAC antispoof checking behavior
* @vsi: the VSI to configure
* @enable: whether to enable or disable the spoof checking
*
* Configure a VSI to enable (or disable) spoof checking behavior.
*/
static int ice_cfg_mac_antispoof(struct ice_vsi *vsi, bool enable) static int ice_cfg_mac_antispoof(struct ice_vsi *vsi, bool enable)
{ {
struct ice_vsi_ctx *ctx; struct ice_vsi_ctx *ctx;
...@@ -790,6 +814,9 @@ static int ice_vf_rebuild_host_mac_cfg(struct ice_vf *vf) ...@@ -790,6 +814,9 @@ static int ice_vf_rebuild_host_mac_cfg(struct ice_vf *vf)
u8 broadcast[ETH_ALEN]; u8 broadcast[ETH_ALEN];
int status; int status;
if (WARN_ON(!vsi))
return -EINVAL;
if (ice_is_eswitch_mode_switchdev(vf->pf)) if (ice_is_eswitch_mode_switchdev(vf->pf))
return 0; return 0;
...@@ -875,6 +902,9 @@ static int ice_vf_rebuild_host_tx_rate_cfg(struct ice_vf *vf) ...@@ -875,6 +902,9 @@ static int ice_vf_rebuild_host_tx_rate_cfg(struct ice_vf *vf)
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
int err; int err;
if (WARN_ON(!vsi))
return -EINVAL;
if (vf->min_tx_rate) { if (vf->min_tx_rate) {
err = ice_set_min_bw_limit(vsi, (u64)vf->min_tx_rate * 1000); err = ice_set_min_bw_limit(vsi, (u64)vf->min_tx_rate * 1000);
if (err) { if (err) {
...@@ -938,6 +968,9 @@ void ice_vf_rebuild_host_cfg(struct ice_vf *vf) ...@@ -938,6 +968,9 @@ void ice_vf_rebuild_host_cfg(struct ice_vf *vf)
struct device *dev = ice_pf_to_dev(vf->pf); struct device *dev = ice_pf_to_dev(vf->pf);
struct ice_vsi *vsi = ice_get_vf_vsi(vf); struct ice_vsi *vsi = ice_get_vf_vsi(vf);
if (WARN_ON(!vsi))
return;
ice_vf_set_host_trust_cfg(vf); ice_vf_set_host_trust_cfg(vf);
if (ice_vf_rebuild_host_mac_cfg(vf)) if (ice_vf_rebuild_host_mac_cfg(vf))
......
...@@ -176,7 +176,7 @@ static inline u16 ice_vf_get_port_vlan_tpid(struct ice_vf *vf) ...@@ -176,7 +176,7 @@ static inline u16 ice_vf_get_port_vlan_tpid(struct ice_vf *vf)
* ice_for_each_vf - Iterate over each VF entry * ice_for_each_vf - Iterate over each VF entry
* @pf: pointer to the PF private structure * @pf: pointer to the PF private structure
* @bkt: bucket index used for iteration * @bkt: bucket index used for iteration
* @vf: pointer to the VF entry currently being processed in the loop. * @vf: pointer to the VF entry currently being processed in the loop
* *
* The bkt variable is an unsigned integer iterator used to traverse the VF * The bkt variable is an unsigned integer iterator used to traverse the VF
* entries. It is *not* guaranteed to be the VF's vf_id. Do not assume it is. * entries. It is *not* guaranteed to be the VF's vf_id. Do not assume it is.
...@@ -192,7 +192,7 @@ static inline u16 ice_vf_get_port_vlan_tpid(struct ice_vf *vf) ...@@ -192,7 +192,7 @@ static inline u16 ice_vf_get_port_vlan_tpid(struct ice_vf *vf)
* ice_for_each_vf_rcu - Iterate over each VF entry protected by RCU * ice_for_each_vf_rcu - Iterate over each VF entry protected by RCU
* @pf: pointer to the PF private structure * @pf: pointer to the PF private structure
* @bkt: bucket index used for iteration * @bkt: bucket index used for iteration
* @vf: pointer to the VF entry currently being processed in the loop. * @vf: pointer to the VF entry currently being processed in the loop
* *
* The bkt variable is an unsigned integer iterator used to traverse the VF * The bkt variable is an unsigned integer iterator used to traverse the VF
* entries. It is *not* guaranteed to be the VF's vf_id. Do not assume it is. * entries. It is *not* guaranteed to be the VF's vf_id. Do not assume it is.
......
...@@ -514,24 +514,6 @@ static void ice_vc_reset_vf_msg(struct ice_vf *vf) ...@@ -514,24 +514,6 @@ static void ice_vc_reset_vf_msg(struct ice_vf *vf)
ice_reset_vf(vf, 0); ice_reset_vf(vf, 0);
} }
/**
* ice_find_vsi_from_id
* @pf: the PF structure to search for the VSI
* @id: ID of the VSI it is searching for
*
* searches for the VSI with the given ID
*/
static struct ice_vsi *ice_find_vsi_from_id(struct ice_pf *pf, u16 id)
{
int i;
ice_for_each_vsi(pf, i)
if (pf->vsi[i] && pf->vsi[i]->vsi_num == id)
return pf->vsi[i];
return NULL;
}
/** /**
* ice_vc_isvalid_vsi_id * ice_vc_isvalid_vsi_id
* @vf: pointer to the VF info * @vf: pointer to the VF info
...@@ -544,7 +526,7 @@ bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id) ...@@ -544,7 +526,7 @@ bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id)
struct ice_pf *pf = vf->pf; struct ice_pf *pf = vf->pf;
struct ice_vsi *vsi; struct ice_vsi *vsi;
vsi = ice_find_vsi_from_id(pf, vsi_id); vsi = ice_find_vsi(pf, vsi_id);
return (vsi && (vsi->vf == vf)); return (vsi && (vsi->vf == vf));
} }
...@@ -559,7 +541,7 @@ bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id) ...@@ -559,7 +541,7 @@ bool ice_vc_isvalid_vsi_id(struct ice_vf *vf, u16 vsi_id)
*/ */
static bool ice_vc_isvalid_q_id(struct ice_vf *vf, u16 vsi_id, u8 qid) static bool ice_vc_isvalid_q_id(struct ice_vf *vf, u16 vsi_id, u8 qid)
{ {
struct ice_vsi *vsi = ice_find_vsi_from_id(vf->pf, vsi_id); struct ice_vsi *vsi = ice_find_vsi(vf->pf, vsi_id);
/* allocated Tx and Rx queues should be always equal for VF VSI */ /* allocated Tx and Rx queues should be always equal for VF VSI */
return (vsi && (qid < vsi->alloc_txq)); return (vsi && (qid < vsi->alloc_txq));
} }
...@@ -2360,6 +2342,11 @@ static int ice_vc_ena_vlan_stripping(struct ice_vf *vf) ...@@ -2360,6 +2342,11 @@ static int ice_vc_ena_vlan_stripping(struct ice_vf *vf)
} }
vsi = ice_get_vf_vsi(vf); vsi = ice_get_vf_vsi(vf);
if (!vsi) {
v_ret = VIRTCHNL_STATUS_ERR_PARAM;
goto error_param;
}
if (vsi->inner_vlan_ops.ena_stripping(vsi, ETH_P_8021Q)) if (vsi->inner_vlan_ops.ena_stripping(vsi, ETH_P_8021Q))
v_ret = VIRTCHNL_STATUS_ERR_PARAM; v_ret = VIRTCHNL_STATUS_ERR_PARAM;
......
...@@ -1344,12 +1344,17 @@ static void ice_vf_fdir_dump_info(struct ice_vf *vf) ...@@ -1344,12 +1344,17 @@ static void ice_vf_fdir_dump_info(struct ice_vf *vf)
pf = vf->pf; pf = vf->pf;
hw = &pf->hw; hw = &pf->hw;
dev = ice_pf_to_dev(pf); dev = ice_pf_to_dev(pf);
vf_vsi = pf->vsi[vf->lan_vsi_idx]; vf_vsi = ice_get_vf_vsi(vf);
if (!vf_vsi) {
dev_dbg(dev, "VF %d: invalid VSI pointer\n", vf->vf_id);
return;
}
vsi_num = ice_get_hw_vsi_num(hw, vf_vsi->idx); vsi_num = ice_get_hw_vsi_num(hw, vf_vsi->idx);
fd_size = rd32(hw, VSIQF_FD_SIZE(vsi_num)); fd_size = rd32(hw, VSIQF_FD_SIZE(vsi_num));
fd_cnt = rd32(hw, VSIQF_FD_CNT(vsi_num)); fd_cnt = rd32(hw, VSIQF_FD_CNT(vsi_num));
dev_dbg(dev, "VF %d: space allocated: guar:0x%x, be:0x%x, space consumed: guar:0x%x, be:0x%x", dev_dbg(dev, "VF %d: space allocated: guar:0x%x, be:0x%x, space consumed: guar:0x%x, be:0x%x\n",
vf->vf_id, vf->vf_id,
(fd_size & VSIQF_FD_CNT_FD_GCNT_M) >> VSIQF_FD_CNT_FD_GCNT_S, (fd_size & VSIQF_FD_CNT_FD_GCNT_M) >> VSIQF_FD_CNT_FD_GCNT_S,
(fd_size & VSIQF_FD_CNT_FD_BCNT_M) >> VSIQF_FD_CNT_FD_BCNT_S, (fd_size & VSIQF_FD_CNT_FD_BCNT_M) >> VSIQF_FD_CNT_FD_BCNT_S,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment