diff options
author | Florian Fainelli <florian@openwrt.org> | 2009-03-09 21:57:47 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2009-03-09 21:57:47 +0000 |
commit | 2d6c8c64a3565911c85685002ec5ed39c24e0396 (patch) | |
tree | 621a8ac92ba1202a1ddcb737e08a1d900242e075 /package/robocfg/src/robocfg.c | |
parent | 04909ca614cb2b52dafe1f558743108d62a6db65 (diff) | |
download | mtk-20170518-2d6c8c64a3565911c85685002ec5ed39c24e0396.zip mtk-20170518-2d6c8c64a3565911c85685002ec5ed39c24e0396.tar.gz mtk-20170518-2d6c8c64a3565911c85685002ec5ed39c24e0396.tar.bz2 |
make robocfg work on brcm63xx as well (#4599)
SVN-Revision: 14826
Diffstat (limited to 'package/robocfg/src/robocfg.c')
-rw-r--r-- | package/robocfg/src/robocfg.c | 118 |
1 files changed, 83 insertions, 35 deletions
diff --git a/package/robocfg/src/robocfg.c b/package/robocfg/src/robocfg.c index b8fc49f..7a4094d 100644 --- a/package/robocfg/src/robocfg.c +++ b/package/robocfg/src/robocfg.c @@ -19,6 +19,7 @@ * 02110-1301, USA. */ +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -247,59 +248,106 @@ void usage() mdix[0].name, mdix[1].name, mdix[2].name); } -int -main(int argc, char *argv[]) +static robo_t robo; +int bcm53xx_probe(const char *dev) { - u16 val16; - u16 mac[3]; - int i = 0, j; - int robo5350 = 0; - u32 phyid; - - static robo_t robo; struct ethtool_drvinfo info; - - if ((robo.fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("socket"); - exit(1); - } + unsigned int phyid; + int ret; - /* the only interface for now */ - strcpy(robo.ifr.ifr_name, "eth0"); + fprintf(stderr, "probing %s\n", dev); + strcpy(robo.ifr.ifr_name, dev); memset(&info, 0, sizeof(info)); info.cmd = ETHTOOL_GDRVINFO; robo.ifr.ifr_data = (caddr_t)&info; - if (ioctl(robo.fd, SIOCETHTOOL, (caddr_t)&robo.ifr) < 0) { - perror("SIOCETHTOOL: your ethernet module is either unsupported or outdated"); -// exit(1); - } else - if (strcmp(info.driver, "et0") && strcmp(info.driver, "b44")) { - fprintf(stderr, "No suitable module found for %s (managed by %s)\n", - robo.ifr.ifr_name, info.driver); - exit(1); + ret = ioctl(robo.fd, SIOCETHTOOL, (caddr_t)&robo.ifr); + if (ret < 0) { + perror("SIOCETHTOOL"); + return ret; } - + + if ( strcmp(info.driver, "et0") && + strcmp(info.driver, "b44") && + strcmp(info.driver, "bcm63xx_enet") ) { + fprintf(stderr, "driver not supported %s\n", info.driver); + return -ENOSYS; + } + /* try access using MII ioctls - get phy address */ - if (ioctl(robo.fd, SIOCGMIIPHY, &robo.ifr) < 0) { + robo.et = 0; + if (ioctl(robo.fd, SIOCGMIIPHY, &robo.ifr) < 0) robo.et = 1; + + if (robo.et) { + unsigned int args[2] = { 2 }; + + robo.ifr.ifr_data = (caddr_t) args; + ret = ioctl(robo.fd, SIOCGETCPHYRD, (caddr_t)&robo.ifr); + if (ret < 0) { + perror("SIOCGETCPHYRD"); + return ret; + } + phyid = args[1] & 0xffff; + + args[0] = 3; + robo.ifr.ifr_data = (caddr_t) args; + ret = ioctl(robo.fd, SIOCGETCPHYRD, (caddr_t)&robo.ifr); + if (ret < 0) { + perror("SIOCGETCPHYRD"); + return ret; + } + phyid |= args[1] << 16; } else { - /* got phy address check for robo address */ struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&robo.ifr.ifr_data; - if (mii->phy_id != ROBO_PHY_ADDR) { - fprintf(stderr, "Invalid phy address (%d)\n", mii->phy_id); - exit(1); + mii->phy_id = ROBO_PHY_ADDR; + mii->reg_num = 2; + ret = ioctl(robo.fd, SIOCGMIIREG, &robo.ifr); + if (ret < 0) { + perror("SIOCGMIIREG"); + return ret; } + phyid = mii->val_out & 0xffff; + + mii->phy_id = ROBO_PHY_ADDR; + mii->reg_num = 3; + ret = ioctl(robo.fd, SIOCGMIIREG, &robo.ifr); + if (ret < 0) { + perror("SIOCGMIIREG"); + return ret; + } + phyid |= mii->val_out << 16; } - phyid = mdio_read(&robo, ROBO_PHY_ADDR, 0x2) | - (mdio_read(&robo, ROBO_PHY_ADDR, 0x3) << 16); - if (phyid == 0xffffffff || phyid == 0x55210022) { - fprintf(stderr, "No Robo switch in managed mode found\n"); - exit(1); + perror("phyid"); + return -EIO; } + return 0; +} + +int +main(int argc, char *argv[]) +{ + u16 val16; + u16 mac[3]; + int i = 0, j; + int robo5350 = 0; + u32 phyid; + + if ((robo.fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + perror("socket"); + exit(1); + } + + if (bcm53xx_probe("eth1")) { + if (bcm53xx_probe("eth0")) { + perror("bcm53xx_probe"); + exit(1); + } + } + robo5350 = robo_vlan5350(&robo); for (i = 1; i < argc;) { |