Hello Liu, Liu Dave-R63238 wrote: >> did you make any effort to refactor this into the existing >> eth_type == GIGA_ETH code? I'm not sure why that code became >> conditional in commit >> 24c3aca3f1358b113d3215adb5433b156e99f72b "mpc83xx: Add >> support for the MPC832XEMDS board" in the first place - Dave? > > I don't remember why I added the eth_type==GIGA_ETH condition. > If it is possible, please refactor it as Kim.
Hmm.. while looking at this code, a question comes in mind: Did this code (eth_type==GIGA_ETH) work correctly? I see there is a switching possible from 1000 to 100 or 10, but never back to 1000, because the 1000 case did nothing ...? Is this intentionally? Also uec->uec_info->enet_interface is never updated, which should be done ... or? If the above mentioned is no problem, following patch comes in my mind: If using UCC as Ethernet Controller and type = FAST_ETH, it was not possible to switch between 10 and 100 MBit interfaces. This patch adds this for following interfaces: 10_MII 10_RMII 10_RGMII 100_MII 100_RMII 100_RGMII Signed-off-by: Heiko Schocher <h...@denx.de> --- drivers/qe/uec.c | 104 ++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 78 insertions(+), 26 deletions(-) diff --git a/drivers/qe/uec.c b/drivers/qe/uec.c index db95ada..263df9c 100644 --- a/drivers/qe/uec.c +++ b/drivers/qe/uec.c @@ -65,6 +65,22 @@ static uec_info_t uec_info[] = { #define MAXCONTROLLERS (8) +static char *enet_interface_name[] = { + "10_MII", + "10_RMII", + "10_RGMII", + "100_MII", + "100_RMII", + "100_RGMII", + "1000_GMII", + "1000_RGMII", + "1000_RGMII_ID", + "1000_RGMII_RXID", + "1000_TBI", + "1000_RTBI", + "1000_SGMII" +}; + static struct eth_device *devlist[MAXCONTROLLERS]; u16 phy_read (struct uec_mii_info *mii_info, u16 regnum); @@ -497,6 +513,66 @@ bus_fail: return err; } +static void adjust_enet_interface_speed(int speed, struct eth_device *dev) +{ + uec_private_t *uec = (uec_private_t *)dev->priv; + uec_t *uec_regs; + int change = 0; + + extern void change_phy_interface_mode(struct eth_device *dev, + enet_interface_e mode); + uec_regs = uec->uec_regs; + + switch (speed) { + case 1000: + break; + case 100: + switch (uec->uec_info->enet_interface) { + case ENET_10_MII: + case ENET_10_RMII: + case ENET_10_RGMII: + uec->uec_info->enet_interface += 3; + change = 1; + break; + default: + uec->uec_info->enet_interface = ENET_100_RGMII; + change = 1; + break; + } + break; + case 10: + switch (uec->uec_info->enet_interface) { + case ENET_100_MII: + case ENET_100_RMII: + case ENET_100_RGMII: + uec->uec_info->enet_interface -= 3; + change = 1; + break; + default: + uec->uec_info->enet_interface = ENET_10_RGMII; + change = 1; + break; + } + break; + default: + /* do nothing, not supported yet */ + printf("%s: speed: %d and mode: %d not supported yet.\n", + __func__, speed, uec->uec_info->enet_interface); + break; + } + if (change) { + printf ("switching to %s\n", + enet_interface_name[uec->uec_info->enet_interface]); + /* change phy */ + change_phy_interface_mode(dev, + uec->uec_info->enet_interface); + /* change the MAC interface mode */ + uec_set_mac_if_mode(uec, + uec->uec_info->enet_interface); + + } +} + static void adjust_link(struct eth_device *dev) { uec_private_t *uec = (uec_private_t *)dev->priv; @@ -522,32 +598,7 @@ static void adjust_link(struct eth_device *dev) } if (mii_info->speed != uec->oldspeed) { - if (uec->uec_info->uf_info.eth_type == GIGA_ETH) { - switch (mii_info->speed) { - case 1000: - break; - case 100: - printf ("switching to rgmii 100\n"); - /* change phy to rgmii 100 */ - change_phy_interface_mode(dev, - ENET_100_RGMII); - /* change the MAC interface mode */ - uec_set_mac_if_mode(uec,ENET_100_RGMII); - break; - case 10: - printf ("switching to rgmii 10\n"); - /* change phy to rgmii 10 */ - change_phy_interface_mode(dev, - ENET_10_RGMII); - /* change the MAC interface mode */ - uec_set_mac_if_mode(uec,ENET_10_RGMII); - break; - default: - printf("%s: Ack,Speed(%d)is illegal\n", - dev->name, mii_info->speed); - break; - } - } + adjust_enet_interface_speed(mii_info->speed, dev); printf("%s: Speed %dBT\n", dev->name, mii_info->speed); uec->oldspeed = mii_info->speed; @@ -1215,6 +1266,7 @@ static int uec_init(struct eth_device* dev, bd_t *bd) if (err || i <= 0) printf("warning: %s: timeout on PHY link\n", dev->name); + adjust_link(dev); uec->the_first_run = 1; } -- 1.6.2.5 bye Heiko -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot