/** * ixgbe_set_fcoe_queues: Allocate queues for Fiber Channel over Ethernet (FCoE) * @adapter: board private structure to initialize * * FCoE RX FCRETA can use up to 8 rx queues for up to 8 different exchanges. * The ring feature mask is not used as a mask for FCoE, as it can take any 8 * rx queues out of the max number of rx queues, instead, it is used as the * index of the first rx queue used by FCoE. * **/ static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter) { struct ixgbe_ring_feature *f = &adapter->ring_feature[RING_F_FCOE]; if (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) return false; f->indices = min_t(int, num_online_cpus(), f->indices); adapter->num_rx_queues = 1; adapter->num_tx_queues = 1; if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { e_info(probe, "FCoE enabled with RSS\n"); if (adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ixgbe_set_fdir_queues(adapter); else ixgbe_set_rss_queues(adapter); } /* adding FCoE rx rings to the end */ f->mask = adapter->num_rx_queues; adapter->num_rx_queues += f->indices; adapter->num_tx_queues += f->indices; return true; }
/** * ixgbe_set_num_queues: Allocate queues for device, feature dependent * @adapter: board private structure to initialize * * This is the top level queue allocation routine. The order here is very * important, starting with the "most" number of features turned on at once, * and ending with the smallest set of features. This way large combinations * can be allocated if they're turned on, and smaller combinations are the * fallthrough conditions. * **/ static int ixgbe_set_num_queues(struct ixgbe_adapter *adapter) { /* Start with base case */ adapter->num_rx_queues = 1; adapter->num_tx_queues = 1; adapter->num_rx_pools = adapter->num_rx_queues; adapter->num_rx_queues_per_pool = 1; if (ixgbe_set_sriov_queues(adapter)) goto done; #ifdef CONFIG_IXGBE_DCB if (ixgbe_set_dcb_queues(adapter)) goto done; #endif #ifdef IXGBE_FCOE if (ixgbe_set_fcoe_queues(adapter)) goto done; #endif /* IXGBE_FCOE */ if (ixgbe_set_fdir_queues(adapter)) goto done; if (ixgbe_set_rss_queues(adapter)) goto done; /* fallback to base case */ adapter->num_rx_queues = 1; adapter->num_tx_queues = 1; done: if ((adapter->netdev->reg_state == NETREG_UNREGISTERED) || (adapter->netdev->reg_state == NETREG_UNREGISTERING)) return 0; /* Notify the stack of the (possibly) reduced queue counts. */ netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues); return netif_set_real_num_rx_queues(adapter->netdev, adapter->num_rx_queues); }
/** * ixgbe_set_num_queues - Allocate queues for device, feature dependent * @adapter: board private structure to initialize * * This is the top level queue allocation routine. The order here is very * important, starting with the "most" number of features turned on at once, * and ending with the smallest set of features. This way large combinations * can be allocated if they're turned on, and smaller combinations are the * fallthrough conditions. * **/ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) { /* Start with base case */ adapter->num_rx_queues = 1; adapter->num_tx_queues = 1; adapter->num_rx_pools = adapter->num_rx_queues; adapter->num_rx_queues_per_pool = 1; #ifdef CONFIG_IXGBE_DCB if (ixgbe_set_dcb_sriov_queues(adapter)) return; if (ixgbe_set_dcb_queues(adapter)) return; #endif if (ixgbe_set_sriov_queues(adapter)) return; ixgbe_set_rss_queues(adapter); }