mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:44:45 +01:00
Merge branch '200GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2026-02-19 (idpf, ice, i40e, ixgbevf, e1000e) For idpf: Li Li moves the check for software marker to occur after incrementing next to clean to avoid re-encountering the same packet. He also adds a couple of checks to prevent NULL pointer dereferences and NULLs rss_key, after free, in error path so that later checks are properly evaluated. Brian Vazquez adjusts IRQ naming to have correlation with netdev naming. Sreedevi removes validation of action type as part of ntuple rule deletion. For ice: Aaron Ma breaks RDMA initialization into two steps and adjusts calls so that VSIs are entirely configured before plugging. Michal Schmidt fixes initialization of loopback VSI to have proper resources allocated to allow for loopback testing to occur. For i40e: Thomas Gleixner fixes a leak of preempt count by replacing get_cpu() with smp_processor_id(). For ixgbevf: Jedrzej adds a check for mailbox version before attempting to call an associated link state call that is supported in that mailbox version. For e1000e: Vitaly clears power gating feature for Panther Lake systems to avoid packet issues. * '200GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: e1000e: clear DPG_EN after reset to avoid autonomous power-gating e1000e: introduce new board type for Panther Lake PCH ixgbevf: fix link setup issue i40e: Fix preempt count leak in napi poll tracepoint ice: fix crash in ethtool offline loopback test ice: recap the VSI and QoS info after rebuild idpf: Fix flow rule delete failure due to invalid validation idpf: change IRQ naming to match netdev and ethtool queue numbering idpf: nullify pointers after they are freed idpf: skip deallocating txq group's txqs if it is NULL idpf: skip deallocating bufq_sets from rx_qgrp if it is NULL idpf: increment completion queue next_to_clean in sw marker wait routine ==================== Link: https://patch.msgid.link/20260225211546.1949260-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
6df0022b6c
16 changed files with 114 additions and 38 deletions
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
/* Extended Device Control */
|
||||
#define E1000_CTRL_EXT_LPCD 0x00000004 /* LCD Power Cycle Done */
|
||||
#define E1000_CTRL_EXT_DPG_EN 0x00000008 /* Dynamic Power Gating Enable */
|
||||
#define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Definable Pin 3 */
|
||||
#define E1000_CTRL_EXT_FORCE_SMBUS 0x00000800 /* Force SMBus mode */
|
||||
#define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */
|
||||
|
|
|
|||
|
|
@ -117,7 +117,8 @@ enum e1000_boards {
|
|||
board_pch_cnp,
|
||||
board_pch_tgp,
|
||||
board_pch_adp,
|
||||
board_pch_mtp
|
||||
board_pch_mtp,
|
||||
board_pch_ptp
|
||||
};
|
||||
|
||||
struct e1000_ps_page {
|
||||
|
|
@ -527,6 +528,7 @@ extern const struct e1000_info e1000_pch_cnp_info;
|
|||
extern const struct e1000_info e1000_pch_tgp_info;
|
||||
extern const struct e1000_info e1000_pch_adp_info;
|
||||
extern const struct e1000_info e1000_pch_mtp_info;
|
||||
extern const struct e1000_info e1000_pch_ptp_info;
|
||||
extern const struct e1000_info e1000_es2_info;
|
||||
|
||||
void e1000e_ptp_init(struct e1000_adapter *adapter);
|
||||
|
|
|
|||
|
|
@ -118,8 +118,6 @@ struct e1000_hw;
|
|||
#define E1000_DEV_ID_PCH_ARL_I219_V24 0x57A1
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_LM25 0x57B3
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_V25 0x57B4
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_LM26 0x57B5
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_V26 0x57B6
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_LM27 0x57B7
|
||||
#define E1000_DEV_ID_PCH_PTP_I219_V27 0x57B8
|
||||
#define E1000_DEV_ID_PCH_NVL_I219_LM29 0x57B9
|
||||
|
|
|
|||
|
|
@ -528,7 +528,7 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw)
|
|||
|
||||
phy->id = e1000_phy_unknown;
|
||||
|
||||
if (hw->mac.type == e1000_pch_mtp) {
|
||||
if (hw->mac.type == e1000_pch_mtp || hw->mac.type == e1000_pch_ptp) {
|
||||
phy->retry_count = 2;
|
||||
e1000e_enable_phy_retry(hw);
|
||||
}
|
||||
|
|
@ -4932,6 +4932,15 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
|
|||
reg |= E1000_KABGTXD_BGSQLBIAS;
|
||||
ew32(KABGTXD, reg);
|
||||
|
||||
/* The hardware reset value of the DPG_EN bit is 1.
|
||||
* Clear DPG_EN to prevent unexpected autonomous power gating.
|
||||
*/
|
||||
if (hw->mac.type >= e1000_pch_ptp) {
|
||||
reg = er32(CTRL_EXT);
|
||||
reg &= ~E1000_CTRL_EXT_DPG_EN;
|
||||
ew32(CTRL_EXT, reg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -6208,3 +6217,23 @@ const struct e1000_info e1000_pch_mtp_info = {
|
|||
.phy_ops = &ich8_phy_ops,
|
||||
.nvm_ops = &spt_nvm_ops,
|
||||
};
|
||||
|
||||
const struct e1000_info e1000_pch_ptp_info = {
|
||||
.mac = e1000_pch_ptp,
|
||||
.flags = FLAG_IS_ICH
|
||||
| FLAG_HAS_WOL
|
||||
| FLAG_HAS_HW_TIMESTAMP
|
||||
| FLAG_HAS_CTRLEXT_ON_LOAD
|
||||
| FLAG_HAS_AMT
|
||||
| FLAG_HAS_FLASH
|
||||
| FLAG_HAS_JUMBO_FRAMES
|
||||
| FLAG_APME_IN_WUC,
|
||||
.flags2 = FLAG2_HAS_PHY_STATS
|
||||
| FLAG2_HAS_EEE,
|
||||
.pba = 26,
|
||||
.max_hw_frame_size = 9022,
|
||||
.get_variants = e1000_get_variants_ich8lan,
|
||||
.mac_ops = &ich8_mac_ops,
|
||||
.phy_ops = &ich8_phy_ops,
|
||||
.nvm_ops = &spt_nvm_ops,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -55,6 +55,7 @@ static const struct e1000_info *e1000_info_tbl[] = {
|
|||
[board_pch_tgp] = &e1000_pch_tgp_info,
|
||||
[board_pch_adp] = &e1000_pch_adp_info,
|
||||
[board_pch_mtp] = &e1000_pch_mtp_info,
|
||||
[board_pch_ptp] = &e1000_pch_ptp_info,
|
||||
};
|
||||
|
||||
struct e1000_reg_info {
|
||||
|
|
@ -7922,14 +7923,12 @@ static const struct pci_device_id e1000_pci_tbl[] = {
|
|||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_LNP_I219_V21), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ARL_I219_LM24), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_ARL_I219_V24), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM25), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V25), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM26), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V26), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM27), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V27), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_LM29), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_V29), board_pch_mtp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM25), board_pch_ptp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V25), board_pch_ptp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_LM27), board_pch_ptp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_PTP_I219_V27), board_pch_ptp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_LM29), board_pch_ptp },
|
||||
{ PCI_VDEVICE(INTEL, E1000_DEV_ID_PCH_NVL_I219_V29), board_pch_ptp },
|
||||
|
||||
{ 0, 0, 0, 0, 0, 0, 0 } /* terminate list */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ TRACE_EVENT(i40e_napi_poll,
|
|||
__entry->rx_clean_complete = rx_clean_complete;
|
||||
__entry->tx_clean_complete = tx_clean_complete;
|
||||
__entry->irq_num = q->irq_num;
|
||||
__entry->curr_cpu = get_cpu();
|
||||
__entry->curr_cpu = smp_processor_id();
|
||||
__assign_str(qname);
|
||||
__assign_str(dev_name);
|
||||
__assign_bitmask(irq_affinity, cpumask_bits(&q->affinity_mask),
|
||||
|
|
|
|||
|
|
@ -987,6 +987,7 @@ int ice_schedule_reset(struct ice_pf *pf, enum ice_reset_req reset);
|
|||
void ice_print_link_msg(struct ice_vsi *vsi, bool isup);
|
||||
int ice_plug_aux_dev(struct ice_pf *pf);
|
||||
void ice_unplug_aux_dev(struct ice_pf *pf);
|
||||
void ice_rdma_finalize_setup(struct ice_pf *pf);
|
||||
int ice_init_rdma(struct ice_pf *pf);
|
||||
void ice_deinit_rdma(struct ice_pf *pf);
|
||||
bool ice_is_wol_supported(struct ice_hw *hw);
|
||||
|
|
|
|||
|
|
@ -124,6 +124,8 @@ static int ice_vsi_alloc_q_vector(struct ice_vsi *vsi, u16 v_idx)
|
|||
if (vsi->type == ICE_VSI_VF) {
|
||||
ice_calc_vf_reg_idx(vsi->vf, q_vector);
|
||||
goto out;
|
||||
} else if (vsi->type == ICE_VSI_LB) {
|
||||
goto skip_alloc;
|
||||
} else if (vsi->type == ICE_VSI_CTRL && vsi->vf) {
|
||||
struct ice_vsi *ctrl_vsi = ice_get_vf_ctrl_vsi(pf, vsi);
|
||||
|
||||
|
|
@ -662,7 +664,8 @@ static int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
|
|||
u32 rx_buf_len;
|
||||
int err;
|
||||
|
||||
if (ring->vsi->type == ICE_VSI_PF || ring->vsi->type == ICE_VSI_SF) {
|
||||
if (ring->vsi->type == ICE_VSI_PF || ring->vsi->type == ICE_VSI_SF ||
|
||||
ring->vsi->type == ICE_VSI_LB) {
|
||||
if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) {
|
||||
err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev,
|
||||
ring->q_index,
|
||||
|
|
|
|||
|
|
@ -1289,6 +1289,10 @@ static u64 ice_loopback_test(struct net_device *netdev)
|
|||
test_vsi->netdev = netdev;
|
||||
tx_ring = test_vsi->tx_rings[0];
|
||||
rx_ring = test_vsi->rx_rings[0];
|
||||
/* Dummy q_vector and napi. Fill the minimum required for
|
||||
* ice_rxq_pp_create().
|
||||
*/
|
||||
rx_ring->q_vector->napi.dev = netdev;
|
||||
|
||||
if (ice_lbtest_prepare_rings(test_vsi)) {
|
||||
ret = 2;
|
||||
|
|
|
|||
|
|
@ -360,6 +360,39 @@ void ice_unplug_aux_dev(struct ice_pf *pf)
|
|||
auxiliary_device_uninit(adev);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_rdma_finalize_setup - Complete RDMA setup after VSI is ready
|
||||
* @pf: ptr to ice_pf
|
||||
*
|
||||
* Sets VSI-dependent information and plugs aux device.
|
||||
* Must be called after ice_init_rdma(), ice_vsi_rebuild(), and
|
||||
* ice_dcb_rebuild() complete.
|
||||
*/
|
||||
void ice_rdma_finalize_setup(struct ice_pf *pf)
|
||||
{
|
||||
struct device *dev = ice_pf_to_dev(pf);
|
||||
struct iidc_rdma_priv_dev_info *privd;
|
||||
int ret;
|
||||
|
||||
if (!ice_is_rdma_ena(pf) || !pf->cdev_info)
|
||||
return;
|
||||
|
||||
privd = pf->cdev_info->iidc_priv;
|
||||
if (!privd || !pf->vsi || !pf->vsi[0] || !pf->vsi[0]->netdev)
|
||||
return;
|
||||
|
||||
/* Assign VSI info now that VSI is valid */
|
||||
privd->netdev = pf->vsi[0]->netdev;
|
||||
privd->vport_id = pf->vsi[0]->vsi_num;
|
||||
|
||||
/* Update QoS info after DCB has been rebuilt */
|
||||
ice_setup_dcb_qos_info(pf, &privd->qos_info);
|
||||
|
||||
ret = ice_plug_aux_dev(pf);
|
||||
if (ret)
|
||||
dev_warn(dev, "Failed to plug RDMA aux device: %d\n", ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_init_rdma - initializes PF for RDMA use
|
||||
* @pf: ptr to ice_pf
|
||||
|
|
@ -398,22 +431,14 @@ int ice_init_rdma(struct ice_pf *pf)
|
|||
}
|
||||
|
||||
cdev->iidc_priv = privd;
|
||||
privd->netdev = pf->vsi[0]->netdev;
|
||||
|
||||
privd->hw_addr = (u8 __iomem *)pf->hw.hw_addr;
|
||||
cdev->pdev = pf->pdev;
|
||||
privd->vport_id = pf->vsi[0]->vsi_num;
|
||||
|
||||
pf->cdev_info->rdma_protocol |= IIDC_RDMA_PROTOCOL_ROCEV2;
|
||||
ice_setup_dcb_qos_info(pf, &privd->qos_info);
|
||||
ret = ice_plug_aux_dev(pf);
|
||||
if (ret)
|
||||
goto err_plug_aux_dev;
|
||||
|
||||
return 0;
|
||||
|
||||
err_plug_aux_dev:
|
||||
pf->cdev_info->adev = NULL;
|
||||
xa_erase(&ice_aux_id, pf->aux_idx);
|
||||
err_alloc_xa:
|
||||
kfree(privd);
|
||||
err_privd_alloc:
|
||||
|
|
@ -432,7 +457,6 @@ void ice_deinit_rdma(struct ice_pf *pf)
|
|||
if (!ice_is_rdma_ena(pf))
|
||||
return;
|
||||
|
||||
ice_unplug_aux_dev(pf);
|
||||
xa_erase(&ice_aux_id, pf->aux_idx);
|
||||
kfree(pf->cdev_info->iidc_priv);
|
||||
kfree(pf->cdev_info);
|
||||
|
|
|
|||
|
|
@ -107,10 +107,6 @@ static int ice_vsi_alloc_arrays(struct ice_vsi *vsi)
|
|||
if (!vsi->rxq_map)
|
||||
goto err_rxq_map;
|
||||
|
||||
/* There is no need to allocate q_vectors for a loopback VSI. */
|
||||
if (vsi->type == ICE_VSI_LB)
|
||||
return 0;
|
||||
|
||||
/* allocate memory for q_vector pointers */
|
||||
vsi->q_vectors = devm_kcalloc(dev, vsi->num_q_vectors,
|
||||
sizeof(*vsi->q_vectors), GFP_KERNEL);
|
||||
|
|
@ -241,6 +237,8 @@ static void ice_vsi_set_num_qs(struct ice_vsi *vsi)
|
|||
case ICE_VSI_LB:
|
||||
vsi->alloc_txq = 1;
|
||||
vsi->alloc_rxq = 1;
|
||||
/* A dummy q_vector, no actual IRQ. */
|
||||
vsi->num_q_vectors = 1;
|
||||
break;
|
||||
default:
|
||||
dev_warn(ice_pf_to_dev(pf), "Unknown VSI type %d\n", vsi_type);
|
||||
|
|
@ -2426,14 +2424,21 @@ static int ice_vsi_cfg_def(struct ice_vsi *vsi)
|
|||
}
|
||||
break;
|
||||
case ICE_VSI_LB:
|
||||
ret = ice_vsi_alloc_rings(vsi);
|
||||
ret = ice_vsi_alloc_q_vectors(vsi);
|
||||
if (ret)
|
||||
goto unroll_vsi_init;
|
||||
|
||||
ret = ice_vsi_alloc_rings(vsi);
|
||||
if (ret)
|
||||
goto unroll_alloc_q_vector;
|
||||
|
||||
ret = ice_vsi_alloc_ring_stats(vsi);
|
||||
if (ret)
|
||||
goto unroll_vector_base;
|
||||
|
||||
/* Simply map the dummy q_vector to the only rx_ring */
|
||||
vsi->rx_rings[0]->q_vector = vsi->q_vectors[0];
|
||||
|
||||
break;
|
||||
default:
|
||||
/* clean up the resources and exit */
|
||||
|
|
|
|||
|
|
@ -5138,6 +5138,9 @@ int ice_load(struct ice_pf *pf)
|
|||
if (err)
|
||||
goto err_init_rdma;
|
||||
|
||||
/* Finalize RDMA: VSI already created, assign info and plug device */
|
||||
ice_rdma_finalize_setup(pf);
|
||||
|
||||
ice_service_task_restart(pf);
|
||||
|
||||
clear_bit(ICE_DOWN, pf->state);
|
||||
|
|
@ -5169,6 +5172,7 @@ void ice_unload(struct ice_pf *pf)
|
|||
|
||||
devl_assert_locked(priv_to_devlink(pf));
|
||||
|
||||
ice_unplug_aux_dev(pf);
|
||||
ice_deinit_rdma(pf);
|
||||
ice_deinit_features(pf);
|
||||
ice_tc_indir_block_unregister(vsi);
|
||||
|
|
@ -5595,6 +5599,7 @@ static int ice_suspend(struct device *dev)
|
|||
*/
|
||||
disabled = ice_service_task_stop(pf);
|
||||
|
||||
ice_unplug_aux_dev(pf);
|
||||
ice_deinit_rdma(pf);
|
||||
|
||||
/* Already suspended?, then there is nothing to do */
|
||||
|
|
@ -7859,7 +7864,7 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
|
|||
|
||||
ice_health_clear(pf);
|
||||
|
||||
ice_plug_aux_dev(pf);
|
||||
ice_rdma_finalize_setup(pf);
|
||||
if (ice_is_feature_supported(pf, ICE_F_SRIOV_LAG))
|
||||
ice_lag_rebuild(pf);
|
||||
|
||||
|
|
|
|||
|
|
@ -307,9 +307,6 @@ static int idpf_del_flow_steer(struct net_device *netdev,
|
|||
vport_config = vport->adapter->vport_config[np->vport_idx];
|
||||
user_config = &vport_config->user_config;
|
||||
|
||||
if (!idpf_sideband_action_ena(vport, fsp))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
rule = kzalloc_flex(*rule, rule_info, 1);
|
||||
if (!rule)
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -1318,6 +1318,7 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,
|
|||
|
||||
free_rss_key:
|
||||
kfree(rss_data->rss_key);
|
||||
rss_data->rss_key = NULL;
|
||||
free_qreg_chunks:
|
||||
idpf_vport_deinit_queue_reg_chunks(adapter->vport_config[idx]);
|
||||
free_vector_idxs:
|
||||
|
|
|
|||
|
|
@ -1314,6 +1314,9 @@ static void idpf_txq_group_rel(struct idpf_q_vec_rsrc *rsrc)
|
|||
struct idpf_txq_group *txq_grp = &rsrc->txq_grps[i];
|
||||
|
||||
for (unsigned int j = 0; j < txq_grp->num_txq; j++) {
|
||||
if (!txq_grp->txqs[j])
|
||||
continue;
|
||||
|
||||
if (idpf_queue_has(FLOW_SCH_EN, txq_grp->txqs[j])) {
|
||||
kfree(txq_grp->txqs[j]->refillq);
|
||||
txq_grp->txqs[j]->refillq = NULL;
|
||||
|
|
@ -1339,6 +1342,9 @@ static void idpf_txq_group_rel(struct idpf_q_vec_rsrc *rsrc)
|
|||
*/
|
||||
static void idpf_rxq_sw_queue_rel(struct idpf_rxq_group *rx_qgrp)
|
||||
{
|
||||
if (!rx_qgrp->splitq.bufq_sets)
|
||||
return;
|
||||
|
||||
for (unsigned int i = 0; i < rx_qgrp->splitq.num_bufq_sets; i++) {
|
||||
struct idpf_bufq_set *bufq_set = &rx_qgrp->splitq.bufq_sets[i];
|
||||
|
||||
|
|
@ -2336,7 +2342,7 @@ void idpf_wait_for_sw_marker_completion(const struct idpf_tx_queue *txq)
|
|||
|
||||
do {
|
||||
struct idpf_splitq_4b_tx_compl_desc *tx_desc;
|
||||
struct idpf_tx_queue *target;
|
||||
struct idpf_tx_queue *target = NULL;
|
||||
u32 ctype_gen, id;
|
||||
|
||||
tx_desc = flow ? &complq->comp[ntc].common :
|
||||
|
|
@ -2356,14 +2362,14 @@ void idpf_wait_for_sw_marker_completion(const struct idpf_tx_queue *txq)
|
|||
target = complq->txq_grp->txqs[id];
|
||||
|
||||
idpf_queue_clear(SW_MARKER, target);
|
||||
if (target == txq)
|
||||
break;
|
||||
|
||||
next:
|
||||
if (unlikely(++ntc == complq->desc_count)) {
|
||||
ntc = 0;
|
||||
gen_flag = !gen_flag;
|
||||
}
|
||||
if (target == txq)
|
||||
break;
|
||||
} while (time_before(jiffies, timeout));
|
||||
|
||||
idpf_queue_assign(GEN_CHK, complq, gen_flag);
|
||||
|
|
@ -4059,7 +4065,7 @@ static int idpf_vport_intr_req_irq(struct idpf_vport *vport,
|
|||
continue;
|
||||
|
||||
name = kasprintf(GFP_KERNEL, "%s-%s-%s-%d", drv_name, if_name,
|
||||
vec_name, vidx);
|
||||
vec_name, vector);
|
||||
|
||||
err = request_irq(irq_num, idpf_vport_intr_clean_queues, 0,
|
||||
name, q_vector);
|
||||
|
|
|
|||
|
|
@ -852,7 +852,8 @@ static s32 ixgbevf_check_mac_link_vf(struct ixgbe_hw *hw,
|
|||
if (!mac->get_link_status)
|
||||
goto out;
|
||||
|
||||
if (hw->mac.type == ixgbe_mac_e610_vf) {
|
||||
if (hw->mac.type == ixgbe_mac_e610_vf &&
|
||||
hw->api_version >= ixgbe_mbox_api_16) {
|
||||
ret_val = ixgbevf_get_pf_link_state(hw, speed, link_up);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue