net: fec: reduce spin lock time in fec_ptp_adjfreq
authorFrank Li <Frank.Li@freescale.com>
Tue, 6 Nov 2012 20:14:49 +0000 (20:14 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Nov 2012 23:52:12 +0000 (18:52 -0500)
move below calculate out of spin lock section
diff = fep->cc.mult;
diff *= ppb;
diff = div_u64(diff, 1000000000ULL);

diff is local variable and not neccesary in spin lock

Signed-off-by: Frank Li <Frank.Li@freescale.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/fec_ptp.c

index 5352140468ce990f33bcd3ce02906f4abce6dcef..c40526c78c2024387a6f2452b769813d1120f08c 100644 (file)
@@ -145,6 +145,7 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
        u64 diff;
        unsigned long flags;
        int neg_adj = 0;
+       u32 mult = FEC_CC_MULT;
 
        struct fec_enet_private *fep =
            container_of(ptp, struct fec_enet_private, ptp_caps);
@@ -154,6 +155,10 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
                neg_adj = 1;
        }
 
+       diff = mult;
+       diff *= ppb;
+       diff = div_u64(diff, 1000000000ULL);
+
        spin_lock_irqsave(&fep->tmreg_lock, flags);
        /*
         * dummy read to set cycle_last in tc to now.
@@ -161,15 +166,8 @@ static int fec_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
         * timercounter_read.
         */
        timecounter_read(&fep->tc);
-       fep->cc.mult = FEC_CC_MULT;
-       diff = fep->cc.mult;
-       diff *= ppb;
-       diff = div_u64(diff, 1000000000ULL);
 
-       if (neg_adj)
-               fep->cc.mult -= diff;
-       else
-               fep->cc.mult += diff;
+       fep->cc.mult = neg_adj ? mult - diff : mult + diff;
 
        spin_unlock_irqrestore(&fep->tmreg_lock, flags);