Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8891681a authored by Ben Hutchings's avatar Ben Hutchings
Browse files

sfc: Remove filter table IDs from filter functions



The separation between filter tables is largely an internal detail
and it may be removed in future hardware.  To prepare for that:

- Merge table ID with filter index to make an opaque filter ID
- Wrap efx_filter_table_clear() with a function that clears filters
  from both RX tables, which is all that the current caller requires

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent ac33ac61
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -74,8 +74,7 @@ extern int efx_filter_insert_filter(struct efx_nic *efx,
				    bool replace);
extern int efx_filter_remove_filter(struct efx_nic *efx,
				    struct efx_filter_spec *spec);
extern void efx_filter_table_clear(struct efx_nic *efx,
				   enum efx_filter_table_id table_id,
extern void efx_filter_clear_rx(struct efx_nic *efx,
				enum efx_filter_priority priority);

/* Channels */
+2 −6
Original line number Diff line number Diff line
@@ -558,12 +558,8 @@ static int efx_ethtool_set_flags(struct net_device *net_dev, u32 data)
	if (rc)
		return rc;

	if (!(data & ETH_FLAG_NTUPLE)) {
		efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_IP,
				       EFX_FILTER_PRI_MANUAL);
		efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_MAC,
				       EFX_FILTER_PRI_MANUAL);
	}
	if (!(data & ETH_FLAG_NTUPLE))
		efx_filter_clear_rx(efx, EFX_FILTER_PRI_MANUAL);

	return 0;
}
+30 −10
Original line number Diff line number Diff line
@@ -26,6 +26,12 @@
 */
#define FILTER_CTL_SRCH_MAX 200

enum efx_filter_table_id {
	EFX_FILTER_TABLE_RX_IP = 0,
	EFX_FILTER_TABLE_RX_MAC,
	EFX_FILTER_TABLE_COUNT,
};

struct efx_filter_table {
	u32		offset;		/* address of table relative to BAR */
	unsigned	size;		/* number of entries */
@@ -206,6 +212,14 @@ static int efx_filter_search(struct efx_filter_table *table,
	return filter_idx;
}

/* Construct/deconstruct external filter IDs */

static inline int
efx_filter_make_id(enum efx_filter_table_id table_id, unsigned index)
{
	return table_id << 16 | index;
}

/**
 * efx_filter_insert_filter - add or replace a filter
 * @efx: NIC in which to insert the filter
@@ -213,7 +227,7 @@ static int efx_filter_search(struct efx_filter_table *table,
 * @replace: Flag for whether the specified filter may replace a filter
 *	with an identical match expression and equal or lower priority
 *
 * On success, return the filter index within its table.
 * On success, return the filter ID.
 * On failure, return a negative error code.
 */
int efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
@@ -273,6 +287,7 @@ int efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
	netif_vdbg(efx, hw, efx->net_dev,
		   "%s: filter type %d index %d rxq %u set",
		   __func__, spec->type, filter_idx, spec->dmaq_id);
	rc = efx_filter_make_id(table_id, filter_idx);

out:
	spin_unlock_bh(&state->lock);
@@ -340,13 +355,7 @@ int efx_filter_remove_filter(struct efx_nic *efx, struct efx_filter_spec *spec)
	return rc;
}

/**
 * efx_filter_table_clear - remove filters from a table by priority
 * @efx: NIC from which to remove the filters
 * @table_id: Table from which to remove the filters
 * @priority: Maximum priority to remove
 */
void efx_filter_table_clear(struct efx_nic *efx,
static void efx_filter_table_clear(struct efx_nic *efx,
				   enum efx_filter_table_id table_id,
				   enum efx_filter_priority priority)
{
@@ -365,6 +374,17 @@ void efx_filter_table_clear(struct efx_nic *efx,
	spin_unlock_bh(&state->lock);
}

/**
 * efx_filter_clear_rx - remove RX filters by priority
 * @efx: NIC from which to remove the filters
 * @priority: Maximum priority to remove
 */
void efx_filter_clear_rx(struct efx_nic *efx, enum efx_filter_priority priority)
{
	efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_IP, priority);
	efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_MAC, priority);
}

/* Restore filter stater after reset */
void efx_restore_filters(struct efx_nic *efx)
{
+0 −6
Original line number Diff line number Diff line
@@ -12,12 +12,6 @@

#include <linux/types.h>

enum efx_filter_table_id {
	EFX_FILTER_TABLE_RX_IP = 0,
	EFX_FILTER_TABLE_RX_MAC,
	EFX_FILTER_TABLE_COUNT,
};

/**
 * enum efx_filter_type - type of hardware filter
 * @EFX_FILTER_RX_TCP_FULL: RX, matching TCP/IPv4 4-tuple