Commit 504b0fdf authored by Jacob Keller's avatar Jacob Keller Committed by Jeff Kirsher

fm10k: initialize xps at driver load

Similar to ixgbe and i40e, initialize XPS on driver load so that we can
take advantage of this kernel feature.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Reviewed-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Tested-by: default avatarKrishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 3d02b3df
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/cpumask.h>
#include <linux/rtnetlink.h> #include <linux/rtnetlink.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -66,6 +67,7 @@ struct fm10k_l2_accel { ...@@ -66,6 +67,7 @@ struct fm10k_l2_accel {
enum fm10k_ring_state_t { enum fm10k_ring_state_t {
__FM10K_TX_DETECT_HANG, __FM10K_TX_DETECT_HANG,
__FM10K_HANG_CHECK_ARMED, __FM10K_HANG_CHECK_ARMED,
__FM10K_TX_XPS_INIT_DONE,
}; };
#define check_for_tx_hang(ring) \ #define check_for_tx_hang(ring) \
...@@ -209,6 +211,7 @@ struct fm10k_q_vector { ...@@ -209,6 +211,7 @@ struct fm10k_q_vector {
struct fm10k_ring_container rx, tx; struct fm10k_ring_container rx, tx;
struct napi_struct napi; struct napi_struct napi;
cpumask_t affinity_mask;
char name[IFNAMSIZ + 9]; char name[IFNAMSIZ + 9];
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
......
...@@ -601,6 +601,13 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface, ...@@ -601,6 +601,13 @@ static void fm10k_configure_tx_ring(struct fm10k_intfc *interface,
fm10k_write_reg(hw, FM10K_PFVTCTL(reg_idx), fm10k_write_reg(hw, FM10K_PFVTCTL(reg_idx),
FM10K_PFVTCTL_FTAG_DESC_ENABLE); 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 */ /* enable queue */
fm10k_write_reg(hw, FM10K_TXDCTL(reg_idx), txdctl); fm10k_write_reg(hw, FM10K_TXDCTL(reg_idx), txdctl);
} }
...@@ -1488,8 +1495,10 @@ void fm10k_qv_free_irq(struct fm10k_intfc *interface) ...@@ -1488,8 +1495,10 @@ void fm10k_qv_free_irq(struct fm10k_intfc *interface)
if (!q_vector->tx.count && !q_vector->rx.count) if (!q_vector->tx.count && !q_vector->rx.count)
continue; 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); writel(FM10K_ITR_MASK_SET, q_vector->itr);
free_irq(entry->vector, q_vector); free_irq(entry->vector, q_vector);
...@@ -1547,6 +1556,9 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface) ...@@ -1547,6 +1556,9 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
goto err_out; goto err_out;
} }
/* assign the mask for this irq */
irq_set_affinity_hint(entry->vector, &q_vector->affinity_mask);
/* Enable q_vector */ /* Enable q_vector */
writel(FM10K_ITR_ENABLE, q_vector->itr); writel(FM10K_ITR_ENABLE, q_vector->itr);
...@@ -1567,8 +1579,10 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface) ...@@ -1567,8 +1579,10 @@ int fm10k_qv_request_irq(struct fm10k_intfc *interface)
if (!q_vector->tx.count && !q_vector->rx.count) if (!q_vector->tx.count && !q_vector->rx.count)
continue; 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); writel(FM10K_ITR_MASK_SET, q_vector->itr);
free_irq(entry->vector, q_vector); free_irq(entry->vector, q_vector);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment