* [PATCH iwl-net] ice: suppress DPLL errors during reset recovery
@ 2026-05-11 8:38 Przemyslaw Korba
2026-05-11 9:42 ` Loktionov, Aleksandr
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Przemyslaw Korba @ 2026-05-11 8:38 UTC (permalink / raw)
To: intel-wired-lan
Cc: netdev, anthony.l.nguyen, przemyslaw.kitszel, aleksandr.loktionov,
arkadiusz.kubalewski, Przemyslaw Korba
During reset recovery, the admin queue returns EBUSY which is expected
behavior. However, the DPLL subsystem was logging these as errors and
incrementing the error counter, potentially leading to unnecessary
warnings and even disabling the DPLL periodic worker if the threshold
was reached.
Suppress error logging and error counter increments when the admin
queue returns EBUSY, as this is expected during reset recovery and
not a real failure condition.
test case:
- ethtool --reset eth3 irq-shared dma-shared filter-shared offload-shared
mac-shared phy-shared ram-shared
- observe if dmesg EBUSY errors are gone
Fixes: d7999f5ea64b ("ice: implement dpll interface to control cgu")
Signed-off-by: Przemyslaw Korba <przemyslaw.korba@intel.com>
---
drivers/net/ethernet/intel/ice/ice_dpll.c | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c
index 0704e92ab043..78b8836b534b 100644
--- a/drivers/net/ethernet/intel/ice/ice_dpll.c
+++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
@@ -784,7 +784,7 @@ ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
ret,
libie_aq_str(pf->hw.adminq.sq_last_status),
pin_type_name[pin_type], pin->idx);
- else
+ else if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
dev_err_ratelimited(ice_pf_to_dev(pf),
"err:%d %s failed to update %s pin:%u\n",
ret,
@@ -2883,10 +2883,12 @@ ice_dpll_update_state(struct ice_pf *pf, struct ice_dpll *d, bool init)
d->dpll_idx, d->prev_input_idx, d->input_idx,
d->dpll_state, d->prev_dpll_state, d->mode);
if (ret) {
- dev_err(ice_pf_to_dev(pf),
- "update dpll=%d state failed, ret=%d %s\n",
- d->dpll_idx, ret,
- libie_aq_str(pf->hw.adminq.sq_last_status));
+ /* EBUSY is expected during reset recovery, don't log error */
+ if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
+ dev_err(ice_pf_to_dev(pf),
+ "update dpll=%d state failed, ret=%d %s\n",
+ d->dpll_idx, ret,
+ libie_aq_str(pf->hw.adminq.sq_last_status));
return ret;
}
if (init) {
@@ -2955,7 +2957,9 @@ static void ice_dpll_periodic_work(struct kthread_work *work)
d->periodic_counter % dp->phase_offset_monitor_period == 0)
ret = ice_dpll_pps_update_phase_offsets(pf, &phase_offset_ntf);
if (ret) {
- d->cgu_state_acq_err_num++;
+ /* EBUSY is expected during reset recovery */
+ if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
+ d->cgu_state_acq_err_num++;
/* stop rescheduling this worker */
if (d->cgu_state_acq_err_num >
ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
base-commit: 80b47e88f7ead00b0795e9f2833f1d0cafe11d90
prerequisite-patch-id: 45f595ded339d5f7feea2ea7ff196db3c08e3503
--
2.43.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* RE: [PATCH iwl-net] ice: suppress DPLL errors during reset recovery
2026-05-11 8:38 [PATCH iwl-net] ice: suppress DPLL errors during reset recovery Przemyslaw Korba
@ 2026-05-11 9:42 ` Loktionov, Aleksandr
2026-05-15 18:11 ` Simon Horman
2026-05-15 18:38 ` Simon Horman
2 siblings, 0 replies; 4+ messages in thread
From: Loktionov, Aleksandr @ 2026-05-11 9:42 UTC (permalink / raw)
To: Korba, Przemyslaw, intel-wired-lan@lists.osuosl.org
Cc: netdev@vger.kernel.org, Nguyen, Anthony L, Kitszel, Przemyslaw,
Kubalewski, Arkadiusz
> -----Original Message-----
> From: Korba, Przemyslaw <przemyslaw.korba@intel.com>
> Sent: Monday, May 11, 2026 10:38 AM
> To: intel-wired-lan@lists.osuosl.org
> Cc: netdev@vger.kernel.org; Nguyen, Anthony L
> <anthony.l.nguyen@intel.com>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@intel.com>; Loktionov, Aleksandr
> <aleksandr.loktionov@intel.com>; Kubalewski, Arkadiusz
> <arkadiusz.kubalewski@intel.com>; Korba, Przemyslaw
> <przemyslaw.korba@intel.com>
> Subject: [PATCH iwl-net] ice: suppress DPLL errors during reset
> recovery
>
> During reset recovery, the admin queue returns EBUSY which is expected
> behavior. However, the DPLL subsystem was logging these as errors and
> incrementing the error counter, potentially leading to unnecessary
> warnings and even disabling the DPLL periodic worker if the threshold
> was reached.
>
> Suppress error logging and error counter increments when the admin
> queue returns EBUSY, as this is expected during reset recovery and not
> a real failure condition.
>
> test case:
> - ethtool --reset eth3 irq-shared dma-shared filter-shared offload-
> shared mac-shared phy-shared ram-shared
> - observe if dmesg EBUSY errors are gone
>
> Fixes: d7999f5ea64b ("ice: implement dpll interface to control cgu")
> Signed-off-by: Przemyslaw Korba <przemyslaw.korba@intel.com>
> ---
> drivers/net/ethernet/intel/ice/ice_dpll.c | 16 ++++++++++------
> 1 file changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c
> b/drivers/net/ethernet/intel/ice/ice_dpll.c
> index 0704e92ab043..78b8836b534b 100644
> --- a/drivers/net/ethernet/intel/ice/ice_dpll.c
> +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
> @@ -784,7 +784,7 @@ ice_dpll_pin_state_update(struct ice_pf *pf,
> struct ice_dpll_pin *pin,
> ret,
> libie_aq_str(pf-
> >hw.adminq.sq_last_status),
> pin_type_name[pin_type], pin->idx);
> - else
> + else if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
> dev_err_ratelimited(ice_pf_to_dev(pf),
> "err:%d %s failed to update %s
> pin:%u\n",
> ret,
> @@ -2883,10 +2883,12 @@ ice_dpll_update_state(struct ice_pf *pf,
> struct ice_dpll *d, bool init)
> d->dpll_idx, d->prev_input_idx, d->input_idx,
> d->dpll_state, d->prev_dpll_state, d->mode);
> if (ret) {
> - dev_err(ice_pf_to_dev(pf),
> - "update dpll=%d state failed, ret=%d %s\n",
> - d->dpll_idx, ret,
> - libie_aq_str(pf->hw.adminq.sq_last_status));
> + /* EBUSY is expected during reset recovery, don't log
> error */
> + if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
> + dev_err(ice_pf_to_dev(pf),
> + "update dpll=%d state failed, ret=%d %s\n",
> + d->dpll_idx, ret,
> + libie_aq_str(pf-
> >hw.adminq.sq_last_status));
> return ret;
> }
> if (init) {
> @@ -2955,7 +2957,9 @@ static void ice_dpll_periodic_work(struct
> kthread_work *work)
> d->periodic_counter % dp->phase_offset_monitor_period == 0)
> ret = ice_dpll_pps_update_phase_offsets(pf,
> &phase_offset_ntf);
> if (ret) {
> - d->cgu_state_acq_err_num++;
> + /* EBUSY is expected during reset recovery */
> + if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
> + d->cgu_state_acq_err_num++;
> /* stop rescheduling this worker */
> if (d->cgu_state_acq_err_num >
> ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
>
> base-commit: 80b47e88f7ead00b0795e9f2833f1d0cafe11d90
> prerequisite-patch-id: 45f595ded339d5f7feea2ea7ff196db3c08e3503
> --
> 2.43.0
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH iwl-net] ice: suppress DPLL errors during reset recovery
2026-05-11 8:38 [PATCH iwl-net] ice: suppress DPLL errors during reset recovery Przemyslaw Korba
2026-05-11 9:42 ` Loktionov, Aleksandr
@ 2026-05-15 18:11 ` Simon Horman
2026-05-15 18:38 ` Simon Horman
2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2026-05-15 18:11 UTC (permalink / raw)
To: przemyslaw.korba
Cc: 'Simon Horman', intel-wired-lan, netdev, anthony.l.nguyen,
przemyslaw.kitszel, aleksandr.loktionov, arkadiusz.kubalewski
From: 'Simon Horman' <horms@kernel.org>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev
---
ice: suppress DPLL errors during reset recovery
This commit suppresses DPLL error logging and counter increments when the admin
queue returns EBUSY. The intent is to avoid unnecessary warnings and prevent
the DPLL periodic worker from being disabled during reset recovery.
> diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c
> index 0704e92ab0430..78b8836b534b3 100644
> --- a/drivers/net/ethernet/intel/ice/ice_dpll.c
> +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
> @@ -784,7 +784,7 @@ ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
> ret,
> libie_aq_str(pf->hw.adminq.sq_last_status),
> pin_type_name[pin_type], pin->idx);
> - else
> + else if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
Could this check of sq_last_status race with other admin queue commands?
The sq_last_status field seems to be global state that is modified by any
admin queue command. If this is checked outside of the admin queue lock,
could another thread (like an ethtool operation) issue an admin queue
command and overwrite sq_last_status before this check runs?
If it gets overwritten to LIBIE_AQ_RC_OK, this would falsely evaluate as not
EBUSY and log the error anyway, incrementing the error counter.
[ ... ]
> @@ -2955,7 +2957,9 @@ static void ice_dpll_periodic_work(struct kthread_work *work)
> d->periodic_counter % dp->phase_offset_monitor_period == 0)
> ret = ice_dpll_pps_update_phase_offsets(pf, &phase_offset_ntf);
Does the reset recovery suppression also need to be applied inside
ice_dpll_pps_update_phase_offsets()?
If ice_aq_get_cgu_input_pin_measure() fails with EBUSY during reset recovery,
it looks like ice_dpll_pps_update_phase_offsets() only checks for
LIBIE_AQ_RC_EAGAIN before logging an error, which might still spam the log
with EBUSY errors.
> if (ret) {
> - d->cgu_state_acq_err_num++;
> + /* EBUSY is expected during reset recovery */
> + if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
> + d->cgu_state_acq_err_num++;
> /* stop rescheduling this worker */
> if (d->cgu_state_acq_err_num >
> ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
By skipping the increment of the error counter on EBUSY, will this create an
unbounded polling loop?
Looking at the end of ice_dpll_periodic_work():
resched:
kthread_queue_delayed_work(d->kworker, &d->work,
ret ? msecs_to_jiffies(10) :
msecs_to_jiffies(500));
If the firmware gets wedged and persistently returns EBUSY, the error
threshold will never be reached, and the worker will continue to hammer the
admin queue every 10ms forever. Is it expected to poll this frequently
without a backoff mechanism or an upper bound?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH iwl-net] ice: suppress DPLL errors during reset recovery
2026-05-11 8:38 [PATCH iwl-net] ice: suppress DPLL errors during reset recovery Przemyslaw Korba
2026-05-11 9:42 ` Loktionov, Aleksandr
2026-05-15 18:11 ` Simon Horman
@ 2026-05-15 18:38 ` Simon Horman
2 siblings, 0 replies; 4+ messages in thread
From: Simon Horman @ 2026-05-15 18:38 UTC (permalink / raw)
To: przemyslaw.korba
Cc: 'Simon Horman', intel-wired-lan, netdev, anthony.l.nguyen,
przemyslaw.kitszel, aleksandr.loktionov, arkadiusz.kubalewski
From: 'Simon Horman' <horms@kernel.org>
This is an AI-generated review of your patch. The human sending this
email has considered the AI review valid, or at least plausible.
Full review at: https://sashiko.dev
---
ice: suppress DPLL errors during reset recovery
This commit suppresses DPLL error logging and counter increments when the admin
queue returns EBUSY. The intent is to avoid unnecessary warnings and prevent
the DPLL periodic worker from being disabled during reset recovery.
> diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c b/drivers/net/ethernet/intel/ice/ice_dpll.c
> index 0704e92ab0430..78b8836b534b3 100644
> --- a/drivers/net/ethernet/intel/ice/ice_dpll.c
> +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
> @@ -784,7 +784,7 @@ ice_dpll_pin_state_update(struct ice_pf *pf, struct ice_dpll_pin *pin,
> ret,
> libie_aq_str(pf->hw.adminq.sq_last_status),
> pin_type_name[pin_type], pin->idx);
> - else
> + else if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
Could this check of sq_last_status race with other admin queue commands?
The sq_last_status field seems to be global state that is modified by any
admin queue command. If this is checked outside of the admin queue lock,
could another thread (like an ethtool operation) issue an admin queue
command and overwrite sq_last_status before this check runs?
If it gets overwritten to LIBIE_AQ_RC_OK, this would falsely evaluate as not
EBUSY and log the error anyway, incrementing the error counter.
[ ... ]
> @@ -2955,7 +2957,9 @@ static void ice_dpll_periodic_work(struct kthread_work *work)
> d->periodic_counter % dp->phase_offset_monitor_period == 0)
> ret = ice_dpll_pps_update_phase_offsets(pf, &phase_offset_ntf);
Does the reset recovery suppression also need to be applied inside
ice_dpll_pps_update_phase_offsets()?
If ice_aq_get_cgu_input_pin_measure() fails with EBUSY during reset recovery,
it looks like ice_dpll_pps_update_phase_offsets() only checks for
LIBIE_AQ_RC_EAGAIN before logging an error, which might still spam the log
with EBUSY errors.
> if (ret) {
> - d->cgu_state_acq_err_num++;
> + /* EBUSY is expected during reset recovery */
> + if (pf->hw.adminq.sq_last_status != LIBIE_AQ_RC_EBUSY)
> + d->cgu_state_acq_err_num++;
> /* stop rescheduling this worker */
> if (d->cgu_state_acq_err_num >
> ICE_CGU_STATE_ACQ_ERR_THRESHOLD) {
By skipping the increment of the error counter on EBUSY, will this create an
unbounded polling loop?
Looking at the end of ice_dpll_periodic_work():
resched:
kthread_queue_delayed_work(d->kworker, &d->work,
ret ? msecs_to_jiffies(10) :
msecs_to_jiffies(500));
If the firmware gets wedged and persistently returns EBUSY, the error
threshold will never be reached, and the worker will continue to hammer the
admin queue every 10ms forever. Is it expected to poll this frequently
without a backoff mechanism or an upper bound?
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-05-15 18:39 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-11 8:38 [PATCH iwl-net] ice: suppress DPLL errors during reset recovery Przemyslaw Korba
2026-05-11 9:42 ` Loktionov, Aleksandr
2026-05-15 18:11 ` Simon Horman
2026-05-15 18:38 ` Simon Horman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox