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