From ef27546ea1d0ae4e155ed994d08ab541740f0ea0 Mon Sep 17 00:00:00 2001
From: Juliano Murari <juliano.murari@ess.eu>
Date: Tue, 9 Aug 2022 13:43:07 +0200
Subject: [PATCH] Add fiber reset PV

---
 sis8300bcmApp/Db/sis8300bcm-fiber.template |  9 +++++++++
 sis8300bcmApp/src/sis8300bcm.cpp           |  8 +++++++-
 sis8300bcmApp/src/sis8300bcm.h             |  2 ++
 vendor/ess/lib/sis8300bcm_reg.h            |  1 +
 vendor/ess/lib/sis8300drvbcm.c             | 10 ++++++++++
 vendor/ess/lib/sis8300drvbcm.h             |  1 +
 6 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/sis8300bcmApp/Db/sis8300bcm-fiber.template b/sis8300bcmApp/Db/sis8300bcm-fiber.template
index 0211cb9..c352ffc 100644
--- a/sis8300bcmApp/Db/sis8300bcm-fiber.template
+++ b/sis8300bcmApp/Db/sis8300bcm-fiber.template
@@ -125,3 +125,12 @@ record(bi, "$(P)$(R)SoftwareErrorR")
     field(SCAN, "I/O Intr")
 }
 
+record(bo, "$(P)$(R)Reset")
+{
+    field(DTYP, "asynInt32")
+    field(OUT,  "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.RESET")
+    field(ZNAM, "No")
+    field(ONAM, "Yes")
+    field(HIGH, "1")
+#    field(ASG,  "critical")
+}
diff --git a/sis8300bcmApp/src/sis8300bcm.cpp b/sis8300bcmApp/src/sis8300bcm.cpp
index 7c791fb..3ee42ce 100644
--- a/sis8300bcmApp/src/sis8300bcm.cpp
+++ b/sis8300bcmApp/src/sis8300bcm.cpp
@@ -323,6 +323,7 @@ sis8300bcm::sis8300bcm(const char *portName, const char *devicePath,
     createParam(BCMFiberChannelUpString,                    asynParamInt32,     &BCMFiberChannelUp);
     createParam(BCMFiberHardwareErrorString,                asynParamInt32,     &BCMFiberHardwareError);
     createParam(BCMFiberSoftwareErrorString,                asynParamInt32,     &BCMFiberSoftwareError);
+    createParam(BCMFiberResetString,                        asynParamInt32,     &BCMFiberReset);
     // LUT, channel specific
     char buf[255];
     for (int i = 0; i < BCM_LUT_SIZE; i++) {
@@ -1931,12 +1932,17 @@ asynStatus sis8300bcm::writeInt32(asynUser *pasynUser, epicsInt32 value)
         if (ret) {
             asynPrintError(pasynUserSelf, "sis8300drvbcm_set_fiber_out_data_enable returned %d", ret);
         }
+
+    } else if (function == BCMFiberReset) {
+        ret = sis8300drvbcm_set_fiber_reset(mDeviceHandle, addr, value);
+        if (ret) {
+            asynPrintError(pasynUserSelf, "sis8300drvbcm_set_fiber_reset returned %d", ret);
+        }
     } else {
         if (function < BCM_FIRST_PARAM) {
             status = sis8300::writeInt32(pasynUser, value);
         }
     }
-
     if (ret) {
         status = asynError;
         snprintf(mMessageBuffer, MAX_MESSAGE_LENGTH, "[%s,%d,%s] set failed: value %d", portName, addr, name, value);
diff --git a/sis8300bcmApp/src/sis8300bcm.h b/sis8300bcmApp/src/sis8300bcm.h
index b23167b..aa1a710 100644
--- a/sis8300bcmApp/src/sis8300bcm.h
+++ b/sis8300bcmApp/src/sis8300bcm.h
@@ -219,6 +219,7 @@
 #define BCMFiberChannelUpString                      "BCM.FIBER.CHANNEL_UP"
 #define BCMFiberHardwareErrorString                  "BCM.FIBER.HARDWARE_ERROR"
 #define BCMFiberSoftwareErrorString                  "BCM.FIBER.SOFTWARE_ERROR"
+#define BCMFiberResetString                          "BCM.FIBER.RESET"
 // LUT, board specific, 16 locations
 #define BCMLutDestinationIDString                    "BCM.LUT%d.DEST_ID"
 #define BCMLutMinTriggerPeriodString                 "BCM.LUT%d.MIN_TRIGGER_PERIOD"
@@ -438,6 +439,7 @@ protected:
     int BCMFiberChannelUp;
     int BCMFiberHardwareError;
     int BCMFiberSoftwareError;
+    int BCMFiberReset;
     // LUT, board specific
     int BCMLutDestinationID[BCM_LUT_SIZE];
     int BCMLutMinTriggerPeriod[BCM_LUT_SIZE];
diff --git a/vendor/ess/lib/sis8300bcm_reg.h b/vendor/ess/lib/sis8300bcm_reg.h
index 6057add..62a96e4 100644
--- a/vendor/ess/lib/sis8300bcm_reg.h
+++ b/vendor/ess/lib/sis8300bcm_reg.h
@@ -189,6 +189,7 @@ extern "C" {
  */
 #define SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF           0x000
 #define SIS8300BCM_FIBR_X_STATUS_OFF                    0x001
+#define SIS8300BCM_FIBR_X_RESET_OFF                     0x002
 
 #ifdef __cplusplus
 }
diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c
index e455edd..70581cb 100644
--- a/vendor/ess/lib/sis8300drvbcm.c
+++ b/vendor/ess/lib/sis8300drvbcm.c
@@ -2958,3 +2958,13 @@ int sis8300drvbcm_get_fiber_software_error(sis8300drv_usr *sisuser, unsigned int
     return ret;
 }
 
+int sis8300drvbcm_set_fiber_reset(sis8300drv_usr *sisuser, unsigned int channel, unsigned int reset)
+{
+    unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \
+            (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \
+            SIS8300BCM_FIBR_BANK_OFF + \
+            SIS8300BCM_FIBR_X_RESET_OFF;
+    int ret = sis8300drv_reg_write(sisuser, reg, reset);
+    return ret;
+}
+
diff --git a/vendor/ess/lib/sis8300drvbcm.h b/vendor/ess/lib/sis8300drvbcm.h
index 98dd3e2..ba82e42 100644
--- a/vendor/ess/lib/sis8300drvbcm.h
+++ b/vendor/ess/lib/sis8300drvbcm.h
@@ -301,6 +301,7 @@ int sis8300drvbcm_get_fiber_lane_up(sis8300drv_usr *sisuser, unsigned int channe
 int sis8300drvbcm_get_fiber_channel_up(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *channel_up);
 int sis8300drvbcm_get_fiber_hardware_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *hardware_error);
 int sis8300drvbcm_get_fiber_software_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *software_error);
+int sis8300drvbcm_set_fiber_reset(sis8300drv_usr *sisuser, unsigned int channel, unsigned int reset);
 
 #ifdef __cplusplus
 }
-- 
GitLab