Lines Matching +full:- +full:e

16  *      - Redistributions of source code must retain the above
20 * - Redistributions in binary form must reproduce the above
53 s->smt_size = smt_size; in t4_init_smt()
54 rwlock_init(&s->lock); in t4_init_smt()
55 for (i = 0; i < s->smt_size; ++i) { in t4_init_smt()
56 s->smtab[i].idx = i; in t4_init_smt()
57 s->smtab[i].state = SMT_STATE_UNUSED; in t4_init_smt()
58 eth_zero_addr(s->smtab[i].src_mac); in t4_init_smt()
59 spin_lock_init(&s->smtab[i].lock); in t4_init_smt()
60 s->smtab[i].refcnt = 0; in t4_init_smt()
68 struct smt_entry *e, *end; in find_or_alloc_smte() local
70 for (e = &s->smtab[0], end = &s->smtab[s->smt_size]; e != end; ++e) { in find_or_alloc_smte()
71 if (e->refcnt == 0) { in find_or_alloc_smte()
73 first_free = e; in find_or_alloc_smte()
75 if (e->state == SMT_STATE_SWITCHING) { in find_or_alloc_smte()
77 * re-use it ? in find_or_alloc_smte()
79 if (memcmp(e->src_mac, smac, ETH_ALEN) == 0) in find_or_alloc_smte()
86 e = first_free; in find_or_alloc_smte()
92 e->state = SMT_STATE_UNUSED; in find_or_alloc_smte()
95 return e; in find_or_alloc_smte()
98 static void t4_smte_free(struct smt_entry *e) in t4_smte_free() argument
100 if (e->refcnt == 0) { /* hasn't been recycled */ in t4_smte_free()
101 e->state = SMT_STATE_UNUSED; in t4_smte_free()
106 * cxgb4_smt_release - Release SMT entry
107 * @e: smt entry to release
111 void cxgb4_smt_release(struct smt_entry *e) in cxgb4_smt_release() argument
113 spin_lock_bh(&e->lock); in cxgb4_smt_release()
114 if ((--e->refcnt) == 0) in cxgb4_smt_release()
115 t4_smte_free(e); in cxgb4_smt_release()
116 spin_unlock_bh(&e->lock); in cxgb4_smt_release()
123 struct smt_data *s = adap->smt; in do_smt_write_rpl()
125 if (unlikely(rpl->status != CPL_ERR_NONE)) { in do_smt_write_rpl()
126 struct smt_entry *e = &s->smtab[smtidx]; in do_smt_write_rpl() local
128 dev_err(adap->pdev_dev, in do_smt_write_rpl()
130 rpl->status, smtidx); in do_smt_write_rpl()
131 spin_lock(&e->lock); in do_smt_write_rpl()
132 e->state = SMT_STATE_ERROR; in do_smt_write_rpl()
133 spin_unlock(&e->lock); in do_smt_write_rpl()
138 static int write_smt_entry(struct adapter *adapter, struct smt_entry *e) in write_smt_entry() argument
141 struct smt_data *s = adapter->smt; in write_smt_entry()
147 if (CHELSIO_CHIP_VERSION(adapter->params.chip) <= CHELSIO_T5) { in write_smt_entry()
151 return -ENOMEM; in write_smt_entry()
161 row = (e->idx >> 1); in write_smt_entry()
162 if (e->idx & 1) { in write_smt_entry()
163 req->pfvf1 = 0x0; in write_smt_entry()
164 memcpy(req->src_mac1, e->src_mac, ETH_ALEN); in write_smt_entry()
167 * at prev index from smt-tab. in write_smt_entry()
169 req->pfvf0 = 0x0; in write_smt_entry()
170 memcpy(req->src_mac0, s->smtab[e->idx - 1].src_mac, in write_smt_entry()
173 req->pfvf0 = 0x0; in write_smt_entry()
174 memcpy(req->src_mac0, e->src_mac, ETH_ALEN); in write_smt_entry()
177 * at next index from smt-tab in write_smt_entry()
179 req->pfvf1 = 0x0; in write_smt_entry()
180 memcpy(req->src_mac1, s->smtab[e->idx + 1].src_mac, in write_smt_entry()
187 return -ENOMEM; in write_smt_entry()
193 /* fill pfvf0/src_mac0 from smt-tab */ in write_smt_entry()
194 req->pfvf0 = 0x0; in write_smt_entry()
195 memcpy(req->src_mac0, s->smtab[e->idx].src_mac, ETH_ALEN); in write_smt_entry()
196 row = e->idx; in write_smt_entry()
200 htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, e->idx | in write_smt_entry()
201 TID_QID_V(adapter->sge.fw_evtq.abs_id))); in write_smt_entry()
202 req->params = htonl(SMTW_NORPL_V(0) | in write_smt_entry()
212 struct smt_data *s = adap->smt; in t4_smt_alloc_switching()
213 struct smt_entry *e; in t4_smt_alloc_switching() local
215 write_lock_bh(&s->lock); in t4_smt_alloc_switching()
216 e = find_or_alloc_smte(s, smac); in t4_smt_alloc_switching()
217 if (e) { in t4_smt_alloc_switching()
218 spin_lock(&e->lock); in t4_smt_alloc_switching()
219 if (!e->refcnt) { in t4_smt_alloc_switching()
220 e->refcnt = 1; in t4_smt_alloc_switching()
221 e->state = SMT_STATE_SWITCHING; in t4_smt_alloc_switching()
222 e->pfvf = pfvf; in t4_smt_alloc_switching()
223 memcpy(e->src_mac, smac, ETH_ALEN); in t4_smt_alloc_switching()
224 write_smt_entry(adap, e); in t4_smt_alloc_switching()
226 ++e->refcnt; in t4_smt_alloc_switching()
228 spin_unlock(&e->lock); in t4_smt_alloc_switching()
230 write_unlock_bh(&s->lock); in t4_smt_alloc_switching()
231 return e; in t4_smt_alloc_switching()
235 * cxgb4_smt_alloc_switching - Allocates an SMT entry for switch filters.