Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1// SPDX-License-Identifier: GPL-2.0+
  2
  3#include "lan966x_main.h"
  4#include "lan966x_vcap_ag_api.h"
  5#include "vcap_api.h"
  6#include "vcap_api_client.h"
  7
  8static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
  9				       struct vcap_admin *admin,
 10				       struct vcap_output_print *out)
 11{
 12	struct lan966x *lan966x = port->lan966x;
 13	u32 val;
 14
 15	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
 16		 netdev_name(port->dev));
 17
 18	val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
 19	out->prf(out->dst, "\n    state: ");
 20	if (ANA_VCAP_CFG_S1_ENA_GET(val))
 21		out->prf(out->dst, "on");
 22	else
 23		out->prf(out->dst, "off");
 24
 25	for (int l = 0; l < admin->lookups; ++l) {
 26		out->prf(out->dst, "\n    Lookup %d: ", l);
 27
 28		out->prf(out->dst, "\n      other: ");
 29		switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
 30		case VCAP_IS1_PS_OTHER_NORMAL:
 31			out->prf(out->dst, "normal");
 32			break;
 33		case VCAP_IS1_PS_OTHER_7TUPLE:
 34			out->prf(out->dst, "7tuple");
 35			break;
 36		case VCAP_IS1_PS_OTHER_DBL_VID:
 37			out->prf(out->dst, "dbl_vid");
 38			break;
 39		case VCAP_IS1_PS_OTHER_DMAC_VID:
 40			out->prf(out->dst, "dmac_vid");
 41			break;
 42		default:
 43			out->prf(out->dst, "-");
 44			break;
 45		}
 46
 47		out->prf(out->dst, "\n      ipv4: ");
 48		switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
 49		case VCAP_IS1_PS_IPV4_NORMAL:
 50			out->prf(out->dst, "normal");
 51			break;
 52		case VCAP_IS1_PS_IPV4_7TUPLE:
 53			out->prf(out->dst, "7tuple");
 54			break;
 55		case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
 56			out->prf(out->dst, "5tuple_ipv4");
 57			break;
 58		case VCAP_IS1_PS_IPV4_DBL_VID:
 59			out->prf(out->dst, "dbl_vid");
 60			break;
 61		case VCAP_IS1_PS_IPV4_DMAC_VID:
 62			out->prf(out->dst, "dmac_vid");
 63			break;
 64		default:
 65			out->prf(out->dst, "-");
 66			break;
 67		}
 68
 69		out->prf(out->dst, "\n      ipv6: ");
 70		switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
 71		case VCAP_IS1_PS_IPV6_NORMAL:
 72			out->prf(out->dst, "normal");
 73			break;
 74		case VCAP_IS1_PS_IPV6_7TUPLE:
 75			out->prf(out->dst, "7tuple");
 76			break;
 77		case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
 78			out->prf(out->dst, "5tuple_ip4");
 79			break;
 80		case VCAP_IS1_PS_IPV6_NORMAL_IP6:
 81			out->prf(out->dst, "normal_ip6");
 82			break;
 83		case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
 84			out->prf(out->dst, "5tuple_ip6");
 85			break;
 86		case VCAP_IS1_PS_IPV6_DBL_VID:
 87			out->prf(out->dst, "dbl_vid");
 88			break;
 89		case VCAP_IS1_PS_IPV6_DMAC_VID:
 90			out->prf(out->dst, "dmac_vid");
 91			break;
 92		default:
 93			out->prf(out->dst, "-");
 94			break;
 95		}
 96
 97		out->prf(out->dst, "\n      rt: ");
 98		switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
 99		case VCAP_IS1_PS_RT_NORMAL:
