net: stmmac: tc: Add support for ETF Scheduler using TBS
authorJose Abreu <Jose.Abreu@synopsys.com>
Mon, 13 Jan 2020 16:24:10 +0000 (17:24 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 14 Jan 2020 02:31:48 +0000 (18:31 -0800)
Adds the support for ETF scheduler using TBS feature which is available
in XGMAC and QoS IPs.

Changes from v2:
- Fix checkpatch issues (Jakub)
- Use the TBS bitfield

Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/hwif.h
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_tc.c

index 31003b67d24f9e65383bcd79a361a2984d0b71e8..487099092693ea5df642137c46deab86446ca330 100644 (file)
@@ -368,6 +368,7 @@ struct dma_features {
        unsigned int estdep;
        unsigned int estsel;
        unsigned int fpesel;
+       unsigned int tbssel;
 };
 
 /* RX Buffer size must be multiple of 4/8/16 bytes */
index 71c23cbd7af8b2595b4ff8406215ac2c90275bb8..df63b0367affa763afa04df05dbf4bb9fdf3e0ed 100644 (file)
@@ -533,6 +533,7 @@ struct tc_cls_u32_offload;
 struct tc_cbs_qopt_offload;
 struct flow_cls_offload;
 struct tc_taprio_qopt_offload;
+struct tc_etf_qopt_offload;
 
 struct stmmac_tc_ops {
        int (*init)(struct stmmac_priv *priv);
@@ -544,6 +545,8 @@ struct stmmac_tc_ops {
                         struct flow_cls_offload *cls);
        int (*setup_taprio)(struct stmmac_priv *priv,
                            struct tc_taprio_qopt_offload *qopt);
+       int (*setup_etf)(struct stmmac_priv *priv,
+                        struct tc_etf_qopt_offload *qopt);
 };
 
 #define stmmac_tc_init(__priv, __args...) \
@@ -556,6 +559,8 @@ struct stmmac_tc_ops {
        stmmac_do_callback(__priv, tc, setup_cls, __args)
 #define stmmac_tc_setup_taprio(__priv, __args...) \
        stmmac_do_callback(__priv, tc, setup_taprio, __args)
+#define stmmac_tc_setup_etf(__priv, __args...) \
+       stmmac_do_callback(__priv, tc, setup_etf, __args)
 
 struct stmmac_counters;
 
index baffb4e8d99a328413efcc46ac362fb1d5b8a5f4..43af4fc5ab8fa071dc7fd4a6525cca29d6bc9abe 100644 (file)
@@ -4159,6 +4159,8 @@ static int stmmac_setup_tc(struct net_device *ndev, enum tc_setup_type type,
                return stmmac_tc_setup_cbs(priv, priv, type_data);
        case TC_SETUP_QDISC_TAPRIO:
                return stmmac_tc_setup_taprio(priv, priv, type_data);
+       case TC_SETUP_QDISC_ETF:
+               return stmmac_tc_setup_etf(priv, priv, type_data);
        default:
                return -EOPNOTSUPP;
        }
index 6c4686b77516633d5eb59f62b18c12240722b521..a4ce165af36b96478a5c77df2d6a7303d03f1621 100644 (file)
@@ -727,10 +727,31 @@ disable:
        return ret;
 }
 
+static int tc_setup_etf(struct stmmac_priv *priv,
+                       struct tc_etf_qopt_offload *qopt)
+{
+       if (!priv->dma_cap.tbssel)
+               return -EOPNOTSUPP;
+       if (qopt->queue >= priv->plat->tx_queues_to_use)
+               return -EINVAL;
+       if (!(priv->tx_queue[qopt->queue].tbs & STMMAC_TBS_AVAIL))
+               return -EINVAL;
+
+       if (qopt->enable)
+               priv->tx_queue[qopt->queue].tbs |= STMMAC_TBS_EN;
+       else
+               priv->tx_queue[qopt->queue].tbs &= ~STMMAC_TBS_EN;
+
+       netdev_info(priv->dev, "%s ETF for Queue %d\n",
+                   qopt->enable ? "enabled" : "disabled", qopt->queue);
+       return 0;
+}
+
 const struct stmmac_tc_ops dwmac510_tc_ops = {
        .init = tc_init,
        .setup_cls_u32 = tc_setup_cls_u32,
        .setup_cbs = tc_setup_cbs,
        .setup_cls = tc_setup_cls,
        .setup_taprio = tc_setup_taprio,
+       .setup_etf = tc_setup_etf,
 };