Message ID | 20230525101728.863971-1-Raju.Rangoju@amd.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [v2,net] amd-xgbe: fix the false linkup in xgbe_phy_status | expand |
On 5/25/23 05:17, Raju Rangoju wrote: > In the event of a change in XGBE mode, the current auto-negotiation > needs to be reset and the AN cycle needs to be re-triggerred. However, > the current code ignores the return value of xgbe_set_mode(), leading to > false information as the link is declared without checking the status > register. > > Fix this by propagating the mode switch status information to > xgbe_phy_status(). > > Fixes: e57f7a3feaef ("amd-xgbe: Prepare for working with more than one type of phy") > Co-developed-by: Sudheesh Mavila <sudheesh.mavila@amd.com> > Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> > Reviewed-by: Simon Horman <simon.horman@corigine.com> > Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com> > Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com> > --- > Changes since v1: > - Fixed the warning "1 blamed authors not CCed" > - Fixed spelling mistake > > drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c > index 33a9574e9e04..9822648747b7 100644 > --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c > +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c > @@ -1329,7 +1329,7 @@ static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata) > return pdata->phy_if.phy_impl.an_outcome(pdata); > } > > -static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) > +static bool xgbe_phy_status_result(struct xgbe_prv_data *pdata) > { > struct ethtool_link_ksettings *lks = &pdata->phy.lks; > enum xgbe_mode mode; > @@ -1367,8 +1367,13 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) > > pdata->phy.duplex = DUPLEX_FULL; > > - if (xgbe_set_mode(pdata, mode) && pdata->an_again) > - xgbe_phy_reconfig_aneg(pdata); > + if (xgbe_set_mode(pdata, mode)) { > + if (pdata->an_again) > + xgbe_phy_reconfig_aneg(pdata); > + return true; > + } > + > + return false; Just a nit (and only my opinion) for better code readability, but you can save some indentation and make this a bit cleaner by doing: if (!xgbe_set_mode(pdata, mode)) return false; if (pdata->an_again) xgbe_phy_reconfig_aneg(pdata); return true; Thanks, Tom > } > > static void xgbe_phy_status(struct xgbe_prv_data *pdata) > @@ -1398,7 +1403,8 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata) > return; > } > > - xgbe_phy_status_result(pdata); > + if (xgbe_phy_status_result(pdata)) > + return; > > if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) > clear_bit(XGBE_LINK_INIT, &pdata->dev_state);
On 5/25/2023 8:11 PM, Tom Lendacky wrote: >> @@ -1367,8 +1367,13 @@ static void xgbe_phy_status_result(struct >> xgbe_prv_data *pdata) >> pdata->phy.duplex = DUPLEX_FULL; >> - if (xgbe_set_mode(pdata, mode) && pdata->an_again) >> - xgbe_phy_reconfig_aneg(pdata); >> + if (xgbe_set_mode(pdata, mode)) { >> + if (pdata->an_again) >> + xgbe_phy_reconfig_aneg(pdata); >> + return true; >> + } >> + >> + return false; > > Just a nit (and only my opinion) for better code readability, but you > can save some indentation and make this a bit cleaner by doing: Thanks Tom for the suggestion. I'll fix it in v3. > > if (!xgbe_set_mode(pdata, mode)) > return false; > > if (pdata->an_again) > xgbe_phy_reconfig_aneg(pdata); > > return true; > > Thanks, > Tom > >> } >> static void xgbe_phy_status(struct xgbe_prv_data *pdata)
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c index 33a9574e9e04..9822648747b7 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c @@ -1329,7 +1329,7 @@ static enum xgbe_mode xgbe_phy_status_aneg(struct xgbe_prv_data *pdata) return pdata->phy_if.phy_impl.an_outcome(pdata); } -static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) +static bool xgbe_phy_status_result(struct xgbe_prv_data *pdata) { struct ethtool_link_ksettings *lks = &pdata->phy.lks; enum xgbe_mode mode; @@ -1367,8 +1367,13 @@ static void xgbe_phy_status_result(struct xgbe_prv_data *pdata) pdata->phy.duplex = DUPLEX_FULL; - if (xgbe_set_mode(pdata, mode) && pdata->an_again) - xgbe_phy_reconfig_aneg(pdata); + if (xgbe_set_mode(pdata, mode)) { + if (pdata->an_again) + xgbe_phy_reconfig_aneg(pdata); + return true; + } + + return false; } static void xgbe_phy_status(struct xgbe_prv_data *pdata) @@ -1398,7 +1403,8 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata) return; } - xgbe_phy_status_result(pdata); + if (xgbe_phy_status_result(pdata)) + return; if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) clear_bit(XGBE_LINK_INIT, &pdata->dev_state);