mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
Merge branch 'intel-wired-lan-driver-updates-2026-05-15-ice-ixgbevf-igc-e1000e'
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2026-05-15 (ice, ixgbevf, igc, e1000e) For ice: Jake fixes a mismatch in locking around wait queue usage. Jose Ignacio Tornos Martinez adjusts allowed lower bound for VF data buffer size to accommodate low MTU sizes. Marcin adjusts for -EEXIST to not trigger error path when the promisc filter already exists as part of adding VLAN Ids. Grzegorz fixes a few issues related to PTP. He adds locking to ice_start_phy_timer_eth56g() to protect proper register programming. Fixes the PTP lock used in 2xNAC configuration to always be the primary and restores PTP configuration on ethtool channel changes. For ixgbevf: Michael Bommarito sets freed skb pointer to NULL to prevent use-after-free. For igc: Kohei Enju resolves a couple of issues reported by Sashiko; setting buffer type for an SMD skb and freeing skb on error of igc_fpe_init_tx_descriptor(). ==================== Link: https://patch.msgid.link/20260515182419.1597859-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
2beba18b01
|
|
@ -3682,7 +3682,7 @@ int ice_vlan_rx_add_vid(struct net_device *netdev, __be16 proto, u16 vid)
|
|||
ret = ice_fltr_set_vsi_promisc(&vsi->back->hw, vsi->idx,
|
||||
ICE_MCAST_VLAN_PROMISC_BITS,
|
||||
vid);
|
||||
if (ret)
|
||||
if (ret && ret != -EEXIST)
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
|
@ -4104,6 +4104,12 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked)
|
|||
}
|
||||
ice_pf_dcb_recfg(pf, locked);
|
||||
ice_vsi_open(vsi);
|
||||
/* Rx rings are reallocated during VSI rebuild and lose their ptp_rx
|
||||
* flag. Restore timestamp mode so newly allocated rings are set up
|
||||
* for hardware Rx timestamping.
|
||||
*/
|
||||
if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
|
||||
ice_ptp_restore_timestamp_mode(pf);
|
||||
goto done;
|
||||
|
||||
rebuild_err:
|
||||
|
|
|
|||
|
|
@ -2141,16 +2141,23 @@ int ice_start_phy_timer_eth56g(struct ice_hw *hw, u8 port)
|
|||
}
|
||||
incval = (u64)hi << 32 | lo;
|
||||
|
||||
if (!ice_ptp_lock(hw)) {
|
||||
dev_err(ice_hw_to_dev(hw), "Failed to acquire PTP semaphore\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
err = ice_write_40b_ptp_reg_eth56g(hw, port, PHY_REG_TIMETUS_L, incval);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_ptp_unlock;
|
||||
|
||||
err = ice_ptp_one_port_cmd(hw, port, ICE_PTP_INIT_INCVAL);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_ptp_unlock;
|
||||
|
||||
ice_ptp_exec_tmr_cmd(hw);
|
||||
|
||||
ice_ptp_unlock(hw);
|
||||
|
||||
err = ice_sync_phy_timer_eth56g(hw, port);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
@ -2166,6 +2173,10 @@ int ice_start_phy_timer_eth56g(struct ice_hw *hw, u8 port)
|
|||
ice_debug(hw, ICE_DBG_PTP, "Enabled clock on PHY port %u\n", port);
|
||||
|
||||
return 0;
|
||||
|
||||
err_ptp_unlock:
|
||||
ice_ptp_unlock(hw);
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -4503,18 +4514,17 @@ static int
|
|||
ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
||||
{
|
||||
struct ice_e810_params *params = &hw->ptp.phy.e810;
|
||||
unsigned long flags;
|
||||
u32 val;
|
||||
int err;
|
||||
|
||||
spin_lock_irqsave(¶ms->atqbal_wq.lock, flags);
|
||||
spin_lock_irq(¶ms->atqbal_wq.lock);
|
||||
|
||||
/* Wait for any pending in-progress low latency interrupt */
|
||||
err = wait_event_interruptible_locked_irq(params->atqbal_wq,
|
||||
!(params->atqbal_flags &
|
||||
ATQBAL_FLAGS_INTR_IN_PROGRESS));
|
||||
if (err) {
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4529,7 +4539,7 @@ ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
|||
REG_LL_PROXY_H);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read PTP timestamp using low latency read\n");
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -4539,7 +4549,7 @@ ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
|||
/* Read the low 32 bit value and set the TS valid bit */
|
||||
*lo = rd32(hw, REG_LL_PROXY_L) | TS_VALID;
|
||||
|
||||
spin_unlock_irqrestore(¶ms->atqbal_wq.lock, flags);
|
||||
spin_unlock_irq(¶ms->atqbal_wq.lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -5254,9 +5264,13 @@ static void ice_ptp_init_phy_e830(struct ice_ptp_hw *ptp)
|
|||
*/
|
||||
bool ice_ptp_lock(struct ice_hw *hw)
|
||||
{
|
||||
struct ice_pf *pf = container_of(hw, struct ice_pf, hw);
|
||||
u32 hw_lock;
|
||||
int i;
|
||||
|
||||
if (!ice_is_primary(hw))
|
||||
hw = ice_get_primary_hw(pf);
|
||||
|
||||
#define MAX_TRIES 15
|
||||
|
||||
for (i = 0; i < MAX_TRIES; i++) {
|
||||
|
|
@ -5283,6 +5297,11 @@ bool ice_ptp_lock(struct ice_hw *hw)
|
|||
*/
|
||||
void ice_ptp_unlock(struct ice_hw *hw)
|
||||
{
|
||||
struct ice_pf *pf = container_of(hw, struct ice_pf, hw);
|
||||
|
||||
if (!ice_is_primary(hw))
|
||||
hw = ice_get_primary_hw(pf);
|
||||
|
||||
wr32(hw, PFTSYN_SEM + (PFTSYN_SEM_BYTES * hw->pf_id), 0);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -840,7 +840,7 @@ int ice_vc_cfg_qs_msg(struct ice_vf *vf, u8 *msg)
|
|||
|
||||
if (qpi->rxq.databuffer_size != 0 &&
|
||||
(qpi->rxq.databuffer_size > ((16 * 1024) - 128) ||
|
||||
qpi->rxq.databuffer_size < 1024))
|
||||
qpi->rxq.databuffer_size < 128))
|
||||
goto error_param;
|
||||
|
||||
ring->rx_buf_len = qpi->rxq.databuffer_size;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ static int igc_fpe_init_smd_frame(struct igc_ring *ring,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
buffer->type = IGC_TX_BUFFER_TYPE_SKB;
|
||||
buffer->skb = skb;
|
||||
buffer->protocol = 0;
|
||||
buffer->bytecount = skb->len;
|
||||
|
|
@ -109,10 +110,16 @@ static int igc_fpe_xmit_smd_frame(struct igc_adapter *adapter,
|
|||
__netif_tx_lock(nq, cpu);
|
||||
|
||||
err = igc_fpe_init_tx_descriptor(ring, skb, type);
|
||||
if (err)
|
||||
goto err_free_skb_any;
|
||||
|
||||
igc_flush_tx_descriptors(ring);
|
||||
|
||||
__netif_tx_unlock(nq);
|
||||
return 0;
|
||||
|
||||
err_free_skb_any:
|
||||
__netif_tx_unlock(nq);
|
||||
dev_kfree_skb_any(skb);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1221,6 +1221,7 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
|
|||
ether_addr_equal(rx_ring->netdev->dev_addr,
|
||||
eth_hdr(skb)->h_source)) {
|
||||
dev_kfree_skb_irq(skb);
|
||||
skb = NULL;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user