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