static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)
 {
        int pin = ptp_find_pin(adapter->ptp_clock, PTP_PF_EXTTS, tsintr_tt);
+       int auxstmpl = (tsintr_tt == 1) ? E1000_AUXSTMPL1 : E1000_AUXSTMPL0;
+       int auxstmph = (tsintr_tt == 1) ? E1000_AUXSTMPH1 : E1000_AUXSTMPH0;
        struct e1000_hw *hw = &adapter->hw;
        struct ptp_clock_event event;
-       u32 sec, nsec;
+       struct timespec64 ts;
 
        if (pin < 0 || pin >= IGB_N_EXTTS)
                return;
 
-       nsec = rd32((tsintr_tt == 1) ? E1000_AUXSTMPL1 : E1000_AUXSTMPL0);
-       sec  = rd32((tsintr_tt == 1) ? E1000_AUXSTMPH1 : E1000_AUXSTMPH0);
+       if (hw->mac.type == e1000_82580 ||
+           hw->mac.type == e1000_i354 ||
+           hw->mac.type == e1000_i350) {
+               s64 ns = rd32(auxstmpl);
+
+               ns += ((s64)(rd32(auxstmph) & 0xFF)) << 32;
+               ts = ns_to_timespec64(ns);
+       } else {
+               ts.tv_nsec = rd32(auxstmpl);
+               ts.tv_sec  = rd32(auxstmph);
+       }
+
        event.type = PTP_CLOCK_EXTTS;
        event.index = tsintr_tt;
-       event.timestamp = sec * 1000000000ULL + nsec;
+       event.timestamp = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
        ptp_clock_event(adapter->ptp_clock, &event);
 }
 
 
 
        switch (rq->type) {
        case PTP_CLK_REQ_EXTTS:
-               return -EOPNOTSUPP;
+               /* Reject requests with unsupported flags */
+               if (rq->extts.flags & ~(PTP_ENABLE_FEATURE |
+                                       PTP_RISING_EDGE |
+                                       PTP_FALLING_EDGE |
+                                       PTP_STRICT_FLAGS))
+                       return -EOPNOTSUPP;
+
+               if (on) {
+                       pin = ptp_find_pin(igb->ptp_clock, PTP_PF_EXTTS,
+                                          rq->extts.index);
+                       if (pin < 0)
+                               return -EBUSY;
+               }
+               if (rq->extts.index == 1) {
+                       tsauxc_mask = TSAUXC_EN_TS1;
+                       tsim_mask = TSINTR_AUTT1;
+               } else {
+                       tsauxc_mask = TSAUXC_EN_TS0;
+                       tsim_mask = TSINTR_AUTT0;
+               }
+               spin_lock_irqsave(&igb->tmreg_lock, flags);
+               tsauxc = rd32(E1000_TSAUXC);
+               tsim = rd32(E1000_TSIM);
+               if (on) {
+                       igb_pin_extts(igb, rq->extts.index, pin);
+                       tsauxc |= tsauxc_mask;
+                       tsim |= tsim_mask;
+               } else {
+                       tsauxc &= ~tsauxc_mask;
+                       tsim &= ~tsim_mask;
+               }
+               wr32(E1000_TSAUXC, tsauxc);
+               wr32(E1000_TSIM, tsim);
+               spin_unlock_irqrestore(&igb->tmreg_lock, flags);
+               return 0;
 
        case PTP_CLK_REQ_PEROUT:
                /* Reject requests with unsupported flags */