diff mbox

[RFC] ixp4xx_eth: Allow setting the MDIO bus name in platform data

Message ID 20140324151729.1b8e3bb5@marrow.netinsight.se (mailing list archive)
State New, archived
Headers show

Commit Message

Simon Kagstrom March 24, 2014, 2:17 p.m. UTC
Allows using e.g., a fixed MDIO bus with the ixp4xx_eth driver.
Example:

  static struct eth_plat_info board_plat_eth_internal[] = {
	{
		.mdio_bus_id	= "fixed-0",
		.phy		= 31,
		.rxq		= 4,
		.txreadyq	= 21,
		.hwaddr		= {0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
	}
  };

  static struct platform_device board_eth_internal = {
	.name			= "ixp4xx_eth",
	.id			= IXP4XX_ETH_NPEC,
	.dev.platform_data	= board_plat_eth_internal,
  };

Signed-off-by: Simon Kagstrom <simon.kagstrom@netinsight.net>
---
I'm unsure if this is the correct way of doing it for the legacy ixp4xx
platform. It seems most boards which use the fixed PHYs are DT-based			
PPC ones.

 arch/arm/mach-ixp4xx/include/mach/platform.h |    1 +
 drivers/net/ethernet/xscale/ixp4xx_eth.c     |    7 ++++++-
 2 files changed, 7 insertions(+), 1 deletion(-)

Comments

Krzysztof Halasa March 24, 2014, 8:34 p.m. UTC | #1
Simon Kågström <simon.kagstrom@netinsight.net> writes:

> Allows using e.g., a fixed MDIO bus with the ixp4xx_eth driver.
> Example:
>
>   static struct eth_plat_info board_plat_eth_internal[] = {
> 	{
> 		.mdio_bus_id	= "fixed-0",
> 		.phy		= 31,
> 		.rxq		= 4,
> 		.txreadyq	= 21,
> 		.hwaddr		= {0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
> 	}
>   };

Why do we need it? I'm not sure I know what constitutes a "fixed MDIO
bus".
Florian Fainelli March 24, 2014, 8:42 p.m. UTC | #2
2014-03-24 13:34 GMT-07:00 Krzysztof Halasa <khc@pm.waw.pl>:
> Simon Kågström <simon.kagstrom@netinsight.net> writes:
>
>> Allows using e.g., a fixed MDIO bus with the ixp4xx_eth driver.
>> Example:
>>
>>   static struct eth_plat_info board_plat_eth_internal[] = {
>>       {
>>               .mdio_bus_id    = "fixed-0",
>>               .phy            = 31,
>>               .rxq            = 4,
>>               .txreadyq       = 21,
>>               .hwaddr         = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00},
>>       }
>>   };
>
> Why do we need it? I'm not sure I know what constitutes a "fixed MDIO
> bus".

This is a software emulation MDIO bus for when your Ethernet MAC is
connected to a PHY which does not appear on the MDIO bus. This is
typically used to provide the Ethernet driver with a link that is
always seen as UP, when you cannot directly query it via MDIO/MDC.
Simon Kagstrom March 25, 2014, 11:37 a.m. UTC | #3
On Mon, 24 Mar 2014 13:42:29 -0700
Florian Fainelli <f.fainelli@gmail.com> wrote:

> 2014-03-24 13:34 GMT-07:00 Krzysztof Halasa <khc@pm.waw.pl>:
> > Simon Kågström <simon.kagstrom@netinsight.net> writes:
> >
> >> Allows using e.g., a fixed MDIO bus with the ixp4xx_eth driver.
> >> Example:
> >
> >
> > Why do we need it? I'm not sure I know what constitutes a "fixed MDIO
> > bus".
> 
> This is a software emulation MDIO bus for when your Ethernet MAC is
> connected to a PHY which does not appear on the MDIO bus. This is
> typically used to provide the Ethernet driver with a link that is
> always seen as UP, when you cannot directly query it via MDIO/MDC.

Yes, exactly. We have a board which uses two of the ipx4xx NPE:s, one
which uses a real PHY via the ixp4xx_eth MDIO bus and one which uses
the fixed PHY driver.

To support this, we need this patch as the driver would otherwise
always look for the PHY on the ixp4xx_eth MDIO bus.

// Simon
diff mbox

Patch

diff --git a/arch/arm/mach-ixp4xx/include/mach/platform.h b/arch/arm/mach-ixp4xx/include/mach/platform.h
index 75c4c65..c6114b9 100644
--- a/arch/arm/mach-ixp4xx/include/mach/platform.h
+++ b/arch/arm/mach-ixp4xx/include/mach/platform.h
@@ -97,6 +97,7 @@  struct ixp4xx_pata_data {
 
 /* Information about built-in Ethernet MAC interfaces */
 struct eth_plat_info {
+	const char *mdio_bus_id; /* MDIO bus name. NULL is the ixp4xx_eth bus */
 	u8 phy;		/* MII PHY ID, 0 - 31 */
 	u8 rxq;		/* configurable, currently 0 - 31 only */
 	u8 txreadyq;
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c
index e540e51..31fe055 100644
--- a/drivers/net/ethernet/xscale/ixp4xx_eth.c
+++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c
@@ -1410,6 +1410,7 @@  static int eth_init_one(struct platform_device *pdev)
 	struct net_device *dev;
 	struct eth_plat_info *plat = dev_get_platdata(&pdev->dev);
 	u32 regs_phys;
+	const char *mdio_bus_id;
 	char phy_id[MII_BUS_ID_SIZE + 3];
 	int err;
 
@@ -1477,8 +1478,12 @@  static int eth_init_one(struct platform_device *pdev)
 	__raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control);
 	udelay(50);
 
+	mdio_bus_id = mdio_bus->id;
+	if (plat->mdio_bus_id)
+		mdio_bus_id = plat->mdio_bus_id;
+
 	snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT,
-		mdio_bus->id, plat->phy);
+		mdio_bus_id, plat->phy);
 	port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link,
 				   PHY_INTERFACE_MODE_MII);
 	if (IS_ERR(port->phydev)) {