RE: [PATCH iwl-net v7 3/3] ice: add dpll peer notification for paired SMA and U.FL pins

From: Loktionov, Aleksandr

Date: Mon Apr 27 2026 - 10:34:15 EST




> -----Original Message-----
> From: Petr Oros <poros@xxxxxxxxxx>
> Sent: Friday, April 17, 2026 4:59 PM
> To: netdev@xxxxxxxxxxxxxxx
> Cc: Oros, Petr <poros@xxxxxxxxxx>; Nguyen, Anthony L
> <anthony.l.nguyen@xxxxxxxxx>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@xxxxxxxxx>; Andrew Lunn <andrew+netdev@xxxxxxx>;
> David S. Miller <davem@xxxxxxxxxxxxx>; Eric Dumazet
> <edumazet@xxxxxxxxxx>; Jakub Kicinski <kuba@xxxxxxxxxx>; Paolo Abeni
> <pabeni@xxxxxxxxxx>; Simon Horman <horms@xxxxxxxxxx>; Kubalewski,
> Arkadiusz <arkadiusz.kubalewski@xxxxxxxxx>; Jiri Pirko
> <jiri@xxxxxxxxxxx>; Vadim Fedorenko <vadim.fedorenko@xxxxxxxxx>;
> Vecera, Ivan <ivecera@xxxxxxxxxx>; Schmidt, Michal
> <mschmidt@xxxxxxxxxx>; Keller, Jacob E <jacob.e.keller@xxxxxxxxx>;
> Loktionov, Aleksandr <aleksandr.loktionov@xxxxxxxxx>; Rinitha, SX
> <sx.rinitha@xxxxxxxxx>; intel-wired-lan@xxxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx
> Subject: [PATCH iwl-net v7 3/3] ice: add dpll peer notification for
> paired SMA and U.FL pins
>
> SMA and U.FL pins share physical signal paths in pairs (SMA1/U.FL1 and
> SMA2/U.FL2). When one pin's state changes via a PCA9575 GPIO write,
> the paired pin's state also changes, but no notification is sent for
> the peer pin. Userspace consumers monitoring the peer via dpll
> netlink subscribe never learn about the update.
>
> Add ice_dpll_sw_pin_notify_peer() which sends a change notification
> for the paired SW pin. Call it from ice_dpll_pin_sma_direction_set(),
> ice_dpll_sma_pin_state_set(), and ice_dpll_ufl_pin_state_set() after
> pf->dplls.lock is released. Use __dpll_pin_change_ntf() because
> dpll_lock is still held by the dpll netlink layer (dpll_pin_pre_doit).
>
> Fixes: 2dd5d03c77e2 ("ice: redesign dpll sma/u.fl pins control")
> Signed-off-by: Petr Oros <poros@xxxxxxxxxx>
> ---
> drivers/net/ethernet/intel/ice/ice_dpll.c | 32
> +++++++++++++++++++++++
> 1 file changed, 32 insertions(+)
>
> diff --git a/drivers/net/ethernet/intel/ice/ice_dpll.c
> b/drivers/net/ethernet/intel/ice/ice_dpll.c
> index 11b942b83500fb..be72a076f7a15c 100644
> --- a/drivers/net/ethernet/intel/ice/ice_dpll.c
> +++ b/drivers/net/ethernet/intel/ice/ice_dpll.c
> @@ -1154,6 +1154,32 @@ ice_dpll_input_state_get(const struct dpll_pin
> *pin, void *pin_priv,
> extack, ICE_DPLL_PIN_TYPE_INPUT); }
>
> +/**
> + * ice_dpll_sw_pin_notify_peer - notify the paired SW pin after a
> state
> +change
> + * @d: pointer to dplls struct
> + * @changed: the SW pin that was explicitly changed (already notified
> +by dpll core)
> + *
> + * SMA and U.FL pins share physical signal paths in pairs (SMA1/U.FL1
> +and
> + * SMA2/U.FL2). When one pin's routing changes via the PCA9575 GPIO
> + * expander, the paired pin's state may also change. Send a change
> + * notification for the peer pin so userspace consumers monitoring
> the
> + * peer via dpll netlink learn about the update.
> + *
> + * Context: Called from dpll_pin_ops callbacks after pf->dplls.lock
> is
> + * released. Uses __dpll_pin_change_ntf() because dpll_lock
> is
> + * still held by the dpll netlink layer.
> + */
> +static void ice_dpll_sw_pin_notify_peer(struct ice_dplls *d,
> + struct ice_dpll_pin *changed)
> +{
> + struct ice_dpll_pin *peer;
> +
> + peer = (changed >= d->sma && changed < d->sma +
> ICE_DPLL_PIN_SW_NUM) ?
> + &d->ufl[changed->idx] : &d->sma[changed->idx];
> + if (peer->pin)
> + __dpll_pin_change_ntf(peer->pin);
> +}
> +
> /**
> * ice_dpll_sma_direction_set - set direction of SMA pin
> * @p: pointer to a pin
> @@ -1344,6 +1370,8 @@ ice_dpll_ufl_pin_state_set(const struct dpll_pin
> *pin, void *pin_priv,
>
> unlock:
> mutex_unlock(&pf->dplls.lock);
> + if (!ret)
> + ice_dpll_sw_pin_notify_peer(&pf->dplls, p);
>
> return ret;
> }
> @@ -1462,6 +1490,8 @@ ice_dpll_sma_pin_state_set(const struct dpll_pin
> *pin, void *pin_priv,
>
> unlock:
> mutex_unlock(&pf->dplls.lock);
> + if (!ret)
> + ice_dpll_sw_pin_notify_peer(&pf->dplls, sma);
>
> return ret;
> }
> @@ -1657,6 +1687,8 @@ ice_dpll_pin_sma_direction_set(const struct
> dpll_pin *pin, void *pin_priv,
> mutex_lock(&pf->dplls.lock);
> ret = ice_dpll_sma_direction_set(p, direction, extack);
> mutex_unlock(&pf->dplls.lock);
> + if (!ret)
> + ice_dpll_sw_pin_notify_peer(&pf->dplls, p);
>
> return ret;
> }
> --
> 2.52.0

Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@xxxxxxxxx>