Changeset 42652


Ignore:
Timestamp:
2014-09-23T12:18:38+02:00 (3 years ago)
Author:
nbd
Message:

ar71xx: ar8216: move policies, pvid to setup_port

This moves ingress, egress policy and pvid decisions to setup_port methods.
They arenow device type dependent.

This allows policy changes on only one device type which is needed to allow
tagged + untagged operation on ar8327.

Tested on TP-LINK WDR-3600 (ar8327N).

Signed-off-by: Valentin Spreckels <Valentin.Spreckels@…>

File:
1 edited

Legend:

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

    r41635 r42652  
    7474        void (*init_globals)(struct ar8xxx_priv *priv); 
    7575        void (*init_port)(struct ar8xxx_priv *priv, int port); 
    76         void (*setup_port)(struct ar8xxx_priv *priv, int port, u32 egress, 
    77                            u32 ingress, u32 members, u32 pvid); 
     76        void (*setup_port)(struct ar8xxx_priv *priv, int port, u32 members); 
    7877        u32 (*read_port_status)(struct ar8xxx_priv *priv, int port); 
    7978        int (*atu_flush)(struct ar8xxx_priv *priv); 
     
    723722 
    724723static void 
    725 ar8216_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, 
    726                   u32 members, u32 pvid) 
     724ar8216_setup_port(struct ar8xxx_priv *priv, int port, u32 members) 
    727725{ 
    728726        u32 header; 
     727        u32 egress, ingress; 
     728        u32 pvid; 
     729 
     730        if (priv->vlan) { 
     731                pvid = priv->vlan_id[priv->pvid[port]]; 
     732                if (priv->vlan_tagged & (1 << port)) 
     733                        egress = AR8216_OUT_ADD_VLAN; 
     734                else 
     735                        egress = AR8216_OUT_STRIP_VLAN; 
     736                ingress = AR8216_IN_SECURE; 
     737        } else { 
     738                pvid = port; 
     739                egress = AR8216_OUT_KEEP; 
     740                ingress = AR8216_IN_PORT_ONLY; 
     741        } 
    729742 
    730743        if (chip_is_ar8216(priv) && priv->vlan && port == AR8216_PORT_CPU) 
     
    808821 
    809822static void 
    810 ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, 
    811                   u32 members, u32 pvid) 
    812 { 
     823ar8236_setup_port(struct ar8xxx_priv *priv, int port, u32 members) 
     824{ 
     825        u32 egress, ingress; 
     826        u32 pvid; 
     827 
     828        if (priv->vlan) { 
     829                pvid = priv->vlan_id[priv->pvid[port]]; 
     830                if (priv->vlan_tagged & (1 << port)) 
     831                        egress = AR8216_OUT_ADD_VLAN; 
     832                else 
     833                        egress = AR8216_OUT_STRIP_VLAN; 
     834                ingress = AR8216_IN_SECURE; 
     835        } else { 
     836                pvid = port; 
     837                egress = AR8216_OUT_KEEP; 
     838                ingress = AR8216_IN_PORT_ONLY; 
     839        } 
     840 
    813841        ar8xxx_rmw(priv, AR8216_REG_PORT_CTRL(port), 
    814842                   AR8216_PORT_CTRL_LEARN | AR8216_PORT_CTRL_VLAN_MODE | 
     
    17321760 
    17331761static void 
    1734 ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 egress, u32 ingress, 
    1735                   u32 members, u32 pvid) 
     1762ar8327_setup_port(struct ar8xxx_priv *priv, int port, u32 members) 
    17361763{ 
    17371764        u32 t; 
    1738         u32 mode; 
     1765        u32 egress, ingress; 
     1766        u32 pvid; 
     1767 
     1768        if (priv->vlan) { 
     1769                pvid = priv->vlan_id[priv->pvid[port]]; 
     1770                if (priv->vlan_tagged & (1 << port)) 
     1771                        egress = AR8327_PORT_VLAN1_OUT_MODE_TAG; 
     1772                else 
     1773                        egress = AR8327_PORT_VLAN1_OUT_MODE_UNTAG; 
     1774                ingress = AR8216_IN_SECURE; 
     1775        } else { 
     1776                pvid = port; 
     1777                egress = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH; 
     1778                ingress = AR8216_IN_PORT_ONLY; 
     1779        } 
    17391780 
    17401781        t = pvid << AR8327_PORT_VLAN0_DEF_SVID_S; 
     
    17421783        priv->write(priv, AR8327_REG_PORT_VLAN0(port), t); 
    17431784 
    1744         mode = AR8327_PORT_VLAN1_OUT_MODE_UNMOD; 
    1745         switch (egress) { 
    1746         case AR8216_OUT_KEEP: 
    1747                 mode = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH; 
    1748                 break; 
    1749         case AR8216_OUT_STRIP_VLAN: 
    1750                 mode = AR8327_PORT_VLAN1_OUT_MODE_UNTAG; 
    1751                 break; 
    1752         case AR8216_OUT_ADD_VLAN: 
    1753                 mode = AR8327_PORT_VLAN1_OUT_MODE_TAG; 
    1754                 break; 
    1755         } 
    1756  
    17571785        t = AR8327_PORT_VLAN1_PORT_VLAN_PROP; 
    1758         t |= mode << AR8327_PORT_VLAN1_OUT_MODE_S; 
     1786        t |= egress << AR8327_PORT_VLAN1_OUT_MODE_S; 
    17591787        priv->write(priv, AR8327_REG_PORT_VLAN1(port), t); 
    17601788 
     
    20422070        /* update the port destination mask registers and tag settings */ 
    20432071        for (i = 0; i < dev->ports; i++) { 
    2044                 int egress, ingress; 
    2045                 int pvid; 
    2046  
    2047                 if (priv->vlan) { 
    2048                         pvid = priv->vlan_id[priv->pvid[i]]; 
    2049                         if (priv->vlan_tagged & (1 << i)) 
    2050                                 egress = AR8216_OUT_ADD_VLAN; 
    2051                         else 
    2052                                 egress = AR8216_OUT_STRIP_VLAN; 
    2053                         ingress = AR8216_IN_SECURE; 
    2054                 } else { 
    2055                         pvid = i; 
    2056                         egress = AR8216_OUT_KEEP; 
    2057                         ingress = AR8216_IN_PORT_ONLY; 
    2058                 } 
    2059  
    2060                 priv->chip->setup_port(priv, i, egress, ingress, portmask[i], 
    2061                                        pvid); 
     2072                priv->chip->setup_port(priv, i, portmask[i]); 
    20622073        } 
    20632074 
Note: See TracChangeset for help on using the changeset viewer.