Lines Matching refs:sw

54 static int prestera_nexthop_group_set(struct prestera_switch *sw,
57 prestera_nexthop_group_util_hw_state(struct prestera_switch *sw,
67 int prestera_router_hw_init(struct prestera_switch *sw)
71 err = rhashtable_init(&sw->router->nh_neigh_ht,
76 err = rhashtable_init(&sw->router->nexthop_group_ht,
81 err = rhashtable_init(&sw->router->fib_ht,
86 INIT_LIST_HEAD(&sw->router->vr_list);
87 INIT_LIST_HEAD(&sw->router->rif_entry_list);
92 rhashtable_destroy(&sw->router->nexthop_group_ht);
94 rhashtable_destroy(&sw->router->nh_neigh_ht);
99 void prestera_router_hw_fini(struct prestera_switch *sw)
101 rhashtable_free_and_destroy(&sw->router->fib_ht,
102 prestera_fib_node_destroy_ht_cb, sw);
103 WARN_ON(!list_empty(&sw->router->vr_list));
104 WARN_ON(!list_empty(&sw->router->rif_entry_list));
105 rhashtable_destroy(&sw->router->fib_ht);
106 rhashtable_destroy(&sw->router->nexthop_group_ht);
107 rhashtable_destroy(&sw->router->nh_neigh_ht);
110 static struct prestera_vr *__prestera_vr_find(struct prestera_switch *sw,
115 list_for_each_entry(vr, &sw->router->vr_list, router_node) {
123 static struct prestera_vr *__prestera_vr_create(struct prestera_switch *sw,
138 err = prestera_hw_vr_create(sw, &vr->hw_vr_id);
142 list_add(&vr->router_node, &sw->router->vr_list);
152 static void __prestera_vr_destroy(struct prestera_switch *sw,
156 prestera_hw_vr_delete(sw, vr->hw_vr_id);
160 static struct prestera_vr *prestera_vr_get(struct prestera_switch *sw, u32 tb_id,
165 vr = __prestera_vr_find(sw, tb_id);
169 vr = __prestera_vr_create(sw, tb_id, extack);
179 static void prestera_vr_put(struct prestera_switch *sw, struct prestera_vr *vr)
182 __prestera_vr_destroy(sw, vr);
213 prestera_rif_entry_find(const struct prestera_switch *sw,
222 list_for_each_entry(rif_entry, &sw->router->rif_entry_list,
231 void prestera_rif_entry_destroy(struct prestera_switch *sw,
240 prestera_hw_rif_delete(sw, e->hw_id, &iface);
242 prestera_vr_put(sw, e->vr);
247 prestera_rif_entry_create(struct prestera_switch *sw,
262 e->vr = prestera_vr_get(sw, tb_id, NULL);
271 err = prestera_hw_rif_create(sw, &iface, e->addr, &e->hw_id);
275 list_add(&e->router_node, &sw->router->rif_entry_list);
280 prestera_vr_put(sw, e->vr);
288 static void __prestera_nh_neigh_destroy(struct prestera_switch *sw,
291 rhashtable_remove_fast(&sw->router->nh_neigh_ht,
298 __prestera_nh_neigh_create(struct prestera_switch *sw,
311 err = rhashtable_insert_fast(&sw->router->nh_neigh_ht,
326 prestera_nh_neigh_find(struct prestera_switch *sw,
331 nh_neigh = rhashtable_lookup_fast(&sw->router->nh_neigh_ht,
337 prestera_nh_neigh_get(struct prestera_switch *sw,
342 neigh = prestera_nh_neigh_find(sw, key);
344 return __prestera_nh_neigh_create(sw, key);
349 void prestera_nh_neigh_put(struct prestera_switch *sw,
353 __prestera_nh_neigh_destroy(sw, neigh);
357 int prestera_nh_neigh_set(struct prestera_switch *sw,
366 err = prestera_nexthop_group_set(sw, nh_grp);
374 bool prestera_nh_neigh_util_hw_state(struct prestera_switch *sw,
383 state = prestera_nexthop_group_util_hw_state(sw, nh_head->this);
393 __prestera_nexthop_group_create(struct prestera_switch *sw,
409 nh_neigh = prestera_nh_neigh_get(sw,
420 err = prestera_hw_nh_group_create(sw, nh_cnt, &nh_grp->grp_id);
424 err = prestera_nexthop_group_set(sw, nh_grp);
428 err = rhashtable_insert_fast(&sw->router->nexthop_group_ht,
436 sw->router->nhgrp_hw_state_cache[gid / 8] &= ~BIT(gid % 8);
442 prestera_hw_nh_group_delete(sw, nh_cnt, nh_grp->grp_id);
447 prestera_nh_neigh_put(sw, nh_grp->nh_neigh_head[nh_cnt].neigh);
456 __prestera_nexthop_group_destroy(struct prestera_switch *sw,
462 rhashtable_remove_fast(&sw->router->nexthop_group_ht,
472 prestera_nh_neigh_put(sw, nh_neigh);
475 prestera_hw_nh_group_delete(sw, nh_cnt, nh_grp->grp_id);
480 __prestera_nexthop_group_find(struct prestera_switch *sw,
485 nh_grp = rhashtable_lookup_fast(&sw->router->nexthop_group_ht,
491 prestera_nexthop_group_get(struct prestera_switch *sw,
496 nh_grp = __prestera_nexthop_group_find(sw, key);
500 nh_grp = __prestera_nexthop_group_create(sw, key);
510 static void prestera_nexthop_group_put(struct prestera_switch *sw,
514 __prestera_nexthop_group_destroy(sw, nh_grp);
518 static int prestera_nexthop_group_set(struct prestera_switch *sw,
534 return prestera_hw_nh_entries_set(sw, nh_cnt, &info[0], nh_grp->grp_id);
538 prestera_nexthop_group_util_hw_state(struct prestera_switch *sw,
542 u32 buf_size = sw->size_tbl_router_nexthop / 8 + 1;
544 u8 *cache = sw->router->nhgrp_hw_state_cache;
551 if (!time_before(jiffies, sw->router->nhgrp_hw_cache_kick +
553 err = prestera_hw_nhgrp_blk_get(sw, cache, buf_size);
559 sw->router->nhgrp_hw_cache_kick = jiffies;
569 prestera_fib_node_find(struct prestera_switch *sw, struct prestera_fib_key *key)
573 fib_node = rhashtable_lookup_fast(&sw->router->fib_ht, key,
578 static void __prestera_fib_node_destruct(struct prestera_switch *sw,
584 prestera_hw_lpm_del(sw, vr->hw_vr_id, fib_node->key.addr.u.ipv4,
588 prestera_nexthop_group_put(sw, fib_node->info.nh_grp);
599 prestera_vr_put(sw, vr);
602 void prestera_fib_node_destroy(struct prestera_switch *sw,
605 __prestera_fib_node_destruct(sw, fib_node);
606 rhashtable_remove_fast(&sw->router->fib_ht, &fib_node->ht_node,
614 struct prestera_switch *sw = arg;
616 __prestera_fib_node_destruct(sw, node);
621 prestera_fib_node_create(struct prestera_switch *sw,
638 vr = prestera_vr_get(sw, key->tb_id, NULL);
652 fib_node->info.nh_grp = prestera_nexthop_group_get(sw,
664 err = prestera_hw_lpm_add(sw, vr->hw_vr_id, key->addr.u.ipv4,
669 err = rhashtable_insert_fast(&sw->router->fib_ht, &fib_node->ht_node,
677 prestera_hw_lpm_del(sw, vr->hw_vr_id, key->addr.u.ipv4,
681 prestera_nexthop_group_put(sw, fib_node->info.nh_grp);
683 prestera_vr_put(sw, vr);