Skip to content

Commit

Permalink
sfc: Remove filter table IDs from filter functions
Browse files Browse the repository at this point in the history
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: Ben Hutchings <bhutchings@solarflare.com>
  • Loading branch information
Ben Hutchings committed Dec 7, 2010
1 parent ac33ac6 commit 8891681
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 25 deletions.
5 changes: 2 additions & 3 deletions drivers/net/sfc/efx.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,8 @@ 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,
enum efx_filter_priority priority);
extern void efx_filter_clear_rx(struct efx_nic *efx,
enum efx_filter_priority priority);

/* Channels */
extern void efx_process_channel_now(struct efx_channel *channel);
Expand Down
8 changes: 2 additions & 6 deletions drivers/net/sfc/ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
40 changes: 30 additions & 10 deletions drivers/net/sfc/filter.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -206,14 +212,22 @@ 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
* @spec: Specification for the filter
* @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,
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -340,15 +355,9 @@ 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,
enum efx_filter_table_id table_id,
enum efx_filter_priority priority)
static void efx_filter_table_clear(struct efx_nic *efx,
enum efx_filter_table_id table_id,
enum efx_filter_priority priority)
{
struct efx_filter_state *state = efx->filter_state;
struct efx_filter_table *table = &state->table[table_id];
Expand All @@ -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)
{
Expand Down
6 changes: 0 additions & 6 deletions drivers/net/sfc/filter.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 8891681

Please sign in to comment.