aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2005-12-01 18:51:52 -0500
committerJody McIntyre <scjody@modernduck.com>2005-12-12 23:20:58 -0500
commit48622b7bde008387218a416586e9d072b385f1ae (patch)
treed22fd4f43ffd7b071a60375fb92a728553687c90 /drivers/ieee1394
parente4f5c82a92c2a546a16af1614114eec19120e40a (diff)
ieee1394: resume remote ports when starting a host (fixes device recognition)
After initializing an IEEE 1394 host, broadcast a resume packet. This makes remote nodes visible which suspended their ports while the host was down. Such nodes had to be unplugged and replugged in order to be recognized. Motorola DCT6200 cable reciever was affected, probably other devices too. http://marc.theaimsgroup.com/?t=113202715800001 Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> Signed-off-by: Jody McIntyre <scjody@modernduck.com> (cherry picked from 14c0fa243b358c24040ff5f44b60c47aaf6430c3 commit)
Diffstat (limited to 'drivers/ieee1394')
-rw-r--r--drivers/ieee1394/hosts.h1
-rw-r--r--drivers/ieee1394/nodemgr.c25
2 files changed, 26 insertions, 0 deletions
diff --git a/drivers/ieee1394/hosts.h b/drivers/ieee1394/hosts.h
index 38f42112dff0..ae9b02cc013f 100644
--- a/drivers/ieee1394/hosts.h
+++ b/drivers/ieee1394/hosts.h
@@ -41,6 +41,7 @@ struct hpsb_host {
41 /* this nodes state */ 41 /* this nodes state */
42 unsigned in_bus_reset:1; 42 unsigned in_bus_reset:1;
43 unsigned is_shutdown:1; 43 unsigned is_shutdown:1;
44 unsigned resume_packet_sent:1;
44 45
45 /* this nodes' duties on the bus */ 46 /* this nodes' duties on the bus */
46 unsigned is_root:1; 47 unsigned is_root:1;
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
index 7fff5a1d2ea4..f7c3dbaf5802 100644
--- a/drivers/ieee1394/nodemgr.c
+++ b/drivers/ieee1394/nodemgr.c
@@ -1413,6 +1413,24 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
1413 return; 1413 return;
1414} 1414}
1415 1415
1416static int nodemgr_send_resume_packet(struct hpsb_host *host)
1417{
1418 struct hpsb_packet *packet;
1419 int ret = 1;
1420
1421 packet = hpsb_make_phypacket(host,
1422 0x003c0000 | NODEID_TO_NODE(host->node_id) << 24);
1423 if (packet) {
1424 packet->no_waiter = 1;
1425 packet->generation = get_hpsb_generation(host);
1426 ret = hpsb_send_packet(packet);
1427 }
1428 if (ret)
1429 HPSB_WARN("fw-host%d: Failed to broadcast resume packet",
1430 host->id);
1431 return ret;
1432}
1433
1416/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other 1434/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
1417 * nodes of the broadcast channel. (Really we're only setting the validity 1435 * nodes of the broadcast channel. (Really we're only setting the validity
1418 * bit). Other IRM responsibilities go in here as well. */ 1436 * bit). Other IRM responsibilities go in here as well. */
@@ -1463,6 +1481,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
1463 } 1481 }
1464 } 1482 }
1465 1483
1484 /* Some devices suspend their ports while being connected to an inactive
1485 * host adapter, i.e. if connected before the low-level driver is
1486 * loaded. They become visible either when physically unplugged and
1487 * replugged, or when receiving a resume packet. Send one once. */
1488 if (!host->resume_packet_sent && !nodemgr_send_resume_packet(host))
1489 host->resume_packet_sent = 1;
1490
1466 return 1; 1491 return 1;
1467} 1492}
1468 1493