Ticket #4599: bcm63xx-robo-switch.patch

File bcm63xx-robo-switch.patch, 5.8 KB (added by LinuxInside, 9 years ago)

Patch for robo switch support

  • package/switch/src/switch-robo.c

     
    4141 
    4242#define ROBO_PHY_ADDR           0x1E    /* robo switch phy address */ 
    4343#define ROBO_PHY_ADDR_TG3       0x01    /* Tigon3 PHY address */ 
     44#define ROBO_PHY_ADDR_BCM63XX   0x00    /* BCM63XX PHY address */ 
    4445 
    4546/* MII registers */ 
    4647#define REG_MII_PAGE    0x10    /* MII Page register */ 
     
    318319                /* got phy address check for robo address */ 
    319320                struct mii_ioctl_data *mii = (struct mii_ioctl_data *) &robo.ifr.ifr_data; 
    320321                if ((mii->phy_id != ROBO_PHY_ADDR) && 
     322                    (mii->phy_id != ROBO_PHY_ADDR_BCM63XX) && 
    321323                    (mii->phy_id != ROBO_PHY_ADDR_TG3)) { 
    322324                        printk("Invalid phy address (%d)\n", mii->phy_id); 
    323325                        return 1; 
    324326                } 
    325327                robo.use_et = 0; 
    326328                /* The robo has a fixed PHY address that is different from the 
    327                  * Tigon3 PHY address. */ 
     329                 * Tigon3 and BCM63xx PHY address. */ 
    328330                robo.phy_addr = ROBO_PHY_ADDR; 
    329331        } 
    330332 
  • package/switch/src/gpio.h

     
    1111#ifdef BROADCOM 
    1212#include "gpio-bcm947xx.h" 
    1313#else 
    14 #error "Unsupported configuration." 
     14#warning "Unsupported configuration." 
     15 
     16#define gpio_in()                       (-1U) 
     17#define gpio_out(mask, value)           (-1U) 
     18#define gpio_outen(mask, value)         (-1U) 
     19#define gpio_control(mask, value)       (-1U) 
     20#define gpio_intmask(mask, value)       (-1U) 
     21#define gpio_intpolarity(mask, value)   (-1U) 
     22 
    1523#endif 
    1624 
    1725#endif /* __GPIO_H */ 
  • package/switch/Makefile

     
    1616 
    1717define KernelPackage/switch 
    1818  SUBMENU:=Other modules 
    19   DEPENDS:=@TARGET_brcm_2_4||TARGET_brcm47xx 
     19  DEPENDS:=@TARGET_brcm_2_4||TARGET_brcm47xx||TARGET_brcm63xx 
    2020  TITLE:=Switch drivers 
    2121  FILES:= \ 
    2222        $(PKG_BUILD_DIR)/switch-core.$(LINUX_KMOD_SUFFIX) \ 
  • package/robocfg/src/robocfg.c

     
    1919 * 02110-1301, USA. 
    2020 */ 
    2121  
     22#include <errno.h> 
    2223#include <stdio.h> 
    2324#include <stdlib.h> 
    2425#include <string.h> 
     
    247248                        mdix[0].name, mdix[1].name, mdix[2].name); 
    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[]) 
    252332{ 
     
    256336        int robo5350 = 0; 
    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"); 
    264341                exit(1); 
    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("eth0")) { 
     345                if (bcm53xx_probe("eth1")) { 
     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         
    305353        for (i = 1; i < argc;) {