q = &qs->txq[TXQ_ETH];
        txq = netdev_get_tx_queue(dev, qidx);
 
-       spin_lock(&q->lock);
        reclaim_completed_tx(adap, q, TX_RECLAIM_CHUNK);
 
        credits = q->size - q->in_use;
                dev_err(&adap->pdev->dev,
                        "%s: Tx ring %u full while queue awake!\n",
                        dev->name, q->cntxt_id & 7);
-               spin_unlock(&q->lock);
                return NETDEV_TX_BUSY;
        }
 
        if (vlan_tx_tag_present(skb) && pi->vlan_grp)
                qs->port_stats[SGE_PSTAT_VLANINS]++;
 
-       spin_unlock(&q->lock);
-
        /*
         * We do not use Tx completion interrupts to free DMAd Tx packets.
         * This is good for performamce but means that we rely on new Tx
        unsigned int tbd[SGE_TXQ_PER_SET] = {0, 0};
        unsigned long next_period;
 
-       if (spin_trylock(&qs->txq[TXQ_ETH].lock)) {
-               tbd[TXQ_ETH] = reclaim_completed_tx(adap, &qs->txq[TXQ_ETH],
-                                                   TX_RECLAIM_TIMER_CHUNK);
-               spin_unlock(&qs->txq[TXQ_ETH].lock);
+       if (__netif_tx_trylock(qs->tx_q)) {
+                tbd[TXQ_ETH] = reclaim_completed_tx(adap, &qs->txq[TXQ_ETH],
+                                                     TX_RECLAIM_TIMER_CHUNK);
+               __netif_tx_unlock(qs->tx_q);
        }
+
        if (spin_trylock(&qs->txq[TXQ_OFLD].lock)) {
                tbd[TXQ_OFLD] = reclaim_completed_tx(adap, &qs->txq[TXQ_OFLD],
                                                     TX_RECLAIM_TIMER_CHUNK);
        }
 
        next_period = TX_RECLAIM_PERIOD >>
-                     (max(tbd[TXQ_ETH], tbd[TXQ_OFLD]) /
-                      TX_RECLAIM_TIMER_CHUNK);
+                      (max(tbd[TXQ_ETH], tbd[TXQ_OFLD]) /
+                      TX_RECLAIM_TIMER_CHUNK);
        mod_timer(&qs->tx_reclaim_timer, jiffies + next_period);
 }