]> Git Repo - J-linux.git/blob - drivers/net/ethernet/microchip/lan966x/lan966x_cbs.c
Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[J-linux.git] / drivers / net / ethernet / microchip / lan966x / lan966x_cbs.c
1 // SPDX-License-Identifier: GPL-2.0+
2
3 #include "lan966x_main.h"
4
5 int lan966x_cbs_add(struct lan966x_port *port,
6                     struct tc_cbs_qopt_offload *qopt)
7 {
8         struct lan966x *lan966x = port->lan966x;
9         u32 cir, cbs;
10         u8 se_idx;
11
12         /* Check for invalid values */
13         if (qopt->idleslope <= 0 ||
14             qopt->sendslope >= 0 ||
15             qopt->locredit >= qopt->hicredit)
16                 return -EINVAL;
17
18         se_idx = SE_IDX_QUEUE + port->chip_port * NUM_PRIO_QUEUES + qopt->queue;
19         cir = qopt->idleslope;
20         cbs = (qopt->idleslope - qopt->sendslope) *
21                 (qopt->hicredit - qopt->locredit) /
22                 -qopt->sendslope;
23
24         /* Rate unit is 100 kbps */
25         cir = DIV_ROUND_UP(cir, 100);
26         /* Avoid using zero rate */
27         cir = cir ?: 1;
28         /* Burst unit is 4kB */
29         cbs = DIV_ROUND_UP(cbs, 4096);
30         /* Avoid using zero burst */
31         cbs = cbs ?: 1;
32
33         /* Check that actually the result can be written */
34         if (cir > GENMASK(15, 0) ||
35             cbs > GENMASK(6, 0))
36                 return -EINVAL;
37
38         lan_rmw(QSYS_SE_CFG_SE_AVB_ENA_SET(1) |
39                 QSYS_SE_CFG_SE_FRM_MODE_SET(1),
40                 QSYS_SE_CFG_SE_AVB_ENA |
41                 QSYS_SE_CFG_SE_FRM_MODE,
42                 lan966x, QSYS_SE_CFG(se_idx));
43
44         lan_wr(QSYS_CIR_CFG_CIR_RATE_SET(cir) |
45                QSYS_CIR_CFG_CIR_BURST_SET(cbs),
46                lan966x, QSYS_CIR_CFG(se_idx));
47
48         return 0;
49 }
50
51 int lan966x_cbs_del(struct lan966x_port *port,
52                     struct tc_cbs_qopt_offload *qopt)
53 {
54         struct lan966x *lan966x = port->lan966x;
55         u8 se_idx;
56
57         se_idx = SE_IDX_QUEUE + port->chip_port * NUM_PRIO_QUEUES + qopt->queue;
58
59         lan_rmw(QSYS_SE_CFG_SE_AVB_ENA_SET(1) |
60                 QSYS_SE_CFG_SE_FRM_MODE_SET(0),
61                 QSYS_SE_CFG_SE_AVB_ENA |
62                 QSYS_SE_CFG_SE_FRM_MODE,
63                 lan966x, QSYS_SE_CFG(se_idx));
64
65         lan_wr(QSYS_CIR_CFG_CIR_RATE_SET(0) |
66                QSYS_CIR_CFG_CIR_BURST_SET(0),
67                lan966x, QSYS_CIR_CFG(se_idx));
68
69         return 0;
70 }
This page took 0.033296 seconds and 4 git commands to generate.