Thread (22 messages) flat view 22 messages, 4 authors, 2018-08-07

Re: [PATCH v3 net-next 5/9] net: stmmac: Add MDIO related functions for XGMAC2

From: Florian Fainelli <f.fainelli@gmail.com>
Date: 2018-08-07 19:46:48

On 08/07/2018 06:35 AM, Jose Abreu wrote:
Hi Florian,

On 06-08-2018 16:25, Florian Fainelli wrote:
quoted
On August 6, 2018 12:59:54 AM PDT, Jose Abreu [off-list ref] wrote:
quoted
On 03-08-2018 20:06, Florian Fainelli wrote:
quoted
On 08/03/2018 08:50 AM, Jose Abreu wrote:
quoted
Add the MDIO related funcionalities for the new IP block XGMAC2.

Signed-off-by: Jose Abreu <redacted>
Cc: David S. Miller <davem@davemloft.net>
Cc: Joao Pinto <redacted>
Cc: Giuseppe Cavallaro <redacted>
Cc: Alexandre Torgue <redacted>
Cc: Andrew Lunn <andrew@lunn.ch>
---
+satic int stmmac_xgmac2_c22_format(struct stmmac_priv *priv, int
phyaddr,
quoted
quoted
+				    int phyreg, u32 *hw_addr)
+{
+	unsigned int mii_data = priv->hw->mii.data;
+	u32 tmp;
+
+	/* HW does not support C22 addr >= 4 */
+	if (phyaddr >= 4)
+		return -ENODEV;
It would be nice if this could be moved at probe time so you don't
have
quoted
to wait until you connect to the PHY, read its PHY OUI and find out
it
quoted
has a MDIO address >= 4. Not a blocker, but something that could be
improved further on.

In premise you could even scan the MDIO bus' device tree node, and
find
quoted
that out ahead of time.
Oh, but I use phylib ... I only provide the read/write callbacks
so I think we should avoid duplicating the code that's already in
the phylib ... No?
You can always extract the code that scans a MDIO bus into a helper function and make it parametrized with a callback of some kind. In that case I would be fine with you open coding the MDIO bus scan to find out if there is an address >= 4.
Sorry but I dont' think thats the best solution because
of_mdiobus_register() already scans the bus. Duplicating this
should be avoided, no?
I suggested you extract the code into a helper to avoid the duplication.
Note all of this is probably never needed because stmmac just
picks the first phy it finds, if phy_addr is not specified ...
No, it's much more involved than that, there are several modes in which
MDIO on stmmac can be instantiated:

- platform data instantiation, which uses a loop and finds the first
available address
- Device Tree which will scan the MDIO bus' node child nodes and create
PHYs for valid nodes

It feels a bit late to check for PHY address >= 4 during the first read,
because it won't be obvious to somehow why this fails, but if that
fulfills your needs, keep it that way.
quoted
quoted
quoted
quoted
+	/* Wait until any existing MII operation is complete */
+	if (readl_poll_timeout(priv->ioaddr + mii_data, tmp,
+			       !(tmp & MII_XGMAC_BUSY), 100, 10000))
+		return -EBUSY;
+
+	/* Set port as Clause 22 */
+	tmp = readl(priv->ioaddr + XGMAC_MDIO_C22P);
+	tmp |= BIT(phyaddr);
Since the registers are being Read/Modify/Write here, don't you need
to
quoted
clear the previous address bits as well?

You probably did not encounter any problems in your testing if you
had
quoted
only one PHY on the MDIO bus, but this is not something that is
necessarily true, e.g: if you have an Ethernet switch, several MDIO
bus
quoted
addresses are going to be responding.

Your MDIO bus implementation must be able to support one transaction
with one PHY address and the next transaction with another PHY
address ,
quoted
etc...

That is something that should be easy to fix and be resubmitted as
part
quoted
of v4.
I'm not following you here... I only set/unset the bit for the
corresponding phyaddr that phylib wants to read/write. Why would
I clear the remaining addresses?
Because this is all about transactions, the HW must be in a state that it will be able to perform that transaction correctly. So here for instance if you needed to support a C45 transaction you would have to clear that bit for that particular PHY address. Since you don't appear to support those yet then yes the code appears fine though it would not hurt if you did clear all other PHY's c22 bits to make it clear what this does.
I can't test C45 right now but I will in a near future. In that
case then we will need to support C22 and C45 so I may want to
only set one bit for a specific phy that only supports c22.
We are really talking about adding something like:

	reg &= ~(MASK);

before setting the bit, anyhow, if you want to do that later on when you
add C45 support, be my guest...
-- 
Florian
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help