|
@@ -355,6 +355,34 @@ static int igb_ptp_settime_i210(struct ptp_clock_info *ptp,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int igb_ptp_feature_enable_i210(struct ptp_clock_info *ptp,
|
|
|
+ struct ptp_clock_request *rq, int on)
|
|
|
+{
|
|
|
+ struct igb_adapter *igb =
|
|
|
+ container_of(ptp, struct igb_adapter, ptp_caps);
|
|
|
+ struct e1000_hw *hw = &igb->hw;
|
|
|
+ unsigned long flags;
|
|
|
+ u32 tsim;
|
|
|
+
|
|
|
+ switch (rq->type) {
|
|
|
+ case PTP_CLK_REQ_PPS:
|
|
|
+ spin_lock_irqsave(&igb->tmreg_lock, flags);
|
|
|
+ tsim = rd32(E1000_TSIM);
|
|
|
+ if (on)
|
|
|
+ tsim |= TSINTR_SYS_WRAP;
|
|
|
+ else
|
|
|
+ tsim &= ~TSINTR_SYS_WRAP;
|
|
|
+ wr32(E1000_TSIM, tsim);
|
|
|
+ spin_unlock_irqrestore(&igb->tmreg_lock, flags);
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+}
|
|
|
+
|
|
|
static int igb_ptp_feature_enable(struct ptp_clock_info *ptp,
|
|
|
struct ptp_clock_request *rq, int on)
|
|
|
{
|
|
@@ -797,12 +825,12 @@ void igb_ptp_init(struct igb_adapter *adapter)
|
|
|
adapter->ptp_caps.owner = THIS_MODULE;
|
|
|
adapter->ptp_caps.max_adj = 62499999;
|
|
|
adapter->ptp_caps.n_ext_ts = 0;
|
|
|
- adapter->ptp_caps.pps = 0;
|
|
|
+ adapter->ptp_caps.pps = 1;
|
|
|
adapter->ptp_caps.adjfreq = igb_ptp_adjfreq_82580;
|
|
|
adapter->ptp_caps.adjtime = igb_ptp_adjtime_i210;
|
|
|
adapter->ptp_caps.gettime = igb_ptp_gettime_i210;
|
|
|
adapter->ptp_caps.settime = igb_ptp_settime_i210;
|
|
|
- adapter->ptp_caps.enable = igb_ptp_feature_enable;
|
|
|
+ adapter->ptp_caps.enable = igb_ptp_feature_enable_i210;
|
|
|
/* Enable the timer functions by clearing bit 31. */
|
|
|
wr32(E1000_TSAUXC, 0x0);
|
|
|
break;
|