(in_tstamp >> 8) & mask);
 }
 
+/**
+ * ice_ptp_is_tx_tracker_up - Check if Tx tracker is ready for new timestamps
+ * @tx: the PTP Tx timestamp tracker to check
+ *
+ * Check that a given PTP Tx timestamp tracker is up, i.e. that it is ready
+ * to accept new timestamp requests.
+ *
+ * Assumes the tx->lock spinlock is already held.
+ */
+static bool
+ice_ptp_is_tx_tracker_up(struct ice_ptp_tx *tx)
+{
+       lockdep_assert_held(&tx->lock);
+
+       return tx->init && !tx->calibrating;
+}
+
 /**
  * ice_ptp_tx_tstamp - Process Tx timestamps for a port
  * @tx: the PTP Tx timestamp tracker
                return -ENOMEM;
        }
 
-       spin_lock_init(&tx->lock);
-
        tx->init = 1;
 
+       spin_lock_init(&tx->lock);
+
        return 0;
 }
 
 static void
 ice_ptp_release_tx_tracker(struct ice_pf *pf, struct ice_ptp_tx *tx)
 {
+       spin_lock(&tx->lock);
        tx->init = 0;
+       spin_unlock(&tx->lock);
 
        /* wait for potentially outstanding interrupt to complete */
        synchronize_irq(pf->msix_entries[pf->oicr_idx].vector);
        kthread_cancel_delayed_work_sync(&ptp_port->ov_work);
 
        /* temporarily disable Tx timestamps while calibrating PHY offset */
+       spin_lock(&ptp_port->tx.lock);
        ptp_port->tx.calibrating = true;
+       spin_unlock(&ptp_port->tx.lock);
        ptp_port->tx_fifo_busy_cnt = 0;
 
        /* Start the PHY timer in Vernier mode */
                goto out_unlock;
 
        /* Enable Tx timestamps right away */
+       spin_lock(&ptp_port->tx.lock);
        ptp_port->tx.calibrating = false;
+       spin_unlock(&ptp_port->tx.lock);
 
        kthread_queue_delayed_work(pf->ptp.kworker, &ptp_port->ov_work, 0);
 
 {
        u8 idx;
 
-       /* Check if this tracker is initialized */
-       if (!tx->init || tx->calibrating)
+       spin_lock(&tx->lock);
+
+       /* Check that this tracker is accepting new timestamp requests */
+       if (!ice_ptp_is_tx_tracker_up(tx)) {
+               spin_unlock(&tx->lock);
                return -1;
+       }
 
-       spin_lock(&tx->lock);
        /* Find and set the first available index */
        idx = find_first_zero_bit(tx->in_use, tx->len);
        if (idx < tx->len) {