Changeset 28993


Ignore:
Timestamp:
2011-11-12T15:09:52+01:00 (6 years ago)
Author:
juhosg
Message:

kernel: ar8216: add support for the AR8236 switch

Location:
trunk/target/linux/generic/files/drivers/net/phy
Files:
2 edited

Legend:

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

    r28992 r28993  
    145145        case 0x0101: 
    146146                return AR8216; 
     147        case 0x0301: 
     148                return AR8236; 
    147149        case 0x1000: 
    148150        case 0x1001: 
     
    514516} 
    515517 
     518static void 
     519ar8236_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, 
     520                  u32 members, u32 pvid) 
     521{ 
     522        ar8216_rmw(priv, AR8216_REG_PORT_CTRL(port), 
     523                   AR8216_PORT_CTRL_LEARN | AR8216_PORT_CTRL_VLAN_MODE | 
     524                   AR8216_PORT_CTRL_SINGLE_VLAN | AR8216_PORT_CTRL_STATE | 
     525                   AR8216_PORT_CTRL_HEADER | AR8216_PORT_CTRL_LEARN_LOCK, 
     526                   AR8216_PORT_CTRL_LEARN | 
     527                   (egress << AR8216_PORT_CTRL_VLAN_MODE_S) | 
     528                   (AR8216_PORT_STATE_FORWARD << AR8216_PORT_CTRL_STATE_S)); 
     529 
     530        ar8216_rmw(priv, AR8236_REG_PORT_VLAN(port), 
     531                   AR8236_PORT_VLAN_DEFAULT_ID, 
     532                   (pvid << AR8236_PORT_VLAN_DEFAULT_ID_S)); 
     533 
     534        ar8216_rmw(priv, AR8236_REG_PORT_VLAN2(port), 
     535                   AR8236_PORT_VLAN2_VLAN_MODE | 
     536                   AR8236_PORT_VLAN2_MEMBER, 
     537                   (ingress << AR8236_PORT_VLAN2_VLAN_MODE_S) | 
     538                   (members << AR8236_PORT_VLAN2_MEMBER_S)); 
     539} 
     540 
    516541static int 
    517542ar8216_hw_apply(struct switch_dev *dev) 
     
    580605                } 
    581606 
    582                 ar8216_setup_port(priv, i, egress, ingress, portmask[i], pvid); 
     607                if (priv->chip == AR8236) 
     608                        ar8236_setup_port(priv, i, egress, ingress, portmask[i], 
     609                                          pvid); 
     610                else 
     611                        ar8216_setup_port(priv, i, egress, ingress, portmask[i], 
     612                                          pvid); 
    583613        } 
    584614        mutex_unlock(&priv->reg_mutex); 
     615        return 0; 
     616} 
     617 
     618static int 
     619ar8236_hw_init(struct ar8216_priv *priv) { 
     620        static int initialized; 
     621        int i; 
     622        struct mii_bus *bus; 
     623 
     624        if (initialized) 
     625                return 0; 
     626 
     627        /* Initialize the PHYs */ 
     628        bus = priv->phy->bus; 
     629        for (i = 0; i < 5; i++) { 
     630                bus->write(bus, i, MII_ADVERTISE, 
     631                           ADVERTISE_ALL | ADVERTISE_PAUSE_CAP | 
     632                           ADVERTISE_PAUSE_ASYM); 
     633                bus->write(bus, i, MII_BMCR, BMCR_RESET | BMCR_ANENABLE); 
     634        } 
     635        msleep(1000); 
     636 
     637        initialized = true; 
    585638        return 0; 
    586639} 
     
    693746                ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, 
    694747                        AR8216_GCTRL_MTU, 1518 + 8 + 2); 
    695         } else if (priv->chip == AR8316) { 
     748        } else if (priv->chip == AR8316 || 
     749                   priv->chip == AR8236) { 
    696750                /* enable jumbo frames */ 
    697751                ar8216_rmw(priv, AR8216_REG_GLOBAL_CTRL, 
     
    807861                        swdev->ports = (AR8216_NUM_PORTS - 1); 
    808862                } 
     863        } else if (priv->chip == AR8236) { 
     864                swdev->name = "Atheros AR8236"; 
     865                swdev->vlans = AR8216_NUM_VLANS; 
     866                swdev->ports = AR8216_NUM_PORTS; 
    809867        } else { 
    810868                swdev->name = "Atheros AR8216"; 
     
    819877        if (priv->chip == AR8316) { 
    820878                ret = ar8316_hw_init(priv); 
     879                if (ret) { 
     880                        kfree(priv); 
     881                        goto done; 
     882                } 
     883        } 
     884 
     885        if (priv->chip == AR8236) { 
     886                ret = ar8236_hw_init(priv); 
    821887                if (ret) { 
    822888                        kfree(priv); 
     
    919985static struct phy_driver ar8216_driver = { 
    920986        .phy_id         = 0x004d0000, 
    921         .name           = "Atheros AR8216/AR8316", 
     987        .name           = "Atheros AR8216/AR8316/AR8326", 
    922988        .phy_id_mask    = 0xffff0000, 
    923989        .features       = PHY_BASIC_FEATURES, 
  • trunk/target/linux/generic/files/drivers/net/phy/ar8216.h

    r21952 r28993  
    4242#define AR8216_REG_GLOBAL_CTRL          0x0030 
    4343#define   AR8216_GCTRL_MTU              BITS(0, 11) 
     44#define   AR8236_GCTRL_MTU              BITS(0, 14) 
    4445#define   AR8316_GCTRL_MTU              BITS(0, 14) 
    4546 
     
    6364#define AR8216_REG_VTU_DATA             0x0044 
    6465#define   AR8216_VTUDATA_MEMBER         BITS(0, 10) 
     66#define   AR8236_VTUDATA_MEMBER         BITS(0, 7) 
    6567#define   AR8216_VTUDATA_VALID          BIT(11) 
    6668 
     
    146148#define AR8216_REG_PORT_PRIO(_i)        (AR8216_PORT_OFFSET(_i) + 0x0010) 
    147149 
     150 
     151#define AR8236_REG_PORT_VLAN(_i)        (AR8216_PORT_OFFSET((_i)) + 0x0008) 
     152#define   AR8236_PORT_VLAN_DEFAULT_ID   BITS(16, 12) 
     153#define   AR8236_PORT_VLAN_DEFAULT_ID_S 16 
     154#define   AR8236_PORT_VLAN_PRIORITY     BITS(29, 3) 
     155#define   AR8236_PORT_VLAN_PRIORITY_S   28 
     156 
     157#define AR8236_REG_PORT_VLAN2(_i)       (AR8216_PORT_OFFSET((_i)) + 0x000c) 
     158#define   AR8236_PORT_VLAN2_MEMBER      BITS(16, 7) 
     159#define   AR8236_PORT_VLAN2_MEMBER_S    16 
     160#define   AR8236_PORT_VLAN2_TX_PRIO     BIT(23) 
     161#define   AR8236_PORT_VLAN2_VLAN_MODE   BITS(30, 2) 
     162#define   AR8236_PORT_VLAN2_VLAN_MODE_S 30 
     163 
    148164/* port speed */ 
    149165enum { 
     
    182198  UNKNOWN = 0, 
    183199  AR8216 = 8216, 
    184   AR8316 = 8316 
     200  AR8236 = 8236, 
     201  AR8316 = 8316, 
    185202}; 
    186203 
Note: See TracChangeset for help on using the changeset viewer.