This patch enables Launch Time (Time-Based Scheduling) support to XDP zero
copy via XDP Tx metadata framework.

Signed-off-by: Song Yoong Siang <[email protected]>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac.h      |  2 ++
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 +++++++++++++
 2 files changed, 15 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h 
b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index 686c94c2e8a7..e8538af6e207 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -105,6 +105,8 @@ struct stmmac_metadata_request {
        struct stmmac_priv *priv;
        struct dma_desc *tx_desc;
        bool *set_ic;
+       struct dma_edesc *edesc;
+       int tbs;
 };
 
 struct stmmac_xsk_tx_complete {
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c 
b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index c2ac88aaffed..1fe80bfae24b 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -2465,9 +2465,20 @@ static u64 stmmac_xsk_fill_timestamp(void *_priv)
        return 0;
 }
 
+static void stmmac_xsk_request_launch_time(u64 launch_time, void *_priv)
+{
+       struct stmmac_metadata_request *meta_req = _priv;
+       struct timespec64 ts = ns_to_timespec64(launch_time);
+
+       if (meta_req->tbs & STMMAC_TBS_EN)
+               stmmac_set_desc_tbs(meta_req->priv, meta_req->edesc, ts.tv_sec,
+                                   ts.tv_nsec);
+}
+
 static const struct xsk_tx_metadata_ops stmmac_xsk_tx_metadata_ops = {
        .tmo_request_timestamp          = stmmac_xsk_request_timestamp,
        .tmo_fill_timestamp             = stmmac_xsk_fill_timestamp,
+       .tmo_request_launch_time        = stmmac_xsk_request_launch_time,
 };
 
 static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, u32 queue, u32 budget)
@@ -2545,6 +2556,8 @@ static bool stmmac_xdp_xmit_zc(struct stmmac_priv *priv, 
u32 queue, u32 budget)
                meta_req.priv = priv;
                meta_req.tx_desc = tx_desc;
                meta_req.set_ic = &set_ic;
+               meta_req.tbs = tx_q->tbs;
+               meta_req.edesc = &tx_q->dma_entx[entry];
                xsk_tx_metadata_request(meta, &stmmac_xsk_tx_metadata_ops,
                                        &meta_req);
                if (set_ic) {
-- 
2.34.1


Reply via email to