diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-06-18 13:44:12 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2007-07-09 18:07:43 -0400 |
commit | 24d40125f1f59a6de9d9e6e046676bd60532596c (patch) | |
tree | 312fb396c7b5987313ce20ca033947faf54a273c /drivers/firewire/fw-topology.c | |
parent | 25d83f583b334ac671fbb905c97c374ba34a597a (diff) |
firewire: optimize gap count with 1394b leaf nodes
Table-based gap count optimization cannot be used if 1394b repeater PHYs
are present. But it does work with 1394b leaf nodes.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Kristian Høgsberg <krh@redhat.com>
Diffstat (limited to 'drivers/firewire/fw-topology.c')
-rw-r--r-- | drivers/firewire/fw-topology.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c index 4e358506d913..77e3f8276007 100644 --- a/drivers/firewire/fw-topology.c +++ b/drivers/firewire/fw-topology.c | |||
@@ -172,7 +172,8 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
172 | struct list_head stack, *h; | 172 | struct list_head stack, *h; |
173 | u32 *next_sid, *end, q; | 173 | u32 *next_sid, *end, q; |
174 | int i, port_count, child_port_count, phy_id, parent_count, stack_depth; | 174 | int i, port_count, child_port_count, phy_id, parent_count, stack_depth; |
175 | int gap_count, topology_type; | 175 | int gap_count; |
176 | bool beta_repeaters_present; | ||
176 | 177 | ||
177 | local_node = NULL; | 178 | local_node = NULL; |
178 | node = NULL; | 179 | node = NULL; |
@@ -182,7 +183,7 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
182 | phy_id = 0; | 183 | phy_id = 0; |
183 | irm_node = NULL; | 184 | irm_node = NULL; |
184 | gap_count = SELF_ID_GAP_COUNT(*sid); | 185 | gap_count = SELF_ID_GAP_COUNT(*sid); |
185 | topology_type = 0; | 186 | beta_repeaters_present = false; |
186 | 187 | ||
187 | while (sid < end) { | 188 | while (sid < end) { |
188 | next_sid = count_ports(sid, &port_count, &child_port_count); | 189 | next_sid = count_ports(sid, &port_count, &child_port_count); |
@@ -224,11 +225,6 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
224 | if (SELF_ID_CONTENDER(q)) | 225 | if (SELF_ID_CONTENDER(q)) |
225 | irm_node = node; | 226 | irm_node = node; |
226 | 227 | ||
227 | if (node->phy_speed == SCODE_BETA) | ||
228 | topology_type |= FW_TOPOLOGY_B; | ||
229 | else | ||
230 | topology_type |= FW_TOPOLOGY_A; | ||
231 | |||
232 | parent_count = 0; | 228 | parent_count = 0; |
233 | 229 | ||
234 | for (i = 0; i < port_count; i++) { | 230 | for (i = 0; i < port_count; i++) { |
@@ -278,6 +274,10 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
278 | list_add_tail(&node->link, &stack); | 274 | list_add_tail(&node->link, &stack); |
279 | stack_depth += 1 - child_port_count; | 275 | stack_depth += 1 - child_port_count; |
280 | 276 | ||
277 | if (node->phy_speed == SCODE_BETA && | ||
278 | parent_count + child_port_count > 1) | ||
279 | beta_repeaters_present = true; | ||
280 | |||
281 | /* | 281 | /* |
282 | * If all PHYs does not report the same gap count | 282 | * If all PHYs does not report the same gap count |
283 | * setting, we fall back to 63 which will force a gap | 283 | * setting, we fall back to 63 which will force a gap |
@@ -295,7 +295,7 @@ static struct fw_node *build_tree(struct fw_card *card, | |||
295 | card->root_node = node; | 295 | card->root_node = node; |
296 | card->irm_node = irm_node; | 296 | card->irm_node = irm_node; |
297 | card->gap_count = gap_count; | 297 | card->gap_count = gap_count; |
298 | card->topology_type = topology_type; | 298 | card->beta_repeaters_present = beta_repeaters_present; |
299 | 299 | ||
300 | return local_node; | 300 | return local_node; |
301 | } | 301 | } |