net: ethernet: ti: cpts: move tc mult update in cpts_fifo_read()
authorGrygorii Strashko <grygorii.strashko@ti.com>
Thu, 23 Apr 2020 14:20:15 +0000 (17:20 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Apr 2020 19:50:20 +0000 (12:50 -0700)
Now CPTS driver .adjfreq() generates request to read CPTS current time
(CPTS_EV_PUSH) with intention to process all pending event using previous
frequency adjustment values before switching to the new ones. So
CPTS_EV_PUSH works as a marker to switch to the new frequency adjustment
values. Current code assumes that all job is done in .adjfreq(), but after
enabling IRQ this will not be true any more.

Hence save new frequency adjustment values (mult) and perform actual freq
adjustment in cpts_fifo_read() immediately after CPTS_EV_PUSH is received.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpts.c
drivers/net/ethernet/ti/cpts.h

index f40a864d8c36f5265388d3da7392465085d8339c..a2974b542bed1a8a90829adfe590d048475150b0 100644 (file)
@@ -165,6 +165,10 @@ static int cpts_fifo_read(struct cpts *cpts, int match)
                case CPTS_EV_PUSH:
                        WRITE_ONCE(cpts->cur_timestamp, lo);
                        timecounter_read(&cpts->tc);
+                       if (cpts->mult_new) {
+                               cpts->cc.mult = cpts->mult_new;
+                               cpts->mult_new = 0;
+                       }
                        break;
                case CPTS_EV_TX:
                        if (cpts_match_tx_ts(cpts, event)) {
@@ -228,9 +232,9 @@ static int cpts_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
 
        spin_lock_irqsave(&cpts->lock, flags);
 
-       cpts_update_cur_time(cpts, CPTS_EV_PUSH);
+       cpts->mult_new = neg_adj ? mult - diff : mult + diff;
 
-       cpts->cc.mult = neg_adj ? mult - diff : mult + diff;
+       cpts_update_cur_time(cpts, CPTS_EV_PUSH);
 
        spin_unlock_irqrestore(&cpts->lock, flags);
 
index 32ecd1ce4d3b1d7ddd25618694fa61b6c2ceb38e..421630049ee79338aa65a5855ec2e9f73986806a 100644 (file)
@@ -116,6 +116,7 @@ struct cpts {
        unsigned long ov_check_period;
        struct sk_buff_head txq;
        u64 cur_timestamp;
+       u32 mult_new;
 };
 
 void cpts_rx_timestamp(struct cpts *cpts, struct sk_buff *skb);