e1000e: PTP lock in e1000e_phc_adjustfreq
authorTodd Fujinaka <todd.fujinaka@intel.com>
Sat, 18 Jan 2014 06:09:33 +0000 (06:09 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 8 Mar 2014 04:53:56 +0000 (20:53 -0800)
Add lock in e1000e_phc_adjfreq to prevent concurrent changes to TIMINCA
and SYSTIMH/L.

Signed-off-by: Todd Fujinaka <todd.fujinaka@intel.com>
Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000e/ptp.c

index 065f8c80d4f2d751e2cd2763f3bd6d1e73b6ab9b..e24160de49265667e622d0c0bf05fe5621cd4ace 100644 (file)
@@ -47,6 +47,7 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
                                                     ptp_clock_info);
        struct e1000_hw *hw = &adapter->hw;
        bool neg_adj = false;
+       unsigned long flags;
        u64 adjustment;
        u32 timinca, incvalue;
        s32 ret_val;
@@ -64,6 +65,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
        if (ret_val)
                return ret_val;
 
+       spin_lock_irqsave(&adapter->systim_lock, flags);
+
        incvalue = timinca & E1000_TIMINCA_INCVALUE_MASK;
 
        adjustment = incvalue;
@@ -77,6 +80,8 @@ static int e1000e_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta)
 
        ew32(TIMINCA, timinca);
 
+       spin_unlock_irqrestore(&adapter->systim_lock, flags);
+
        return 0;
 }