ixgbe_reinit_locked(adapter);
 }
 
-static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
+#ifdef CONFIG_IXGBE_DCB
+static inline bool ixgbe_set_dcb_queues(struct ixgbe_adapter *adapter)
 {
-       int nrq = 1, ntq = 1;
-       int feature_mask = 0, rss_i, rss_m;
-       int dcb_i, dcb_m;
+       bool ret = false;
 
-       /* Number of supported queues */
-       switch (adapter->hw.mac.type) {
-       case ixgbe_mac_82598EB:
-               dcb_i = adapter->ring_feature[RING_F_DCB].indices;
-               dcb_m = 0;
-               rss_i = adapter->ring_feature[RING_F_RSS].indices;
-               rss_m = 0;
-               feature_mask |= IXGBE_FLAG_RSS_ENABLED;
-               feature_mask |= IXGBE_FLAG_DCB_ENABLED;
-
-               switch (adapter->flags & feature_mask) {
-               case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED):
-                       dcb_m = 0x7 << 3;
-                       rss_i = min(8, rss_i);
-                       rss_m = 0x7;
-                       nrq = dcb_i * rss_i;
-                       ntq = min(MAX_TX_QUEUES, dcb_i * rss_i);
-                       break;
-               case (IXGBE_FLAG_DCB_ENABLED):
-                       dcb_m = 0x7 << 3;
-                       nrq = dcb_i;
-                       ntq = dcb_i;
-                       break;
-               case (IXGBE_FLAG_RSS_ENABLED):
-                       rss_m = 0xF;
-                       nrq = rss_i;
-                       ntq = rss_i;
-                       break;
-               case 0:
-               default:
-                       dcb_i = 0;
-                       dcb_m = 0;
-                       rss_i = 0;
-                       rss_m = 0;
-                       nrq = 1;
-                       ntq = 1;
-                       break;
-               }
+       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
+               adapter->ring_feature[RING_F_DCB].mask = 0x7 << 3;
+               adapter->num_rx_queues =
+                                     adapter->ring_feature[RING_F_DCB].indices;
+               adapter->num_tx_queues =
+                                     adapter->ring_feature[RING_F_DCB].indices;
+               ret = true;
+       } else {
+               adapter->ring_feature[RING_F_DCB].mask = 0;
+               adapter->ring_feature[RING_F_DCB].indices = 0;
+               ret = false;
+       }
 
-               /* Sanity check, we should never have zero queues */
-               nrq = (nrq ?:1);
-               ntq = (ntq ?:1);
+       return ret;
+}
+#endif
 
-               adapter->ring_feature[RING_F_DCB].indices = dcb_i;
-               adapter->ring_feature[RING_F_DCB].mask = dcb_m;
-               adapter->ring_feature[RING_F_RSS].indices = rss_i;
-               adapter->ring_feature[RING_F_RSS].mask = rss_m;
-               break;
-       default:
-               nrq = 1;
-               ntq = 1;
-               break;
+static inline bool ixgbe_set_rss_queues(struct ixgbe_adapter *adapter)
+{
+       bool ret = false;
+
+       if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
+               adapter->ring_feature[RING_F_RSS].mask = 0xF;
+               adapter->num_rx_queues =
+                                     adapter->ring_feature[RING_F_RSS].indices;
+               adapter->num_tx_queues =
+                                     adapter->ring_feature[RING_F_RSS].indices;
+               ret = true;
+       } else {
+               adapter->ring_feature[RING_F_RSS].mask = 0;
+               adapter->ring_feature[RING_F_RSS].indices = 0;
+               ret = false;
        }
 
-       adapter->num_rx_queues = nrq;
-       adapter->num_tx_queues = ntq;
+       return ret;
+}
+
+static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter)
+{
+       /* Start with base case */
+       adapter->num_rx_queues = 1;
+       adapter->num_tx_queues = 1;
+
+#ifdef CONFIG_IXGBE_DCB
+       if (ixgbe_set_dcb_queues(adapter))
+               return;
+
+#endif
+       if (ixgbe_set_rss_queues(adapter))
+               return;
 }
 
 static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter,
 }
 
 /**
- * ixgbe_cache_ring_register - Descriptor ring to register mapping
+ * ixgbe_cache_ring_rss - Descriptor ring to register mapping for RSS
  * @adapter: board private structure to initialize
  *
- * Once we know the feature-set enabled for the device, we'll cache
- * the register offset the descriptor ring is assigned to.
+ * Cache the descriptor ring offsets for RSS to the assigned rings.
+ *
  **/
