All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver
@ 2017-07-31 19:04 Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop Florian Fainelli
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

Hi all,

This patch series migrates the Broadcom GENET driver to use the mdio-bcm-unimac
driver. This MDIO HW is the same as the one GENET internally embedds, yet for
historical reasons the two drivers lived their own lives. Because of the GENET
interrupt situation, we let it specify how it wants to signal MDIO operations
completion using its driver-private waitqueue.

The diffstat is not super impressive, but it's still negative! This would
make it easier in the future to absorb possible workarounds/bugs/features
within the same location.

This was tested on BCM7260 (GENETv5, single instance), BCM7439 (GENETv4, triple
instance) and BCM7445 (bcm_sf2 + mdio-bcm-unimac).

We also now have a nice /proc/iomem output:

f0b00000-f0b0fc4b : /rdb/ethernet@f0b00000
  f0b00e14-f0b00e1c : unimac-mdio.0
f0b20000-f0b2fc4b : /rdb/ethernet@f0b20000
  f0b20e14-f0b20e1c : unimac-mdio.1
f0b40000-f0b4fc4b : /rdb/ethernet@f0b40000
  f0b40e14-f0b40e1c : unimac-mdio.2


Florian Fainelli (7):
  net: phy: mdio-bcm-unimac: factor busy polling loop
  net: phy: mdio-bcm-unimac: create unique bus names
  net: phy: mdio-bcm-unimac: Add debug print for PHY workaround
  net: phy: mdio-bcm-unimac: Allow specifying platform data
  net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver
  net: bcmgenet: Drop legacy MDIO code
  net: bcmgenet: Utilize bcmgenet_mii_exit() for error path

 MAINTAINERS                                    |   1 +
 drivers/net/ethernet/broadcom/Kconfig          |   1 +
 drivers/net/ethernet/broadcom/genet/bcmgenet.h |   1 +
 drivers/net/ethernet/broadcom/genet/bcmmii.c   | 256 ++++++++++---------------
 drivers/net/phy/mdio-bcm-unimac.c              |  71 ++++---
 include/linux/platform_data/mdio-bcm-unimac.h  |  13 ++
 6 files changed, 163 insertions(+), 180 deletions(-)
 create mode 100644 include/linux/platform_data/mdio-bcm-unimac.h

-- 
2.9.3

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

* [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-08-01  0:28   ` kbuild test robot
  2017-07-31 19:04 ` [PATCH net-next 2/7] net: phy: mdio-bcm-unimac: create unique bus names Florian Fainelli
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

Factor the code that does the busy polling on the MDIO_BUSY bit since we
will have different code-paths for for completion depending on whether
we are using interrupts or polling.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/phy/mdio-bcm-unimac.c | 43 +++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c
index 34395230ce70..226fdccfa1a8 100644
--- a/drivers/net/phy/mdio-bcm-unimac.c
+++ b/drivers/net/phy/mdio-bcm-unimac.c
@@ -57,10 +57,26 @@ static inline unsigned int unimac_mdio_busy(struct unimac_mdio_priv *priv)
 	return __raw_readl(priv->base + MDIO_CMD) & MDIO_START_BUSY;
 }
 
