bnxt_en: Add a timeout parameter to bnxt_hwrm_port_ts_query()
authorMichael Chan <michael.chan@broadcom.com>
Mon, 25 Mar 2024 22:28:51 +0000 (15:28 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 29 Mar 2024 05:34:39 +0000 (22:34 -0700)
The caller can pass this new timeout parameter to the function to
specify the firmware timeout value when requesting the TX timestamp
from the firmware.  This will allow the caller to precisely control
the timeout and will be used in the next patch.  In this patch, the
parameter is 0 which means to use the current default value.

Cc: Richard Cochran <richardcochran@gmail.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://lore.kernel.org/r/20240325222902.220712-2-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ptp.h

index cc07660330f533b5e39efcb0f5dff6f865821315..dbfd1b36774c3e6a03e5ad4cd4ad477d69fe0e73 100644 (file)
@@ -109,7 +109,8 @@ static void bnxt_ptp_get_current_time(struct bnxt *bp)
        spin_unlock_bh(&ptp->ptp_lock);
 }
 
-static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts)
+static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts,
+                                  u32 txts_tmo)
 {
        struct hwrm_port_ts_query_output *resp;
        struct hwrm_port_ts_query_input *req;
@@ -122,10 +123,15 @@ static int bnxt_hwrm_port_ts_query(struct bnxt *bp, u32 flags, u64 *ts)
        req->flags = cpu_to_le32(flags);
        if ((flags & PORT_TS_QUERY_REQ_FLAGS_PATH) ==
            PORT_TS_QUERY_REQ_FLAGS_PATH_TX) {
+               u32 tmo_us = txts_tmo * 1000;
+
                req->enables = cpu_to_le16(BNXT_PTP_QTS_TX_ENABLES);
                req->ptp_seq_id = cpu_to_le32(bp->ptp_cfg->tx_seqid);
                req->ptp_hdr_offset = cpu_to_le16(bp->ptp_cfg->tx_hdr_off);
-               req->ts_req_timeout = cpu_to_le16(BNXT_PTP_QTS_TIMEOUT);
+               if (!tmo_us)
+                       tmo_us = BNXT_PTP_QTS_TIMEOUT;
+               tmo_us = min(tmo_us, BNXT_PTP_QTS_MAX_TMO_US);
+               req->ts_req_timeout = cpu_to_le16(txts_tmo);
        }
        resp = hwrm_req_hold(bp, req);
 
@@ -675,7 +681,8 @@ static void bnxt_stamp_tx_skb(struct bnxt *bp, struct sk_buff *skb)
        u64 ts = 0, ns = 0;
        int rc;
 
-       rc = bnxt_hwrm_port_ts_query(bp, PORT_TS_QUERY_REQ_FLAGS_PATH_TX, &ts);
+       rc = bnxt_hwrm_port_ts_query(bp, PORT_TS_QUERY_REQ_FLAGS_PATH_TX, &ts,
+                                    0);
        if (!rc) {
                memset(&timestamp, 0, sizeof(timestamp));
                spin_lock_bh(&ptp->ptp_lock);
@@ -891,7 +898,8 @@ int bnxt_ptp_init_rtc(struct bnxt *bp, bool phc_cfg)
                if (rc)
                        return rc;
        } else {
-               rc = bnxt_hwrm_port_ts_query(bp, PORT_TS_QUERY_REQ_FLAGS_CURRENT_TIME, &ns);
+               rc = bnxt_hwrm_port_ts_query(bp, PORT_TS_QUERY_REQ_FLAGS_CURRENT_TIME,
+                                            &ns, 0);
                if (rc)
                        return rc;
        }
index fce8dc39a7d0e595425ba7912de2e843fc58f559..04886d5f22adcfb1438204e86f94918a905db1ef 100644 (file)
@@ -23,6 +23,7 @@
 #define BNXT_HI_TIMER_MASK     0xffff00000000UL
 
 #define BNXT_PTP_QTS_TIMEOUT   1000
+#define BNXT_PTP_QTS_MAX_TMO_US        65535
 #define BNXT_PTP_QTS_TX_ENABLES        (PORT_TS_QUERY_REQ_ENABLES_PTP_SEQ_ID | \
                                 PORT_TS_QUERY_REQ_ENABLES_TS_REQ_TIMEOUT | \
                                 PORT_TS_QUERY_REQ_ENABLES_PTP_HDR_OFFSET)