162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include "lan966x_main.h"
462306a36Sopenharmony_ci#include "vcap_api_client.h"
562306a36Sopenharmony_ci
662306a36Sopenharmony_ciint lan966x_goto_port_add(struct lan966x_port *port,
762306a36Sopenharmony_ci			  int from_cid, int to_cid,
862306a36Sopenharmony_ci			  unsigned long goto_id,
962306a36Sopenharmony_ci			  struct netlink_ext_ack *extack)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	struct lan966x *lan966x = port->lan966x;
1262306a36Sopenharmony_ci	int err;
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci	err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev,
1562306a36Sopenharmony_ci				  from_cid, to_cid, goto_id,
1662306a36Sopenharmony_ci				  true);
1762306a36Sopenharmony_ci	if (err == -EFAULT) {
1862306a36Sopenharmony_ci		NL_SET_ERR_MSG_MOD(extack, "Unsupported goto chain");
1962306a36Sopenharmony_ci		return -EOPNOTSUPP;
2062306a36Sopenharmony_ci	}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	if (err == -EADDRINUSE) {
2362306a36Sopenharmony_ci		NL_SET_ERR_MSG_MOD(extack, "VCAP already enabled");
2462306a36Sopenharmony_ci		return -EOPNOTSUPP;
2562306a36Sopenharmony_ci	}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	if (err) {
2862306a36Sopenharmony_ci		NL_SET_ERR_MSG_MOD(extack, "Could not enable VCAP lookups");
2962306a36Sopenharmony_ci		return err;
3062306a36Sopenharmony_ci	}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	return 0;
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ciint lan966x_goto_port_del(struct lan966x_port *port,
3662306a36Sopenharmony_ci			  unsigned long goto_id,
3762306a36Sopenharmony_ci			  struct netlink_ext_ack *extack)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	struct lan966x *lan966x = port->lan966x;
4062306a36Sopenharmony_ci	int err;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	err = vcap_enable_lookups(lan966x->vcap_ctrl, port->dev, 0, 0,
4362306a36Sopenharmony_ci				  goto_id, false);
4462306a36Sopenharmony_ci	if (err) {
4562306a36Sopenharmony_ci		NL_SET_ERR_MSG_MOD(extack, "Could not disable VCAP lookups");
4662306a36Sopenharmony_ci		return err;
4762306a36Sopenharmony_ci	}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	return 0;
5062306a36Sopenharmony_ci}
51