1*544921efSDavide Caratti // SPDX-License-Identifier: GPL-2.0 2*544921efSDavide Caratti 3*544921efSDavide Caratti #include <linux/netdevice.h> 4*544921efSDavide Caratti #include <net/pkt_sched.h> 5*544921efSDavide Caratti 6*544921efSDavide Caratti #include "netdevsim.h" 7*544921efSDavide Caratti 8*544921efSDavide Caratti static int 9*544921efSDavide Caratti nsim_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) 10*544921efSDavide Caratti { 11*544921efSDavide Caratti return nsim_bpf_setup_tc_block_cb(type, type_data, cb_priv); 12*544921efSDavide Caratti } 13*544921efSDavide Caratti 14*544921efSDavide Caratti static void nsim_taprio_stats(struct tc_taprio_qopt_stats *stats) 15*544921efSDavide Caratti { 16*544921efSDavide Caratti stats->window_drops = 0; 17*544921efSDavide Caratti stats->tx_overruns = 0; 18*544921efSDavide Caratti } 19*544921efSDavide Caratti 20*544921efSDavide Caratti static int nsim_setup_tc_taprio(struct net_device *dev, 21*544921efSDavide Caratti struct tc_taprio_qopt_offload *offload) 22*544921efSDavide Caratti { 23*544921efSDavide Caratti int err = 0; 24*544921efSDavide Caratti 25*544921efSDavide Caratti switch (offload->cmd) { 26*544921efSDavide Caratti case TAPRIO_CMD_REPLACE: 27*544921efSDavide Caratti case TAPRIO_CMD_DESTROY: 28*544921efSDavide Caratti break; 29*544921efSDavide Caratti case TAPRIO_CMD_STATS: 30*544921efSDavide Caratti nsim_taprio_stats(&offload->stats); 31*544921efSDavide Caratti break; 32*544921efSDavide Caratti default: 33*544921efSDavide Caratti err = -EOPNOTSUPP; 34*544921efSDavide Caratti } 35*544921efSDavide Caratti 36*544921efSDavide Caratti return err; 37*544921efSDavide Caratti } 38*544921efSDavide Caratti 39*544921efSDavide Caratti static LIST_HEAD(nsim_block_cb_list); 40*544921efSDavide Caratti 41*544921efSDavide Caratti int 42*544921efSDavide Caratti nsim_setup_tc(struct net_device *dev, enum tc_setup_type type, void *type_data) 43*544921efSDavide Caratti { 44*544921efSDavide Caratti struct netdevsim *ns = netdev_priv(dev); 45*544921efSDavide Caratti 46*544921efSDavide Caratti switch (type) { 47*544921efSDavide Caratti case TC_SETUP_QDISC_TAPRIO: 48*544921efSDavide Caratti return nsim_setup_tc_taprio(dev, type_data); 49*544921efSDavide Caratti case TC_SETUP_BLOCK: 50*544921efSDavide Caratti return flow_block_cb_setup_simple(type_data, 51*544921efSDavide Caratti &nsim_block_cb_list, 52*544921efSDavide Caratti nsim_setup_tc_block_cb, 53*544921efSDavide Caratti ns, ns, true); 54*544921efSDavide Caratti default: 55*544921efSDavide Caratti return -EOPNOTSUPP; 56*544921efSDavide Caratti } 57*544921efSDavide Caratti } 58