diff options
| author | Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> | 2012-12-04 09:32:00 +0100 | 
|---|---|---|
| committer | Joe Hershberger <joe.hershberger@ni.com> | 2013-06-24 19:10:14 -0500 | 
| commit | cd3ca3ff4959f1279b0dce2f8cfadac7c734f822 (patch) | |
| tree | 7def7d7f7cfcfcefc1a3f4b5895ab6f882bd0121 /drivers | |
| parent | aeceec0d0ee492d6d20d4b4b07f7d9b6c3b109be (diff) | |
| download | olio-uboot-2014.01-cd3ca3ff4959f1279b0dce2f8cfadac7c734f822.tar.xz olio-uboot-2014.01-cd3ca3ff4959f1279b0dce2f8cfadac7c734f822.zip | |
NET: mvgbe: add phylib support
This add phylib support to the Marvell GBE driver.
Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/mvgbe.c | 69 | 
1 files changed, 65 insertions, 4 deletions
| diff --git a/drivers/net/mvgbe.c b/drivers/net/mvgbe.c index 47bf27c8b..4b588235a 100644 --- a/drivers/net/mvgbe.c +++ b/drivers/net/mvgbe.c @@ -52,7 +52,7 @@ DECLARE_GLOBAL_DATA_PTR;  #define MV_PHY_ADR_REQUEST 0xee  #define MVGBE_SMI_REG (((struct mvgbe_registers *)MVGBE0_BASE)->smi) -#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) +#if defined(CONFIG_PHYLIB) || defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  /*   * smi_reg_read - miiphy_read callback function.   * @@ -184,6 +184,25 @@ static int smi_reg_write(const char *devname, u8 phy_adr, u8 reg_ofs, u16 data)  }  #endif +#if defined(CONFIG_PHYLIB) +int mvgbe_phy_read(struct mii_dev *bus, int phy_addr, int dev_addr, +		   int reg_addr) +{ +	u16 data; +	int ret; +	ret = smi_reg_read(bus->name, phy_addr, reg_addr, &data); +	if (ret) +		return ret; +	return data; +} + +int mvgbe_phy_write(struct mii_dev *bus, int phy_addr, int dev_addr, +		    int reg_addr, u16 data) +{ +	return smi_reg_write(bus->name, phy_addr, reg_addr, data); +} +#endif +  /* Stop and checks all queues */  static void stop_queue(u32 * qreg)  { @@ -467,8 +486,9 @@ static int mvgbe_init(struct eth_device *dev)  	/* Enable port Rx. */  	MVGBE_REG_WR(regs->rqc, (1 << RXUQ)); -#if (defined (CONFIG_MII) || defined (CONFIG_CMD_MII)) \ -	 && defined (CONFIG_SYS_FAULT_ECHO_LINK_DOWN) +#if (defined(CONFIG_MII) || defined(CONFIG_CMD_MII)) && \ +	!defined(CONFIG_PHYLIB) && \ +	defined(CONFIG_SYS_FAULT_ECHO_LINK_DOWN)  	/* Wait up to 5s for the link status */  	for (i = 0; i < 5; i++) {  		u16 phyadr; @@ -647,6 +667,45 @@ static int mvgbe_recv(struct eth_device *dev)  	return 0;  } +#if defined(CONFIG_PHYLIB) +int mvgbe_phylib_init(struct eth_device *dev, int phyid) +{ +	struct mii_dev *bus; +	struct phy_device *phydev; +	int ret; + +	bus = mdio_alloc(); +	if (!bus) { +		printf("mdio_alloc failed\n"); +		return -ENOMEM; +	} +	bus->read = mvgbe_phy_read; +	bus->write = mvgbe_phy_write; +	sprintf(bus->name, dev->name); + +	ret = mdio_register(bus); +	if (ret) { +		printf("mdio_register failed\n"); +		free(bus); +		return -ENOMEM; +	} + +	/* Set phy address of the port */ +	mvgbe_phy_write(bus, MV_PHY_ADR_REQUEST, 0, MV_PHY_ADR_REQUEST, phyid); + +	phydev = phy_connect(bus, phyid, dev, PHY_INTERFACE_MODE_RGMII); +	if (!phydev) { +		printf("phy_connect failed\n"); +		return -ENODEV; +	} + +	phy_config(phydev); +	phy_startup(phydev); + +	return 0; +} +#endif +  int mvgbe_initialize(bd_t *bis)  {  	struct mvgbe_device *dmvgbe; @@ -729,7 +788,9 @@ error1:  		eth_register(dev); -#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII) +#if defined(CONFIG_PHYLIB) +		mvgbe_phylib_init(dev, PHY_BASE_ADR + devnum); +#elif defined(CONFIG_MII) || defined(CONFIG_CMD_MII)  		miiphy_register(dev->name, smi_reg_read, smi_reg_write);  		/* Set phy address of the port */  		miiphy_write(dev->name, MV_PHY_ADR_REQUEST, |