Skip to content

Commit

Permalink
net/bnxt: fix Rx timestamp when FIFO pending bit is set
Browse files Browse the repository at this point in the history
[ upstream commit f8120fd ]

Fix to clear the Rx FIFO while reading the timestamp.
If the Rx FIFO has pending bit set, keep reading to clear it
and return the last valid timestamp instead of unconditionally
returning an error.

Fixes: b11cceb ("net/bnxt: support timesync")

Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
  • Loading branch information
skotur-brcm authored and steevenlee committed Jun 8, 2021
1 parent 699e70a commit a7375b0
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
1 change: 1 addition & 0 deletions drivers/net/bnxt/bnxt.h
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,7 @@ struct rte_flow {
struct bnxt_vnic_info *vnic;
};

#define BNXT_PTP_RX_PND_CNT 10
#define BNXT_PTP_FLAGS_PATH_TX 0x0
#define BNXT_PTP_FLAGS_PATH_RX 0x1
#define BNXT_PTP_FLAGS_CURRENT_TIME 0x2
Expand Down
38 changes: 34 additions & 4 deletions drivers/net/bnxt/bnxt_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3373,6 +3373,38 @@ static int bnxt_get_tx_ts(struct bnxt *bp, uint64_t *ts)
return 0;
}

static int bnxt_clr_rx_ts(struct bnxt *bp, uint64_t *last_ts)
{
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
struct bnxt_pf_info *pf = bp->pf;
uint16_t port_id;
int i = 0;
uint32_t fifo;

if (!ptp || (bp->flags & BNXT_FLAG_THOR_CHIP))
return -EINVAL;

port_id = pf->port_id;
fifo = rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_FIFO]));
while ((fifo & BNXT_PTP_RX_FIFO_PENDING) && (i < BNXT_PTP_RX_PND_CNT)) {
rte_write32(1 << port_id, (uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_FIFO_ADV]);
fifo = rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_FIFO]));
*last_ts = rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_TS_L]));
*last_ts |= (uint64_t)rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_TS_H])) << 32;
i++;
}

if (i >= BNXT_PTP_RX_PND_CNT)
return -EBUSY;

return 0;
}

static int bnxt_get_rx_ts(struct bnxt *bp, uint64_t *ts)
{
struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
Expand All @@ -3391,10 +3423,8 @@ static int bnxt_get_rx_ts(struct bnxt *bp, uint64_t *ts)

fifo = rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_FIFO]));
if (fifo & BNXT_PTP_RX_FIFO_PENDING) {
/* bnxt_clr_rx_ts(bp); TBD */
return -EBUSY;
}
if (fifo & BNXT_PTP_RX_FIFO_PENDING)
return bnxt_clr_rx_ts(bp, ts);

*ts = rte_le_to_cpu_32(rte_read32((uint8_t *)bp->bar0 +
ptp->rx_mapped_regs[BNXT_PTP_RX_TS_L]));
Expand Down

0 comments on commit a7375b0

Please sign in to comment.