void ixgbe_ptp_stop(struct ixgbe_adapter *adapter);
 void ixgbe_ptp_overflow_check(struct ixgbe_adapter *adapter);
 void ixgbe_ptp_rx_hang(struct ixgbe_adapter *adapter);
+void ixgbe_ptp_tx_hang(struct ixgbe_adapter *adapter);
 void ixgbe_ptp_rx_pktstamp(struct ixgbe_q_vector *, struct sk_buff *);
 void ixgbe_ptp_rx_rgtstamp(struct ixgbe_q_vector *, struct sk_buff *skb);
 static inline void ixgbe_ptp_rx_hwtstamp(struct ixgbe_ring *rx_ring,
 
        if (test_bit(__IXGBE_PTP_RUNNING, &adapter->state)) {
                ixgbe_ptp_overflow_check(adapter);
                ixgbe_ptp_rx_hang(adapter);
+               ixgbe_ptp_tx_hang(adapter);
        }
 
        ixgbe_service_event_complete(adapter);
 
        clear_bit_unlock(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state);
 }
 
+/**
+ * ixgbe_ptp_tx_hang - detect error case where Tx timestamp never finishes
+ * @adapter: private network adapter structure
+ */
+void ixgbe_ptp_tx_hang(struct ixgbe_adapter *adapter)
+{
+       bool timeout = time_is_before_jiffies(adapter->ptp_tx_start +
+                                             IXGBE_PTP_TX_TIMEOUT);
+
+       if (!adapter->ptp_tx_skb)
+               return;
+
+       if (!test_bit(__IXGBE_PTP_TX_IN_PROGRESS, &adapter->state))
+               return;
+
+       /* If we haven't received a timestamp within the timeout, it is
+        * reasonable to assume that it will never occur, so we can unlock the
+        * timestamp bit when this occurs.
+        */
+       if (timeout) {
+               cancel_work_sync(&adapter->ptp_tx_work);
+               ixgbe_ptp_clear_tx_timestamp(adapter);
+               adapter->tx_hwtstamp_timeouts++;
+               e_warn(drv, "clearing Tx timestamp hang\n");
+       }
+}
+
 /**
  * ixgbe_ptp_tx_hwtstamp - utility function which checks for TX time stamp
  * @adapter: the private adapter struct