1 // SPDX-License-Identifier: GPL-2.0+
2 
3 #include <net/pkt_cls.h>
4 
5 #include "lan966x_main.h"
6 
7 static int lan966x_tc_setup_qdisc_mqprio(struct lan966x_port *port,
8 					 struct tc_mqprio_qopt_offload *mqprio)
9 {
10 	u8 num_tc = mqprio->qopt.num_tc;
11 
12 	mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS;
13 
14 	return num_tc ? lan966x_mqprio_add(port, num_tc) :
15 			lan966x_mqprio_del(port);
16 }
17 
18 static int lan966x_tc_setup_qdisc_taprio(struct lan966x_port *port,
19 					 struct tc_taprio_qopt_offload *taprio)
20 {
21 	return taprio->enable ? lan966x_taprio_add(port, taprio) :
22 				lan966x_taprio_del(port);
23 }
24 
25 static int lan966x_tc_setup_qdisc_tbf(struct lan966x_port *port,
26 				      struct tc_tbf_qopt_offload *qopt)
27 {
28 	switch (qopt->command) {
29 	case TC_TBF_REPLACE:
30 		return lan966x_tbf_add(port, qopt);
31 	case TC_TBF_DESTROY:
32 		return lan966x_tbf_del(port, qopt);
33 	default:
34 		return -EOPNOTSUPP;
35 	}
36 
37 	return -EOPNOTSUPP;
38 }
39 
40 static int lan966x_tc_setup_qdisc_cbs(struct lan966x_port *port,
41 				      struct tc_cbs_qopt_offload *qopt)
42 {
43 	return qopt->enable ? lan966x_cbs_add(port, qopt) :
44 			      lan966x_cbs_del(port, qopt);
45 }
46 
47 static int lan966x_tc_setup_qdisc_ets(struct lan966x_port *port,
48 				      struct tc_ets_qopt_offload *qopt)
49 {
50 	switch (qopt->command) {
51 	case TC_ETS_REPLACE:
52 		return lan966x_ets_add(port, qopt);
53 	case TC_ETS_DESTROY:
54 		return lan966x_ets_del(port, qopt);
55 	default:
56 		return -EOPNOTSUPP;
57 	};
58 
59 	return -EOPNOTSUPP;
60 }
61 
62 int lan966x_tc_setup(struct net_device *dev, enum tc_setup_type type,
63 		     void *type_data)
64 {
65 	struct lan966x_port *port = netdev_priv(dev);
66 
67 	switch (type) {
68 	case TC_SETUP_QDISC_MQPRIO:
69 		return lan966x_tc_setup_qdisc_mqprio(port, type_data);
70 	case TC_SETUP_QDISC_TAPRIO:
71 		return lan966x_tc_setup_qdisc_taprio(port, type_data);
72 	case TC_SETUP_QDISC_TBF:
73 		return lan966x_tc_setup_qdisc_tbf(port, type_data);
74 	case TC_SETUP_QDISC_CBS:
75 		return lan966x_tc_setup_qdisc_cbs(port, type_data);
76 	case TC_SETUP_QDISC_ETS:
77 		return lan966x_tc_setup_qdisc_ets(port, type_data);
78 	default:
79 		return -EOPNOTSUPP;
80 	}
81 
82 	return 0;
83 }
84