diff options
author | Jody McIntyre <scjody@steamballoon.com> | 2005-09-30 14:59:08 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-30 15:41:19 -0400 |
commit | 328699bf0ff4d35a9932ce279441f955e78a890e (patch) | |
tree | 2e09a7e6c8f1648f0f2aeaea5e175b934118d3c5 /drivers/ieee1394 | |
parent | 2bab359a5009f330b12a4ed09a57d3d2ac6b3483 (diff) |
[PATCH] ieee1394: reorder activities after bus reset (fixes device detection)
Units were not detected if the local IRM performed a bus reset. ("The root
node is not cycle master capable; selecting a new root node and resetting...",
often seen with iPods and other SBP-2 devices). Rearrange the order of IRM
duties and node scanning. TODO: Audit the ROM caching and parsing code for
underlying issues.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Jody McIntyre <scjody@steamballoon.com>
Cc: Ben Collins <bcollins@debian.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/ieee1394')
-rw-r--r-- | drivers/ieee1394/nodemgr.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index b23322523ef5..743f13c81adb 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
@@ -1438,9 +1438,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles) | |||
1438 | if (host->busmgr_id == 0xffff && host->node_count > 1) | 1438 | if (host->busmgr_id == 0xffff && host->node_count > 1) |
1439 | { | 1439 | { |
1440 | u16 root_node = host->node_count - 1; | 1440 | u16 root_node = host->node_count - 1; |
1441 | struct node_entry *ne = find_entry_by_nodeid(host, root_node | LOCAL_BUS); | ||
1442 | 1441 | ||
1443 | if (ne && ne->busopt.cmc) | 1442 | /* get cycle master capability flag from root node */ |
1443 | if (host->is_cycmst || | ||
1444 | (!hpsb_read(host, LOCAL_BUS | root_node, get_hpsb_generation(host), | ||
1445 | (CSR_REGISTER_BASE + CSR_CONFIG_ROM + 2 * sizeof(quadlet_t)), | ||
1446 | &bc, sizeof(quadlet_t)) && | ||
1447 | be32_to_cpu(bc) & 1 << CSR_CMC_SHIFT)) | ||
1444 | hpsb_send_phy_config(host, root_node, -1); | 1448 | hpsb_send_phy_config(host, root_node, -1); |
1445 | else { | 1449 | else { |
1446 | HPSB_DEBUG("The root node is not cycle master capable; " | 1450 | HPSB_DEBUG("The root node is not cycle master capable; " |
@@ -1557,24 +1561,19 @@ static int nodemgr_host_thread(void *__hi) | |||
1557 | } | 1561 | } |
1558 | } | 1562 | } |
1559 | 1563 | ||
1560 | if (!nodemgr_check_irm_capability(host, reset_cycles)) { | 1564 | if (!nodemgr_check_irm_capability(host, reset_cycles) || |
1565 | !nodemgr_do_irm_duties(host, reset_cycles)) { | ||
1561 | reset_cycles++; | 1566 | reset_cycles++; |
1562 | up(&nodemgr_serialize); | 1567 | up(&nodemgr_serialize); |
1563 | continue; | 1568 | continue; |
1564 | } | 1569 | } |
1570 | reset_cycles = 0; | ||
1565 | 1571 | ||
1566 | /* Scan our nodes to get the bus options and create node | 1572 | /* Scan our nodes to get the bus options and create node |
1567 | * entries. This does not do the sysfs stuff, since that | 1573 | * entries. This does not do the sysfs stuff, since that |
1568 | * would trigger hotplug callbacks and such, which is a | 1574 | * would trigger hotplug callbacks and such, which is a |
1569 | * bad idea at this point. */ | 1575 | * bad idea at this point. */ |
1570 | nodemgr_node_scan(hi, generation); | 1576 | nodemgr_node_scan(hi, generation); |
1571 | if (!nodemgr_do_irm_duties(host, reset_cycles)) { | ||
1572 | reset_cycles++; | ||
1573 | up(&nodemgr_serialize); | ||
1574 | continue; | ||
1575 | } | ||
1576 | |||
1577 | reset_cycles = 0; | ||
1578 | 1577 | ||
1579 | /* This actually does the full probe, with sysfs | 1578 | /* This actually does the full probe, with sysfs |
1580 | * registration. */ | 1579 | * registration. */ |