xref: /openbmc/linux/drivers/net/ethernet/microchip/lan966x/lan966x_dcb.c (revision 2612e3bbc0386368a850140a6c9b990cd496a5ec)
1a83e4630SHoratiu Vultur // SPDX-License-Identifier: GPL-2.0+
2a83e4630SHoratiu Vultur 
3a83e4630SHoratiu Vultur #include "lan966x_main.h"
4a83e4630SHoratiu Vultur 
510c71a97SHoratiu Vultur enum lan966x_dcb_apptrust_values {
610c71a97SHoratiu Vultur 	LAN966X_DCB_APPTRUST_EMPTY,
710c71a97SHoratiu Vultur 	LAN966X_DCB_APPTRUST_DSCP,
810c71a97SHoratiu Vultur 	LAN966X_DCB_APPTRUST_PCP,
910c71a97SHoratiu Vultur 	LAN966X_DCB_APPTRUST_DSCP_PCP,
1010c71a97SHoratiu Vultur 	__LAN966X_DCB_APPTRUST_MAX
1110c71a97SHoratiu Vultur };
1210c71a97SHoratiu Vultur 
1310c71a97SHoratiu Vultur static const struct lan966x_dcb_apptrust {
1410c71a97SHoratiu Vultur 	u8 selectors[IEEE_8021QAZ_APP_SEL_MAX + 1];
1510c71a97SHoratiu Vultur 	int nselectors;
1610c71a97SHoratiu Vultur } *lan966x_port_apptrust[NUM_PHYS_PORTS];
1710c71a97SHoratiu Vultur 
1810c71a97SHoratiu Vultur static const char *lan966x_dcb_apptrust_names[__LAN966X_DCB_APPTRUST_MAX] = {
1910c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_EMPTY]    = "empty",
2010c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_DSCP]     = "dscp",
2110c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_PCP]      = "pcp",
2210c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_DSCP_PCP] = "dscp pcp"
2310c71a97SHoratiu Vultur };
2410c71a97SHoratiu Vultur 
2510c71a97SHoratiu Vultur /* Lan966x supported apptrust policies */
2610c71a97SHoratiu Vultur static const struct lan966x_dcb_apptrust
2710c71a97SHoratiu Vultur 	lan966x_dcb_apptrust_policies[__LAN966X_DCB_APPTRUST_MAX] = {
2810c71a97SHoratiu Vultur 	/* Empty *must* be first */
2910c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_EMPTY]    = { { 0 }, 0 },
3010c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_DSCP]     = { { IEEE_8021QAZ_APP_SEL_DSCP }, 1 },
3110c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_PCP]      = { { DCB_APP_SEL_PCP }, 1 },
3210c71a97SHoratiu Vultur 	[LAN966X_DCB_APPTRUST_DSCP_PCP] = { { IEEE_8021QAZ_APP_SEL_DSCP,
3310c71a97SHoratiu Vultur 					      DCB_APP_SEL_PCP }, 2 },
3410c71a97SHoratiu Vultur };
3510c71a97SHoratiu Vultur 
lan966x_dcb_apptrust_contains(int portno,u8 selector)3610c71a97SHoratiu Vultur static bool lan966x_dcb_apptrust_contains(int portno, u8 selector)
3710c71a97SHoratiu Vultur {
3810c71a97SHoratiu Vultur 	const struct lan966x_dcb_apptrust *conf = lan966x_port_apptrust[portno];
3910c71a97SHoratiu Vultur 
4010c71a97SHoratiu Vultur 	for (int i = 0; i < conf->nselectors; i++)
4110c71a97SHoratiu Vultur 		if (conf->selectors[i] == selector)
4210c71a97SHoratiu Vultur 			return true;
4310c71a97SHoratiu Vultur 
4410c71a97SHoratiu Vultur 	return false;
4510c71a97SHoratiu Vultur }
4610c71a97SHoratiu Vultur 
lan966x_dcb_app_update(struct net_device * dev)4710c71a97SHoratiu Vultur static void lan966x_dcb_app_update(struct net_device *dev)
48a83e4630SHoratiu Vultur {
49*d38ddd56SHoratiu Vultur 	struct dcb_ieee_app_prio_map dscp_rewr_map = {0};
50363f98b9SHoratiu Vultur 	struct dcb_rewr_prio_pcp_map pcp_rewr_map = {0};
51a83e4630SHoratiu Vultur 	struct lan966x_port *port = netdev_priv(dev);
52a83e4630SHoratiu Vultur 	struct lan966x_port_qos qos = {0};
53a83e4630SHoratiu Vultur 	struct dcb_app app_itr;
54*d38ddd56SHoratiu Vultur 	bool dscp_rewr = false;
55363f98b9SHoratiu Vultur 	bool pcp_rewr = false;
56a83e4630SHoratiu Vultur 
57a83e4630SHoratiu Vultur 	/* Get pcp ingress mapping */
58a83e4630SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(qos.pcp.map); i++) {
59a83e4630SHoratiu Vultur 		app_itr.selector = DCB_APP_SEL_PCP;
60a83e4630SHoratiu Vultur 		app_itr.protocol = i;
61a83e4630SHoratiu Vultur 		qos.pcp.map[i] = dcb_getapp(dev, &app_itr);
62a83e4630SHoratiu Vultur 	}
63a83e4630SHoratiu Vultur 
640c88d981SHoratiu Vultur 	/* Get dscp ingress mapping */
650c88d981SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(qos.dscp.map); i++) {
660c88d981SHoratiu Vultur 		app_itr.selector = IEEE_8021QAZ_APP_SEL_DSCP;
670c88d981SHoratiu Vultur 		app_itr.protocol = i;
680c88d981SHoratiu Vultur 		qos.dscp.map[i] = dcb_getapp(dev, &app_itr);
690c88d981SHoratiu Vultur 	}
700c88d981SHoratiu Vultur 
71f8ba50eaSHoratiu Vultur 	/* Get default prio */
72f8ba50eaSHoratiu Vultur 	qos.default_prio = dcb_ieee_getapp_default_prio_mask(dev);
73f8ba50eaSHoratiu Vultur 	if (qos.default_prio)
74f8ba50eaSHoratiu Vultur 		qos.default_prio = fls(qos.default_prio) - 1;
75f8ba50eaSHoratiu Vultur 
76363f98b9SHoratiu Vultur 	/* Get pcp rewrite mapping */
77363f98b9SHoratiu Vultur 	dcb_getrewr_prio_pcp_mask_map(dev, &pcp_rewr_map);
78363f98b9SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(pcp_rewr_map.map); i++) {
79363f98b9SHoratiu Vultur 		if (!pcp_rewr_map.map[i])
80363f98b9SHoratiu Vultur 			continue;
81363f98b9SHoratiu Vultur 
82363f98b9SHoratiu Vultur 		pcp_rewr = true;
83363f98b9SHoratiu Vultur 		qos.pcp_rewr.map[i] = fls(pcp_rewr_map.map[i]) - 1;
84363f98b9SHoratiu Vultur 	}
85363f98b9SHoratiu Vultur 
86*d38ddd56SHoratiu Vultur 	/* Get dscp rewrite mapping */
87*d38ddd56SHoratiu Vultur 	dcb_getrewr_prio_dscp_mask_map(dev, &dscp_rewr_map);
88*d38ddd56SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(dscp_rewr_map.map); i++) {
89*d38ddd56SHoratiu Vultur 		if (!dscp_rewr_map.map[i])
90*d38ddd56SHoratiu Vultur 			continue;
91*d38ddd56SHoratiu Vultur 
92*d38ddd56SHoratiu Vultur 		dscp_rewr = true;
93*d38ddd56SHoratiu Vultur 		qos.dscp_rewr.map[i] = fls64(dscp_rewr_map.map[i]) - 1;
94*d38ddd56SHoratiu Vultur 	}
95*d38ddd56SHoratiu Vultur 
9610c71a97SHoratiu Vultur 	/* Enable use of pcp for queue classification */
97363f98b9SHoratiu Vultur 	if (lan966x_dcb_apptrust_contains(port->chip_port, DCB_APP_SEL_PCP)) {
9810c71a97SHoratiu Vultur 		qos.pcp.enable = true;
9910c71a97SHoratiu Vultur 
100363f98b9SHoratiu Vultur 		if (pcp_rewr)
101363f98b9SHoratiu Vultur 			qos.pcp_rewr.enable = true;
102363f98b9SHoratiu Vultur 	}
103363f98b9SHoratiu Vultur 
1040c88d981SHoratiu Vultur 	/* Enable use of dscp for queue classification */
105*d38ddd56SHoratiu Vultur 	if (lan966x_dcb_apptrust_contains(port->chip_port, IEEE_8021QAZ_APP_SEL_DSCP)) {
1060c88d981SHoratiu Vultur 		qos.dscp.enable = true;
1070c88d981SHoratiu Vultur 
108*d38ddd56SHoratiu Vultur 		if (dscp_rewr)
109*d38ddd56SHoratiu Vultur 			qos.dscp_rewr.enable = true;
110*d38ddd56SHoratiu Vultur 	}
111*d38ddd56SHoratiu Vultur 
112a83e4630SHoratiu Vultur 	lan966x_port_qos_set(port, &qos);
113a83e4630SHoratiu Vultur }
114a83e4630SHoratiu Vultur 
1150c88d981SHoratiu Vultur /* DSCP mapping is global for all ports, so set and delete app entries are
1160c88d981SHoratiu Vultur  * replicated for each port.
1170c88d981SHoratiu Vultur  */
lan966x_dcb_ieee_dscp_setdel(struct net_device * dev,struct dcb_app * app,int (* setdel)(struct net_device *,struct dcb_app *))1180c88d981SHoratiu Vultur static int lan966x_dcb_ieee_dscp_setdel(struct net_device *dev,
1190c88d981SHoratiu Vultur 					struct dcb_app *app,
1200c88d981SHoratiu Vultur 					int (*setdel)(struct net_device *,
1210c88d981SHoratiu Vultur 						      struct dcb_app *))
1220c88d981SHoratiu Vultur {
1230c88d981SHoratiu Vultur 	struct lan966x_port *port = netdev_priv(dev);
1240c88d981SHoratiu Vultur 	struct lan966x *lan966x = port->lan966x;
1250c88d981SHoratiu Vultur 	int err;
1260c88d981SHoratiu Vultur 
1270c88d981SHoratiu Vultur 	for (int i = 0; i < NUM_PHYS_PORTS; i++) {
1280c88d981SHoratiu Vultur 		port = lan966x->ports[i];
1290c88d981SHoratiu Vultur 		if (!port)
1300c88d981SHoratiu Vultur 			continue;
1310c88d981SHoratiu Vultur 
1320c88d981SHoratiu Vultur 		err = setdel(port->dev, app);
1330c88d981SHoratiu Vultur 		if (err)
1340c88d981SHoratiu Vultur 			return err;
1350c88d981SHoratiu Vultur 	}
1360c88d981SHoratiu Vultur 
1370c88d981SHoratiu Vultur 	return 0;
1380c88d981SHoratiu Vultur }
1390c88d981SHoratiu Vultur 
lan966x_dcb_app_validate(struct net_device * dev,const struct dcb_app * app)140a83e4630SHoratiu Vultur static int lan966x_dcb_app_validate(struct net_device *dev,
141a83e4630SHoratiu Vultur 				    const struct dcb_app *app)
142a83e4630SHoratiu Vultur {
143a83e4630SHoratiu Vultur 	int err = 0;
144a83e4630SHoratiu Vultur 
145a83e4630SHoratiu Vultur 	switch (app->selector) {
146f8ba50eaSHoratiu Vultur 	/* Default priority checks */
147f8ba50eaSHoratiu Vultur 	case IEEE_8021QAZ_APP_SEL_ETHERTYPE:
148f8ba50eaSHoratiu Vultur 		if (app->protocol)
149f8ba50eaSHoratiu Vultur 			err = -EINVAL;
150f8ba50eaSHoratiu Vultur 		else if (app->priority >= NUM_PRIO_QUEUES)
151f8ba50eaSHoratiu Vultur 			err = -ERANGE;
152f8ba50eaSHoratiu Vultur 		break;
1530c88d981SHoratiu Vultur 	/* Dscp checks */
1540c88d981SHoratiu Vultur 	case IEEE_8021QAZ_APP_SEL_DSCP:
1550c88d981SHoratiu Vultur 		if (app->protocol >= LAN966X_PORT_QOS_DSCP_COUNT)
1560c88d981SHoratiu Vultur 			err = -EINVAL;
1570c88d981SHoratiu Vultur 		else if (app->priority >= NUM_PRIO_QUEUES)
1580c88d981SHoratiu Vultur 			err = -ERANGE;
1590c88d981SHoratiu Vultur 		break;
160a83e4630SHoratiu Vultur 	/* Pcp checks */
161a83e4630SHoratiu Vultur 	case DCB_APP_SEL_PCP:
162a83e4630SHoratiu Vultur 		if (app->protocol >= LAN966X_PORT_QOS_PCP_DEI_COUNT)
163a83e4630SHoratiu Vultur 			err = -EINVAL;
164a83e4630SHoratiu Vultur 		else if (app->priority >= NUM_PRIO_QUEUES)
165a83e4630SHoratiu Vultur 			err = -ERANGE;
166a83e4630SHoratiu Vultur 		break;
167a83e4630SHoratiu Vultur 	default:
168a83e4630SHoratiu Vultur 		err = -EINVAL;
169a83e4630SHoratiu Vultur 		break;
170a83e4630SHoratiu Vultur 	}
171a83e4630SHoratiu Vultur 
172a83e4630SHoratiu Vultur 	if (err)
173a83e4630SHoratiu Vultur 		netdev_err(dev, "Invalid entry: %d:%d\n", app->protocol,
174a83e4630SHoratiu Vultur 			   app->priority);
175a83e4630SHoratiu Vultur 
176a83e4630SHoratiu Vultur 	return err;
177a83e4630SHoratiu Vultur }
178a83e4630SHoratiu Vultur 
lan966x_dcb_ieee_delapp(struct net_device * dev,struct dcb_app * app)179a83e4630SHoratiu Vultur static int lan966x_dcb_ieee_delapp(struct net_device *dev, struct dcb_app *app)
180a83e4630SHoratiu Vultur {
181a83e4630SHoratiu Vultur 	int err;
182a83e4630SHoratiu Vultur 
1830c88d981SHoratiu Vultur 	if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
1840c88d981SHoratiu Vultur 		err = lan966x_dcb_ieee_dscp_setdel(dev, app, dcb_ieee_delapp);
1850c88d981SHoratiu Vultur 	else
186a83e4630SHoratiu Vultur 		err = dcb_ieee_delapp(dev, app);
1870c88d981SHoratiu Vultur 
1880c88d981SHoratiu Vultur 	if (err)
189a83e4630SHoratiu Vultur 		return err;
190a83e4630SHoratiu Vultur 
19110c71a97SHoratiu Vultur 	lan966x_dcb_app_update(dev);
192a83e4630SHoratiu Vultur 
193a83e4630SHoratiu Vultur 	return 0;
194a83e4630SHoratiu Vultur }
195a83e4630SHoratiu Vultur 
lan966x_dcb_ieee_setapp(struct net_device * dev,struct dcb_app * app)196a83e4630SHoratiu Vultur static int lan966x_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
197a83e4630SHoratiu Vultur {
198a83e4630SHoratiu Vultur 	struct dcb_app app_itr;
199a83e4630SHoratiu Vultur 	int err;
200a83e4630SHoratiu Vultur 	u8 prio;
201a83e4630SHoratiu Vultur 
202a83e4630SHoratiu Vultur 	err = lan966x_dcb_app_validate(dev, app);
203a83e4630SHoratiu Vultur 	if (err)
204a83e4630SHoratiu Vultur 		return err;
205a83e4630SHoratiu Vultur 
206a83e4630SHoratiu Vultur 	/* Delete current mapping, if it exists */
207a83e4630SHoratiu Vultur 	prio = dcb_getapp(dev, app);
208a83e4630SHoratiu Vultur 	if (prio) {
209a83e4630SHoratiu Vultur 		app_itr = *app;
210a83e4630SHoratiu Vultur 		app_itr.priority = prio;
2110c88d981SHoratiu Vultur 		lan966x_dcb_ieee_delapp(dev, &app_itr);
212a83e4630SHoratiu Vultur 	}
213a83e4630SHoratiu Vultur 
2140c88d981SHoratiu Vultur 	if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
2150c88d981SHoratiu Vultur 		err = lan966x_dcb_ieee_dscp_setdel(dev, app, dcb_ieee_setapp);
2160c88d981SHoratiu Vultur 	else
217a83e4630SHoratiu Vultur 		err = dcb_ieee_setapp(dev, app);
2180c88d981SHoratiu Vultur 
219a83e4630SHoratiu Vultur 	if (err)
220a83e4630SHoratiu Vultur 		return err;
221a83e4630SHoratiu Vultur 
22210c71a97SHoratiu Vultur 	lan966x_dcb_app_update(dev);
22310c71a97SHoratiu Vultur 
22410c71a97SHoratiu Vultur 	return 0;
22510c71a97SHoratiu Vultur }
22610c71a97SHoratiu Vultur 
lan966x_dcb_apptrust_validate(struct net_device * dev,u8 * selectors,int nselectors)22710c71a97SHoratiu Vultur static int lan966x_dcb_apptrust_validate(struct net_device *dev,
22810c71a97SHoratiu Vultur 					 u8 *selectors,
22910c71a97SHoratiu Vultur 					 int nselectors)
23010c71a97SHoratiu Vultur {
23110c71a97SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(lan966x_dcb_apptrust_policies); i++) {
23210c71a97SHoratiu Vultur 		bool match;
23310c71a97SHoratiu Vultur 
23410c71a97SHoratiu Vultur 		if (lan966x_dcb_apptrust_policies[i].nselectors != nselectors)
23510c71a97SHoratiu Vultur 			continue;
23610c71a97SHoratiu Vultur 
23710c71a97SHoratiu Vultur 		match = true;
23810c71a97SHoratiu Vultur 		for (int j = 0; j < nselectors; j++) {
23910c71a97SHoratiu Vultur 			if (lan966x_dcb_apptrust_policies[i].selectors[j] !=
24010c71a97SHoratiu Vultur 			    *(selectors + j)) {
24110c71a97SHoratiu Vultur 				match = false;
24210c71a97SHoratiu Vultur 				break;
24310c71a97SHoratiu Vultur 			}
24410c71a97SHoratiu Vultur 		}
24510c71a97SHoratiu Vultur 		if (match)
24610c71a97SHoratiu Vultur 			return i;
24710c71a97SHoratiu Vultur 	}
24810c71a97SHoratiu Vultur 
24910c71a97SHoratiu Vultur 	netdev_err(dev, "Valid apptrust configurations are:\n");
25010c71a97SHoratiu Vultur 	for (int i = 0; i < ARRAY_SIZE(lan966x_dcb_apptrust_names); i++)
25110c71a97SHoratiu Vultur 		pr_info("order: %s\n", lan966x_dcb_apptrust_names[i]);
25210c71a97SHoratiu Vultur 
25310c71a97SHoratiu Vultur 	return -EOPNOTSUPP;
25410c71a97SHoratiu Vultur }
25510c71a97SHoratiu Vultur 
lan966x_dcb_setapptrust(struct net_device * dev,u8 * selectors,int nselectors)25610c71a97SHoratiu Vultur static int lan966x_dcb_setapptrust(struct net_device *dev,
25710c71a97SHoratiu Vultur 				   u8 *selectors,
25810c71a97SHoratiu Vultur 				   int nselectors)
25910c71a97SHoratiu Vultur {
26010c71a97SHoratiu Vultur 	struct lan966x_port *port = netdev_priv(dev);
26110c71a97SHoratiu Vultur 	int idx;
26210c71a97SHoratiu Vultur 
26310c71a97SHoratiu Vultur 	idx = lan966x_dcb_apptrust_validate(dev, selectors, nselectors);
26410c71a97SHoratiu Vultur 	if (idx < 0)
26510c71a97SHoratiu Vultur 		return idx;
26610c71a97SHoratiu Vultur 
26710c71a97SHoratiu Vultur 	lan966x_port_apptrust[port->chip_port] = &lan966x_dcb_apptrust_policies[idx];
26810c71a97SHoratiu Vultur 	lan966x_dcb_app_update(dev);
26910c71a97SHoratiu Vultur 
27010c71a97SHoratiu Vultur 	return 0;
27110c71a97SHoratiu Vultur }
27210c71a97SHoratiu Vultur 
lan966x_dcb_getapptrust(struct net_device * dev,u8 * selectors,int * nselectors)27310c71a97SHoratiu Vultur static int lan966x_dcb_getapptrust(struct net_device *dev, u8 *selectors,
27410c71a97SHoratiu Vultur 				   int *nselectors)
27510c71a97SHoratiu Vultur {
27610c71a97SHoratiu Vultur 	struct lan966x_port *port = netdev_priv(dev);
27710c71a97SHoratiu Vultur 	const struct lan966x_dcb_apptrust *trust;
27810c71a97SHoratiu Vultur 
27910c71a97SHoratiu Vultur 	trust = lan966x_port_apptrust[port->chip_port];
28010c71a97SHoratiu Vultur 
28110c71a97SHoratiu Vultur 	memcpy(selectors, trust->selectors, trust->nselectors);
28210c71a97SHoratiu Vultur 	*nselectors = trust->nselectors;
283a83e4630SHoratiu Vultur 
284a83e4630SHoratiu Vultur 	return 0;
285a83e4630SHoratiu Vultur }
286a83e4630SHoratiu Vultur 
lan966x_dcb_delrewr(struct net_device * dev,struct dcb_app * app)287363f98b9SHoratiu Vultur static int lan966x_dcb_delrewr(struct net_device *dev, struct dcb_app *app)
288363f98b9SHoratiu Vultur {
289363f98b9SHoratiu Vultur 	int err;
290363f98b9SHoratiu Vultur 
291*d38ddd56SHoratiu Vultur 	if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
292*d38ddd56SHoratiu Vultur 		err = lan966x_dcb_ieee_dscp_setdel(dev, app, dcb_delrewr);
293*d38ddd56SHoratiu Vultur 	else
294363f98b9SHoratiu Vultur 		err = dcb_delrewr(dev, app);
295*d38ddd56SHoratiu Vultur 
296363f98b9SHoratiu Vultur 	if (err < 0)
297363f98b9SHoratiu Vultur 		return err;
298363f98b9SHoratiu Vultur 
299363f98b9SHoratiu Vultur 	lan966x_dcb_app_update(dev);
300363f98b9SHoratiu Vultur 
301363f98b9SHoratiu Vultur 	return 0;
302363f98b9SHoratiu Vultur }
303363f98b9SHoratiu Vultur 
lan966x_dcb_setrewr(struct net_device * dev,struct dcb_app * app)304363f98b9SHoratiu Vultur static int lan966x_dcb_setrewr(struct net_device *dev, struct dcb_app *app)
305363f98b9SHoratiu Vultur {
306363f98b9SHoratiu Vultur 	struct dcb_app app_itr;
307363f98b9SHoratiu Vultur 	u16 proto;
308363f98b9SHoratiu Vultur 	int err;
309363f98b9SHoratiu Vultur 
310363f98b9SHoratiu Vultur 	err = lan966x_dcb_app_validate(dev, app);
311363f98b9SHoratiu Vultur 	if (err)
312363f98b9SHoratiu Vultur 		goto out;
313363f98b9SHoratiu Vultur 
314363f98b9SHoratiu Vultur 	/* Delete current mapping, if it exists. */
315363f98b9SHoratiu Vultur 	proto = dcb_getrewr(dev, app);
316363f98b9SHoratiu Vultur 	if (proto) {
317363f98b9SHoratiu Vultur 		app_itr = *app;
318363f98b9SHoratiu Vultur 		app_itr.protocol = proto;
319363f98b9SHoratiu Vultur 		lan966x_dcb_delrewr(dev, &app_itr);
320363f98b9SHoratiu Vultur 	}
321363f98b9SHoratiu Vultur 
322*d38ddd56SHoratiu Vultur 	if (app->selector == IEEE_8021QAZ_APP_SEL_DSCP)
323*d38ddd56SHoratiu Vultur 		err = lan966x_dcb_ieee_dscp_setdel(dev, app, dcb_setrewr);
324*d38ddd56SHoratiu Vultur 	else
325363f98b9SHoratiu Vultur 		err = dcb_setrewr(dev, app);
326*d38ddd56SHoratiu Vultur 
327363f98b9SHoratiu Vultur 	if (err)
328363f98b9SHoratiu Vultur 		goto out;
329363f98b9SHoratiu Vultur 
330363f98b9SHoratiu Vultur 	lan966x_dcb_app_update(dev);
331363f98b9SHoratiu Vultur 
332363f98b9SHoratiu Vultur out:
333363f98b9SHoratiu Vultur 	return err;
334363f98b9SHoratiu Vultur }
335363f98b9SHoratiu Vultur 
336a83e4630SHoratiu Vultur static const struct dcbnl_rtnl_ops lan966x_dcbnl_ops = {
337a83e4630SHoratiu Vultur 	.ieee_setapp = lan966x_dcb_ieee_setapp,
338a83e4630SHoratiu Vultur 	.ieee_delapp = lan966x_dcb_ieee_delapp,
33910c71a97SHoratiu Vultur 	.dcbnl_setapptrust = lan966x_dcb_setapptrust,
34010c71a97SHoratiu Vultur 	.dcbnl_getapptrust = lan966x_dcb_getapptrust,
341363f98b9SHoratiu Vultur 	.dcbnl_setrewr = lan966x_dcb_setrewr,
342363f98b9SHoratiu Vultur 	.dcbnl_delrewr = lan966x_dcb_delrewr,
343a83e4630SHoratiu Vultur };
344a83e4630SHoratiu Vultur 
lan966x_dcb_init(struct lan966x * lan966x)345a83e4630SHoratiu Vultur void lan966x_dcb_init(struct lan966x *lan966x)
346a83e4630SHoratiu Vultur {
347a83e4630SHoratiu Vultur 	for (int p = 0; p < lan966x->num_phys_ports; ++p) {
348a83e4630SHoratiu Vultur 		struct lan966x_port *port;
349a83e4630SHoratiu Vultur 
350a83e4630SHoratiu Vultur 		port = lan966x->ports[p];
351a83e4630SHoratiu Vultur 		if (!port)
352a83e4630SHoratiu Vultur 			continue;
353a83e4630SHoratiu Vultur 
354a83e4630SHoratiu Vultur 		port->dev->dcbnl_ops = &lan966x_dcbnl_ops;
35510c71a97SHoratiu Vultur 
35610c71a97SHoratiu Vultur 		lan966x_port_apptrust[port->chip_port] =
35710c71a97SHoratiu Vultur 			&lan966x_dcb_apptrust_policies[LAN966X_DCB_APPTRUST_DSCP_PCP];
358*d38ddd56SHoratiu Vultur 
359*d38ddd56SHoratiu Vultur 		/* Enable DSCP classification based on classified QoS class and
360*d38ddd56SHoratiu Vultur 		 * DP, for all DSCP values, for all ports.
361*d38ddd56SHoratiu Vultur 		 */
362*d38ddd56SHoratiu Vultur 		lan966x_port_qos_dscp_rewr_mode_set(port,
363*d38ddd56SHoratiu Vultur 						    LAN966X_PORT_QOS_REWR_DSCP_ALL);
364a83e4630SHoratiu Vultur 	}
365a83e4630SHoratiu Vultur }
366