psu-ng: Continue reading after readFail

Update the PMBus::read() function to allow for not creating journal
trace and elog, but default to continuing to trace and elog, the
previous behavior.

If we reach the limit of read failures that results in a communication
error log, continue to read, but stop logging failures.

If communication restores, we may be able to detect what caused the read
failure, or otherwise detect or clear new faults.

Change-Id: If59b86211ab54c31248ede78f8f117b607298923
Signed-off-by: Brandon Wyman <bjwyman@gmail.com>
diff --git a/phosphor-power-supply/test/power_supply_tests.cpp b/phosphor-power-supply/test/power_supply_tests.cpp
index 22c15e2..c556f82 100644
--- a/phosphor-power-supply/test/power_supply_tests.cpp
+++ b/phosphor-power-supply/test/power_supply_tests.cpp
@@ -38,7 +38,7 @@
 void setPMBusExpectations(MockedPMBus& mockPMBus,
                           const PMBusExpectations& expectations)
 {
-    EXPECT_CALL(mockPMBus, read(STATUS_WORD, _))
+    EXPECT_CALL(mockPMBus, read(STATUS_WORD, _, _))
         .Times(1)
         .WillOnce(Return(expectations.statusWordValue));
 
@@ -47,29 +47,29 @@
         // If fault bits are on in STATUS_WORD, there will also be a read of
         // STATUS_INPUT, STATUS_MFR, STATUS_CML, STATUS_VOUT (page 0), and
         // STATUS_TEMPERATURE.
-        EXPECT_CALL(mockPMBus, read(STATUS_INPUT, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_INPUT, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusInputValue));
-        EXPECT_CALL(mockPMBus, read(STATUS_MFR, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_MFR, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusMFRValue));
-        EXPECT_CALL(mockPMBus, read(STATUS_CML, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_CML, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusCMLValue));
         // Page will need to be set to 0 to read STATUS_VOUT.
         EXPECT_CALL(mockPMBus, insertPageNum(STATUS_VOUT, 0))
             .Times(1)
             .WillOnce(Return("status0_vout"));
-        EXPECT_CALL(mockPMBus, read("status0_vout", _))
+        EXPECT_CALL(mockPMBus, read("status0_vout", _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusVOUTValue));
-        EXPECT_CALL(mockPMBus, read(STATUS_IOUT, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_IOUT, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusIOUTValue));
-        EXPECT_CALL(mockPMBus, read(STATUS_FANS_1_2, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_FANS_1_2, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusFans12Value));
-        EXPECT_CALL(mockPMBus, read(STATUS_TEMPERATURE, _))
+        EXPECT_CALL(mockPMBus, read(STATUS_TEMPERATURE, _, _))
             .Times(1)
             .WillOnce(Return(expectations.statusTempValue));
     }
@@ -107,7 +107,7 @@
     // voltage to the current reading, triggering another clearing of faults
     // due to below minimum to within range voltage.
     // This READ_VIN for CLEAR_FAULTS does not check the returned value.
-    EXPECT_CALL(pmbus, read(READ_VIN, _))
+    EXPECT_CALL(pmbus, read(READ_VIN, _, _))
         .Times(2)
         .WillOnce(Return(1))
         .WillOnce(Return(2));
@@ -311,7 +311,7 @@
         }
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(1));
     psu2.clearFaults();
 
     // STATUS_WORD INPUT/UV fault.
@@ -364,7 +364,9 @@
             .Times(1)
             .WillOnce(Return("209000"));
         // The call for CLEAR_FAULTS command
-        EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(3));
+        EXPECT_CALL(mockPMBus, read(READ_VIN, _, _))
+            .Times(1)
+            .WillOnce(Return(3));
         psu2.analyze();
         // Should remain present, no longer be faulted, no input fault, no
         // VIN_UV fault. Nothing else should change.
@@ -374,7 +376,7 @@
         EXPECT_EQ(psu2.hasVINUVFault(), false);
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(1));
     psu2.clearFaults();
 
     // STATUS_WORD MFR fault.
@@ -416,7 +418,7 @@
         }
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(1));
     psu2.clearFaults();
     // Temperature fault.
     {
@@ -456,7 +458,7 @@
         }
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(1));
     psu2.clearFaults();
     // CML fault
     {
@@ -496,7 +498,7 @@
         }
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(1));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(1));
     psu2.clearFaults();
     // VOUT_OV_FAULT fault
     {
@@ -685,14 +687,7 @@
             EXPECT_EQ(psu2.hasIoutOCFault(), false);
             EXPECT_EQ(psu2.hasFanFault(), false);
             EXPECT_EQ(psu2.hasTempFault(), false);
-            if (x < DEGLITCH_LIMIT)
-            {
-                EXPECT_EQ(psu2.hasPgoodFault(), false);
-            }
-            else
-            {
-                EXPECT_EQ(psu2.hasPgoodFault(), true);
-            }
+            EXPECT_EQ(psu2.hasPgoodFault(), x >= DEGLITCH_LIMIT);
         }
     }
 
@@ -830,7 +825,9 @@
         EXPECT_EQ(psu.hasPSCS12VFault(), x >= DEGLITCH_LIMIT);
     }
 
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(207000));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _))
+        .Times(1)
+        .WillOnce(Return(207000));
     psu.clearFaults();
     EXPECT_EQ(psu.isPresent(), true);
     EXPECT_EQ(psu.isFaulted(), false);
@@ -904,7 +901,7 @@
     EXPECT_CALL(mockPMBus, readString(READ_VIN, _))
         .Times(1)
         .WillOnce(Return("206000"));
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(0));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(0));
     psu.analyze();
     EXPECT_EQ(psu.isPresent(), true);
     EXPECT_EQ(psu.isFaulted(), false);
@@ -1198,7 +1195,7 @@
         .Times(1)
         .WillOnce(Return("201300"));
     // Went from below minimum to within range, expect CLEAR_FAULTS.
-    EXPECT_CALL(mockPMBus, read(READ_VIN, _)).Times(1).WillOnce(Return(3));
+    EXPECT_CALL(mockPMBus, read(READ_VIN, _, _)).Times(1).WillOnce(Return(3));
     psu.analyze();
     EXPECT_EQ(psu.hasVINUVFault(), false);
 }