Changeset 14826


Ignore:
Timestamp:
2009-03-09T22:57:47+01:00 (9 years ago)
Author:
florian
Message:

[package] make robocfg work on brcm63xx as well (#4599)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/robocfg/src/robocfg.c

    r3993 r14826  
    2020 */ 
    2121  
     22#include <errno.h> 
    2223#include <stdio.h> 
    2324#include <stdlib.h> 
     
    248249} 
    249250 
     251static robo_t robo; 
     252int bcm53xx_probe(const char *dev) 
     253{ 
     254        struct ethtool_drvinfo info; 
     255        unsigned int phyid; 
     256        int ret; 
     257 
     258        fprintf(stderr, "probing %s\n", dev); 
     259 
     260        strcpy(robo.ifr.ifr_name, dev); 
     261        memset(&info, 0, sizeof(info)); 
     262        info.cmd = ETHTOOL_GDRVINFO; 
     263        robo.ifr.ifr_data = (caddr_t)&info; 
     264        ret = ioctl(robo.fd, SIOCETHTOOL, (caddr_t)&robo.ifr); 
     265        if (ret < 0) { 
     266                perror("SIOCETHTOOL"); 
     267                return ret; 
     268        } 
     269 
     270        if (    strcmp(info.driver, "et0") && 
     271                strcmp(info.driver, "b44") && 
     272                strcmp(info.driver, "bcm63xx_enet") ) { 
     273                        fprintf(stderr, "driver not supported %s\n", info.driver); 
     274                        return -ENOSYS; 
     275        } 
     276 
     277        /* try access using MII ioctls - get phy address */ 
     278        robo.et = 0; 
     279        if (ioctl(robo.fd, SIOCGMIIPHY, &robo.ifr) < 0) 
     280                robo.et = 1; 
     281 
     282        if (robo.et) { 
     283                unsigned int args[2] = { 2 }; 
     284                 
     285                robo.ifr.ifr_data = (caddr_t) args; 
     286                ret = ioctl(robo.fd, SIOCGETCPHYRD, (caddr_t)&robo.ifr); 
     287                if (ret < 0) { 
     288                        perror("SIOCGETCPHYRD"); 
     289                        return ret; 
     290                } 
     291                phyid = args[1] & 0xffff; 
     292         
     293                args[0] = 3; 
     294                robo.ifr.ifr_data = (caddr_t) args; 
     295                ret = ioctl(robo.fd, SIOCGETCPHYRD, (caddr_t)&robo.ifr); 
     296                if (ret < 0) { 
     297                        perror("SIOCGETCPHYRD"); 
     298                        return ret; 
     299                } 
     300                phyid |= args[1] << 16; 
     301        } else { 
     302                struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&robo.ifr.ifr_data; 
     303                mii->phy_id = ROBO_PHY_ADDR; 
     304                mii->reg_num = 2; 
     305                ret = ioctl(robo.fd, SIOCGMIIREG, &robo.ifr); 
     306                if (ret < 0) { 
     307                        perror("SIOCGMIIREG"); 
     308                        return ret; 
     309                } 
     310                phyid = mii->val_out & 0xffff; 
     311 
     312                mii->phy_id = ROBO_PHY_ADDR; 
     313                mii->reg_num = 3; 
     314                ret = ioctl(robo.fd, SIOCGMIIREG, &robo.ifr); 
     315                if (ret < 0) { 
     316                        perror("SIOCGMIIREG"); 
     317                        return ret; 
     318                } 
     319                phyid |= mii->val_out << 16; 
     320        } 
     321 
     322        if (phyid == 0xffffffff || phyid == 0x55210022) { 
     323                perror("phyid"); 
     324                return -EIO; 
     325        } 
     326         
     327        return 0; 
     328} 
     329 
    250330int 
    251331main(int argc, char *argv[]) 
     
    257337        u32 phyid; 
    258338         
    259         static robo_t robo; 
    260         struct ethtool_drvinfo info; 
    261          
    262339        if ((robo.fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { 
    263340                perror("socket"); 
     
    265342        } 
    266343 
    267         /* the only interface for now */ 
    268         strcpy(robo.ifr.ifr_name, "eth0"); 
    269  
    270         memset(&info, 0, sizeof(info)); 
    271         info.cmd = ETHTOOL_GDRVINFO; 
    272         robo.ifr.ifr_data = (caddr_t)&info; 
    273         if (ioctl(robo.fd, SIOCETHTOOL, (caddr_t)&robo.ifr) < 0) { 
    274                 perror("SIOCETHTOOL: your ethernet module is either unsupported or outdated"); 
    275 //              exit(1); 
    276         } else 
    277         if (strcmp(info.driver, "et0") && strcmp(info.driver, "b44")) { 
    278                 fprintf(stderr, "No suitable module found for %s (managed by %s)\n",  
    279                         robo.ifr.ifr_name, info.driver); 
    280                 exit(1); 
    281         } 
    282          
    283         /* try access using MII ioctls - get phy address */ 
    284         if (ioctl(robo.fd, SIOCGMIIPHY, &robo.ifr) < 0) { 
    285                 robo.et = 1; 
    286         } else { 
    287                 /* got phy address check for robo address */ 
    288                 struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&robo.ifr.ifr_data; 
    289                 if (mii->phy_id != ROBO_PHY_ADDR) { 
    290                         fprintf(stderr, "Invalid phy address (%d)\n", mii->phy_id); 
     344        if (bcm53xx_probe("eth1")) { 
     345                if (bcm53xx_probe("eth0")) { 
     346                        perror("bcm53xx_probe"); 
    291347                        exit(1); 
    292348                } 
    293349        } 
    294350 
    295         phyid = mdio_read(&robo, ROBO_PHY_ADDR, 0x2) |  
    296                 (mdio_read(&robo, ROBO_PHY_ADDR, 0x3) << 16); 
    297          
    298         if (phyid == 0xffffffff || phyid == 0x55210022) { 
    299                 fprintf(stderr, "No Robo switch in managed mode found\n"); 
    300                 exit(1); 
    301         } 
    302          
    303351        robo5350 = robo_vlan5350(&robo); 
    304352         
Note: See TracChangeset for help on using the changeset viewer.