mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-30 19:11:37 +00:00
net: keystone_net: increase PHY auto negotiate time
The new Marvel PHY (88E1514) used on K2L/K2E EVM requires longer time to auto negotiate with SoC's SGMII port. It can take about 3 sec to up the PHY after reset, so add code to expose sgmii auto negotiation waiting process. Acked-by: Vitaly Andrianov <vitalya@ti.com> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
This commit is contained in:
parent
ff11c7697c
commit
c05d05e720
1 changed files with 31 additions and 5 deletions
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <net.h>
|
#include <net.h>
|
||||||
#include <phy.h>
|
#include <phy.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <miiphy.h>
|
#include <miiphy.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <asm/ti-common/keystone_nav.h>
|
#include <asm/ti-common/keystone_nav.h>
|
||||||
|
@ -30,6 +31,7 @@ static unsigned int sys_has_mdio = 1;
|
||||||
#define RX_BUFF_NUMS 24
|
#define RX_BUFF_NUMS 24
|
||||||
#define RX_BUFF_LEN 1520
|
#define RX_BUFF_LEN 1520
|
||||||
#define MAX_SIZE_STREAM_BUFFER RX_BUFF_LEN
|
#define MAX_SIZE_STREAM_BUFFER RX_BUFF_LEN
|
||||||
|
#define SGMII_ANEG_TIMEOUT 4000
|
||||||
|
|
||||||
static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16);
|
static u8 rx_buffs[RX_BUFF_NUMS * RX_BUFF_LEN] __aligned(16);
|
||||||
|
|
||||||
|
@ -169,7 +171,7 @@ int keystone_sgmii_link_status(int port)
|
||||||
(status & SGMII_REG_STATUS_LINK);
|
(status & SGMII_REG_STATUS_LINK);
|
||||||
}
|
}
|
||||||
|
|
||||||
int keystone_sgmii_config(int port, int interface)
|
int keystone_sgmii_config(struct phy_device *phy_dev, int port, int interface)
|
||||||
{
|
{
|
||||||
unsigned int i, status, mask;
|
unsigned int i, status, mask;
|
||||||
unsigned int mr_adv_ability, control;
|
unsigned int mr_adv_ability, control;
|
||||||
|
@ -230,12 +232,36 @@ int keystone_sgmii_config(int port, int interface)
|
||||||
if (control & SGMII_REG_CONTROL_AUTONEG)
|
if (control & SGMII_REG_CONTROL_AUTONEG)
|
||||||
mask |= SGMII_REG_STATUS_AUTONEG;
|
mask |= SGMII_REG_STATUS_AUTONEG;
|
||||||
|
|
||||||
for (i = 0; i < 1000; i++) {
|
|
||||||
status = __raw_readl(SGMII_STATUS_REG(port));
|
status = __raw_readl(SGMII_STATUS_REG(port));
|
||||||
if ((status & mask) == mask)
|
if ((status & mask) == mask)
|
||||||
break;
|
return 0;
|
||||||
|
|
||||||
|
printf("\n%s Waiting for SGMII auto negotiation to complete",
|
||||||
|
phy_dev->dev->name);
|
||||||
|
while ((status & mask) != mask) {
|
||||||
|
/*
|
||||||
|
* Timeout reached ?
|
||||||
|
*/
|
||||||
|
if (i > SGMII_ANEG_TIMEOUT) {
|
||||||
|
puts(" TIMEOUT !\n");
|
||||||
|
phy_dev->link = 0;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctrlc()) {
|
||||||
|
puts("user interrupt!\n");
|
||||||
|
phy_dev->link = 0;
|
||||||
|
return -EINTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((i++ % 500) == 0)
|
||||||
|
printf(".");
|
||||||
|
|
||||||
|
udelay(1000); /* 1 ms */
|
||||||
|
status = __raw_readl(SGMII_STATUS_REG(port));
|
||||||
|
}
|
||||||
|
puts(" done\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -374,7 +400,7 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
|
||||||
|
|
||||||
keystone2_net_serdes_setup();
|
keystone2_net_serdes_setup();
|
||||||
|
|
||||||
keystone_sgmii_config(eth_priv->slave_port - 1,
|
keystone_sgmii_config(phy_dev, eth_priv->slave_port - 1,
|
||||||
eth_priv->sgmii_link_type);
|
eth_priv->sgmii_link_type);
|
||||||
|
|
||||||
udelay(10000);
|
udelay(10000);
|
||||||
|
|
Loading…
Add table
Reference in a new issue