Commit 82564f6c authored by Leon Romanovsky's avatar Leon Romanovsky Committed by David S. Miller

devlink: Simplify devlink port API calls

Devlink port already has pointer to the devlink instance and all API
calls that forward these devlink ports to the drivers perform same
"devlink_port->devlink" assignment before actual call.

This patch removes useless parameter and allows us in the future
to create specific devlink_port_ops to manage user space access with
reliable ops assignment.
Signed-off-by: default avatarLeon Romanovsky <leonro@nvidia.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 39f32101
...@@ -1889,8 +1889,7 @@ is_port_function_supported(struct mlx5_eswitch *esw, u16 vport_num) ...@@ -1889,8 +1889,7 @@ is_port_function_supported(struct mlx5_eswitch *esw, u16 vport_num)
mlx5_esw_is_sf_vport(esw, vport_num); mlx5_esw_is_sf_vport(esw, vport_num);
} }
int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink, int mlx5_devlink_port_function_hw_addr_get(struct devlink_port *port,
struct devlink_port *port,
u8 *hw_addr, int *hw_addr_len, u8 *hw_addr, int *hw_addr_len,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
...@@ -1899,7 +1898,7 @@ int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink, ...@@ -1899,7 +1898,7 @@ int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink,
int err = -EOPNOTSUPP; int err = -EOPNOTSUPP;
u16 vport_num; u16 vport_num;
esw = mlx5_devlink_eswitch_get(devlink); esw = mlx5_devlink_eswitch_get(port->devlink);
if (IS_ERR(esw)) if (IS_ERR(esw))
return PTR_ERR(esw); return PTR_ERR(esw);
...@@ -1923,8 +1922,7 @@ int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink, ...@@ -1923,8 +1922,7 @@ int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink,
return err; return err;
} }
int mlx5_devlink_port_function_hw_addr_set(struct devlink *devlink, int mlx5_devlink_port_function_hw_addr_set(struct devlink_port *port,
struct devlink_port *port,
const u8 *hw_addr, int hw_addr_len, const u8 *hw_addr, int hw_addr_len,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
...@@ -1933,7 +1931,7 @@ int mlx5_devlink_port_function_hw_addr_set(struct devlink *devlink, ...@@ -1933,7 +1931,7 @@ int mlx5_devlink_port_function_hw_addr_set(struct devlink *devlink,
int err = -EOPNOTSUPP; int err = -EOPNOTSUPP;
u16 vport_num; u16 vport_num;
esw = mlx5_devlink_eswitch_get(devlink); esw = mlx5_devlink_eswitch_get(port->devlink);
if (IS_ERR(esw)) { if (IS_ERR(esw)) {
NL_SET_ERR_MSG_MOD(extack, "Eswitch doesn't support set hw_addr"); NL_SET_ERR_MSG_MOD(extack, "Eswitch doesn't support set hw_addr");
return PTR_ERR(esw); return PTR_ERR(esw);
......
...@@ -475,12 +475,10 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink, ...@@ -475,12 +475,10 @@ int mlx5_devlink_eswitch_encap_mode_set(struct devlink *devlink,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink, int mlx5_devlink_eswitch_encap_mode_get(struct devlink *devlink,
enum devlink_eswitch_encap_mode *encap); enum devlink_eswitch_encap_mode *encap);
int mlx5_devlink_port_function_hw_addr_get(struct devlink *devlink, int mlx5_devlink_port_function_hw_addr_get(struct devlink_port *port,
struct devlink_port *port,
u8 *hw_addr, int *hw_addr_len, u8 *hw_addr, int *hw_addr_len,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int mlx5_devlink_port_function_hw_addr_set(struct devlink *devlink, int mlx5_devlink_port_function_hw_addr_set(struct devlink_port *port,
struct devlink_port *port,
const u8 *hw_addr, int hw_addr_len, const u8 *hw_addr, int hw_addr_len,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
......
...@@ -164,12 +164,12 @@ static bool mlx5_sf_is_active(const struct mlx5_sf *sf) ...@@ -164,12 +164,12 @@ static bool mlx5_sf_is_active(const struct mlx5_sf *sf)
return sf->hw_state == MLX5_VHCA_STATE_ACTIVE || sf->hw_state == MLX5_VHCA_STATE_IN_USE; return sf->hw_state == MLX5_VHCA_STATE_ACTIVE || sf->hw_state == MLX5_VHCA_STATE_IN_USE;
} }
int mlx5_devlink_sf_port_fn_state_get(struct devlink *devlink, struct devlink_port *dl_port, int mlx5_devlink_sf_port_fn_state_get(struct devlink_port *dl_port,
enum devlink_port_fn_state *state, enum devlink_port_fn_state *state,
enum devlink_port_fn_opstate *opstate, enum devlink_port_fn_opstate *opstate,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct mlx5_core_dev *dev = devlink_priv(devlink); struct mlx5_core_dev *dev = devlink_priv(dl_port->devlink);
struct mlx5_sf_table *table; struct mlx5_sf_table *table;
struct mlx5_sf *sf; struct mlx5_sf *sf;
int err = 0; int err = 0;
...@@ -248,11 +248,11 @@ static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *ta ...@@ -248,11 +248,11 @@ static int mlx5_sf_state_set(struct mlx5_core_dev *dev, struct mlx5_sf_table *ta
return err; return err;
} }
int mlx5_devlink_sf_port_fn_state_set(struct devlink *devlink, struct devlink_port *dl_port, int mlx5_devlink_sf_port_fn_state_set(struct devlink_port *dl_port,
enum devlink_port_fn_state state, enum devlink_port_fn_state state,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct mlx5_core_dev *dev = devlink_priv(devlink); struct mlx5_core_dev *dev = devlink_priv(dl_port->devlink);
struct mlx5_sf_table *table; struct mlx5_sf_table *table;
struct mlx5_sf *sf; struct mlx5_sf *sf;
int err; int err;
......
...@@ -24,11 +24,11 @@ int mlx5_devlink_sf_port_new(struct devlink *devlink, ...@@ -24,11 +24,11 @@ int mlx5_devlink_sf_port_new(struct devlink *devlink,
unsigned int *new_port_index); unsigned int *new_port_index);
int mlx5_devlink_sf_port_del(struct devlink *devlink, unsigned int port_index, int mlx5_devlink_sf_port_del(struct devlink *devlink, unsigned int port_index,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int mlx5_devlink_sf_port_fn_state_get(struct devlink *devlink, struct devlink_port *dl_port, int mlx5_devlink_sf_port_fn_state_get(struct devlink_port *dl_port,
enum devlink_port_fn_state *state, enum devlink_port_fn_state *state,
enum devlink_port_fn_opstate *opstate, enum devlink_port_fn_opstate *opstate,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int mlx5_devlink_sf_port_fn_state_set(struct devlink *devlink, struct devlink_port *dl_port, int mlx5_devlink_sf_port_fn_state_set(struct devlink_port *dl_port,
enum devlink_port_fn_state state, enum devlink_port_fn_state state,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
#else #else
......
...@@ -1396,8 +1396,8 @@ struct devlink_ops { ...@@ -1396,8 +1396,8 @@ struct devlink_ops {
* *
* Note: @extack can be NULL when port notifier queries the port function. * Note: @extack can be NULL when port notifier queries the port function.
*/ */
int (*port_function_hw_addr_get)(struct devlink *devlink, struct devlink_port *port, int (*port_function_hw_addr_get)(struct devlink_port *port, u8 *hw_addr,
u8 *hw_addr, int *hw_addr_len, int *hw_addr_len,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
/** /**
* @port_function_hw_addr_set: Port function's hardware address set function. * @port_function_hw_addr_set: Port function's hardware address set function.
...@@ -1406,7 +1406,7 @@ struct devlink_ops { ...@@ -1406,7 +1406,7 @@ struct devlink_ops {
* by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port
* function handling for a particular port. * function handling for a particular port.
*/ */
int (*port_function_hw_addr_set)(struct devlink *devlink, struct devlink_port *port, int (*port_function_hw_addr_set)(struct devlink_port *port,
const u8 *hw_addr, int hw_addr_len, const u8 *hw_addr, int hw_addr_len,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
/** /**
...@@ -1462,8 +1462,7 @@ struct devlink_ops { ...@@ -1462,8 +1462,7 @@ struct devlink_ops {
* *
* Return: 0 on success, negative value otherwise. * Return: 0 on success, negative value otherwise.
*/ */
int (*port_fn_state_get)(struct devlink *devlink, int (*port_fn_state_get)(struct devlink_port *port,
struct devlink_port *port,
enum devlink_port_fn_state *state, enum devlink_port_fn_state *state,
enum devlink_port_fn_opstate *opstate, enum devlink_port_fn_opstate *opstate,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
...@@ -1478,8 +1477,7 @@ struct devlink_ops { ...@@ -1478,8 +1477,7 @@ struct devlink_ops {
* *
* Return: 0 on success, negative value otherwise. * Return: 0 on success, negative value otherwise.
*/ */
int (*port_fn_state_set)(struct devlink *devlink, int (*port_fn_state_set)(struct devlink_port *port,
struct devlink_port *port,
enum devlink_port_fn_state state, enum devlink_port_fn_state state,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
......
...@@ -804,10 +804,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg, ...@@ -804,10 +804,11 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
return 0; return 0;
} }
static int static int devlink_port_fn_hw_addr_fill(const struct devlink_ops *ops,
devlink_port_fn_hw_addr_fill(struct devlink *devlink, const struct devlink_ops *ops, struct devlink_port *port,
struct devlink_port *port, struct sk_buff *msg, struct sk_buff *msg,
struct netlink_ext_ack *extack, bool *msg_updated) struct netlink_ext_ack *extack,
bool *msg_updated)
{ {
u8 hw_addr[MAX_ADDR_LEN]; u8 hw_addr[MAX_ADDR_LEN];
int hw_addr_len; int hw_addr_len;
...@@ -816,7 +817,8 @@ devlink_port_fn_hw_addr_fill(struct devlink *devlink, const struct devlink_ops * ...@@ -816,7 +817,8 @@ devlink_port_fn_hw_addr_fill(struct devlink *devlink, const struct devlink_ops *
if (!ops->port_function_hw_addr_get) if (!ops->port_function_hw_addr_get)
return 0; return 0;
err = ops->port_function_hw_addr_get(devlink, port, hw_addr, &hw_addr_len, extack); err = ops->port_function_hw_addr_get(port, hw_addr, &hw_addr_len,
extack);
if (err) { if (err) {
if (err == -EOPNOTSUPP) if (err == -EOPNOTSUPP)
return 0; return 0;
...@@ -893,12 +895,11 @@ devlink_port_fn_opstate_valid(enum devlink_port_fn_opstate opstate) ...@@ -893,12 +895,11 @@ devlink_port_fn_opstate_valid(enum devlink_port_fn_opstate opstate)
opstate == DEVLINK_PORT_FN_OPSTATE_ATTACHED; opstate == DEVLINK_PORT_FN_OPSTATE_ATTACHED;
} }
static int static int devlink_port_fn_state_fill(const struct devlink_ops *ops,
devlink_port_fn_state_fill(struct devlink *devlink, struct devlink_port *port,
const struct devlink_ops *ops, struct sk_buff *msg,
struct devlink_port *port, struct sk_buff *msg, struct netlink_ext_ack *extack,
struct netlink_ext_ack *extack, bool *msg_updated)
bool *msg_updated)
{ {
enum devlink_port_fn_opstate opstate; enum devlink_port_fn_opstate opstate;
enum devlink_port_fn_state state; enum devlink_port_fn_state state;
...@@ -907,7 +908,7 @@ devlink_port_fn_state_fill(struct devlink *devlink, ...@@ -907,7 +908,7 @@ devlink_port_fn_state_fill(struct devlink *devlink,
if (!ops->port_fn_state_get) if (!ops->port_fn_state_get)
return 0; return 0;
err = ops->port_fn_state_get(devlink, port, &state, &opstate, extack); err = ops->port_fn_state_get(port, &state, &opstate, extack);
if (err) { if (err) {
if (err == -EOPNOTSUPP) if (err == -EOPNOTSUPP)
return 0; return 0;
...@@ -935,7 +936,6 @@ static int ...@@ -935,7 +936,6 @@ static int
devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port, devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *port,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct devlink *devlink = port->devlink;
const struct devlink_ops *ops; const struct devlink_ops *ops;
struct nlattr *function_attr; struct nlattr *function_attr;
bool msg_updated = false; bool msg_updated = false;
...@@ -945,13 +945,12 @@ devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *por ...@@ -945,13 +945,12 @@ devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port *por
if (!function_attr) if (!function_attr)
return -EMSGSIZE; return -EMSGSIZE;
ops = devlink->ops; ops = port->devlink->ops;
err = devlink_port_fn_hw_addr_fill(devlink, ops, port, msg, err = devlink_port_fn_hw_addr_fill(ops, port, msg, extack,
extack, &msg_updated); &msg_updated);
if (err) if (err)
goto out; goto out;
err = devlink_port_fn_state_fill(devlink, ops, port, msg, extack, err = devlink_port_fn_state_fill(ops, port, msg, extack, &msg_updated);
&msg_updated);
out: out:
if (err || !msg_updated) if (err || !msg_updated)
nla_nest_cancel(msg, function_attr); nla_nest_cancel(msg, function_attr);
...@@ -1269,31 +1268,33 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg, ...@@ -1269,31 +1268,33 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
return msg->len; return msg->len;
} }
static int devlink_port_type_set(struct devlink *devlink, static int devlink_port_type_set(struct devlink_port *devlink_port,
struct devlink_port *devlink_port,
enum devlink_port_type port_type) enum devlink_port_type port_type)
{ {
int err; int err;
if (devlink->ops->port_type_set) { if (devlink_port->devlink->ops->port_type_set)
if (port_type == devlink_port->type) return -EOPNOTSUPP;
return 0;
err = devlink->ops->port_type_set(devlink_port, port_type); if (port_type == devlink_port->type)
if (err)
return err;
devlink_port->desired_type = port_type;
devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
return 0; return 0;
}
return -EOPNOTSUPP; err = devlink_port->devlink->ops->port_type_set(devlink_port,
port_type);
if (err)
return err;
devlink_port->desired_type = port_type;
devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
return 0;
} }
static int static int devlink_port_function_hw_addr_set(struct devlink_port *port,
devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *port, const struct nlattr *attr,
const struct nlattr *attr, struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
const struct devlink_ops *ops; const struct devlink_ops *ops = port->devlink->ops;
const u8 *hw_addr; const u8 *hw_addr;
int hw_addr_len; int hw_addr_len;
...@@ -1314,17 +1315,16 @@ devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port * ...@@ -1314,17 +1315,16 @@ devlink_port_function_hw_addr_set(struct devlink *devlink, struct devlink_port *
} }
} }
ops = devlink->ops;
if (!ops->port_function_hw_addr_set) { if (!ops->port_function_hw_addr_set) {
NL_SET_ERR_MSG_MOD(extack, "Port doesn't support function attributes"); NL_SET_ERR_MSG_MOD(extack, "Port doesn't support function attributes");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
return ops->port_function_hw_addr_set(devlink, port, hw_addr, hw_addr_len, extack); return ops->port_function_hw_addr_set(port, hw_addr, hw_addr_len,
extack);
} }
static int devlink_port_fn_state_set(struct devlink *devlink, static int devlink_port_fn_state_set(struct devlink_port *port,
struct devlink_port *port,
const struct nlattr *attr, const struct nlattr *attr,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
...@@ -1332,18 +1332,18 @@ static int devlink_port_fn_state_set(struct devlink *devlink, ...@@ -1332,18 +1332,18 @@ static int devlink_port_fn_state_set(struct devlink *devlink,
const struct devlink_ops *ops; const struct devlink_ops *ops;
state = nla_get_u8(attr); state = nla_get_u8(attr);
ops = devlink->ops; ops = port->devlink->ops;
if (!ops->port_fn_state_set) { if (!ops->port_fn_state_set) {
NL_SET_ERR_MSG_MOD(extack, NL_SET_ERR_MSG_MOD(extack,
"Function does not support state setting"); "Function does not support state setting");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
return ops->port_fn_state_set(devlink, port, state, extack); return ops->port_fn_state_set(port, state, extack);
} }
static int static int devlink_port_function_set(struct devlink_port *port,
devlink_port_function_set(struct devlink *devlink, struct devlink_port *port, const struct nlattr *attr,
const struct nlattr *attr, struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct nlattr *tb[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1]; struct nlattr *tb[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1];
int err; int err;
...@@ -1357,7 +1357,7 @@ devlink_port_function_set(struct devlink *devlink, struct devlink_port *port, ...@@ -1357,7 +1357,7 @@ devlink_port_function_set(struct devlink *devlink, struct devlink_port *port,
attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR]; attr = tb[DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR];
if (attr) { if (attr) {
err = devlink_port_function_hw_addr_set(devlink, port, attr, extack); err = devlink_port_function_hw_addr_set(port, attr, extack);
if (err) if (err)
return err; return err;
} }
...@@ -1367,7 +1367,7 @@ devlink_port_function_set(struct devlink *devlink, struct devlink_port *port, ...@@ -1367,7 +1367,7 @@ devlink_port_function_set(struct devlink *devlink, struct devlink_port *port,
*/ */
attr = tb[DEVLINK_PORT_FN_ATTR_STATE]; attr = tb[DEVLINK_PORT_FN_ATTR_STATE];
if (attr) if (attr)
err = devlink_port_fn_state_set(devlink, port, attr, extack); err = devlink_port_fn_state_set(port, attr, extack);
if (!err) if (!err)
devlink_port_notify(port, DEVLINK_CMD_PORT_NEW); devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
...@@ -1378,14 +1378,13 @@ static int devlink_nl_cmd_port_set_doit(struct sk_buff *skb, ...@@ -1378,14 +1378,13 @@ static int devlink_nl_cmd_port_set_doit(struct sk_buff *skb,
struct genl_info *info) struct genl_info *info)
{ {
struct devlink_port *devlink_port = info->user_ptr[1]; struct devlink_port *devlink_port = info->user_ptr[1];
struct devlink *devlink = devlink_port->devlink;
int err; int err;
if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) { if (info->attrs[DEVLINK_ATTR_PORT_TYPE]) {
enum devlink_port_type port_type; enum devlink_port_type port_type;
port_type = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_TYPE]); port_type = nla_get_u16(info->attrs[DEVLINK_ATTR_PORT_TYPE]);
err = devlink_port_type_set(devlink, devlink_port, port_type); err = devlink_port_type_set(devlink_port, port_type);
if (err) if (err)
return err; return err;
} }
...@@ -1394,7 +1393,7 @@ static int devlink_nl_cmd_port_set_doit(struct sk_buff *skb, ...@@ -1394,7 +1393,7 @@ static int devlink_nl_cmd_port_set_doit(struct sk_buff *skb,
struct nlattr *attr = info->attrs[DEVLINK_ATTR_PORT_FUNCTION]; struct nlattr *attr = info->attrs[DEVLINK_ATTR_PORT_FUNCTION];
struct netlink_ext_ack *extack = info->extack; struct netlink_ext_ack *extack = info->extack;
err = devlink_port_function_set(devlink, devlink_port, attr, extack); err = devlink_port_function_set(devlink_port, attr, extack);
if (err) if (err)
return err; return err;
} }
......
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