1 // SPDX-License-Identifier: GPL-2.0+
2 /* Microchip Sparx5 Switch driver
4 * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
9 #include "sparx5_port.h"
11 /* Validate app entry.
13 * Check for valid selectors and valid protocol and priority ranges.
15 static int sparx5_dcb_app_validate(struct net_device *dev,
16 const struct dcb_app *app)
20 switch (app->selector) {
23 if (app->protocol >= SPARX5_PORT_QOS_PCP_DEI_COUNT)
25 else if (app->priority >= SPX5_PRIOS)
34 netdev_err(dev, "Invalid entry: %d:%d\n", app->protocol,
40 static int sparx5_dcb_app_update(struct net_device *dev)
42 struct dcb_app app_itr = { .selector = DCB_APP_SEL_PCP };
43 struct sparx5_port *port = netdev_priv(dev);
44 struct sparx5_port_qos_pcp_map *pcp_map;
45 struct sparx5_port_qos qos = {0};
48 pcp_map = &qos.pcp.map;
50 /* Get pcp ingress mapping */
51 for (i = 0; i < ARRAY_SIZE(pcp_map->map); i++) {
53 pcp_map->map[i] = dcb_getapp(dev, &app_itr);
56 return sparx5_port_qos_set(port, &qos);
59 static int sparx5_dcb_ieee_setapp(struct net_device *dev, struct dcb_app *app)
61 struct dcb_app app_itr;
65 err = sparx5_dcb_app_validate(dev, app);
69 /* Delete current mapping, if it exists */
70 prio = dcb_getapp(dev, app);
73 app_itr.priority = prio;
74 dcb_ieee_delapp(dev, &app_itr);
77 err = dcb_ieee_setapp(dev, app);
81 sparx5_dcb_app_update(dev);
87 static int sparx5_dcb_ieee_delapp(struct net_device *dev, struct dcb_app *app)
91 err = dcb_ieee_delapp(dev, app);
95 return sparx5_dcb_app_update(dev);
98 const struct dcbnl_rtnl_ops sparx5_dcbnl_ops = {
99 .ieee_setapp = sparx5_dcb_ieee_setapp,
100 .ieee_delapp = sparx5_dcb_ieee_delapp,
103 int sparx5_dcb_init(struct sparx5 *sparx5)
105 struct sparx5_port *port;
108 for (i = 0; i < SPX5_PORTS; i++) {
109 port = sparx5->ports[i];
112 port->ndev->dcbnl_ops = &sparx5_dcbnl_ops;