Author: rmilecki Date: 2016-01-06 19:32:21 +0100 (Wed, 06 Jan 2016) New Revision: 48142
Modified: trunk/target/linux/generic/files/drivers/net/phy/swconfig.c trunk/target/linux/generic/files/include/linux/switch.h Log: swconfig: add API for setting port link speed Some switches can force link speed for a port. Let's add API that will allow drivers to export this feature. Signed-off-by: Rafa?\197?\130 Mi?\197?\130ecki <[email protected]> Modified: trunk/target/linux/generic/files/drivers/net/phy/swconfig.c =================================================================== --- trunk/target/linux/generic/files/drivers/net/phy/swconfig.c 2016-01-06 18:32:13 UTC (rev 48141) +++ trunk/target/linux/generic/files/drivers/net/phy/swconfig.c 2016-01-06 18:32:21 UTC (rev 48142) @@ -128,6 +128,16 @@ } static int +swconfig_set_link(struct switch_dev *dev, const struct switch_attr *attr, + struct switch_val *val) +{ + if (!dev->ops->set_port_link) + return -EOPNOTSUPP; + + return dev->ops->set_port_link(dev, val->port_vlan, val->value.link); +} + +static int swconfig_get_link(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) { @@ -206,7 +216,7 @@ .type = SWITCH_TYPE_LINK, .name = "link", .description = "Get port link information", - .set = NULL, + .set = swconfig_set_link, .get = swconfig_get_link, } }; @@ -282,6 +292,12 @@ [SWITCH_PORT_FLAG_TAGGED] = { .type = NLA_FLAG }, }; +static struct nla_policy link_policy[SWITCH_LINK_ATTR_MAX] = { + [SWITCH_LINK_FLAG_DUPLEX] = { .type = NLA_FLAG }, + [SWITCH_LINK_FLAG_ANEG] = { .type = NLA_FLAG }, + [SWITCH_LINK_SPEED] = { .type = NLA_U32 }, +}; + static inline void swconfig_lock(void) { @@ -595,6 +611,22 @@ } static int +swconfig_parse_link(struct sk_buff *msg, struct nlattr *nla, + struct switch_port_link *link) +{ + struct nlattr *tb[SWITCH_LINK_ATTR_MAX + 1]; + + if (nla_parse_nested(tb, SWITCH_LINK_ATTR_MAX, nla, link_policy)) + return -EINVAL; + + link->duplex = !!tb[SWITCH_LINK_FLAG_DUPLEX]; + link->aneg = !!tb[SWITCH_LINK_FLAG_ANEG]; + link->speed = nla_get_u32(tb[SWITCH_LINK_SPEED]); + + return 0; +} + +static int swconfig_set_attr(struct sk_buff *skb, struct genl_info *info) { const struct switch_attr *attr; @@ -644,6 +676,21 @@ err = 0; } break; + case SWITCH_TYPE_LINK: + val.value.link = &dev->linkbuf; + memset(&dev->linkbuf, 0, sizeof(struct switch_port_link)); + + if (info->attrs[SWITCH_ATTR_OP_VALUE_LINK]) { + err = swconfig_parse_link(skb, + info->attrs[SWITCH_ATTR_OP_VALUE_LINK], + val.value.link); + if (err < 0) + goto error; + } else { + val.len = 0; + err = 0; + } + break; default: goto error; } Modified: trunk/target/linux/generic/files/include/linux/switch.h =================================================================== --- trunk/target/linux/generic/files/include/linux/switch.h 2016-01-06 18:32:13 UTC (rev 48141) +++ trunk/target/linux/generic/files/include/linux/switch.h 2016-01-06 18:32:21 UTC (rev 48142) @@ -95,6 +95,8 @@ int (*get_port_link)(struct switch_dev *dev, int port, struct switch_port_link *link); + int (*set_port_link)(struct switch_dev *dev, int port, + struct switch_port_link *link); int (*get_port_stats)(struct switch_dev *dev, int port, struct switch_port_stats *stats); }; _______________________________________________ openwrt-commits mailing list [email protected] https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits
