diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2008-09-01 06:32:13 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-09-01 06:32:13 -0400 |
commit | 9d7548d4ca3c52ecb58f098a32b0756cdf8f96ee (patch) | |
tree | 651f7058bbaa2d8b2855286380d614afcf505118 /drivers/ieee1394/nodemgr.c | |
parent | 31db6e9ea1dbdcf66b8227b4f7035dee1b1dd8c0 (diff) | |
parent | bef69ea0dcce574a425feb0a5aa4c63dd108b9a6 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/ieee1394/nodemgr.c')
-rw-r--r-- | drivers/ieee1394/nodemgr.c | 63 |
1 files changed, 33 insertions, 30 deletions
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 994a21e5a0aa..16240a789650 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
@@ -844,7 +844,7 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr | |||
844 | ne->host = host; | 844 | ne->host = host; |
845 | ne->nodeid = nodeid; | 845 | ne->nodeid = nodeid; |
846 | ne->generation = generation; | 846 | ne->generation = generation; |
847 | ne->needs_probe = 1; | 847 | ne->needs_probe = true; |
848 | 848 | ||
849 | ne->guid = guid; | 849 | ne->guid = guid; |
850 | ne->guid_vendor_id = (guid >> 40) & 0xffffff; | 850 | ne->guid_vendor_id = (guid >> 40) & 0xffffff; |
@@ -1144,7 +1144,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent | |||
1144 | struct csr1212_keyval *kv, *vendor_name_kv = NULL; | 1144 | struct csr1212_keyval *kv, *vendor_name_kv = NULL; |
1145 | u8 last_key_id = 0; | 1145 | u8 last_key_id = 0; |
1146 | 1146 | ||
1147 | ne->needs_probe = 0; | 1147 | ne->needs_probe = false; |
1148 | 1148 | ||
1149 | csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) { | 1149 | csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) { |
1150 | switch (kv->key.id) { | 1150 | switch (kv->key.id) { |
@@ -1295,7 +1295,7 @@ static void nodemgr_update_node(struct node_entry *ne, struct csr1212_csr *csr, | |||
1295 | nodemgr_update_bus_options(ne); | 1295 | nodemgr_update_bus_options(ne); |
1296 | 1296 | ||
1297 | /* Mark the node as new, so it gets re-probed */ | 1297 | /* Mark the node as new, so it gets re-probed */ |
1298 | ne->needs_probe = 1; | 1298 | ne->needs_probe = true; |
1299 | } else { | 1299 | } else { |
1300 | /* old cache is valid, so update its generation */ | 1300 | /* old cache is valid, so update its generation */ |
1301 | struct nodemgr_csr_info *ci = ne->csr->private; | 1301 | struct nodemgr_csr_info *ci = ne->csr->private; |
@@ -1566,57 +1566,60 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge | |||
1566 | struct probe_param { | 1566 | struct probe_param { |
1567 | struct host_info *hi; | 1567 | struct host_info *hi; |
1568 | int generation; | 1568 | int generation; |
1569 | bool probe_now; | ||
1569 | }; | 1570 | }; |
1570 | 1571 | ||
1571 | static int __nodemgr_node_probe(struct device *dev, void *data) | 1572 | static int node_probe(struct device *dev, void *data) |
1572 | { | 1573 | { |
1573 | struct probe_param *param = (struct probe_param *)data; | 1574 | struct probe_param *p = data; |
1574 | struct node_entry *ne; | 1575 | struct node_entry *ne; |
1575 | 1576 | ||
1577 | if (p->generation != get_hpsb_generation(p->hi->host)) | ||
1578 | return -EAGAIN; | ||
1579 | |||
1576 | ne = container_of(dev, struct node_entry, node_dev); | 1580 | ne = container_of(dev, struct node_entry, node_dev); |
1577 | if (!ne->needs_probe) | 1581 | if (ne->needs_probe == p->probe_now) |
1578 | nodemgr_probe_ne(param->hi, ne, param->generation); | 1582 | nodemgr_probe_ne(p->hi, ne, p->generation); |
1579 | if (ne->needs_probe) | ||
1580 | nodemgr_probe_ne(param->hi, ne, param->generation); | ||
1581 | return 0; | 1583 | return 0; |
1582 | } | 1584 | } |
1583 | 1585 | ||
1584 | static void nodemgr_node_probe(struct host_info *hi, int generation) | 1586 | static void nodemgr_node_probe(struct host_info *hi, int generation) |
1585 | { | 1587 | { |
1586 | struct hpsb_host *host = hi->host; | 1588 | struct probe_param p; |
1587 | struct probe_param param; | ||
1588 | 1589 | ||
1589 | param.hi = hi; | 1590 | p.hi = hi; |
1590 | param.generation = generation; | 1591 | p.generation = generation; |
1591 | /* Do some processing of the nodes we've probed. This pulls them | 1592 | /* |
1593 | * Do some processing of the nodes we've probed. This pulls them | ||
1592 | * into the sysfs layer if needed, and can result in processing of | 1594 | * into the sysfs layer if needed, and can result in processing of |
1593 | * unit-directories, or just updating the node and it's | 1595 | * unit-directories, or just updating the node and it's |
1594 | * unit-directories. | 1596 | * unit-directories. |
1595 | * | 1597 | * |
1596 | * Run updates before probes. Usually, updates are time-critical | 1598 | * Run updates before probes. Usually, updates are time-critical |
1597 | * while probes are time-consuming. (Well, those probes need some | 1599 | * while probes are time-consuming. |
1598 | * improvement...) */ | ||
1599 | |||
1600 | class_for_each_device(&nodemgr_ne_class, NULL, ¶m, | ||
1601 | __nodemgr_node_probe); | ||
1602 | |||
1603 | /* If we had a bus reset while we were scanning the bus, it is | ||
1604 | * possible that we did not probe all nodes. In that case, we | ||
1605 | * skip the clean up for now, since we could remove nodes that | ||
1606 | * were still on the bus. Another bus scan is pending which will | ||
1607 | * do the clean up eventually. | ||
1608 | * | 1600 | * |
1601 | * Meanwhile, another bus reset may have happened. In this case we | ||
1602 | * skip everything here and let the next bus scan handle it. | ||
1603 | * Otherwise we may prematurely remove nodes which are still there. | ||
1604 | */ | ||
1605 | p.probe_now = false; | ||
1606 | if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||
1607 | return; | ||
1608 | |||
1609 | p.probe_now = true; | ||
1610 | if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||
1611 | return; | ||
1612 | /* | ||
1609 | * Now let's tell the bus to rescan our devices. This may seem | 1613 | * Now let's tell the bus to rescan our devices. This may seem |
1610 | * like overhead, but the driver-model core will only scan a | 1614 | * like overhead, but the driver-model core will only scan a |
1611 | * device for a driver when either the device is added, or when a | 1615 | * device for a driver when either the device is added, or when a |
1612 | * new driver is added. A bus reset is a good reason to rescan | 1616 | * new driver is added. A bus reset is a good reason to rescan |
1613 | * devices that were there before. For example, an sbp2 device | 1617 | * devices that were there before. For example, an sbp2 device |
1614 | * may become available for login, if the host that held it was | 1618 | * may become available for login, if the host that held it was |
1615 | * just removed. */ | 1619 | * just removed. |
1616 | 1620 | */ | |
1617 | if (generation == get_hpsb_generation(host)) | 1621 | if (bus_rescan_devices(&ieee1394_bus_type) != 0) |
1618 | if (bus_rescan_devices(&ieee1394_bus_type)) | 1622 | HPSB_DEBUG("bus_rescan_devices had an error"); |
1619 | HPSB_DEBUG("bus_rescan_devices had an error"); | ||
1620 | } | 1623 | } |
1621 | 1624 | ||
1622 | static int nodemgr_send_resume_packet(struct hpsb_host *host) | 1625 | static int nodemgr_send_resume_packet(struct hpsb_host *host) |