mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 09:14:19 +08:00
ice: PTP: Clean up timestamp registers correctly
E822 PHY TS registers should not be written and the only way to clean up them is to reset QUAD memory. To ensure that the status bit for the timestamp index is cleared, ensure that ice_clear_phy_tstamp implementations first read the timestamp out. Implementations which can write the register continue to do so. Add a note to indicate this function should only be called on timestamps which have their valid bit set. Update the dynamic debug messages to reflect the actual action taken. Signed-off-by: Karol Kolacinski <karol.kolacinski@intel.com> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel) Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
parent
be16574609
commit
be65a1a33b
@ -754,29 +754,32 @@ ice_read_phy_tstamp_e822(struct ice_hw *hw, u8 quad, u8 idx, u64 *tstamp)
|
||||
* @quad: the quad to read from
|
||||
* @idx: the timestamp index to reset
|
||||
*
|
||||
* Clear a timestamp, resetting its valid bit, from the PHY quad block that is
|
||||
* shared between the internal PHYs on the E822 devices.
|
||||
* Read the timestamp out of the quad to clear its timestamp status bit from
|
||||
* the PHY quad block that is shared between the internal PHYs of the E822
|
||||
* devices.
|
||||
*
|
||||
* Note that unlike E810, software cannot directly write to the quad memory
|
||||
* bank registers. E822 relies on the ice_get_phy_tx_tstamp_ready() function
|
||||
* to determine which timestamps are valid. Reading a timestamp auto-clears
|
||||
* the valid bit.
|
||||
*
|
||||
* To directly clear the contents of the timestamp block entirely, discarding
|
||||
* all timestamp data at once, software should instead use
|
||||
* ice_ptp_reset_ts_memory_quad_e822().
|
||||
*
|
||||
* This function should only be called on an idx whose bit is set according to
|
||||
* ice_get_phy_tx_tstamp_ready().
|
||||
*/
|
||||
static int
|
||||
ice_clear_phy_tstamp_e822(struct ice_hw *hw, u8 quad, u8 idx)
|
||||
{
|
||||
u16 lo_addr, hi_addr;
|
||||
u64 unused_tstamp;
|
||||
int err;
|
||||
|
||||
lo_addr = (u16)TS_L(Q_REG_TX_MEMORY_BANK_START, idx);
|
||||
hi_addr = (u16)TS_H(Q_REG_TX_MEMORY_BANK_START, idx);
|
||||
|
||||
err = ice_write_quad_reg_e822(hw, quad, lo_addr, 0);
|
||||
err = ice_read_phy_tstamp_e822(hw, quad, idx, &unused_tstamp);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear low PTP timestamp register, err %d\n",
|
||||
err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = ice_write_quad_reg_e822(hw, quad, hi_addr, 0);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear high PTP timestamp register, err %d\n",
|
||||
err);
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read the timestamp register for quad %u, idx %u, err %d\n",
|
||||
quad, idx, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -2812,28 +2815,39 @@ ice_read_phy_tstamp_e810(struct ice_hw *hw, u8 lport, u8 idx, u64 *tstamp)
|
||||
* @lport: the lport to read from
|
||||
* @idx: the timestamp index to reset
|
||||
*
|
||||
* Clear a timestamp, resetting its valid bit, from the timestamp block of the
|
||||
* external PHY on the E810 device.
|
||||
* Read the timestamp and then forcibly overwrite its value to clear the valid
|
||||
* bit from the timestamp block of the external PHY on the E810 device.
|
||||
*
|
||||
* This function should only be called on an idx whose bit is set according to
|
||||
* ice_get_phy_tx_tstamp_ready().
|
||||
*/
|
||||
static int ice_clear_phy_tstamp_e810(struct ice_hw *hw, u8 lport, u8 idx)
|
||||
{
|
||||
u32 lo_addr, hi_addr;
|
||||
u64 unused_tstamp;
|
||||
int err;
|
||||
|
||||
err = ice_read_phy_tstamp_e810(hw, lport, idx, &unused_tstamp);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to read the timestamp register for lport %u, idx %u, err %d\n",
|
||||
lport, idx, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
lo_addr = TS_EXT(LOW_TX_MEMORY_BANK_START, lport, idx);
|
||||
hi_addr = TS_EXT(HIGH_TX_MEMORY_BANK_START, lport, idx);
|
||||
|
||||
err = ice_write_phy_reg_e810(hw, lo_addr, 0);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear low PTP timestamp register, err %d\n",
|
||||
err);
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear low PTP timestamp register for lport %u, idx %u, err %d\n",
|
||||
lport, idx, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = ice_write_phy_reg_e810(hw, hi_addr, 0);
|
||||
if (err) {
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear high PTP timestamp register, err %d\n",
|
||||
err);
|
||||
ice_debug(hw, ICE_DBG_PTP, "Failed to clear high PTP timestamp register for lport %u, idx %u, err %d\n",
|
||||
lport, idx, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -3515,9 +3529,15 @@ int ice_read_phy_tstamp(struct ice_hw *hw, u8 block, u8 idx, u64 *tstamp)
|
||||
* @block: the block to read from
|
||||
* @idx: the timestamp index to reset
|
||||
*
|
||||
* Clear a timestamp, resetting its valid bit, from the timestamp block. For
|
||||
* E822 devices, the block is the quad to clear from. For E810 devices, the
|
||||
* block is the logical port to clear from.
|
||||
* Clear a timestamp from the timestamp block, discarding its value without
|
||||
* returning it. This resets the memory status bit for the timestamp index
|
||||
* allowing it to be reused for another timestamp in the future.
|
||||
*
|
||||
* For E822 devices, the block number is the PHY quad to clear from. For E810
|
||||
* devices, the block number is the logical port to clear from.
|
||||
*
|
||||
* This function must only be called on a timestamp index whose valid bit is
|
||||
* set according to ice_get_phy_tx_tstamp_ready().
|
||||
*/
|
||||
int ice_clear_phy_tstamp(struct ice_hw *hw, u8 block, u8 idx)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user