100			out->prf(out->dst, "normal");
101			break;
102		case VCAP_IS1_PS_RT_7TUPLE:
103			out->prf(out->dst, "7tuple");
104			break;
105		case VCAP_IS1_PS_RT_DBL_VID:
106			out->prf(out->dst, "dbl_vid");
107			break;
108		case VCAP_IS1_PS_RT_DMAC_VID:
109			out->prf(out->dst, "dmac_vid");
110			break;
111		case VCAP_IS1_PS_RT_FOLLOW_OTHER:
112			out->prf(out->dst, "follow_other");
113			break;
114		default:
115			out->prf(out->dst, "-");
116			break;
117		}
118	}
119
120	out->prf(out->dst, "\n");
121}
122
123static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
124				       struct vcap_admin *admin,
125				       struct vcap_output_print *out)
126{
127	struct lan966x *lan966x = port->lan966x;
128	u32 val;
129
130	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
131		 netdev_name(port->dev));
132
133	val = lan_rd(lan966x, ANA_VCAP_S2_CFG(port->chip_port));
134	out->prf(out->dst, "\n    state: ");
135	if (ANA_VCAP_S2_CFG_ENA_GET(val))
136		out->prf(out->dst, "on");
137	else
138		out->prf(out->dst, "off");
139
140	for (int l = 0; l < admin->lookups; ++l) {
141		out->prf(out->dst, "\n    Lookup %d: ", l);
142
143		out->prf(out->dst, "\n      snap: ");
144		if (ANA_VCAP_S2_CFG_SNAP_DIS_GET(val) & (BIT(0) << l))
145			out->prf(out->dst, "mac_llc");
146		else
147			out->prf(out->dst, "mac_snap");
148
149		out->prf(out->dst, "\n      oam: ");
150		if (ANA_VCAP_S2_CFG_OAM_DIS_GET(val) & (BIT(0) << l))
151			out->prf(out->dst, "mac_etype");
152		else
153			out->prf(out->dst, "mac_oam");
154
155		out->prf(out->dst, "\n      arp: ");
156		if (ANA_VCAP_S2_CFG_ARP_DIS_GET(val) & (BIT(0) << l))
157			out->prf(out->dst, "mac_etype");
158		else
159			out->prf(out->dst, "mac_arp");
160
161		out->prf(out->dst, "\n      ipv4_other: ");
162		if (ANA_VCAP_S2_CFG_IP_OTHER_DIS_GET(val) & (BIT(0) << l))
163			out->prf(out->dst, "mac_etype");
164		else
165			out->prf(out->dst, "ip4_other");
166
167		out->prf(out->dst, "\n      ipv4_tcp_udp: ");
168		if (ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_GET(val) & (BIT(0) << l))
169			out->prf(out->dst, "mac_etype");
170		else
171			out->prf(out->dst, "ipv4_tcp_udp");
172
173		out->prf(out->dst, "\n      ipv6: ");
174		switch (ANA_VCAP_S2_CFG_IP6_CFG_GET(val) & (0x3 << l)) {
175		case VCAP_IS2_PS_IPV6_TCPUDP_OTHER:
176			out->prf(out->dst, "ipv6_tcp_udp ipv6_tcp_udp");
177			break;
178		case VCAP_IS2_PS_IPV6_STD:
179			out->prf(out->dst, "ipv6_std");
180			break;
181		case VCAP_IS2_PS_IPV6_IP4_TCPUDP_IP4_OTHER:
182			out->prf(out->dst, "ipv4_tcp_udp ipv4_tcp_udp");
183			break;
184		case VCAP_IS2_PS_IPV6_MAC_ETYPE:
185			out->prf(out->dst, "mac_etype");
186			break;
187		}
188	}
189
190	out->prf(out->dst, "\n");
191}
192
193static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
194				       struct vcap_admin *admin,
195				       struct vcap_output_print *out)
196{
197	struct lan966x *lan966x = port->lan966x;
198	u32 val;
199
200	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
201		 netdev_name(port->dev));
202
203	val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
204	out->prf(out->dst, "\n    state: ");
205	if (REW_PORT_CFG_ES0_EN_GET(val))
206		out->prf(out->dst, "on");
207	else
208		out->prf(out->dst, "off");
209
210	out->prf(out->dst, "\n");
211}
212
213int lan966x_vcap_port_info(struct net_device *dev,
214			   struct vcap_admin *admin,
215			   struct vcap_output_print *out)
216{
217	struct lan966x_port *port = netdev_priv(dev);
218	struct lan966x *lan966x = port->lan966x;
219	const struct vcap_info *vcap;
220	struct vcap_control *vctrl;
221
222	vctrl = lan966x->vcap_ctrl;
223	vcap = &vctrl->vcaps[admin->vtype];
224
225	out->prf(out->dst, "%s:\n", vcap->name);
226	switch (admin->vtype) {
227	case VCAP_TYPE_IS2:
228		lan966x_vcap_is2_port_keys(port, admin, out);
229		break;
230	case VCAP_TYPE_IS1:
231		lan966x_vcap_is1_port_keys(port, admin, out);
232		break;
233	case VCAP_TYPE_ES0:
234		lan966x_vcap_es0_port_keys(port, admin, out);
235		break;
236	default:
237		out->prf(out->dst, "  no info\n");
238		break;
239	}
240
241	return 0;
242}