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 | |
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>
-rw-r--r-- | drivers/firewire/fw-card.c | 7 | ||||
-rw-r--r-- | drivers/firewire/fw-topology.c | 16 | ||||
-rw-r--r-- | drivers/firewire/fw-topology.h | 6 | ||||
-rw-r--r-- | drivers/firewire/fw-transaction.h | 2 |
4 files changed, 14 insertions, 17 deletions
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c index 9eb1edacd825..0aeab3218bb6 100644 --- a/drivers/firewire/fw-card.c +++ b/drivers/firewire/fw-card.c | |||
@@ -336,8 +336,11 @@ fw_card_bm_work(struct work_struct *work) | |||
336 | } | 336 | } |
337 | 337 | ||
338 | pick_me: | 338 | pick_me: |
339 | /* Now figure out what gap count to set. */ | 339 | /* |
340 | if (card->topology_type == FW_TOPOLOGY_A && | 340 | * Pick a gap count from 1394a table E-1. The table doesn't cover |
341 | * the typically much larger 1394b beta repeater delays though. | ||
342 | */ | ||
343 | if (!card->beta_repeaters_present && | ||
341 | card->root_node->max_hops < ARRAY_SIZE(gap_count_table)) | 344 | card->root_node->max_hops < ARRAY_SIZE(gap_count_table)) |
342 | gap_count = gap_count_table[card->root_node->max_hops]; | 345 | gap_count = gap_count_table[card->root_node->max_hops]; |
343 | else | 346 | else |
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 | } |
diff --git a/drivers/firewire/fw-topology.h b/drivers/firewire/fw-topology.h index 363b6cbcd0b3..aced9f7db358 100644 --- a/drivers/firewire/fw-topology.h +++ b/drivers/firewire/fw-topology.h | |||
@@ -20,12 +20,6 @@ | |||
20 | #define __fw_topology_h | 20 | #define __fw_topology_h |
21 | 21 | ||
22 | enum { | 22 | enum { |
23 | FW_TOPOLOGY_A = 0x01, | ||
24 | FW_TOPOLOGY_B = 0x02, | ||
25 | FW_TOPOLOGY_MIXED = 0x03, | ||
26 | }; | ||
27 | |||
28 | enum { | ||
29 | FW_NODE_CREATED = 0x00, | 23 | FW_NODE_CREATED = 0x00, |
30 | FW_NODE_UPDATED = 0x01, | 24 | FW_NODE_UPDATED = 0x01, |
31 | FW_NODE_DESTROYED = 0x02, | 25 | FW_NODE_DESTROYED = 0x02, |
diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h index f54eee4e3803..5abed193f4a6 100644 --- a/drivers/firewire/fw-transaction.h +++ b/drivers/firewire/fw-transaction.h | |||
@@ -245,7 +245,7 @@ struct fw_card { | |||
245 | struct fw_node *irm_node; | 245 | struct fw_node *irm_node; |
246 | int color; | 246 | int color; |
247 | int gap_count; | 247 | int gap_count; |
248 | int topology_type; | 248 | bool beta_repeaters_present; |
249 | 249 | ||
250 | int index; | 250 | int index; |
251 | 251 | ||