1 /****************************************************************************
2  * Driver for Solarflare Solarstorm network controllers and boards
3  * Copyright 2005-2010 Solarflare Communications Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published
7  * by the Free Software Foundation, incorporated herein by reference.
8  */
9 
10 #include <linux/in.h>
11 #include <net/ip.h>
12 #include "efx.h"
13 #include "filter.h"
14 #include "io.h"
15 #include "nic.h"
16 #include "regs.h"
17 
18 /* "Fudge factors" - difference between programmed value and actual depth.
19  * Due to pipelined implementation we need to program H/W with a value that
20  * is larger than the hop limit we want.
21  */
22 #define FILTER_CTL_SRCH_FUDGE_WILD 3
23 #define FILTER_CTL_SRCH_FUDGE_FULL 1
24 
25 /* Hard maximum hop limit.  Hardware will time-out beyond 200-something.
26  * We also need to avoid infinite loops in efx_filter_search() when the
27  * table is full.
28  */
29 #define FILTER_CTL_SRCH_MAX 200
30 
31 /* Don't try very hard to find space for performance hints, as this is
32  * counter-productive. */
33 #define FILTER_CTL_SRCH_HINT_MAX 5
34 
35 enum efx_filter_table_id {
36 	EFX_FILTER_TABLE_RX_IP = 0,
37 	EFX_FILTER_TABLE_RX_MAC,
38 	EFX_FILTER_TABLE_COUNT,
39 };
40 
41 struct efx_filter_table {
42 	enum efx_filter_table_id id;
43 	u32		offset;		/* address of table relative to BAR */
44 	unsigned	size;		/* number of entries */
45 	unsigned	step;		/* step between entries */
46 	unsigned	used;		/* number currently used */
47 	unsigned long	*used_bitmap;
48 	struct efx_filter_spec *spec;
49 	unsigned	search_depth[EFX_FILTER_TYPE_COUNT];
50 };
51 
52 struct efx_filter_state {
53 	spinlock_t	lock;
54 	struct efx_filter_table table[EFX_FILTER_TABLE_COUNT];
55 #ifdef CONFIG_RFS_ACCEL
56 	u32		*rps_flow_id;
57 	unsigned	rps_expire_index;
58 #endif
59 };
60 
61 /* The filter hash function is LFSR polynomial x^16 + x^3 + 1 of a 32-bit
62  * key derived from the n-tuple.  The initial LFSR state is 0xffff. */
efx_filter_hash(u32 key)63 static u16 efx_filter_hash(u32 key)
64 {
65 	u16 tmp;
66 
67 	/* First 16 rounds */
68 	tmp = 0x1fff ^ key >> 16;
69 	tmp = tmp ^ tmp >> 3 ^ tmp >> 6;
70 	tmp = tmp ^ tmp >> 9;
71 	/* Last 16 rounds */
72 	tmp = tmp ^ tmp << 13 ^ key;
73 	tmp = tmp ^ tmp >> 3 ^ tmp >> 6;
74 	return tmp ^ tmp >> 9;
75 }
76 
77 /* To allow for hash collisions, filter search continues at these
78  * increments from the first possible entry selected by the hash. */
efx_filter_increment(u32 key)79 static u16 efx_filter_increment(u32 key)
80 {
81 	return key * 2 - 1;
82 }
83 
84 static enum efx_filter_table_id
efx_filter_spec_table_id(const struct efx_filter_spec * spec)85 efx_filter_spec_table_id(const struct efx_filter_spec *spec)
86 {
87 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_IP != (EFX_FILTER_TCP_FULL >> 2));
88 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_IP != (EFX_FILTER_TCP_WILD >> 2));
89 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_IP != (EFX_FILTER_UDP_FULL >> 2));
90 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_IP != (EFX_FILTER_UDP_WILD >> 2));
91 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_MAC != (EFX_FILTER_MAC_FULL >> 2));
92 	BUILD_BUG_ON(EFX_FILTER_TABLE_RX_MAC != (EFX_FILTER_MAC_WILD >> 2));
93 	EFX_BUG_ON_PARANOID(spec->type == EFX_FILTER_UNSPEC);
94 	return spec->type >> 2;
95 }
96 
97 static struct efx_filter_table *
efx_filter_spec_table(struct efx_filter_state * state,const struct efx_filter_spec * spec)98 efx_filter_spec_table(struct efx_filter_state *state,
99 		      const struct efx_filter_spec *spec)
100 {
101 	if (spec->type == EFX_FILTER_UNSPEC)
102 		return NULL;
103 	else
104 		return &state->table[efx_filter_spec_table_id(spec)];
105 }
106 
efx_filter_table_reset_search_depth(struct efx_filter_table * table)107 static void efx_filter_table_reset_search_depth(struct efx_filter_table *table)
108 {
109 	memset(table->search_depth, 0, sizeof(table->search_depth));
110 }
111 
efx_filter_push_rx_limits(struct efx_nic * efx)112 static void efx_filter_push_rx_limits(struct efx_nic *efx)
113 {
114 	struct efx_filter_state *state = efx->filter_state;
115 	struct efx_filter_table *table;
116 	efx_oword_t filter_ctl;
117 
118 	efx_reado(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL);
119 
120 	table = &state->table[EFX_FILTER_TABLE_RX_IP];
121 	EFX_SET_OWORD_FIELD(filter_ctl, FRF_BZ_TCP_FULL_SRCH_LIMIT,
122 			    table->search_depth[EFX_FILTER_TCP_FULL] +
123 			    FILTER_CTL_SRCH_FUDGE_FULL);
124 	EFX_SET_OWORD_FIELD(filter_ctl, FRF_BZ_TCP_WILD_SRCH_LIMIT,
125 			    table->search_depth[EFX_FILTER_TCP_WILD] +
126 			    FILTER_CTL_SRCH_FUDGE_WILD);
127 	EFX_SET_OWORD_FIELD(filter_ctl, FRF_BZ_UDP_FULL_SRCH_LIMIT,
128 			    table->search_depth[EFX_FILTER_UDP_FULL] +
129 			    FILTER_CTL_SRCH_FUDGE_FULL);
130 	EFX_SET_OWORD_FIELD(filter_ctl, FRF_BZ_UDP_WILD_SRCH_LIMIT,
131 			    table->search_depth[EFX_FILTER_UDP_WILD] +
132 			    FILTER_CTL_SRCH_FUDGE_WILD);
133 
134 	table = &state->table[EFX_FILTER_TABLE_RX_MAC];
135 	if (table->size) {
136 		EFX_SET_OWORD_FIELD(
137 			filter_ctl, FRF_CZ_ETHERNET_FULL_SEARCH_LIMIT,
138 			table->search_depth[EFX_FILTER_MAC_FULL] +
139 			FILTER_CTL_SRCH_FUDGE_FULL);
140 		EFX_SET_OWORD_FIELD(
141 			filter_ctl, FRF_CZ_ETHERNET_WILDCARD_SEARCH_LIMIT,
142 			table->search_depth[EFX_FILTER_MAC_WILD] +
143 			FILTER_CTL_SRCH_FUDGE_WILD);
144 	}
145 
146 	efx_writeo(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL);
147 }
148 
__efx_filter_set_ipv4(struct efx_filter_spec * spec,__be32 host1,__be16 port1,__be32 host2,__be16 port2)149 static inline void __efx_filter_set_ipv4(struct efx_filter_spec *spec,
150 					 __be32 host1, __be16 port1,
151 					 __be32 host2, __be16 port2)
152 {
153 	spec->data[0] = ntohl(host1) << 16 | ntohs(port1);
154 	spec->data[1] = ntohs(port2) << 16 | ntohl(host1) >> 16;
155 	spec->data[2] = ntohl(host2);
156 }
157 
__efx_filter_get_ipv4(const struct efx_filter_spec * spec,__be32 * host1,__be16 * port1,__be32 * host2,__be16 * port2)158 static inline void __efx_filter_get_ipv4(const struct efx_filter_spec *spec,
159 					 __be32 *host1, __be16 *port1,
160 					 __be32 *host2, __be16 *port2)
161 {
162 	*host1 = htonl(spec->data[0] >> 16 | spec->data[1] << 16);
163 	*port1 = htons(spec->data[0]);
164 	*host2 = htonl(spec->data[2]);
165 	*port2 = htons(spec->data[1] >> 16);
166 }
167 
168 /**
169  * efx_filter_set_ipv4_local - specify IPv4 host, transport protocol and port
170  * @spec: Specification to initialise
171  * @proto: Transport layer protocol number
172  * @host: Local host address (network byte order)
173  * @port: Local port (network byte order)
174  */
efx_filter_set_ipv4_local(struct efx_filter_spec * spec,u8 proto,__be32 host,__be16 port)175 int efx_filter_set_ipv4_local(struct efx_filter_spec *spec, u8 proto,
176 			      __be32 host, __be16 port)
177 {
178 	__be32 host1;
179 	__be16 port1;
180 
181 	EFX_BUG_ON_PARANOID(!(spec->flags & EFX_FILTER_FLAG_RX));
182 
183 	/* This cannot currently be combined with other filtering */
184 	if (spec->type != EFX_FILTER_UNSPEC)
185 		return -EPROTONOSUPPORT;
186 
187 	if (port == 0)
188 		return -EINVAL;
189 
190 	switch (proto) {
191 	case IPPROTO_TCP:
192 		spec->type = EFX_FILTER_TCP_WILD;
193 		break;
194 	case IPPROTO_UDP:
195 		spec->type = EFX_FILTER_UDP_WILD;
196 		break;
197 	default:
198 		return -EPROTONOSUPPORT;
199 	}
200 
201 	/* Filter is constructed in terms of source and destination,
202 	 * with the odd wrinkle that the ports are swapped in a UDP
203 	 * wildcard filter.  We need to convert from local and remote
204 	 * (= zero for wildcard) addresses.
205 	 */
206 	host1 = 0;
207 	if (proto != IPPROTO_UDP) {
208 		port1 = 0;
209 	} else {
210 		port1 = port;
211 		port = 0;
212 	}
213 
214 	__efx_filter_set_ipv4(spec, host1, port1, host, port);
215 	return 0;
216 }
217 
efx_filter_get_ipv4_local(const struct efx_filter_spec * spec,u8 * proto,__be32 * host,__be16 * port)218 int efx_filter_get_ipv4_local(const struct efx_filter_spec *spec,
219 			      u8 *proto, __be32 *host, __be16 *port)
220 {
221 	__be32 host1;
222 	__be16 port1;
223 
224 	switch (spec->type) {
225 	case EFX_FILTER_TCP_WILD:
226 		*proto = IPPROTO_TCP;
227 		__efx_filter_get_ipv4(spec, &host1, &port1, host, port);
228 		return 0;
229 	case EFX_FILTER_UDP_WILD:
230 		*proto = IPPROTO_UDP;
231 		__efx_filter_get_ipv4(spec, &host1, port, host, &port1);
232 		return 0;
233 	default:
234 		return -EINVAL;
235 	}
236 }
237 
238 /**
239  * efx_filter_set_ipv4_full - specify IPv4 hosts, transport protocol and ports
240  * @spec: Specification to initialise
241  * @proto: Transport layer protocol number
242  * @host: Local host address (network byte order)
243  * @port: Local port (network byte order)
244  * @rhost: Remote host address (network byte order)
245  * @rport: Remote port (network byte order)
246  */
efx_filter_set_ipv4_full(struct efx_filter_spec * spec,u8 proto,__be32 host,__be16 port,__be32 rhost,__be16 rport)247 int efx_filter_set_ipv4_full(struct efx_filter_spec *spec, u8 proto,
248 			     __be32 host, __be16 port,
249 			     __be32 rhost, __be16 rport)
250 {
251 	EFX_BUG_ON_PARANOID(!(spec->flags & EFX_FILTER_FLAG_RX));
252 
253 	/* This cannot currently be combined with other filtering */
254 	if (spec->type != EFX_FILTER_UNSPEC)
255 		return -EPROTONOSUPPORT;
256 
257 	if (port == 0 || rport == 0)
258 		return -EINVAL;
259 
260 	switch (proto) {
261 	case IPPROTO_TCP:
262 		spec->type = EFX_FILTER_TCP_FULL;
263 		break;
264 	case IPPROTO_UDP:
265 		spec->type = EFX_FILTER_UDP_FULL;
266 		break;
267 	default:
268 		return -EPROTONOSUPPORT;
269 	}
270 
271 	__efx_filter_set_ipv4(spec, rhost, rport, host, port);
272 	return 0;
273 }
274 
efx_filter_get_ipv4_full(const struct efx_filter_spec * spec,u8 * proto,__be32 * host,__be16 * port,__be32 * rhost,__be16 * rport)275 int efx_filter_get_ipv4_full(const struct efx_filter_spec *spec,
276 			     u8 *proto, __be32 *host, __be16 *port,
277 			     __be32 *rhost, __be16 *rport)
278 {
279 	switch (spec->type) {
280 	case EFX_FILTER_TCP_FULL:
281 		*proto = IPPROTO_TCP;
282 		break;
283 	case EFX_FILTER_UDP_FULL:
284 		*proto = IPPROTO_UDP;
285 		break;
286 	default:
287 		return -EINVAL;
288 	}
289 
290 	__efx_filter_get_ipv4(spec, rhost, rport, host, port);
291 	return 0;
292 }
293 
294 /**
295  * efx_filter_set_eth_local - specify local Ethernet address and optional VID
296  * @spec: Specification to initialise
297  * @vid: VLAN ID to match, or %EFX_FILTER_VID_UNSPEC
298  * @addr: Local Ethernet MAC address
299  */
efx_filter_set_eth_local(struct efx_filter_spec * spec,u16 vid,const u8 * addr)300 int efx_filter_set_eth_local(struct efx_filter_spec *spec,
301 			     u16 vid, const u8 *addr)
302 {
303 	EFX_BUG_ON_PARANOID(!(spec->flags & EFX_FILTER_FLAG_RX));
304 
305 	/* This cannot currently be combined with other filtering */
306 	if (spec->type != EFX_FILTER_UNSPEC)
307 		return -EPROTONOSUPPORT;
308 
309 	if (vid == EFX_FILTER_VID_UNSPEC) {
310 		spec->type = EFX_FILTER_MAC_WILD;
311 		spec->data[0] = 0;
312 	} else {
313 		spec->type = EFX_FILTER_MAC_FULL;
314 		spec->data[0] = vid;
315 	}
316 
317 	spec->data[1] = addr[2] << 24 | addr[3] << 16 | addr[4] << 8 | addr[5];
318 	spec->data[2] = addr[0] << 8 | addr[1];
319 	return 0;
320 }
321 
efx_filter_get_eth_local(const struct efx_filter_spec * spec,u16 * vid,u8 * addr)322 int efx_filter_get_eth_local(const struct efx_filter_spec *spec,
323 			     u16 *vid, u8 *addr)
324 {
325 	switch (spec->type) {
326 	case EFX_FILTER_MAC_WILD:
327 		*vid = EFX_FILTER_VID_UNSPEC;
328 		break;
329 	case EFX_FILTER_MAC_FULL:
330 		*vid = spec->data[0];
331 		break;
332 	default:
333 		return -EINVAL;
334 	}
335 
336 	addr[0] = spec->data[2] >> 8;
337 	addr[1] = spec->data[2];
338 	addr[2] = spec->data[1] >> 24;
339 	addr[3] = spec->data[1] >> 16;
340 	addr[4] = spec->data[1] >> 8;
341 	addr[5] = spec->data[1];
342 	return 0;
343 }
344 
345 /* Build a filter entry and return its n-tuple key. */
efx_filter_build(efx_oword_t * filter,struct efx_filter_spec * spec)346 static u32 efx_filter_build(efx_oword_t *filter, struct efx_filter_spec *spec)
347 {
348 	u32 data3;
349 
350 	switch (efx_filter_spec_table_id(spec)) {
351 	case EFX_FILTER_TABLE_RX_IP: {
352 		bool is_udp = (spec->type == EFX_FILTER_UDP_FULL ||
353 			       spec->type == EFX_FILTER_UDP_WILD);
354 		EFX_POPULATE_OWORD_7(
355 			*filter,
356 			FRF_BZ_RSS_EN,
357 			!!(spec->flags & EFX_FILTER_FLAG_RX_RSS),
358 			FRF_BZ_SCATTER_EN,
359 			!!(spec->flags & EFX_FILTER_FLAG_RX_SCATTER),
360 			FRF_BZ_TCP_UDP, is_udp,
361 			FRF_BZ_RXQ_ID, spec->dmaq_id,
362 			EFX_DWORD_2, spec->data[2],
363 			EFX_DWORD_1, spec->data[1],
364 			EFX_DWORD_0, spec->data[0]);
365 		data3 = is_udp;
366 		break;
367 	}
368 
369 	case EFX_FILTER_TABLE_RX_MAC: {
370 		bool is_wild = spec->type == EFX_FILTER_MAC_WILD;
371 		EFX_POPULATE_OWORD_8(
372 			*filter,
373 			FRF_CZ_RMFT_RSS_EN,
374 			!!(spec->flags & EFX_FILTER_FLAG_RX_RSS),
375 			FRF_CZ_RMFT_SCATTER_EN,
376 			!!(spec->flags & EFX_FILTER_FLAG_RX_SCATTER),
377 			FRF_CZ_RMFT_IP_OVERRIDE,
378 			!!(spec->flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP),
379 			FRF_CZ_RMFT_RXQ_ID, spec->dmaq_id,
380 			FRF_CZ_RMFT_WILDCARD_MATCH, is_wild,
381 			FRF_CZ_RMFT_DEST_MAC_HI, spec->data[2],
382 			FRF_CZ_RMFT_DEST_MAC_LO, spec->data[1],
383 			FRF_CZ_RMFT_VLAN_ID, spec->data[0]);
384 		data3 = is_wild;
385 		break;
386 	}
387 
388 	default:
389 		BUG();
390 	}
391 
392 	return spec->data[0] ^ spec->data[1] ^ spec->data[2] ^ data3;
393 }
394 
efx_filter_equal(const struct efx_filter_spec * left,const struct efx_filter_spec * right)395 static bool efx_filter_equal(const struct efx_filter_spec *left,
396 			     const struct efx_filter_spec *right)
397 {
398 	if (left->type != right->type ||
399 	    memcmp(left->data, right->data, sizeof(left->data)))
400 		return false;
401 
402 	return true;
403 }
404 
efx_filter_search(struct efx_filter_table * table,struct efx_filter_spec * spec,u32 key,bool for_insert,unsigned int * depth_required)405 static int efx_filter_search(struct efx_filter_table *table,
406 			     struct efx_filter_spec *spec, u32 key,
407 			     bool for_insert, unsigned int *depth_required)
408 {
409 	unsigned hash, incr, filter_idx, depth, depth_max;
410 
411 	hash = efx_filter_hash(key);
412 	incr = efx_filter_increment(key);
413 
414 	filter_idx = hash & (table->size - 1);
415 	depth = 1;
416 	depth_max = (for_insert ?
417 		     (spec->priority <= EFX_FILTER_PRI_HINT ?
418 		      FILTER_CTL_SRCH_HINT_MAX : FILTER_CTL_SRCH_MAX) :
419 		     table->search_depth[spec->type]);
420 
421 	for (;;) {
422 		/* Return success if entry is used and matches this spec
423 		 * or entry is unused and we are trying to insert.
424 		 */
425 		if (test_bit(filter_idx, table->used_bitmap) ?
426 		    efx_filter_equal(spec, &table->spec[filter_idx]) :
427 		    for_insert) {
428 			*depth_required = depth;
429 			return filter_idx;
430 		}
431 
432 		/* Return failure if we reached the maximum search depth */
433 		if (depth == depth_max)
434 			return for_insert ? -EBUSY : -ENOENT;
435 
436 		filter_idx = (filter_idx + incr) & (table->size - 1);
437 		++depth;
438 	}
439 }
440 
441 /*
442  * Construct/deconstruct external filter IDs.  These must be ordered
443  * by matching priority, for RX NFC semantics.
444  *
445  * Each RX MAC filter entry has a flag for whether it can override an
446  * RX IP filter that also matches.  So we assign locations for MAC
447  * filters with overriding behaviour, then for IP filters, then for
448  * MAC filters without overriding behaviour.
449  */
450 
451 #define EFX_FILTER_INDEX_WIDTH	13
452 #define EFX_FILTER_INDEX_MASK	((1 << EFX_FILTER_INDEX_WIDTH) - 1)
453 
efx_filter_make_id(enum efx_filter_table_id table_id,unsigned int index,u8 flags)454 static inline u32 efx_filter_make_id(enum efx_filter_table_id table_id,
455 				     unsigned int index, u8 flags)
456 {
457 	return (table_id == EFX_FILTER_TABLE_RX_MAC &&
458 		flags & EFX_FILTER_FLAG_RX_OVERRIDE_IP) ?
459 		index :
460 		(table_id + 1) << EFX_FILTER_INDEX_WIDTH | index;
461 }
462 
efx_filter_id_table_id(u32 id)463 static inline enum efx_filter_table_id efx_filter_id_table_id(u32 id)
464 {
465 	return (id <= EFX_FILTER_INDEX_MASK) ?
466 		EFX_FILTER_TABLE_RX_MAC :
467 		(id >> EFX_FILTER_INDEX_WIDTH) - 1;
468 }
469 
efx_filter_id_index(u32 id)470 static inline unsigned int efx_filter_id_index(u32 id)
471 {
472 	return id & EFX_FILTER_INDEX_MASK;
473 }
474 
efx_filter_id_flags(u32 id)475 static inline u8 efx_filter_id_flags(u32 id)
476 {
477 	return (id <= EFX_FILTER_INDEX_MASK) ?
478 		EFX_FILTER_FLAG_RX | EFX_FILTER_FLAG_RX_OVERRIDE_IP :
479 		EFX_FILTER_FLAG_RX;
480 }
481 
efx_filter_get_rx_id_limit(struct efx_nic * efx)482 u32 efx_filter_get_rx_id_limit(struct efx_nic *efx)
483 {
484 	struct efx_filter_state *state = efx->filter_state;
485 
486 	if (state->table[EFX_FILTER_TABLE_RX_MAC].size != 0)
487 		return ((EFX_FILTER_TABLE_RX_MAC + 1) << EFX_FILTER_INDEX_WIDTH)
488 			+ state->table[EFX_FILTER_TABLE_RX_MAC].size;
489 	else if (state->table[EFX_FILTER_TABLE_RX_IP].size != 0)
490 		return ((EFX_FILTER_TABLE_RX_IP + 1) << EFX_FILTER_INDEX_WIDTH)
491 			+ state->table[EFX_FILTER_TABLE_RX_IP].size;
492 	else
493 		return 0;
494 }
495 
496 /**
497  * efx_filter_insert_filter - add or replace a filter
498  * @efx: NIC in which to insert the filter
499  * @spec: Specification for the filter
500  * @replace: Flag for whether the specified filter may replace a filter
501  *	with an identical match expression and equal or lower priority
502  *
503  * On success, return the filter ID.
504  * On failure, return a negative error code.
505  */
efx_filter_insert_filter(struct efx_nic * efx,struct efx_filter_spec * spec,bool replace)506 s32 efx_filter_insert_filter(struct efx_nic *efx, struct efx_filter_spec *spec,
507 			     bool replace)
508 {
509 	struct efx_filter_state *state = efx->filter_state;
510 	struct efx_filter_table *table = efx_filter_spec_table(state, spec);
511 	struct efx_filter_spec *saved_spec;
512 	efx_oword_t filter;
513 	unsigned int filter_idx, depth;
514 	u32 key;
515 	int rc;
516 
517 	if (!table || table->size == 0)
518 		return -EINVAL;
519 
520 	key = efx_filter_build(&filter, spec);
521 
522 	netif_vdbg(efx, hw, efx->net_dev,
523 		   "%s: type %d search_depth=%d", __func__, spec->type,
524 		   table->search_depth[spec->type]);
525 
526 	spin_lock_bh(&state->lock);
527 
528 	rc = efx_filter_search(table, spec, key, true, &depth);
529 	if (rc < 0)
530 		goto out;
531 	filter_idx = rc;
532 	BUG_ON(filter_idx >= table->size);
533 	saved_spec = &table->spec[filter_idx];
534 
535 	if (test_bit(filter_idx, table->used_bitmap)) {
536 		/* Should we replace the existing filter? */
537 		if (!replace) {
538 			rc = -EEXIST;
539 			goto out;
540 		}
541 		if (spec->priority < saved_spec->priority) {
542 			rc = -EPERM;
543 			goto out;
544 		}
545 	} else {
546 		__set_bit(filter_idx, table->used_bitmap);
547 		++table->used;
548 	}
549 	*saved_spec = *spec;
550 
551 	if (table->search_depth[spec->type] < depth) {
552 		table->search_depth[spec->type] = depth;
553 		efx_filter_push_rx_limits(efx);
554 	}
555 
556 	efx_writeo(efx, &filter, table->offset + table->step * filter_idx);
557 
558 	netif_vdbg(efx, hw, efx->net_dev,
559 		   "%s: filter type %d index %d rxq %u set",
560 		   __func__, spec->type, filter_idx, spec->dmaq_id);
561 	rc = efx_filter_make_id(table->id, filter_idx, spec->flags);
562 
563 out:
564 	spin_unlock_bh(&state->lock);
565 	return rc;
566 }
567 
efx_filter_table_clear_entry(struct efx_nic * efx,struct efx_filter_table * table,unsigned int filter_idx)568 static void efx_filter_table_clear_entry(struct efx_nic *efx,
569 					 struct efx_filter_table *table,
570 					 unsigned int filter_idx)
571 {
572 	static efx_oword_t filter;
573 
574 	if (test_bit(filter_idx, table->used_bitmap)) {
575 		__clear_bit(filter_idx, table->used_bitmap);
576 		--table->used;
577 		memset(&table->spec[filter_idx], 0, sizeof(table->spec[0]));
578 
579 		efx_writeo(efx, &filter,
580 			   table->offset + table->step * filter_idx);
581 	}
582 }
583 
584 /**
585  * efx_filter_remove_id_safe - remove a filter by ID, carefully
586  * @efx: NIC from which to remove the filter
587  * @priority: Priority of filter, as passed to @efx_filter_insert_filter
588  * @filter_id: ID of filter, as returned by @efx_filter_insert_filter
589  *
590  * This function will range-check @filter_id, so it is safe to call
591  * with a value passed from userland.
592  */
efx_filter_remove_id_safe(struct efx_nic * efx,enum efx_filter_priority priority,u32 filter_id)593 int efx_filter_remove_id_safe(struct efx_nic *efx,
594 			      enum efx_filter_priority priority,
595 			      u32 filter_id)
596 {
597 	struct efx_filter_state *state = efx->filter_state;
598 	enum efx_filter_table_id table_id;
599 	struct efx_filter_table *table;
600 	unsigned int filter_idx;
601 	struct efx_filter_spec *spec;
602 	u8 filter_flags;
603 	int rc;
604 
605 	table_id = efx_filter_id_table_id(filter_id);
606 	if ((unsigned int)table_id >= EFX_FILTER_TABLE_COUNT)
607 		return -ENOENT;
608 	table = &state->table[table_id];
609 
610 	filter_idx = efx_filter_id_index(filter_id);
611 	if (filter_idx >= table->size)
612 		return -ENOENT;
613 	spec = &table->spec[filter_idx];
614 
615 	filter_flags = efx_filter_id_flags(filter_id);
616 
617 	spin_lock_bh(&state->lock);
618 
619 	if (test_bit(filter_idx, table->used_bitmap) &&
620 	    spec->priority == priority && spec->flags == filter_flags) {
621 		efx_filter_table_clear_entry(efx, table, filter_idx);
622 		if (table->used == 0)
623 			efx_filter_table_reset_search_depth(table);
624 		rc = 0;
625 	} else {
626 		rc = -ENOENT;
627 	}
628 
629 	spin_unlock_bh(&state->lock);
630 
631 	return rc;
632 }
633 
634 /**
635  * efx_filter_get_filter_safe - retrieve a filter by ID, carefully
636  * @efx: NIC from which to remove the filter
637  * @priority: Priority of filter, as passed to @efx_filter_insert_filter
638  * @filter_id: ID of filter, as returned by @efx_filter_insert_filter
639  * @spec: Buffer in which to store filter specification
640  *
641  * This function will range-check @filter_id, so it is safe to call
642  * with a value passed from userland.
643  */
efx_filter_get_filter_safe(struct efx_nic * efx,enum efx_filter_priority priority,u32 filter_id,struct efx_filter_spec * spec_buf)644 int efx_filter_get_filter_safe(struct efx_nic *efx,
645 			       enum efx_filter_priority priority,
646 			       u32 filter_id, struct efx_filter_spec *spec_buf)
647 {
648 	struct efx_filter_state *state = efx->filter_state;
649 	enum efx_filter_table_id table_id;
650 	struct efx_filter_table *table;
651 	struct efx_filter_spec *spec;
652 	unsigned int filter_idx;
653 	u8 filter_flags;
654 	int rc;
655 
656 	table_id = efx_filter_id_table_id(filter_id);
657 	if ((unsigned int)table_id >= EFX_FILTER_TABLE_COUNT)
658 		return -ENOENT;
659 	table = &state->table[table_id];
660 
661 	filter_idx = efx_filter_id_index(filter_id);
662 	if (filter_idx >= table->size)
663 		return -ENOENT;
664 	spec = &table->spec[filter_idx];
665 
666 	filter_flags = efx_filter_id_flags(filter_id);
667 
668 	spin_lock_bh(&state->lock);
669 
670 	if (test_bit(filter_idx, table->used_bitmap) &&
671 	    spec->priority == priority && spec->flags == filter_flags) {
672 		*spec_buf = *spec;
673 		rc = 0;
674 	} else {
675 		rc = -ENOENT;
676 	}
677 
678 	spin_unlock_bh(&state->lock);
679 
680 	return rc;
681 }
682 
efx_filter_table_clear(struct efx_nic * efx,enum efx_filter_table_id table_id,enum efx_filter_priority priority)683 static void efx_filter_table_clear(struct efx_nic *efx,
684 				   enum efx_filter_table_id table_id,
685 				   enum efx_filter_priority priority)
686 {
687 	struct efx_filter_state *state = efx->filter_state;
688 	struct efx_filter_table *table = &state->table[table_id];
689 	unsigned int filter_idx;
690 
691 	spin_lock_bh(&state->lock);
692 
693 	for (filter_idx = 0; filter_idx < table->size; ++filter_idx)
694 		if (table->spec[filter_idx].priority <= priority)
695 			efx_filter_table_clear_entry(efx, table, filter_idx);
696 	if (table->used == 0)
697 		efx_filter_table_reset_search_depth(table);
698 
699 	spin_unlock_bh(&state->lock);
700 }
701 
702 /**
703  * efx_filter_clear_rx - remove RX filters by priority
704  * @efx: NIC from which to remove the filters
705  * @priority: Maximum priority to remove
706  */
efx_filter_clear_rx(struct efx_nic * efx,enum efx_filter_priority priority)707 void efx_filter_clear_rx(struct efx_nic *efx, enum efx_filter_priority priority)
708 {
709 	efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_IP, priority);
710 	efx_filter_table_clear(efx, EFX_FILTER_TABLE_RX_MAC, priority);
711 }
712 
efx_filter_count_rx_used(struct efx_nic * efx,enum efx_filter_priority priority)713 u32 efx_filter_count_rx_used(struct efx_nic *efx,
714 			     enum efx_filter_priority priority)
715 {
716 	struct efx_filter_state *state = efx->filter_state;
717 	enum efx_filter_table_id table_id;
718 	struct efx_filter_table *table;
719 	unsigned int filter_idx;
720 	u32 count = 0;
721 
722 	spin_lock_bh(&state->lock);
723 
724 	for (table_id = EFX_FILTER_TABLE_RX_IP;
725 	     table_id <= EFX_FILTER_TABLE_RX_MAC;
726 	     table_id++) {
727 		table = &state->table[table_id];
728 		for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
729 			if (test_bit(filter_idx, table->used_bitmap) &&
730 			    table->spec[filter_idx].priority == priority)
731 				++count;
732 		}
733 	}
734 
735 	spin_unlock_bh(&state->lock);
736 
737 	return count;
738 }
739 
efx_filter_get_rx_ids(struct efx_nic * efx,enum efx_filter_priority priority,u32 * buf,u32 size)740 s32 efx_filter_get_rx_ids(struct efx_nic *efx,
741 			  enum efx_filter_priority priority,
742 			  u32 *buf, u32 size)
743 {
744 	struct efx_filter_state *state = efx->filter_state;
745 	enum efx_filter_table_id table_id;
746 	struct efx_filter_table *table;
747 	unsigned int filter_idx;
748 	s32 count = 0;
749 
750 	spin_lock_bh(&state->lock);
751 
752 	for (table_id = EFX_FILTER_TABLE_RX_IP;
753 	     table_id <= EFX_FILTER_TABLE_RX_MAC;
754 	     table_id++) {
755 		table = &state->table[table_id];
756 		for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
757 			if (test_bit(filter_idx, table->used_bitmap) &&
758 			    table->spec[filter_idx].priority == priority) {
759 				if (count == size) {
760 					count = -EMSGSIZE;
761 					goto out;
762 				}
763 				buf[count++] = efx_filter_make_id(
764 					table_id, filter_idx,
765 					table->spec[filter_idx].flags);
766 			}
767 		}
768 	}
769 out:
770 	spin_unlock_bh(&state->lock);
771 
772 	return count;
773 }
774 
775 /* Restore filter stater after reset */
efx_restore_filters(struct efx_nic * efx)776 void efx_restore_filters(struct efx_nic *efx)
777 {
778 	struct efx_filter_state *state = efx->filter_state;
779 	enum efx_filter_table_id table_id;
780 	struct efx_filter_table *table;
781 	efx_oword_t filter;
782 	unsigned int filter_idx;
783 
784 	spin_lock_bh(&state->lock);
785 
786 	for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
787 		table = &state->table[table_id];
788 		for (filter_idx = 0; filter_idx < table->size; filter_idx++) {
789 			if (!test_bit(filter_idx, table->used_bitmap))
790 				continue;
791 			efx_filter_build(&filter, &table->spec[filter_idx]);
792 			efx_writeo(efx, &filter,
793 				   table->offset + table->step * filter_idx);
794 		}
795 	}
796 
797 	efx_filter_push_rx_limits(efx);
798 
799 	spin_unlock_bh(&state->lock);
800 }
801 
efx_probe_filters(struct efx_nic * efx)802 int efx_probe_filters(struct efx_nic *efx)
803 {
804 	struct efx_filter_state *state;
805 	struct efx_filter_table *table;
806 	unsigned table_id;
807 
808 	state = kzalloc(sizeof(*efx->filter_state), GFP_KERNEL);
809 	if (!state)
810 		return -ENOMEM;
811 	efx->filter_state = state;
812 
813 	spin_lock_init(&state->lock);
814 
815 	if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) {
816 #ifdef CONFIG_RFS_ACCEL
817 		state->rps_flow_id = kcalloc(FR_BZ_RX_FILTER_TBL0_ROWS,
818 					     sizeof(*state->rps_flow_id),
819 					     GFP_KERNEL);
820 		if (!state->rps_flow_id)
821 			goto fail;
822 #endif
823 		table = &state->table[EFX_FILTER_TABLE_RX_IP];
824 		table->id = EFX_FILTER_TABLE_RX_IP;
825 		table->offset = FR_BZ_RX_FILTER_TBL0;
826 		table->size = FR_BZ_RX_FILTER_TBL0_ROWS;
827 		table->step = FR_BZ_RX_FILTER_TBL0_STEP;
828 	}
829 
830 	if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) {
831 		table = &state->table[EFX_FILTER_TABLE_RX_MAC];
832 		table->id = EFX_FILTER_TABLE_RX_MAC;
833 		table->offset = FR_CZ_RX_MAC_FILTER_TBL0;
834 		table->size = FR_CZ_RX_MAC_FILTER_TBL0_ROWS;
835 		table->step = FR_CZ_RX_MAC_FILTER_TBL0_STEP;
836 	}
837 
838 	for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
839 		table = &state->table[table_id];
840 		if (table->size == 0)
841 			continue;
842 		table->used_bitmap = kcalloc(BITS_TO_LONGS(table->size),
843 					     sizeof(unsigned long),
844 					     GFP_KERNEL);
845 		if (!table->used_bitmap)
846 			goto fail;
847 		table->spec = vzalloc(table->size * sizeof(*table->spec));
848 		if (!table->spec)
849 			goto fail;
850 	}
851 
852 	return 0;
853 
854 fail:
855 	efx_remove_filters(efx);
856 	return -ENOMEM;
857 }
858 
efx_remove_filters(struct efx_nic * efx)859 void efx_remove_filters(struct efx_nic *efx)
860 {
861 	struct efx_filter_state *state = efx->filter_state;
862 	enum efx_filter_table_id table_id;
863 
864 	for (table_id = 0; table_id < EFX_FILTER_TABLE_COUNT; table_id++) {
865 		kfree(state->table[table_id].used_bitmap);
866 		vfree(state->table[table_id].spec);
867 	}
868 #ifdef CONFIG_RFS_ACCEL
869 	kfree(state->rps_flow_id);
870 #endif
871 	kfree(state);
872 }
873 
874 #ifdef CONFIG_RFS_ACCEL
875 
efx_filter_rfs(struct net_device * net_dev,const struct sk_buff * skb,u16 rxq_index,u32 flow_id)876 int efx_filter_rfs(struct net_device *net_dev, const struct sk_buff *skb,
877 		   u16 rxq_index, u32 flow_id)
878 {
879 	struct efx_nic *efx = netdev_priv(net_dev);
880 	struct efx_channel *channel;
881 	struct efx_filter_state *state = efx->filter_state;
882 	struct efx_filter_spec spec;
883 	const struct iphdr *ip;
884 	const __be16 *ports;
885 	int nhoff;
886 	int rc;
887 
888 	nhoff = skb_network_offset(skb);
889 
890 	if (skb->protocol != htons(ETH_P_IP))
891 		return -EPROTONOSUPPORT;
892 
893 	/* RFS must validate the IP header length before calling us */
894 	EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + sizeof(*ip));
895 	ip = (const struct iphdr *)(skb->data + nhoff);
896 	if (ip_is_fragment(ip))
897 		return -EPROTONOSUPPORT;
898 	EFX_BUG_ON_PARANOID(skb_headlen(skb) < nhoff + 4 * ip->ihl + 4);
899 	ports = (const __be16 *)(skb->data + nhoff + 4 * ip->ihl);
900 
901 	efx_filter_init_rx(&spec, EFX_FILTER_PRI_HINT, 0, rxq_index);
902 	rc = efx_filter_set_ipv4_full(&spec, ip->protocol,
903 				      ip->daddr, ports[1], ip->saddr, ports[0]);
904 	if (rc)
905 		return rc;
906 
907 	rc = efx_filter_insert_filter(efx, &spec, true);
908 	if (rc < 0)
909 		return rc;
910 
911 	/* Remember this so we can check whether to expire the filter later */
912 	state->rps_flow_id[rc] = flow_id;
913 	channel = efx_get_channel(efx, skb_get_rx_queue(skb));
914 	++channel->rfs_filters_added;
915 
916 	netif_info(efx, rx_status, efx->net_dev,
917 		   "steering %s %pI4:%u:%pI4:%u to queue %u [flow %u filter %d]\n",
918 		   (ip->protocol == IPPROTO_TCP) ? "TCP" : "UDP",
919 		   &ip->saddr, ntohs(ports[0]), &ip->daddr, ntohs(ports[1]),
920 		   rxq_index, flow_id, rc);
921 
922 	return rc;
923 }
924 
__efx_filter_rfs_expire(struct efx_nic * efx,unsigned quota)925 bool __efx_filter_rfs_expire(struct efx_nic *efx, unsigned quota)
926 {
927 	struct efx_filter_state *state = efx->filter_state;
928 	struct efx_filter_table *table = &state->table[EFX_FILTER_TABLE_RX_IP];
929 	unsigned mask = table->size - 1;
930 	unsigned index;
931 	unsigned stop;
932 
933 	if (!spin_trylock_bh(&state->lock))
934 		return false;
935 
936 	index = state->rps_expire_index;
937 	stop = (index + quota) & mask;
938 
939 	while (index != stop) {
940 		if (test_bit(index, table->used_bitmap) &&
941 		    table->spec[index].priority == EFX_FILTER_PRI_HINT &&
942 		    rps_may_expire_flow(efx->net_dev,
943 					table->spec[index].dmaq_id,
944 					state->rps_flow_id[index], index)) {
945 			netif_info(efx, rx_status, efx->net_dev,
946 				   "expiring filter %d [flow %u]\n",
947 				   index, state->rps_flow_id[index]);
948 			efx_filter_table_clear_entry(efx, table, index);
949 		}
950 		index = (index + 1) & mask;
951 	}
952 
953 	state->rps_expire_index = stop;
954 	if (table->used == 0)
955 		efx_filter_table_reset_search_depth(table);
956 
957 	spin_unlock_bh(&state->lock);
958 	return true;
959 }
960 
961 #endif /* CONFIG_RFS_ACCEL */
962