Move ice_ptp_maybe_trigger_tx_interrupt() and ice_ptp_periodic_work(). This will allow to assign ice_ptp_periodic_work() to PTP API's do_aux_work function pointer.
Reviewed-by: Przemek Kitszel <[email protected]> Signed-off-by: Karol Kolacinski <[email protected]> --- drivers/net/ethernet/intel/ice/ice_ptp.c | 132 +++++++++++------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index 3278b96d8f01..0a1f6e0e4a22 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -2530,6 +2530,72 @@ static void ice_ptp_set_funcs_e830(struct ice_pf *pf) ice_ptp_setup_pin_cfg(pf); } +/** + * ice_ptp_maybe_trigger_tx_interrupt - Trigger Tx timstamp interrupt + * @pf: Board private structure + * + * The device PHY issues Tx timestamp interrupts to the driver for processing + * timestamp data from the PHY. It will not interrupt again until all + * current timestamp data is read. In rare circumstances, it is possible that + * the driver fails to read all outstanding data. + * + * To avoid getting permanently stuck, periodically check if the PHY has + * outstanding timestamp data. If so, trigger an interrupt from software to + * process this data. + */ +static void ice_ptp_maybe_trigger_tx_interrupt(struct ice_pf *pf) +{ + struct device *dev = ice_pf_to_dev(pf); + struct ice_hw *hw = &pf->hw; + bool trigger_oicr = false; + unsigned int i; + + if (!pf->ptp.port.tx.has_ready_bitmap) + return; + + if (!ice_pf_src_tmr_owned(pf)) + return; + + for (i = 0; i < ICE_GET_QUAD_NUM(hw->ptp.num_lports); i++) { + u64 tstamp_ready; + int err; + + err = ice_get_phy_tx_tstamp_ready(&pf->hw, i, &tstamp_ready); + if (!err && tstamp_ready) { + trigger_oicr = true; + break; + } + } + + if (trigger_oicr) { + /* Trigger a software interrupt, to ensure this data + * gets processed. + */ + dev_dbg(dev, "PTP periodic task detected waiting timestamps. Triggering Tx timestamp interrupt now.\n"); + + wr32(hw, PFINT_OICR, PFINT_OICR_TSYN_TX_M); + ice_flush(hw); + } +} + +static void ice_ptp_periodic_work(struct kthread_work *work) +{ + struct ice_ptp *ptp = container_of(work, struct ice_ptp, work.work); + struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp); + int err; + + if (pf->ptp.state != ICE_PTP_READY) + return; + + err = ice_ptp_update_cached_phctime(pf); + + ice_ptp_maybe_trigger_tx_interrupt(pf); + + /* Run twice a second or reschedule if phc update failed */ + kthread_queue_delayed_work(ptp->kworker, &ptp->work, + msecs_to_jiffies(err ? 10 : 500)); +} + /** * ice_ptp_set_caps - Set PTP capabilities * @pf: Board private structure @@ -2739,72 +2805,6 @@ irqreturn_t ice_ptp_ts_irq(struct ice_pf *pf) } } -/** - * ice_ptp_maybe_trigger_tx_interrupt - Trigger Tx timstamp interrupt - * @pf: Board private structure - * - * The device PHY issues Tx timestamp interrupts to the driver for processing - * timestamp data from the PHY. It will not interrupt again until all - * current timestamp data is read. In rare circumstances, it is possible that - * the driver fails to read all outstanding data. - * - * To avoid getting permanently stuck, periodically check if the PHY has - * outstanding timestamp data. If so, trigger an interrupt from software to - * process this data. - */ -static void ice_ptp_maybe_trigger_tx_interrupt(struct ice_pf *pf) -{ - struct device *dev = ice_pf_to_dev(pf); - struct ice_hw *hw = &pf->hw; - bool trigger_oicr = false; - unsigned int i; - - if (!pf->ptp.port.tx.has_ready_bitmap) - return; - - if (!ice_pf_src_tmr_owned(pf)) - return; - - for (i = 0; i < ICE_GET_QUAD_NUM(hw->ptp.num_lports); i++) { - u64 tstamp_ready; - int err; - - err = ice_get_phy_tx_tstamp_ready(&pf->hw, i, &tstamp_ready); - if (!err && tstamp_ready) { - trigger_oicr = true; - break; - } - } - - if (trigger_oicr) { - /* Trigger a software interrupt, to ensure this data - * gets processed. - */ - dev_dbg(dev, "PTP periodic task detected waiting timestamps. Triggering Tx timestamp interrupt now.\n"); - - wr32(hw, PFINT_OICR, PFINT_OICR_TSYN_TX_M); - ice_flush(hw); - } -} - -static void ice_ptp_periodic_work(struct kthread_work *work) -{ - struct ice_ptp *ptp = container_of(work, struct ice_ptp, work.work); - struct ice_pf *pf = container_of(ptp, struct ice_pf, ptp); - int err; - - if (pf->ptp.state != ICE_PTP_READY) - return; - - err = ice_ptp_update_cached_phctime(pf); - - ice_ptp_maybe_trigger_tx_interrupt(pf); - - /* Run twice a second or reschedule if phc update failed */ - kthread_queue_delayed_work(ptp->kworker, &ptp->work, - msecs_to_jiffies(err ? 10 : 500)); -} - /** * ice_ptp_prepare_rebuild_sec - Prepare second NAC for PTP reset or rebuild * @pf: Board private structure base-commit: b74ad830a99f47b47e3f8d98d7d78614edab6217 -- 2.49.0
