1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2024 Pengutronix, Oleksij Rempel <[email protected]>
3 
4 #include <linux/dsa/ksz_common.h>
5 #include <net/dsa.h>
6 #include <net/dscp.h>
7 #include <net/ieee8021q.h>
8 
9 #include "ksz_common.h"
10 #include "ksz_dcb.h"
11 #include "ksz8.h"
12 
13 /* Port X Control 0 register.
14  * The datasheet specifies: Port 1 - 0x10, Port 2 - 0x20, Port 3 - 0x30.
15  * However, the driver uses get_port_addr(), which maps Port 1 to offset 0.
16  * Therefore, we define the base offset as 0x00 here to align with that logic.
17  */
18 #define KSZ8_REG_PORT_1_CTRL_0			0x00
19 #define KSZ8_PORT_DIFFSERV_ENABLE		BIT(6)
20 #define KSZ8_PORT_802_1P_ENABLE			BIT(5)
21 #define KSZ8_PORT_BASED_PRIO_M			GENMASK(4, 3)
22 
23 #define KSZ88X3_REG_TOS_DSCP_CTRL		0x60
24 #define KSZ8765_REG_TOS_DSCP_CTRL		0x90
25 
26 #define KSZ9477_REG_SW_MAC_TOS_CTRL		0x033e
27 #define KSZ9477_SW_TOS_DSCP_REMAP		BIT(0)
28 #define KSZ9477_SW_TOS_DSCP_DEFAULT_PRIO_M	GENMASK(5, 3)
29 
30 #define KSZ9477_REG_DIFFSERV_PRIO_MAP		0x0340
31 
32 #define KSZ9477_REG_PORT_MRI_PRIO_CTRL		0x0801
33 #define KSZ9477_PORT_HIGHEST_PRIO		BIT(7)
34 #define KSZ9477_PORT_OR_PRIO			BIT(6)
35 #define KSZ9477_PORT_MAC_PRIO_ENABLE		BIT(4)
36 #define KSZ9477_PORT_VLAN_PRIO_ENABLE		BIT(3)
37 #define KSZ9477_PORT_802_1P_PRIO_ENABLE		BIT(2)
38 #define KSZ9477_PORT_DIFFSERV_PRIO_ENABLE	BIT(1)
39 #define KSZ9477_PORT_ACL_PRIO_ENABLE		BIT(0)
40 
41 #define KSZ9477_REG_PORT_MRI_MAC_CTRL		0x0802
42 #define KSZ9477_PORT_BASED_PRIO_M		GENMASK(2, 0)
43 
44 struct ksz_apptrust_map {
45 	u8 apptrust;
46 	u8 bit;
47 };
48 
49 static const struct ksz_apptrust_map ksz8_apptrust_map_to_bit[] = {
50 	{ DCB_APP_SEL_PCP, KSZ8_PORT_802_1P_ENABLE },
51 	{ IEEE_8021QAZ_APP_SEL_DSCP, KSZ8_PORT_DIFFSERV_ENABLE },
52 };
53 
54 static const struct ksz_apptrust_map ksz9477_apptrust_map_to_bit[] = {
55 	{ DCB_APP_SEL_PCP, KSZ9477_PORT_802_1P_PRIO_ENABLE },
56 	{ IEEE_8021QAZ_APP_SEL_DSCP, KSZ9477_PORT_DIFFSERV_PRIO_ENABLE },
57 };
58 
59 /* ksz_supported_apptrust[] - Supported apptrust selectors and Priority Order
60  *			      of Internal Priority Map (IPM) sources.
61  *
62  * This array defines the apptrust selectors supported by the hardware, where
63  * the index within the array indicates the priority of the selector - lower
64  * indices correspond to higher priority. This fixed priority scheme is due to
65  * the hardware's design, which does not support configurable priority among
66  * different priority sources.
67  *
68  * The priority sources, including Tail Tag, ACL, VLAN PCP and DSCP are ordered
69  * by the hardware's fixed logic, as detailed below. The order reflects a
70  * non-configurable precedence where certain types of priority information
71  * override others:
72  *
73  * 1. Tail Tag - Highest priority, overrides ACL, VLAN PCP, and DSCP priorities.
74  * 2. ACL - Overrides VLAN PCP and DSCP priorities.
75  * 3. VLAN PCP - Overrides DSCP priority.
76  * 4. DSCP - Lowest priority, does not override any other priority source.
77  *
78  * In this context, the array's lower index (higher priority) for
79  * 'DCB_APP_SEL_PCP' suggests its relative priority over
80  * 'IEEE_8021QAZ_APP_SEL_DSCP' within the system's fixed priority scheme.
81  *
82  * DCB_APP_SEL_PCP - Priority Code Point selector
83  * IEEE_8021QAZ_APP_SEL_DSCP - Differentiated Services Code Point selector
84  */
85 static const u8 ksz_supported_apptrust[] = {
86 	DCB_APP_SEL_PCP,
87 	IEEE_8021QAZ_APP_SEL_DSCP,
88 };
89 
90 static const char * const ksz_supported_apptrust_variants[] = {
91 	"empty", "dscp", "pcp", "dscp pcp"
92 };
93 
ksz_get_default_port_prio_reg(struct ksz_device * dev,int * reg,u8 * mask,int * shift)94 static void ksz_get_default_port_prio_reg(struct ksz_device *dev, int *reg,
95 					  u8 *mask, int *shift)
96 {
97 	if (is_ksz8(dev)) {
98 		*reg = KSZ8_REG_PORT_1_CTRL_0;
99 		*mask = KSZ8_PORT_BASED_PRIO_M;
100 		*shift = __bf_shf(KSZ8_PORT_BASED_PRIO_M);
101 	} else {
102 		*reg = KSZ9477_REG_PORT_MRI_MAC_CTRL;
103 		*mask = KSZ9477_PORT_BASED_PRIO_M;
104 		*shift = __bf_shf(KSZ9477_PORT_BASED_PRIO_M);
105 	}
106 }
107 
108 /**
109  * ksz_get_dscp_prio_reg - Retrieves the DSCP-to-priority-mapping register
110  * @dev: Pointer to the KSZ switch device structure
111  * @reg: Pointer to the register address to be set
112  * @per_reg: Pointer to the number of DSCP values per register
113  * @mask: Pointer to the mask to be set
114  *
115  * This function retrieves the DSCP to priority mapping register, the number of
116  * DSCP values per register, and the mask to be set.
117  */
ksz_get_dscp_prio_reg(struct ksz_device * dev,int * reg,int * per_reg,u8 * mask)118 static void ksz_get_dscp_prio_reg(struct ksz_device *dev, int *reg,
119 				  int *per_reg, u8 *mask)
120 {
121 	if (ksz_is_ksz87xx(dev) || ksz_is_8895_family(dev)) {
122 		*reg = KSZ8765_REG_TOS_DSCP_CTRL;
123 		*per_reg = 4;
124 		*mask = GENMASK(1, 0);
125 	} else if (ksz_is_ksz88x3(dev)) {
126 		*reg = KSZ88X3_REG_TOS_DSCP_CTRL;
127 		*per_reg = 4;
128 		*mask = GENMASK(1, 0);
129 	} else {
130 		*reg = KSZ9477_REG_DIFFSERV_PRIO_MAP;
131 		*per_reg = 2;
132 		*mask = GENMASK(2, 0);
133 	}
134 }
135 
136 /**
137  * ksz_get_apptrust_map_and_reg - Retrieves the apptrust map and register
138  * @dev: Pointer to the KSZ switch device structure
139  * @map: Pointer to the apptrust map to be set
140  * @reg: Pointer to the register address to be set
141  * @mask: Pointer to the mask to be set
142  *
143  * This function retrieves the apptrust map and register address for the
144  * apptrust configuration.
145  */
ksz_get_apptrust_map_and_reg(struct ksz_device * dev,const struct ksz_apptrust_map ** map,int * reg,u8 * mask)146 static void ksz_get_apptrust_map_and_reg(struct ksz_device *dev,
147 					 const struct ksz_apptrust_map **map,
148 					 int *reg, u8 *mask)
149 {
150 	if (is_ksz8(dev)) {
151 		*map = ksz8_apptrust_map_to_bit;
152 		*reg = KSZ8_REG_PORT_1_CTRL_0;
153 		*mask = KSZ8_PORT_DIFFSERV_ENABLE | KSZ8_PORT_802_1P_ENABLE;
154 	} else {
155 		*map = ksz9477_apptrust_map_to_bit;
156 		*reg = KSZ9477_REG_PORT_MRI_PRIO_CTRL;
157 		*mask = KSZ9477_PORT_802_1P_PRIO_ENABLE |
158 			KSZ9477_PORT_DIFFSERV_PRIO_ENABLE;
159 	}
160 }
161 
162 /**
163  * ksz_port_get_default_prio - Retrieves the default priority for a port on a
164  *			       KSZ switch
165  * @ds: Pointer to the DSA switch structure
166  * @port: Port number from which to get the default priority
167  *
168  * This function fetches the default priority for the specified port on a KSZ
169  * switch.
170  *
171  * Return: The default priority of the port on success, or a negative error
172  * code on failure.
173  */
ksz_port_get_default_prio(struct dsa_switch * ds,int port)174 int ksz_port_get_default_prio(struct dsa_switch *ds, int port)
175 {
176 	struct ksz_device *dev = ds->priv;
177 	int ret, reg, shift;
178 	u8 data, mask;
179 
180 	ksz_get_default_port_prio_reg(dev, &reg, &mask, &shift);
181 
182 	ret = ksz_pread8(dev, port, reg, &data);
183 	if (ret)
184 		return ret;
185 
186 	return (data & mask) >> shift;
187 }
188 
189 /**
190  * ksz_port_set_default_prio - Sets the default priority for a port on a KSZ
191  *			       switch
192  * @ds: Pointer to the DSA switch structure
193  * @port: Port number for which to set the default priority
194  * @prio: Priority value to set
195  *
196  * This function sets the default priority for the specified port on a KSZ
197  * switch.
198  *
199  * Return: 0 on success, or a negative error code on failure.
200  */
ksz_port_set_default_prio(struct dsa_switch * ds,int port,u8 prio)201 int ksz_port_set_default_prio(struct dsa_switch *ds, int port, u8 prio)
202 {
203 	struct ksz_device *dev = ds->priv;
204 	int reg, shift;
205 	u8 mask;
206 
207 	if (prio >= dev->info->num_ipms)
208 		return -EINVAL;
209 
210 	ksz_get_default_port_prio_reg(dev, &reg, &mask, &shift);
211 
212 	return ksz_prmw8(dev, port, reg, mask, (prio << shift) & mask);
213 }
214 
215 /**
216  * ksz_port_get_dscp_prio - Retrieves the priority for a DSCP value on a KSZ
217  *			    switch
218  * @ds: Pointer to the DSA switch structure
219  * @port: Port number for which to get the priority
220  * @dscp: DSCP value for which to get the priority
221  *
222  * This function fetches the priority value from switch global DSCP-to-priorty
223  * mapping table for the specified DSCP value.
224  *
225  * Return: The priority value for the DSCP on success, or a negative error
226  * code on failure.
227  */
ksz_port_get_dscp_prio(struct dsa_switch * ds,int port,u8 dscp)228 int ksz_port_get_dscp_prio(struct dsa_switch *ds, int port, u8 dscp)
229 {
230 	struct ksz_device *dev = ds->priv;
231 	int reg, per_reg, ret, shift;
232 	u8 data, mask;
233 
234 	ksz_get_dscp_prio_reg(dev, &reg, &per_reg, &mask);
235 
236 	/* If DSCP remapping is disabled, DSCP bits 3-5 are used as Internal
237 	 * Priority Map (IPM)
238 	 */
239 	if (!is_ksz8(dev)) {
240 		ret = ksz_read8(dev, KSZ9477_REG_SW_MAC_TOS_CTRL, &data);
241 		if (ret)
242 			return ret;
243 
244 		/* If DSCP remapping is disabled, DSCP bits 3-5 are used as
245 		 * Internal Priority Map (IPM)
246 		 */
247 		if (!(data & KSZ9477_SW_TOS_DSCP_REMAP))
248 			return FIELD_GET(KSZ9477_SW_TOS_DSCP_DEFAULT_PRIO_M,
249 					 dscp);
250 	}
251 
252 	/* In case DSCP remapping is enabled, we need to write the DSCP to
253 	 * priority mapping table.
254 	 */
255 	reg += dscp / per_reg;
256 	ret = ksz_read8(dev, reg, &data);
257 	if (ret)
258 		return ret;
259 
260 	shift = (dscp % per_reg) * (8 / per_reg);
261 
262 	return (data >> shift) & mask;
263 }
264 
265 /**
266  * ksz_set_global_dscp_entry - Sets the global DSCP-to-priority mapping entry
267  * @dev: Pointer to the KSZ switch device structure
268  * @dscp: DSCP value for which to set the priority
269  * @ipm: Priority value to set
270  *
271  * This function sets the global DSCP-to-priority mapping entry for the
272  * specified DSCP value.
273  *
274  * Return: 0 on success, or a negative error code on failure.
275  */
ksz_set_global_dscp_entry(struct ksz_device * dev,u8 dscp,u8 ipm)276 static int ksz_set_global_dscp_entry(struct ksz_device *dev, u8 dscp, u8 ipm)
277 {
278 	int reg, per_reg, shift;
279 	u8 mask;
280 
281 	ksz_get_dscp_prio_reg(dev, &reg, &per_reg, &mask);
282 
283 	shift = (dscp % per_reg) * (8 / per_reg);
284 
285 	return ksz_rmw8(dev, reg + (dscp / per_reg), mask << shift,
286 			ipm << shift);
287 }
288 
289 /**
290  * ksz_init_global_dscp_map - Initializes the global DSCP-to-priority mapping
291  * @dev: Pointer to the KSZ switch device structure
292  *
293  * This function initializes the global DSCP-to-priority mapping table for the
294  * switch.
295  *
296  * Return: 0 on success, or a negative error code on failure
297  */
ksz_init_global_dscp_map(struct ksz_device * dev)298 static int ksz_init_global_dscp_map(struct ksz_device *dev)
299 {
300 	int ret, dscp;
301 
302 	/* On KSZ9xxx variants, DSCP remapping is disabled by default.
303 	 * Enable to have, predictable and reproducible behavior across
304 	 * different devices.
305 	 */
306 	if (!is_ksz8(dev)) {
307 		ret = ksz_rmw8(dev, KSZ9477_REG_SW_MAC_TOS_CTRL,
308 			       KSZ9477_SW_TOS_DSCP_REMAP,
309 			       KSZ9477_SW_TOS_DSCP_REMAP);
310 		if (ret)
311 			return ret;
312 	}
313 
314 	for (dscp = 0; dscp < DSCP_MAX; dscp++) {
315 		int ipm, tt;
316 
317 		/* Map DSCP to Traffic Type, which is corresponding to the
318 		 * Internal Priority Map (IPM) in the switch.
319 		 */
320 		if (!is_ksz8(dev)) {
321 			ipm = ietf_dscp_to_ieee8021q_tt(dscp);
322 		} else {
323 			/* On KSZ8xxx variants we do not have IPM to queue
324 			 * remapping table. We need to convert DSCP to Traffic
325 			 * Type and then to queue.
326 			 */
327 			tt = ietf_dscp_to_ieee8021q_tt(dscp);
328 			if (tt < 0)
329 				return tt;
330 
331 			ipm = ieee8021q_tt_to_tc(tt, dev->info->num_tx_queues);
332 		}
333 
334 		if (ipm < 0)
335 			return ipm;
336 
337 		ret = ksz_set_global_dscp_entry(dev, dscp, ipm);
338 	}
339 
340 	return 0;
341 }
342 
343 /**
344  * ksz_port_add_dscp_prio - Adds a DSCP-to-priority mapping entry for a port on
345  *			    a KSZ switch.
346  * @ds: Pointer to the DSA switch structure
347  * @port: Port number for which to add the DSCP-to-priority mapping entry
348  * @dscp: DSCP value for which to add the priority
349  * @prio: Priority value to set
350  *
351  * Return: 0 on success, or a negative error code on failure
352  */
ksz_port_add_dscp_prio(struct dsa_switch * ds,int port,u8 dscp,u8 prio)353 int ksz_port_add_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8 prio)
354 {
355 	struct ksz_device *dev = ds->priv;
356 
357 	if (prio >= dev->info->num_ipms)
358 		return -ERANGE;
359 
360 	return ksz_set_global_dscp_entry(dev, dscp, prio);
361 }
362 
363 /**
364  * ksz_port_del_dscp_prio - Deletes a DSCP-to-priority mapping entry for a port
365  *			    on a KSZ switch.
366  * @ds: Pointer to the DSA switch structure
367  * @port: Port number for which to delete the DSCP-to-priority mapping entry
368  * @dscp: DSCP value for which to delete the priority
369  * @prio: Priority value to delete
370  *
371  * Return: 0 on success, or a negative error code on failure
372  */
ksz_port_del_dscp_prio(struct dsa_switch * ds,int port,u8 dscp,u8 prio)373 int ksz_port_del_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8 prio)
374 {
375 	struct ksz_device *dev = ds->priv;
376 	int ipm;
377 
378 	if (ksz_port_get_dscp_prio(ds, port, dscp) != prio)
379 		return 0;
380 
381 	if (is_ksz8(dev)) {
382 		ipm = ieee8021q_tt_to_tc(IEEE8021Q_TT_BE,
383 					 dev->info->num_tx_queues);
384 		if (ipm < 0)
385 			return ipm;
386 	} else {
387 		ipm = IEEE8021Q_TT_BE;
388 	}
389 
390 	return ksz_set_global_dscp_entry(dev, dscp, ipm);
391 }
392 
393 /**
394  * ksz_apptrust_error - Prints an error message for an invalid apptrust selector
395  * @dev: Pointer to the KSZ switch device structure
396  *
397  * This function prints an error message when an invalid apptrust selector is
398  * provided.
399  */
ksz_apptrust_error(struct ksz_device * dev)400 static void ksz_apptrust_error(struct ksz_device *dev)
401 {
402 	char supported_apptrust_variants[64];
403 	int i;
404 
405 	supported_apptrust_variants[0] = '\0';
406 	for (i = 0; i < ARRAY_SIZE(ksz_supported_apptrust_variants); i++) {
407 		if (i > 0)
408 			strlcat(supported_apptrust_variants, ", ",
409 				sizeof(supported_apptrust_variants));
410 		strlcat(supported_apptrust_variants,
411 			ksz_supported_apptrust_variants[i],
412 			sizeof(supported_apptrust_variants));
413 	}
414 
415 	dev_err(dev->dev, "Invalid apptrust selector or priority order. Supported: %s\n",
416 		supported_apptrust_variants);
417 }
418 
419 /**
420  * ksz_port_set_apptrust_validate - Validates the apptrust selectors
421  * @dev: Pointer to the KSZ switch device structure
422  * @port: Port number for which to set the apptrust selectors
423  * @sel: Array of apptrust selectors to validate
424  * @nsel: Number of apptrust selectors in the array
425  *
426  * This function validates the apptrust selectors provided and ensures that
427  * they are in the correct order.
428  *
429  * This family of switches supports two apptrust selectors: DCB_APP_SEL_PCP and
430  * IEEE_8021QAZ_APP_SEL_DSCP. The priority order of the selectors is fixed and
431  * cannot be changed. The order is as follows:
432  * 1. DCB_APP_SEL_PCP - Priority Code Point selector (highest priority)
433  * 2. IEEE_8021QAZ_APP_SEL_DSCP - Differentiated Services Code Point selector
434  *   (lowest priority)
435  *
436  * Return: 0 on success, or a negative error code on failure
437  */
ksz_port_set_apptrust_validate(struct ksz_device * dev,int port,const u8 * sel,int nsel)438 static int ksz_port_set_apptrust_validate(struct ksz_device *dev, int port,
439 					  const u8 *sel, int nsel)
440 {
441 	int i, j, found;
442 	int j_prev = 0;
443 
444 	/* Iterate through the requested selectors */
445 	for (i = 0; i < nsel; i++) {
446 		found = 0;
447 
448 		/* Check if the current selector is supported by the hardware */
449 		for (j = 0; j < sizeof(ksz_supported_apptrust); j++) {
450 			if (sel[i] != ksz_supported_apptrust[j])
451 				continue;
452 
453 			found = 1;
454 
455 			/* Ensure that no higher priority selector (lower index)
456 			 * precedes a lower priority one
457 			 */
458 			if (i > 0 && j <= j_prev)
459 				goto err_sel_not_vaild;
460 
461 			j_prev = j;
462 			break;
463 		}
464 
465 		if (!found)
466 			goto err_sel_not_vaild;
467 	}
468 
469 	return 0;
470 
471 err_sel_not_vaild:
472 	ksz_apptrust_error(dev);
473 
474 	return -EINVAL;
475 }
476 
477 /**
478  * ksz_port_set_apptrust - Sets the apptrust selectors for a port on a KSZ
479  *			   switch
480  * @ds: Pointer to the DSA switch structure
481  * @port: Port number for which to set the apptrust selectors
482  * @sel: Array of apptrust selectors to set
483  * @nsel: Number of apptrust selectors in the array
484  *
485  * This function sets the apptrust selectors for the specified port on a KSZ
486  * switch.
487  *
488  * Return: 0 on success, or a negative error code on failure
489  */
ksz_port_set_apptrust(struct dsa_switch * ds,int port,const u8 * sel,int nsel)490 int ksz_port_set_apptrust(struct dsa_switch *ds, int port,
491 			  const u8 *sel, int nsel)
492 {
493 	const struct ksz_apptrust_map *map;
494 	struct ksz_device *dev = ds->priv;
495 	int reg, i, ret;
496 	u8 data = 0;
497 	u8 mask;
498 
499 	ret = ksz_port_set_apptrust_validate(dev, port, sel, nsel);
500 	if (ret)
501 		return ret;
502 
503 	ksz_get_apptrust_map_and_reg(dev, &map, &reg, &mask);
504 
505 	for (i = 0; i < nsel; i++) {
506 		int j;
507 
508 		for (j = 0; j < ARRAY_SIZE(ksz_supported_apptrust); j++) {
509 			if (sel[i] != ksz_supported_apptrust[j])
510 				continue;
511 
512 			data |= map[j].bit;
513 			break;
514 		}
515 	}
516 
517 	return ksz_prmw8(dev, port, reg, mask, data);
518 }
519 
520 /**
521  * ksz_port_get_apptrust - Retrieves the apptrust selectors for a port on a KSZ
522  *			   switch
523  * @ds: Pointer to the DSA switch structure
524  * @port: Port number for which to get the apptrust selectors
525  * @sel: Array to store the apptrust selectors
526  * @nsel: Number of apptrust selectors in the array
527  *
528  * This function fetches the apptrust selectors for the specified port on a KSZ
529  * switch.
530  *
531  * Return: 0 on success, or a negative error code on failure
532  */
ksz_port_get_apptrust(struct dsa_switch * ds,int port,u8 * sel,int * nsel)533 int ksz_port_get_apptrust(struct dsa_switch *ds, int port, u8 *sel, int *nsel)
534 {
535 	const struct ksz_apptrust_map *map;
536 	struct ksz_device *dev = ds->priv;
537 	int reg, i, ret;
538 	u8 data;
539 	u8 mask;
540 
541 	ksz_get_apptrust_map_and_reg(dev, &map, &reg, &mask);
542 
543 	ret = ksz_pread8(dev, port, reg, &data);
544 	if (ret)
545 		return ret;
546 
547 	*nsel = 0;
548 	for (i = 0; i < ARRAY_SIZE(ksz_supported_apptrust); i++) {
549 		if (data & map[i].bit)
550 			sel[(*nsel)++] = ksz_supported_apptrust[i];
551 	}
552 
553 	return 0;
554 }
555 
556 /**
557  * ksz_dcb_init_port - Initializes the DCB configuration for a port on a KSZ
558  * @dev: Pointer to the KSZ switch device structure
559  * @port: Port number for which to initialize the DCB configuration
560  *
561  * This function initializes the DCB configuration for the specified port on a
562  * KSZ switch. Particular DCB configuration is set for the port, including the
563  * default priority and apptrust selectors.
564  * The default priority is set to Best Effort, and the apptrust selectors are
565  * set to all supported selectors.
566  *
567  * Return: 0 on success, or a negative error code on failure
568  */
ksz_dcb_init_port(struct ksz_device * dev,int port)569 int ksz_dcb_init_port(struct ksz_device *dev, int port)
570 {
571 	const u8 ksz_default_apptrust[] = { DCB_APP_SEL_PCP };
572 	int ret, ipm;
573 
574 	if (is_ksz8(dev)) {
575 		ipm = ieee8021q_tt_to_tc(IEEE8021Q_TT_BE,
576 					 dev->info->num_tx_queues);
577 		if (ipm < 0)
578 			return ipm;
579 	} else {
580 		ipm = IEEE8021Q_TT_BE;
581 	}
582 
583 	/* Set the default priority for the port to Best Effort */
584 	ret = ksz_port_set_default_prio(dev->ds, port, ipm);
585 	if (ret)
586 		return ret;
587 
588 	return ksz_port_set_apptrust(dev->ds, port, ksz_default_apptrust,
589 				     ARRAY_SIZE(ksz_default_apptrust));
590 }
591 
592 /**
593  * ksz_dcb_init - Initializes the DCB configuration for a KSZ switch
594  * @dev: Pointer to the KSZ switch device structure
595  *
596  * This function initializes the DCB configuration for a KSZ switch. The global
597  * DSCP-to-priority mapping table is initialized.
598  *
599  * Return: 0 on success, or a negative error code on failure
600  */
ksz_dcb_init(struct ksz_device * dev)601 int ksz_dcb_init(struct ksz_device *dev)
602 {
603 	return ksz_init_global_dscp_map(dev);
604 }
605