Lines Matching refs:mdb_entry
31 struct lan966x_mdb_entry *mdb_entry, *tmp; in lan966x_mdb_purge_mdb_entries() local
33 list_for_each_entry_safe(mdb_entry, tmp, &lan966x->mdb_entries, list) { in lan966x_mdb_purge_mdb_entries()
34 list_del(&mdb_entry->list); in lan966x_mdb_purge_mdb_entries()
35 kfree(mdb_entry); in lan966x_mdb_purge_mdb_entries()
60 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_entry_get() local
62 list_for_each_entry(mdb_entry, &lan966x->mdb_entries, list) { in lan966x_mdb_entry_get()
63 if (ether_addr_equal(mdb_entry->mac, mac) && in lan966x_mdb_entry_get()
64 mdb_entry->vid == vid) in lan966x_mdb_entry_get()
65 return mdb_entry; in lan966x_mdb_entry_get()
75 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_entry_add() local
77 mdb_entry = kzalloc(sizeof(*mdb_entry), GFP_KERNEL); in lan966x_mdb_entry_add()
78 if (!mdb_entry) in lan966x_mdb_entry_add()
81 ether_addr_copy(mdb_entry->mac, mdb->addr); in lan966x_mdb_entry_add()
82 mdb_entry->vid = mdb->vid; in lan966x_mdb_entry_add()
84 list_add_tail(&mdb_entry->list, &lan966x->mdb_entries); in lan966x_mdb_entry_add()
86 return mdb_entry; in lan966x_mdb_entry_add()
90 struct lan966x_mdb_entry *mdb_entry, in lan966x_mdb_encode_mac() argument
93 ether_addr_copy(mac, mdb_entry->mac); in lan966x_mdb_encode_mac()
97 mac[1] = mdb_entry->ports >> 8; in lan966x_mdb_encode_mac()
98 mac[2] = mdb_entry->ports & 0xff; in lan966x_mdb_encode_mac()
100 mac[0] = mdb_entry->ports >> 8; in lan966x_mdb_encode_mac()
101 mac[1] = mdb_entry->ports & 0xff; in lan966x_mdb_encode_mac()
111 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_ip_add() local
115 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); in lan966x_mdb_ip_add()
116 if (!mdb_entry) { in lan966x_mdb_ip_add()
117 mdb_entry = lan966x_mdb_entry_add(lan966x, mdb); in lan966x_mdb_ip_add()
118 if (IS_ERR(mdb_entry)) in lan966x_mdb_ip_add()
119 return PTR_ERR(mdb_entry); in lan966x_mdb_ip_add()
121 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_add()
122 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_ip_add()
126 mdb_entry->cpu_copy++; in lan966x_mdb_ip_add()
128 mdb_entry->ports |= BIT(port->chip_port); in lan966x_mdb_ip_add()
131 if (lan966x_vlan_cpu_member_cpu_vlan_mask(lan966x, mdb_entry->vid) && in lan966x_mdb_ip_add()
132 mdb_entry->cpu_copy) in lan966x_mdb_ip_add()
135 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_add()
137 mac, mdb_entry->vid, type); in lan966x_mdb_ip_add()
146 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_ip_del() local
150 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); in lan966x_mdb_ip_del()
151 if (!mdb_entry) in lan966x_mdb_ip_del()
154 ports = mdb_entry->ports; in lan966x_mdb_ip_del()
159 mdb_entry->cpu_copy--; in lan966x_mdb_ip_del()
160 if (mdb_entry->cpu_copy) in lan966x_mdb_ip_del()
166 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_del()
167 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_ip_del()
169 mdb_entry->ports = ports; in lan966x_mdb_ip_del()
171 if (!mdb_entry->ports && !mdb_entry->cpu_copy) { in lan966x_mdb_ip_del()
172 list_del(&mdb_entry->list); in lan966x_mdb_ip_del()
173 kfree(mdb_entry); in lan966x_mdb_ip_del()
177 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_del()
178 return lan966x_mac_ip_learn(lan966x, mdb_entry->cpu_copy, in lan966x_mdb_ip_del()
179 mac, mdb_entry->vid, type); in lan966x_mdb_ip_del()
202 struct lan966x_mdb_entry *mdb_entry) in lan966x_pgid_entry_get() argument
211 if (pgid_entry->ports == mdb_entry->ports) { in lan966x_pgid_entry_get()
232 mdb_entry->ports); in lan966x_pgid_entry_get()
255 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_l2_add() local
258 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); in lan966x_mdb_l2_add()
259 if (!mdb_entry) { in lan966x_mdb_l2_add()
260 mdb_entry = lan966x_mdb_entry_add(lan966x, mdb); in lan966x_mdb_l2_add()
261 if (IS_ERR(mdb_entry)) in lan966x_mdb_l2_add()
262 return PTR_ERR(mdb_entry); in lan966x_mdb_l2_add()
264 lan966x_pgid_entry_del(lan966x, mdb_entry->pgid); in lan966x_mdb_l2_add()
265 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_l2_add()
266 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_l2_add()
270 mdb_entry->ports |= BIT(CPU_PORT); in lan966x_mdb_l2_add()
271 mdb_entry->cpu_copy++; in lan966x_mdb_l2_add()
273 mdb_entry->ports |= BIT(port->chip_port); in lan966x_mdb_l2_add()
276 pgid_entry = lan966x_pgid_entry_get(lan966x, mdb_entry); in lan966x_mdb_l2_add()
278 list_del(&mdb_entry->list); in lan966x_mdb_l2_add()
279 kfree(mdb_entry); in lan966x_mdb_l2_add()
282 mdb_entry->pgid = pgid_entry; in lan966x_mdb_l2_add()
285 if (!lan966x_vlan_cpu_member_cpu_vlan_mask(lan966x, mdb_entry->vid) && in lan966x_mdb_l2_add()
286 mdb_entry->cpu_copy) in lan966x_mdb_l2_add()
287 mdb_entry->ports &= BIT(CPU_PORT); in lan966x_mdb_l2_add()
289 lan_rmw(ANA_PGID_PGID_SET(mdb_entry->ports), in lan966x_mdb_l2_add()
293 return lan966x_mac_learn(lan966x, pgid_entry->index, mdb_entry->mac, in lan966x_mdb_l2_add()
294 mdb_entry->vid, type); in lan966x_mdb_l2_add()
304 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_l2_del() local
308 mdb_entry = lan966x_mdb_entry_get(lan966x, mdb->addr, mdb->vid); in lan966x_mdb_l2_del()
309 if (!mdb_entry) in lan966x_mdb_l2_del()
312 ports = mdb_entry->ports; in lan966x_mdb_l2_del()
317 mdb_entry->cpu_copy--; in lan966x_mdb_l2_del()
318 if (mdb_entry->cpu_copy) in lan966x_mdb_l2_del()
326 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_l2_del()
327 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_l2_del()
328 lan966x_pgid_entry_del(lan966x, mdb_entry->pgid); in lan966x_mdb_l2_del()
330 mdb_entry->ports = ports; in lan966x_mdb_l2_del()
332 if (!mdb_entry->ports) { in lan966x_mdb_l2_del()
333 list_del(&mdb_entry->list); in lan966x_mdb_l2_del()
334 kfree(mdb_entry); in lan966x_mdb_l2_del()
338 pgid_entry = lan966x_pgid_entry_get(lan966x, mdb_entry); in lan966x_mdb_l2_del()
340 list_del(&mdb_entry->list); in lan966x_mdb_l2_del()
341 kfree(mdb_entry); in lan966x_mdb_l2_del()
344 mdb_entry->pgid = pgid_entry; in lan966x_mdb_l2_del()
346 lan_rmw(ANA_PGID_PGID_SET(mdb_entry->ports), in lan966x_mdb_l2_del()
350 return lan966x_mac_learn(lan966x, pgid_entry->index, mdb_entry->mac, in lan966x_mdb_l2_del()
351 mdb_entry->vid, type); in lan966x_mdb_l2_del()
399 struct lan966x_mdb_entry *mdb_entry, in lan966x_mdb_ip_cpu_copy() argument
404 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_cpu_copy()
405 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_ip_cpu_copy()
406 lan966x_mac_ip_learn(lan966x, true, mac, mdb_entry->vid, type); in lan966x_mdb_ip_cpu_copy()
410 struct lan966x_mdb_entry *mdb_entry, in lan966x_mdb_l2_cpu_copy() argument
416 lan966x_pgid_entry_del(lan966x, mdb_entry->pgid); in lan966x_mdb_l2_cpu_copy()
417 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_l2_cpu_copy()
418 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_l2_cpu_copy()
420 mdb_entry->ports |= BIT(CPU_PORT); in lan966x_mdb_l2_cpu_copy()
422 pgid_entry = lan966x_pgid_entry_get(lan966x, mdb_entry); in lan966x_mdb_l2_cpu_copy()
426 mdb_entry->pgid = pgid_entry; in lan966x_mdb_l2_cpu_copy()
428 lan_rmw(ANA_PGID_PGID_SET(mdb_entry->ports), in lan966x_mdb_l2_cpu_copy()
432 lan966x_mac_learn(lan966x, pgid_entry->index, mdb_entry->mac, in lan966x_mdb_l2_cpu_copy()
433 mdb_entry->vid, type); in lan966x_mdb_l2_cpu_copy()
438 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_write_entries() local
441 list_for_each_entry(mdb_entry, &lan966x->mdb_entries, list) { in lan966x_mdb_write_entries()
442 if (mdb_entry->vid != vid || !mdb_entry->cpu_copy) in lan966x_mdb_write_entries()
445 type = lan966x_mdb_classify(mdb_entry->mac); in lan966x_mdb_write_entries()
447 lan966x_mdb_ip_cpu_copy(lan966x, mdb_entry, type); in lan966x_mdb_write_entries()
449 lan966x_mdb_l2_cpu_copy(lan966x, mdb_entry, type); in lan966x_mdb_write_entries()
454 struct lan966x_mdb_entry *mdb_entry, in lan966x_mdb_ip_cpu_remove() argument
459 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_ip_cpu_remove()
460 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_ip_cpu_remove()
461 lan966x_mac_ip_learn(lan966x, false, mac, mdb_entry->vid, type); in lan966x_mdb_ip_cpu_remove()
465 struct lan966x_mdb_entry *mdb_entry, in lan966x_mdb_l2_cpu_remove() argument
471 lan966x_pgid_entry_del(lan966x, mdb_entry->pgid); in lan966x_mdb_l2_cpu_remove()
472 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_l2_cpu_remove()
473 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_l2_cpu_remove()
475 mdb_entry->ports &= ~BIT(CPU_PORT); in lan966x_mdb_l2_cpu_remove()
477 pgid_entry = lan966x_pgid_entry_get(lan966x, mdb_entry); in lan966x_mdb_l2_cpu_remove()
481 mdb_entry->pgid = pgid_entry; in lan966x_mdb_l2_cpu_remove()
483 lan_rmw(ANA_PGID_PGID_SET(mdb_entry->ports), in lan966x_mdb_l2_cpu_remove()
487 lan966x_mac_learn(lan966x, pgid_entry->index, mdb_entry->mac, in lan966x_mdb_l2_cpu_remove()
488 mdb_entry->vid, type); in lan966x_mdb_l2_cpu_remove()
493 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_erase_entries() local
496 list_for_each_entry(mdb_entry, &lan966x->mdb_entries, list) { in lan966x_mdb_erase_entries()
497 if (mdb_entry->vid != vid || !mdb_entry->cpu_copy) in lan966x_mdb_erase_entries()
500 type = lan966x_mdb_classify(mdb_entry->mac); in lan966x_mdb_erase_entries()
502 lan966x_mdb_ip_cpu_remove(lan966x, mdb_entry, type); in lan966x_mdb_erase_entries()
504 lan966x_mdb_l2_cpu_remove(lan966x, mdb_entry, type); in lan966x_mdb_erase_entries()
510 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_clear_entries() local
514 list_for_each_entry(mdb_entry, &lan966x->mdb_entries, list) { in lan966x_mdb_clear_entries()
515 type = lan966x_mdb_classify(mdb_entry->mac); in lan966x_mdb_clear_entries()
517 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_clear_entries()
521 lan966x_mac_forget(lan966x, mac, mdb_entry->vid, type); in lan966x_mdb_clear_entries()
527 struct lan966x_mdb_entry *mdb_entry; in lan966x_mdb_restore_entries() local
532 list_for_each_entry(mdb_entry, &lan966x->mdb_entries, list) { in lan966x_mdb_restore_entries()
533 type = lan966x_mdb_classify(mdb_entry->mac); in lan966x_mdb_restore_entries()
535 lan966x_mdb_encode_mac(mac, mdb_entry, type); in lan966x_mdb_restore_entries()
539 mdb_entry->vid) && in lan966x_mdb_restore_entries()
540 mdb_entry->cpu_copy) in lan966x_mdb_restore_entries()
544 mdb_entry->vid, type); in lan966x_mdb_restore_entries()
546 lan966x_mac_learn(lan966x, mdb_entry->pgid->index, in lan966x_mdb_restore_entries()
547 mdb_entry->mac, in lan966x_mdb_restore_entries()
548 mdb_entry->vid, type); in lan966x_mdb_restore_entries()