mirror of https://gitee.com/openkylin/linux.git
ixgbe: Add support for displaying the number of Tx/Rx channels
This patch adds support for the ethtool get_channels operation. Since the ixgbe driver has to support DCB as well as the other modes the assumption I made here is that the number of channels in DCB modes refers to the number of queues per traffic class, not the number of queues total. Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Reviewed-by: John Fastabend <john.r.fastabend@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
cca73c59c4
commit
5348c9dbf3
|
@ -2731,6 +2731,77 @@ static int ixgbe_get_ts_info(struct net_device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static unsigned int ixgbe_max_channels(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
unsigned int max_combined;
|
||||
u8 tcs = netdev_get_num_tc(adapter->netdev);
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
|
||||
/* We only support one q_vector without MSI-X */
|
||||
max_combined = 1;
|
||||
} else if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED) {
|
||||
/* SR-IOV currently only allows one queue on the PF */
|
||||
max_combined = 1;
|
||||
} else if (tcs > 1) {
|
||||
/* For DCB report channels per traffic class */
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82598EB) {
|
||||
/* 8 TC w/ 4 queues per TC */
|
||||
max_combined = 4;
|
||||
} else if (tcs > 4) {
|
||||
/* 8 TC w/ 8 queues per TC */
|
||||
max_combined = 8;
|
||||
} else {
|
||||
/* 4 TC w/ 16 queues per TC */
|
||||
max_combined = 16;
|
||||
}
|
||||
} else if (adapter->atr_sample_rate) {
|
||||
/* support up to 64 queues with ATR */
|
||||
max_combined = IXGBE_MAX_FDIR_INDICES;
|
||||
} else {
|
||||
/* support up to 16 queues with RSS */
|
||||
max_combined = IXGBE_MAX_RSS_INDICES;
|
||||
}
|
||||
|
||||
return max_combined;
|
||||
}
|
||||
|
||||
static void ixgbe_get_channels(struct net_device *dev,
|
||||
struct ethtool_channels *ch)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(dev);
|
||||
|
||||
/* report maximum channels */
|
||||
ch->max_combined = ixgbe_max_channels(adapter);
|
||||
|
||||
/* report info for other vector */
|
||||
if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) {
|
||||
ch->max_other = NON_Q_VECTORS;
|
||||
ch->other_count = NON_Q_VECTORS;
|
||||
}
|
||||
|
||||
/* record RSS queues */
|
||||
ch->combined_count = adapter->ring_feature[RING_F_RSS].indices;
|
||||
|
||||
/* nothing else to report if RSS is disabled */
|
||||
if (ch->combined_count == 1)
|
||||
return;
|
||||
|
||||
/* we do not support ATR queueing if SR-IOV is enabled */
|
||||
if (adapter->flags & IXGBE_FLAG_SRIOV_ENABLED)
|
||||
return;
|
||||
|
||||
/* same thing goes for being DCB enabled */
|
||||
if (netdev_get_num_tc(dev) > 1)
|
||||
return;
|
||||
|
||||
/* if ATR is disabled we can exit */
|
||||
if (!adapter->atr_sample_rate)
|
||||
return;
|
||||
|
||||
/* report flow director queues as maximum channels */
|
||||
ch->combined_count = adapter->ring_feature[RING_F_FDIR].indices;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops ixgbe_ethtool_ops = {
|
||||
.get_settings = ixgbe_get_settings,
|
||||
.set_settings = ixgbe_set_settings,
|
||||
|
@ -2759,6 +2830,7 @@ static const struct ethtool_ops ixgbe_ethtool_ops = {
|
|||
.set_coalesce = ixgbe_set_coalesce,
|
||||
.get_rxnfc = ixgbe_get_rxnfc,
|
||||
.set_rxnfc = ixgbe_set_rxnfc,
|
||||
.get_channels = ixgbe_get_channels,
|
||||
.get_ts_info = ixgbe_get_ts_info,
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue