35#include <sys/eventhandler.h>
37#include <sys/kernel.h>
38#include <sys/module.h>
42#include <sys/rwlock.h>
43#include <sys/socket.h>
45#include <netinet/in.h>
77 rw_assert(&d->
lock, RA_WLOCKED);
79 if (!atomic_load_acq_int(&d->
nfree))
84 if (atomic_load_acq_int(&e->
refcnt) == 0)
87 for (e = d->
l2tab; atomic_load_acq_int(&e->
refcnt); ++e)
91 atomic_subtract_int(&d->
nfree, 1);
118 if (atomic_load_acq_int(&e->
refcnt) == 0) {
122 memcmp(e->
dmac,
dmac, ETHER_ADDR_LEN) == 0 &&
127 if (first_free == NULL)
178 mtx_assert(&e->
lock, MA_OWNED);
179 MPASS(e->
wrq != NULL);
213 int *ndesc, uint16_t
vlan, uint8_t
port, uint8_t *eth_addr)
233 memcmp(e->
dmac, eth_addr, ETHER_ADDR_LEN) == 0) {
234 if (atomic_fetchadd_int(&e->
refcnt, 1) == 0) {
239 atomic_subtract_int(&d->
nfree, 1);
242 (
"%s: refcount overflow", __func__));
243 rw_runlock(&d->
lock);
252 if (!rw_try_upgrade(&d->
lock)) {
253 rw_runlock(&d->
lock);
260 rw_wunlock(&d->
lock);
270 memcpy(e->
dmac, eth_addr, ETHER_ADDR_LEN);
271 atomic_store_rel_int(&e->
refcnt, 1);
272 rw_wunlock(&d->
lock);
298 if (atomic_load_acq_int(&e->
refcnt) == 0) {
305 memcpy(e->
dmac, eth_addr, ETHER_ADDR_LEN);
306 atomic_store_rel_int(&e->
refcnt, 1);
307 atomic_subtract_int(&d->
nfree, 1);
309 mtx_unlock(&e->
lock);
315 atomic_add_int(&e->
refcnt, 1);
318 rw_wunlock(&d->
lock);
340 rw_init(&d->
lock,
"L2T");
347 mtx_init(&e->
lock,
"L2T_E", NULL, MTX_DEF);
348 STAILQ_INIT(&e->wr_list);
349 atomic_store_rel_int(&e->
refcnt, 0);
364 rw_destroy(&d->
lock);
375 unsigned int tid =
GET_TID(rpl);
380 "Unexpected L2T_WRITE_RPL (%u) for entry at hw_idx %u\n",
388static inline unsigned int
391 return e->
vlan >> 13;
415 int rc, i, header = 0;
416 char ip[INET6_ADDRSTRLEN];
421 rc = sysctl_wire_old_buffer(req, 0);
425 sb = sbuf_new_for_sysctl(NULL, NULL, 4096, req);
430 for (i = 0; i < l2t->
l2t_size; i++, e++) {
436 sbuf_printf(sb,
" Idx IP address "
437 "Ethernet address VLAN/P LP State Users Port");
443 inet_ntop(e->
ipv6 ? AF_INET6 : AF_INET, &e->
addr[0],
450 sbuf_printf(sb,
"\n%4u %-15s %02x:%02x:%02x:%02x:%02x:%02x %4d"
456 e->
ifp ? e->
ifp->if_xname :
"-");
458 mtx_unlock(&e->
lock);
461 rc = sbuf_finish(sb);
void commit_wrq_wr(struct sge_wrq *, void *, struct wrq_cookie *)
#define TXQ_LOCK_ASSERT_OWNED(txq)
void * start_wrq_wr(struct sge_wrq *, int, struct wrq_cookie *)
#define INIT_TP_WR(w, tid)
uint8_t dmac[ETHER_ADDR_LEN]
static char l2e_state(const struct l2t_entry *e)
struct l2t_entry * t4_l2t_alloc_switching(struct adapter *sc, uint16_t vlan, uint8_t port, uint8_t *eth_addr)
static void mk_write_l2e(struct adapter *sc, struct l2t_entry *e, int sync, int reply, void *dst)
struct l2t_entry * t4_alloc_l2e(struct l2t_data *d)
int t4_init_l2t(struct adapter *sc, int flags)
int t4_free_l2t(struct l2t_data *d)
int sysctl_l2t(SYSCTL_HANDLER_ARGS)
struct l2t_entry * t4_l2t_alloc_tls(struct adapter *sc, struct sge_txq *txq, void *dst, int *ndesc, uint16_t vlan, uint8_t port, uint8_t *eth_addr)
int do_l2t_write_rpl(struct sge_iq *iq, const struct rss_header *rss, struct mbuf *m)
int t4_write_l2e(struct l2t_entry *e, int sync)
static unsigned int vlan_prio(const struct l2t_entry *e)
static struct l2t_entry * find_or_alloc_l2e(struct l2t_data *d, uint16_t vlan, uint8_t port, uint8_t *dmac)
#define V_L2T_W_NOREPLY(x)
#define MK_OPCODE_TID(opcode, tid)