On Sat Aug 22 2020, Vladimir Oltean wrote: > Hi Kurt, > > On Thu, Aug 20, 2020 at 10:11:15AM +0200, Kurt Kanzenbach wrote: >> The switch has support for the 802.1Qbv Time Aware Shaper (TAS). Traffic >> schedules may be configured individually on each front port. Each port has eight >> egress queues. The traffic is mapped to a traffic class respectively via the PCP >> field of a VLAN tagged frame. >> >> The TAPRIO Qdisc already implements that. Therefore, this interface can simply >> be reused. Add .port_setup_tc() accordingly. >> >> The activation of a schedule on a port is split into two parts: >> >> * Programming the necessary gate control list (GCL) >> * Setup hrtimer for starting the schedule >> >> The hardware supports starting a schedule up to eight seconds in the future. The >> TAPRIO interface provides an absolute base time. Therefore, hrtimers are >> leveraged. >> >> Signed-off-by: Kurt Kanzenbach <kurt@xxxxxxxxxxxxx> >> --- >> drivers/net/dsa/hirschmann/hellcreek.c | 294 +++++++++++++++++++++++++ >> drivers/net/dsa/hirschmann/hellcreek.h | 21 ++ >> 2 files changed, 315 insertions(+) >> >> diff --git a/drivers/net/dsa/hirschmann/hellcreek.c b/drivers/net/dsa/hirschmann/hellcreek.c >> index 745ca60342b4..e5b54f42c635 100644 >> --- a/drivers/net/dsa/hirschmann/hellcreek.c >> +++ b/drivers/net/dsa/hirschmann/hellcreek.c >> @@ -22,7 +22,9 @@ >> #include <linux/spinlock.h> >> #include <linux/delay.h> >> #include <linux/ktime.h> >> +#include <linux/time.h> >> #include <net/dsa.h> >> +#include <net/pkt_sched.h> >> >> #include "hellcreek.h" >> #include "hellcreek_ptp.h" >> @@ -153,6 +155,15 @@ static void hellcreek_select_vlan(struct hellcreek *hellcreek, int vid, >> hellcreek_write(hellcreek, val, HR_VIDCFG); >> } >> >> +static void hellcreek_select_tgd(struct hellcreek *hellcreek, int port) >> +{ >> + u16 val = 0; >> + >> + val |= port << TR_TGDSEL_TDGSEL_SHIFT; >> + >> + hellcreek_write(hellcreek, val, TR_TGDSEL); >> +} >> + >> static int hellcreek_wait_until_ready(struct hellcreek *hellcreek) >> { >> u16 val; >> @@ -958,6 +969,24 @@ static void __hellcreek_setup_tc_identity_mapping(struct hellcreek *hellcreek) >> } >> } >> >> +static void hellcreek_setup_tc_mapping(struct hellcreek *hellcreek, >> + struct net_device *netdev) >> +{ >> + int i, j; >> + >> + /* Setup mapping between traffic classes and port queues. */ >> + for (i = 0; i < netdev_get_num_tc(netdev); ++i) { >> + for (j = 0; j < netdev->tc_to_txq[i].count; ++j) { >> + const int queue = j + netdev->tc_to_txq[i].offset; >> + >> + hellcreek_select_prio(hellcreek, i); >> + hellcreek_write(hellcreek, >> + queue << HR_PRTCCFG_PCP_TC_MAP_SHIFT, >> + HR_PRTCCFG); >> + } >> + } >> +} > > What other driver have you seen that does this? > Probably none. With TAPRIO traffic classes and the mapping to queues can be configured. The switch can also map traffic classes. That sounded like a good match to me. Thanks, Kurt
Attachment:
signature.asc
Description: PGP signature