summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEddie James <eajames@us.ibm.com>2017-12-20 10:50:03 -0600
committerEddie James <eajames@us.ibm.com>2017-12-20 15:54:01 -0600
commitdae2d940092520c839a0af00970b448ca4c36a88 (patch)
treee4d0c608addc9e68468ce0d26f1e08e17fc13a5e
parent9fd2bdcab930620e67fce69dc6a9e6e11e9880b4 (diff)
downloadopenpower-occ-control-dae2d940092520c839a0af00970b448ca4c36a88.zip
openpower-occ-control-dae2d940092520c839a0af00970b448ca4c36a88.tar.gz
Only add presence watching when all OCCs are bound
The OCC present count returns the number of OCCs in the system. Before we have bound the second OCC, this will be greater than the number of OCCs the Manager has counted as Active, resulting in a mismatch, causing an error. Resolves openbmc/openbmc#2733 Change-Id: Ia37a6b152fb073cf3044c601501903bcdfe9d3fe Signed-off-by: Eddie James <eajames@us.ibm.com>
-rw-r--r--occ_device.hpp14
-rw-r--r--occ_manager.cpp9
-rw-r--r--occ_status.hpp6
3 files changed, 24 insertions, 5 deletions
diff --git a/occ_device.hpp b/occ_device.hpp
index fd30641..2ca94f5 100644
--- a/occ_device.hpp
+++ b/occ_device.hpp
@@ -105,11 +105,6 @@ class Device
/** @brief Starts to monitor for errors */
inline void addErrorWatch()
{
- if (master())
- {
- presence.addWatch();
- }
-
throttleProcTemp.addWatch();
throttleProcPower.addWatch();
throttleMemTemp.addWatch();
@@ -128,6 +123,15 @@ class Device
throttleProcTemp.removeWatch();
}
+ /** @brief Starts to watch how many OCCs are present on the master */
+ inline void addPresenceWatchMaster()
+ {
+ if (master())
+ {
+ presence.addWatch();
+ }
+ }
+
private:
/** @brief Config value to be used to do bind and unbind */
const std::string config;
diff --git a/occ_manager.cpp b/occ_manager.cpp
index 040676b..6fd0652 100644
--- a/occ_manager.cpp
+++ b/occ_manager.cpp
@@ -82,6 +82,15 @@ void Manager::statusCallBack(bool status)
}
activeCount += status ? 1 : -1;
+
+ // Only start presence detection if all the OCCs are bound
+ if (activeCount == statusObjects.size())
+ {
+ for (auto &obj : statusObjects)
+ {
+ obj->addPresenceWatchMaster();
+ }
+ }
}
#ifdef I2C_OCC
diff --git a/occ_status.hpp b/occ_status.hpp
index 60134fb..d88ef6b 100644
--- a/occ_status.hpp
+++ b/occ_status.hpp
@@ -120,6 +120,12 @@ class Status : public Interface
return device.removeErrorWatch();
}
+ /** @brief Starts to watch how many OCCs are present on the master */
+ inline void addPresenceWatchMaster()
+ {
+ return device.addPresenceWatchMaster();
+ }
+
private:
/** @brief sdbus handle */
OpenPOWER on IntegriCloud