>From: Petr Oros <[email protected]> >Sent: Friday, April 17, 2026 4:59 PM > >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")
LGTM, Reviewed-by: Arkadiusz Kubalewski <[email protected]> >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
