#include <linux/types.h>
 #include <linux/etherdevice.h>
+#include <linux/cpumask.h>
 #include <linux/rtnetlink.h>
 #include <linux/if_vlan.h>
 #include <linux/pci.h>
 enum fm10k_ring_state_t {
        __FM10K_TX_DETECT_HANG,
        __FM10K_HANG_CHECK_ARMED,
+       __FM10K_TX_XPS_INIT_DONE,
 };
 
 #define check_for_tx_hang(ring) \
        struct fm10k_ring_container rx, tx;
 
        struct napi_struct napi;
+       cpumask_t affinity_mask;
        char name[IFNAMSIZ + 9];
 
 #ifdef CONFIG_DEBUG_FS
 
        fm10k_write_reg(hw, FM10K_PFVTCTL(reg_idx),
                        FM10K_PFVTCTL_FTAG_DESC_ENABLE);
 
+       /* Initialize XPS */
+       if (!test_and_set_bit(__FM10K_TX_XPS_INIT_DONE, &ring->state) &&
+           ring->q_vector)
+               netif_set_xps_queue(ring->netdev,
+                                   &ring->q_vector->affinity_mask,
+                                   ring->queue_index);
+
        /* enable queue */
        fm10k_write_reg(hw, FM10K_TXDCTL(reg_idx), txdctl);
 }
                if (!q_vector->tx.count && !q_vector->rx.count)
                        continue;
 
-               /* disable interrupts */
+               /* clear the affinity_mask in the IRQ descriptor */
+               irq_set_affinity_hint(entry->vector, NULL);
 
+               /* disable interrupts */
                writel(FM10K_ITR_MASK_SET, q_vector->itr);
 
                free_irq(entry->vector, q_vector);
                        goto err_out;
                }
 
+               /* assign the mask for this irq */
+               irq_set_affinity_hint(entry->vector, &q_vector->affinity_mask);
+
                /* Enable q_vector */
                writel(FM10K_ITR_ENABLE, q_vector->itr);
 
                if (!q_vector->tx.count && !q_vector->rx.count)
                        continue;
 
-               /* disable interrupts */
+               /* clear the affinity_mask in the IRQ descriptor */
+               irq_set_affinity_hint(entry->vector, NULL);
 
+               /* disable interrupts */
                writel(FM10K_ITR_MASK_SET, q_vector->itr);
 
                free_irq(entry->vector, q_vector);