Lines Matching refs:path
108 struct tb_path *path; in tb_path_discover() local
153 path = kzalloc_obj(*path); in tb_path_discover()
154 if (!path) in tb_path_discover()
157 path->name = name; in tb_path_discover()
158 path->tb = src->sw->tb; in tb_path_discover()
159 path->path_length = num_hops; in tb_path_discover()
160 path->activated = true; in tb_path_discover()
161 path->alloc_hopid = alloc_hopid; in tb_path_discover()
163 path->hops = kzalloc_objs(*path->hops, num_hops); in tb_path_discover()
164 if (!path->hops) { in tb_path_discover()
165 kfree(path); in tb_path_discover()
169 tb_dbg(path->tb, "discovering %s path starting from %llx:%u\n", in tb_path_discover()
170 path->name, tb_route(src->sw), src->port); in tb_path_discover()
198 path->hops[i].in_port = p; in tb_path_discover()
199 path->hops[i].in_hop_index = h; in tb_path_discover()
200 path->hops[i].in_counter_index = -1; in tb_path_discover()
201 path->hops[i].out_port = out_port; in tb_path_discover()
202 path->hops[i].next_hop_index = next_hop; in tb_path_discover()
204 tb_dump_hop(&path->hops[i], &hop); in tb_path_discover()
210 tb_dbg(path->tb, "path discovery complete\n"); in tb_path_discover()
211 return path; in tb_path_discover()
216 tb_path_free(path); in tb_path_discover()
244 struct tb_path *path; in tb_path_alloc() local
248 path = kzalloc_obj(*path); in tb_path_alloc()
249 if (!path) in tb_path_alloc()
263 kfree(path); in tb_path_alloc()
270 path->hops = kzalloc_objs(*path->hops, num_hops); in tb_path_alloc()
271 if (!path->hops) { in tb_path_alloc()
272 kfree(path); in tb_path_alloc()
276 path->alloc_hopid = true; in tb_path_alloc()
332 path->hops[i].in_hop_index = in_hopid; in tb_path_alloc()
333 path->hops[i].in_port = in_port; in tb_path_alloc()
334 path->hops[i].in_counter_index = -1; in tb_path_alloc()
335 path->hops[i].out_port = out_port; in tb_path_alloc()
336 path->hops[i].next_hop_index = out_hopid; in tb_path_alloc()
341 path->tb = tb; in tb_path_alloc()
342 path->path_length = num_hops; in tb_path_alloc()
343 path->name = name; in tb_path_alloc()
345 return path; in tb_path_alloc()
348 tb_path_free(path); in tb_path_alloc()
358 void tb_path_free(struct tb_path *path) in tb_path_free() argument
360 if (path->alloc_hopid) { in tb_path_free()
363 for (i = 0; i < path->path_length; i++) { in tb_path_free()
364 const struct tb_path_hop *hop = &path->hops[i]; in tb_path_free()
375 kfree(path->hops); in tb_path_free()
376 kfree(path); in tb_path_free()
379 static void __tb_path_deallocate_nfc(struct tb_path *path, int first_hop) in __tb_path_deallocate_nfc() argument
382 for (i = first_hop; i < path->path_length; i++) { in __tb_path_deallocate_nfc()
383 res = tb_port_add_nfc_credits(path->hops[i].in_port, in __tb_path_deallocate_nfc()
384 -path->hops[i].nfc_credits); in __tb_path_deallocate_nfc()
386 tb_port_warn(path->hops[i].in_port, in __tb_path_deallocate_nfc()
464 static void __tb_path_deactivate_hops(struct tb_path *path, int first_hop) in __tb_path_deactivate_hops() argument
468 for (i = first_hop; i < path->path_length; i++) { in __tb_path_deactivate_hops()
469 res = __tb_path_deactivate_hop(path->hops[i].in_port, in __tb_path_deactivate_hops()
470 path->hops[i].in_hop_index, in __tb_path_deactivate_hops()
471 path->clear_fc); in __tb_path_deactivate_hops()
473 tb_port_warn(path->hops[i].in_port, in __tb_path_deactivate_hops()
475 i, path->hops[i].in_hop_index); in __tb_path_deactivate_hops()
479 void tb_path_deactivate(struct tb_path *path) in tb_path_deactivate() argument
481 if (!path->activated) { in tb_path_deactivate()
482 tb_WARN(path->tb, "trying to deactivate an inactive path\n"); in tb_path_deactivate()
485 tb_dbg(path->tb, in tb_path_deactivate()
487 path->name, tb_route(path->hops[0].in_port->sw), in tb_path_deactivate()
488 path->hops[0].in_port->port, in tb_path_deactivate()
489 tb_route(path->hops[path->path_length - 1].out_port->sw), in tb_path_deactivate()
490 path->hops[path->path_length - 1].out_port->port); in tb_path_deactivate()
491 __tb_path_deactivate_hops(path, 0); in tb_path_deactivate()
492 __tb_path_deallocate_nfc(path, 0); in tb_path_deactivate()
493 path->activated = false; in tb_path_deactivate()
505 int tb_path_activate(struct tb_path *path) in tb_path_activate() argument
509 if (path->activated) { in tb_path_activate()
510 tb_WARN(path->tb, "trying to activate already activated path\n"); in tb_path_activate()
514 tb_dbg(path->tb, in tb_path_activate()
516 path->name, tb_route(path->hops[0].in_port->sw), in tb_path_activate()
517 path->hops[0].in_port->port, in tb_path_activate()
518 tb_route(path->hops[path->path_length - 1].out_port->sw), in tb_path_activate()
519 path->hops[path->path_length - 1].out_port->port); in tb_path_activate()
522 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
523 if (path->hops[i].in_counter_index == -1) in tb_path_activate()
525 res = tb_port_clear_counter(path->hops[i].in_port, in tb_path_activate()
526 path->hops[i].in_counter_index); in tb_path_activate()
532 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
533 res = tb_port_add_nfc_credits(path->hops[i].in_port, in tb_path_activate()
534 path->hops[i].nfc_credits); in tb_path_activate()
536 __tb_path_deallocate_nfc(path, i); in tb_path_activate()
542 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
546 __tb_path_deactivate_hop(path->hops[i].in_port, in tb_path_activate()
547 path->hops[i].in_hop_index, path->clear_fc); in tb_path_activate()
550 hop.next_hop = path->hops[i].next_hop_index; in tb_path_activate()
551 hop.out_port = path->hops[i].out_port->port; in tb_path_activate()
552 hop.initial_credits = path->hops[i].initial_credits; in tb_path_activate()
553 hop.pmps = path->hops[i].pm_support; in tb_path_activate()
558 out_mask = (i == path->path_length - 1) ? in tb_path_activate()
561 hop.weight = path->weight; in tb_path_activate()
563 hop.priority = path->priority; in tb_path_activate()
564 hop.drop_packages = path->drop_packages; in tb_path_activate()
565 hop.counter = path->hops[i].in_counter_index; in tb_path_activate()
566 hop.counter_enable = path->hops[i].in_counter_index != -1; in tb_path_activate()
567 hop.ingress_fc = path->ingress_fc_enable & in_mask; in tb_path_activate()
568 hop.egress_fc = path->egress_fc_enable & out_mask; in tb_path_activate()
569 hop.ingress_shared_buffer = path->ingress_shared_buffer in tb_path_activate()
571 hop.egress_shared_buffer = path->egress_shared_buffer in tb_path_activate()
575 tb_port_dbg(path->hops[i].in_port, "Writing hop %d\n", i); in tb_path_activate()
576 tb_dump_hop(&path->hops[i], &hop); in tb_path_activate()
577 res = tb_port_write(path->hops[i].in_port, &hop, TB_CFG_HOPS, in tb_path_activate()
578 2 * path->hops[i].in_hop_index, 2); in tb_path_activate()
580 __tb_path_deactivate_hops(path, i); in tb_path_activate()
581 __tb_path_deallocate_nfc(path, 0); in tb_path_activate()
585 path->activated = true; in tb_path_activate()
586 tb_dbg(path->tb, "%s path activation complete\n", path->name); in tb_path_activate()
589 tb_warn(path->tb, "%s path activation failed: %d\n", path->name, res); in tb_path_activate()
599 bool tb_path_is_invalid(struct tb_path *path) in tb_path_is_invalid() argument
602 for (i = 0; i < path->path_length; i++) { in tb_path_is_invalid()
603 if (path->hops[i].in_port->sw->is_unplugged) in tb_path_is_invalid()
605 if (path->hops[i].out_port->sw->is_unplugged) in tb_path_is_invalid()
621 bool tb_path_port_on_path(const struct tb_path *path, const struct tb_port *port) in tb_path_port_on_path() argument
625 for (i = 0; i < path->path_length; i++) { in tb_path_port_on_path()
626 if (path->hops[i].in_port == port || in tb_path_port_on_path()
627 path->hops[i].out_port == port) in tb_path_port_on_path()