+static int unimac_mdio_poll(struct unimac_mdio_priv *priv)
+{
+	unsigned int timeout = 1000;
+
+	do {
+		if (!unimac_mdio_busy(priv))
+			return 0;
+
+		usleep_range(1000, 2000);
+	} while (timeout--);
+
+	if (!timeout)
+		return -ETIMEDOUT;
+
+	return 0;
+}
+
 static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 {
 	struct unimac_mdio_priv *priv = bus->priv;
-	unsigned int timeout = 1000;
 	u32 cmd;
 
 	/* Prepare the read operation */
@@ -70,15 +86,9 @@ static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 	/* Start MDIO transaction */
 	unimac_mdio_start(priv);
 
-	do {
-		if (!unimac_mdio_busy(priv))
-			break;
-
-		usleep_range(1000, 2000);
-	} while (timeout--);
-
-	if (!timeout)
-		return -ETIMEDOUT;
+	ret = unimac_mdio_poll(priv);
+	if (ret)
+		return ret;
 
 	cmd = __raw_readl(priv->base + MDIO_CMD);
 
@@ -97,7 +107,6 @@ static int unimac_mdio_write(struct mii_bus *bus, int phy_id,
 			     int reg, u16 val)
 {
 	struct unimac_mdio_priv *priv = bus->priv;
-	unsigned int timeout = 1000;
 	u32 cmd;
 
 	/* Prepare the write operation */
@@ -107,17 +116,7 @@ static int unimac_mdio_write(struct mii_bus *bus, int phy_id,
 
 	unimac_mdio_start(priv);
 
-	do {
-		if (!unimac_mdio_busy(priv))
-			break;
-
-		usleep_range(1000, 2000);
-	} while (timeout--);
-
-	if (!timeout)
-		return -ETIMEDOUT;
-
-	return 0;
+	return unimac_mdio_poll(priv);
 }
 
 /* Workaround for integrated BCM7xxx Gigabit PHYs which have a problem with
-- 
2.9.3

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

* [PATCH net-next 2/7] net: phy: mdio-bcm-unimac: create unique bus names
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 3/7] net: phy: mdio-bcm-unimac: Add debug print for PHY workaround Florian Fainelli
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

In preparation for having multiple GENET instances in a system (up to
3), make sure that we do include the bus instance number in the name of
the MDIO bus such that we change it from "unimac-mdio" to
"unimac-mdio-0" for instance.

So far, the only user of this driver is using Device Tree, which uses a
lookup/parenting based technique to map PHY devices to their respective
MDIO bus controllers, hence causing no additional changes.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/phy/mdio-bcm-unimac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c
index 226fdccfa1a8..97cac10bd0d5 100644
--- a/drivers/net/phy/mdio-bcm-unimac.c
+++ b/drivers/net/phy/mdio-bcm-unimac.c
@@ -197,7 +197,7 @@ static int unimac_mdio_probe(struct platform_device *pdev)
 	bus->read = unimac_mdio_read;
 	bus->write = unimac_mdio_write;
 	bus->reset = unimac_mdio_reset;
-	snprintf(bus->id, MII_BUS_ID_SIZE, "%s", pdev->name);
+	snprintf(bus->id, MII_BUS_ID_SIZE, "%s-%d", pdev->name, pdev->id);
 
 	ret = of_mdiobus_register(bus, np);
 	if (ret) {
-- 
2.9.3

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

* [PATCH net-next 3/7] net: phy: mdio-bcm-unimac: Add debug print for PHY workaround
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 2/7] net: phy: mdio-bcm-unimac: create unique bus names Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 4/7] net: phy: mdio-bcm-unimac: Allow specifying platform data Florian Fainelli
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

In order to be stricly identical to what bcmgenet does, add a debug
print when a PHY workaround during bus->reset() is executed. Preliminary
change to moving bcmgenet towards mdio-bcm-unimac.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/phy/mdio-bcm-unimac.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c
index 97cac10bd0d5..4e52692f9eea 100644
--- a/drivers/net/phy/mdio-bcm-unimac.c
+++ b/drivers/net/phy/mdio-bcm-unimac.c
@@ -154,8 +154,10 @@ static int unimac_mdio_reset(struct mii_bus *bus)
 	}
 
 	for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
-		if (read_mask & 1 << addr)
+		if (read_mask & 1 << addr) {
+			dev_dbg(&bus->dev, "Workaround for PHY @ %d\n", addr);
 			mdiobus_read(bus, addr, MII_BMSR);
+		}
 	}
 
 	return 0;
-- 
2.9.3

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

* [PATCH net-next 4/7] net: phy: mdio-bcm-unimac: Allow specifying platform data
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
                   ` (2 preceding siblings ...)
  2017-07-31 19:04 ` [PATCH net-next 3/7] net: phy: mdio-bcm-unimac: Add debug print for PHY workaround Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 5/7] net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver Florian Fainelli
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

In preparation for having the bcmgenet driver migrate over the
mdio-bcm-unimac driver, add a platform data structure which allows
passing integrating specific details like bus name, wait function to
complete MDIO operations and PHY mask.

We also define what the platform device name contract is by defining
UNIMAC_MDIO_DRV_NAME and moving it to the platform_data header.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 MAINTAINERS                                   |  1 +
 drivers/net/phy/mdio-bcm-unimac.c             | 28 +++++++++++++++++++++------
 include/linux/platform_data/mdio-bcm-unimac.h | 13 +++++++++++++
 3 files changed, 36 insertions(+), 6 deletions(-)
 create mode 100644 include/linux/platform_data/mdio-bcm-unimac.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 297e610c9163..7d72fdbed6e6 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5140,6 +5140,7 @@ L:	netdev@vger.kernel.org
 S:	Maintained
 F:	include/linux/phy.h
 F:	include/linux/phy_fixed.h
+F:	include/linux/platform_data/mdio-bcm-unimac.h
 F:	drivers/net/phy/
 F:	Documentation/networking/phy.txt
 F:	drivers/of/of_mdio.c
diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c
index 4e52692f9eea..89425ca48412 100644
--- a/drivers/net/phy/mdio-bcm-unimac.c
+++ b/drivers/net/phy/mdio-bcm-unimac.c
@@ -21,6 +21,8 @@
 #include <linux/of_platform.h>
 #include <linux/of_mdio.h>
 
+#include <linux/platform_data/mdio-bcm-unimac.h>
+
 #define MDIO_CMD		0x00
 #define  MDIO_START_BUSY	(1 << 29)
 #define  MDIO_READ_FAIL		(1 << 28)
@@ -41,6 +43,8 @@
 struct unimac_mdio_priv {
 	struct mii_bus		*mii_bus;
 	void __iomem		*base;
+	int (*wait_func)	(void *wait_func_data);
+	void			*wait_func_data;
 };
 
 static inline void unimac_mdio_start(struct unimac_mdio_priv *priv)
@@ -57,8 +61,9 @@ static inline unsigned int unimac_mdio_busy(struct unimac_mdio_priv *priv)
 	return __raw_readl(priv->base + MDIO_CMD) & MDIO_START_BUSY;
 }
 
-static int unimac_mdio_poll(struct unimac_mdio_priv *priv)
+static int unimac_mdio_poll(void *wait_func_data)
 {
+	struct unimac_mdio_priv *priv = wait_func_data;
 	unsigned int timeout = 1000;
 
 	do {
@@ -77,6 +82,7 @@ static int unimac_mdio_poll(struct unimac_mdio_priv *priv)
 static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 {
 	struct unimac_mdio_priv *priv = bus->priv;
+	int ret;
 	u32 cmd;
 
 	/* Prepare the read operation */
@@ -86,7 +92,7 @@ static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
 	/* Start MDIO transaction */
 	unimac_mdio_start(priv);
 
-	ret = unimac_mdio_poll(priv);
+	ret = priv->wait_func(priv->wait_func_data);
 	if (ret)
 		return ret;
 
@@ -116,7 +122,7 @@ static int unimac_mdio_write(struct mii_bus *bus, int phy_id,
 
 	unimac_mdio_start(priv);
 
-	return unimac_mdio_poll(priv);
+	return priv->wait_func(priv->wait_func_data);
 }
 
 /* Workaround for integrated BCM7xxx Gigabit PHYs which have a problem with
@@ -165,6 +171,7 @@ static int unimac_mdio_reset(struct mii_bus *bus)
 
 static int unimac_mdio_probe(struct platform_device *pdev)
 {
+	struct unimac_mdio_pdata *pdata = pdev->dev.platform_data;
 	struct unimac_mdio_priv *priv;
 	struct device_node *np;
 	struct mii_bus *bus;
@@ -194,7 +201,16 @@ static int unimac_mdio_probe(struct platform_device *pdev)
 
 	bus = priv->mii_bus;
 	bus->priv = priv;
-	bus->name = "unimac MII bus";
+	if (pdata) {
+		bus->name = pdata->bus_name;
+		priv->wait_func = pdata->wait_func;
+		priv->wait_func_data = pdata->wait_func_data;
+		bus->phy_mask = ~pdata->phy_mask;
+	} else {
+		bus->name = "unimac MII bus";
+		priv->wait_func_data = priv;
+		priv->wait_func = unimac_mdio_poll;
+	}
 	bus->parent = &pdev->dev;
 	bus->read = unimac_mdio_read;
 	bus->write = unimac_mdio_write;
@@ -241,7 +257,7 @@ MODULE_DEVICE_TABLE(of, unimac_mdio_ids);
 
 static struct platform_driver unimac_mdio_driver = {
 	.driver = {
-		.name = "unimac-mdio",
+		.name = UNIMAC_MDIO_DRV_NAME,
 		.of_match_table = unimac_mdio_ids,
 	},
 	.probe	= unimac_mdio_probe,
@@ -252,4 +268,4 @@ module_platform_driver(unimac_mdio_driver);
 MODULE_AUTHOR("Broadcom Corporation");
 MODULE_DESCRIPTION("Broadcom UniMAC MDIO bus controller");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:unimac-mdio");
+MODULE_ALIAS("platform:" UNIMAC_MDIO_DRV_NAME);
diff --git a/include/linux/platform_data/mdio-bcm-unimac.h b/include/linux/platform_data/mdio-bcm-unimac.h
new file mode 100644
index 000000000000..8a5f9f0b2c52
--- /dev/null
+++ b/include/linux/platform_data/mdio-bcm-unimac.h
@@ -0,0 +1,13 @@
+#ifndef __MDIO_BCM_UNIMAC_PDATA_H
+#define __MDIO_BCM_UNIMAC_PDATA_H
+
+struct unimac_mdio_pdata {
+	u32 phy_mask;
+	int (*wait_func)(void *data);
+	void *wait_func_data;
+	const char *bus_name;
+};
+
+#define UNIMAC_MDIO_DRV_NAME	"unimac-mdio"
+
+#endif /* __MDIO_BCM_UNIMAC_PDATA_H */
-- 
2.9.3

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

* [PATCH net-next 5/7] net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
                   ` (3 preceding siblings ...)
  2017-07-31 19:04 ` [PATCH net-next 4/7] net: phy: mdio-bcm-unimac: Allow specifying platform data Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 6/7] net: bcmgenet: Drop legacy MDIO code Florian Fainelli
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

Update the GENET driver to register an UniMAC MDIO bus controller for
the GENET internal MDIO bus, update the platform data code to attach the
PHY to the correct MDIO bus controller.

The Device Tree portion of the code is mostly left unmodified since the
lookup/binding is done via phandles and Device Tree nodes which are much
more flexible in locating and binding PHYs to their respective MDIO bus
controllers.

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

diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/broadcom/Kconfig
index 285f8bc25682..ec7a798c6bd1 100644
--- a/drivers/net/ethernet/broadcom/Kconfig
+++ b/drivers/net/ethernet/broadcom/Kconfig
@@ -65,6 +65,7 @@ config BCMGENET
 	select PHYLIB
 	select FIXED_PHY
 	select BCM7XXX_PHY
+	select MDIO_BCM_UNIMAC
 	help
 	  This driver supports the built-in Ethernet MACs found in the
 	  Broadcom BCM7xxx Set Top Box family chipset.
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
index b9344de669f8..4775999ee016 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
@@ -657,6 +657,7 @@ struct bcmgenet_priv {
 
 	struct clk *clk;
 	struct platform_device *pdev;
+	struct platform_device *mii_pdev;
 
 	/* WOL */
 	struct clk *clk_wol;
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 071fcbd14e6a..368d5eab306b 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -24,6 +24,7 @@
 #include <linux/of_net.h>
 #include <linux/of_mdio.h>
 #include <linux/platform_data/bcmgenet.h>
+#include <linux/platform_data/mdio-bcm-unimac.h>
 
 #include "bcmgenet.h"
 
@@ -464,31 +465,120 @@ static int bcmgenet_mii_alloc(struct bcmgenet_priv *priv)
 	return 0;
 }
 
-static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
+static struct device_node *bcmgenet_mii_of_find_mdio(struct bcmgenet_priv *priv)
 {
 	struct device_node *dn = priv->pdev->dev.of_node;
 	struct device *kdev = &priv->pdev->dev;
-	struct phy_device *phydev = NULL;
 	char *compat;
-	int phy_mode;
-	int ret;
 
 	compat = kasprintf(GFP_KERNEL, "brcm,genet-mdio-v%d", priv->version);
 	if (!compat)
-		return -ENOMEM;
+		return NULL;
 
 	priv->mdio_dn = of_find_compatible_node(dn, NULL, compat);
 	kfree(compat);
 	if (!priv->mdio_dn) {
 		dev_err(kdev, "unable to find MDIO bus node\n");
-		return -ENODEV;
+		return NULL;
 	}
 
-	ret = of_mdiobus_register(priv->mii_bus, priv->mdio_dn);
-	if (ret) {
-		dev_err(kdev, "failed to register MDIO bus\n");
-		return ret;
+	return priv->mdio_dn;
+}
+
+static void bcmgenet_mii_pdata_init(struct bcmgenet_priv *priv,
+				    struct unimac_mdio_pdata *ppd)
+{
+	struct device *kdev = &priv->pdev->dev;
+	struct bcmgenet_platform_data *pd = kdev->platform_data;
+
+	if (pd->phy_interface != PHY_INTERFACE_MODE_MOCA && pd->mdio_enabled) {
+		/*
+		 * Internal or external PHY with MDIO access
+		 */
+		if (pd->phy_address >= 0 && pd->phy_address < PHY_MAX_ADDR)
+			ppd->phy_mask = 1 << pd->phy_address;
+		else
+			ppd->phy_mask = 0;
 	}
+}
+
+static int bcmgenet_mii_wait(void *wait_func_data)
+{
+	struct bcmgenet_priv *priv = wait_func_data;
+
+	wait_event_timeout(priv->wq,
+			   !(bcmgenet_umac_readl(priv, UMAC_MDIO_CMD)
+			   & MDIO_START_BUSY),
+			   HZ / 100);
+	return 0;
+}
+
+static int bcmgenet_mii_register(struct bcmgenet_priv *priv)
+{
+	struct platform_device *pdev = priv->pdev;
+	struct bcmgenet_platform_data *pdata = pdev->dev.platform_data;
+	struct device_node *dn = pdev->dev.of_node;
+	struct unimac_mdio_pdata ppd;
+	struct platform_device *ppdev;
+	struct resource *pres, res;
+	int id, ret;
+
+	pres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	memset(&res, 0, sizeof(res));
+	memset(&ppd, 0, sizeof(ppd));
+
+	ppd.wait_func = bcmgenet_mii_wait;
+	ppd.wait_func_data = priv;
+	ppd.bus_name = "bcmgenet MII bus";
+
+	/* Unimac MDIO bus controller starts at UniMAC offset + MDIO_CMD
+	 * and is 2 * 32-bits word long, 8 bytes total.
+	 */
+	res.start = pres->start + GENET_UMAC_OFF + UMAC_MDIO_CMD;
+	res.end = res.start + 8;
+	res.flags = IORESOURCE_MEM;
+
+	if (dn)
+		id = of_alias_get_id(dn, "eth");
+	else
+		id = pdev->id;
+
+	ppdev = platform_device_alloc(UNIMAC_MDIO_DRV_NAME, id);
+	if (!ppdev)
+		return -ENOMEM;
+
+	/* Retain this platform_device pointer for later cleanup */
+	priv->mii_pdev = ppdev;
+	ppdev->dev.parent = &pdev->dev;
+	ppdev->dev.of_node = bcmgenet_mii_of_find_mdio(priv);
+	if (pdata)
+		bcmgenet_mii_pdata_init(priv, &ppd);
+
+	ret = platform_device_add_resources(ppdev, &res, 1);
+	if (ret)
+		goto out;
+
+	ret = platform_device_add_data(ppdev, &ppd, sizeof(ppd));
+	if (ret)
+		goto out;
+
+	ret = platform_device_add(ppdev);
+	if (ret)
+		goto out;
+
+	return 0;
+out:
+	platform_device_put(ppdev);
+	return ret;
+}
+
+static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
+{
+	struct device_node *dn = priv->pdev->dev.of_node;
+	struct device *kdev = &priv->pdev->dev;
+	struct phy_device *phydev;
+	int phy_mode;
+	int ret;
 
 	/* Fetch the PHY phandle */
 	priv->phy_dn = of_parse_phandle(dn, "phy-handle", 0);
@@ -536,33 +626,23 @@ static int bcmgenet_mii_pd_init(struct bcmgenet_priv *priv)
 {
 	struct device *kdev = &priv->pdev->dev;
 	struct bcmgenet_platform_data *pd = kdev->platform_data;
-	struct mii_bus *mdio = priv->mii_bus;
+	char phy_name[MII_BUS_ID_SIZE + 3];
+	char mdio_bus_id[MII_BUS_ID_SIZE];
 	struct phy_device *phydev;
-	int ret;
+
+	snprintf(mdio_bus_id, MII_BUS_ID_SIZE, "%s-%d",
+		 UNIMAC_MDIO_DRV_NAME, priv->pdev->id);
 
 	if (pd->phy_interface != PHY_INTERFACE_MODE_MOCA && pd->mdio_enabled) {
+		snprintf(phy_name, MII_BUS_ID_SIZE, PHY_ID_FMT,
+			 mdio_bus_id, pd->phy_address);
+
 		/*
 		 * Internal or external PHY with MDIO access
 		 */
-		if (pd->phy_address >= 0 && pd->phy_address < PHY_MAX_ADDR)
-			mdio->phy_mask = ~(1 << pd->phy_address);
-		else
-			mdio->phy_mask = 0;
-
-		ret = mdiobus_register(mdio);
-		if (ret) {
-			dev_err(kdev, "failed to register MDIO bus\n");
-			return ret;
-		}
-
-		if (pd->phy_address >= 0 && pd->phy_address < PHY_MAX_ADDR)
-			phydev = mdiobus_get_phy(mdio, pd->phy_address);
-		else
-			phydev = phy_find_first(mdio);
-
+		phydev = phy_attach(priv->dev, phy_name, pd->phy_interface);
 		if (!phydev) {
 			dev_err(kdev, "failed to register PHY device\n");
-			mdiobus_unregister(mdio);
 			return -ENODEV;
 		}
 	} else {
@@ -611,7 +691,7 @@ int bcmgenet_mii_init(struct net_device *dev)
 	struct device_node *dn = priv->pdev->dev.of_node;
 	int ret;
 
-	ret = bcmgenet_mii_alloc(priv);
+	ret = bcmgenet_mii_register(priv);
 	if (ret)
 		return ret;
 
@@ -625,8 +705,8 @@ int bcmgenet_mii_init(struct net_device *dev)
 	if (of_phy_is_fixed_link(dn))
 		of_phy_deregister_fixed_link(dn);
 	of_node_put(priv->phy_dn);
-	mdiobus_unregister(priv->mii_bus);
-	mdiobus_free(priv->mii_bus);
+	platform_device_unregister(priv->mii_pdev);
+	platform_device_put(priv->mii_pdev);
 	return ret;
 }
 
@@ -638,6 +718,6 @@ void bcmgenet_mii_exit(struct net_device *dev)
 	if (of_phy_is_fixed_link(dn))
 		of_phy_deregister_fixed_link(dn);
 	of_node_put(priv->phy_dn);
-	mdiobus_unregister(priv->mii_bus);
-	mdiobus_free(priv->mii_bus);
+	platform_device_unregister(priv->mii_pdev);
+	platform_device_put(priv->mii_pdev);
 }
-- 
2.9.3

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

* [PATCH net-next 6/7] net: bcmgenet: Drop legacy MDIO code
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
                   ` (4 preceding siblings ...)
  2017-07-31 19:04 ` [PATCH net-next 5/7] net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 19:04 ` [PATCH net-next 7/7] net: bcmgenet: Utilize bcmgenet_mii_exit() for error path Florian Fainelli
  2017-07-31 21:41 ` [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver David Miller
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

Now that we have fully migrated to the mdio-bcm-unimac driver, drop the
legacy MDIO bus code which did duplicate a fair amount of code.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmmii.c | 125 ---------------------------
 1 file changed, 125 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 368d5eab306b..7fdc352628f9 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -28,59 +28,6 @@
 
 #include "bcmgenet.h"
 
-/* read a value from the MII */
-static int bcmgenet_mii_read(struct mii_bus *bus, int phy_id, int location)
-{
-	int ret;
-	struct net_device *dev = bus->priv;
-	struct bcmgenet_priv *priv = netdev_priv(dev);
-	u32 reg;
-
-	bcmgenet_umac_writel(priv, (MDIO_RD | (phy_id << MDIO_PMD_SHIFT) |
-			     (location << MDIO_REG_SHIFT)), UMAC_MDIO_CMD);
-	/* Start MDIO transaction*/
-	reg = bcmgenet_umac_readl(priv, UMAC_MDIO_CMD);
-	reg |= MDIO_START_BUSY;
-	bcmgenet_umac_writel(priv, reg, UMAC_MDIO_CMD);
-	wait_event_timeout(priv->wq,
-			   !(bcmgenet_umac_readl(priv, UMAC_MDIO_CMD)
-			   & MDIO_START_BUSY),
-			   HZ / 100);
-	ret = bcmgenet_umac_readl(priv, UMAC_MDIO_CMD);
-
-	/* Some broken devices are known not to release the line during
-	 * turn-around, e.g: Broadcom BCM53125 external switches, so check for
-	 * that condition here and ignore the MDIO controller read failure
-	 * indication.
-	 */
-	if (!(bus->phy_ignore_ta_mask & 1 << phy_id) && (ret & MDIO_READ_FAIL))
-		return -EIO;
-
-	return ret & 0xffff;
-}
-
-/* write a value to the MII */
-static int bcmgenet_mii_write(struct mii_bus *bus, int phy_id,
-			      int location, u16 val)
-{
-	struct net_device *dev = bus->priv;
-	struct bcmgenet_priv *priv = netdev_priv(dev);
-	u32 reg;
-
-	bcmgenet_umac_writel(priv, (MDIO_WR | (phy_id << MDIO_PMD_SHIFT) |
-			     (location << MDIO_REG_SHIFT) | (0xffff & val)),
-			     UMAC_MDIO_CMD);
-	reg = bcmgenet_umac_readl(priv, UMAC_MDIO_CMD);
-	reg |= MDIO_START_BUSY;
-	bcmgenet_umac_writel(priv, reg, UMAC_MDIO_CMD);
-	wait_event_timeout(priv->wq,
-			   !(bcmgenet_umac_readl(priv, UMAC_MDIO_CMD) &
-			   MDIO_START_BUSY),
-			   HZ / 100);
-
-	return 0;
-}
-
 /* setup netdev link state when PHY link status change and
  * update UMAC and RGMII block when link up
  */
@@ -393,78 +340,6 @@ int bcmgenet_mii_probe(struct net_device *dev)
 	return 0;
 }
 
-/* Workaround for integrated BCM7xxx Gigabit PHYs which have a problem with
- * their internal MDIO management controller making them fail to successfully
- * be read from or written to for the first transaction.  We insert a dummy
- * BMSR read here to make sure that phy_get_device() and get_phy_id() can
- * correctly read the PHY MII_PHYSID1/2 registers and successfully register a
- * PHY device for this peripheral.
- *
- * Once the PHY driver is registered, we can workaround subsequent reads from
- * there (e.g: during system-wide power management).
- *
- * bus->reset is invoked before mdiobus_scan during mdiobus_register and is
- * therefore the right location to stick that workaround. Since we do not want
- * to read from non-existing PHYs, we either use bus->phy_mask or do a manual
- * Device Tree scan to limit the search area.
- */
-static int bcmgenet_mii_bus_reset(struct mii_bus *bus)
-{
-	struct net_device *dev = bus->priv;
-	struct bcmgenet_priv *priv = netdev_priv(dev);
-	struct device_node *np = priv->mdio_dn;
-	struct device_node *child = NULL;
-	u32 read_mask = 0;
-	int addr = 0;
-
-	if (!np) {
-		read_mask = 1 << priv->phy_addr;
-	} else {
-		for_each_available_child_of_node(np, child) {
-			addr = of_mdio_parse_addr(&dev->dev, child);
-			if (addr < 0)
-				continue;
-
-			read_mask |= 1 << addr;
-		}
-	}
-
-	for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
-		if (read_mask & 1 << addr) {
-			dev_dbg(&dev->dev, "Workaround for PHY @ %d\n", addr);
-			mdiobus_read(bus, addr, MII_BMSR);
-		}
-	}
-
-	return 0;
-}
-
-static int bcmgenet_mii_alloc(struct bcmgenet_priv *priv)
-{
-	struct mii_bus *bus;
-
-	if (priv->mii_bus)
-		return 0;
-
-	priv->mii_bus = mdiobus_alloc();
-	if (!priv->mii_bus) {
-		pr_err("failed to allocate\n");
-		return -ENOMEM;
-	}
-
-	bus = priv->mii_bus;
-	bus->priv = priv->dev;
-	bus->name = "bcmgenet MII bus";
-	bus->parent = &priv->pdev->dev;
-	bus->read = bcmgenet_mii_read;
-	bus->write = bcmgenet_mii_write;
-	bus->reset = bcmgenet_mii_bus_reset;
-	snprintf(bus->id, MII_BUS_ID_SIZE, "%s-%d",
-		 priv->pdev->name, priv->pdev->id);
-
-	return 0;
-}
-
 static struct device_node *bcmgenet_mii_of_find_mdio(struct bcmgenet_priv *priv)
 {
 	struct device_node *dn = priv->pdev->dev.of_node;
-- 
2.9.3

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

* [PATCH net-next 7/7] net: bcmgenet: Utilize bcmgenet_mii_exit() for error path
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
                   ` (5 preceding siblings ...)
  2017-07-31 19:04 ` [PATCH net-next 6/7] net: bcmgenet: Drop legacy MDIO code Florian Fainelli
@ 2017-07-31 19:04 ` Florian Fainelli
  2017-07-31 21:41 ` [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver David Miller
  7 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-07-31 19:04 UTC (permalink / raw)
  To: netdev; +Cc: davem, opendmb, jaedon.shin, pgynther, Florian Fainelli

bcmgenet_mii_init() has an error path which is strictly identical to the
unwinding that bcmgenet_mii_exit() does, so have bcmgenet_mii_init()
utilize bcmgenet_mii_exit() for that.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmmii.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 7fdc352628f9..33d3f60ac74b 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -563,7 +563,6 @@ static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv)
 int bcmgenet_mii_init(struct net_device *dev)
 {
 	struct bcmgenet_priv *priv = netdev_priv(dev);
-	struct device_node *dn = priv->pdev->dev.of_node;
 	int ret;
 
 	ret = bcmgenet_mii_register(priv);
@@ -577,11 +576,7 @@ int bcmgenet_mii_init(struct net_device *dev)
 	return 0;
 
 out:
-	if (of_phy_is_fixed_link(dn))
-		of_phy_deregister_fixed_link(dn);
-	of_node_put(priv->phy_dn);
-	platform_device_unregister(priv->mii_pdev);
-	platform_device_put(priv->mii_pdev);
+	bcmgenet_mii_exit(dev);
 	return ret;
 }
 
-- 
2.9.3

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

* Re: [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver
  2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
                   ` (6 preceding siblings ...)
  2017-07-31 19:04 ` [PATCH net-next 7/7] net: bcmgenet: Utilize bcmgenet_mii_exit() for error path Florian Fainelli
@ 2017-07-31 21:41 ` David Miller
  7 siblings, 0 replies; 11+ messages in thread
From: David Miller @ 2017-07-31 21:41 UTC (permalink / raw)
  To: f.fainelli; +Cc: netdev, opendmb, jaedon.shin, pgynther

From: Florian Fainelli <f.fainelli@gmail.com>
Date: Mon, 31 Jul 2017 12:04:21 -0700

> Hi all,
> 
> This patch series migrates the Broadcom GENET driver to use the mdio-bcm-unimac
> driver. This MDIO HW is the same as the one GENET internally embedds, yet for
> historical reasons the two drivers lived their own lives. Because of the GENET
> interrupt situation, we let it specify how it wants to signal MDIO operations
> completion using its driver-private waitqueue.
> 
> The diffstat is not super impressive, but it's still negative! This would
> make it easier in the future to absorb possible workarounds/bugs/features
> within the same location.
> 
> This was tested on BCM7260 (GENETv5, single instance), BCM7439 (GENETv4, triple
> instance) and BCM7445 (bcm_sf2 + mdio-bcm-unimac).
> 
> We also now have a nice /proc/iomem output:
> 
> f0b00000-f0b0fc4b : /rdb/ethernet@f0b00000
>   f0b00e14-f0b00e1c : unimac-mdio.0
> f0b20000-f0b2fc4b : /rdb/ethernet@f0b20000
>   f0b20e14-f0b20e1c : unimac-mdio.1
> f0b40000-f0b4fc4b : /rdb/ethernet@f0b40000
>   f0b40e14-f0b40e1c : unimac-mdio.2

I love cleanups like this... even if the diffstat breaks even :-)

Applied, thanks.

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

* Re: [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop
  2017-07-31 19:04 ` [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop Florian Fainelli
@ 2017-08-01  0:28   ` kbuild test robot
  2017-08-01  0:33     ` Florian Fainelli
  0 siblings, 1 reply; 11+ messages in thread
From: kbuild test robot @ 2017-08-01  0:28 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: kbuild-all, netdev, davem, opendmb, jaedon.shin, pgynther,
	Florian Fainelli

[-- Attachment #1: Type: text/plain, Size: 2271 bytes --]

Hi Florian,

[auto build test ERROR on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Florian-Fainelli/net-bcmgenet-utilize-MDIO-unimac-driver/20170801-075847
config: xtensa-allmodconfig (attached as .config)
compiler: xtensa-linux-gcc (GCC) 4.9.0
reproduce:
        wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=xtensa 

Note: the linux-review/Florian-Fainelli/net-bcmgenet-utilize-MDIO-unimac-driver/20170801-075847 HEAD 68043f6ab1b54d29abc5555fc56fdec46d280b76 builds fine.
      It only hurts bisectibility.

All errors (new ones prefixed by >>):

   drivers/net/phy/mdio-bcm-unimac.c: In function 'unimac_mdio_read':
>> drivers/net/phy/mdio-bcm-unimac.c:89:2: error: 'ret' undeclared (first use in this function)
     ret = unimac_mdio_poll(priv);
     ^
   drivers/net/phy/mdio-bcm-unimac.c:89:2: note: each undeclared identifier is reported only once for each function it appears in

vim +/ret +89 drivers/net/phy/mdio-bcm-unimac.c

    76	
    77	static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
    78	{
    79		struct unimac_mdio_priv *priv = bus->priv;
    80		u32 cmd;
    81	
    82		/* Prepare the read operation */
    83		cmd = MDIO_RD | (phy_id << MDIO_PMD_SHIFT) | (reg << MDIO_REG_SHIFT);
    84		__raw_writel(cmd, priv->base + MDIO_CMD);
    85	
    86		/* Start MDIO transaction */
    87		unimac_mdio_start(priv);
    88	
  > 89		ret = unimac_mdio_poll(priv);
    90		if (ret)
    91			return ret;
    92	
    93		cmd = __raw_readl(priv->base + MDIO_CMD);
    94	
    95		/* Some broken devices are known not to release the line during
    96		 * turn-around, e.g: Broadcom BCM53125 external switches, so check for
    97		 * that condition here and ignore the MDIO controller read failure
    98		 * indication.
    99		 */
   100		if (!(bus->phy_ignore_ta_mask & 1 << phy_id) && (cmd & MDIO_READ_FAIL))
   101			return -EIO;
   102	
   103		return cmd & 0xffff;
   104	}
   105	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 50916 bytes --]

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

* Re: [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop
  2017-08-01  0:28   ` kbuild test robot
@ 2017-08-01  0:33     ` Florian Fainelli
  0 siblings, 0 replies; 11+ messages in thread
From: Florian Fainelli @ 2017-08-01  0:33 UTC (permalink / raw)
  To: kbuild test robot
  Cc: kbuild-all, netdev, davem, opendmb, jaedon.shin, pgynther

On 07/31/2017 05:28 PM, kbuild test robot wrote:
> Hi Florian,
> 
> [auto build test ERROR on net-next/master]
> 
> url:    https://github.com/0day-ci/linux/commits/Florian-Fainelli/net-bcmgenet-utilize-MDIO-unimac-driver/20170801-075847
> config: xtensa-allmodconfig (attached as .config)
> compiler: xtensa-linux-gcc (GCC) 4.9.0
> reproduce:
>         wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
>         chmod +x ~/bin/make.cross
>         # save the attached .config to linux build tree
>         make.cross ARCH=xtensa 
> 
> Note: the linux-review/Florian-Fainelli/net-bcmgenet-utilize-MDIO-unimac-driver/20170801-075847 HEAD 68043f6ab1b54d29abc5555fc56fdec46d280b76 builds fine.
>       It only hurts bisectibility.
> 
> All errors (new ones prefixed by >>):
> 
>    drivers/net/phy/mdio-bcm-unimac.c: In function 'unimac_mdio_read':
>>> drivers/net/phy/mdio-bcm-unimac.c:89:2: error: 'ret' undeclared (first use in this function)
>      ret = unimac_mdio_poll(priv);
>      ^
>    drivers/net/phy/mdio-bcm-unimac.c:89:2: note: each undeclared identifier is reported only once for each function it appears in
> 
> vim +/ret +89 drivers/net/phy/mdio-bcm-unimac.c

This is "just" a bisectability problem, patch 4 does actually add the
int ret variable to store the return value...

I will still fix the unmet dependency warning, depends on would actually
be more correct here anyway.

> 
>     76	
>     77	static int unimac_mdio_read(struct mii_bus *bus, int phy_id, int reg)
>     78	{
>     79		struct unimac_mdio_priv *priv = bus->priv;
>     80		u32 cmd;
>     81	
>     82		/* Prepare the read operation */
>     83		cmd = MDIO_RD | (phy_id << MDIO_PMD_SHIFT) | (reg << MDIO_REG_SHIFT);
>     84		__raw_writel(cmd, priv->base + MDIO_CMD);
>     85	
>     86		/* Start MDIO transaction */
>     87		unimac_mdio_start(priv);
>     88	
>   > 89		ret = unimac_mdio_poll(priv);
>     90		if (ret)
>     91			return ret;
>     92	
>     93		cmd = __raw_readl(priv->base + MDIO_CMD);
>     94	
>     95		/* Some broken devices are known not to release the line during
>     96		 * turn-around, e.g: Broadcom BCM53125 external switches, so check for
>     97		 * that condition here and ignore the MDIO controller read failure
>     98		 * indication.
>     99		 */
>    100		if (!(bus->phy_ignore_ta_mask & 1 << phy_id) && (cmd & MDIO_READ_FAIL))
>    101			return -EIO;
>    102	
>    103		return cmd & 0xffff;
>    104	}
>    105	
> 
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
> 


-- 
Florian

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

end of thread, other threads:[~2017-08-01  0:33 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-31 19:04 [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 1/7] net: phy: mdio-bcm-unimac: factor busy polling loop Florian Fainelli
2017-08-01  0:28   ` kbuild test robot
2017-08-01  0:33     ` Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 2/7] net: phy: mdio-bcm-unimac: create unique bus names Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 3/7] net: phy: mdio-bcm-unimac: Add debug print for PHY workaround Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 4/7] net: phy: mdio-bcm-unimac: Allow specifying platform data Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 5/7] net: bcmgenet: utilize generic Broadcom UniMAC MDIO controller driver Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 6/7] net: bcmgenet: Drop legacy MDIO code Florian Fainelli
2017-07-31 19:04 ` [PATCH net-next 7/7] net: bcmgenet: Utilize bcmgenet_mii_exit() for error path Florian Fainelli
2017-07-31 21:41 ` [PATCH net-next 0/7] net: bcmgenet: utilize MDIO unimac driver David Miller

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.