* [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement @ 2023-04-13 18:07 Nishanth Menon 2023-04-13 18:07 ` [PATCH 1/2] net: phy: Make phy_interface_is_sgmii " Nishanth Menon ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 18:07 UTC (permalink / raw) To: Marek Vasut, Tom Rini Cc: Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot, Nishanth Menon Originally reported by Tom[1], turned out to be that recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes with Linux") reordered the enum definitions which in turn broke the range checks. we are left with two options: a) check against explicit values to help reuse as much as possible and let compiler optimize where applicable or b) be very explicit in phy drivers and drop these helpers. I have chosen to go with (a) approach. Tested on am64x, though the dp83867 is used elsewhere as well. Nishanth Menon (2): net: phy: Make phy_interface_is_sgmii a switch statement net: phy: Make phy_interface_is_rgmii a switch statement include/phy.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) -- 2.40.0 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] net: phy: Make phy_interface_is_sgmii a switch statement 2023-04-13 18:07 [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement Nishanth Menon @ 2023-04-13 18:07 ` Nishanth Menon 2023-04-13 18:56 ` Marek Behún 2023-04-13 18:07 ` [PATCH 2/2] net: phy: Make phy_interface_is_rgmii " Nishanth Menon 2023-04-13 18:08 ` [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii " Nishanth Menon 2 siblings, 1 reply; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 18:07 UTC (permalink / raw) To: Marek Vasut, Tom Rini Cc: Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot, Nishanth Menon Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes with Linux") reordered the enum definitions. This caused the range of enums that this api was checking to go bad. While it is possible for the phy drivers to practically use the enum's directly, drivers such as dp83867 use this helper to manage the configuration of the phy correctly. Reported-by: Tom Rini <trini@konsulko.com> Signed-off-by: Nishanth Menon <nm@ti.com> --- include/phy.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/include/phy.h b/include/phy.h index a837fed72352..1c4dc23bc5ba 100644 --- a/include/phy.h +++ b/include/phy.h @@ -373,8 +373,16 @@ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) */ static inline bool phy_interface_is_sgmii(struct phy_device *phydev) { - return phydev->interface >= PHY_INTERFACE_MODE_SGMII && - phydev->interface <= PHY_INTERFACE_MODE_QSGMII; + switch (phydev->interface) { + case PHY_INTERFACE_MODE_SGMII: + case PHY_INTERFACE_MODE_QUSGMII: + case PHY_INTERFACE_MODE_USXGMII: + case PHY_INTERFACE_MODE_QSGMII: + return 1; + default: + fallthrough; + } + return 0; } bool phy_interface_is_ncsi(void); -- 2.40.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] net: phy: Make phy_interface_is_sgmii a switch statement 2023-04-13 18:07 ` [PATCH 1/2] net: phy: Make phy_interface_is_sgmii " Nishanth Menon @ 2023-04-13 18:56 ` Marek Behún 2023-04-13 19:02 ` Nishanth Menon 0 siblings, 1 reply; 9+ messages in thread From: Marek Behún @ 2023-04-13 18:56 UTC (permalink / raw) To: Nishanth Menon Cc: Marek Vasut, Tom Rini, Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot On Thu, Apr 13, 2023 at 01:07:12PM -0500, Nishanth Menon wrote: > Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes > with Linux") reordered the enum definitions. This caused the range of > enums that this api was checking to go bad. > > While it is possible for the phy drivers to practically use the enum's > directly, drivers such as dp83867 use this helper to manage the > configuration of the phy correctly. > > Reported-by: Tom Rini <trini@konsulko.com> > Signed-off-by: Nishanth Menon <nm@ti.com> > --- > include/phy.h | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/include/phy.h b/include/phy.h > index a837fed72352..1c4dc23bc5ba 100644 > --- a/include/phy.h > +++ b/include/phy.h > @@ -373,8 +373,16 @@ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) > */ > static inline bool phy_interface_is_sgmii(struct phy_device *phydev) > { > - return phydev->interface >= PHY_INTERFACE_MODE_SGMII && > - phydev->interface <= PHY_INTERFACE_MODE_QSGMII; > + switch (phydev->interface) { > + case PHY_INTERFACE_MODE_SGMII: > + case PHY_INTERFACE_MODE_QUSGMII: > + case PHY_INTERFACE_MODE_USXGMII: > + case PHY_INTERFACE_MODE_QSGMII: > + return 1; > + default: > + fallthrough; Why not just put the return 0; statement here instead of fallthrough and drop it from after the switch statement? > + } > + return 0; > } ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] net: phy: Make phy_interface_is_sgmii a switch statement 2023-04-13 18:56 ` Marek Behún @ 2023-04-13 19:02 ` Nishanth Menon 2023-04-13 21:22 ` Marek Behún 0 siblings, 1 reply; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 19:02 UTC (permalink / raw) To: Marek Behún Cc: Marek Vasut, Tom Rini, Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot On 20:56-20230413, Marek Behún wrote: > On Thu, Apr 13, 2023 at 01:07:12PM -0500, Nishanth Menon wrote: > > Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes > > with Linux") reordered the enum definitions. This caused the range of > > enums that this api was checking to go bad. > > > > While it is possible for the phy drivers to practically use the enum's > > directly, drivers such as dp83867 use this helper to manage the > > configuration of the phy correctly. > > > > Reported-by: Tom Rini <trini@konsulko.com> > > Signed-off-by: Nishanth Menon <nm@ti.com> > > --- > > include/phy.h | 12 ++++++++++-- > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > diff --git a/include/phy.h b/include/phy.h > > index a837fed72352..1c4dc23bc5ba 100644 > > --- a/include/phy.h > > +++ b/include/phy.h > > @@ -373,8 +373,16 @@ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) > > */ > > static inline bool phy_interface_is_sgmii(struct phy_device *phydev) > > { > > - return phydev->interface >= PHY_INTERFACE_MODE_SGMII && > > - phydev->interface <= PHY_INTERFACE_MODE_QSGMII; > > + switch (phydev->interface) { > > + case PHY_INTERFACE_MODE_SGMII: > > + case PHY_INTERFACE_MODE_QUSGMII: > > + case PHY_INTERFACE_MODE_USXGMII: > > + case PHY_INTERFACE_MODE_QSGMII: > > + return 1; > > + default: > > + fallthrough; > > Why not just put the return 0; statement here instead of fallthrough and > drop it from after the switch statement? Just dropping the default also will work, though it does leave something un-handled. handling the default on the other hand allows for additional code (meh?) to be added in default.. But really what? I'd rather drop the default and fall through to save on a couple of lines.. if that is'nt creating confusion.. > > + } > > + return 0; > > } -- Regards, Nishanth Menon Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] net: phy: Make phy_interface_is_sgmii a switch statement 2023-04-13 19:02 ` Nishanth Menon @ 2023-04-13 21:22 ` Marek Behún 2023-04-13 22:51 ` Nishanth Menon 0 siblings, 1 reply; 9+ messages in thread From: Marek Behún @ 2023-04-13 21:22 UTC (permalink / raw) To: Nishanth Menon Cc: Marek Vasut, Tom Rini, Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot On Thu, Apr 13, 2023 at 02:02:34PM -0500, Nishanth Menon wrote: > On 20:56-20230413, Marek Behún wrote: > > On Thu, Apr 13, 2023 at 01:07:12PM -0500, Nishanth Menon wrote: > > > Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes > > > with Linux") reordered the enum definitions. This caused the range of > > > enums that this api was checking to go bad. > > > > > > While it is possible for the phy drivers to practically use the enum's > > > directly, drivers such as dp83867 use this helper to manage the > > > configuration of the phy correctly. > > > > > > Reported-by: Tom Rini <trini@konsulko.com> > > > Signed-off-by: Nishanth Menon <nm@ti.com> > > > --- > > > include/phy.h | 12 ++++++++++-- > > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > > > diff --git a/include/phy.h b/include/phy.h > > > index a837fed72352..1c4dc23bc5ba 100644 > > > --- a/include/phy.h > > > +++ b/include/phy.h > > > @@ -373,8 +373,16 @@ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) > > > */ > > > static inline bool phy_interface_is_sgmii(struct phy_device *phydev) > > > { > > > - return phydev->interface >= PHY_INTERFACE_MODE_SGMII && > > > - phydev->interface <= PHY_INTERFACE_MODE_QSGMII; > > > + switch (phydev->interface) { > > > + case PHY_INTERFACE_MODE_SGMII: > > > + case PHY_INTERFACE_MODE_QUSGMII: > > > + case PHY_INTERFACE_MODE_USXGMII: > > > + case PHY_INTERFACE_MODE_QSGMII: > > > + return 1; > > > + default: > > > + fallthrough; > > > > Why not just put the return 0; statement here instead of fallthrough and > > drop it from after the switch statement? > > Just dropping the default also will work, though it does leave something > un-handled. handling the default on the other hand allows for additional > code (meh?) to be added in default.. But really what? I'd rather drop > the default and fall through to save on a couple of lines.. if that > is'nt creating confusion.. You can't drop the default if you use a switch statement and not enumerating all enumerator entries. So you either have to use switch (x) { case A: return 1; case B: return 2; default: return 3; } or switch (x) { case A: return 1; case B: return 2; default: break; /* or fallthourgh */ } return 3; The first one is shorter one line. It is also used in this way already. IMO it makes more sense. But keep in mind, this is just a nit-pick. I don't actually care that much. I just think it makes more sense this way. If all possibilities are handled by return statements inside the switch, you don't need to have another return in top level of the function. Look for example at Linux' include/linux/phy.h function phy_modes(): https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/phy.h?h=v6.3-rc6#n216 Marek > > > > + } > > > + return 0; > > > } > > -- > Regards, > Nishanth Menon > Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] net: phy: Make phy_interface_is_sgmii a switch statement 2023-04-13 21:22 ` Marek Behún @ 2023-04-13 22:51 ` Nishanth Menon 0 siblings, 0 replies; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 22:51 UTC (permalink / raw) To: Marek Behún Cc: Marek Vasut, Tom Rini, Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot On 23:22-20230413, Marek Behún wrote: > On Thu, Apr 13, 2023 at 02:02:34PM -0500, Nishanth Menon wrote: > > On 20:56-20230413, Marek Behún wrote: > > > On Thu, Apr 13, 2023 at 01:07:12PM -0500, Nishanth Menon wrote: > > > > Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes > > > > with Linux") reordered the enum definitions. This caused the range of > > > > enums that this api was checking to go bad. > > > > > > > > While it is possible for the phy drivers to practically use the enum's > > > > directly, drivers such as dp83867 use this helper to manage the > > > > configuration of the phy correctly. > > > > > > > > Reported-by: Tom Rini <trini@konsulko.com> > > > > Signed-off-by: Nishanth Menon <nm@ti.com> > > > > --- > > > > include/phy.h | 12 ++++++++++-- > > > > 1 file changed, 10 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/include/phy.h b/include/phy.h > > > > index a837fed72352..1c4dc23bc5ba 100644 > > > > --- a/include/phy.h > > > > +++ b/include/phy.h > > > > @@ -373,8 +373,16 @@ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) > > > > */ > > > > static inline bool phy_interface_is_sgmii(struct phy_device *phydev) > > > > { > > > > - return phydev->interface >= PHY_INTERFACE_MODE_SGMII && > > > > - phydev->interface <= PHY_INTERFACE_MODE_QSGMII; > > > > + switch (phydev->interface) { > > > > + case PHY_INTERFACE_MODE_SGMII: > > > > + case PHY_INTERFACE_MODE_QUSGMII: > > > > + case PHY_INTERFACE_MODE_USXGMII: > > > > + case PHY_INTERFACE_MODE_QSGMII: > > > > + return 1; > > > > + default: > > > > + fallthrough; > > > > > > Why not just put the return 0; statement here instead of fallthrough and > > > drop it from after the switch statement? > > > > Just dropping the default also will work, though it does leave something > > un-handled. handling the default on the other hand allows for additional > > code (meh?) to be added in default.. But really what? I'd rather drop > > the default and fall through to save on a couple of lines.. if that > > is'nt creating confusion.. > > You can't drop the default if you use a switch statement and not > enumerating all enumerator entries. > > So you either have to use > > switch (x) { > case A: > return 1; > case B: > return 2; > default: > return 3; > } > > or > > switch (x) { > case A: > return 1; > case B: > return 2; > default: > break; /* or fallthourgh */ > } > return 3; > > The first one is shorter one line. It is also used in this way already. > > IMO it makes more sense. > > But keep in mind, this is just a nit-pick. I don't actually care that > much. I just think it makes more sense this way. If all possibilities > are handled by return statements inside the switch, you don't need to > have another return in top level of the function. Sigh, remnants of a few years of misra misery :( - yep, dropping.. new rev incoming.. > > Look for example at Linux' include/linux/phy.h function phy_modes(): > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/phy.h?h=v6.3-rc6#n216 > -- Regards, Nishanth Menon Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/2] net: phy: Make phy_interface_is_rgmii a switch statement 2023-04-13 18:07 [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement Nishanth Menon 2023-04-13 18:07 ` [PATCH 1/2] net: phy: Make phy_interface_is_sgmii " Nishanth Menon @ 2023-04-13 18:07 ` Nishanth Menon 2023-04-25 19:13 ` Ramon Fried 2023-04-13 18:08 ` [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii " Nishanth Menon 2 siblings, 1 reply; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 18:07 UTC (permalink / raw) To: Marek Vasut, Tom Rini Cc: Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot, Nishanth Menon Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes with Linux") reordered the enum definitions. This exposed a problem in range checking functions to identify the interface type. Though this specific api was'nt impacted (all the RGMII definitions remained within range), this experience should be used to never to have to face this kind of challenge again. While it is possible for the phy drivers to practically use the enum's directly, drivers such as dp83867, dp83869, marvell, micrel_ksz90x1 etc use the same. Reported-by: Tom Rini <trini@konsulko.com> Signed-off-by: Nishanth Menon <nm@ti.com> --- include/phy.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/include/phy.h b/include/phy.h index 1c4dc23bc5ba..812694cf4a81 100644 --- a/include/phy.h +++ b/include/phy.h @@ -361,8 +361,16 @@ int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id); */ static inline bool phy_interface_is_rgmii(struct phy_device *phydev) { - return phydev->interface >= PHY_INTERFACE_MODE_RGMII && - phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID; + switch (phydev->interface) { + case PHY_INTERFACE_MODE_RGMII: + case PHY_INTERFACE_MODE_RGMII_ID: + case PHY_INTERFACE_MODE_RGMII_RXID: + case PHY_INTERFACE_MODE_RGMII_TXID: + return 1; + default: + fallthrough; + } + return 0; } /** -- 2.40.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] net: phy: Make phy_interface_is_rgmii a switch statement 2023-04-13 18:07 ` [PATCH 2/2] net: phy: Make phy_interface_is_rgmii " Nishanth Menon @ 2023-04-25 19:13 ` Ramon Fried 0 siblings, 0 replies; 9+ messages in thread From: Ramon Fried @ 2023-04-25 19:13 UTC (permalink / raw) To: Nishanth Menon Cc: Marek Vasut, Tom Rini, Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, u-boot On Thu, Apr 13, 2023 at 9:07 PM Nishanth Menon <nm@ti.com> wrote: > > Recent commit 75d28899e3e9 ("net: phy: Synchronize PHY interface modes > with Linux") reordered the enum definitions. This exposed a problem in > range checking functions to identify the interface type. Though this > specific api was'nt impacted (all the RGMII definitions remained within > range), this experience should be used to never to have to face this > kind of challenge again. > > While it is possible for the phy drivers to practically use the enum's > directly, drivers such as dp83867, dp83869, marvell, micrel_ksz90x1 etc > use the same. > > Reported-by: Tom Rini <trini@konsulko.com> > Signed-off-by: Nishanth Menon <nm@ti.com> > --- > include/phy.h | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/include/phy.h b/include/phy.h > index 1c4dc23bc5ba..812694cf4a81 100644 > --- a/include/phy.h > +++ b/include/phy.h > @@ -361,8 +361,16 @@ int get_phy_id(struct mii_dev *bus, int addr, int devad, u32 *phy_id); > */ > static inline bool phy_interface_is_rgmii(struct phy_device *phydev) > { > - return phydev->interface >= PHY_INTERFACE_MODE_RGMII && > - phydev->interface <= PHY_INTERFACE_MODE_RGMII_TXID; > + switch (phydev->interface) { > + case PHY_INTERFACE_MODE_RGMII: > + case PHY_INTERFACE_MODE_RGMII_ID: > + case PHY_INTERFACE_MODE_RGMII_RXID: > + case PHY_INTERFACE_MODE_RGMII_TXID: > + return 1; > + default: > + fallthrough; > + } > + return 0; > } > > /** > -- > 2.40.0 > Reviewed-by: Ramon Fried <rfried.dev@gmail.com> ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement 2023-04-13 18:07 [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement Nishanth Menon 2023-04-13 18:07 ` [PATCH 1/2] net: phy: Make phy_interface_is_sgmii " Nishanth Menon 2023-04-13 18:07 ` [PATCH 2/2] net: phy: Make phy_interface_is_rgmii " Nishanth Menon @ 2023-04-13 18:08 ` Nishanth Menon 2 siblings, 0 replies; 9+ messages in thread From: Nishanth Menon @ 2023-04-13 18:08 UTC (permalink / raw) To: Marek Vasut, Tom Rini Cc: Siddharth Vadapalli, Vignesh Raghavendra, Michal Simek, Ramon Fried, u-boot On 13:07-20230413, Nishanth Menon wrote: > Originally reported by Tom[1], turned out to be that recent commit > 75d28899e3e9 ("net: phy: Synchronize PHY interface modes with Linux") > reordered the enum definitions which in turn broke the range checks. > > we are left with two options: > a) check against explicit values to help reuse as much as possible and > let compiler optimize where applicable > or > b) be very explicit in phy drivers and drop these helpers. > > I have chosen to go with (a) approach. > > Tested on am64x, though the dp83867 is used elsewhere as well. > > Nishanth Menon (2): > net: phy: Make phy_interface_is_sgmii a switch statement > net: phy: Make phy_interface_is_rgmii a switch statement > > include/phy.h | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) > > -- > 2.40.0 > Oops.. forgot to provide the link of the report: [1] https://libera.irclog.whitequark.org/u-boot/2023-04-07#34130437; -- Regards, Nishanth Menon Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-04-25 19:13 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2023-04-13 18:07 [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii a switch statement Nishanth Menon 2023-04-13 18:07 ` [PATCH 1/2] net: phy: Make phy_interface_is_sgmii " Nishanth Menon 2023-04-13 18:56 ` Marek Behún 2023-04-13 19:02 ` Nishanth Menon 2023-04-13 21:22 ` Marek Behún 2023-04-13 22:51 ` Nishanth Menon 2023-04-13 18:07 ` [PATCH 2/2] net: phy: Make phy_interface_is_rgmii " Nishanth Menon 2023-04-25 19:13 ` Ramon Fried 2023-04-13 18:08 ` [PATCH 0/2] net: phy: Make phy_interface_is_sgmii|rgmii " Nishanth Menon
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.