-static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
+static inline bool ixgbe_cache_ring_rss(struct ixgbe_adapter *adapter)
 {
-       int feature_mask = 0, rss_i;
-       int i, txr_idx, rxr_idx;
-       int dcb_i;
+       int i;
+       bool ret = false;
 
-       /* Number of supported queues */
-       switch (adapter->hw.mac.type) {
-       case ixgbe_mac_82598EB:
-               dcb_i = adapter->ring_feature[RING_F_DCB].indices;
-               rss_i = adapter->ring_feature[RING_F_RSS].indices;
-               txr_idx = 0;
-               rxr_idx = 0;
-               feature_mask |= IXGBE_FLAG_DCB_ENABLED;
-               feature_mask |= IXGBE_FLAG_RSS_ENABLED;
-               switch (adapter->flags & feature_mask) {
-               case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED):
-                       for (i = 0; i < dcb_i; i++) {
-                               int j;
-                               /* Rx first */
-                               for (j = 0; j < adapter->num_rx_queues; j++) {
-                                       adapter->rx_ring[rxr_idx].reg_idx =
-                                               i << 3 | j;
-                                       rxr_idx++;
-                               }
-                               /* Tx now */
-                               for (j = 0; j < adapter->num_tx_queues; j++) {
-                                       adapter->tx_ring[txr_idx].reg_idx =
-                                               i << 2 | (j >> 1);
-                                       if (j & 1)
-                                               txr_idx++;
-                               }
-                       }
-               case (IXGBE_FLAG_DCB_ENABLED):
+       if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
+               for (i = 0; i < adapter->num_rx_queues; i++)
+                       adapter->rx_ring[i].reg_idx = i;
+               for (i = 0; i < adapter->num_tx_queues; i++)
+                       adapter->tx_ring[i].reg_idx = i;
+               ret = true;
+       } else {
+               ret = false;
+       }
+
+       return ret;
+}
+
+#ifdef CONFIG_IXGBE_DCB
+/**
+ * ixgbe_cache_ring_dcb - Descriptor ring to register mapping for DCB
+ * @adapter: board private structure to initialize
+ *
+ * Cache the descriptor ring offsets for DCB to the assigned rings.
+ *
+ **/
+static inline bool ixgbe_cache_ring_dcb(struct ixgbe_adapter *adapter)
+{
+       int i;
+       bool ret = false;
+       int dcb_i = adapter->ring_feature[RING_F_DCB].indices;
+
+       if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
+               if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
                        /* the number of queues is assumed to be symmetric */
                        for (i = 0; i < dcb_i; i++) {
                                adapter->rx_ring[i].reg_idx = i << 3;
                                adapter->tx_ring[i].reg_idx = i << 2;
                        }
-                       break;
-               case (IXGBE_FLAG_RSS_ENABLED):
-                       for (i = 0; i < adapter->num_rx_queues; i++)
-                               adapter->rx_ring[i].reg_idx = i;
-                       for (i = 0; i < adapter->num_tx_queues; i++)
-                               adapter->tx_ring[i].reg_idx = i;
-                       break;
-               case 0:
-               default:
-                       break;
+                       ret = true;
+               } else {
+                       ret = false;
                }
-               break;
-       default:
-               break;
+       } else {
+               ret = false;
        }
+
+       return ret;
+}
+#endif
+
+/**
+ * ixgbe_cache_ring_register - Descriptor ring to register mapping
+ * @adapter: board private structure to initialize
+ *
+ * Once we know the feature-set enabled for the device, we'll cache
+ * the register offset the descriptor ring is assigned to.
+ *
+ * Note, the order the various feature calls is important.  It must start with
+ * the "most" features enabled at the same time, then trickle down to the
+ * least amount of features turned on at once.
+ **/
+static void ixgbe_cache_ring_register(struct ixgbe_adapter *adapter)
+{
+       /* start with default case */
+       adapter->rx_ring[0].reg_idx = 0;
+       adapter->tx_ring[0].reg_idx = 0;
+
+#ifdef CONFIG_IXGBE_DCB
+       if (ixgbe_cache_ring_dcb(adapter))
+               return;
+
+#endif
+       if (ixgbe_cache_ring_rss(adapter))
+               return;
 }
 
 /**