Linux Audio

Check our new training course

Yocto distribution development and maintenance

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