Skip to content

Commit 7374426

Browse files
shifty91anguy11
authored andcommitted
igc: Make flex filter more flexible
Currently flex filters are only used for filters containing user data. However, it makes sense to utilize them also for filters having multiple conditions, because that's not supported by the driver at the moment. Add it. Signed-off-by: Kurt Kanzenbach <kurt@linutronix.de> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com> Tested-by: Dvora Fuxbrumer <dvorax.fuxbrumer@linux.intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
1 parent 7991487 commit 7374426

File tree

3 files changed

+22
-20
lines changed

3 files changed

+22
-20
lines changed

drivers/net/ethernet/intel/igc/igc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ struct igc_nfc_rule {
507507
struct igc_nfc_filter filter;
508508
u32 location;
509509
u16 action;
510+
bool flex;
510511
};
511512

512513
/* IGC supports a total of 32 NFC rules: 16 MAC address based, 8 VLAN priority

drivers/net/ethernet/intel/igc/igc_ethtool.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,19 +1222,29 @@ static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule,
12221222
fsp->h_u.ether_spec.h_dest);
12231223
}
12241224

1225+
/* VLAN etype matching */
1226+
if ((fsp->flow_type & FLOW_EXT) && fsp->h_ext.vlan_etype) {
1227+
rule->filter.vlan_etype = fsp->h_ext.vlan_etype;
1228+
rule->filter.match_flags |= IGC_FILTER_FLAG_VLAN_ETYPE;
1229+
}
1230+
12251231
/* Check for user defined data */
12261232
if ((fsp->flow_type & FLOW_EXT) &&
12271233
(fsp->h_ext.data[0] || fsp->h_ext.data[1])) {
12281234
rule->filter.match_flags |= IGC_FILTER_FLAG_USER_DATA;
12291235
memcpy(rule->filter.user_data, fsp->h_ext.data, sizeof(fsp->h_ext.data));
12301236
memcpy(rule->filter.user_mask, fsp->m_ext.data, sizeof(fsp->m_ext.data));
1231-
1232-
/* VLAN etype matching is only valid using flex filter */
1233-
if ((fsp->flow_type & FLOW_EXT) && fsp->h_ext.vlan_etype) {
1234-
rule->filter.vlan_etype = fsp->h_ext.vlan_etype;
1235-
rule->filter.match_flags |= IGC_FILTER_FLAG_VLAN_ETYPE;
1236-
}
12371237
}
1238+
1239+
/* When multiple filter options or user data or vlan etype is set, use a
1240+
* flex filter.
1241+
*/
1242+
if ((rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA) ||
1243+
(rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_ETYPE) ||
1244+
(rule->filter.match_flags & (rule->filter.match_flags - 1)))
1245+
rule->flex = true;
1246+
else
1247+
rule->flex = false;
12381248
}
12391249

12401250
/**
@@ -1264,11 +1274,6 @@ static int igc_ethtool_check_nfc_rule(struct igc_adapter *adapter,
12641274
return -EINVAL;
12651275
}
12661276

1267-
if (flags & (flags - 1)) {
1268-
netdev_dbg(dev, "Rule with multiple matches not supported\n");
1269-
return -EOPNOTSUPP;
1270-
}
1271-
12721277
list_for_each_entry(tmp, &adapter->nfc_rule_list, list) {
12731278
if (!memcmp(&rule->filter, &tmp->filter,
12741279
sizeof(rule->filter)) &&

drivers/net/ethernet/intel/igc/igc_main.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3385,14 +3385,8 @@ static int igc_enable_nfc_rule(struct igc_adapter *adapter,
33853385
{
33863386
int err;
33873387

3388-
/* Check for user data first: When user data is set, the only option is
3389-
* to use a flex filter. When more options are set (ethertype, vlan tci,
3390-
* ...) construct a flex filter matching all of that.
3391-
*/
3392-
if (rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA) {
3393-
err = igc_add_flex_filter(adapter, rule);
3394-
if (err)
3395-
return err;
3388+
if (rule->flex) {
3389+
return igc_add_flex_filter(adapter, rule);
33963390
}
33973391

33983392
if (rule->filter.match_flags & IGC_FILTER_FLAG_ETHER_TYPE) {
@@ -3431,8 +3425,10 @@ static int igc_enable_nfc_rule(struct igc_adapter *adapter,
34313425
static void igc_disable_nfc_rule(struct igc_adapter *adapter,
34323426
const struct igc_nfc_rule *rule)
34333427
{
3434-
if (rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA)
3428+
if (rule->flex) {
34353429
igc_del_flex_filter(adapter, rule->filter.flex_index);
3430+
return;
3431+
}
34363432

34373433
if (rule->filter.match_flags & IGC_FILTER_FLAG_ETHER_TYPE)
34383434
igc_del_etype_filter(adapter, rule->filter.etype);

0 commit comments

Comments
 (0)