Changeset 29017


Ignore:
Timestamp:
2011-11-13T12:27:04+01:00 (6 years ago)
Author:
juhosg
Message:

ar71xx: ag71xx: add support for getting switch port link status

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_ar7240.c

    r28851 r29017  
    9797 
    9898#define AR7240_REG_PORT_STATUS(_port)   (AR7240_REG_PORT_BASE((_port)) + 0x00) 
     99#define AR7240_PORT_STATUS_SPEED_S      0 
    99100#define AR7240_PORT_STATUS_SPEED_M      BITM(2) 
    100101#define AR7240_PORT_STATUS_SPEED_10     0 
     
    208209        u8 vlan_tagged; 
    209210        u16 pvid[AR7240_NUM_PORTS]; 
     211        char buf[80]; 
    210212}; 
    211213 
     
    646648} 
    647649 
     650static const char * 
     651ar7240_speed_str(u32 status) 
     652{ 
     653        u32 speed; 
     654 
     655        speed = (status >> AR7240_PORT_STATUS_SPEED_S) & 
     656                                        AR7240_PORT_STATUS_SPEED_M; 
     657        switch (speed) { 
     658        case AR7240_PORT_STATUS_SPEED_10: 
     659                return "10baseT"; 
     660        case AR7240_PORT_STATUS_SPEED_100: 
     661                return "100baseT"; 
     662        case AR7240_PORT_STATUS_SPEED_1000: 
     663                return "1000baseT"; 
     664        } 
     665 
     666        return "unknown"; 
     667} 
     668 
     669static int 
     670ar7240_port_get_link(struct switch_dev *dev, const struct switch_attr *attr, 
     671                     struct switch_val *val) 
     672{ 
     673        struct ar7240sw *as = sw_to_ar7240(dev); 
     674        struct mii_bus *mii = as->mii_bus; 
     675        u32 len; 
     676        u32 status; 
     677        int port; 
     678 
     679        port = val->port_vlan; 
     680 
     681        memset(as->buf, '\0', sizeof(as->buf)); 
     682        status = ar7240sw_reg_read(mii, AR7240_REG_PORT_STATUS(port)); 
     683 
     684        if (status & AR7240_PORT_STATUS_LINK_UP) { 
     685                len = snprintf(as->buf, sizeof(as->buf), 
     686                                "port:%d link:up speed:%s %s-duplex %s%s%s", 
     687                                port, 
     688                                ar7240_speed_str(status), 
     689                                (status & AR7240_PORT_STATUS_DUPLEX) ? 
     690                                        "full" : "half", 
     691                                (status & AR7240_PORT_STATUS_TXFLOW) ? 
     692                                        "txflow ": "", 
     693                                (status & AR7240_PORT_STATUS_RXFLOW) ? 
     694                                        "rxflow " : "", 
     695                                (status & AR7240_PORT_STATUS_LINK_AUTO) ? 
     696                                        "auto ": ""); 
     697        } else { 
     698                len = snprintf(as->buf, sizeof(as->buf), 
     699                               "port:%d link:down", port); 
     700        } 
     701 
     702        val->value.s = as->buf; 
     703        val->len = len; 
     704 
     705        return 0; 
     706} 
    648707 
    649708static void 
     
    734793 
    735794static struct switch_attr ar7240_port[] = { 
     795        { 
     796                .type = SWITCH_TYPE_STRING, 
     797                .name = "link", 
     798                .description = "Get port link information", 
     799                .max = 1, 
     800                .set = NULL, 
     801                .get = ar7240_port_get_link, 
     802        }, 
    736803}; 
    737804 
Note: See TracChangeset for help on using the changeset viewer.