Skip to content

Commit e089129

Browse files
Alexander DuyckJeff Kirsher
authored andcommitted
igb: Add support for ethtool private flag to allow use of legacy Rx
Since there are potential drawbacks to the new Rx allocation approach I thought it best to add a "chicken bit" so that we can turn the feature off if in the event that a problem is found. It also provides a means of validating the legacy Rx path in the event that we are forced to fall back. At some point in the future when we are convinced we don't need it anymore we might be able to drop the legacy-rx flag. Signed-off-by: Alexander Duyck <[email protected]> Tested-by: Aaron Brown <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent 3456fd5 commit e089129

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

drivers/net/ethernet/intel/igb/igb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ struct igb_adapter {
557557
#define IGB_FLAG_HAS_MSIX BIT(13)
558558
#define IGB_FLAG_EEE BIT(14)
559559
#define IGB_FLAG_VLAN_PROMISC BIT(15)
560+
#define IGB_FLAG_RX_LEGACY BIT(16)
560561

561562
/* Media Auto Sense */
562563
#define IGB_MAS_ENABLE_0 0X0001

drivers/net/ethernet/intel/igb/igb_ethtool.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ static const char igb_gstrings_test[][ETH_GSTRING_LEN] = {
144144
};
145145
#define IGB_TEST_LEN (sizeof(igb_gstrings_test) / ETH_GSTRING_LEN)
146146

147+
static const char igb_priv_flags_strings[][ETH_GSTRING_LEN] = {
148+
#define IGB_PRIV_FLAGS_LEGACY_RX BIT(0)
149+
"legacy-rx",
150+
};
151+
152+
#define IGB_PRIV_FLAGS_STR_LEN ARRAY_SIZE(igb_priv_flags_strings)
153+
147154
static int igb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
148155
{
149156
struct igb_adapter *adapter = netdev_priv(netdev);
@@ -852,6 +859,8 @@ static void igb_get_drvinfo(struct net_device *netdev,
852859
sizeof(drvinfo->fw_version));
853860
strlcpy(drvinfo->bus_info, pci_name(adapter->pdev),
854861
sizeof(drvinfo->bus_info));
862+
863+
drvinfo->n_priv_flags = IGB_PRIV_FLAGS_STR_LEN;
855864
}
856865

857866
static void igb_get_ringparam(struct net_device *netdev,
@@ -2280,6 +2289,8 @@ static int igb_get_sset_count(struct net_device *netdev, int sset)
22802289
return IGB_STATS_LEN;
22812290
case ETH_SS_TEST:
22822291
return IGB_TEST_LEN;
2292+
case ETH_SS_PRIV_FLAGS:
2293+
return IGB_PRIV_FLAGS_STR_LEN;
22832294
default:
22842295
return -ENOTSUPP;
22852296
}
@@ -2385,6 +2396,10 @@ static void igb_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
23852396
}
23862397
/* BUG_ON(p - data != IGB_STATS_LEN * ETH_GSTRING_LEN); */
23872398
break;
2399+
case ETH_SS_PRIV_FLAGS:
2400+
memcpy(data, igb_priv_flags_strings,
2401+
IGB_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN);
2402+
break;
23882403
}
23892404
}
23902405

@@ -3397,6 +3412,37 @@ static int igb_set_channels(struct net_device *netdev,
33973412
return 0;
33983413
}
33993414

3415+
static u32 igb_get_priv_flags(struct net_device *netdev)
3416+
{
3417+
struct igb_adapter *adapter = netdev_priv(netdev);
3418+
u32 priv_flags = 0;
3419+
3420+
if (adapter->flags & IGB_FLAG_RX_LEGACY)
3421+
priv_flags |= IGB_PRIV_FLAGS_LEGACY_RX;
3422+
3423+
return priv_flags;
3424+
}
3425+
3426+
static int igb_set_priv_flags(struct net_device *netdev, u32 priv_flags)
3427+
{
3428+
struct igb_adapter *adapter = netdev_priv(netdev);
3429+
unsigned int flags = adapter->flags;
3430+
3431+
flags &= ~IGB_FLAG_RX_LEGACY;
3432+
if (priv_flags & IGB_PRIV_FLAGS_LEGACY_RX)
3433+
flags |= IGB_FLAG_RX_LEGACY;
3434+
3435+
if (flags != adapter->flags) {
3436+
adapter->flags = flags;
3437+
3438+
/* reset interface to repopulate queues */
3439+
if (netif_running(netdev))
3440+
igb_reinit_locked(adapter);
3441+
}
3442+
3443+
return 0;
3444+
}
3445+
34003446
static const struct ethtool_ops igb_ethtool_ops = {
34013447
.get_settings = igb_get_settings,
34023448
.set_settings = igb_set_settings,
@@ -3435,6 +3481,8 @@ static const struct ethtool_ops igb_ethtool_ops = {
34353481
.set_rxfh = igb_set_rxfh,
34363482
.get_channels = igb_get_channels,
34373483
.set_channels = igb_set_channels,
3484+
.get_priv_flags = igb_get_priv_flags,
3485+
.set_priv_flags = igb_set_priv_flags,
34383486
.begin = igb_ethtool_begin,
34393487
.complete = igb_ethtool_complete,
34403488
};

0 commit comments

Comments
 (0)