mirror of
https://github.com/torvalds/linux
synced 2024-09-20 19:17:24 +00:00
[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>
This commit is contained in:
parent
2bab359a50
commit
328699bf0f
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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. */
|
||||||
|
|
Loading…
Reference in a new issue