ixgbevf: enable multiple queue support
authorEmil Tantilov <emil.s.tantilov@intel.com>
Sat, 6 Dec 2014 09:19:02 +0000 (09:19 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 6 Feb 2015 03:57:46 +0000 (19:57 -0800)
This patch enables multiple queues and RSS support for the VF.
Maximum of 2 queues are supported due to available vectors.

Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
Tested-by: Krishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c

index 8c44ab25f3fa7100b3c0c351c75b0733b4c6bcd6..65cda344eec92ab0fbca7f9b5e18b259c555a8c0 100644 (file)
@@ -124,6 +124,7 @@ struct ixgbevf_ring {
 
 #define MAX_RX_QUEUES IXGBE_VF_MAX_RX_QUEUES
 #define MAX_TX_QUEUES IXGBE_VF_MAX_TX_QUEUES
+#define IXGBEVF_MAX_RSS_QUEUES 2
 
 #define IXGBEVF_DEFAULT_TXD   1024
 #define IXGBEVF_DEFAULT_RXD   512
index fe2e10f40df80421ba814f323ac70b9143a4db8f..92154ee87b42ddf8f9b201ca78c29de6366a1437 100644 (file)
@@ -1794,7 +1794,8 @@ static int ixgbevf_configure_dcb(struct ixgbevf_adapter *adapter)
        struct ixgbe_hw *hw = &adapter->hw;
        unsigned int def_q = 0;
        unsigned int num_tcs = 0;
-       unsigned int num_rx_queues = 1;
+       unsigned int num_rx_queues = adapter->num_rx_queues;
+       unsigned int num_tx_queues = adapter->num_tx_queues;
        int err;
 
        spin_lock_bh(&adapter->mbx_lock);
@@ -1808,6 +1809,9 @@ static int ixgbevf_configure_dcb(struct ixgbevf_adapter *adapter)
                return err;
 
        if (num_tcs > 1) {
+               /* we need only one Tx queue */
+               num_tx_queues = 1;
+
                /* update default Tx ring register index */
                adapter->tx_ring[0]->reg_idx = def_q;
 
@@ -1816,7 +1820,8 @@ static int ixgbevf_configure_dcb(struct ixgbevf_adapter *adapter)
        }
 
        /* if we have a bad config abort request queue reset */
-       if (adapter->num_rx_queues != num_rx_queues) {
+       if ((adapter->num_rx_queues != num_rx_queues) ||
+           (adapter->num_tx_queues != num_tx_queues)) {
                /* force mailbox timeout to prevent further messages */
                hw->mbx.timeout = 0;
 
@@ -2181,8 +2186,19 @@ static void ixgbevf_set_num_queues(struct ixgbevf_adapter *adapter)
                return;
 
        /* we need as many queues as traffic classes */
-       if (num_tcs > 1)
+       if (num_tcs > 1) {
                adapter->num_rx_queues = num_tcs;
+       } else {
+               u16 rss = min_t(u16, num_online_cpus(), IXGBEVF_MAX_RSS_QUEUES);
+
+               switch (hw->api_version) {
+               case ixgbe_mbox_api_11:
+                       adapter->num_rx_queues = rss;
+                       adapter->num_tx_queues = rss;
+               default:
+                       break;
+               }
+       }
 }
 
 /**