static int
swconfig_set_vlan_ports(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
{
+ struct switch_port *ports = val->value.ports;
int i;
if (val->port_vlan >= dev->vlans)
if (val->len > dev->ports)
return -EINVAL;
+ if (!dev->set_vlan_ports)
+ return -EOPNOTSUPP;
+
for (i = 0; i < val->len; i++) {
- if (val->value.ports[i].id >= dev->ports)
+ if (ports[i].id >= dev->ports)
return -EINVAL;
+
+ if (dev->set_port_pvid && !(ports[i].flags & SWITCH_PORT_FLAG_TAGGED))
+ dev->set_port_pvid(dev, ports[i].id, val->port_vlan);
}
- if (!dev->set_vlan_ports)
+ return dev->set_vlan_ports(dev, val);
+}
+
+static int
+swconfig_set_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
+{
+ if (val->port_vlan >= dev->ports)
+ return -EINVAL;
+
+ if (!dev->set_port_pvid)
return -EOPNOTSUPP;
- return dev->set_vlan_ports(dev, val);
+ return dev->set_port_pvid(dev, val->port_vlan, val->value.i);
+}
+
+static int
+swconfig_get_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
+{
+ if (val->port_vlan >= dev->ports)
+ return -EINVAL;
+
+ if (!dev->get_port_pvid)
+ return -EOPNOTSUPP;
+
+ return dev->get_port_pvid(dev, val->port_vlan, &val->value.i);
}
static int
};
enum port_defaults {
- PORT_LINK,
+ PORT_PVID,
};
static struct switch_attr default_global[] = {
};
static struct switch_attr default_port[] = {
- [PORT_LINK] = {
+ [PORT_PVID] = {
.type = SWITCH_TYPE_INT,
- .name = "link",
- .description = "Current link speed",
+ .name = "pvid",
+ .description = "Primary VLAN ID",
+ .set = swconfig_set_pvid,
+ .get = swconfig_get_pvid,
}
};
if (dev->get_vlan_ports || dev->set_vlan_ports)
set_bit(VLAN_PORTS, &dev->def_vlan);
+ if (dev->get_port_pvid || dev->set_port_pvid)
+ set_bit(PORT_PVID, &dev->def_port);
+
/* always present, can be no-op */
set_bit(GLOBAL_APPLY, &dev->def_global);
}