osi: dma: mgbe: drop ctxt desc for TSD

Issue description:
- For announce / managament / signaling ptp packets,
  MGBE populates context descriptor with Timestamp dropped status (TSD).
  It leads to 10us busy loop in rx path for every such packet.
- Also, it results into forwarding context descriptor to OSD
  through receive callback, leads to error spew from OSD.

Fix description:
- Removed busy loop when TSD is set in mgbe context descriptor.
- Consume context descriptor in OSI DMA itself when packet
  context descriptor found to be available (CDA).

Bug 5199635

Change-Id: I92785c5c434256d072405c4dd616486f64de2ff6
Signed-off-by: Hareesh Kesireddy <hkesireddy@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/kernel/nvethernetrm/+/3338247
(cherry picked from commit 1f165baec2635ffae05661306bd2a6ebba339601)
Reviewed-on: https://git-master.nvidia.com/r/c/kernel/nvethernetrm/+/3344960
Reviewed-by: Srinivas Ramachandran <srinivasra@nvidia.com>
Reviewed-by: svcacv <svcacv@nvidia.com>
GVS: buildbot_gerritrpt <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
Hareesh Kesireddy
2025-04-10 15:29:32 +00:00
committed by mobile promotions
parent 58bbd73ad6
commit b394b50ed4

View File

@@ -24,6 +24,9 @@
#include "hw_desc.h"
#include "mgbe_desc.h"
/** @brief retry count for ptp context descriptor readiness */
#define PTP_CTX_DESC_RETRY_CNT (10)
#ifndef OSI_STRIPPED_LIB
/**
* @brief mgbe_get_rx_vlan - Get Rx VLAN from descriptor
@@ -218,36 +221,45 @@ static nve32_t mgbe_get_rx_hwstamp(const struct osi_dma_priv_data *const osi_dma
goto fail;
}
for (retry = 0; retry < 10; retry++) {
/* RDES3_CDA is set, hence it is a context descriptor.
* Return always 0 from here on to allow caller to discard context descriptor
*/
for (retry = 0; retry < PTP_CTX_DESC_RETRY_CNT; retry++) {
if ((context_desc->rdes3 & (RDES3_OWN | RDES3_CTXT | RDES3_TSA | RDES3_TSD)) ==
(RDES3_CTXT | RDES3_TSA)) {
if ((context_desc->rdes0 == OSI_INVALID_VALUE) &&
(context_desc->rdes1 == OSI_INVALID_VALUE)) {
/* Invalid time stamp */
ret = -1;
goto fail;
break;
}
/* Time Stamp can be read */
rx_pkt_cx->ns = context_desc->rdes0 + (OSI_NSEC_PER_SEC * context_desc->rdes1);
if (rx_pkt_cx->ns < context_desc->rdes0) {
break;
}
/* Update rx pkt context flags to indicate PTP */
rx_pkt_cx->flags |= OSI_PKT_CX_PTP;
/* Time Stamp can be read */
break;
} else {
if ((context_desc->rdes3 & (RDES3_OWN | RDES3_CTXT | RDES3_TSD)) ==
(RDES3_CTXT | RDES3_TSD)) {
/* Timestamp Dropped by HW, no need to retry */
break;
}
/* TS not available yet, so retrying */
osi_dma->osd_ops.udelay(OSI_DELAY_1US);
}
}
if (retry == 10) {
if (retry == PTP_CTX_DESC_RETRY_CNT) {
/* Timed out waiting for Rx timestamp */
ret = -1;
OSI_DMA_ERR(osi_dma->osd, OSI_LOG_ARG_INVALID,
"hwstamp: Context descriptor OWN bit not cleared by HW\n",
(nveul64_t)(context_desc->rdes3));
goto fail;
}
rx_pkt_cx->ns = context_desc->rdes0 + (OSI_NSEC_PER_SEC * context_desc->rdes1);
if (rx_pkt_cx->ns < context_desc->rdes0) {
ret = -1;
}
fail:
return ret;
}