Changeset 15307


Ignore:
Timestamp:
2009-04-20T23:26:39+02:00 (9 years ago)
Author:
nbd
Message:

swconfig: add a generic method for setting the port primary vlan id (used for transparently fixing up pvid for untagged port when setting vlan ports)

Location:
trunk/target/linux/generic-2.6/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/files/drivers/net/phy/swconfig.c

    r15302 r15307  
    7676swconfig_set_vlan_ports(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) 
    7777{ 
     78        struct switch_port *ports = val->value.ports; 
    7879        int i; 
    7980 
     
    8586                return -EINVAL; 
    8687 
    87         for (i = 0; i < val->len; i++) { 
    88                 if (val->value.ports[i].id >= dev->ports) 
    89                         return -EINVAL; 
    90         } 
    91  
    9288        if (!dev->set_vlan_ports) 
    9389                return -EOPNOTSUPP; 
    9490 
     91        for (i = 0; i < val->len; i++) { 
     92                if (ports[i].id >= dev->ports) 
     93                        return -EINVAL; 
     94 
     95                if (dev->set_port_pvid && !(ports[i].flags & SWITCH_PORT_FLAG_TAGGED)) 
     96                        dev->set_port_pvid(dev, ports[i].id, val->port_vlan); 
     97        } 
     98 
    9599        return dev->set_vlan_ports(dev, val); 
     100} 
     101 
     102static int 
     103swconfig_set_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) 
     104{ 
     105        if (val->port_vlan >= dev->ports) 
     106                return -EINVAL; 
     107 
     108        if (!dev->set_port_pvid) 
     109                return -EOPNOTSUPP; 
     110 
     111        return dev->set_port_pvid(dev, val->port_vlan, val->value.i); 
     112} 
     113 
     114static int 
     115swconfig_get_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) 
     116{ 
     117        if (val->port_vlan >= dev->ports) 
     118                return -EINVAL; 
     119 
     120        if (!dev->get_port_pvid) 
     121                return -EOPNOTSUPP; 
     122 
     123        return dev->get_port_pvid(dev, val->port_vlan, &val->value.i); 
    96124} 
    97125 
     
    116144 
    117145enum port_defaults { 
    118         PORT_LINK, 
     146        PORT_PVID, 
    119147}; 
    120148 
     
    129157 
    130158static struct switch_attr default_port[] = { 
    131         [PORT_LINK] = { 
     159        [PORT_PVID] = { 
    132160                .type = SWITCH_TYPE_INT, 
    133                 .name = "link", 
    134                 .description = "Current link speed", 
     161                .name = "pvid", 
     162                .description = "Primary VLAN ID", 
     163                .set = swconfig_set_pvid, 
     164                .get = swconfig_get_pvid, 
    135165        } 
    136166}; 
     
    155185        if (dev->get_vlan_ports || dev->set_vlan_ports) 
    156186                set_bit(VLAN_PORTS, &dev->def_vlan); 
     187 
     188        if (dev->get_port_pvid || dev->set_port_pvid) 
     189                set_bit(PORT_PVID, &dev->def_port); 
    157190 
    158191        /* always present, can be no-op */ 
  • trunk/target/linux/generic-2.6/files/include/linux/switch.h

    r15302 r15307  
    130130        int (*get_vlan_ports)(struct switch_dev *dev, struct switch_val *val); 
    131131        int (*set_vlan_ports)(struct switch_dev *dev, struct switch_val *val); 
     132        int (*get_port_pvid)(struct switch_dev *dev, int port, int *val); 
     133        int (*set_port_pvid)(struct switch_dev *dev, int port, int val); 
    132134        int (*apply_config)(struct switch_dev *dev); 
    133135}; 
Note: See TracChangeset for help on using the changeset viewer.