Skip to content

Commit

Permalink
ieee1394: resume remote ports when starting a host (fixes device reco…
Browse files Browse the repository at this point in the history
…gnition)

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 14c0fa2 commit)
  • Loading branch information
Stefan Richter authored and scjody committed Dec 13, 2005
1 parent e4f5c82 commit 48622b7
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/ieee1394/hosts.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct hpsb_host {
/* this nodes state */
unsigned in_bus_reset:1;
unsigned is_shutdown:1;
unsigned resume_packet_sent:1;

/* this nodes' duties on the bus */
unsigned is_root:1;
Expand Down
25 changes: 25 additions & 0 deletions drivers/ieee1394/nodemgr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1413,6 +1413,24 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
return;
}

static int nodemgr_send_resume_packet(struct hpsb_host *host)
{
struct hpsb_packet *packet;
int ret = 1;

packet = hpsb_make_phypacket(host,
0x003c0000 | NODEID_TO_NODE(host->node_id) << 24);
if (packet) {
packet->no_waiter = 1;
packet->generation = get_hpsb_generation(host);
ret = hpsb_send_packet(packet);
}
if (ret)
HPSB_WARN("fw-host%d: Failed to broadcast resume packet",
host->id);
return ret;
}

/* Because we are a 1394a-2000 compliant IRM, we need to inform all the other
* nodes of the broadcast channel. (Really we're only setting the validity
* bit). Other IRM responsibilities go in here as well. */
Expand Down Expand Up @@ -1463,6 +1481,13 @@ static int nodemgr_do_irm_duties(struct hpsb_host *host, int cycles)
}
}

/* Some devices suspend their ports while being connected to an inactive
* host adapter, i.e. if connected before the low-level driver is
* loaded. They become visible either when physically unplugged and
* replugged, or when receiving a resume packet. Send one once. */
if (!host->resume_packet_sent && !nodemgr_send_resume_packet(host))
host->resume_packet_sent = 1;

return 1;
}

Expand Down

0 comments on commit 48622b7

Please sign in to comment.