• Home
  • Raw
  • Download

Lines Matching full:path

3  * Thunderbolt Cactus Ridge driver - path/tunnel functionality
32 * tb_path_alloc() - allocate a thunderbolt path
38 struct tb_path *path = kzalloc(sizeof(*path), GFP_KERNEL); in tb_path_alloc() local
39 if (!path) in tb_path_alloc()
41 path->hops = kcalloc(num_hops, sizeof(*path->hops), GFP_KERNEL); in tb_path_alloc()
42 if (!path->hops) { in tb_path_alloc()
43 kfree(path); in tb_path_alloc()
46 path->tb = tb; in tb_path_alloc()
47 path->path_length = num_hops; in tb_path_alloc()
48 return path; in tb_path_alloc()
52 * tb_path_free() - free a deactivated path
54 void tb_path_free(struct tb_path *path) in tb_path_free() argument
56 if (path->activated) { in tb_path_free()
57 tb_WARN(path->tb, "trying to free an activated path\n") in tb_path_free()
60 kfree(path->hops); in tb_path_free()
61 kfree(path); in tb_path_free()
64 static void __tb_path_deallocate_nfc(struct tb_path *path, int first_hop) in __tb_path_deallocate_nfc() argument
67 for (i = first_hop; i < path->path_length; i++) { in __tb_path_deallocate_nfc()
68 res = tb_port_add_nfc_credits(path->hops[i].in_port, in __tb_path_deallocate_nfc()
69 -path->nfc_credits); in __tb_path_deallocate_nfc()
71 tb_port_warn(path->hops[i].in_port, in __tb_path_deallocate_nfc()
77 static void __tb_path_deactivate_hops(struct tb_path *path, int first_hop) in __tb_path_deactivate_hops() argument
81 for (i = first_hop; i < path->path_length; i++) { in __tb_path_deactivate_hops()
82 res = tb_port_write(path->hops[i].in_port, &hop, TB_CFG_HOPS, in __tb_path_deactivate_hops()
83 2 * path->hops[i].in_hop_index, 2); in __tb_path_deactivate_hops()
85 tb_port_warn(path->hops[i].in_port, in __tb_path_deactivate_hops()
87 i, path->hops[i].in_hop_index); in __tb_path_deactivate_hops()
91 void tb_path_deactivate(struct tb_path *path) in tb_path_deactivate() argument
93 if (!path->activated) { in tb_path_deactivate()
94 tb_WARN(path->tb, "trying to deactivate an inactive path\n"); in tb_path_deactivate()
97 tb_info(path->tb, in tb_path_deactivate()
98 "deactivating path from %llx:%x to %llx:%x\n", in tb_path_deactivate()
99 tb_route(path->hops[0].in_port->sw), in tb_path_deactivate()
100 path->hops[0].in_port->port, in tb_path_deactivate()
101 tb_route(path->hops[path->path_length - 1].out_port->sw), in tb_path_deactivate()
102 path->hops[path->path_length - 1].out_port->port); in tb_path_deactivate()
103 __tb_path_deactivate_hops(path, 0); in tb_path_deactivate()
104 __tb_path_deallocate_nfc(path, 0); in tb_path_deactivate()
105 path->activated = false; in tb_path_deactivate()
109 * tb_path_activate() - activate a path
111 * Activate a path starting with the last hop and iterating backwards. The
112 * caller must fill path->hops before calling tb_path_activate().
116 int tb_path_activate(struct tb_path *path) in tb_path_activate() argument
120 if (path->activated) { in tb_path_activate()
121 tb_WARN(path->tb, "trying to activate already activated path\n"); in tb_path_activate()
125 tb_info(path->tb, in tb_path_activate()
126 "activating path from %llx:%x to %llx:%x\n", in tb_path_activate()
127 tb_route(path->hops[0].in_port->sw), in tb_path_activate()
128 path->hops[0].in_port->port, in tb_path_activate()
129 tb_route(path->hops[path->path_length - 1].out_port->sw), in tb_path_activate()
130 path->hops[path->path_length - 1].out_port->port); in tb_path_activate()
133 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
134 if (path->hops[i].in_counter_index == -1) in tb_path_activate()
136 res = tb_port_clear_counter(path->hops[i].in_port, in tb_path_activate()
137 path->hops[i].in_counter_index); in tb_path_activate()
143 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
144 res = tb_port_add_nfc_credits(path->hops[i].in_port, in tb_path_activate()
145 path->nfc_credits); in tb_path_activate()
147 __tb_path_deallocate_nfc(path, i); in tb_path_activate()
153 for (i = path->path_length - 1; i >= 0; i--) { in tb_path_activate()
160 * defunct) firmeware path. This causes the hotplug operation to in tb_path_activate()
167 res = tb_port_write(path->hops[i].in_port, &hop, TB_CFG_HOPS, in tb_path_activate()
168 2 * path->hops[i].in_hop_index, 2); in tb_path_activate()
170 __tb_path_deactivate_hops(path, i); in tb_path_activate()
171 __tb_path_deallocate_nfc(path, 0); in tb_path_activate()
176 hop.next_hop = path->hops[i].next_hop_index; in tb_path_activate()
177 hop.out_port = path->hops[i].out_port->port; in tb_path_activate()
179 hop.initial_credits = (i == path->path_length - 1) ? 16 : 7; in tb_path_activate()
184 out_mask = (i == path->path_length - 1) ? in tb_path_activate()
187 hop.weight = path->weight; in tb_path_activate()
189 hop.priority = path->priority; in tb_path_activate()
190 hop.drop_packages = path->drop_packages; in tb_path_activate()
191 hop.counter = path->hops[i].in_counter_index; in tb_path_activate()
192 hop.counter_enable = path->hops[i].in_counter_index != -1; in tb_path_activate()
193 hop.ingress_fc = path->ingress_fc_enable & in_mask; in tb_path_activate()
194 hop.egress_fc = path->egress_fc_enable & out_mask; in tb_path_activate()
195 hop.ingress_shared_buffer = path->ingress_shared_buffer in tb_path_activate()
197 hop.egress_shared_buffer = path->egress_shared_buffer in tb_path_activate()
201 tb_port_info(path->hops[i].in_port, "Writing hop %d, index %d", in tb_path_activate()
202 i, path->hops[i].in_hop_index); in tb_path_activate()
203 tb_dump_hop(path->hops[i].in_port, &hop); in tb_path_activate()
204 res = tb_port_write(path->hops[i].in_port, &hop, TB_CFG_HOPS, in tb_path_activate()
205 2 * path->hops[i].in_hop_index, 2); in tb_path_activate()
207 __tb_path_deactivate_hops(path, i); in tb_path_activate()
208 __tb_path_deallocate_nfc(path, 0); in tb_path_activate()
212 path->activated = true; in tb_path_activate()
213 tb_info(path->tb, "path activation complete\n"); in tb_path_activate()
216 tb_WARN(path->tb, "path activation failed\n"); in tb_path_activate()
221 * tb_path_is_invalid() - check whether any ports on the path are invalid
223 * Return: Returns true if the path is invalid, false otherwise.
225 bool tb_path_is_invalid(struct tb_path *path) in tb_path_is_invalid() argument
228 for (i = 0; i < path->path_length; i++) { in tb_path_is_invalid()
229 if (path->hops[i].in_port->sw->is_unplugged) in tb_path_is_invalid()
231 if (path->hops[i].out_port->sw->is_unplugged) in tb_path_is_invalid()