Commit 378ef01b authored by Parav Pandit's avatar Parav Pandit Committed by David S. Miller

devlink: Refactor physical port attributes

To support additional devlink port flavours and to support few common
and few different port attributes, move physical port attributes to a
different structure.
Acked-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b14a260e
...@@ -38,14 +38,23 @@ struct devlink { ...@@ -38,14 +38,23 @@ struct devlink {
char priv[0] __aligned(NETDEV_ALIGN); char priv[0] __aligned(NETDEV_ALIGN);
}; };
struct devlink_port_phys_attrs {
u32 port_number; /* Same value as "split group".
* A physical port which is visible to the user
* for a given port flavour.
*/
u32 split_subport_number;
};
struct devlink_port_attrs { struct devlink_port_attrs {
u8 set:1, u8 set:1,
split:1, split:1,
switch_port:1; switch_port:1;
enum devlink_port_flavour flavour; enum devlink_port_flavour flavour;
u32 port_number; /* same value as "split group" */
u32 split_subport_number;
struct netdev_phys_item_id switch_id; struct netdev_phys_item_id switch_id;
union {
struct devlink_port_phys_attrs phys;
};
}; };
struct devlink_port { struct devlink_port {
......
...@@ -515,14 +515,16 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, ...@@ -515,14 +515,16 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
return 0; return 0;
if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour)) if (nla_put_u16(msg, DEVLINK_ATTR_PORT_FLAVOUR, attrs->flavour))
return -EMSGSIZE; return -EMSGSIZE;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number)) if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER,
attrs->phys.port_number))
return -EMSGSIZE; return -EMSGSIZE;
if (!attrs->split) if (!attrs->split)
return 0; return 0;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number)) if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP,
attrs->phys.port_number))
return -EMSGSIZE; return -EMSGSIZE;
if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,
attrs->split_subport_number)) attrs->phys.split_subport_number))
return -EMSGSIZE; return -EMSGSIZE;
return 0; return 0;
} }
...@@ -5738,6 +5740,29 @@ void devlink_port_type_clear(struct devlink_port *devlink_port) ...@@ -5738,6 +5740,29 @@ void devlink_port_type_clear(struct devlink_port *devlink_port)
} }
EXPORT_SYMBOL_GPL(devlink_port_type_clear); EXPORT_SYMBOL_GPL(devlink_port_type_clear);
static int __devlink_port_attrs_set(struct devlink_port *devlink_port,
enum devlink_port_flavour flavour,
const unsigned char *switch_id,
unsigned char switch_id_len)
{
struct devlink_port_attrs *attrs = &devlink_port->attrs;
if (WARN_ON(devlink_port->registered))
return -EEXIST;
attrs->set = true;
attrs->flavour = flavour;
if (switch_id) {
attrs->switch_port = true;
if (WARN_ON(switch_id_len > MAX_PHYS_ITEM_ID_LEN))
switch_id_len = MAX_PHYS_ITEM_ID_LEN;
memcpy(attrs->switch_id.id, switch_id, switch_id_len);
attrs->switch_id.id_len = switch_id_len;
} else {
attrs->switch_port = false;
}
return 0;
}
/** /**
* devlink_port_attrs_set - Set port attributes * devlink_port_attrs_set - Set port attributes
* *
...@@ -5760,23 +5785,15 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port, ...@@ -5760,23 +5785,15 @@ void devlink_port_attrs_set(struct devlink_port *devlink_port,
unsigned char switch_id_len) unsigned char switch_id_len)
{ {
struct devlink_port_attrs *attrs = &devlink_port->attrs; struct devlink_port_attrs *attrs = &devlink_port->attrs;
int ret;
if (WARN_ON(devlink_port->registered)) ret = __devlink_port_attrs_set(devlink_port, flavour,
switch_id, switch_id_len);
if (ret)
return; return;
attrs->set = true;
attrs->flavour = flavour;
attrs->port_number = port_number;
attrs->split = split; attrs->split = split;
attrs->split_subport_number = split_subport_number; attrs->phys.port_number = port_number;
if (switch_id) { attrs->phys.split_subport_number = split_subport_number;
attrs->switch_port = true;
if (WARN_ON(switch_id_len > MAX_PHYS_ITEM_ID_LEN))
switch_id_len = MAX_PHYS_ITEM_ID_LEN;
memcpy(attrs->switch_id.id, switch_id, switch_id_len);
attrs->switch_id.id_len = switch_id_len;
} else {
attrs->switch_port = false;
}
} }
EXPORT_SYMBOL_GPL(devlink_port_attrs_set); EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
...@@ -5792,10 +5809,11 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port, ...@@ -5792,10 +5809,11 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
switch (attrs->flavour) { switch (attrs->flavour) {
case DEVLINK_PORT_FLAVOUR_PHYSICAL: case DEVLINK_PORT_FLAVOUR_PHYSICAL:
if (!attrs->split) if (!attrs->split)
n = snprintf(name, len, "p%u", attrs->port_number); n = snprintf(name, len, "p%u", attrs->phys.port_number);
else else
n = snprintf(name, len, "p%us%u", attrs->port_number, n = snprintf(name, len, "p%us%u",
attrs->split_subport_number); attrs->phys.port_number,
attrs->phys.split_subport_number);
break; break;
case DEVLINK_PORT_FLAVOUR_CPU: case DEVLINK_PORT_FLAVOUR_CPU:
case DEVLINK_PORT_FLAVOUR_DSA: case DEVLINK_PORT_FLAVOUR_DSA:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment