> -----Original Message-----
> From: Petr Oros <[email protected]>
> Sent: Friday, April 17, 2026 4:59 PM
> To: [email protected]
> Cc: Oros, Petr <[email protected]>; Nguyen, Anthony L
> <[email protected]>; Kitszel, Przemyslaw
> <[email protected]>; Andrew Lunn <[email protected]>;
> David S. Miller <[email protected]>; Eric Dumazet
> <[email protected]>; Jakub Kicinski <[email protected]>; Paolo Abeni
> <[email protected]>; Simon Horman <[email protected]>; Kubalewski,
> Arkadiusz <[email protected]>; Jiri Pirko
> <[email protected]>; Vadim Fedorenko <[email protected]>;
> Vecera, Ivan <[email protected]>; Schmidt, Michal
> <[email protected]>; Keller, Jacob E <[email protected]>;
> Loktionov, Aleksandr <[email protected]>; Rinitha, SX
> <[email protected]>; [email protected]; linux-
> [email protected]
> 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 <[email protected]>
> ---
> 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 <[email protected]>