Changeset 30845


Ignore:
Timestamp:
2012-03-07T17:32:42+01:00 (6 years ago)
Author:
juhosg
Message:

generic: ar8216: use the generic get_port_link implementation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic/files/drivers/net/phy/ar8216.c

    r30838 r30845  
    175175} 
    176176 
     177static void 
     178ar8216_read_port_link(struct ar8216_priv *priv, int port, 
     179                      struct switch_port_link *link) 
     180{ 
     181        u32 status; 
     182        u32 speed; 
     183 
     184        memset(link, '\0', sizeof(*link)); 
     185 
     186        status = priv->read(priv, AR8216_REG_PORT_STATUS(port)); 
     187 
     188        link->aneg = !!(status & AR8216_PORT_STATUS_LINK_AUTO); 
     189        if (link->aneg) { 
     190                link->link = !!(status & AR8216_PORT_STATUS_LINK_UP); 
     191                if (!link->link) 
     192                        return; 
     193        } else { 
     194                link->link = true; 
     195        } 
     196 
     197        link->duplex = !!(status & AR8216_PORT_STATUS_DUPLEX); 
     198        link->tx_flow = !!(status & AR8216_PORT_STATUS_TXFLOW); 
     199        link->rx_flow = !!(status & AR8216_PORT_STATUS_RXFLOW); 
     200 
     201        speed = (status & AR8216_PORT_STATUS_SPEED) >> 
     202                 AR8216_PORT_STATUS_SPEED_S; 
     203 
     204        switch (speed) { 
     205        case AR8216_PORT_SPEED_10M: 
     206                link->speed = SWITCH_PORT_SPEED_10; 
     207                break; 
     208        case AR8216_PORT_SPEED_100M: 
     209                link->speed = SWITCH_PORT_SPEED_100; 
     210                break; 
     211        case AR8216_PORT_SPEED_1000M: 
     212                link->speed = SWITCH_PORT_SPEED_1000; 
     213                break; 
     214        default: 
     215                link->speed = SWITCH_PORT_SPEED_UNKNOWN; 
     216                break; 
     217        } 
     218} 
     219 
    177220static int 
    178221ar8216_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, 
     
    234277} 
    235278 
    236 static const char *ar8216_speed_str(unsigned speed) 
    237 { 
    238         switch (speed) { 
    239         case AR8216_PORT_SPEED_10M: 
    240                 return "10baseT"; 
    241         case AR8216_PORT_SPEED_100M: 
    242                 return "100baseT"; 
    243         case AR8216_PORT_SPEED_1000M: 
    244                 return "1000baseT"; 
    245         } 
    246  
    247         return "unknown"; 
    248 } 
    249  
    250 static int ar8216_port_get_link(struct switch_dev *dev, 
    251                                 const struct switch_attr *attr, 
    252                                 struct switch_val *val) 
     279static int 
     280ar8216_get_port_link(struct switch_dev *dev, int port, 
     281                     struct switch_port_link *link) 
    253282{ 
    254283        struct ar8216_priv *priv = to_ar8216(dev); 
    255         u32 len; 
    256         u32 status; 
    257         int port; 
    258  
    259         port = val->port_vlan; 
    260  
    261         memset(priv->buf, '\0', sizeof(priv->buf)); 
    262         status = priv->read(priv, AR8216_REG_PORT_STATUS(port)); 
    263  
    264         if (status & AR8216_PORT_STATUS_LINK_UP) { 
    265                 len = snprintf(priv->buf, sizeof(priv->buf), 
    266                                 "port:%d link:up speed:%s %s-duplex %s%s%s", 
    267                                 port, 
    268                                 ar8216_speed_str((status & 
    269                                                   AR8216_PORT_STATUS_SPEED) >> 
    270                                                  AR8216_PORT_STATUS_SPEED_S), 
    271                                 (status & AR8216_PORT_STATUS_DUPLEX) ? 
    272                                         "full" : "half", 
    273                                 (status & AR8216_PORT_STATUS_TXFLOW) ? 
    274                                         "txflow ": "", 
    275                                 (status & AR8216_PORT_STATUS_RXFLOW) ? 
    276                                         "rxflow " : "", 
    277                                 (status & AR8216_PORT_STATUS_LINK_AUTO) ? 
    278                                         "auto ": ""); 
    279         } else { 
    280                 len = snprintf(priv->buf, sizeof(priv->buf), "port:%d link:down", 
    281                                 port); 
    282         } 
    283  
    284         val->value.s = priv->buf; 
    285         val->len = len; 
    286  
     284 
     285        ar8216_read_port_link(priv, port, link); 
    287286        return 0; 
    288287} 
     
    397396 
    398397static struct switch_attr ar8216_port[] = { 
    399         { 
    400                 .type = SWITCH_TYPE_STRING, 
    401                 .name = "link", 
    402                 .description = "Get port link information", 
    403                 .max = 1, 
    404                 .set = NULL, 
    405                 .get = ar8216_port_get_link, 
    406         }, 
    407398}; 
    408399 
     
    797788        .apply_config = ar8216_hw_apply, 
    798789        .reset_switch = ar8216_reset_switch, 
     790        .get_port_link = ar8216_get_port_link, 
    799791}; 
    800792 
Note: See TracChangeset for help on using the changeset viewer.