aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394
diff options
context:
space:
mode:
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 3f0917bbd7f5..b56934edd62b 100644
--- a/drivers/ieee1394/nodemgr.c
+++ b/drivers/ieee1394/nodemgr.c
@@ -1410,6 +1410,24 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
1410 return; 1410 return;
1411} 1411}
1412 1412
1413static int nodemgr_send_resume_packet(struct hpsb_host *host)
1414{
1415 struct hpsb_packet *packet;
1416 int ret = 1;
1417
1418 packet = hpsb_make_phypacket(host,
1419 0x003c0000 | NODEID_TO_NODE(host->node_id) << 24);
1420 if (packet) {
1421 packet->no_waiter = 1;
1422 packet->generation = get_hpsb_generation(host);
1423 ret = hpsb_send_packet(packet);
1424 }
1425 if (ret)
1426 HPSB_WARN("fw-host%d: Failed to broadcast resume packet",
1427 host->id);
1428 return ret;
1429}
1430
1413/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other 1431/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
1414 * nodes of the broadcast channel. (Really we're only setting the validity 1432 * nodes of the broadcast channel. (Really we're only setting the validity
1415 * bit). Other IRM responsibilities go in here as well. */ 1433 * bit). Other IRM responsibilities go in here as well. */
@@ -1460,6 +1478,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
1460 } 1478 }
1461 } 1479 }
1462 1480
1481 /* Some devices suspend their ports while being connected to an inactive
1482 * host adapter, i.e. if connected before the low-level driver is
1483 * loaded. They become visible either when physically unplugged and
1484 * replugged, or when receiving a resume packet. Send one once. */
1485 if (!host->resume_packet_sent && !nodemgr_send_resume_packet(host))
1486 host->resume_packet_sent = 1;
1487
1463 return 1; 1488 return 1;
1464} 1489}
1465 1490