Commit 328699bf authored by Jody McIntyre's avatar Jody McIntyre Committed by Linus Torvalds

[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: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: default avatarJody McIntyre <scjody@steamballoon.com>
Cc: Ben Collins <bcollins@debian.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 2bab359a
...@@ -1438,9 +1438,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles) ...@@ -1438,9 +1438,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
if (host->busmgr_id == 0xffff && host->node_count > 1) if (host->busmgr_id == 0xffff && host->node_count > 1)
{ {
u16 root_node = host->node_count - 1; u16 root_node = host->node_count - 1;
struct node_entry *ne = find_entry_by_nodeid(host, root_node | LOCAL_BUS);
if (ne && ne->busopt.cmc) /* get cycle master capability flag from root node */
if (host->is_cycmst ||
(!hpsb_read(host, LOCAL_BUS | root_node, get_hpsb_generation(host),
(CSR_REGISTER_BASE + CSR_CONFIG_ROM + 2 * sizeof(quadlet_t)),
&bc, sizeof(quadlet_t)) &&
be32_to_cpu(bc) & 1 << CSR_CMC_SHIFT))
hpsb_send_phy_config(host, root_node, -1); hpsb_send_phy_config(host, root_node, -1);
else { else {
HPSB_DEBUG("The root node is not cycle master capable; " HPSB_DEBUG("The root node is not cycle master capable; "
...@@ -1557,24 +1561,19 @@ static int nodemgr_host_thread(void *__hi) ...@@ -1557,24 +1561,19 @@ static int nodemgr_host_thread(void *__hi)
} }
} }
if (!nodemgr_check_irm_capability(host, reset_cycles)) { if (!nodemgr_check_irm_capability(host, reset_cycles) ||
!nodemgr_do_irm_duties(host, reset_cycles)) {
reset_cycles++; reset_cycles++;
up(&nodemgr_serialize); up(&nodemgr_serialize);
continue; continue;
} }
reset_cycles = 0;
/* Scan our nodes to get the bus options and create node /* Scan our nodes to get the bus options and create node
* entries. This does not do the sysfs stuff, since that * entries. This does not do the sysfs stuff, since that
* would trigger hotplug callbacks and such, which is a * would trigger hotplug callbacks and such, which is a
* bad idea at this point. */ * bad idea at this point. */
nodemgr_node_scan(hi, generation); nodemgr_node_scan(hi, generation);
if (!nodemgr_do_irm_duties(host, reset_cycles)) {
reset_cycles++;
up(&nodemgr_serialize);
continue;
}
reset_cycles = 0;
/* This actually does the full probe, with sysfs /* This actually does the full probe, with sysfs
* registration. */ * registration. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment