mirror of
https://github.com/torvalds/linux.git
synced 2026-09-24 06:24:02 +02:00
hwtracing: hisi_ptt: Propagate DMA reset timeout in trace_start()
hisi_ptt_wait_dma_reset_done() discards the return value of
readl_poll_timeout_atomic(). If the DMA engine does not complete its
reset within the timeout, hisi_ptt_trace_start() proceeds to start
tracing regardless.
Return a bool from hisi_ptt_wait_dma_reset_done(), consistent with the
other wait helpers in this driver. On timeout, log an error, de-assert
the reset bit, and return -ETIMEDOUT. Move ctrl->started to the
successful path so a failed start does not leave the trace marked as
active.
Fixes: ff0de066b4 ("hwtracing: hisi_ptt: Add trace function support for HiSilicon PCIe Tune and Trace device")
Cc: stable@vger.kernel.org
Signed-off-by: Sanman Pradhan <psanman@juniper.net>
Reviewed-by: Sizhe Liu <liusizhe5@huawei.com>
Reviewed-by: Yicong Yang <yangyccccc@gmail.com>
Tested-by: Sizhe Liu <liusizhe5@huawei.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20260414172451.14331-2-sanman.pradhan@hpe.com
This commit is contained in:
parent
f67379bcf6
commit
75d42d9903
|
|
@ -171,13 +171,13 @@ static bool hisi_ptt_wait_trace_hw_idle(struct hisi_ptt *hisi_ptt)
|
|||
HISI_PTT_WAIT_TRACE_TIMEOUT_US);
|
||||
}
|
||||
|
||||
static void hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt)
|
||||
static bool hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS,
|
||||
val, !val, HISI_PTT_RESET_POLL_INTERVAL_US,
|
||||
HISI_PTT_RESET_TIMEOUT_US);
|
||||
return !readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS,
|
||||
val, !val, HISI_PTT_RESET_POLL_INTERVAL_US,
|
||||
HISI_PTT_RESET_TIMEOUT_US);
|
||||
}
|
||||
|
||||
static void hisi_ptt_trace_end(struct hisi_ptt *hisi_ptt)
|
||||
|
|
@ -202,14 +202,18 @@ static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt)
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
ctrl->started = true;
|
||||
|
||||
/* Reset the DMA before start tracing */
|
||||
val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
val |= HISI_PTT_TRACE_CTRL_RST;
|
||||
writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
|
||||
hisi_ptt_wait_dma_reset_done(hisi_ptt);
|
||||
if (!hisi_ptt_wait_dma_reset_done(hisi_ptt)) {
|
||||
pci_err(hisi_ptt->pdev, "timed out waiting for DMA reset\n");
|
||||
val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
val &= ~HISI_PTT_TRACE_CTRL_RST;
|
||||
writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
val &= ~HISI_PTT_TRACE_CTRL_RST;
|
||||
|
|
@ -234,6 +238,8 @@ static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt)
|
|||
if (!hisi_ptt->trace_ctrl.is_port)
|
||||
val |= HISI_PTT_TRACE_CTRL_FILTER_MODE;
|
||||
|
||||
ctrl->started = true;
|
||||
|
||||
/* Start the Trace */
|
||||
val |= HISI_PTT_TRACE_CTRL_EN;
|
||||
writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user