* question about drivers/net/dsa/sja1105/sja1105_main.c
@ 2020-04-03 13:46 Julia Lawall
2020-04-03 14:36 ` Vladimir Oltean
0 siblings, 1 reply; 5+ messages in thread
From: Julia Lawall @ 2020-04-03 13:46 UTC (permalink / raw)
To: olteanv; +Cc: netdev, joe
Hello,
The function sja1105_static_config_reload in sja1105_main.c contains the
code:
if (!an_enabled) {
int speed = SPEED_UNKNOWN;
if (bmcr & BMCR_SPEED1000)
speed = SPEED_1000;
else if (bmcr & BMCR_SPEED100)
speed = SPEED_100;
else if (bmcr & BMCR_SPEED10)
speed = SPEED_10;
sja1105_sgmii_pcs_force_speed(priv, speed);
}
The last test bmcr & BMCR_SPEED10 does not look correct, because according
to include/uapi/linux/mii.h, BMCR_SPEED10 is 0. What should be done
instead?
thanks,
julia
^ permalink raw reply [flat|nested] 5+ messages in thread* Re: question about drivers/net/dsa/sja1105/sja1105_main.c 2020-04-03 13:46 question about drivers/net/dsa/sja1105/sja1105_main.c Julia Lawall @ 2020-04-03 14:36 ` Vladimir Oltean 2020-04-03 21:02 ` Heiner Kallweit 0 siblings, 1 reply; 5+ messages in thread From: Vladimir Oltean @ 2020-04-03 14:36 UTC (permalink / raw) To: Julia Lawall Cc: netdev, Joe Perches, Russell King - ARM Linux admin, Andrew Lunn, Florian Fainelli, Heiner Kallweit Hi Julia, On Fri, 3 Apr 2020 at 16:46, Julia Lawall <julia.lawall@inria.fr> wrote: > > Hello, > > The function sja1105_static_config_reload in sja1105_main.c contains the > code: > > if (!an_enabled) { > int speed = SPEED_UNKNOWN; > > if (bmcr & BMCR_SPEED1000) > speed = SPEED_1000; > else if (bmcr & BMCR_SPEED100) > speed = SPEED_100; > else if (bmcr & BMCR_SPEED10) > speed = SPEED_10; > > sja1105_sgmii_pcs_force_speed(priv, speed); > } > > The last test bmcr & BMCR_SPEED10 does not look correct, because according > to include/uapi/linux/mii.h, BMCR_SPEED10 is 0. What should be done > instead? > > thanks, > julia Thanks for pointing out, you raise a good point. Correct usage would be: include/uapi/linux/mii.h: #define BMCR_SPEED_MASK 0x2040 drivers/net/dsa/sja1105/sja1105_main.c: int speed = SPEED_UNKNOWN; if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED1000) speed = SPEED_1000; else if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED100) speed = SPEED_100; else if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED10) speed = SPEED_10; but the BMCR_SPEED_MASK doesn't exist, it looks like. I believe that is because drivers (or the PHY library) don't typically need to read the speed from the MII_BMCR register, they just need to write it. If the PHY library maintainers think there is any value in defining BMCR_SPEED_MASK as part of the UAPI, we can do that. Otherwise, the definition can be restricted to drivers/net/dsa/sja1105/sja1105.h. Thanks, -Vladimir ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: question about drivers/net/dsa/sja1105/sja1105_main.c 2020-04-03 14:36 ` Vladimir Oltean @ 2020-04-03 21:02 ` Heiner Kallweit 2020-04-03 21:10 ` Joe Perches 0 siblings, 1 reply; 5+ messages in thread From: Heiner Kallweit @ 2020-04-03 21:02 UTC (permalink / raw) To: Vladimir Oltean, Julia Lawall Cc: netdev, Joe Perches, Russell King - ARM Linux admin, Andrew Lunn, Florian Fainelli On 03.04.2020 16:36, Vladimir Oltean wrote: > Hi Julia, > > On Fri, 3 Apr 2020 at 16:46, Julia Lawall <julia.lawall@inria.fr> wrote: >> >> Hello, >> >> The function sja1105_static_config_reload in sja1105_main.c contains the >> code: >> >> if (!an_enabled) { >> int speed = SPEED_UNKNOWN; >> >> if (bmcr & BMCR_SPEED1000) >> speed = SPEED_1000; >> else if (bmcr & BMCR_SPEED100) >> speed = SPEED_100; >> else if (bmcr & BMCR_SPEED10) >> speed = SPEED_10; >> >> sja1105_sgmii_pcs_force_speed(priv, speed); >> } >> >> The last test bmcr & BMCR_SPEED10 does not look correct, because according >> to include/uapi/linux/mii.h, BMCR_SPEED10 is 0. What should be done >> instead? >> It's right that this is not correct. You can check genphy_read_status_fixed() for how it's done there. >> thanks, >> julia > > Thanks for pointing out, you raise a good point. > Correct usage would be: > > include/uapi/linux/mii.h: > #define BMCR_SPEED_MASK 0x2040 > > drivers/net/dsa/sja1105/sja1105_main.c: > int speed = SPEED_UNKNOWN; > > if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED1000) > speed = SPEED_1000; > else if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED100) > speed = SPEED_100; > else if (bmcr & BMCR_SPEED_MASK == BMCR_SPEED10) > speed = SPEED_10; > > but the BMCR_SPEED_MASK doesn't exist, it looks like. I believe that > is because drivers (or the PHY library) don't typically need to read > the speed from the MII_BMCR register, they just need to write it. If > the PHY library maintainers think there is any value in defining > BMCR_SPEED_MASK as part of the UAPI, we can do that. Otherwise, the > definition can be restricted to drivers/net/dsa/sja1105/sja1105.h. > > Thanks, > -Vladimir > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: question about drivers/net/dsa/sja1105/sja1105_main.c 2020-04-03 21:02 ` Heiner Kallweit @ 2020-04-03 21:10 ` Joe Perches 2020-04-04 8:37 ` Vladimir Oltean 0 siblings, 1 reply; 5+ messages in thread From: Joe Perches @ 2020-04-03 21:10 UTC (permalink / raw) To: Heiner Kallweit, Vladimir Oltean, Julia Lawall Cc: netdev, Russell King - ARM Linux admin, Andrew Lunn, Florian Fainelli On Fri, 2020-04-03 at 23:02 +0200, Heiner Kallweit wrote: > It's right that this is not correct. You can check genphy_read_status_fixed() > for how it's done there. There is no SPEED_UNKNOWN in that function. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: question about drivers/net/dsa/sja1105/sja1105_main.c 2020-04-03 21:10 ` Joe Perches @ 2020-04-04 8:37 ` Vladimir Oltean 0 siblings, 0 replies; 5+ messages in thread From: Vladimir Oltean @ 2020-04-04 8:37 UTC (permalink / raw) To: Joe Perches Cc: Heiner Kallweit, Julia Lawall, netdev, Russell King - ARM Linux admin, Andrew Lunn, Florian Fainelli On Sat, 4 Apr 2020 at 00:12, Joe Perches <joe@perches.com> wrote: > > On Fri, 2020-04-03 at 23:02 +0200, Heiner Kallweit wrote: > > It's right that this is not correct. You can check genphy_read_status_fixed() > > for how it's done there. > > There is no SPEED_UNKNOWN in that function. > > Correct, there isn't. The bitwise value of the 2 speed bits from MII_BMCR is: Bits [6,13]: 1 1 = Reserved 1 0 = 1000 Mbps 0 1 = 100 Mbps 0 0 = 10 Mbps So basically the PHY library assumes that no piece of hardware will ever set the speed bits to 11, as that would invalidate the spec. -Vladimir ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-04-04 8:37 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-04-03 13:46 question about drivers/net/dsa/sja1105/sja1105_main.c Julia Lawall 2020-04-03 14:36 ` Vladimir Oltean 2020-04-03 21:02 ` Heiner Kallweit 2020-04-03 21:10 ` Joe Perches 2020-04-04 8:37 ` Vladimir Oltean
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox