netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update
@ 2014-09-16 23:52 Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 1/8] of: mdio: honor flags passed to of_phy_connect Florian Fainelli
                   ` (8 more replies)
  0 siblings, 9 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:52 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Hi David,

This patch sets the change to of_phy_connect() that you have seen before,
this time with the full context of why it is useful and applicable here.

Due to some design decision, the internal PHY on Broadcom BCM7xxx chips
is not entirely self contained and does not report its internal revision
through MII_PHYSID2, that is left to external PHY designs.

This forces us to get the PHY revision from the GENET and SF2 switch drivers
because those two peripherals integrate such a PHY and do contain the PHY
revision in their registers.

The approach taken here is hopefully easy to extend to similar needs for
other chips/ as well.

Thanks!

Florian Fainelli (8):
  of: mdio: honor flags passed to of_phy_connect
  net: phy: broadcom: add helper for PHY revision and patch level
  net: phy: bcm7xxx: do not use PHY_BRCM_100MBPS_WAR
  net: bcmgenet: remove PHY_BRCM_100MBPS_WAR
  net: bcmgenet: communicate integrated PHY revision to PHY driver
  net: dsa: allow switch drivers to specify phy_device::dev_flags
  net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver
  net: phy: bcm7xxx: utilize PHY revision in config_init

 drivers/net/dsa/bcm_sf2.c                      | 16 ++++++++++++++++
 drivers/net/dsa/bcm_sf2.h                      |  1 +
 drivers/net/dsa/bcm_sf2_regs.h                 |  1 +
 drivers/net/ethernet/broadcom/genet/bcmgenet.c |  7 +++++++
 drivers/net/ethernet/broadcom/genet/bcmgenet.h |  1 +
 drivers/net/ethernet/broadcom/genet/bcmmii.c   | 18 ++++++------------
 drivers/net/phy/bcm7xxx.c                      | 25 +++++++++++++++++--------
 drivers/of/of_mdio.c                           |  2 ++
 include/linux/brcmphy.h                        |  3 ++-
 include/net/dsa.h                              |  1 +
 net/dsa/slave.c                                |  9 ++++++++-
 11 files changed, 62 insertions(+), 22 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH net-next 1/8] of: mdio: honor flags passed to of_phy_connect
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
@ 2014-09-16 23:52 ` Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 2/8] net: phy: broadcom: add helper for PHY revision and patch level Florian Fainelli
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:52 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Commit f9a8f83b04e0 ("net: phy: remove flags argument from phy_{attach,
connect, connect_direct}") removed the flags argument to the PHY library
calls to: phy_{attach,connect,connect_direct}.

Most Device Tree aware drivers call of_phy_connect() with the flag
argument set to 0, but some of them might want to set a different value
there in order for the PHY driver to key a specific behavior based on
the phy_device::phy_flags value.

Allow such drivers to set custom phy_flags as part of the
of_phy_connect() call since of_phy_connect() does start the PHY state
machine, it will call into the PHY driver config_init() callback which
is usually where a specific phy_flags value is important.

Fixes: f9a8f83b04e0 ("net: phy: remove flags argument from phy_{attach, connect, connect_direct}")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/of/of_mdio.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index 401b2453da45..a85d80012993 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -224,6 +224,8 @@ struct phy_device *of_phy_connect(struct net_device *dev,
 	if (!phy)
 		return NULL;
 
+	phy->dev_flags = flags;
+
 	return phy_connect_direct(dev, phy, hndlr, iface) ? NULL : phy;
 }
 EXPORT_SYMBOL(of_phy_connect);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 2/8] net: phy: broadcom: add helper for PHY revision and patch level
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 1/8] of: mdio: honor flags passed to of_phy_connect Florian Fainelli
@ 2014-09-16 23:52 ` Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 3/8] net: phy: bcm7xxx: do not use PHY_BRCM_100MBPS_WAR Florian Fainelli
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:52 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

The Broadcom BCM7xxx internal PHYs do not contain any useful revision
information in the low 4-bits of their MII_PHYSID2 (MII register 3)
which could allow us to properly identify them.

As a result, we need the actual hardware block integrating these PHYs:
GENET or the SF2 switch to tell us what revision they are built with. To
assist with that, add two helper macros for fetching the the PHY
revision and patch level from the struct phy_device::dev_flags.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/linux/brcmphy.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h
index 5bd35cc0d471..e4ee9c6679e8 100644
--- a/include/linux/brcmphy.h
+++ b/include/linux/brcmphy.h
@@ -41,6 +41,8 @@
 #define PHY_BRCM_DIS_TXCRXC_NOENRGY	0x00008000
 /* Broadcom BCM7xxx specific workarounds */
 #define PHY_BRCM_100MBPS_WAR		0x00010000
+#define PHY_BRCM_7XXX_REV(x)		(((x) >> 8) & 0xff)
+#define PHY_BRCM_7XXX_PATCH(x)		((x) & 0xff)
 #define PHY_BCM_FLAGS_VALID		0x80000000
 
 /* Broadcom BCM54XX register definitions, common to most Broadcom PHYs */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 3/8] net: phy: bcm7xxx: do not use PHY_BRCM_100MBPS_WAR
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 1/8] of: mdio: honor flags passed to of_phy_connect Florian Fainelli
  2014-09-16 23:52 ` [PATCH net-next 2/8] net: phy: broadcom: add helper for PHY revision and patch level Florian Fainelli
@ 2014-09-16 23:52 ` Florian Fainelli
  2014-09-16 23:53 ` [PATCH net-next 4/8] net: bcmgenet: remove PHY_BRCM_100MBPS_WAR Florian Fainelli
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:52 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

There is no need for the PHY driver to check PHY_BRCM_100MBPS_WAR since
that is redundant with checking the PHY device supported features. Get
rid of that workaround flag.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/phy/bcm7xxx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c
index 09dd6e1dc6e1..be3a591aabba 100644
--- a/drivers/net/phy/bcm7xxx.c
+++ b/drivers/net/phy/bcm7xxx.c
@@ -257,8 +257,8 @@ static int bcm7xxx_config_init(struct phy_device *phydev)
 	phy_write(phydev, MII_BCM7XXX_AUX_MODE, MII_BCM7XX_64CLK_MDIO);
 	phy_read(phydev, MII_BCM7XXX_AUX_MODE);
 
-	/* Workaround only required for 100Mbits/sec */
-	if (!(phydev->dev_flags & PHY_BRCM_100MBPS_WAR))
+	/* Workaround only required for 100Mbits/sec capable PHYs */
+	if (phydev->supported & PHY_GBIT_FEATURES)
 		return 0;
 
 	/* set shadow mode 2 */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 4/8] net: bcmgenet: remove PHY_BRCM_100MBPS_WAR
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (2 preceding siblings ...)
  2014-09-16 23:52 ` [PATCH net-next 3/8] net: phy: bcm7xxx: do not use PHY_BRCM_100MBPS_WAR Florian Fainelli
@ 2014-09-16 23:53 ` Florian Fainelli
  2014-09-16 23:53 ` [PATCH net-next 5/8] net: bcmgenet: communicate integrated PHY revision to PHY driver Florian Fainelli
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:53 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Now that we have removed the need for the PHY_BRCM_100MBPS_WAR flag, we
can remove it from the GENET driver and the broadcom shared header file.
The PHY driver checks the PHY supported bitmask instead.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmmii.c | 10 ----------
 include/linux/brcmphy.h                      |  1 -
 2 files changed, 11 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index c88f7ae99636..71f2ef7d33a9 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -296,7 +296,6 @@ static int bcmgenet_mii_probe(struct net_device *dev)
 	struct bcmgenet_priv *priv = netdev_priv(dev);
 	struct device_node *dn = priv->pdev->dev.of_node;
 	struct phy_device *phydev;
-	unsigned int phy_flags;
 	int ret;
 
 	if (priv->phydev) {
@@ -338,15 +337,6 @@ static int bcmgenet_mii_probe(struct net_device *dev)
 		return ret;
 	}
 
-	phy_flags = PHY_BRCM_100MBPS_WAR;
-
-	/* workarounds are only needed for 100Mpbs PHYs, and
-	 * never on GENET V1 hardware
-	 */
-	if ((phydev->supported & PHY_GBIT_FEATURES) || GENET_IS_V1(priv))
-		phy_flags = 0;
-
-	phydev->dev_flags |= phy_flags;
 	phydev->advertising = phydev->supported;
 
 	/* The internal PHY has its link interrupts routed to the
diff --git a/include/linux/brcmphy.h b/include/linux/brcmphy.h
index e4ee9c6679e8..3f626fe48c9a 100644
--- a/include/linux/brcmphy.h
+++ b/include/linux/brcmphy.h
@@ -40,7 +40,6 @@
 #define PHY_BRCM_CLEAR_RGMII_MODE	0x00004000
 #define PHY_BRCM_DIS_TXCRXC_NOENRGY	0x00008000
 /* Broadcom BCM7xxx specific workarounds */
-#define PHY_BRCM_100MBPS_WAR		0x00010000
 #define PHY_BRCM_7XXX_REV(x)		(((x) >> 8) & 0xff)
 #define PHY_BRCM_7XXX_PATCH(x)		((x) & 0xff)
 #define PHY_BCM_FLAGS_VALID		0x80000000
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 5/8] net: bcmgenet: communicate integrated PHY revision to PHY driver
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (3 preceding siblings ...)
  2014-09-16 23:53 ` [PATCH net-next 4/8] net: bcmgenet: remove PHY_BRCM_100MBPS_WAR Florian Fainelli
@ 2014-09-16 23:53 ` Florian Fainelli
  2014-09-16 23:53 ` [PATCH net-next 6/8] net: dsa: allow switch drivers to specify phy_device::dev_flags Florian Fainelli
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:53 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

The integrated BCM7xxx PHY contains no useful revision information in
its MII_PHYSID2 bits 3:0, that information is instead contained in the
GENET hardware block.

We already read the GENET 32-bit revision register, so store the
integrated PHY revision in the driver private structure, and then
communicate this revision value to the PHY driver by overriding the
phy_flags value.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 7 +++++++
 drivers/net/ethernet/broadcom/genet/bcmgenet.h | 1 +
 drivers/net/ethernet/broadcom/genet/bcmmii.c   | 8 ++++++--
 3 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 3f9d4de8173c..a12c65604f9d 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2432,6 +2432,13 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv)
 	dev_info(&priv->pdev->dev, "GENET " GENET_VER_FMT,
 		 major, (reg >> 16) & 0x0f, reg & 0xffff);
 
+	/* Store the integrated PHY revision for the MDIO probing function
+	 * to pass this information to the PHY driver. The PHY driver expects
+	 * to find the PHY major revision in bits 15:8 while the GENET register
+	 * stores that information in bits 7:0, account for that.
+	 */
+	priv->gphy_rev = (reg & 0xffff) << 8;
+
 #ifdef CONFIG_PHYS_ADDR_T_64BIT
 	if (!(params->flags & GENET_HAS_40BITS))
 		pr_warn("GENET does not support 40-bits PA\n");
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index c862d0666771..ad95fe57ebcd 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -545,6 +545,7 @@ struct bcmgenet_priv {
 	struct phy_device *phydev;
 	struct device_node *phy_dn;
 	struct mii_bus *mii_bus;
+	u16 gphy_rev;
 
 	/* PHY device variables */
 	int old_duplex;
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 71f2ef7d33a9..75b26cbaa7c1 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -296,6 +296,7 @@ static int bcmgenet_mii_probe(struct net_device *dev)
 	struct bcmgenet_priv *priv = netdev_priv(dev);
 	struct device_node *dn = priv->pdev->dev.of_node;
 	struct phy_device *phydev;
+	u32 phy_flags;
 	int ret;
 
 	if (priv->phydev) {
@@ -314,8 +315,11 @@ static int bcmgenet_mii_probe(struct net_device *dev)
 		priv->phy_dn = of_node_get(dn);
 	}
 
-	phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup, 0,
-				priv->phy_interface);
+	/* Communicate the integrated PHY revision */
+	phy_flags = priv->gphy_rev;
+
+	phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup,
+				phy_flags, priv->phy_interface);
 	if (!phydev) {
 		pr_err("could not attach to PHY\n");
 		return -ENODEV;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 6/8] net: dsa: allow switch drivers to specify phy_device::dev_flags
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (4 preceding siblings ...)
  2014-09-16 23:53 ` [PATCH net-next 5/8] net: bcmgenet: communicate integrated PHY revision to PHY driver Florian Fainelli
@ 2014-09-16 23:53 ` Florian Fainelli
  2014-09-16 23:53 ` [PATCH net-next 7/8] net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver Florian Fainelli
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:53 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Some switch drivers (e.g: bcm_sf2) may have to communicate specific
workarounds or flags towards the PHY device driver. Allow switches
driver to be delegated that task by introducing a get_phy_flags()
callback which will do just that.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 include/net/dsa.h | 1 +
 net/dsa/slave.c   | 9 ++++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/include/net/dsa.h b/include/net/dsa.h
index c779e9bba1b3..e020b8a12b7d 100644
--- a/include/net/dsa.h
+++ b/include/net/dsa.h
@@ -181,6 +181,7 @@ struct dsa_switch_driver {
 	char	*(*probe)(struct device *host_dev, int sw_addr);
 	int	(*setup)(struct dsa_switch *ds);
 	int	(*set_addr)(struct dsa_switch *ds, u8 *addr);
+	u32	(*get_phy_flags)(struct dsa_switch *ds, int port);
 
 	/*
 	 * Access to the switch's PHY registers.
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 90c9689ed362..ea2c52b11739 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -371,6 +371,7 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 	struct dsa_chip_data *cd = ds->pd;
 	struct device_node *phy_dn, *port_dn;
 	bool phy_is_fixed = false;
+	u32 phy_flags = 0;
 	int ret;
 
 	port_dn = cd->port_dn[p->port];
@@ -390,9 +391,12 @@ static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
 		phy_dn = port_dn;
 	}
 
+	if (ds->drv->get_phy_flags)
+		phy_flags = ds->drv->get_phy_flags(ds, port);
+
 	if (phy_dn)
 		p->phy = of_phy_connect(slave_dev, phy_dn,
-					dsa_slave_adjust_link, 0,
+					dsa_slave_adjust_link, phy_flags,
 					p->phy_interface);
 
 	if (p->phy && phy_is_fixed)
@@ -480,6 +484,9 @@ dsa_slave_create(struct dsa_switch *ds, struct device *parent,
 	netif_carrier_off(slave_dev);
 
 	if (p->phy != NULL) {
+		if (ds->drv->get_phy_flags(ds, port))
+			p->phy->dev_flags |= ds->drv->get_phy_flags(ds, port);
+
 		phy_attach(slave_dev, dev_name(&p->phy->dev),
 			   PHY_INTERFACE_MODE_GMII);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 7/8] net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (5 preceding siblings ...)
  2014-09-16 23:53 ` [PATCH net-next 6/8] net: dsa: allow switch drivers to specify phy_device::dev_flags Florian Fainelli
@ 2014-09-16 23:53 ` Florian Fainelli
  2014-09-16 23:53 ` [PATCH net-next 8/8] net: phy: bcm7xxx: utilize PHY revision in config_init Florian Fainelli
  2014-09-19 19:41 ` [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update David Miller
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:53 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

The integrated BCM7xxx PHY contains no useful revision information
in its MII_PHYSID2 bits 3:0, that information is instead contained in
the SWITCH_REG_PHY_REVISION register.

Read this register, store its value, and return it by implementing the
dsa_switch::get_phy_flags() callback accordingly. The register layout is
already matching what the BCM7xxx PHY driver is expecting to find.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/dsa/bcm_sf2.c      | 16 ++++++++++++++++
 drivers/net/dsa/bcm_sf2.h      |  1 +
 drivers/net/dsa/bcm_sf2_regs.h |  1 +
 3 files changed, 18 insertions(+)

diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index 02d7db320d90..a97ba2548ea5 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -376,6 +376,9 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds)
 					SWITCH_TOP_REV_MASK;
 	priv->hw_params.core_rev = (rev & SF2_REV_MASK);
 
+	rev = reg_readl(priv, REG_PHY_REVISION);
+	priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK;
+
 	pr_info("Starfighter 2 top: %x.%02x, core: %x.%02x base: 0x%p, IRQs: %d, %d\n",
 		priv->hw_params.top_rev >> 8, priv->hw_params.top_rev & 0xff,
 		priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff,
@@ -399,6 +402,18 @@ static int bcm_sf2_sw_set_addr(struct dsa_switch *ds, u8 *addr)
 	return 0;
 }
 
+static u32 bcm_sf2_sw_get_phy_flags(struct dsa_switch *ds, int port)
+{
+	struct bcm_sf2_priv *priv = ds_to_priv(ds);
+
+	/* The BCM7xxx PHY driver expects to find the integrated PHY revision
+	 * in bits 15:8 and the patch level in bits 7:0 which is exactly what
+	 * the REG_PHY_REVISION register layout is.
+	 */
+
+	return priv->hw_params.gphy_rev;
+}
+
 static int bcm_sf2_sw_indir_rw(struct dsa_switch *ds, int op, int addr,
 			       int regnum, u16 val)
 {
@@ -597,6 +612,7 @@ static struct dsa_switch_driver bcm_sf2_switch_driver = {
 	.probe			= bcm_sf2_sw_probe,
 	.setup			= bcm_sf2_sw_setup,
 	.set_addr		= bcm_sf2_sw_set_addr,
+	.get_phy_flags		= bcm_sf2_sw_get_phy_flags,
 	.phy_read		= bcm_sf2_sw_phy_read,
 	.phy_write		= bcm_sf2_sw_phy_write,
 	.get_strings		= bcm_sf2_sw_get_strings,
diff --git a/drivers/net/dsa/bcm_sf2.h b/drivers/net/dsa/bcm_sf2.h
index 260bab313e58..d3bd52dc40d2 100644
--- a/drivers/net/dsa/bcm_sf2.h
+++ b/drivers/net/dsa/bcm_sf2.h
@@ -26,6 +26,7 @@
 struct bcm_sf2_hw_params {
 	u16	top_rev;
 	u16	core_rev;
+	u16	gphy_rev;
 	u32	num_gphy;
 	u8	num_acb_queue;
 	u8	num_rgmii;
diff --git a/drivers/net/dsa/bcm_sf2_regs.h b/drivers/net/dsa/bcm_sf2_regs.h
index 885c231b03b5..c65f138c777f 100644
--- a/drivers/net/dsa/bcm_sf2_regs.h
+++ b/drivers/net/dsa/bcm_sf2_regs.h
@@ -25,6 +25,7 @@
 #define  SWITCH_TOP_REV_MASK		0xffff
 
 #define REG_PHY_REVISION		0x1C
+#define  PHY_REVISION_MASK		0xffff
 
 #define REG_SPHY_CNTRL			0x2C
 #define  IDDQ_BIAS			(1 << 0)
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH net-next 8/8] net: phy: bcm7xxx: utilize PHY revision in config_init
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (6 preceding siblings ...)
  2014-09-16 23:53 ` [PATCH net-next 7/8] net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver Florian Fainelli
@ 2014-09-16 23:53 ` Florian Fainelli
  2014-09-19 19:41 ` [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update David Miller
  8 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-16 23:53 UTC (permalink / raw)
  To: netdev; +Cc: davem, Florian Fainelli

Now that the GENET and SF2 drivers have been updated to communicate us
what is the revision of the BCM7xxx integrated PHY, utilize that
information in the config_init() callback to call into the appropriate
workaround function based on our revision.

While at it, we also print the revision and patch level to help debug
new chips.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/phy/bcm7xxx.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/drivers/net/phy/bcm7xxx.c b/drivers/net/phy/bcm7xxx.c
index be3a591aabba..daae69950925 100644
--- a/drivers/net/phy/bcm7xxx.c
+++ b/drivers/net/phy/bcm7xxx.c
@@ -196,13 +196,22 @@ static int bcm7xxx_eee_enable(struct phy_device *phydev)
 
 static int bcm7xxx_28nm_config_init(struct phy_device *phydev)
 {
-	int ret;
-
-	ret = bcm7445_config_init(phydev);
-	if (ret)
-		return ret;
+	u8 rev = PHY_BRCM_7XXX_REV(phydev->dev_flags);
+	u8 patch = PHY_BRCM_7XXX_PATCH(phydev->dev_flags);
+	int ret = 0;
+
+	dev_info(&phydev->dev, "PHY revision: 0x%02x, patch: %d\n", rev, patch);
+
+	switch (rev) {
+	case 0xa0:
+	case 0xb0:
+		ret = bcm7445_config_init(phydev);
+		break;
+	default:
+		ret = bcm7xxx_28nm_afe_config_init(phydev);
+		break;
+	}
 
-	ret = bcm7xxx_28nm_afe_config_init(phydev);
 	if (ret)
 		return ret;
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update
  2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
                   ` (7 preceding siblings ...)
  2014-09-16 23:53 ` [PATCH net-next 8/8] net: phy: bcm7xxx: utilize PHY revision in config_init Florian Fainelli
@ 2014-09-19 19:41 ` David Miller
  2014-09-19 19:55   ` David Miller
  8 siblings, 1 reply; 12+ messages in thread
From: David Miller @ 2014-09-19 19:41 UTC (permalink / raw)
  To: f.fainelli; +Cc: netdev

From: Florian Fainelli <f.fainelli@gmail.com>
Date: Tue, 16 Sep 2014 16:52:56 -0700

> This patch sets the change to of_phy_connect() that you have seen before,
> this time with the full context of why it is useful and applicable here.
> 
> Due to some design decision, the internal PHY on Broadcom BCM7xxx chips
> is not entirely self contained and does not report its internal revision
> through MII_PHYSID2, that is left to external PHY designs.
> 
> This forces us to get the PHY revision from the GENET and SF2 switch drivers
> because those two peripherals integrate such a PHY and do contain the PHY
> revision in their registers.
> 
> The approach taken here is hopefully easy to extend to similar needs for
> other chips/ as well.

Series applied, thanks Florian.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update
  2014-09-19 19:41 ` [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update David Miller
@ 2014-09-19 19:55   ` David Miller
  2014-09-19 19:59     ` Florian Fainelli
  0 siblings, 1 reply; 12+ messages in thread
From: David Miller @ 2014-09-19 19:55 UTC (permalink / raw)
  To: f.fainelli; +Cc: netdev

From: David Miller <davem@davemloft.net>
Date: Fri, 19 Sep 2014 15:41:04 -0400 (EDT)

> Series applied, thanks Florian.

Actually I had to revert:

net/dsa/slave.c: In function ‘dsa_slave_phy_setup’:
net/dsa/slave.c:395:42: error: ‘port’ undeclared (first use in this function)
   phy_flags = ds->drv->get_phy_flags(ds, port);
                                          ^
net/dsa/slave.c:395:42: note: each undeclared identifier is reported only once for each function it appears in

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update
  2014-09-19 19:55   ` David Miller
@ 2014-09-19 19:59     ` Florian Fainelli
  0 siblings, 0 replies; 12+ messages in thread
From: Florian Fainelli @ 2014-09-19 19:59 UTC (permalink / raw)
  To: David Miller; +Cc: netdev

On 09/19/2014 12:55 PM, David Miller wrote:
> From: David Miller <davem@davemloft.net>
> Date: Fri, 19 Sep 2014 15:41:04 -0400 (EDT)
> 
>> Series applied, thanks Florian.
> 
> Actually I had to revert:
> 
> net/dsa/slave.c: In function ‘dsa_slave_phy_setup’:
> net/dsa/slave.c:395:42: error: ‘port’ undeclared (first use in this function)
>    phy_flags = ds->drv->get_phy_flags(ds, port);
>                                           ^
> net/dsa/slave.c:395:42: note: each undeclared identifier is reported only once for each function it appears in
> 

Whoops, I will fix that immediately.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2014-09-19 19:59 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-16 23:52 [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update Florian Fainelli
2014-09-16 23:52 ` [PATCH net-next 1/8] of: mdio: honor flags passed to of_phy_connect Florian Fainelli
2014-09-16 23:52 ` [PATCH net-next 2/8] net: phy: broadcom: add helper for PHY revision and patch level Florian Fainelli
2014-09-16 23:52 ` [PATCH net-next 3/8] net: phy: bcm7xxx: do not use PHY_BRCM_100MBPS_WAR Florian Fainelli
2014-09-16 23:53 ` [PATCH net-next 4/8] net: bcmgenet: remove PHY_BRCM_100MBPS_WAR Florian Fainelli
2014-09-16 23:53 ` [PATCH net-next 5/8] net: bcmgenet: communicate integrated PHY revision to PHY driver Florian Fainelli
2014-09-16 23:53 ` [PATCH net-next 6/8] net: dsa: allow switch drivers to specify phy_device::dev_flags Florian Fainelli
2014-09-16 23:53 ` [PATCH net-next 7/8] net: dsa: bcm_sf2: communicate integrated PHY revision to PHY driver Florian Fainelli
2014-09-16 23:53 ` [PATCH net-next 8/8] net: phy: bcm7xxx: utilize PHY revision in config_init Florian Fainelli
2014-09-19 19:41 ` [PATCH net-next 0/8] net: phy: Broadcom BCM7xxx PHY workaround update David Miller
2014-09-19 19:55   ` David Miller
2014-09-19 19:59     ` Florian Fainelli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).