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