diff --git a/sis8300bcmApp/Db/sis8300bcm-fiber.template b/sis8300bcmApp/Db/sis8300bcm-fiber.template new file mode 100644 index 0000000000000000000000000000000000000000..145e16490ad6dac6af57500f181c130fd0ce49f4 --- /dev/null +++ b/sis8300bcmApp/Db/sis8300bcm-fiber.template @@ -0,0 +1,136 @@ +#=================================================================# +# Template file: sis8300bcm-fibr.template +# Database for the records specific to the FIBER block of the +# individual BCM channel +# Juliano Murari +# July 20, 2022 + +record(mbbo, "$(P)$(R)OutDataSelect") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.OUT_DATA_SELECT") + field(ZRVL, "0") + field(ZRST, "ACCT Ch01") + field(ONVL, "1") + field(ONST, "ACCT Ch02") + field(TWVL, "2") + field(TWST, "ACCT Ch03") + field(THVL, "3") + field(THST, "ACCT Ch04") + field(FRVL, "4") + field(FRST, "ACCT Ch05") + field(FVVL, "5") + field(FVST, "ACCT Ch06") + field(SXVL, "6") + field(SXST, "ACCT Ch07") + field(SVVL, "7") + field(SVST, "ACCT Ch08") + field(EIVL, "8") + field(EIST, "ACCT Ch09") + field(NIVL, "9") + field(NIST, "ACCT Ch10") + field(ASG, "critical") + info(autosaveFields, "VAL") +} + +record(mbbi, "$(P)$(R)OutDataSelectR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.OUT_DATA_SELECT") + field(SCAN, "I/O Intr") + field(ZRVL, "0") + field(ZRST, "ACCT Ch01") + field(ONVL, "1") + field(ONST, "ACCT Ch02") + field(TWVL, "2") + field(TWST, "ACCT Ch03") + field(THVL, "3") + field(THST, "ACCT Ch04") + field(FRVL, "4") + field(FRST, "ACCT Ch05") + field(FVVL, "5") + field(FVST, "ACCT Ch06") + field(SXVL, "6") + field(SXST, "ACCT Ch07") + field(SVVL, "7") + field(SVST, "ACCT Ch08") + field(EIVL, "8") + field(EIST, "ACCT Ch09") + field(NIVL, "9") + field(NIST, "ACCT Ch10") +} + +record(bo, "$(P)$(R)OutDataEnable") +{ + field(DTYP, "asynInt32") + field(OUT, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.OUT_DATA_ENABLE") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") + field(VAL, "0") + field(PINI, "YES") + field(ASG, "critical") + info(autosaveFields, "VAL") +} +record(bi, "$(P)$(R)OutDataEnableR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.OUT_DATA_ENABLE") + field(ZNAM, "Disabled") + field(ONAM, "Enabled") + field(SCAN, "I/O Intr") +} + +record(bi, "$(P)$(R)SFPPresentR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.SFP_PRESENT") + field(ZNAM, "No") + field(ONAM, "Yes") + field(SCAN, "I/O Intr") +} + +record(bi, "$(P)$(R)LaneUpR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.LANE_UP") + field(ZNAM, "No") + field(ONAM, "Yes") + field(SCAN, "I/O Intr") +} + +record(bi, "$(P)$(R)ChannelUpR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.CHANNEL_UP") + field(ZNAM, "No") + field(ONAM, "Yes") + field(SCAN, "I/O Intr") +} + +record(bi, "$(P)$(R)HardwareErrorR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.HARDWARE_ERROR") + field(ZNAM, "No") + field(ONAM, "Yes") + field(SCAN, "I/O Intr") +} + +record(bi, "$(P)$(R)SoftwareErrorR") +{ + field(DTYP, "asynInt32") + field(INP, "@asyn($(PORT),$(ADDR=0),$(TIMEOUT=1))BCM.FIBER.SOFTWARE_ERROR") + field(ZNAM, "No") + field(ONAM, "Yes") + 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 705aea1b672d31c506dd3e78a85864554d365686..3ee42ce92712593f529f488d6144a0391c99b448 100644 --- a/sis8300bcmApp/src/sis8300bcm.cpp +++ b/sis8300bcmApp/src/sis8300bcm.cpp @@ -315,6 +315,15 @@ sis8300bcm::sis8300bcm(const char *portName, const char *devicePath, // PROBE block, channel specific createParam(BCMProbeChannelString, asynParamInt32, &BCMProbeChannel); createParam(BCMProbeSourceString, asynParamInt32, &BCMProbeSource); + // FIBER block, channel specific + createParam(BCMFiberOutDataSelectString, asynParamInt32, &BCMFiberOutDataSelect); + createParam(BCMFiberOutDataEnableString, asynParamInt32, &BCMFiberOutDataEnable); + createParam(BCMFiberSFPPresentString, asynParamInt32, &BCMFiberSFPPresent); + createParam(BCMFiberLaneUpString, asynParamInt32, &BCMFiberLaneUp); + 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++) { @@ -1357,6 +1366,54 @@ int sis8300bcm::deviceDone() setIntegerParam(addr, BCMDiffAlarmLeakyDirect, (uintValue & 0x08) ? 1 : 0); } + // readback FIBER parameters + for (int addr = 0; addr < SIS8300BCM_NUM_FIBER_CHANNELS; addr++) { + asynPrintDeviceInfo(pasynUserSelf, "readback FIBER %d parameters", addr); + + ret = sis8300drvbcm_get_fiber_out_data_select(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_out_data_select returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberOutDataSelect, uintValue); + ret = sis8300drvbcm_get_fiber_out_data_enable(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_out_data_enable returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberOutDataEnable, uintValue); + ret = sis8300drvbcm_get_fiber_sfp_present(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_sfp_present returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberSFPPresent, uintValue); + ret = sis8300drvbcm_get_fiber_lane_up(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_lane_up returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberLaneUp, uintValue); + ret = sis8300drvbcm_get_fiber_channel_up(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_channel_up returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberChannelUp, uintValue); + ret = sis8300drvbcm_get_fiber_hardware_error(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_hardware_error returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberHardwareError, uintValue); + ret = sis8300drvbcm_get_fiber_software_error(mDeviceHandle, addr, &uintValue); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_get_fiber_software_error returned %d", ret); + return ret; + } + setIntegerParam(addr, BCMFiberSoftwareError, uintValue); + } + return ret; } @@ -1865,12 +1922,27 @@ asynStatus sis8300bcm::writeInt32(asynUser *pasynUser, epicsInt32 value) if (ret) { asynPrintError(pasynUserSelf, "sis8300drvbcm_set_channel_trigger_source returned %d", ret); } + } else if (function == BCMFiberOutDataSelect) { + ret = sis8300drvbcm_set_fiber_out_data_select(mDeviceHandle, addr, value); + if (ret) { + asynPrintError(pasynUserSelf, "sis8300drvbcm_set_fiber_out_data_select returned %d", ret); + } + } else if (function == BCMFiberOutDataEnable) { + ret = sis8300drvbcm_set_fiber_out_data_enable(mDeviceHandle, addr, 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 57fc74b830d8d9e0d6b0ecb46732121f2a020bf7..aa1a71009c01812a7516a0a73a50e861a7c2a612 100644 --- a/sis8300bcmApp/src/sis8300bcm.h +++ b/sis8300bcmApp/src/sis8300bcm.h @@ -211,6 +211,15 @@ // PROBE block, channel specific #define BCMProbeChannelString "BCM.PROBE.CHANNEL" #define BCMProbeSourceString "BCM.PROBE.SOURCE" +// FIBER block, channel specific +#define BCMFiberOutDataSelectString "BCM.FIBER.OUT_DATA_SELECT" +#define BCMFiberOutDataEnableString "BCM.FIBER.OUT_DATA_ENABLE" +#define BCMFiberSFPPresentString "BCM.FIBER.SFP_PRESENT" +#define BCMFiberLaneUpString "BCM.FIBER.LANE_UP" +#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" @@ -422,6 +431,15 @@ protected: // PROBE block, channel specific int BCMProbeChannel; int BCMProbeSource; + // FIBER block, channel specific + int BCMFiberOutDataSelect; + int BCMFiberOutDataEnable; + int BCMFiberSFPPresent; + int BCMFiberLaneUp; + 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 d3f2dc6b1d41424eb552cb14ddb77a96acc99433..62a96e43e3256d5a156f318f2ba1a6407dcafc8b 100644 --- a/vendor/ess/lib/sis8300bcm_reg.h +++ b/vendor/ess/lib/sis8300bcm_reg.h @@ -184,6 +184,13 @@ extern "C" { */ #define SIS8300BCM_PROB_X_SOURCE_OFF 0x000 +/* + FIBER block registers + */ +#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 } #endif diff --git a/vendor/ess/lib/sis8300drvbcm.c b/vendor/ess/lib/sis8300drvbcm.c index 36cb001a40758626b2cc3140709c1b56a1a0de95..70581cbb98e8bc3c7e0c17a7d9c8cefd7772629d 100644 --- a/vendor/ess/lib/sis8300drvbcm.c +++ b/vendor/ess/lib/sis8300drvbcm.c @@ -2791,3 +2791,180 @@ int sis8300drvbcm_get_channel_beam_above_threshold(sis8300drv_usr *sisuser, unsi // printf("%s: channel %d, reg 0x%x, value: %d\n", __func__, channel, reg, value); return ret; } + +// used to control fiber out data select +int sis8300drvbcm_set_fiber_out_data_select(sis8300drv_usr *sisuser, unsigned int channel, unsigned int selection) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // out data select is controlled by lowest 4 bits + selection &= 0xF; + selection += (value & (1 << 4)); // preserve enable bit + ret = sis8300drv_reg_write(sisuser, reg, selection); + return ret; +} + +int sis8300drvbcm_get_fiber_out_data_select(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *selection) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF; + // register has lowest 4 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, selection); + if (ret) { + return ret; + } + *selection &= 0xF; + return ret; +} + +int sis8300drvbcm_set_fiber_out_data_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int enable) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + value &= 0x1F; + // out data enable is controlled by bit 4 + if (enable) { + value |= (1 << 4); + } else { + value &= ~(1 << 4); + } + ret = sis8300drv_reg_write(sisuser, reg, value); + return ret; +} + +int sis8300drvbcm_get_fiber_out_data_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *enable) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_OUT_DATA_SELECT_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // out data select enable is in bit 4 + *enable = (value & (1 << 4)) ? 1 : 0; + return ret; +} + +// used to control fiber status bits +int sis8300drvbcm_get_fiber_sfp_present(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *sfp_present) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_STATUS_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // SFP present status is in bit 0 + *sfp_present = (value & (1 << 0)) ? 1 : 0; + //printf("%s: channel %d, fiber status: 0x%x, sfp_present: %d\n", __func__, channel, value, *sfp_present); + return ret; +} + +int sis8300drvbcm_get_fiber_lane_up(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *lane_up) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_STATUS_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // lane up status is in bit 1 + *lane_up = (value & (1 << 1)) ? 1 : 0; + //printf("%s: channel %d, fiber status: 0x%x, lane_up: %d\n", __func__, channel, value, *lane_up); + return ret; +} + +int sis8300drvbcm_get_fiber_channel_up(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *channel_up) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_STATUS_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // channel up status is in bit 2 + *channel_up = (value & (1 << 2)) ? 1 : 0; + //printf("%s: channel %d, fiber status: 0x%x, channel_up: %d\n", __func__, channel, value, *channel_up); + return ret; +} + +int sis8300drvbcm_get_fiber_hardware_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *hardware_error) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_STATUS_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // hardware error status is in bit 3 + *hardware_error = (value & (1 << 3)) ? 1 : 0; + //printf("%s: channel %d, fiber status: 0x%x, hardware_error: %d\n", __func__, channel, value, *hardware_error); + return ret; +} + +int sis8300drvbcm_get_fiber_software_error(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *software_error) +{ + unsigned int reg = SIS8300BCM_CHANNEL_BLOCK_BASE + \ + (SIS8300BCM_CHANNEL_BLOCK_SIZE * channel) + \ + SIS8300BCM_FIBR_BANK_OFF + \ + SIS8300BCM_FIBR_X_STATUS_OFF; + unsigned int value; + // register has lowest 5 bits defined + int ret = sis8300drv_reg_read(sisuser, reg, &value); + if (ret) { + return ret; + } + // software error status is in bit 4 + *software_error = (value & (1 << 4)) ? 1 : 0; + //printf("%s: channel %d, fiber status: 0x%x, software_error: %d\n", __func__, channel, value, *software_error); + 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 48eeafd6d45ca839d115a3ed53ad8fea9db5d0da..ba82e427cb86dab53d4e978b478db5d9b38aaefb 100644 --- a/vendor/ess/lib/sis8300drvbcm.h +++ b/vendor/ess/lib/sis8300drvbcm.h @@ -83,6 +83,8 @@ typedef enum { #define SIS8300BCM_NUM_PROBE_CHANNELS 4 #define SIS8300BCM_NUM_CHANNELS 24 +#define SIS8300BCM_NUM_FIBER_CHANNELS 2 + void sis8300drvbcm_set_sampling_frequency(sis8300drv_usr *sisuser, double frequency); void sis8300drvbcm_get_sampling_frequency(sis8300drv_usr *sisuser, double *frequency); int sis8300drvbcm_set_beam_trigger_source(sis8300drv_usr *sisuser, unsigned int source); @@ -290,6 +292,16 @@ int sis8300drvbcm_get_differential_alarm_first(sis8300drv_usr *sisuser, unsigned int sis8300drvbcm_get_differential_alarm_direct(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *alarms); int sis8300drvbcm_set_enable_calibration_pulse(sis8300drv_usr *sisuser, unsigned int enable_calibration_pulse); int sis8300drvbcm_get_calibration_sample(sis8300drv_usr *sisuser, unsigned int channel, unsigned int index, double *sample); +int sis8300drvbcm_set_fiber_out_data_select(sis8300drv_usr *sisuser, unsigned int channel, unsigned int selection); +int sis8300drvbcm_get_fiber_out_data_select(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *selection); +int sis8300drvbcm_set_fiber_out_data_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int enable); +int sis8300drvbcm_get_fiber_out_data_enable(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *enable); +int sis8300drvbcm_get_fiber_sfp_present(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *sfp_present); +int sis8300drvbcm_get_fiber_lane_up(sis8300drv_usr *sisuser, unsigned int channel, unsigned int *lane_up); +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 }