Lines Matching +full:int +full:- +full:map +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0
14 * The datasheet specifies: Port 1 - 0x10, Port 2 - 0x20, Port 3 - 0x30.
59 /* ksz_supported_apptrust[] - Supported apptrust selectors and Priority Order
60 * of Internal Priority Map (IPM) sources.
63 * the index within the array indicates the priority of the selector - lower
70 * non-configurable precedence where certain types of priority information
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.
82 * DCB_APP_SEL_PCP - Priority Code Point selector
83 * IEEE_8021QAZ_APP_SEL_DSCP - Differentiated Services Code Point selector
94 static void ksz_get_default_port_prio_reg(struct ksz_device *dev, int *reg, in ksz_get_default_port_prio_reg()
95 u8 *mask, int *shift) in ksz_get_default_port_prio_reg() argument
99 *mask = KSZ8_PORT_BASED_PRIO_M; in ksz_get_default_port_prio_reg()
103 *mask = KSZ9477_PORT_BASED_PRIO_M; in ksz_get_default_port_prio_reg()
109 * ksz_get_dscp_prio_reg - Retrieves the DSCP-to-priority-mapping register
113 * @mask: Pointer to the mask to be set
116 * DSCP values per register, and the mask to be set.
118 static void ksz_get_dscp_prio_reg(struct ksz_device *dev, int *reg, in ksz_get_dscp_prio_reg()
119 int *per_reg, u8 *mask) in ksz_get_dscp_prio_reg() argument
124 *mask = GENMASK(1, 0); in ksz_get_dscp_prio_reg()
128 *mask = GENMASK(1, 0); in ksz_get_dscp_prio_reg()
132 *mask = GENMASK(2, 0); in ksz_get_dscp_prio_reg()
137 * ksz_get_apptrust_map_and_reg - Retrieves the apptrust map and register
139 * @map: Pointer to the apptrust map to be set
141 * @mask: Pointer to the mask to be set
143 * This function retrieves the apptrust map and register address for the
147 const struct ksz_apptrust_map **map, in ksz_get_apptrust_map_and_reg() argument
148 int *reg, u8 *mask) in ksz_get_apptrust_map_and_reg() argument
151 *map = ksz8_apptrust_map_to_bit; in ksz_get_apptrust_map_and_reg()
153 *mask = KSZ8_PORT_DIFFSERV_ENABLE | KSZ8_PORT_802_1P_ENABLE; in ksz_get_apptrust_map_and_reg()
155 *map = ksz9477_apptrust_map_to_bit; in ksz_get_apptrust_map_and_reg()
157 *mask = KSZ9477_PORT_802_1P_PRIO_ENABLE | in ksz_get_apptrust_map_and_reg()
163 * ksz_port_get_default_prio - Retrieves the default priority for a port on a
174 int ksz_port_get_default_prio(struct dsa_switch *ds, int port) in ksz_port_get_default_prio()
176 struct ksz_device *dev = ds->priv; in ksz_port_get_default_prio()
177 int ret, reg, shift; in ksz_port_get_default_prio()
178 u8 data, mask; in ksz_port_get_default_prio() local
180 ksz_get_default_port_prio_reg(dev, ®, &mask, &shift); in ksz_port_get_default_prio()
186 return (data & mask) >> shift; in ksz_port_get_default_prio()
190 * ksz_port_set_default_prio - Sets the default priority for a port on a KSZ
201 int ksz_port_set_default_prio(struct dsa_switch *ds, int port, u8 prio) in ksz_port_set_default_prio()
203 struct ksz_device *dev = ds->priv; in ksz_port_set_default_prio()
204 int reg, shift; in ksz_port_set_default_prio()
205 u8 mask; in ksz_port_set_default_prio() local
207 if (prio >= dev->info->num_ipms) in ksz_port_set_default_prio()
208 return -EINVAL; in ksz_port_set_default_prio()
210 ksz_get_default_port_prio_reg(dev, ®, &mask, &shift); in ksz_port_set_default_prio()
212 return ksz_prmw8(dev, port, reg, mask, (prio << shift) & mask); in ksz_port_set_default_prio()
216 * ksz_port_get_dscp_prio - Retrieves the priority for a DSCP value on a KSZ
222 * This function fetches the priority value from switch global DSCP-to-priorty
228 int ksz_port_get_dscp_prio(struct dsa_switch *ds, int port, u8 dscp) in ksz_port_get_dscp_prio()
230 struct ksz_device *dev = ds->priv; in ksz_port_get_dscp_prio()
231 int reg, per_reg, ret, shift; in ksz_port_get_dscp_prio()
232 u8 data, mask; in ksz_port_get_dscp_prio() local
234 ksz_get_dscp_prio_reg(dev, ®, &per_reg, &mask); in ksz_port_get_dscp_prio()
236 /* If DSCP remapping is disabled, DSCP bits 3-5 are used as Internal in ksz_port_get_dscp_prio()
237 * Priority Map (IPM) in ksz_port_get_dscp_prio()
244 /* If DSCP remapping is disabled, DSCP bits 3-5 are used as in ksz_port_get_dscp_prio()
245 * Internal Priority Map (IPM) in ksz_port_get_dscp_prio()
262 return (data >> shift) & mask; in ksz_port_get_dscp_prio()
266 * ksz_set_global_dscp_entry - Sets the global DSCP-to-priority mapping entry
271 * This function sets the global DSCP-to-priority mapping entry for the
276 static int ksz_set_global_dscp_entry(struct ksz_device *dev, u8 dscp, u8 ipm) in ksz_set_global_dscp_entry()
278 int reg, per_reg, shift; in ksz_set_global_dscp_entry()
279 u8 mask; in ksz_set_global_dscp_entry() local
281 ksz_get_dscp_prio_reg(dev, ®, &per_reg, &mask); in ksz_set_global_dscp_entry()
285 return ksz_rmw8(dev, reg + (dscp / per_reg), mask << shift, in ksz_set_global_dscp_entry()
290 * ksz_init_global_dscp_map - Initializes the global DSCP-to-priority mapping
293 * This function initializes the global DSCP-to-priority mapping table for the
298 static int ksz_init_global_dscp_map(struct ksz_device *dev) in ksz_init_global_dscp_map()
300 int ret, dscp; in ksz_init_global_dscp_map()
315 int ipm, tt; in ksz_init_global_dscp_map()
317 /* Map DSCP to Traffic Type, which is corresponding to the in ksz_init_global_dscp_map()
318 * Internal Priority Map (IPM) in the switch. in ksz_init_global_dscp_map()
331 ipm = ieee8021q_tt_to_tc(tt, dev->info->num_tx_queues); in ksz_init_global_dscp_map()
344 * ksz_port_add_dscp_prio - Adds a DSCP-to-priority mapping entry for a port on
347 * @port: Port number for which to add the DSCP-to-priority mapping entry
353 int ksz_port_add_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8 prio) in ksz_port_add_dscp_prio()
355 struct ksz_device *dev = ds->priv; in ksz_port_add_dscp_prio()
357 if (prio >= dev->info->num_ipms) in ksz_port_add_dscp_prio()
358 return -ERANGE; in ksz_port_add_dscp_prio()
364 * ksz_port_del_dscp_prio - Deletes a DSCP-to-priority mapping entry for a port
367 * @port: Port number for which to delete the DSCP-to-priority mapping entry
373 int ksz_port_del_dscp_prio(struct dsa_switch *ds, int port, u8 dscp, u8 prio) in ksz_port_del_dscp_prio()
375 struct ksz_device *dev = ds->priv; in ksz_port_del_dscp_prio()
376 int ipm; in ksz_port_del_dscp_prio()
383 dev->info->num_tx_queues); in ksz_port_del_dscp_prio()
394 * ksz_apptrust_error - Prints an error message for an invalid apptrust selector
403 int i; in ksz_apptrust_error()
415 dev_err(dev->dev, "Invalid apptrust selector or priority order. Supported: %s\n", in ksz_apptrust_error()
420 * ksz_port_set_apptrust_validate - Validates the apptrust selectors
432 * 1. DCB_APP_SEL_PCP - Priority Code Point selector (highest priority)
433 * 2. IEEE_8021QAZ_APP_SEL_DSCP - Differentiated Services Code Point selector
438 static int ksz_port_set_apptrust_validate(struct ksz_device *dev, int port, in ksz_port_set_apptrust_validate()
439 const u8 *sel, int nsel) in ksz_port_set_apptrust_validate()
441 int i, j, found; in ksz_port_set_apptrust_validate()
442 int j_prev = 0; in ksz_port_set_apptrust_validate()
474 return -EINVAL; in ksz_port_set_apptrust_validate()
478 * ksz_port_set_apptrust - Sets the apptrust selectors for a port on a KSZ
490 int ksz_port_set_apptrust(struct dsa_switch *ds, int port, in ksz_port_set_apptrust()
491 const u8 *sel, int nsel) in ksz_port_set_apptrust()
493 const struct ksz_apptrust_map *map; in ksz_port_set_apptrust() local
494 struct ksz_device *dev = ds->priv; in ksz_port_set_apptrust()
495 int reg, i, ret; in ksz_port_set_apptrust()
497 u8 mask; in ksz_port_set_apptrust() local
503 ksz_get_apptrust_map_and_reg(dev, &map, ®, &mask); in ksz_port_set_apptrust()
506 int j; in ksz_port_set_apptrust()
512 data |= map[j].bit; in ksz_port_set_apptrust()
517 return ksz_prmw8(dev, port, reg, mask, data); in ksz_port_set_apptrust()
521 * ksz_port_get_apptrust - Retrieves the apptrust selectors for a port on a KSZ
533 int ksz_port_get_apptrust(struct dsa_switch *ds, int port, u8 *sel, int *nsel) in ksz_port_get_apptrust()
535 const struct ksz_apptrust_map *map; in ksz_port_get_apptrust() local
536 struct ksz_device *dev = ds->priv; in ksz_port_get_apptrust()
537 int reg, i, ret; in ksz_port_get_apptrust()
539 u8 mask; in ksz_port_get_apptrust() local
541 ksz_get_apptrust_map_and_reg(dev, &map, ®, &mask); in ksz_port_get_apptrust()
549 if (data & map[i].bit) in ksz_port_get_apptrust()
557 * ksz_dcb_init_port - Initializes the DCB configuration for a port on a KSZ
569 int ksz_dcb_init_port(struct ksz_device *dev, int port) in ksz_dcb_init_port()
572 int ret, ipm; in ksz_dcb_init_port()
576 dev->info->num_tx_queues); in ksz_dcb_init_port()
584 ret = ksz_port_set_default_prio(dev->ds, port, ipm); in ksz_dcb_init_port()
588 return ksz_port_set_apptrust(dev->ds, port, ksz_default_apptrust, in ksz_dcb_init_port()
593 * ksz_dcb_init - Initializes the DCB configuration for a KSZ switch
597 * DSCP-to-priority mapping table is initialized.
601 int ksz_dcb_init(struct ksz_device *dev) in ksz_dcb_init()