Skip to content

Commit c7bdeed

Browse files
committed
Merge branch '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2025-06-10 (i40e, iavf, ice, e1000) For i40e: Robert Malz improves reset handling for situations where multiple reset requests could cause some to be missed. For iavf: Ahmed adds detection, and handling, of reset that could occur early in the initialization process to stop long wait/hangs. For ice: Anton, properly, sets missed use_nsecs value. For e1000: Joe Damato moves cancel_work_sync() call to avoid deadlock. * '40GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: e1000: Move cancel_work_sync to avoid deadlock ice/ptp: fix crosstimestamp reporting iavf: fix reset_task for early reset event i40e: retry VFLR handling if there is ongoing VF reset i40e: return false from i40e_reset_vf if reset is in progress ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 260388f + b4a8085 commit c7bdeed

File tree

5 files changed

+40
-8
lines changed

5 files changed

+40
-8
lines changed

drivers/net/ethernet/intel/e1000/e1000_main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -477,10 +477,6 @@ static void e1000_down_and_stop(struct e1000_adapter *adapter)
477477

478478
cancel_delayed_work_sync(&adapter->phy_info_task);
479479
cancel_delayed_work_sync(&adapter->fifo_stall_task);
480-
481-
/* Only kill reset task if adapter is not resetting */
482-
if (!test_bit(__E1000_RESETTING, &adapter->flags))
483-
cancel_work_sync(&adapter->reset_task);
484480
}
485481

486482
void e1000_down(struct e1000_adapter *adapter)
@@ -1266,6 +1262,10 @@ static void e1000_remove(struct pci_dev *pdev)
12661262

12671263
unregister_netdev(netdev);
12681264

1265+
/* Only kill reset task if adapter is not resetting */
1266+
if (!test_bit(__E1000_RESETTING, &adapter->flags))
1267+
cancel_work_sync(&adapter->reset_task);
1268+
12691269
e1000_phy_hw_reset(hw);
12701270

12711271
kfree(adapter->tx_ring);

drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,8 +1546,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf)
15461546
* @vf: pointer to the VF structure
15471547
* @flr: VFLR was issued or not
15481548
*
1549-
* Returns true if the VF is in reset, resets successfully, or resets
1550-
* are disabled and false otherwise.
1549+
* Return: True if reset was performed successfully or if resets are disabled.
1550+
* False if reset is already in progress.
15511551
**/
15521552
bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
15531553
{
@@ -1566,7 +1566,7 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr)
15661566

15671567
/* If VF is being reset already we don't need to continue. */
15681568
if (test_and_set_bit(I40E_VF_STATE_RESETTING, &vf->vf_states))
1569-
return true;
1569+
return false;
15701570

15711571
i40e_trigger_vf_reset(vf, flr);
15721572

@@ -4328,7 +4328,10 @@ int i40e_vc_process_vflr_event(struct i40e_pf *pf)
43284328
reg = rd32(hw, I40E_GLGEN_VFLRSTAT(reg_idx));
43294329
if (reg & BIT(bit_idx))
43304330
/* i40e_reset_vf will clear the bit in GLGEN_VFLRSTAT */
4331-
i40e_reset_vf(vf, true);
4331+
if (!i40e_reset_vf(vf, true)) {
4332+
/* At least one VF did not finish resetting, retry next time */
4333+
set_bit(__I40E_VFLR_EVENT_PENDING, pf->state);
4334+
}
43324335
}
43334336

43344337
return 0;

drivers/net/ethernet/intel/iavf/iavf_main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,6 +3209,17 @@ static void iavf_reset_task(struct work_struct *work)
32093209
}
32103210

32113211
continue_reset:
3212+
/* If we are still early in the state machine, just restart. */
3213+
if (adapter->state <= __IAVF_INIT_FAILED) {
3214+
iavf_shutdown_adminq(hw);
3215+
iavf_change_state(adapter, __IAVF_STARTUP);
3216+
iavf_startup(adapter);
3217+
queue_delayed_work(adapter->wq, &adapter->watchdog_task,
3218+
msecs_to_jiffies(30));
3219+
netdev_unlock(netdev);
3220+
return;
3221+
}
3222+
32123223
/* We don't use netif_running() because it may be true prior to
32133224
* ndo_open() returning, so we can't assume it means all our open
32143225
* tasks have finished, since we're not holding the rtnl_lock here.

drivers/net/ethernet/intel/iavf/iavf_virtchnl.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,23 @@ iavf_poll_virtchnl_msg(struct iavf_hw *hw, struct iavf_arq_event_info *event,
7979
return iavf_status_to_errno(status);
8080
received_op =
8181
(enum virtchnl_ops)le32_to_cpu(event->desc.cookie_high);
82+
83+
if (received_op == VIRTCHNL_OP_EVENT) {
84+
struct iavf_adapter *adapter = hw->back;
85+
struct virtchnl_pf_event *vpe =
86+
(struct virtchnl_pf_event *)event->msg_buf;
87+
88+
if (vpe->event != VIRTCHNL_EVENT_RESET_IMPENDING)
89+
continue;
90+
91+
dev_info(&adapter->pdev->dev, "Reset indication received from the PF\n");
92+
if (!(adapter->flags & IAVF_FLAG_RESET_PENDING))
93+
iavf_schedule_reset(adapter,
94+
IAVF_FLAG_RESET_PENDING);
95+
96+
return -EIO;
97+
}
98+
8299
if (op_to_poll == received_op)
83100
break;
84101
}

drivers/net/ethernet/intel/ice/ice_ptp.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,7 @@ static int ice_capture_crosststamp(ktime_t *device,
22992299
ts = ((u64)ts_hi << 32) | ts_lo;
23002300
system->cycles = ts;
23012301
system->cs_id = CSID_X86_ART;
2302+
system->use_nsecs = true;
23022303

23032304
/* Read Device source clock time */
23042305
ts_lo = rd32(hw, cfg->dev_time_l[tmr_idx]);

0 commit comments

Comments
 (0)