mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 15:41:52 +02:00
ice: use read_poll_timeout_atomic in ice_read_phy_tstamp_ll_e810
The ice_read_phy_tstamp_ll_e810 function repeatedly reads the PF_SB_ATQBAL register until the TS_LL_READ_TS bit is cleared. This is a perfect candidate for using rd32_poll_timeout. However, the default implementation uses a sleep-based wait. Use read_poll_timeout_atomic macro which is based on the non-sleeping implementation and use it to replace the loop reading in the ice_read_phy_tstamp_ll_e810 function. Co-developed-by: Karol Kolacinski <karol.kolacinski@intel.com> Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Anton Nadezhdin <anton.nadezhdin@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
4c9f13a654
commit
95aca43b4a
|
|
@ -4858,32 +4858,29 @@ static int
|
|||
ice_read_phy_tstamp_ll_e810(struct ice_hw *hw, u8 idx, u8 *hi, u32 *lo)
|
||||
{
|
||||
u32 val;
|
||||
u8 i;
|
||||
int err;
|
||||
|
||||
/* Write TS index to read to the PF register so the FW can read it */
|
||||
val = FIELD_PREP(TS_LL_READ_TS_IDX, idx) | TS_LL_READ_TS;
|
||||
wr32(hw, PF_SB_ATQBAL, val);
|
||||
|
||||
/* Read the register repeatedly until the FW provides us the TS */
|
||||
for (i = TS_LL_READ_RETRIES; i > 0; i--) {
|
||||
val = rd32(hw, PF_SB_ATQBAL);
|
||||
|
||||
/* When the bit is cleared, the TS is ready in the register */
|
||||
if (!(FIELD_GET(TS_LL_READ_TS, val))) {
|
||||
/* High 8 bit value of the TS is on the bits 16:23 */
|
||||
*hi = FIELD_GET(TS_LL_READ_TS_HIGH, val);
|
||||
|
||||
/* Read the low 32 bit value and set the TS valid bit */
|
||||
*lo = rd32(hw, PF_SB_ATQBAH) | TS_VALID;
|
||||
return 0;
|
||||
}
|
||||
|
||||
udelay(10);
|
||||
err = read_poll_timeout_atomic(rd32, val,
|
||||
!FIELD_GET(TS_LL_READ_TS, val), 10,
|
||||
TS_LL_READ_TIMEOUT, false, hw,
|
||||
PF_SB_ATQBAL);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read PTP timestamp using low latency read\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
/* FW failed to provide the TS in time */
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read PTP timestamp using low latency read\n");
|
||||
return -EINVAL;
|
||||
/* High 8 bit value of the TS is on the bits 16:23 */
|
||||
*hi = FIELD_GET(TS_LL_READ_TS_HIGH, val);
|
||||
|
||||
/* Read the low 32 bit value and set the TS valid bit */
|
||||
*lo = rd32(hw, PF_SB_ATQBAH) | TS_VALID;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -689,7 +689,7 @@ static inline bool ice_is_dual(struct ice_hw *hw)
|
|||
#define BYTES_PER_IDX_ADDR_L 4
|
||||
|
||||
/* Tx timestamp low latency read definitions */
|
||||
#define TS_LL_READ_RETRIES 200
|
||||
#define TS_LL_READ_TIMEOUT 2000
|
||||
#define TS_LL_READ_TS_HIGH GENMASK(23, 16)
|
||||
#define TS_LL_READ_TS_IDX GENMASK(29, 24)
|
||||
#define TS_LL_READ_TS_INTR BIT(30)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user