2022-09-21 14:25:36 +02:00
|
|
|
// SPDX-License-Identifier: GPL-2.0+
|
|
|
|
|
|
|
|
#include <net/pkt_cls.h>
|
|
|
|
|
|
|
|
#include "lan966x_main.h"
|
|
|
|
|
|
|
|
static int lan966x_tc_setup_qdisc_mqprio(struct lan966x_port *port,
|
|
|
|
struct tc_mqprio_qopt_offload *mqprio)
|
|
|
|
{
|
|
|
|
u8 num_tc = mqprio->qopt.num_tc;
|
|
|
|
|
|
|
|
mqprio->qopt.hw = TC_MQPRIO_HW_OFFLOAD_TCS;
|
|
|
|
|
|
|
|
return num_tc ? lan966x_mqprio_add(port, num_tc) :
|
|
|
|
lan966x_mqprio_del(port);
|
|
|
|
}
|
|
|
|
|
2022-09-21 14:25:38 +02:00
|
|
|
static int lan966x_tc_setup_qdisc_taprio(struct lan966x_port *port,
|
|
|
|
struct tc_taprio_qopt_offload *taprio)
|
|
|
|
{
|
|
|
|
return taprio->enable ? lan966x_taprio_add(port, taprio) :
|
|
|
|
lan966x_taprio_del(port);
|
|
|
|
}
|
|
|
|
|
2022-09-25 20:46:31 +02:00
|
|
|
static int lan966x_tc_setup_qdisc_tbf(struct lan966x_port *port,
|
|
|
|
struct tc_tbf_qopt_offload *qopt)
|
|
|
|
{
|
|
|
|
switch (qopt->command) {
|
|
|
|
case TC_TBF_REPLACE:
|
|
|
|
return lan966x_tbf_add(port, qopt);
|
|
|
|
case TC_TBF_DESTROY:
|
|
|
|
return lan966x_tbf_del(port, qopt);
|
|
|
|
default:
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
}
|
|
|
|
|
2022-09-25 20:46:32 +02:00
|
|
|
static int lan966x_tc_setup_qdisc_cbs(struct lan966x_port *port,
|
|
|
|
struct tc_cbs_qopt_offload *qopt)
|
|
|
|
{
|
|
|
|
return qopt->enable ? lan966x_cbs_add(port, qopt) :
|
|
|
|
lan966x_cbs_del(port, qopt);
|
|
|
|
}
|
|
|
|
|
2022-09-25 20:46:33 +02:00
|
|
|
static int lan966x_tc_setup_qdisc_ets(struct lan966x_port *port,
|
|
|
|
struct tc_ets_qopt_offload *qopt)
|
|
|
|
{
|
|
|
|
switch (qopt->command) {
|
|
|
|
case TC_ETS_REPLACE:
|
|
|
|
return lan966x_ets_add(port, qopt);
|
|
|
|
case TC_ETS_DESTROY:
|
|
|
|
return lan966x_ets_del(port, qopt);
|
|
|
|
default:
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
};
|
|
|
|
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
}
|
|
|
|
|
2022-09-21 14:25:36 +02:00
|
|
|
int lan966x_tc_setup(struct net_device *dev, enum tc_setup_type type,
|
|
|
|
void *type_data)
|
|
|
|
{
|
|
|
|
struct lan966x_port *port = netdev_priv(dev);
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case TC_SETUP_QDISC_MQPRIO:
|
|
|
|
return lan966x_tc_setup_qdisc_mqprio(port, type_data);
|
2022-09-21 14:25:38 +02:00
|
|
|
case TC_SETUP_QDISC_TAPRIO:
|
|
|
|
return lan966x_tc_setup_qdisc_taprio(port, type_data);
|
2022-09-25 20:46:31 +02:00
|
|
|
case TC_SETUP_QDISC_TBF:
|
|
|
|
return lan966x_tc_setup_qdisc_tbf(port, type_data);
|
2022-09-25 20:46:32 +02:00
|
|
|
case TC_SETUP_QDISC_CBS:
|
|
|
|
return lan966x_tc_setup_qdisc_cbs(port, type_data);
|
2022-09-25 20:46:33 +02:00
|
|
|
case TC_SETUP_QDISC_ETS:
|
|
|
|
return lan966x_tc_setup_qdisc_ets(port, type_data);
|
2022-09-21 14:25:36 +02:00
|
|
|
default:
|
|
|
|
return -EOPNOTSUPP;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|