ptp_qoriq: check valid status before reading extts fifo
authorYangbo Lu <yangbo.lu@nxp.com>
Thu, 12 Dec 2019 10:08:04 +0000 (18:08 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 16 Dec 2019 23:56:41 +0000 (15:56 -0800)
For PTP timer supporting external trigger timestamp FIFO,
there is a valid bit in TMR_STAT register indicating the
timestamp is available. For PTP timer without FIFO, there
is not TMR_STAT register.
This patch is to check the valid bit for the FIFO before
reading timestamp, and to avoid operating TMR_STAT register
for PTP timer without the FIFO.

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/ptp/ptp_qoriq.c

index a577218..a3062cd 100644 (file)
@@ -81,7 +81,7 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
        struct ptp_clock_event event;
        void __iomem *reg_etts_l;
        void __iomem *reg_etts_h;
-       u32 valid, stat, lo, hi;
+       u32 valid, lo, hi;
 
        switch (index) {
        case 0:
@@ -101,6 +101,10 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
        event.type = PTP_CLOCK_EXTTS;
        event.index = index;
 
+       if (ptp_qoriq->extts_fifo_support)
+               if (!(ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid))
+                       return 0;
+
        do {
                lo = ptp_qoriq->read(reg_etts_l);
                hi = ptp_qoriq->read(reg_etts_h);
@@ -111,8 +115,9 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
                        ptp_clock_event(ptp_qoriq->clock, &event);
                }
 
-               stat = ptp_qoriq->read(&regs->ctrl_regs->tmr_stat);
-       } while (ptp_qoriq->extts_fifo_support && (stat & valid));
+               if (!ptp_qoriq->extts_fifo_support)
+                       break;
+       } while (ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid);
 
        return 0;
 }