net: igb: avoid using timespec
authorArnd Bergmann <arnd@arndb.de>
Wed, 30 Sep 2015 11:26:33 +0000 (13:26 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 5 Oct 2015 10:16:42 +0000 (03:16 -0700)
We want to deprecate the use of 'struct timespec' on 32-bit
architectures, as it is will overflow in 2038. The igb
driver uses it to read the current time, and can simply
be changed to use ktime_get_real_ts64() instead.

Because of hardware limitations, there is still an overflow
in year 2106, which we cannot really avoid, but this documents
the overflow.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Cc: intel-wired-lan@lists.osuosl.org
Reviewed-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/intel/igb/igb.h
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/igb/igb_ptp.c

index 212d668dabb382160ae04dfce3e6b1375b44832d..1a2f1cc44b2836499dc231be9edb896b8b6ddbe6 100644 (file)
@@ -444,8 +444,8 @@ struct igb_adapter {
 
        struct ptp_pin_desc sdp_config[IGB_N_SDP];
        struct {
-               struct timespec start;
-               struct timespec period;
+               struct timespec64 start;
+               struct timespec64 period;
        } perout[IGB_N_PEROUT];
 
        char fw_version[32];
index ba019fc87fd1b7755f0bc0e41cfbb1ddfc611485..7e6267503790596e228455d8f9ee469410572dfb 100644 (file)
@@ -5392,7 +5392,7 @@ static void igb_tsync_interrupt(struct igb_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        struct ptp_clock_event event;
-       struct timespec ts;
+       struct timespec64 ts;
        u32 ack = 0, tsauxc, sec, nsec, tsicr = rd32(E1000_TSICR);
 
        if (tsicr & TSINTR_SYS_WRAP) {
@@ -5412,10 +5412,11 @@ static void igb_tsync_interrupt(struct igb_adapter *adapter)
 
        if (tsicr & TSINTR_TT0) {
                spin_lock(&adapter->tmreg_lock);
-               ts = timespec_add(adapter->perout[0].start,
-                                 adapter->perout[0].period);
+               ts = timespec64_add(adapter->perout[0].start,
+                                   adapter->perout[0].period);
+               /* u32 conversion of tv_sec is safe until y2106 */
                wr32(E1000_TRGTTIML0, ts.tv_nsec);
-               wr32(E1000_TRGTTIMH0, ts.tv_sec);
+               wr32(E1000_TRGTTIMH0, (u32)ts.tv_sec);
                tsauxc = rd32(E1000_TSAUXC);
                tsauxc |= TSAUXC_EN_TT0;
                wr32(E1000_TSAUXC, tsauxc);
@@ -5426,10 +5427,10 @@ static void igb_tsync_interrupt(struct igb_adapter *adapter)
 
        if (tsicr & TSINTR_TT1) {
                spin_lock(&adapter->tmreg_lock);
-               ts = timespec_add(adapter->perout[1].start,
-                                 adapter->perout[1].period);
+               ts = timespec64_add(adapter->perout[1].start,
+                                   adapter->perout[1].period);
                wr32(E1000_TRGTTIML1, ts.tv_nsec);
-               wr32(E1000_TRGTTIMH1, ts.tv_sec);
+               wr32(E1000_TRGTTIMH1, (u32)ts.tv_sec);
                tsauxc = rd32(E1000_TSAUXC);
                tsauxc |= TSAUXC_EN_TT1;
                wr32(E1000_TSAUXC, tsauxc);
index 5982f28d521a2c116d49ba4cda22d8520c0cb1dc..c44df87c38de233578c531e13ea7cb9ef211ceb7 100644 (file)
@@ -143,7 +143,7 @@ static void igb_ptp_write_i210(struct igb_adapter *adapter,
         * sub-nanosecond resolution.
         */
        wr32(E1000_SYSTIML, ts->tv_nsec);
-       wr32(E1000_SYSTIMH, ts->tv_sec);
+       wr32(E1000_SYSTIMH, (u32)ts->tv_sec);
 }
 
 /**
@@ -479,7 +479,7 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
        struct e1000_hw *hw = &igb->hw;
        u32 tsauxc, tsim, tsauxc_mask, tsim_mask, trgttiml, trgttimh, freqout;
        unsigned long flags;
-       struct timespec ts;
+       struct timespec64 ts;
        int use_freq = 0, pin = -1;
        s64 ns;
 
@@ -523,14 +523,14 @@ static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
                }
                ts.tv_sec = rq->perout.period.sec;
                ts.tv_nsec = rq->perout.period.nsec;
-               ns = timespec_to_ns(&ts);
+               ns = timespec64_to_ns(&ts);
                ns = ns >> 1;
                if (on && ns <= 70000000LL) {
                        if (ns < 8LL)
                                return -EINVAL;
                        use_freq = 1;
                }
-               ts = ns_to_timespec(ns);
+               ts = ns_to_timespec64(ns);
                if (rq->perout.index == 1) {
                        if (use_freq) {
                                tsauxc_mask = TSAUXC_EN_CLK1 | TSAUXC_ST1;