From: Jonas Jelonek Date: Sun, 14 Jun 2026 12:44:35 +0000 (+0000) Subject: realtek: pcs: improve lock and error handling in pcs_config X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F23759%2Fhead;p=thirdparty%2Fopenwrt.git realtek: pcs: improve lock and error handling in pcs_config Make use of scoped_guard macro to ease lock and error handling in pcs_config by having a dedicated scope and no need for gotos. While being here, replace -ENOTSUPP with preferred -EOPNOTSUPP and drop { } brackets for single statement block. Link: https://github.com/openwrt/openwrt/pull/23759 Signed-off-by: Jonas Jelonek --- diff --git a/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c index d93bd6ef65c..e236b94df2e 100644 --- a/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c +++ b/target/linux/realtek/files-6.18/drivers/net/pcs/pcs-rtl-otto.c @@ -4106,50 +4106,47 @@ static int rtpcs_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode, if (ret < 0) { dev_err(ctrl->dev, "SerDes %u doesn't support %s mode\n", sds->id, phy_modes(interface)); - return -ENOTSUPP; + return -EOPNOTSUPP; } - mutex_lock(&ctrl->lock); + scoped_guard(mutex, &ctrl->lock) { + if (sds->hw_mode != hw_mode) { + dev_info(ctrl->dev, "configure SerDes %u for mode %s\n", sds->id, + phy_modes(interface)); - if (sds->hw_mode != hw_mode) { - dev_info(ctrl->dev, "configure SerDes %u for mode %s\n", sds->id, - phy_modes(interface)); + ret = rtpcs_sds_config_polarity(sds, interface); + if (ret < 0) { + dev_err(ctrl->dev, "failed to configure polarity of SerDes %u\n", + sds->id); + return ret; + } - ret = rtpcs_sds_config_polarity(sds, interface); - if (ret < 0) { - dev_err(ctrl->dev, "failed to configure polarity of SerDes %u\n", - sds->id); - goto out; - } + ret = sds->ops->deactivate(sds); + if (ret < 0) + return ret; - ret = sds->ops->deactivate(sds); - if (ret < 0) - goto out; + ret = ctrl->cfg->setup_serdes(sds, hw_mode); + if (ret < 0) + return ret; - ret = ctrl->cfg->setup_serdes(sds, hw_mode); - if (ret < 0) - goto out; + ret = sds->ops->activate(sds); + if (ret < 0) + return ret; - ret = sds->ops->activate(sds); - if (ret < 0) - goto out; + if (sds->ops->post_config) { + ret = sds->ops->post_config(sds, hw_mode); + if (ret < 0) + return ret; + } - if (sds->ops->post_config) { - ret = sds->ops->post_config(sds, hw_mode); - if (ret < 0) - goto out; - } + sds->first_start = false; + } else + dev_dbg(ctrl->dev, "SerDes %u already in mode %s, no change\n", + sds->id, phy_modes(interface)); - sds->first_start = false; - } else { - dev_dbg(ctrl->dev, "SerDes %u already in mode %s, no change\n", - sds->id, phy_modes(interface)); + ret = sds->ops->set_autoneg(sds, neg_mode, advertising); } - ret = sds->ops->set_autoneg(sds, neg_mode, advertising); - -out: - mutex_unlock(&ctrl->lock); return ret; }