ixgbe: Add upper limit to ring features
authorAlexander Duyck <alexander.h.duyck@intel.com>
Thu, 10 May 2012 00:01:46 +0000 (00:01 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 11 Jul 2012 08:53:21 +0000 (01:53 -0700)
We are currently using indices to indicate the upper limit on a ring
feature.  However since we can switch back and forth on features such as
DCB and that has effects on other features such as RSS it is preferable to
instead store the upper limit separate from the current value for the
number of rings related to the feature.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_fcoe.c
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 24cd510e8e86a7e93be3ae0d1e54a07a640a1ddb..ae3da83560ac9c0fd1597b7ba84468f2213a020a 100644 (file)
@@ -278,7 +278,8 @@ enum ixgbe_ring_f_enum {
 #define MAX_TX_QUEUES IXGBE_MAX_FDIR_INDICES
 #endif /* IXGBE_FCOE */
 struct ixgbe_ring_feature {
-       int indices;
+       u16 limit;      /* upper limit on feature indices */
+       u16 indices;    /* current value of indices */
        int mask;
 } ____cacheline_internodealigned_in_smp;
 
index 0ee4dbf4a752907ab7625f34ace60cf3a947bb63..b4da760bd5f0cc0200b05bad5bec4963192af58b 100644 (file)
@@ -770,7 +770,7 @@ int ixgbe_fcoe_enable(struct net_device *netdev)
        ixgbe_clear_interrupt_scheme(adapter);
 
        adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
-       adapter->ring_feature[RING_F_FCOE].indices = IXGBE_FCRETA_SIZE;
+       adapter->ring_feature[RING_F_FCOE].limit = IXGBE_FCRETA_SIZE;
        netdev->features |= NETIF_F_FCOE_CRC;
        netdev->features |= NETIF_F_FSO;
        netdev->features |= NETIF_F_FCOE_MTU;
index 39a80d2bec9cb0c59619ab65e8beb91d1321ef8a..b64588a81b8b2af06a6198fd66549b6e78f0e42f 100644 (file)
@@ -302,7 +302,7 @@ static inline bool ixgbe_set_fdir_queues(struct ixgbe_adapter *adapter)
        bool ret = false;
        struct ixgbe_ring_feature *f_fdir = &adapter->ring_feature[RING_F_FDIR];
 
-       f_fdir->indices = min_t(int, num_online_cpus(), f_fdir->indices);
+       f_fdir->indices = min_t(int, num_online_cpus(), f_fdir->limit);
        f_fdir->mask = 0;
 
        /*
@@ -339,7 +339,7 @@ static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter)
        if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
                return false;
 
-       f->indices = min_t(int, num_online_cpus(), f->indices);
+       f->indices = min_t(int, num_online_cpus(), f->limit);
 
        adapter->num_rx_queues = 1;
        adapter->num_tx_queues = 1;
index 903d1653516e455beeabc862a3cfa3f70d689bfd..8e83f15d2550848019fb71ef88ad0d00fd2b2e78 100644 (file)
@@ -4386,7 +4386,7 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
 
        /* Set capability flags */
        rss = min_t(int, IXGBE_MAX_RSS_INDICES, num_online_cpus());
-       adapter->ring_feature[RING_F_RSS].indices = rss;
+       adapter->ring_feature[RING_F_RSS].limit = rss;
        adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
        switch (hw->mac.type) {
        case ixgbe_mac_82598EB:
@@ -4405,13 +4405,12 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                /* Flow Director hash filters enabled */
                adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
                adapter->atr_sample_rate = 20;
-               adapter->ring_feature[RING_F_FDIR].indices =
+               adapter->ring_feature[RING_F_FDIR].limit =
                                                         IXGBE_MAX_FDIR_INDICES;
                adapter->fdir_pballoc = IXGBE_FDIR_PBALLOC_64K;
 #ifdef IXGBE_FCOE
                adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE;
                adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
-               adapter->ring_feature[RING_F_FCOE].indices = 0;
 #ifdef CONFIG_IXGBE_DCB
                /* Default traffic class to use for FCoE */
                adapter->fcoe.up = IXGBE_FCOE_DEFTC;
@@ -6206,8 +6205,14 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)
        if (((protocol == htons(ETH_P_FCOE)) ||
            (protocol == htons(ETH_P_FIP))) &&
            (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) {
-               txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1);
+               struct ixgbe_ring_feature *f;
+
+               f = &adapter->ring_feature[RING_F_FCOE];
+
+               while (txq >= f->indices)
+                       txq -= f->indices;
                txq += adapter->ring_feature[RING_F_FCOE].mask;
+
                return txq;
        }
 #endif