From d3ad4d85ca6735355281114a36102e3801488bd4 Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Tue, 27 Aug 2019 03:31:38 -0700 Subject: [PATCH 1/6] Platform Driver Developement Framework (PDDF): Generic drivers and Plugins --- build_debian.sh | 1 + .../pddf/fancontrol | 9 + .../pddf/pd-plugin.json | 35 + .../pddf/pddf-device.json | 1953 ++++++++++++++++ .../pddf/fancontrol | 9 + .../pddf/pd-plugin.json | 35 + .../pddf/pddf-device.json | 1970 +++++++++++++++++ device/common/pddf/plugins/eeprom.py | 32 + device/common/pddf/plugins/fanutil.py | 214 ++ device/common/pddf/plugins/ledutil.py | 81 + device/common/pddf/plugins/psuutil.py | 274 +++ device/common/pddf/plugins/sfputil.py | 210 ++ device/common/pddf/plugins/sysstatutil.py | 94 + device/common/pddf/plugins/thermalutil.py | 81 + dockers/docker-platform-monitor/Dockerfile.j2 | 3 +- .../as7712-32x/utils/pddf_switch_svc.py | 62 + .../as7726-32x/utils/pddf_switch_svc.py | 104 + platform/pddf/README.md | 18 + platform/pddf/i2c/.gitignore | 52 + platform/pddf/i2c/Makefile | 1 + platform/pddf/i2c/debian/changelog | 5 + platform/pddf/i2c/debian/compat | 1 + platform/pddf/i2c/debian/control | 10 + platform/pddf/i2c/debian/files | 2 + platform/pddf/i2c/debian/rules | 76 + platform/pddf/i2c/modules/Makefile | 1 + platform/pddf/i2c/modules/client/Makefile | 4 + .../i2c/modules/client/pddf_client_module.c | 348 +++ platform/pddf/i2c/modules/cpld/Makefile | 13 + .../pddf/i2c/modules/cpld/driver/Makefile | 9 + .../modules/cpld/driver/pddf_cpld_driver.c | 184 ++ .../pddf/i2c/modules/cpld/pddf_cpld_module.c | 171 ++ platform/pddf/i2c/modules/fan/Makefile | 6 + platform/pddf/i2c/modules/fan/driver/Makefile | 8 + .../i2c/modules/fan/driver/pddf_fan_api.c | 422 ++++ .../i2c/modules/fan/driver/pddf_fan_driver.c | 410 ++++ .../pddf/i2c/modules/fan/pddf_fan_module.c | 292 +++ .../i2c/modules/include/pddf_client_defs.h | 126 ++ .../pddf/i2c/modules/include/pddf_cpld_defs.h | 18 + .../pddf/i2c/modules/include/pddf_fan_api.h | 26 + .../pddf/i2c/modules/include/pddf_fan_defs.h | 78 + .../i2c/modules/include/pddf_fan_driver.h | 72 + .../pddf/i2c/modules/include/pddf_led_defs.h | 96 + .../pddf/i2c/modules/include/pddf_mux_defs.h | 18 + .../pddf/i2c/modules/include/pddf_psu_api.h | 27 + .../pddf/i2c/modules/include/pddf_psu_defs.h | 78 + .../i2c/modules/include/pddf_psu_driver.h | 52 + .../i2c/modules/include/pddf_sysstatus_defs.h | 40 + .../pddf/i2c/modules/include/pddf_xcvr_api.h | 33 + .../pddf/i2c/modules/include/pddf_xcvr_defs.h | 110 + platform/pddf/i2c/modules/led/Makefile | 5 + .../pddf/i2c/modules/led/pddf_led_module.c | 679 ++++++ platform/pddf/i2c/modules/mux/Makefile | 5 + .../pddf/i2c/modules/mux/pddf_mux_module.c | 206 ++ platform/pddf/i2c/modules/psu/Makefile | 6 + platform/pddf/i2c/modules/psu/driver/Makefile | 9 + .../i2c/modules/psu/driver/pddf_psu_api.c | 610 +++++ .../i2c/modules/psu/driver/pddf_psu_driver.c | 366 +++ .../pddf/i2c/modules/psu/pddf_psu_module.c | 302 +++ platform/pddf/i2c/modules/sysstatus/Makefile | 6 + .../modules/sysstatus/pddf_sysstatus_module.c | 227 ++ platform/pddf/i2c/modules/xcvr/Makefile | 5 + .../pddf/i2c/modules/xcvr/driver/Makefile | 9 + .../i2c/modules/xcvr/driver/pddf_xcvr_api.c | 761 +++++++ .../modules/xcvr/driver/pddf_xcvr_driver.c | 289 +++ .../pddf/i2c/modules/xcvr/pddf_xcvr_module.c | 291 +++ .../i2c/service/pddf-platform-init.service | 13 + platform/pddf/i2c/setup.py | 14 + platform/pddf/i2c/utils/pddf_util.py | 450 ++++ platform/pddf/i2c/utils/pddfparse.py | 1276 +++++++++++ platform/pddf/i2c/utils/schema/CPLD.schema | 68 + platform/pddf/i2c/utils/schema/CPU.schema | 80 + platform/pddf/i2c/utils/schema/EEPROM.schema | 93 + platform/pddf/i2c/utils/schema/FAN.schema | 113 + platform/pddf/i2c/utils/schema/LED.schema | 120 + platform/pddf/i2c/utils/schema/MUX.schema | 97 + .../pddf/i2c/utils/schema/PSU-PMBUS.schema | 109 + platform/pddf/i2c/utils/schema/PSU.schema | 136 ++ platform/pddf/i2c/utils/schema/QSFP.schema | 105 + platform/pddf/i2c/utils/schema/SMBUS.schema | 128 ++ platform/pddf/i2c/utils/schema/SYSSTAT.schema | 285 +++ .../pddf/i2c/utils/schema/TEMP-SENSOR.schema | 103 + platform/pddf/platform-modules-pddf.mk | 20 + platform/pddf/rules.mk | 2 + rules/config | 4 + slave.mk | 14 + 86 files changed, 14979 insertions(+), 1 deletion(-) create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/pddf/fancontrol create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json create mode 100644 device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json create mode 100644 device/accton/x86_64-accton_as7726_32x-r0/pddf/fancontrol create mode 100644 device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json create mode 100644 device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json create mode 100755 device/common/pddf/plugins/eeprom.py create mode 100755 device/common/pddf/plugins/fanutil.py create mode 100755 device/common/pddf/plugins/ledutil.py create mode 100755 device/common/pddf/plugins/psuutil.py create mode 100755 device/common/pddf/plugins/sfputil.py create mode 100755 device/common/pddf/plugins/sysstatutil.py create mode 100755 device/common/pddf/plugins/thermalutil.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7712-32x/utils/pddf_switch_svc.py create mode 100755 platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_switch_svc.py create mode 100644 platform/pddf/README.md create mode 100644 platform/pddf/i2c/.gitignore create mode 100644 platform/pddf/i2c/Makefile create mode 100755 platform/pddf/i2c/debian/changelog create mode 100644 platform/pddf/i2c/debian/compat create mode 100755 platform/pddf/i2c/debian/control create mode 100644 platform/pddf/i2c/debian/files create mode 100755 platform/pddf/i2c/debian/rules create mode 100644 platform/pddf/i2c/modules/Makefile create mode 100644 platform/pddf/i2c/modules/client/Makefile create mode 100644 platform/pddf/i2c/modules/client/pddf_client_module.c create mode 100644 platform/pddf/i2c/modules/cpld/Makefile create mode 100644 platform/pddf/i2c/modules/cpld/driver/Makefile create mode 100755 platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c create mode 100644 platform/pddf/i2c/modules/cpld/pddf_cpld_module.c create mode 100644 platform/pddf/i2c/modules/fan/Makefile create mode 100644 platform/pddf/i2c/modules/fan/driver/Makefile create mode 100644 platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c create mode 100644 platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c create mode 100644 platform/pddf/i2c/modules/fan/pddf_fan_module.c create mode 100644 platform/pddf/i2c/modules/include/pddf_client_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_cpld_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_fan_api.h create mode 100644 platform/pddf/i2c/modules/include/pddf_fan_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_fan_driver.h create mode 100644 platform/pddf/i2c/modules/include/pddf_led_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_mux_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_psu_api.h create mode 100644 platform/pddf/i2c/modules/include/pddf_psu_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_psu_driver.h create mode 100644 platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h create mode 100644 platform/pddf/i2c/modules/include/pddf_xcvr_api.h create mode 100644 platform/pddf/i2c/modules/include/pddf_xcvr_defs.h create mode 100644 platform/pddf/i2c/modules/led/Makefile create mode 100644 platform/pddf/i2c/modules/led/pddf_led_module.c create mode 100644 platform/pddf/i2c/modules/mux/Makefile create mode 100644 platform/pddf/i2c/modules/mux/pddf_mux_module.c create mode 100644 platform/pddf/i2c/modules/psu/Makefile create mode 100644 platform/pddf/i2c/modules/psu/driver/Makefile create mode 100644 platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c create mode 100644 platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c create mode 100644 platform/pddf/i2c/modules/psu/pddf_psu_module.c create mode 100644 platform/pddf/i2c/modules/sysstatus/Makefile create mode 100644 platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c create mode 100644 platform/pddf/i2c/modules/xcvr/Makefile create mode 100644 platform/pddf/i2c/modules/xcvr/driver/Makefile create mode 100644 platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c create mode 100644 platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c create mode 100644 platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c create mode 100755 platform/pddf/i2c/service/pddf-platform-init.service create mode 100755 platform/pddf/i2c/setup.py create mode 100755 platform/pddf/i2c/utils/pddf_util.py create mode 100755 platform/pddf/i2c/utils/pddfparse.py create mode 100644 platform/pddf/i2c/utils/schema/CPLD.schema create mode 100644 platform/pddf/i2c/utils/schema/CPU.schema create mode 100644 platform/pddf/i2c/utils/schema/EEPROM.schema create mode 100644 platform/pddf/i2c/utils/schema/FAN.schema create mode 100644 platform/pddf/i2c/utils/schema/LED.schema create mode 100644 platform/pddf/i2c/utils/schema/MUX.schema create mode 100644 platform/pddf/i2c/utils/schema/PSU-PMBUS.schema create mode 100644 platform/pddf/i2c/utils/schema/PSU.schema create mode 100644 platform/pddf/i2c/utils/schema/QSFP.schema create mode 100644 platform/pddf/i2c/utils/schema/SMBUS.schema create mode 100644 platform/pddf/i2c/utils/schema/SYSSTAT.schema create mode 100644 platform/pddf/i2c/utils/schema/TEMP-SENSOR.schema create mode 100644 platform/pddf/platform-modules-pddf.mk create mode 100644 platform/pddf/rules.mk diff --git a/build_debian.sh b/build_debian.sh index 126a8ee329eb..0aad1a5ec7bf 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -240,6 +240,7 @@ sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y in openssh-server \ python \ python-setuptools \ + python-jsonschema \ monit \ python-apt \ traceroute \ diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/fancontrol b/device/accton/x86_64-accton_as7712_32x-r0/pddf/fancontrol new file mode 100644 index 000000000000..cc9855b91322 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/fancontrol @@ -0,0 +1,9 @@ +INTERVAL=10 +FCTEMPS=/sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/17-0048/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/17-0049/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/17-004a/hwmon/hwmon[[:print:]]*/temp1_input +FCFANS=/sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan1_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan2_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan3_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan4_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan5_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan6_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan11_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan12_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan13_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan14_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan15_input /sys/bus/i2c/devices/16-0066/fan1_pwm=/sys/bus/i2c/devices/16-0066/fan16_input +MINTEMP=/sys/bus/i2c/devices/16-0066/fan1_pwm=45 +MAXTEMP=/sys/bus/i2c/devices/16-0066/fan1_pwm=53 +MINSTART=/sys/bus/i2c/devices/16-0066/fan1_pwm=15 +MINSTOP=/sys/bus/i2c/devices/16-0066/fan1_pwm=4 +MINPWM=/sys/bus/i2c/devices/16-0066/fan1_pwm=4 +MAXPWM=/sys/bus/i2c/devices/16-0066/fan1_pwm=10 diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..90dbea990bf3 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json @@ -0,0 +1,35 @@ +{ + "PSU": + { + "psu_present": + { + "valmap": { "1":true, "0":false } + }, + + "psu_power_good": + { + "valmap": { "1": true, "0":false } + }, + + "psu_fan_dir": + { + "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + } + }, + + "FAN": + { + "direction": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + }, + + "present": + { + "valmap": {"1":true, "0":false} + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" + } + +} diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json new file mode 100644 index 000000000000..29f0008c9159 --- /dev/null +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json @@ -0,0 +1,1953 @@ +{ + "PLATFORM": + { + "num_psus":2, + "num_fans":6, + "num_ports":32, + "num_temps": 4, + "drivers": + { + "description":"AS7712 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom" + ], + "PORT_MODULE": + [ + "pddf_xcvr" + ] + + } + }, + + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-1", "dev":"SMBUS1" }, + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX2"}, + {"dev": "MUX3"}, + {"dev": "MUX4"}, + {"dev": "MUX5"}, + {"dev": "MUX6"} + ] + } + }, + + "SMBUS1": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS1", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x1"}, + "DEVICES": + [ + {"dev": "MUX1"} + ] + } + }, + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": [ + {"attr_name": "eeprom"} + ] + } + }, + + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1", "dev_addr":"0x76", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x10"}, + "channel": + [ + { "chn":"0", "dev":"FAN-CTRL" }, + { "chn":"1", "dev":"TEMP1" }, + { "chn":"1", "dev":"TEMP2" }, + { "chn":"1", "dev":"TEMP3" }, + { "chn":"1", "dev":"TEMP4" }, + { "chn":"2", "dev":"CPLD1" }, + { "chn":"3", "dev":"CPLD2" }, + { "chn":"4", "dev":"CPLD3" } + ] + } + }, + + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x20"}, + "channel": + [ + { "chn":"0", "dev":"PSU2" }, + { "chn":"1", "dev":"PSU1" } + ] + } + }, + + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, + "dev_attr": { "num_fan":"6"}, + "attr_list": + [ + { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } + ] + } + }, + + "TEMP1" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP2" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP3" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP4" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4b", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "CPLD1": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x12", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, + + "CPLD2": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x13", "dev_addr":"0x62", "dev_type":"i2c_cpld"}, + "dev_attr": { } + } + }, + + "CPLD3": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x14", "dev_addr":"0x64", "dev_type":"i2c_cpld"}, + "dev_attr": { } + } + }, + + "SYSSTATUS": + { + "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, + "dev_attr":{ }, + "attr_list": + [ + + { "attr_name":"board_info","attr_devaddr":"0x60", "attr_offset":"0x0","attr_mask":"0xf","attr_len":"0x1"}, + { "attr_name":"cpld1_version","attr_devaddr":"0x60","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"power_module_status","attr_devaddr":"0x60","attr_offset":"0x2","attr_mask":"0x2f","attr_len":"0x1"}, + { "attr_name":"system_reset5","attr_devaddr":"0x60","attr_offset":"0x8","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"system_reset6","attr_devaddr":"0x60","attr_offset":"0x9","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"system_reset7","attr_devaddr":"0x60","attr_offset":"0xa","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"misc1","attr_devaddr":"0x60","attr_offset":"0x48","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"cpld2_version","attr_devaddr":"0x62","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"cpld3_version","attr_devaddr":"0x64","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"} + + ] + }, + + + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + }, + + "bmc": + { + "attr_list": + [ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x21", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + }, + + "bmc": + { + "attr_list":[ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x20", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "MUX3": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x30"}, + "channel": + [ + { "chn":"0", "dev":"PORT9" }, + { "chn":"1", "dev":"PORT10" }, + { "chn":"2", "dev":"PORT11" }, + { "chn":"3", "dev":"PORT12" }, + { "chn":"4", "dev":"PORT1" }, + { "chn":"5", "dev":"PORT2" }, + { "chn":"6", "dev":"PORT3" }, + { "chn":"7", "dev":"PORT4" } + ] + } + }, + + "MUX4": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x40"}, + "channel": + [ + { "chn":"0", "dev":"PORT6" }, + { "chn":"1", "dev":"PORT5" }, + { "chn":"2", "dev":"PORT8" }, + { "chn":"3", "dev":"PORT7" }, + { "chn":"4", "dev":"PORT13" }, + { "chn":"5", "dev":"PORT14" }, + { "chn":"6", "dev":"PORT15" }, + { "chn":"7", "dev":"PORT16" } + ] + } + }, + + "MUX5": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x74", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x50"}, + "channel": + [ + { "chn":"0", "dev":"PORT17" }, + { "chn":"1", "dev":"PORT18" }, + { "chn":"2", "dev":"PORT19" }, + { "chn":"3", "dev":"PORT20" }, + { "chn":"4", "dev":"PORT25" }, + { "chn":"5", "dev":"PORT26" }, + { "chn":"6", "dev":"PORT27" }, + { "chn":"7", "dev":"PORT28" } + ] + } + }, + + "MUX6": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x75", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x60"}, + "channel": + [ + { "chn":"0", "dev":"PORT29" }, + { "chn":"1", "dev":"PORT30" }, + { "chn":"2", "dev":"PORT31" }, + { "chn":"3", "dev":"PORT32" }, + { "chn":"4", "dev":"PORT21" }, + { "chn":"5", "dev":"PORT22" }, + { "chn":"6", "dev":"PORT23" }, + { "chn":"7", "dev":"PORT24" } + ] + } + }, + + "LOC_LED": + { + "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "7", "color" : "Blue", "value" : "0x0", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "7", "color" : "Off", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + }, + + "DIAG_LED": + { + "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "1:0", "color" : "Green", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"faulty", "bits" : "1:0", "color" : "Red", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "1:0", "color" : "Off", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + + }, + + + "PORT1": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT1", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"1"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT1-EEPROM" }, + { "itf":"control", "dev":"PORT1-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT1-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT1-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT1-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT1-CTRL", "device_parent":"MUX3", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT2": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT2", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"2"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT2-EEPROM" }, + { "itf":"control", "dev":"PORT2-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT2-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT2-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT2-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT2-CTRL", "device_parent":"MUX3", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT3": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT3", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"3"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT3-EEPROM" }, + { "itf":"control", "dev":"PORT3-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT3-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT3-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT3-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT3-CTRL", "device_parent":"MUX3", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT4": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT4", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"4"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT4-EEPROM" }, + { "itf":"control", "dev":"PORT4-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT4-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT4-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT4-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT4-CTRL", "device_parent":"MUX3", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT5": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT5", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"5"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT5-EEPROM" }, + { "itf":"control", "dev":"PORT5-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT5-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT5-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT5-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT5-CTRL", "device_parent":"MUX4", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT6": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT6", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"6"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT6-EEPROM" }, + { "itf":"control", "dev":"PORT6-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT6-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT6-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT6-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT6-CTRL", "device_parent":"MUX4", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT7": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT7", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"7"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT7-EEPROM" }, + { "itf":"control", "dev":"PORT7-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT7-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT7-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT7-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT7-CTRL", "device_parent":"MUX4", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT8": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT8", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"8"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT8-EEPROM" }, + { "itf":"control", "dev":"PORT8-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT8-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT8-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT8-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT8-CTRL", "device_parent":"MUX4", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT9": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT9", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"9"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT9-EEPROM" }, + { "itf":"control", "dev":"PORT9-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT9-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT9-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT9-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT9-CTRL", "device_parent":"MUX3", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT10": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT10", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"10"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT10-EEPROM" }, + { "itf":"control", "dev":"PORT10-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT10-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT10-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT10-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT10-CTRL", "device_parent":"MUX3", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT11": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT11", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"11"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT11-EEPROM" }, + { "itf":"control", "dev":"PORT11-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT11-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT11-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT11-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT11-CTRL", "device_parent":"MUX3", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT12": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT12", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"12"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT12-EEPROM" }, + { "itf":"control", "dev":"PORT12-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT12-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT12-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT12-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT12-CTRL", "device_parent":"MUX3", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT13": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT13", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"13"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT13-EEPROM" }, + { "itf":"control", "dev":"PORT13-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT13-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT13-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT13-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT13-CTRL", "device_parent":"MUX4", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT14": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT14", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"14"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT14-EEPROM" }, + { "itf":"control", "dev":"PORT14-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT14-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT14-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT14-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT14-CTRL", "device_parent":"MUX4", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT15": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT15", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"15"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT15-EEPROM" }, + { "itf":"control", "dev":"PORT15-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT15-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT15-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT15-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT15-CTRL", "device_parent":"MUX4", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT16": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT16", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"16"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT16-EEPROM" }, + { "itf":"control", "dev":"PORT16-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT16-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT16-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT16-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT16-CTRL", "device_parent":"MUX4", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT17": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT17", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"17"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT17-EEPROM" }, + { "itf":"control", "dev":"PORT17-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT17-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT17-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT17-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT17-CTRL", "device_parent":"MUX5", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT18": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT18", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"18"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT18-EEPROM" }, + { "itf":"control", "dev":"PORT18-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT18-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT18-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT18-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT18-CTRL", "device_parent":"MUX5", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT19": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT19", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"19"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT19-EEPROM" }, + { "itf":"control", "dev":"PORT19-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT19-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT19-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT19-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT19-CTRL", "device_parent":"MUX5", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT20": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT20", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"20"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT20-EEPROM" }, + { "itf":"control", "dev":"PORT20-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT20-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT20-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT20-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT20-CTRL", "device_parent":"MUX5", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT21": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT21", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"21"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT21-EEPROM" }, + { "itf":"control", "dev":"PORT21-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT21-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT21-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x64", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT21-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT21-CTRL", "device_parent":"MUX6", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x64", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT22": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT22", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"22"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT22-EEPROM" }, + { "itf":"control", "dev":"PORT22-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT22-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT22-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x65", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT22-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT22-CTRL", "device_parent":"MUX6", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x65", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT23": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT23", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"23"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT23-EEPROM" }, + { "itf":"control", "dev":"PORT23-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT23-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT23-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x66", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT23-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT23-CTRL", "device_parent":"MUX6", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x66", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT24": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT24", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"24"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT24-EEPROM" }, + { "itf":"control", "dev":"PORT24-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT24-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT24-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x67", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT24-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT24-CTRL", "device_parent":"MUX6", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x67", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT25": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT25", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"25"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT25-EEPROM" }, + { "itf":"control", "dev":"PORT25-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT25-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT25-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT25-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT25-CTRL", "device_parent":"MUX5", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT26": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT26", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"26"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT26-EEPROM" }, + { "itf":"control", "dev":"PORT26-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT26-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT26-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT26-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT26-CTRL", "device_parent":"MUX5", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT27": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT27", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"27"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT27-EEPROM" }, + { "itf":"control", "dev":"PORT27-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT27-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT27-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT27-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT27-CTRL", "device_parent":"MUX5", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT28": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT28", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"28"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT28-EEPROM" }, + { "itf":"control", "dev":"PORT28-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT28-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT28-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT28-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT28-CTRL", "device_parent":"MUX5", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT29": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT29", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"29"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT29-EEPROM" }, + { "itf":"control", "dev":"PORT29-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT29-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT29-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x60", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT29-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT29-CTRL", "device_parent":"MUX6", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x60", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT30": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT30", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"30"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT30-EEPROM" }, + { "itf":"control", "dev":"PORT30-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT30-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT30-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x61", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT30-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT30-CTRL", "device_parent":"MUX6", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x61", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT31": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT31", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"31"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT31-EEPROM" }, + { "itf":"control", "dev":"PORT31-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT31-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT31-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x62", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT31-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT31-CTRL", "device_parent":"MUX6", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x62", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT32": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT32", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"32"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT32-EEPROM" }, + { "itf":"control", "dev":"PORT32-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT32-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT32-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x63", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT32-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT32-CTRL", "device_parent":"MUX6", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x63", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + } + +} diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/fancontrol b/device/accton/x86_64-accton_as7726_32x-r0/pddf/fancontrol new file mode 100644 index 000000000000..736bd13debed --- /dev/null +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/fancontrol @@ -0,0 +1,9 @@ +INTERVAL=10 +FCTEMPS=/sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/118-004a/hwmon/hwmon[[:print:]]*/temp1_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/118-004b/hwmon/hwmon[[:print:]]*/temp1_input +FCFANS=/sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan1_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan2_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan3_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan4_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan5_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan6_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan11_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan12_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan13_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan14_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan15_input /sys/bus/i2c/devices/117-0066/fan1_pwm=/sys/bus/i2c/devices/117-0066/fan16_input +MINTEMP=/sys/bus/i2c/devices/117-0066/fan1_pwm=38 +MAXTEMP=/sys/bus/i2c/devices/117-0066/fan1_pwm=44 +MINSTART=/sys/bus/i2c/devices/117-0066/fan1_pwm=15 +MINSTOP=/sys/bus/i2c/devices/117-0066/fan1_pwm=4 +MINPWM=/sys/bus/i2c/devices/117-0066/fan1_pwm=4 +MAXPWM=/sys/bus/i2c/devices/117-0066/fan1_pwm=8 diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json new file mode 100644 index 000000000000..90dbea990bf3 --- /dev/null +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json @@ -0,0 +1,35 @@ +{ + "PSU": + { + "psu_present": + { + "valmap": { "1":true, "0":false } + }, + + "psu_power_good": + { + "valmap": { "1": true, "0":false } + }, + + "psu_fan_dir": + { + "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + } + }, + + "FAN": + { + "direction": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + }, + + "present": + { + "valmap": {"1":true, "0":false} + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" + } + +} diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json new file mode 100644 index 000000000000..15b36170f3a0 --- /dev/null +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json @@ -0,0 +1,1970 @@ +{ + "PLATFORM": + { + "num_psus":2, + "num_fans":6, + "num_ports":32, + "num_temps":5, + "drivers": + { + "description":"AS7726 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom" + ], + "PORT_MODULE": + [ + "pddf_xcvr" + ] + + } + }, + + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX1"} + ] + } + }, + + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c02"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": [ + {"attr_name": "eeprom"} + ] + } + }, + + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x10"}, + "channel": + [ + { "chn":"0", "dev":"MUX2" }, + { "chn":"0", "dev":"MUX3" }, + { "chn":"0", "dev":"MUX4" }, + { "chn":"0", "dev":"MUX5" }, + { "chn":"0", "dev":"MUX6" }, + { "chn":"1", "dev":"MUX7" } + ] + } + }, + + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x76", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x20"}, + "channel": + [ + { "chn":"2", "dev":"CPLD1" }, + { "chn":"3", "dev":"CPLD2" }, + { "chn":"4", "dev":"CPLD3" } + ] + } + }, + + "CPLD1": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x22", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, + + "CPLD2": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x23", "dev_addr":"0x62", "dev_type":"i2c_cpld"}, + "dev_attr": { } + } + }, + + "CPLD3": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x24", "dev_addr":"0x64", "dev_type":"i2c_cpld"}, + "dev_attr": { } + } + }, + + "MUX3": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x30"}, + "channel": + [ + { "chn":"0", "dev":"PORT9" }, + { "chn":"1", "dev":"PORT10" }, + { "chn":"2", "dev":"PORT11" }, + { "chn":"3", "dev":"PORT12" }, + { "chn":"4", "dev":"PORT1" }, + { "chn":"5", "dev":"PORT2" }, + { "chn":"6", "dev":"PORT3" }, + { "chn":"7", "dev":"PORT4" } + ] + } + }, + + "MUX4": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x40"}, + "channel": + [ + { "chn":"0", "dev":"PORT6" }, + { "chn":"1", "dev":"PORT5" }, + { "chn":"2", "dev":"PORT8" }, + { "chn":"3", "dev":"PORT7" }, + { "chn":"4", "dev":"PORT13" }, + { "chn":"5", "dev":"PORT14" }, + { "chn":"6", "dev":"PORT15" }, + { "chn":"7", "dev":"PORT16" } + ] + } + }, + + "MUX5": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x74", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x50"}, + "channel": + [ + { "chn":"0", "dev":"PORT17" }, + { "chn":"1", "dev":"PORT18" }, + { "chn":"2", "dev":"PORT19" }, + { "chn":"3", "dev":"PORT20" }, + { "chn":"4", "dev":"PORT25" }, + { "chn":"5", "dev":"PORT26" }, + { "chn":"6", "dev":"PORT27" }, + { "chn":"7", "dev":"PORT28" } + ] + } + }, + + "MUX6": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x75", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x60"}, + "channel": + [ + { "chn":"0", "dev":"PORT29" }, + { "chn":"1", "dev":"PORT30" }, + { "chn":"2", "dev":"PORT31" }, + { "chn":"3", "dev":"PORT32" }, + { "chn":"4", "dev":"PORT21" }, + { "chn":"5", "dev":"PORT22" }, + { "chn":"6", "dev":"PORT23" }, + { "chn":"7", "dev":"PORT24" } + ] + } + }, + + "PORT1": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT1", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"1"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT1-EEPROM" }, + { "itf":"control", "dev":"PORT1-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT1-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT1-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT1-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT1-CTRL", "device_parent":"MUX3", "virt_parent":"PORT1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x34", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT2": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT2", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"2"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT2-EEPROM" }, + { "itf":"control", "dev":"PORT2-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT2-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT2-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT2-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT2-CTRL", "device_parent":"MUX3", "virt_parent":"PORT2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x35", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT3": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT3", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"3"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT3-EEPROM" }, + { "itf":"control", "dev":"PORT3-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT3-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT3-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT3-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT3-CTRL", "device_parent":"MUX3", "virt_parent":"PORT3"}, + "i2c": + { + "topo_info": { "parent_bus":"0x36", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT4": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT4", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"4"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT4-EEPROM" }, + { "itf":"control", "dev":"PORT4-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT4-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT4-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT4-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT4-CTRL", "device_parent":"MUX3", "virt_parent":"PORT4"}, + "i2c": + { + "topo_info": { "parent_bus":"0x37", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT5": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT5", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"5"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT5-EEPROM" }, + { "itf":"control", "dev":"PORT5-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT5-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT5-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT5-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT5-CTRL", "device_parent":"MUX4", "virt_parent":"PORT5"}, + "i2c": + { + "topo_info": { "parent_bus":"0x41", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT6": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT6", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"6"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT6-EEPROM" }, + { "itf":"control", "dev":"PORT6-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT6-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT6-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT6-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT6-CTRL", "device_parent":"MUX4", "virt_parent":"PORT6"}, + "i2c": + { + "topo_info": { "parent_bus":"0x40", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT7": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT7", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"7"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT7-EEPROM" }, + { "itf":"control", "dev":"PORT7-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT7-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT7-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT7-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT7-CTRL", "device_parent":"MUX4", "virt_parent":"PORT7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x43", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT8": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT8", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"8"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT8-EEPROM" }, + { "itf":"control", "dev":"PORT8-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT8-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT8-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT8-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT8-CTRL", "device_parent":"MUX4", "virt_parent":"PORT8"}, + "i2c": + { + "topo_info": { "parent_bus":"0x42", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x30", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x04", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x10", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT9": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT9", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"9"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT9-EEPROM" }, + { "itf":"control", "dev":"PORT9-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT9-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT9-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT9-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT9-CTRL", "device_parent":"MUX3", "virt_parent":"PORT9"}, + "i2c": + { + "topo_info": { "parent_bus":"0x30", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT10": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT10", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"10"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT10-EEPROM" }, + { "itf":"control", "dev":"PORT10-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT10-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT10-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT10-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT10-CTRL", "device_parent":"MUX3", "virt_parent":"PORT10"}, + "i2c": + { + "topo_info": { "parent_bus":"0x31", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT11": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT11", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"11"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT11-EEPROM" }, + { "itf":"control", "dev":"PORT11-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT11-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT11-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT11-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT11-CTRL", "device_parent":"MUX3", "virt_parent":"PORT11"}, + "i2c": + { + "topo_info": { "parent_bus":"0x32", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT12": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT12", "device_parent":"MUX3"}, + "dev_attr": { "dev_idx":"12"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT12-EEPROM" }, + { "itf":"control", "dev":"PORT12-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT12-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT12-EEPROM", "device_parent":"MUX3", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT12-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT12-CTRL", "device_parent":"MUX3", "virt_parent":"PORT12"}, + "i2c": + { + "topo_info": { "parent_bus":"0x33", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT13": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT13", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"13"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT13-EEPROM" }, + { "itf":"control", "dev":"PORT13-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT13-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT13-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT13-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT13-CTRL", "device_parent":"MUX4", "virt_parent":"PORT13"}, + "i2c": + { + "topo_info": { "parent_bus":"0x44", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT14": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT14", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"14"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT14-EEPROM" }, + { "itf":"control", "dev":"PORT14-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT14-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT14-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT14-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT14-CTRL", "device_parent":"MUX4", "virt_parent":"PORT14"}, + "i2c": + { + "topo_info": { "parent_bus":"0x45", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT15": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT15", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"15"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT15-EEPROM" }, + { "itf":"control", "dev":"PORT15-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT15-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT15-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT15-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT15-CTRL", "device_parent":"MUX4", "virt_parent":"PORT15"}, + "i2c": + { + "topo_info": { "parent_bus":"0x46", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT16": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT16", "device_parent":"MUX4"}, + "dev_attr": { "dev_idx":"16"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT16-EEPROM" }, + { "itf":"control", "dev":"PORT16-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT16-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT16-EEPROM", "device_parent":"MUX4", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT16-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT16-CTRL", "device_parent":"MUX4", "virt_parent":"PORT16"}, + "i2c": + { + "topo_info": { "parent_bus":"0x47", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x31", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x05", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x11", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT17": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT17", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"17"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT17-EEPROM" }, + { "itf":"control", "dev":"PORT17-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT17-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT17-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT17-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT17-CTRL", "device_parent":"MUX5", "virt_parent":"PORT17"}, + "i2c": + { + "topo_info": { "parent_bus":"0x50", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT18": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT18", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"18"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT18-EEPROM" }, + { "itf":"control", "dev":"PORT18-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT18-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT18-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT18-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT18-CTRL", "device_parent":"MUX5", "virt_parent":"PORT18"}, + "i2c": + { + "topo_info": { "parent_bus":"0x51", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT19": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT19", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"19"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT19-EEPROM" }, + { "itf":"control", "dev":"PORT19-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT19-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT19-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT19-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT19-CTRL", "device_parent":"MUX5", "virt_parent":"PORT19"}, + "i2c": + { + "topo_info": { "parent_bus":"0x52", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT20": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT20", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"20"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT20-EEPROM" }, + { "itf":"control", "dev":"PORT20-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT20-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT20-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT20-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT20-CTRL", "device_parent":"MUX5", "virt_parent":"PORT20"}, + "i2c": + { + "topo_info": { "parent_bus":"0x53", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT21": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT21", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"21"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT21-EEPROM" }, + { "itf":"control", "dev":"PORT21-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT21-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT21-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x64", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT21-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT21-CTRL", "device_parent":"MUX6", "virt_parent":"PORT21"}, + "i2c": + { + "topo_info": { "parent_bus":"0x64", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT22": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT22", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"22"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT22-EEPROM" }, + { "itf":"control", "dev":"PORT22-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT22-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT22-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x65", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT22-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT22-CTRL", "device_parent":"MUX6", "virt_parent":"PORT22"}, + "i2c": + { + "topo_info": { "parent_bus":"0x65", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT23": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT23", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"23"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT23-EEPROM" }, + { "itf":"control", "dev":"PORT23-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT23-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT23-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x66", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT23-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT23-CTRL", "device_parent":"MUX6", "virt_parent":"PORT23"}, + "i2c": + { + "topo_info": { "parent_bus":"0x66", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT24": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT24", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"24"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT24-EEPROM" }, + { "itf":"control", "dev":"PORT24-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT24-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT24-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x67", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT24-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT24-CTRL", "device_parent":"MUX6", "virt_parent":"PORT24"}, + "i2c": + { + "topo_info": { "parent_bus":"0x67", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x32", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x06", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x12", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT25": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT25", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"25"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT25-EEPROM" }, + { "itf":"control", "dev":"PORT25-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT25-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT25-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT25-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT25-CTRL", "device_parent":"MUX5", "virt_parent":"PORT25"}, + "i2c": + { + "topo_info": { "parent_bus":"0x54", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x0", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT26": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT26", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"26"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT26-EEPROM" }, + { "itf":"control", "dev":"PORT26-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT26-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT26-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT26-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT26-CTRL", "device_parent":"MUX5", "virt_parent":"PORT26"}, + "i2c": + { + "topo_info": { "parent_bus":"0x55", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT27": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT27", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"27"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT27-EEPROM" }, + { "itf":"control", "dev":"PORT27-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT27-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT27-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT27-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT27-CTRL", "device_parent":"MUX5", "virt_parent":"PORT27"}, + "i2c": + { + "topo_info": { "parent_bus":"0x56", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT28": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT28", "device_parent":"MUX5"}, + "dev_attr": { "dev_idx":"28"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT28-EEPROM" }, + { "itf":"control", "dev":"PORT28-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT28-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT28-EEPROM", "device_parent":"MUX5", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT28-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT28-CTRL", "device_parent":"MUX5", "virt_parent":"PORT28"}, + "i2c": + { + "topo_info": { "parent_bus":"0x57", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x3", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT29": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT29", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"29"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT29-EEPROM" }, + { "itf":"control", "dev":"PORT29-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT29-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT29-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x60", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT29-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT29-CTRL", "device_parent":"MUX6", "virt_parent":"PORT29"}, + "i2c": + { + "topo_info": { "parent_bus":"0x60", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT30": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT30", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"30"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT30-EEPROM" }, + { "itf":"control", "dev":"PORT30-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT30-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT30-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x61", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT30-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT30-CTRL", "device_parent":"MUX6", "virt_parent":"PORT30"}, + "i2c": + { + "topo_info": { "parent_bus":"0x61", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x5", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT31": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT31", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"31"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT31-EEPROM" }, + { "itf":"control", "dev":"PORT31-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT31-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT31-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x62", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT31-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT31-CTRL", "device_parent":"MUX6", "virt_parent":"PORT31"}, + "i2c": + { + "topo_info": { "parent_bus":"0x62", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x6", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "PORT32": + { + "dev_info": { "device_type":"QSFP", "device_name":"PORT32", "device_parent":"MUX6"}, + "dev_attr": { "dev_idx":"32"}, + "i2c": + { + "interface": + [ + { "itf":"eeprom", "dev":"PORT32-EEPROM" }, + { "itf":"control", "dev":"PORT32-CTRL" } + ] + }, + + "bmc": + { + "attr_list": + [ ] + } + }, + "PORT32-EEPROM": + { + "dev_info": { "device_type":"", "device_name":"PORT32-EEPROM", "device_parent":"MUX6", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x63", "dev_addr":"0x50", "dev_type":"optoe1"}, + "attr_list": + [ + { "attr_name":"eeprom"} + ] + } + }, + "PORT32-CTRL": + { + "dev_info": { "device_type":"", "device_name":"PORT32-CTRL", "device_parent":"MUX6", "virt_parent":"PORT32"}, + "i2c": + { + "topo_info": { "parent_bus":"0x63", "dev_addr":"0x53", "dev_type":"pddf_xcvr"}, + "attr_list": + [ + { "attr_name":"xcvr_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x33", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_reset", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x07", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"xcvr_intr_status", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x13", "attr_mask":"0x7", "attr_cmpval":"0x0", "attr_len":"1"} + ] + } + }, + + "MUX7": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x70"}, + "channel": + [ + { "chn":"0", "dev":"PSU2" }, + { "chn":"1", "dev":"PSU1" }, + { "chn":"5", "dev":"FAN-CTRL" }, + { "chn":"5", "dev":"TEMP1" }, + { "chn":"6", "dev":"TEMP2" }, + { "chn":"6", "dev":"TEMP3" }, + { "chn":"6", "dev":"TEMP4" }, + { "chn":"6", "dev":"TEMP5" } + ] + } + }, + + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX7" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + }, + + "bmc": + { + "attr_list":[ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x70", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + }, + + "bmc": + { + "attr_list": + [ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x71", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x75", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, + "dev_attr": { "num_fan":"6"}, + "attr_list": + [ + { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } + ] + } + }, + + "TEMP1" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x75", "dev_addr":"0x4c", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP2" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP3" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP4" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP5" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP5", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4b", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "SYSSTATUS": + { + "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, + "dev_attr":{ }, + "attr_list": + [ + + { "attr_name":"board_info","attr_devaddr":"0x60", "attr_offset":"0x0","attr_mask":"0xf","attr_len":"0x1"}, + { "attr_name":"cpld1_version","attr_devaddr":"0x60","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"power_module_status","attr_devaddr":"0x60","attr_offset":"0x2","attr_mask":"0x3f","attr_len":"0x1"}, + { "attr_name":"system_reset5","attr_devaddr":"0x60","attr_offset":"0x8","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"system_reset6","attr_devaddr":"0x60","attr_offset":"0x9","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"system_reset7","attr_devaddr":"0x60","attr_offset":"0xa","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"misc1","attr_devaddr":"0x60","attr_offset":"0x48","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"cpld2_version","attr_devaddr":"0x62","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, + { "attr_name":"cpld3_version","attr_devaddr":"0x64","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"} + + ] + }, + + + "LOC_LED": + { + "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "7", "color" : "Blue", "value" : "0x0", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "7", "color" : "Off", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + }, + + "DIAG_LED": + { + "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "1:0", "color" : "Green", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"faulty", "bits" : "1:0", "color" : "Red", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "1:0", "color" : "Off", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + + } + +} diff --git a/device/common/pddf/plugins/eeprom.py b/device/common/pddf/plugins/eeprom.py new file mode 100755 index 000000000000..52f9524c206d --- /dev/null +++ b/device/common/pddf/plugins/eeprom.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + import json + sys.path.append('/usr/share/sonic/platform/plugins') + import pddfparse + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + # system EEPROM always has device name EEPROM1 + self.eeprom_path = pddf_obj.get_path("EEPROM1", "eeprom") + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/common/pddf/plugins/fanutil.py b/device/common/pddf/plugins/fanutil.py new file mode 100755 index 000000000000..92f9ba430ffd --- /dev/null +++ b/device/common/pddf/plugins/fanutil.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python + + +# Sample pddf_fanutil file +# All the supported FAN SysFS aattributes are +#- fan_present +#- fan_direction +#- fan_front_rpm +#- fan_rear_rpm +#- fan_pwm +#- fan_fault +# where idx is in the range [1-8] +# + + +import os.path +import sys, traceback, time +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import json + +try: + from sonic_fan.fan_base import FanBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class FanUtil(FanBase): + """PDDF generic FAN util class""" + + def __init__(self): + FanBase.__init__(self) + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + self.platform = pddf_obj.get_platform() + + def get_num_fans(self): + return self.platform['num_fans'] + + def get_presence(self, idx): + # 1 based fan index + if idx<1 or idx>self.platform['num_fans']: + print "Invalid fan index %d\n"%idx + return False + + attr_name = "fan" + str(idx) + "_present" + sysfs_path = pddf_obj.get_path("FAN-CTRL", attr_name) + + try: + with open(sysfs_path, 'r') as f: + presence = int(f.read()) + except IOError: + return False + + status = (True if presence==1 else False) + return status + + def get_status(self, idx): + # 1 based fan index + if idx<1 or idx>self.platform['num_fans']: + print "Invalid fan index %d\n"%idx + return False + + front_speed = self.get_speed(idx) + rear_speed = self.get_speed_rear(idx) + status = True if (front_speed != 0 and rear_speed != 0) else False + return status + + def get_direction(self, idx): + # 1 based fan index + if idx<1 or idx>self.platform['num_fans']: + print "Invalid fan index %d\n"%idx + return None + + attr = "fan" + str(idx) + "_direction" + path = pddf_obj.get_path("FAN-CTRL", attr) + try: + with open(path, 'r') as f: + val = f.read() + except IOError: + return None + + vmap = plugin_data['FAN']['direction']['valmap'] + if val.rstrip('\n') in vmap: + direction = vmap[val.rstrip('\n')] + else: + direction = val + + return direction + + def get_directions(self): + num_fan = self.get_num_fan(); + + for i in range(1, num_fan+1): + attr = "fan" + str(i) + "_direction" + path = pddf_obj.get_path("FAN-CTRL", attr) + #print "%d-%s"%(i,path) + try: + with open(path, 'r') as f: + val = int(f.read()) + except IOError: + return False + + vmap = plugin_data['FAN']['direction']['valmap'] + direction = vmap[str(val)] + + print "FAN-%d direction is %s"%(i, direction) + + return 0 + + def get_speed(self, idx): + # 1 based fan index + if idx<1 or idx>self.platform['num_fans']: + print "Invalid fan index %d\n"%idx + return 0 + + attr = "fan" + str(idx) + "_front_rpm" + path = pddf_obj.get_path("FAN-CTRL", attr) + try: + with open(path, 'r') as f: + frpm = int(f.read()) + except IOError: + return 0 + + return frpm + + def get_speed_rear(self, idx): + # 1 based fan index + if idx<1 or idx>self.platform['num_fans']: + print "Invalid fan index %d\n"%idx + return 0 + + attr = "fan" + str(idx) + "_rear_rpm" + path = pddf_obj.get_path("FAN-CTRL", attr) + try: + with open(path, 'r') as f: + rrpm = int(f.read()) + except IOError: + return 0 + + return rrpm + + def get_speeds(self): + num_fan = self.get_num_fan(); + ret = "FAN_INDEX\t\tFRONT_RPM\t\tREAR_RPM\n" + + for i in range(1, num_fan+1): + attr1 = "fan" + str(i) + "_front_rpm" + attr2 = "fan" + str(i) + "_rear_rpm" + path1 = pddf_obj.get_path("FAN-CTRL", attr1) + path2 = pddf_obj.get_path("FAN-CTRL", attr2) + try: + with open(path1, 'r') as f1: + frpm = int(f1.read()) + with open(path2, 'r') as f2: + rrpm = int(f2.read()) + except IOError: + return False + + ret += "FAN-%d\t\t\t%d\t\t\t%d\n"%(i, frpm, rrpm) + + return ret + + def set_speed(self, val): + if val<0 or val>100: + print "Error: Invalid speed %d. Please provide a valid speed percentage"%val + return False + + num_fan = self.platform['num_fans'] + duty_cycle_to_pwm = eval(plugin_data['FAN']['duty_cycle_to_pwm']) + pwm = duty_cycle_to_pwm(val) + print "New Speed: %d%% - PWM value to be set is %d\n"%(val,pwm) + + status = 0 + for i in range(1, num_fan+1): + attr = "fan" + str(i) + "_pwm" + node = pddf_obj.get_path("FAN-CTRL", attr) + try: + with open(node, 'w') as f: + f.write(str(pwm)) + except IOError: + return False + + #time.sleep(5) + #print "Done changing the speed of all the fans ... Reading the speed to crossscheck\n" + return True + + def dump_sysfs(self): + return pddf_obj.cli_dump_dsysfs('fan') + + def get_change_event(self): + """ + TODO: This function need to be implemented + when decide to support monitoring FAN(fand) + on this platform. + """ + raise NotImplementedError + + + +#if __name__== "__main__": + #obj=FanUtil() + ##for i in range(0,6): + ##obj.get_fan_present(i) + + #obj.get_direction() + ##print(obj.get_direction()) + #print(obj.get_speed()) + #obj.set_speed(100) + #print "Chaning the speed back to 50%\n" + #obj.set_speed(50) diff --git a/device/common/pddf/plugins/ledutil.py b/device/common/pddf/plugins/ledutil.py new file mode 100755 index 000000000000..a72cc1091bc1 --- /dev/null +++ b/device/common/pddf/plugins/ledutil.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import os.path +import sys, traceback +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import json +import argparse + +class LedUtil: + color_map = { + "GREEN" : "on", + "RED" : "faulty", + "OFF" : "off", + "ON" : "on" + } + def __init__(self): + global pddf_obj + pddf_obj = pddfparse.PddfParse() + self.path="pddf/devices/led" + self.cur_state_path="pddf/devices/led/cur_state" + + def set_status_led(self, device_name, index, color, color_state="SOLID"): + led_device_name=device_name+'_LED' + if(not pddf_obj.is_led_device_configured(led_device_name, index)): + status="ERROR :" + device_name + ' ' + index + " : is not supported in the platform" + return (status) + + pddf_obj.create_attr('device_name', led_device_name, self.path) + pddf_obj.create_attr('index', index, self.path) + pddf_obj.create_attr('color', self.color_map[color], self.cur_state_path) + pddf_obj.create_attr('color_state', color_state, self.cur_state_path) + pddf_obj.create_attr('dev_ops', 'set_status', self.path) + return ("Executed") + + def get_status_led(self, device_name, index): + + led_device_name=device_name+'_LED' + if(not pddf_obj.is_led_device_configured(led_device_name, index)): + status="ERROR : " + device_name + ' ' + index + " : is not supported in the platform" + return (status) + + pddf_obj.create_attr('device_name', led_device_name, self.path) + + pddf_obj.create_attr('index', index, self.path) + pddf_obj.create_attr('dev_ops', 'get_status', self.path) + color_f="/sys/kernel/" + self.cur_state_path +"/color" + color_state_f="/sys/kernel/" + self.cur_state_path +"/color_state" + + try: + with open(color_f, 'r') as f: + color = f.read().strip("\r\n") + with open(color_state_f, 'r') as f: + color_state = f.read().strip("\r\n") + except IOError: + status="ERROR :" + color_f + " open failed" + return (status) + status = "%s-%s:\t%s %s\n"%(device_name, index, color, color_state) + return (status) + + + +#def main(): +# parser = argparse.ArgumentParser() +# parser.add_argument("--set", action='store', nargs="+", help="set led color: --set ") +# parser.add_argument("--get", action='store', nargs="+", help="get led color: --get ") +# args = parser.parse_args() +# if args.set: +# obj=LedUtil() +# if (len(args.set)==3): +# obj.set_status_led(args.set[0], args.set[1], args.set[2]) +# else: +# obj.set_status_led(args.set[0], args.set[1], args.set[2], args.set[3]) +# +# if args.get: +# obj=LedUtil() +# obj.get_status_led(args.get[0], args.get[1]) + +#if __name__ == "__main__" : +# main() + diff --git a/device/common/pddf/plugins/psuutil.py b/device/common/pddf/plugins/psuutil.py new file mode 100755 index 000000000000..cc50aeecaabf --- /dev/null +++ b/device/common/pddf/plugins/psuutil.py @@ -0,0 +1,274 @@ +#!/usr/bin/env python +# +# Sample pddf_psuutil file +# +# All the supported PSU SysFS aattributes are +#- psu_present +#- psu_model_name +#- psu_power_good +#- psu_mfr_id +#- psu_serial_num +#- psu_fan_dir +#- psu_v_out +#- psu_i_out +#- psu_p_out +#- psu_fan1_speed_rpm +# + +import os.path +import sys, traceback +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import json + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + + +class PsuUtil(PsuBase): + """PDDF generic PSU util class""" + + def __init__(self): + PsuBase.__init__(self) + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + self.platform = pddf_obj.get_platform() + + def get_num_psus(self): + return int(self.platform['num_psus']) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + device = "PSU" + "%d"%index + node = pddf_obj.get_path(device,"psu_power_good") + try: + with open(node, 'r') as f: + status = f.read() + except IOError: + return False + vmap = plugin_data['PSU']['psu_power_good']['valmap'] + + if status.rstrip('\n') in vmap: + return vmap[status.rstrip('\n')] + else: + return False + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + device = "PSU" + "%d"%index + node = pddf_obj.get_path(device,"psu_present") + try: + with open(node, 'r') as f: + status = f.read() + except IOError: + return False + vmap = plugin_data['PSU']['psu_present']['valmap'] + + if status.rstrip('\n') in vmap: + return vmap[status.rstrip('\n')] + else: + return False + + def get_powergood_status(self, idx): + if idx is None: + return False + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return False + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_power_good") + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + if status == 0: + return False + else: + return True + + def get_model(self, idx): + if idx is None: + return None + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return None + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_model_name") + try: + with open(node, 'r') as f: + model = f.read() + except IOError: + return None + + return model.rstrip('\n') + + def get_mfr_id(self, idx): + if idx is None: + return None + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return None + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_mfr_id") + try: + with open(node, 'r') as f: + mfr = f.read() + except IOError: + return None + + return mfr.rstrip('\n') + + def get_serial(self, idx): + if idx is None: + return None + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return None + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_serial_num") + try: + with open(node, 'r') as f: + serial = f.read() + except IOError: + return None + + return serial.rstrip('\n') + + def get_direction(self, idx): + if idx is None: + return None + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return None + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_fan_dir") + try: + with open(node, 'r') as f: + direction = f.read() + except IOError: + return None + + airflow_dir = direction.rstrip('\n') + vmap = plugin_data['PSU']['psu_fan_dir']['valmap'] + + if airflow_dir in vmap: + airflow_dir_real = vmap[airflow_dir] + else: + airflow_dir_real = airflow_dir + + return airflow_dir_real + + def get_output_voltage(self, idx): + if idx is None: + return 0 + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return 0 + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_v_out") + try: + with open(node, 'r') as f: + v_out = int(f.read()) + except IOError: + return 0 + + return v_out + + def get_output_current(self, idx): + if idx is None: + return 0 + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return 0 + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_i_out") + try: + with open(node, 'r') as f: + i_out = int(f.read()) + except IOError: + return 0 + + return i_out + + def get_output_power(self, idx): + if idx is None: + return 0 + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return 0 + + device = "PSU"+"%d"%(idx) + node = pddf_obj.get_path(device, "psu_p_out") + try: + with open(node, 'r') as f: + p_out = int(f.read()) + except IOError: + return 0 + + return p_out + + def get_fan_rpm(self, idx, fan_idx): + if idx is None or fan_idx is None: + return 0 + + if idx<1 or idx>self.platform['num_psus']: + print "Invalid index %d\n"%idx + return 0 + + + device = "PSU"+"%d"%(idx) + num_fans = pddf_obj.get_num_psu_fans(device) + + if fan_idx<1 or fan_idx>num_fans: + print "Invalid PSU-fan index %d\n"%fan_idx + return 0 + + node = pddf_obj.get_path(device, "psu_fan"+str(fan_idx)+"_speed_rpm") + try: + with open(node, 'r') as f: + fan_rpm = int(f.read()) + except IOError: + return 0 + + return fan_rpm + + + def dump_sysfs(self): + return pddf_obj.cli_dump_dsysfs('psu') + +#if __name__== "__main__": + #obj=PsuUtil() + #print(obj.get_psu_status(1)) + #print(obj.get_psu_status(2)) + #print(obj.get_psu_presence(1)) + #print(obj.get_psu_presence(2)) + #print "END\n" diff --git a/device/common/pddf/plugins/sfputil.py b/device/common/pddf/plugins/sfputil.py new file mode 100755 index 000000000000..17ed5158ee59 --- /dev/null +++ b/device/common/pddf/plugins/sfputil.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python + +import os.path +import sys, traceback +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import json + +try: + import time + from ctypes import create_string_buffer + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class SfpUtil(SfpUtilBase): + """Platform generic PDDF SfpUtil class""" + + _port_to_eeprom_mapping = {} + _port_start = 0 + _port_end = 0 + _port_to_type_mapping = {} + _qsfp_ports = [] + _sfp_ports = [] + + def __init__(self): + SfpUtilBase.__init__(self) + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + self.platform = pddf_obj.get_platform() + self._port_start = 0 + self._port_end = self.get_num_ports() + + for port_num in range(self._port_start, self._port_end): + device = "PORT" + "%d"%(port_num+1) + port_eeprom_path = pddf_obj.get_path(device,"eeprom") + self._port_to_eeprom_mapping[port_num] = port_eeprom_path + port_type = pddf_obj.get_device_type(device) + self._port_to_type_mapping[port_num] = port_type + ret = self.populate_port_type(port_num) + + def get_num_ports(self): + return int(self.platform['num_ports']) + + def is_valid_port(self, port_num): + if port_num < self._port_start or port_num > self._port_end: + return False + else: + return True + + def get_presence(self, port_num): + if port_num < self._port_start or port_num > self._port_end: + return False + + status = 0 + device = "PORT" + "%d"%(port_num+1) + port_ps = pddf_obj.get_path(device,"xcvr_present") + #print "port_ps value is : %s"%port_ps + try: + reg_file = open(port_ps, 'r') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = reg_file.readline().rstrip() + #print "%s: Presence Status %d"%(device, int(reg_value)) + if reg_value == '1': + return True + + return False + + def populate_port_type(self, port): + if self._port_to_type_mapping[port] == 'QSFP': + self._qsfp_ports.append(port) + elif self._port_to_type_mapping[port] == 'SFP': + self._sfp_ports.append(port) + + @property + def port_start(self): + return self._port_start + + @property + def port_end(self): + return (self._port_end - 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + @property + def qsfp_ports(self): + return self._qsfp_ports + + def reset(self, port_num): + if port_num < self._port_start or port_num > self._port_end: + return False + + device = "PORT" + "%d"%(port_num+1) + port_ps = pddf_obj.get_path(device,"xcvr_reset") + #print "port_ps value is : %s"%port_ps + try: + reg_file = open(port_ps, 'w') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + #toggle reset + reg_file.seek(0) + reg_file.write('1') + time.sleep(1) + reg_file.seek(0) + reg_file.write('0') + reg_file.close() + return True + #raise NotImplementedError + + def get_low_power_mode(self, port_num): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + device = "PORT" + "%d"%(port_num+1) + port_ps = pddf_obj.get_path(device,"xcvr_lpmode") + #print "port_ps value is : %s"%port_ps + try: + reg_file = open(port_ps, 'w') + except IOError as e: + if not self.get_presence(port_num): + return False + if port_num not in self.qsfp_ports: + return False # Read from eeprom only for QSFP ports + try: + eeprom = None + eeprom = open(self.port_to_eeprom_mapping[port_num], "rb") + eeprom.seek(93) + lpmode = ord(eeprom.read(1)) + + if ((lpmode & 0x3) == 0x3): + return True # Low Power Mode if "Power override" bit is 1 and "Power set" bit is 1 + else: + return False # High Power Mode if one of the following conditions is matched: + # 1. "Power override" bit is 0 + # 2. "Power override" bit is 1 and "Power set" bit is 0 + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if eeprom is not None: + eeprom.close() + time.sleep(0.01) + #raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + # Check for invalid port_num + if port_num < self._port_start or port_num > self._port_end: + return False + + device = "PORT" + "%d"%(port_num+1) + port_ps = pddf_obj.get_path(device,"xcvr_lpmode") + try: + reg_file = open(port_ps, 'w') + except IOError as e: + if not self.get_presence(port_num): + return False # Port is not present, unable to set the eeprom + if port_num not in self.qsfp_ports: + return False # Read from eeprom only for QSFP ports + try: + eeprom = None + # Fill in write buffer + regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode + buffer = create_string_buffer(1) + buffer[0] = chr(regval) + + # Write to eeprom + eeprom = open(self.port_to_eeprom_mapping[port_num], "r+b") + eeprom.seek(93) + eeprom.write(buffer[0]) + return True + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + finally: + if eeprom is not None: + eeprom.close() + time.sleep(0.01) + #raise NotImplementedError + + def get_transceiver_change_event(self): + """ + TODO: This function need to be implemented + when decide to support monitoring SFP(Xcvrd) + on this platform. + """ + raise NotImplementedError + + + def dump_sysfs(self): + return pddf_obj.cli_dump_dsysfs('xcvr') + +#if __name__== "__main__": + #obj=SfpUtil() + #for port in range(1, 32): + #obj.get_presence(port) + #print "\nQSFP ports:" + #print obj.qsfp_ports + diff --git a/device/common/pddf/plugins/sysstatutil.py b/device/common/pddf/plugins/sysstatutil.py new file mode 100755 index 000000000000..9f8e96d9111a --- /dev/null +++ b/device/common/pddf/plugins/sysstatutil.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python + +import os.path +import sys, traceback +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import json + +class SYSStatusUtil(): + """Platform-specific SYSStatus class""" + def __init__(self): + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + + def get_board_info(self): + + device = "SYSSTATUS" + node = pddf_obj.get_path(device,"board_info") + + try: + with open(node, 'r') as f: + status = f.read() + print "board_info : %s" %status + except IOError: + return False + + def get_cpld_versio(self): + + device = "SYSSTATUS" + node = pddf_obj.get_path(device,"cpld1_version") + + try: + with open(node, 'r') as f: + status = f.read() + print "cpld1_version : %s" %status + except IOError: + return False + + def get_power_module_status(self): + + device = "SYSSTATUS" + node = pddf_obj.get_path(device,"power_module_status") + + try: + with open(node, 'r') as f: + status = f.read() + print "power_module_status : %s" %status + except IOError: + return False + + + def get_system_reset_status(self): + + device = "SYSSTATUS" + for i in range(1,8): + node = pddf_obj.get_path(device,"system_reset"+str(i)) + + try: + with open(node, 'r') as f: + status = f.read() + print "system_reset%s : %s" %(i, status) + except IOError: + print "system_reset%s not supported" %i + + + def get_misc_status(self): + + device = "SYSSTATUS" + for i in range(1,3): + node = pddf_obj.get_path(device,"misc"+str(i)) + + try: + with open(node, 'r') as f: + status = f.read() + print "misc%s : %s" %(i, status) + except IOError: + print "system_reset%s not supported" %i + + + def dump_sysfs(self): + return pddf_obj.cli_dump_dsysfs('sys-status') + +#if __name__== "__main__": + #obj=SYSStatusUtil() + #obj.get_board_info() + #obj.get_cpld_versio() + #obj.get_power_module_status() + #obj.get_system_reset_status() + #obj.get_misc_status() + diff --git a/device/common/pddf/plugins/thermalutil.py b/device/common/pddf/plugins/thermalutil.py new file mode 100755 index 000000000000..92047e8a7cde --- /dev/null +++ b/device/common/pddf/plugins/thermalutil.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import os.path +import sys, traceback +import json +sys.path.append('/usr/share/sonic/platform/plugins') +import pddfparse +import argparse + +class ThermalUtil: + def __init__(self): + global pddf_obj + global plugin_data + with open(os.path.join(os.path.dirname(os.path.realpath(__file__)) + '/../pddf/pd-plugin.json')) as pd: + plugin_data = json.load(pd) + + pddf_obj = pddfparse.PddfParse() + self.platform = pddf_obj.get_platform() + self.num_thermals = self.platform['num_temps'] + self.info=[] + + def get_num_thermals(self): + return (self.num_thermals) + + def get_thermal_info(self): + list=[] + pddf_obj.get_device_list(list, "TEMP_SENSOR") + list.sort() + for dev in list: + data={} + device_name = dev['dev_info']['device_name'] + topo_info = dev['i2c']['topo_info'] + label="%s-i2c-%d-%x" % (topo_info['dev_type'], int(topo_info['parent_bus'], 0), int(topo_info['dev_addr'], 0)) + attr_list = dev['i2c']['attr_list'] + data['device_name']=device_name + data['label']=label + for attr in attr_list: + attr_name = attr['attr_name'] + node = pddf_obj.get_path(device_name, attr_name) + try: + with open(node, 'r') as f: + attr_value = int(f.read()) + except IOError: + return False + data[attr_name] = attr_value/float(1000) + self.info.append(data) + + def show_thermal_temp_values(self, idx): + if idx<1 or idx>self.num_thermals: + print "Invalid temperature sensor idx %d"%idx + return None + self.get_thermal_info() + thermal_name = "TEMP"+"%d"%idx + label="" + value="" + for temp in self.info: + if thermal_name==temp['device_name']: + label = temp['label'] + value = "temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % (temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst']) + else: + continue + + return (label, value) + + def show_temp_values(self): + self.get_thermal_info() + for temp in self.info: + print temp['label'] + print "temp1\t %+.1f C (high = %+.1f C, hyst = %+.1f C)" % (temp['temp1_input'], temp['temp1_max'], temp['temp1_max_hyst']) + + + def dump_sysfs(self): + return pddf_obj.cli_dump_dsysfs('temp-sensors') + + + + +#temp=ThermalUtil() +#num_temps = temp.get_num_thermals() +##temp.get_thermal_info() +#temp.show_temp_values() diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index 9a3deebef34a..786efc54e55b 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -18,7 +18,8 @@ RUN apt-get update && \ rrdtool \ python-smbus \ ethtool \ - dmidecode + dmidecode \ + python-jsonschema {% if docker_platform_monitor_debs.strip() -%} # Copy locally-built Debian package dependencies diff --git a/platform/broadcom/sonic-platform-modules-accton/as7712-32x/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..cbae062c10b4 --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7712-32x/utils/pddf_switch_svc.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import os +import sys +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + status, output = commands.getstatusoutput("systemctl stop as7712-platform-init.service") + if status: + print "Stop as7712-platform-init.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable as7712-platform-init.service") + if status: + print "Disable as7712-platform-init.service failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + status, output = commands.getstatusoutput("systemctl enable as7712-platform-init.service") + if status: + print "Enable as7712-platform-init.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start as7712-platform-init.service") + if status: + print "Start as7712-platform-init.service failed %d"%status + return False + + return True + +def start_platform_pddf(): + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + +def main(): + pass + +if __name__ == "__main__": + main() + diff --git a/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_switch_svc.py b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_switch_svc.py new file mode 100755 index 000000000000..2a52715a548a --- /dev/null +++ b/platform/broadcom/sonic-platform-modules-accton/as7726-32x/utils/pddf_switch_svc.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +# Script to stop and start the respective platforms default services. +# This will be used while switching the pddf->non-pddf mode and vice versa +import os +import sys +import commands + +def check_pddf_support(): + return True + +def stop_platform_svc(): + status, output = commands.getstatusoutput("systemctl stop as7726-32x-platform-monitor-fan.service") + if status: + print "Stop as7726-32x-platform-monitor-fan.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable as7726-32x-platform-monitor-fan.service") + if status: + print "Disable as7726-32x-platform-monitor-fan.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl stop as7726-32x-platform-monitor-psu.service") + if status: + print "Stop as7726-32x-platform-monitor-psu.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable as7726-32x-platform-monitor-psu.service") + if status: + print "Disable as7726-32x-platform-monitor-psu.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl stop as7726-32x-platform-monitor.service") + if status: + print "Stop as7726-32x-platform-monitor.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl disable as7726-32x-platform-monitor.service") + if status: + print "Disable as7726-32x-platform-monitor.service failed %d"%status + return False + + status, output = commands.getstatusoutput("/usr/local/bin/accton_as7726_32x_util.py clean") + if status: + print "accton_as7726_32x_util.py clean command failed %d"%status + return False + + # HACK , stop the pddf-platform-init service if it is active + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service along with other platform serives failed %d"%status + return False + + return True + +def start_platform_svc(): + status, output = commands.getstatusoutput("/usr/local/bin/accton_as7726_32x_util.py install") + if status: + print "accton_as7726_32x_util.py install command failed %d"%status + return False + + status, output = commands.getstatusoutput("systemctl enable as7726-32x-platform-monitor-fan.service") + if status: + print "Enable as7726-32x-platform-monitor-fan.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start as7726-32x-platform-monitor-fan.service") + if status: + print "Start as7726-32x-platform-monitor-fan.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl enable as7726-32x-platform-monitor-psu.service") + if status: + print "Enable as7726-32x-platform-monitor-psu.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start as7726-32x-platform-monitor-psu.service") + if status: + print "Start as7726-32x-platform-monitor-psu.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl enable as7726-32x-platform-monitor.service") + if status: + print "Enable as7726-32x-platform-monitor.service failed %d"%status + return False + status, output = commands.getstatusoutput("systemctl start as7726-32x-platform-monitor.service") + if status: + print "Start as7726-32x-platform-monitor.service failed %d"%status + return False + + return True + +def start_platform_pddf(): + status, output = commands.getstatusoutput("systemctl start pddf-platform-init.service") + if status: + print "Start pddf-platform-init.service failed %d"%status + return False + + return True + +def stop_platform_pddf(): + status, output = commands.getstatusoutput("systemctl stop pddf-platform-init.service") + if status: + print "Stop pddf-platform-init.service failed %d"%status + return False + + return True + +def main(): + pass + +if __name__ == "__main__": + main() + diff --git a/platform/pddf/README.md b/platform/pddf/README.md new file mode 100644 index 000000000000..b1b1238f3a97 --- /dev/null +++ b/platform/pddf/README.md @@ -0,0 +1,18 @@ + Platform Driver Development Framework (PDDF) is part of SONiC Platform Development Kit (PDK) which optimizes the platform developement. + + SONiC PDDF (Platform driver development framework) supports the following HW devices on a given platform: + + - Fan + - PSU + - System EEPROM + - CPLD + - Optic Transceivers + - System LED control via CPLD + - System Status Registers in CPLD + - Temp Sensors + + This folder for the PDDF consists of the following: + + - PDDF python scripts + - Generic PDDF HW device drivers in kernel space + diff --git a/platform/pddf/i2c/.gitignore b/platform/pddf/i2c/.gitignore new file mode 100644 index 000000000000..a1840982d5b2 --- /dev/null +++ b/platform/pddf/i2c/.gitignore @@ -0,0 +1,52 @@ +# Object files +*.o +*.ko +*.obj +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su + +# Kernel Module Compile Results +*.mod* +*.cmd +*.o.d +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Debian packaging +*.debhelper.log +*.postinst.debhelper +*.postrm.debhelper +*.prerm.debhelper +*.substvars + + diff --git a/platform/pddf/i2c/Makefile b/platform/pddf/i2c/Makefile new file mode 100644 index 000000000000..1486370b5005 --- /dev/null +++ b/platform/pddf/i2c/Makefile @@ -0,0 +1 @@ +subdir-m := modules diff --git a/platform/pddf/i2c/debian/changelog b/platform/pddf/i2c/debian/changelog new file mode 100755 index 000000000000..ec192a8ead64 --- /dev/null +++ b/platform/pddf/i2c/debian/changelog @@ -0,0 +1,5 @@ +sonic-pddf-platform-modules (1.1) unstable; urgency=low + + * Initial release + + -- Broadcom Wed, 26 JUNE 2019 10:10:10 -0800 diff --git a/platform/pddf/i2c/debian/compat b/platform/pddf/i2c/debian/compat new file mode 100644 index 000000000000..ec635144f600 --- /dev/null +++ b/platform/pddf/i2c/debian/compat @@ -0,0 +1 @@ +9 diff --git a/platform/pddf/i2c/debian/control b/platform/pddf/i2c/debian/control new file mode 100755 index 000000000000..026768ec44a7 --- /dev/null +++ b/platform/pddf/i2c/debian/control @@ -0,0 +1,10 @@ +Source: sonic-pddf-platform-modules +Section: main +Priority: extra +Maintainer: Broadcom +Build-Depends: debhelper (>= 9), bzip2 +Standards-Version: 3.9.3 + +Package: sonic-platform-pddf +Architecture: amd64 +Description: Generic kernel modules for platform devices such as psu, fan, sfp, led diff --git a/platform/pddf/i2c/debian/files b/platform/pddf/i2c/debian/files new file mode 100644 index 000000000000..a1092ae93e30 --- /dev/null +++ b/platform/pddf/i2c/debian/files @@ -0,0 +1,2 @@ +sonic-pddf-platform-modules_1.1_amd64.buildinfo main extra +sonic-platform-pddf_1.1_amd64.deb main extra diff --git a/platform/pddf/i2c/debian/rules b/platform/pddf/i2c/debian/rules new file mode 100755 index 000000000000..637b89109d76 --- /dev/null +++ b/platform/pddf/i2c/debian/rules @@ -0,0 +1,76 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. + +include /usr/share/dpkg/pkg-info.mk + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export INSTALL_MOD_DIR:=extra + +PYTHON ?= python2 + +PACKAGE_PRE_NAME := sonic-platform-pddf +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS:= client cpld cpld/driver fan fan/driver fan/vendor_api mux led psu psu/driver sysstatus xcvr xcvr/driver +MODULE_DIR:= modules +UTILS_DIR := utils +SERVICE_DIR := service + +%: + echo =================RUNNING $@============= + dh $@ --with systemd,python2,python3 --buildsystem=pybuild + +clean: + echo ============CLEANING================= + dh_testdir + dh_testroot + dh_clean + make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR) clean + +build: + make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR); \ + $(PYTHON) $(MOD_SRC_DIR)/setup.py build; \ + + +binary: binary-arch binary-indep + # Nothing to do + +binary-arch: + # Nothing to do + +binary-indep: + dh_testdir + dh_installdirs + + dh_installdirs -p$(PACKAGE_PRE_NAME) $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + dh_installdirs -p$(PACKAGE_PRE_NAME) usr/local/bin; \ + dh_installdirs -p$(PACKAGE_PRE_NAME) lib/systemd/system; \ + # Custom package commands + (for mod in $(MODULE_DIRS); do \ + cp $(MOD_SRC_DIR)/$(MODULE_DIR)/$${mod}/*.ko debian/$(PACKAGE_PRE_NAME)/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + done) ; \ + cp -r $(MOD_SRC_DIR)/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)/usr/local/bin/; \ + cp $(MOD_SRC_DIR)/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)/lib/systemd/system/; \ + $(PYTHON) $(MOD_SRC_DIR)/setup.py install --root=$(MOD_SRC_DIR)/debian/$(PACKAGE_PRE_NAME) --install-layout=deb; + + # Resuming debhelper scripts + dh_testroot + dh_install + dh_installchangelogs + dh_installdocs + dh_systemd_enable + dh_installinit + dh_systemd_start + dh_link + dh_fixperms + dh_compress + dh_strip + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb +.PHONY: build binary binary-arch binary-indep clean diff --git a/platform/pddf/i2c/modules/Makefile b/platform/pddf/i2c/modules/Makefile new file mode 100644 index 000000000000..4c9cb055d6a6 --- /dev/null +++ b/platform/pddf/i2c/modules/Makefile @@ -0,0 +1 @@ +subdir-m := client cpld xcvr mux psu fan led sysstatus diff --git a/platform/pddf/i2c/modules/client/Makefile b/platform/pddf/i2c/modules/client/Makefile new file mode 100644 index 000000000000..2be81d40da68 --- /dev/null +++ b/platform/pddf/i2c/modules/client/Makefile @@ -0,0 +1,4 @@ +obj-m:= pddf_client_module.o +#GCOV_PROFILE := y + +ccflags-y := -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/client/pddf_client_module.c b/platform/pddf/i2c/modules/client/pddf_client_module.c new file mode 100644 index 000000000000..5ad0a6a75f59 --- /dev/null +++ b/platform/pddf/i2c/modules/client/pddf_client_module.c @@ -0,0 +1,348 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create access-data attributes for client creation + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" + + + +NEW_DEV_ATTR pddf_data={0}; +EXPORT_SYMBOL(pddf_data); +int showall = 0; + + +/* CLIENT CREATION DATA ATTR LIST */ +PDDF_DATA_ATTR(i2c_type, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&pddf_data.i2c_type, NULL); +PDDF_DATA_ATTR(i2c_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&pddf_data.i2c_name, NULL); +PDDF_DATA_ATTR(parent_bus, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_HEX, sizeof(int), (void*)&pddf_data.parent_bus, NULL); +PDDF_DATA_ATTR(dev_type, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&pddf_data.dev_type, NULL); +PDDF_DATA_ATTR(dev_addr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_HEX, sizeof(int), (void*)&pddf_data.dev_addr, NULL); +PDDF_DATA_ATTR(error, S_IRUGO, show_error_code, NULL, PDDF_INT_DEC, sizeof(int), (void*)&pddf_data.error, (void*)&pddf_data.errstr); + + + +static struct attribute *pddf_clients_data_attributes[] = { + &attr_i2c_type.dev_attr.attr, + &attr_i2c_name.dev_attr.attr, + &attr_parent_bus.dev_attr.attr, + &attr_dev_type.dev_attr.attr, + &attr_dev_addr.dev_attr.attr, + &attr_error.dev_attr.attr, + NULL +}; + +struct attribute_group pddf_clients_data_group = { + .attrs = pddf_clients_data_attributes, +}; +EXPORT_SYMBOL(pddf_clients_data_group); + + + +PDDF_DATA_ATTR(showall, S_IRUGO, show_all_devices, NULL, PDDF_INT_DEC, sizeof(int), (void *)&showall, NULL); + +static struct attribute *pddf_allclients_data_attributes[] = { + &attr_showall.dev_attr.attr, + NULL +}; +struct attribute_group pddf_allclients_data_group = { + .attrs = pddf_allclients_data_attributes, +}; + + + + + +void set_attr_data(void * ptr) +{ + pddf_data.data=ptr; +} + +ssize_t show_all_devices(struct device *dev, struct device_attribute *da, char *buf) +{ + int ret = 0; + PDDF_ATTR *pptr = (PDDF_ATTR *)da; + int *ptr = (int *)pptr->addr; + + traverse_device_table(); + ret = sprintf(buf, "Total Devices: %d\n", *ptr); + + return ret; +} + +ssize_t show_error_code(struct device *dev, struct device_attribute *da, char *buf) +{ + int ret = 0; + PDDF_ATTR *pptr = (PDDF_ATTR *)da; + NEW_DEV_ATTR *ptr = ( NEW_DEV_ATTR *)pptr->addr; + + ret = sprintf(buf, "0x%x:%s\n", (ptr->error), ptr->errstr); + + return ret; +} + +void set_error_code(int ecode, char *estr) +{ + pddf_data.error = ecode; + strcpy(pddf_data.errstr, estr); + return; +} +EXPORT_SYMBOL(set_error_code); + +ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, char *buf) +{ + int ret = 0; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + /*pddf_dbg(KERN_ERR "[ READ ] DATA ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ + switch(ptr->type) + { + case PDDF_CHAR: + ret = sprintf(buf, "%s\n", ptr->addr); + break; + case PDDF_UCHAR: + ret = sprintf(buf, "%d\n", *(unsigned char*)(ptr->addr)); + break; + case PDDF_INT_DEC: + ret = sprintf(buf, "%d\n", *(int*)(ptr->addr)); + break; + case PDDF_INT_HEX: + ret = sprintf(buf, "0x%x\n", *(int*)(ptr->addr)); + break; + case PDDF_USHORT: + ret = sprintf(buf, "0x%x\n", *(unsigned short *)(ptr->addr)); + break; + case PDDF_UINT32: + ret = sprintf(buf, "0x%x\n", *(uint32_t *)(ptr->addr)); + break; + default: + break; + } + + return ret; +} +EXPORT_SYMBOL(show_pddf_data); + +ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + int ret = 0, num = 0; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + /*pddf_dbg(KERN_ERR "[ WRITE ] ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ + + switch(ptr->type) + { + case PDDF_CHAR: + strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf + ptr->addr[strlen(buf)-1] = '\0'; + /*pddf_dbg(KERN_ERR "Stored value: %s\n", ptr->addr);*/ + break; + case PDDF_UCHAR: + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(unsigned char *)(ptr->addr) = (unsigned char)num; + /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_INT_DEC: + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_INT_HEX: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_USHORT: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(unsigned short *)(ptr->addr) = (unsigned short)num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_UINT32: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(uint32_t *)(ptr->addr) = (uint32_t)num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + default: + break; + } + + return count; +} +EXPORT_SYMBOL(store_pddf_data); + + + +void* get_attr_ext_fn( char *name) +{ + const struct kernel_symbol *sym=NULL; + preempt_disable(); + if (!(sym=find_symbol("example_fun", NULL, NULL, true, false))) { + preempt_enable(); + // Do fail action + return NULL; + } + preempt_enable(); + + pddf_dbg(CLIENT, KERN_ERR "[ FIND SYM ] symbol:%s, address:%lx\n", sym->name, sym->value); + (( int (*)(void))sym->value)(); + + return (void*)sym->value; + +} +EXPORT_SYMBOL(get_attr_ext_fn); + + + +DEFINE_HASHTABLE(htable, 8); + +int get_hash(char *name) +{ + int i=0; + int hash=0; + for(i=0; iname, name); + hdev->data = ptr; + pddf_dbg(CLIENT, KERN_ERR "%s: Adding ptr 0x%x to the hash table\n", __FUNCTION__, ptr); + hash_add(htable, &hdev->node, get_hash(hdev->name)); +} +EXPORT_SYMBOL(add_device_table); + +void* get_device_table(char *name) +{ + PDEVICE *dev=NULL; + int i=0; + + hash_for_each(htable, i, dev, node) { + if(strcmp(dev->name, name)==0) { + pddf_dbg(CLIENT, KERN_ERR "found entry: %s 0x%x\n", dev->name, dev->data); + return (void *)dev->data; + } + } + + return NULL; +} +EXPORT_SYMBOL(get_device_table); + +void delete_device_table(char *name) +{ + PDEVICE *dev=NULL; + int i=0; + + hash_for_each(htable, i, dev, node) { + if(strcmp(dev->name, name)==0) { + pddf_dbg(CLIENT, KERN_ERR "found entry to delete: %s 0x%x\n", dev->name, dev->data); + hash_del(&(dev->node)); + } + } + return; +} +EXPORT_SYMBOL(delete_device_table); + +void traverse_device_table(void ) +{ + PDEVICE *dev=NULL; + int i=0; + hash_for_each(htable, i, dev, node) { + pddf_dbg(CLIENT, KERN_ERR "Entry[%d]: %s : 0x%x\n", i, dev->name, dev->data); + } + showall = i; +} +EXPORT_SYMBOL(traverse_device_table); + +struct kobject *device_kobj; +static struct kobject *pddf_kobj; + +struct kobject *get_device_i2c_kobj(void) +{ + return device_kobj; +} + +EXPORT_SYMBOL(get_device_i2c_kobj); + +int __init pddf_data_init(void) +{ + int ret = 0; + + + pddf_dbg(CLIENT, "PDDF_DATA MODULE.. init\n"); + + pddf_kobj = kobject_create_and_add("pddf", kernel_kobj); + if(!pddf_kobj) { + return -ENOMEM; + } + device_kobj = kobject_create_and_add("devices", pddf_kobj); + if(!device_kobj) { + return -ENOMEM; + } + + init_device_table(); + + ret = sysfs_create_group(device_kobj, &pddf_allclients_data_group); + if (ret) + { + kobject_put(device_kobj); + return ret; + } + pddf_dbg(CLIENT, "CREATED PDDF ALLCLIENTS CREATION SYSFS GROUP\n"); + + + + return ret; +} + +void __exit pddf_data_exit(void) +{ + + pddf_dbg(CLIENT, "PDDF_DATA MODULE.. exit\n"); + sysfs_remove_group(device_kobj, &pddf_allclients_data_group); + + kobject_put(device_kobj); + kobject_put(pddf_kobj); + pddf_dbg(CLIENT, KERN_ERR "%s: Removed the kernle object for 'pddf' and 'device' \n", __FUNCTION__); + return; +} + +module_init(pddf_data_init); +module_exit(pddf_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("pddf data"); +MODULE_LICENSE("GPL"); + diff --git a/platform/pddf/i2c/modules/cpld/Makefile b/platform/pddf/i2c/modules/cpld/Makefile new file mode 100644 index 000000000000..e0851f201111 --- /dev/null +++ b/platform/pddf/i2c/modules/cpld/Makefile @@ -0,0 +1,13 @@ +subdir-m := driver +obj-m := pddf_cpld_module.o +#GCOV_PROFILE := y + +#$(info ===========$(M)=========) +CFLAGS_$(obj-m):= -I$(M)/modules/include + +#all: + #$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) modules ; + +#clean: + #$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) clean ; + diff --git a/platform/pddf/i2c/modules/cpld/driver/Makefile b/platform/pddf/i2c/modules/cpld/driver/Makefile new file mode 100644 index 000000000000..8d47b4c37002 --- /dev/null +++ b/platform/pddf/i2c/modules/cpld/driver/Makefile @@ -0,0 +1,9 @@ +TARGET = pddf_cpld_driver + + +obj-m := $(TARGET).o +#GCOV_PROFILE := y + + +ccflags-y := -I$(M)/modules/include +#ccflags-y += -I$(M)/modules/cpld diff --git a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c new file mode 100755 index 000000000000..a302954a976d --- /dev/null +++ b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c @@ -0,0 +1,184 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel driver module for CPLD + */ + +#include +#include +#include +#include +#include + + +//extern int hw_preaccess_func_cpld_mux_default(uint32_t unit, void *data); + + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +/* Addresses scanned for board_i2c_cpld + */ +static const unsigned short normal_i2c[] = { 0x31, 0x32, 0x33, 0x35, 0x60, 0x61, 0x62, 0x64, I2C_CLIENT_END }; + +static void board_i2c_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void board_i2c_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +static int board_i2c_cpld_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr); + status = -EIO; + goto exit; + } + + dev_dbg(&client->dev, "chip found\n"); + board_i2c_cpld_add_client(client); + + return 0; + +exit: + return status; +} + +static int board_i2c_cpld_remove(struct i2c_client *client) +{ + board_i2c_cpld_remove_client(client); + + return 0; +} + +static const struct i2c_device_id board_i2c_cpld_id[] = { + { "i2c_cpld", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, board_i2c_cpld_id); + +static struct i2c_driver board_i2c_cpld_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "i2c_cpld", + }, + .probe = board_i2c_cpld_probe, + .remove = board_i2c_cpld_remove, + .id_table = board_i2c_cpld_id, + .address_list = normal_i2c, +}; + +int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_read_byte_data(cpld_node->client, reg); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(board_i2c_cpld_read); + +int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(board_i2c_cpld_write); + +static int __init board_i2c_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&board_i2c_cpld_driver); +} + +static void __exit board_i2c_cpld_exit(void) +{ + i2c_del_driver(&board_i2c_cpld_driver); +} + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("board_i2c_cpld driver"); +MODULE_LICENSE("GPL"); + +module_init(board_i2c_cpld_init); +module_exit(board_i2c_cpld_exit); diff --git a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c new file mode 100644 index 000000000000..0f9f3f2f0a63 --- /dev/null +++ b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c @@ -0,0 +1,171 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create I2C client for a CPLD + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_cpld_defs.h" + + +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern void *get_device_table(char *name); +extern void delete_device_table(char *name); + + +/* MUX CLIENT DATA */ +PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, NULL, (void*)&pddf_data); + + + +static struct attribute *cpld_attributes[] = { + &attr_dev_ops.dev_attr.attr, + NULL +}; + +static const struct attribute_group pddf_cpld_client_data_group = { + .attrs = cpld_attributes, +}; + + +/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + static struct i2c_board_info board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(device_ptr->parent_bus); + + if (strncmp(device_ptr->dev_type, "i2c_cpld", strlen("i2c_cpld"))==0) + { + board_info = (struct i2c_board_info) { + .platform_data = (void *)NULL, + }; + + board_info.addr = device_ptr->dev_addr; + strcpy(board_info.type, device_ptr->dev_type); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ + client_ptr = i2c_new_device(adapter, &board_info); + + if (client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(CPLD, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + add_device_table(device_ptr->i2c_name, (void*)client_ptr); + } + else { + i2c_put_adapter(adapter); + goto free_data; + } + + } + else + { + printk(KERN_ERR "%s: Unsupported type of cpld - unable to add i2c client\n", __FUNCTION__); + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); + if (client_ptr) + { + pddf_dbg(CPLD, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(device_ptr->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + +free_data: + /*TODO: free the device_ptr->data is dynamically allocated*/ + memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); + + return count; +} + + +static struct kobject *cpld_kobj; + +int __init cpld_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(CPLD, "CPLD_DATA MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + cpld_kobj = kobject_create_and_add("cpld", device_kobj); + if(!cpld_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(cpld_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(cpld_kobj); + return ret; + } + pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(cpld_kobj, &pddf_cpld_client_data_group); + if (ret) + { + sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); + kobject_put(cpld_kobj); + return ret; + } + pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + return ret; +} + +void __exit cpld_data_exit(void) +{ + pddf_dbg(CPLD, "CPLD_DATA MODULE.. exit\n"); + sysfs_remove_group(cpld_kobj, &pddf_cpld_client_data_group); + sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); + kobject_put(cpld_kobj); + pddf_dbg(CPLD, KERN_ERR "%s: Removed the kobjects for 'cpld'\n",__FUNCTION__); + return; +} + +module_init(cpld_data_init); +module_exit(cpld_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("cpld platform data"); +MODULE_LICENSE("GPL"); + +/*#endif*/ diff --git a/platform/pddf/i2c/modules/fan/Makefile b/platform/pddf/i2c/modules/fan/Makefile new file mode 100644 index 000000000000..d723bff09888 --- /dev/null +++ b/platform/pddf/i2c/modules/fan/Makefile @@ -0,0 +1,6 @@ +subdir-m := driver +obj-m := pddf_fan_module.o +#GCOV_PROFILE := y + +CFLAGS_$(obj-m):= -I$(M)/modules/include + diff --git a/platform/pddf/i2c/modules/fan/driver/Makefile b/platform/pddf/i2c/modules/fan/driver/Makefile new file mode 100644 index 000000000000..eee76a179cb0 --- /dev/null +++ b/platform/pddf/i2c/modules/fan/driver/Makefile @@ -0,0 +1,8 @@ +TARGET := pddf_fan_driver_module + +obj-m := $(TARGET).o + +$(TARGET)-objs := pddf_fan_api.o pddf_fan_driver.o +#GCOV_PROFILE := y + +ccflags-y := -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c new file mode 100644 index 000000000000..723b8ff1f4ea --- /dev/null +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c @@ -0,0 +1,422 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description of various APIs related to FAN component + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_fan_defs.h" +#include "pddf_fan_driver.h" + +/*#define FAN_DEBUG*/ +#ifdef FAN_DEBUG +#define fan_dbg(...) printk(__VA_ARGS__) +#else +#define fan_dbg(...) +#endif + + +void get_fan_duplicate_sysfs(int idx, char *str) +{ + switch (idx) + { + case FAN1_FRONT_RPM: + strcpy(str, "fan1_input"); + break; + case FAN2_FRONT_RPM: + strcpy(str, "fan2_input"); + break; + case FAN3_FRONT_RPM: + strcpy(str, "fan3_input"); + break; + case FAN4_FRONT_RPM: + strcpy(str, "fan4_input"); + break; + case FAN5_FRONT_RPM: + strcpy(str, "fan5_input"); + break; + case FAN6_FRONT_RPM: + strcpy(str, "fan6_input"); + break; + case FAN1_REAR_RPM: + strcpy(str, "fan11_input"); + break; + case FAN2_REAR_RPM: + strcpy(str, "fan12_input"); + break; + case FAN3_REAR_RPM: + strcpy(str, "fan13_input"); + break; + case FAN4_REAR_RPM: + strcpy(str, "fan14_input"); + break; + case FAN5_REAR_RPM: + strcpy(str, "fan15_input"); + break; + case FAN6_REAR_RPM: + strcpy(str, "fan16_input"); + break; + default: + break; + } + + return; +} + + +int fan_update_hw(struct device *dev, struct fan_attr_info *info, FAN_DATA_ATTR *udata) +{ + int status = 0; + struct i2c_client *client = to_i2c_client(dev); + FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; + + + mutex_lock(&info->update_lock); + + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_set != NULL) + { + status = (sysfs_attr_data->pre_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: pre_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_set != NULL) + { + status = (sysfs_attr_data->do_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: do_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + + } + if (sysfs_attr_data->post_set != NULL) + { + status = (sysfs_attr_data->post_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: post_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + + mutex_unlock(&info->update_lock); + + return 0; +} + +int fan_update_attr(struct device *dev, struct fan_attr_info *info, FAN_DATA_ATTR *udata) +{ + int status = 0; + struct i2c_client *client = to_i2c_client(dev); + FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; + + + mutex_lock(&info->update_lock); + + if (time_after(jiffies, info->last_updated + HZ + HZ / 2) || !info->valid) + { + dev_dbg(&client->dev, "Starting pddf_fan update\n"); + info->valid = 0; + + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_get != NULL) + { + status = (sysfs_attr_data->pre_get)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_get != NULL) + { + status = (sysfs_attr_data->do_get)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + + } + if (sysfs_attr_data->post_get != NULL) + { + status = (sysfs_attr_data->post_get)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + + + info->last_updated = jiffies; + info->valid = 1; + } + + mutex_unlock(&info->update_lock); + + return 0; +} + +ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct fan_data *data = i2c_get_clientdata(client); + FAN_PDATA *pdata = (FAN_PDATA *)(client->dev.platform_data); + FAN_DATA_ATTR *usr_data = NULL; + struct fan_attr_info *attr_info = NULL; + int i, status=0; + char new_str[ATTR_NAME_LEN] = ""; + FAN_SYSFS_ATTR_DATA *ptr = NULL; + + for (i=0;inum_attr;i++) + { + ptr = (FAN_SYSFS_ATTR_DATA *)pdata->fan_attrs[i].access_data; + get_fan_duplicate_sysfs(ptr->index , new_str); + if (strcmp(attr->dev_attr.attr.name, pdata->fan_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0) + { + /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->fan_attrs[i].aname, ptr->index, new_str);*/ + attr_info = &data->attr_info[i]; + usr_data = &pdata->fan_attrs[i]; + strcpy(new_str, ""); + } + } + + if (attr_info==NULL || usr_data==NULL) + { + printk(KERN_ERR "%s is not supported attribute for this client\n", usr_data->aname); + goto exit; + } + + fan_update_attr(dev, attr_info, usr_data); + + /*Decide the o/p based on attribute type */ + switch(attr->index) + { + case FAN1_PRESENT: + case FAN2_PRESENT: + case FAN3_PRESENT: + case FAN4_PRESENT: + case FAN5_PRESENT: + case FAN6_PRESENT: + case FAN1_DIRECTION: + case FAN2_DIRECTION: + case FAN3_DIRECTION: + case FAN4_DIRECTION: + case FAN5_DIRECTION: + case FAN6_DIRECTION: + case FAN1_FRONT_RPM: + case FAN2_FRONT_RPM: + case FAN3_FRONT_RPM: + case FAN4_FRONT_RPM: + case FAN5_FRONT_RPM: + case FAN6_FRONT_RPM: + case FAN1_REAR_RPM: + case FAN2_REAR_RPM: + case FAN3_REAR_RPM: + case FAN4_REAR_RPM: + case FAN5_REAR_RPM: + case FAN6_REAR_RPM: + case FAN1_PWM: + case FAN2_PWM: + case FAN3_PWM: + case FAN4_PWM: + case FAN5_PWM: + case FAN6_PWM: + case FAN1_FAULT: + case FAN2_FAULT: + case FAN3_FAULT: + case FAN4_FAULT: + case FAN5_FAULT: + case FAN6_FAULT: + status = attr_info->val.intval; + break; + default: + fan_dbg(KERN_ERR "%s: Unable to find the attribute index for %s\n", __FUNCTION__, usr_data->aname); + status = 0; + } + +exit: + return sprintf(buf, "%d\n", status); +} + + +ssize_t fan_store_default(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct fan_data *data = i2c_get_clientdata(client); + FAN_PDATA *pdata = (FAN_PDATA *)(client->dev.platform_data); + FAN_DATA_ATTR *usr_data = NULL; + struct fan_attr_info *attr_info = NULL; + int i, ret ; + uint32_t val; + + for (i=0;inum_attr;i++) + { + if (strcmp(data->attr_info[i].name, attr->dev_attr.attr.name) == 0 && strcmp(pdata->fan_attrs[i].aname, attr->dev_attr.attr.name) == 0) + { + attr_info = &data->attr_info[i]; + usr_data = &pdata->fan_attrs[i]; + } + } + + if (attr_info==NULL || usr_data==NULL) { + printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); + goto exit; + } + + switch(attr->index) + { + case FAN1_PWM: + case FAN2_PWM: + case FAN3_PWM: + case FAN4_PWM: + case FAN5_PWM: + case FAN6_PWM: + ret = kstrtoint(buf, 10, &val); + if (ret) + { + printk(KERN_ERR "%s: Unable to convert string into value for %s\n", __FUNCTION__, usr_data->aname); + return ret; + } + /*Update the value of attr_info here, and use it to update the HW values*/ + attr_info->val.intval = val; + break; + default: + printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname); + goto exit; + } + + fan_dbg(KERN_ERR "%s: pwm to be set is %d\n", __FUNCTION__, val); + fan_update_hw(dev, attr_info, usr_data); + +exit: + return count; +} + +int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + int val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + painfo->val.intval = ((val & udata->mask) == udata->cmpval); + + /*fan_dbg(KERN_ERR "presence: val:0x%x, mask:0x%x, present_value = 0x%x\n", val, udata->mask, painfo->val.intval);*/ + + return status; +} + +int sonic_i2c_get_fan_rpm_default(void *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + uint32_t val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + if (udata->len == 1) + { + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + } + else if (udata->len ==2) + { + val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); + + } + + if (udata->is_divisor) + painfo->val.intval = udata->mult / (val >> 3); + else + painfo->val.intval = udata->mult * val; + + return status; +} + + +int sonic_i2c_get_fan_direction_default(void *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + uint32_t val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + painfo->val.intval = ((val & udata->mask) == udata->cmpval); + /*fan_dbg(KERN_ERR "direction: val:0x%x, mask:0x%x, final val:0x%x\n", val, udata->mask, painfo->val.intval);*/ + + return status; +} + + +int sonic_i2c_set_fan_pwm_default(struct i2c_client *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + uint32_t val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + val = painfo->val.intval & udata->mask; + + if (val > 255) + { + return -EINVAL; + } + + if (udata->len == 1) + i2c_smbus_write_byte_data(client, udata->offset, val); + else if (udata->len == 2) + { + uint8_t val_lsb = val & 0xFF; + uint8_t val_hsb = (val >> 8) & 0xFF; + /* TODO: Check this logic for LE and BE */ + i2c_smbus_write_byte_data(client, udata->offset, val_lsb); + i2c_smbus_write_byte_data(client, udata->offset+1, val_hsb); + } + else + { + printk(KERN_DEBUG "%s: pwm should be of len 1/2 bytes. Not setting the pwm as the length is %d\n", __FUNCTION__, udata->len); + } + + return status; +} + + +int sonic_i2c_get_fan_pwm_default(void *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + uint32_t val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + if (udata->len == 1) + { + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + } + else if (udata->len ==2) + { + val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); + + } + + val = val & udata->mask; + painfo->val.intval = val; + return status; +} + +int sonic_i2c_get_fan_fault_default(void *client, FAN_DATA_ATTR *udata, void *info) +{ + int status = 0; + uint32_t val = 0; + struct fan_attr_info *painfo = (struct fan_attr_info *)info; + + /*Assuming fan fault to be denoted by 1 byte only*/ + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + + val = val & udata->mask; + painfo->val.intval = val; + return status; +} + + +int pddf_fan_post_probe_default(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + + /*Dummy func for now - check the respective platform modules*/ + return 0; +} + diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c new file mode 100644 index 000000000000..cdbba98c8110 --- /dev/null +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c @@ -0,0 +1,410 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module for a FAN controller + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_fan_defs.h" +#include "pddf_fan_driver.h" +#include "pddf_fan_api.h" + +#define DRVNAME "pddf_fan" + +struct pddf_ops_t pddf_fan_ops = { + .pre_init = NULL, + .post_init = NULL, + + .pre_probe = NULL, + .post_probe = pddf_fan_post_probe_default, + + .pre_remove = NULL, + .post_remove = NULL, + + .pre_exit = NULL, + .post_exit = NULL, +}; +EXPORT_SYMBOL(pddf_fan_ops); + + + +FAN_SYSFS_ATTR_DATA data_fan1_present = {FAN1_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_present); +FAN_SYSFS_ATTR_DATA data_fan2_present = {FAN2_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_present); +FAN_SYSFS_ATTR_DATA data_fan3_present = {FAN3_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_present); +FAN_SYSFS_ATTR_DATA data_fan4_present = {FAN4_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_present); +FAN_SYSFS_ATTR_DATA data_fan5_present = {FAN5_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_present); +FAN_SYSFS_ATTR_DATA data_fan6_present = {FAN6_PRESENT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_present_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_present); + +FAN_SYSFS_ATTR_DATA data_fan1_direction = {FAN1_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_direction); +FAN_SYSFS_ATTR_DATA data_fan2_direction = {FAN2_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_direction); +FAN_SYSFS_ATTR_DATA data_fan3_direction = {FAN3_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_direction); +FAN_SYSFS_ATTR_DATA data_fan4_direction = {FAN4_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_direction); +FAN_SYSFS_ATTR_DATA data_fan5_direction = {FAN5_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_direction); +FAN_SYSFS_ATTR_DATA data_fan6_direction = {FAN6_DIRECTION, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_direction_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_direction); + +FAN_SYSFS_ATTR_DATA data_fan1_front_rpm = {FAN1_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_front_rpm); +FAN_SYSFS_ATTR_DATA data_fan2_front_rpm = {FAN2_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_front_rpm); +FAN_SYSFS_ATTR_DATA data_fan3_front_rpm = {FAN3_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_front_rpm); +FAN_SYSFS_ATTR_DATA data_fan4_front_rpm = {FAN4_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_front_rpm); +FAN_SYSFS_ATTR_DATA data_fan5_front_rpm = {FAN5_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_front_rpm); +FAN_SYSFS_ATTR_DATA data_fan6_front_rpm = {FAN6_FRONT_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_front_rpm); + +FAN_SYSFS_ATTR_DATA data_fan1_rear_rpm = {FAN1_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_rear_rpm); +FAN_SYSFS_ATTR_DATA data_fan2_rear_rpm = {FAN2_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_rear_rpm); +FAN_SYSFS_ATTR_DATA data_fan3_rear_rpm = {FAN3_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_rear_rpm); +FAN_SYSFS_ATTR_DATA data_fan4_rear_rpm = {FAN4_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_rear_rpm); +FAN_SYSFS_ATTR_DATA data_fan5_rear_rpm = {FAN5_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_rear_rpm); +FAN_SYSFS_ATTR_DATA data_fan6_rear_rpm = {FAN6_REAR_RPM, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_rpm_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_rear_rpm); + + +FAN_SYSFS_ATTR_DATA data_fan1_pwm = {FAN1_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_pwm); +FAN_SYSFS_ATTR_DATA data_fan2_pwm = {FAN2_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_pwm); +FAN_SYSFS_ATTR_DATA data_fan3_pwm = {FAN3_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_pwm); +FAN_SYSFS_ATTR_DATA data_fan4_pwm = {FAN4_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_pwm); +FAN_SYSFS_ATTR_DATA data_fan5_pwm = {FAN5_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_pwm); +FAN_SYSFS_ATTR_DATA data_fan6_pwm = {FAN6_PWM, S_IRUGO | S_IWUSR, fan_show_default, NULL, sonic_i2c_get_fan_pwm_default, NULL, fan_store_default, NULL, sonic_i2c_set_fan_pwm_default, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_pwm); + +FAN_SYSFS_ATTR_DATA data_fan1_fault = {FAN1_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan1_fault); +FAN_SYSFS_ATTR_DATA data_fan2_fault = {FAN2_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan2_fault); +FAN_SYSFS_ATTR_DATA data_fan3_fault = {FAN3_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan3_fault); +FAN_SYSFS_ATTR_DATA data_fan4_fault = {FAN4_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan4_fault); +FAN_SYSFS_ATTR_DATA data_fan5_fault = {FAN5_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan5_fault); +FAN_SYSFS_ATTR_DATA data_fan6_fault = {FAN6_FAULT, S_IRUGO, fan_show_default, NULL, sonic_i2c_get_fan_fault_default, NULL, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(data_fan6_fault); + +FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= +{ + { "fan1_present", &data_fan1_present}, + { "fan2_present", &data_fan2_present}, + { "fan3_present", &data_fan3_present}, + { "fan4_present", &data_fan4_present}, + { "fan5_present", &data_fan5_present}, + { "fan6_present", &data_fan6_present}, + { "fan1_direction", &data_fan1_direction}, + { "fan2_direction", &data_fan2_direction}, + { "fan3_direction", &data_fan3_direction}, + { "fan4_direction", &data_fan4_direction}, + { "fan5_direction", &data_fan5_direction}, + { "fan6_direction", &data_fan6_direction}, + { "fan1_front_rpm", &data_fan1_front_rpm}, + { "fan2_front_rpm", &data_fan2_front_rpm}, + { "fan3_front_rpm", &data_fan3_front_rpm}, + { "fan4_front_rpm", &data_fan4_front_rpm}, + { "fan5_front_rpm", &data_fan5_front_rpm}, + { "fan6_front_rpm", &data_fan6_front_rpm}, + { "fan1_rear_rpm", &data_fan1_rear_rpm}, + { "fan2_rear_rpm", &data_fan2_rear_rpm}, + { "fan3_rear_rpm", &data_fan3_rear_rpm}, + { "fan4_rear_rpm", &data_fan4_rear_rpm}, + { "fan5_rear_rpm", &data_fan5_rear_rpm}, + { "fan6_rear_rpm", &data_fan6_rear_rpm}, + { "fan1_pwm", &data_fan1_pwm}, + { "fan2_pwm", &data_fan2_pwm}, + { "fan3_pwm", &data_fan3_pwm}, + { "fan4_pwm", &data_fan4_pwm}, + { "fan5_pwm", &data_fan5_pwm}, + { "fan6_pwm", &data_fan6_pwm}, + { "fan1_fault", &data_fan1_fault}, + { "fan2_fault", &data_fan2_fault}, + { "fan3_fault", &data_fan3_fault}, + { "fan4_fault", &data_fan4_fault}, + { "fan5_fault", &data_fan5_fault}, + { "fan6_fault", &data_fan6_fault}, +}; + +void *get_fan_access_data(char *name) +{ + int i=0; + for(i=0; i<(sizeof(fan_sysfs_attr_data_tbl)/sizeof(fan_sysfs_attr_data_tbl[0])); i++) + { + if(strcmp(name, fan_sysfs_attr_data_tbl[i].name) ==0) + { + return &fan_sysfs_attr_data_tbl[i]; + } + } + return NULL; +} +EXPORT_SYMBOL(get_fan_access_data); + + + +static int pddf_fan_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct fan_data *data; + int status,i,num, j=0; + FAN_PDATA *fan_platform_data; + FAN_DATA_ATTR *data_attr; + FAN_SYSFS_ATTR_DATA_ENTRY *sysfs_data_entry; + char new_str[ATTR_NAME_LEN] = ""; + + if (client == NULL) { + printk("NULL Client.. \n"); + goto exit; + } + + if (pddf_fan_ops.pre_probe) + { + status = (pddf_fan_ops.pre_probe)(client, dev_id); + if (status != 0) + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + status = -EIO; + goto exit; + } + + /* Add support for a pre probe function */ + data = kzalloc(sizeof(struct fan_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + dev_info(&client->dev, "chip found\n"); + + + /*Take control of the platform data*/ + fan_platform_data = (FAN_PDATA *)(client->dev.platform_data); + num = fan_platform_data->len; + data->num_attr = num; + + for (i=0;ifan_attrs + i; + sysfs_data_entry = get_fan_access_data(data_attr->aname); + if (sysfs_data_entry == NULL) + { + printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); + continue; + } + + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, data_attr->aname); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->fan_attribute_list[i] = &dy_ptr->dev_attr.attr; + strcpy(data->attr_info[i].name, data_attr->aname); + data->attr_info[i].valid = 0; + mutex_init(&data->attr_info[i].update_lock); + + /*Create a duplicate entry*/ + get_fan_duplicate_sysfs(dy_ptr->index, new_str); + if (strcmp(new_str,"")) + { + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->fan_attribute_list[num+j] = &dy_ptr->dev_attr.attr; + j++; + strcpy(new_str, ""); + } + } + data->fan_attribute_list[i+j] = NULL; + data->fan_attribute_group.attrs = data->fan_attribute_list; + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &data->fan_attribute_group); + if (status) { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", + dev_name(data->hwmon_dev), client->name); + + /* Add a support for post probe function */ + if (pddf_fan_ops.post_probe) + { + status = (pddf_fan_ops.post_probe)(client, dev_id); + if (status != 0) + goto exit_remove; + } + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &data->fan_attribute_group); +exit_free: + /* Free all the allocated attributes */ + for (i=0; data->fan_attribute_list[i]!=NULL; i++) + { + struct sensor_device_attribute *ptr = (struct sensor_device_attribute *)data->fan_attribute_list[i]; + kfree(ptr); + } + pddf_dbg(FAN, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); + kfree(data); +exit: + return status; +} + +static int pddf_fan_remove(struct i2c_client *client) +{ + int i = 0, ret = 0; + struct sensor_device_attribute *ptr = NULL; + struct fan_data *data = i2c_get_clientdata(client); + FAN_PDATA *platdata = (FAN_PDATA *)client->dev.platform_data; + FAN_DATA_ATTR *platdata_sub = platdata->fan_attrs; + + if (pddf_fan_ops.pre_remove) + { + ret = (pddf_fan_ops.pre_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN pre_remove function failed\n"); + } + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &data->fan_attribute_group); + for (i=0; data->fan_attribute_list[i]!=NULL; i++) + { + ptr = (struct sensor_device_attribute *)data->fan_attribute_list[i]; + kfree(ptr); + } + pddf_dbg(FAN, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); + kfree(data); + + if (platdata_sub) { + printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } + + if (pddf_fan_ops.post_remove) + { + ret = (pddf_fan_ops.post_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN post_remove function failed\n"); + } + + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +static const struct i2c_device_id pddf_fan_id[] = { + { "fan_ctrl", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, pddf_fan_id); + +static struct i2c_driver pddf_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = pddf_fan_probe, + .remove = pddf_fan_remove, + .id_table = pddf_fan_id, + .address_list = normal_i2c, +}; + +static int __init pddf_fan_init(void) +{ + int status = 0; + + if (pddf_fan_ops.pre_init) + { + status = (pddf_fan_ops.pre_init)(); + if (status!=0) + return status; + } + + status = i2c_add_driver(&pddf_fan_driver); + if (status!=0) + return status; + + if (pddf_fan_ops.post_init) + { + status = (pddf_fan_ops.post_init)(); + if (status!=0) + return status; + } + return status; + +} + +static void __exit pddf_fan_exit(void) +{ + if (pddf_fan_ops.pre_exit) (pddf_fan_ops.pre_exit)(); + i2c_del_driver(&pddf_fan_driver); + if (pddf_fan_ops.post_exit) (pddf_fan_ops.post_exit)(); +} + +module_init(pddf_fan_init); +module_exit(pddf_fan_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("pddf_fan driver"); +MODULE_LICENSE("GPL"); + diff --git a/platform/pddf/i2c/modules/fan/pddf_fan_module.c b/platform/pddf/i2c/modules/fan/pddf_fan_module.c new file mode 100644 index 000000000000..213e32e8104e --- /dev/null +++ b/platform/pddf/i2c/modules/fan/pddf_fan_module.c @@ -0,0 +1,292 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create I2C client for FAN controller + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_fan_defs.h" + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern void *get_fan_access_data(char *); +extern void* get_device_table(char *name); +extern void delete_device_table(char *name); + +FAN_DATA fan_data = {0}; + + + +/* FAN CLIENT DATA */ +PDDF_DATA_ATTR(num_fan, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&fan_data.num_fan, NULL); + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&fan_data.fan_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devtype, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 8, (void*)&fan_data.fan_attr.devtype, NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&fan_data.fan_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&fan_data.fan_attr.mask, NULL); +PDDF_DATA_ATTR(attr_cmpval, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&fan_data.fan_attr.cmpval, NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&fan_data.fan_attr.len, NULL); +PDDF_DATA_ATTR(attr_mult, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&fan_data.fan_attr.mult, NULL); +PDDF_DATA_ATTR(attr_is_divisor, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UCHAR, sizeof(unsigned char), (void*)&fan_data.fan_attr.is_divisor, NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&fan_data, NULL); +PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&fan_data, (void*)&pddf_data); + + + +static struct attribute *fan_attributes[] = { + &attr_num_fan.dev_attr.attr, + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_mult.dev_attr.attr, + &attr_attr_is_divisor.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL +}; + +static const struct attribute_group pddf_fan_client_data_group = { + .attrs = fan_attributes, +}; + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); + FAN_SYSFS_ATTR_DATA_ENTRY *entry_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + fdata->fan_attrs[fdata->len] = fdata->fan_attr; + entry_ptr = get_fan_access_data(fdata->fan_attrs[fdata->len].aname); + if (entry_ptr != NULL && entry_ptr->a_ptr != NULL) + { + fdata->fan_attrs[fdata->len].access_data = entry_ptr->a_ptr ; + /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",fdata->fan_attrs[fdata->len].aname, fdata->fan_attrs[fdata->len].access_data);*/ + } + + fdata->len++; + memset(&fdata->fan_attr, 0, sizeof(fdata->fan_attr)); + + + return count; +} + +struct i2c_board_info *i2c_get_fan_board_info(FAN_DATA *fdata, NEW_DEV_ATTR *cdata) +{ + int num = fdata->len; + int i = 0; + static struct i2c_board_info board_info; + FAN_PDATA *fan_platform_data; + + if (strcmp(cdata->dev_type, "fan_ctrl")==0 || + strcmp(cdata->dev_type, "fan_eeprom")==0 ) + { + /* Allocate the fan_platform_data */ + fan_platform_data = (FAN_PDATA *)kzalloc(sizeof(FAN_PDATA), GFP_KERNEL); + fan_platform_data->fan_attrs = (FAN_DATA_ATTR *)kzalloc(num*sizeof(FAN_DATA_ATTR), GFP_KERNEL); + + + fan_platform_data->num_fan = fdata->num_fan; + fan_platform_data->len = fdata->len; + + for (i=0;ifan_attrs[i] = fdata->fan_attrs[i]; + } + + /* Verify that the data is written properly */ +#if 0 + pddf_dbg(FAN, KERN_ERR "\n\n########### fan_platform_data - start ##########\n"); + pddf_dbg(FAN, KERN_ERR "num_of_fans: %d\n", fan_platform_data->num_fan); + pddf_dbg(FAN, KERN_ERR "no_of_usr_attr: %d\n", fan_platform_data->len); + + for (i=0; ifan_attrs[i].aname); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_type: %s\n", fan_platform_data->fan_attrs[i].devtype); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_offset: 0x%x\n", fan_platform_data->fan_attrs[i].offset); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_mask: 0x%x\n", fan_platform_data->fan_attrs[i].mask); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", fan_platform_data->fan_attrs[i].cmpval); + pddf_dbg(FAN, KERN_ERR "usr_attr_len: %d\n", fan_platform_data->fan_attrs[i].len); + pddf_dbg(FAN, KERN_ERR "usr_attr_mult: %d\n", fan_platform_data->fan_attrs[i].mult); + pddf_dbg(FAN, KERN_ERR "usr_attr_is_divisor: %d\n", fan_platform_data->fan_attrs[i].is_divisor); + } + pddf_dbg(FAN, KERN_ERR "########### fan_platform_data - end ##########\n\n"); +#endif + + + board_info = (struct i2c_board_info) { + .platform_data = fan_platform_data, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); + } + + return &board_info; +} + + +/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = i2c_get_fan_board_info(fdata, cdata); + + /* Populate the platform data for fan */ + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if(client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(FAN, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(FAN, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; + +free_data: + if (board_info->platform_data) + { + FAN_PDATA *fan_platform_data = board_info->platform_data; + if (fan_platform_data->fan_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(fan_platform_data->fan_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(fan_platform_data); + } +clear_data: + memset(fdata, 0, sizeof(FAN_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; +} + + +static struct kobject *fan_kobj; +static struct kobject *i2c_kobj; + +int __init pddf_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(FAN, "PDDF FAN MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + fan_kobj = kobject_create_and_add("fan", device_kobj); + if(!fan_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", fan_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(i2c_kobj); + kobject_put(fan_kobj); + return ret; + } + pddf_dbg(FAN, "CREATED FAN I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(i2c_kobj, &pddf_fan_client_data_group); + if (ret) + { + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(fan_kobj); + return ret; + } + pddf_dbg(FAN, "CREATED PDDF FAN DATA SYSFS GROUP\n"); + + + + return ret; +} + +void __exit pddf_data_exit(void) +{ + pddf_dbg(FAN, "PDDF FAN MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_fan_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(fan_kobj); + pddf_dbg(FAN, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'fan'\n",__FUNCTION__); + return; +} + +module_init(pddf_data_init); +module_exit(pddf_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("fan platform data"); +MODULE_LICENSE("GPL"); + diff --git a/platform/pddf/i2c/modules/include/pddf_client_defs.h b/platform/pddf/i2c/modules/include/pddf_client_defs.h new file mode 100644 index 000000000000..c911bd414896 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_client_defs.h @@ -0,0 +1,126 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform I2C client defines/structures header file + */ + +#ifndef __PDDF_CLIENT_DEFS_H__ +#define __PDDF_CLIENT_DEFS_H__ + + +#include +#include +#include + +#define PSU "PDDF_PSU" +#define LED "PDDF_LED" +#define FAN "PDDF_FAN" +#define CLIENT "PDDF_CLIENT" +#define CPLD "PDDF_CPLD" +#define MUX "PDDF_MUX" +#define SYSSTATUS "PDDF_SYSSTATUS" +#define XCVR "PDDF_XCVR" + +#define PDDF_DEBUG +#ifdef PDDF_DEBUG +#define pddf_dbg(filter,...) printk("%s\t", filter); printk(KERN_CONT __VA_ARGS__) +#else +#define pddf_dbg(...) +#endif + + +/*#define MAX_NUM_PSU 5*/ +/*#define MAX_PSU_ATTRS 20*/ +#define GEN_NAME_SIZE 32 +#define ERR_STR_SIZE 128 + + +typedef struct pddf_data_attribute{ + struct device_attribute dev_attr; + int type; + int len; + char *addr; + char *data; +}PDDF_ATTR; + +#define PDDF_DATA_ATTR(_name, _mode, _show, _store, _type, _len, _addr, _data) \ + struct pddf_data_attribute attr_##_name = { .dev_attr = __ATTR(_name, _mode, _show, _store), \ + .type = _type , \ + .len = _len , \ + .addr = _addr, \ + .data = _data } + + +enum attribute_data_type { + PDDF_CHAR, + PDDF_UCHAR, + PDDF_INT_HEX, // integer represented in HEX + PDDF_INT_DEC, // integer represented in DECIMAL + PDDF_USHORT, // HEX + PDDF_UINT32 // HEX +}; + + + + + +// PSU Specific details + +typedef struct NEW_DEV_ATTR +{ + char i2c_type[GEN_NAME_SIZE]; + char i2c_name[GEN_NAME_SIZE]; + int parent_bus; + char dev_type[GEN_NAME_SIZE]; + int dev_addr; + char *data; + int error; + char errstr[ERR_STR_SIZE]; + +}NEW_DEV_ATTR; +extern NEW_DEV_ATTR pddf_data; + +extern struct attribute_group pddf_clients_data_group; +extern ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, char *buf); +struct kobject* get_device_i2c_kobj(void); +void set_attr_data(void * ptr); +void set_error_code(int, char *); +ssize_t show_error_code(struct device *dev, struct device_attribute *da, char *buf); +ssize_t show_all_devices(struct device *dev, struct device_attribute *da, char *buf); +void traverse_device_table(void ); + + + +/*Various Ops hook which can be used by vendors to provide some deviation from usual pddf functionality*/ +struct pddf_ops_t +{ + /*Module init ops*/ + int (*pre_init)(void); + int (*post_init)(void); + /*probe ops*/ + int (*pre_probe)(struct i2c_client *, const struct i2c_device_id *); + int (*post_probe)(struct i2c_client *, const struct i2c_device_id *); + /*remove ops*/ + int (*pre_remove)(struct i2c_client *); + int (*post_remove)(struct i2c_client *); + /*Module exit ops*/ + void (*pre_exit)(void); + void (*post_exit)(void); +}; + + +typedef struct PDEVICE +{ + struct hlist_node node; + char name[GEN_NAME_SIZE]; + char *data; + +}PDEVICE; + +void add_device_table(char *name, void *ptr); + + +#endif //__PDDF_CLIENT_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h new file mode 100644 index 000000000000..58575763f964 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h @@ -0,0 +1,18 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform CPLD defines/structures header file + */ + +#ifndef __PDDF_CPLD_DEFS_H__ +#define __PDDF_CPLD_DEFS_H__ + +/**//* CPLD CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ +/*typedef struct CPLD_DATA*/ +/*{*/ +/*int virt_bus;*/ +/*}CPLD_DATA;*/ + +#endif //__PDDF_CPLD_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_api.h b/platform/pddf/i2c/modules/include/pddf_fan_api.h new file mode 100644 index 000000000000..5dc0c3d53bf3 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_fan_api.h @@ -0,0 +1,26 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * FAN driver api declarations + */ + +#ifndef __PDDF_FAN_API_H__ +#define __PDDF_FAN_API_H__ + +extern int pddf_fan_post_probe_default(struct i2c_client *client, const struct i2c_device_id *dev_id); + +extern void get_fan_duplicate_sysfs(int idx, char *str); +extern ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t fan_store_default(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + + +extern int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_fan_rpm_default(void *client, FAN_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_fan_direction_default(void *client, FAN_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_fan_pwm_default(void *client, FAN_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_fan_fault_default(void *client, FAN_DATA_ATTR *adata, void *data); +extern int sonic_i2c_set_fan_pwm_default(void *client, FAN_DATA_ATTR *adata, void *data); + +#endif //__PDDF_FAN_API_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_defs.h b/platform/pddf/i2c/modules/include/pddf_fan_defs.h new file mode 100644 index 000000000000..49c31af748c1 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_fan_defs.h @@ -0,0 +1,78 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform FAN defines/structures header file + */ + +#ifndef __PDDF_FAN_DEFS_H__ +#define __PDDF_FAN_DEFS_H__ + + +#define MAX_NUM_FAN 6 +#define MAX_FAN_ATTRS 128 +#define ATTR_NAME_LEN 32 +#define STR_ATTR_SIZE 32 +#define DEV_TYPE_LEN 32 + +/* Each client has this additional data + */ + +typedef struct FAN_DATA_ATTR +{ + char aname[ATTR_NAME_LEN]; // attr name, taken from enum fan_sysfs_attributes + char devtype[DEV_TYPE_LEN]; // Type of FAN controller, i.e EMC2305, EMC2302, or FAN-CPLD etc + uint32_t offset; + uint32_t mask; + uint32_t cmpval; + uint32_t len; + int mult; // Multiplication factor to get the actual data + uint8_t is_divisor; // Check if the value is a divisor and mult is dividend + void *access_data; + +}FAN_DATA_ATTR; + + +typedef struct FAN_SYSFS_ATTR_DATA +{ + int index; + unsigned short mode; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*do_get)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*post_get)(void *client, FAN_DATA_ATTR *adata, void *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*do_set)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*post_set)(void *client, FAN_DATA_ATTR *adata, void *data); + void *data; +} FAN_SYSFS_ATTR_DATA; + +typedef struct FAN_SYSFS_ATTR_DATA_ENTRY +{ + char name[ATTR_NAME_LEN]; + FAN_SYSFS_ATTR_DATA *a_ptr; +} FAN_SYSFS_ATTR_DATA_ENTRY; + + +/* FAN CLIENT DATA - PLATFORM DATA FOR FAN CLIENT */ +typedef struct FAN_DATA +{ + int num_fan; // num of fans controlled by this fan client + FAN_DATA_ATTR fan_attr; + int len; // no of valid attributes for this fan client + FAN_DATA_ATTR fan_attrs[MAX_FAN_ATTRS]; +}FAN_DATA; + +typedef struct FAN_PDATA +{ + int num_fan; // num of fans controlled by this fan client + int len; // no of valid attributes for this fan client + FAN_DATA_ATTR *fan_attrs; +}FAN_PDATA; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +#endif //__PDDF_FAN_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_driver.h b/platform/pddf/i2c/modules/include/pddf_fan_driver.h new file mode 100644 index 000000000000..5041660ef028 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_fan_driver.h @@ -0,0 +1,72 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * FAN driver related data structures + */ +#ifndef __PDDF_FAN_DRIVER_H__ +#define __PDDF_FAN_DRIVER_H__ + +enum fan_sysfs_attributes { + FAN1_PRESENT, + FAN2_PRESENT, + FAN3_PRESENT, + FAN4_PRESENT, + FAN5_PRESENT, + FAN6_PRESENT, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, + FAN1_FRONT_RPM, + FAN2_FRONT_RPM, + FAN3_FRONT_RPM, + FAN4_FRONT_RPM, + FAN5_FRONT_RPM, + FAN6_FRONT_RPM, + FAN1_REAR_RPM, + FAN2_REAR_RPM, + FAN3_REAR_RPM, + FAN4_REAR_RPM, + FAN5_REAR_RPM, + FAN6_REAR_RPM, + FAN1_PWM, + FAN2_PWM, + FAN3_PWM, + FAN4_PWM, + FAN5_PWM, + FAN6_PWM, + FAN1_FAULT, + FAN2_FAULT, + FAN3_FAULT, + FAN4_FAULT, + FAN5_FAULT, + FAN6_FAULT, + FAN_MAX_ATTR +}; +/* Each client has this additional data */ +struct fan_attr_info { + char name[ATTR_NAME_LEN]; + struct mutex update_lock; + char valid; /* != 0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + union { + char strval[STR_ATTR_SIZE]; + int intval; + u16 shortval; + u8 charval; + }val; +}; + +struct fan_data { + struct device *hwmon_dev; + int num_attr; + struct attribute *fan_attribute_list[MAX_FAN_ATTRS]; + struct attribute_group fan_attribute_group; + struct fan_attr_info attr_info[MAX_FAN_ATTRS]; +}; + +#endif //__PDDF_FAN_DRIVER_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_led_defs.h b/platform/pddf/i2c/modules/include/pddf_led_defs.h new file mode 100644 index 000000000000..2197ecde4628 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_led_defs.h @@ -0,0 +1,96 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * Platform LED related defines and structures + */ + + +/***************************************** + * kobj list + *****************************************/ + +struct kobject *platform_kobj=NULL; +struct kobject *led_kobj=NULL; + +struct kobject *blink_kobj=NULL; +struct kobject *on_kobj=NULL; +struct kobject *off_kobj=NULL; +struct kobject *faulty_kobj=NULL; +struct kobject *cur_state_kobj=NULL; + +/***************************************** + * Static Data provided from user + * space JSON data file + *****************************************/ +#define NAME_SIZE 32 +typedef enum { + ON, + OFF, + FAULTY, + BLINK, + MAX_LED_STATUS +}LED_STATUS; +typedef struct +{ + char bits[NAME_SIZE]; + int pos; + int mask_bits; +}MASK_BITS; + +typedef struct +{ + int swpld_addr; + int swpld_addr_offset; + char color[NAME_SIZE]; + MASK_BITS bits; + unsigned short value; +} LED_DATA; + +typedef struct +{ + int state; + char color[NAME_SIZE]; + char color_state[NAME_SIZE]; //BLINK or SOLID +} CUR_STATE_DATA; + +typedef struct +{ + CUR_STATE_DATA cur_state; + char device_name[NAME_SIZE]; + int index; + LED_DATA data[MAX_LED_STATUS]; + bool blink; + int swpld_addr; + int swpld_addr_offset; +} LED_OPS_DATA; + +typedef enum{ + LED_SYS, + LED_PSU, + LED_FAN, + LED_FANTRAY, + LED_DIAG, + LED_LOC, + LED_TYPE_MAX +} LED_TYPE; +char* LED_TYPE_STR[LED_TYPE_MAX] = +{ + "LED_SYS", + "LED_PSU", + "LED_FAN", + "LED_FANTRAY", + "LED_DIAG", + "LED_LOC", +}; + +/***************************************** + * Data exported from kernel for + * user space plugin to get/set + *****************************************/ +#define PDDF_LED_DATA_ATTR( _prefix, _name, _mode, _show, _store, _type, _len, _addr) \ + struct pddf_data_attribute pddf_dev_##_prefix##_attr_##_name = { .dev_attr = __ATTR(_name, _mode, _show, _store), \ + .type = _type , \ + .len = _len , \ + .addr = _addr } diff --git a/platform/pddf/i2c/modules/include/pddf_mux_defs.h b/platform/pddf/i2c/modules/include/pddf_mux_defs.h new file mode 100644 index 000000000000..3bae83552eca --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_mux_defs.h @@ -0,0 +1,18 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform MUX defines/structures header file + */ + +#ifndef __PAL_MUX_DEFS_H__ +#define __PAL_MUX_DEFS_H__ + +/* MUX CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ +typedef struct MUX_DATA +{ + int virt_bus; // Virtual base bus number of the mux channels +}MUX_DATA; + +#endif //__PAL_MUX_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_api.h b/platform/pddf/i2c/modules/include/pddf_psu_api.h new file mode 100644 index 000000000000..0519f6f7d2bd --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_psu_api.h @@ -0,0 +1,27 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * PSU driver related api declarations + */ + +#ifndef __PDDF_PSU_API_H__ +#define __PDDF_PSU_API_H__ + +extern void get_psu_duplicate_sysfs(int idx, char *str); +extern ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t psu_store_default(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +extern int sonic_i2c_get_psu_present_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_power_good_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_model_name_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_mfr_id_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_serial_num_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_fan_dir_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_v_out_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_i_out_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_p_out_default(void *client, PSU_DATA_ATTR *adata, void *data); +extern int sonic_i2c_get_psu_fan1_speed_rpm_default(void *client, PSU_DATA_ATTR *adata, void *data); + +#endif //__PDDF_PSU_API_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_defs.h b/platform/pddf/i2c/modules/include/pddf_psu_defs.h new file mode 100644 index 000000000000..83d6be03437a --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_psu_defs.h @@ -0,0 +1,78 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform PSU defines/structures header file + */ + +#ifndef __PDDF_PSU_DEFS_H__ +#define __PDDF_PSU_DEFS_H__ + + +#define MAX_NUM_PSU 5 +#define MAX_PSU_ATTRS 32 +#define ATTR_NAME_LEN 32 +#define STR_ATTR_SIZE 32 +#define DEV_TYPE_LEN 32 + +/* Each client has this additional data + */ + +typedef struct PSU_DATA_ATTR +{ + char aname[ATTR_NAME_LEN]; // attr name, taken from enum psu_sysfs_attributes + char devtype[DEV_TYPE_LEN]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute + uint32_t devaddr; + uint32_t offset; + uint32_t mask; + uint32_t cmpval; + uint32_t len; + void *access_data; + +}PSU_DATA_ATTR; + +typedef struct PSU_SYSFS_ATTR_DATA +{ + int index; + unsigned short mode; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*do_get)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*post_get)(void *client, PSU_DATA_ATTR *adata, void *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*do_set)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*post_set)(void *client, PSU_DATA_ATTR *adata, void *data); + void *data; +} PSU_SYSFS_ATTR_DATA; + +typedef struct PSU_SYSFS_ATTR_DATA_ENTRY +{ + char name[ATTR_NAME_LEN]; + PSU_SYSFS_ATTR_DATA *a_ptr; +} PSU_SYSFS_ATTR_DATA_ENTRY; + + +/* PSU CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ +typedef struct PSU_DATA +{ + int idx; // psu index + int num_psu_fans; + PSU_DATA_ATTR psu_attr; + int len; // no of valid attributes for this psu client + PSU_DATA_ATTR psu_attrs[MAX_PSU_ATTRS]; +}PSU_DATA; + +typedef struct PSU_PDATA +{ + int idx; // psu index + int num_psu_fans; // num of fans supported by the PSU + int len; // no of valid attributes for this psu client + PSU_DATA_ATTR *psu_attrs; +}PSU_PDATA; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +#endif //__PDDF_PSU_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_driver.h b/platform/pddf/i2c/modules/include/pddf_psu_driver.h new file mode 100644 index 000000000000..11baab4d1825 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_psu_driver.h @@ -0,0 +1,52 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * PSU driver data structures + */ +#ifndef __PDDF_PSU_DRIVER_H__ +#define __PDDF_PSU_DRIVER_H__ + +enum psu_sysfs_attributes { + PSU_PRESENT, + PSU_MODEL_NAME, + PSU_POWER_GOOD, + PSU_MFR_ID, + PSU_SERIAL_NUM, + PSU_FAN_DIR, + PSU_V_OUT, + PSU_I_OUT, + PSU_P_OUT, /* This is in micro watts to comply with lm-sensors */ + PSU_FAN1_SPEED, + PSU_TEMP1_INPUT, + PSU_ATTR_MAX +}; + + +/* Every client has psu_data which is divided into per attribute data */ +struct psu_attr_info { + char name[ATTR_NAME_LEN]; + struct mutex update_lock; + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + u8 status; + union { + char strval[STR_ATTR_SIZE]; + int intval; + u16 shortval; + u8 charval; + }val; +}; +struct psu_data { + struct device *hwmon_dev; + u8 index; + int num_psu_fans; + int num_attr; + struct attribute *psu_attribute_list[MAX_PSU_ATTRS]; + struct attribute_group psu_attribute_group; + struct psu_attr_info attr_info[MAX_PSU_ATTRS]; +}; + + +#endif //__PDDF_PSU_DRIVER_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h new file mode 100644 index 000000000000..1cbb80ffc1eb --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h @@ -0,0 +1,40 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * Platform system status module structures + */ + +#ifndef __PDDF_SYSSTATUS_DEFS_H__ +#define __PDDF_SYSSTATUS_DEFS_H__ + + +#define ATTR_NAME_LEN 32 +#define MAX_ATTRS 32 + + +/* SYSSTATUS CLIENT DATA - PLATFORM DATA FOR SYSSTATUS CLIENT */ +typedef struct SYSSTATUS_ADDR_ATTR +{ + char aname[ATTR_NAME_LEN]; // attr name + uint32_t devaddr; + uint32_t offset; + uint32_t mask; + uint32_t len; + +}SYSSTATUS_ADDR_ATTR; + + +typedef struct SYSSTATUS_DATA +{ + int len; + SYSSTATUS_ADDR_ATTR sysstatus_addr_attr; + SYSSTATUS_ADDR_ATTR sysstatus_addr_attrs[MAX_ATTRS]; + +}SYSSTATUS_DATA; + + + + +#endif //__PDDF_SYSSTATUS_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_api.h b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h new file mode 100644 index 000000000000..5701b4188f0d --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h @@ -0,0 +1,33 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description + * Optics driver related api declarations + */ +#ifndef __PDDF_XCVR_API_H__ +#define __PDDF_XCVR_API_H__ + +extern int sonic_i2c_get_mod_pres(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_intr_status(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_rxlos(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_get_mod_txfault(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_set_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_set_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); +extern int sonic_i2c_set_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data); + +extern ssize_t get_module_presence(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t get_module_reset(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t set_module_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern ssize_t get_module_intr_status(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t get_module_lpmode(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t set_module_lpmode(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern ssize_t get_module_rxlos(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t set_module_txdisable(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, char *buf); + +#endif //__PDDF_XCVR_API_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h new file mode 100644 index 000000000000..d04f95276460 --- /dev/null +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h @@ -0,0 +1,110 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description: + * Platform SFP defines/structures header file + */ + +#ifndef __PDDF_XCVR_DEFS_H__ +#define __PDDF_XCVR_DEFS_H__ + + +#define MAX_NUM_XCVR 5 +#define MAX_XCVR_ATTRS 20 + + +typedef struct XCVR_ATTR +{ + char aname[32]; // attr name, taken from enum xcvr_sysfs_attributes + char devtype[32]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute + uint32_t devaddr; + uint32_t offset; + uint32_t mask; + uint32_t cmpval; + uint32_t len; + + int (*pre_access)(void *client, void *data); + int (*do_access)(void *client, void *data); + int (*post_access)(void *client, void *data); + +}XCVR_ATTR; + +/* XCVR CLIENT DATA - PLATFORM DATA FOR XCVR CLIENT */ +typedef struct XCVR_DATA +{ + int idx; // xcvr index + XCVR_ATTR xcvr_attr; + int len; // no of valid attributes for this xcvr client + XCVR_ATTR xcvr_attrs[MAX_XCVR_ATTRS]; +}XCVR_DATA; + +typedef struct XCVR_PDATA +{ + int idx; // xcvr index + unsigned short addr; // i2c address of the device + int len; // no of valid attributes for this xcvr client + XCVR_ATTR *xcvr_attrs; +}XCVR_PDATA; + + +#define BIT_INDEX(i) (1ULL << (i)) + +/* List of valid port types */ +typedef enum xcvr_port_type_e { + PDDF_PORT_TYPE_INVALID, + PDDF_PORT_TYPE_NOT_PRESENT, + PDDF_PORT_TYPE_SFP, + PDDF_PORT_TYPE_SFP_PLUS, + PDDF_PORT_TYPE_QSFP, + PDDF_PORT_TYPE_QSFP_PLUS, + PDDF_PORT_TYPE_QSFP28 +} xcvr_port_type_t; + +/*static int data_parsing_complete = 0;*/ +/* Each client has this additional data + */ +struct xcvr_data { + struct device *xdev; + struct mutex update_lock; + char valid; /* !=0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + int index; /* port index */ + xcvr_port_type_t port_type; + uint32_t modpres; + uint32_t reset; + uint32_t intr_status; + uint32_t lpmode; + uint32_t rxlos; + uint32_t txdisable; + uint32_t txfault; +}; + +typedef struct XCVR_SYSFS_ATTR_OPS +{ + int index; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*do_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*post_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*do_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*post_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); +} XCVR_SYSFS_ATTR_OPS; + +enum xcvr_sysfs_attributes { + XCVR_PRESENT, + XCVR_RESET, + XCVR_INTR_STATUS, + XCVR_LPMODE, + XCVR_RXLOS, + XCVR_TXDISABLE, + XCVR_TXFAULT, + XCVR_ATTR_MAX +}; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +#endif //__PDDF_XCVR_DEFS_H__ diff --git a/platform/pddf/i2c/modules/led/Makefile b/platform/pddf/i2c/modules/led/Makefile new file mode 100644 index 000000000000..58a2229ad61b --- /dev/null +++ b/platform/pddf/i2c/modules/led/Makefile @@ -0,0 +1,5 @@ +TARGET := pddf_led_module +obj-m := $(TARGET).o +#GCOV_PROFILE := y + +CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/led/pddf_led_module.c b/platform/pddf/i2c/modules/led/pddf_led_module.c new file mode 100644 index 000000000000..f89f9b30e899 --- /dev/null +++ b/platform/pddf/i2c/modules/led/pddf_led_module.c @@ -0,0 +1,679 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to manage various LEDs of a switch + */ + +#include +#include +#include +#include +#include +#include +#include "pddf_led_defs.h" +#include "pddf_client_defs.h" +#include +#include +#include + +#define DEBUG 1 +LED_OPS_DATA sys_led_ops_data[1]={0}; +LED_OPS_DATA* psu_led_ops_data=NULL; +LED_OPS_DATA diag_led_ops_data[1]= {0}; +LED_OPS_DATA fan_led_ops_data[1]= {0}; +LED_OPS_DATA loc_led_ops_data[1]= {0}; +LED_OPS_DATA* fantray_led_ops_data=NULL; +LED_OPS_DATA temp_data={0}; +LED_OPS_DATA* dev_list[LED_TYPE_MAX] = { + sys_led_ops_data, + NULL, + fan_led_ops_data, + NULL, + diag_led_ops_data, + loc_led_ops_data, + NULL +}; +int num_psus = 0; +int num_fans = 0; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); +extern ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, char *buf); +extern ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +static LED_TYPE get_dev_type(char* name) +{ + LED_TYPE ret = LED_TYPE_MAX; + if(strcasecmp(name, "SYS_LED")==0) { + ret = LED_SYS; + } else if(strcasecmp(name, "FAN_LED")==0) { + ret = LED_FAN; + } else if(strstr(name, "PSU_LED")) { + ret = LED_PSU; + } else if(strcasecmp(name, "DIAG_LED")==0) { + ret = LED_DIAG; + } else if(strcasecmp(name, "LOC_LED")==0) { + ret = LED_LOC; + } else if(strstr(name, "FANTRAY_LED")) { + ret = LED_FANTRAY; + } +#if DEBUG > 1 + pddf_dbg(LED, KERN_INFO "LED get_dev_type: %s; %d\n", name, ret); +#endif + return (ret); +} +static int dev_index_check(LED_TYPE type, int index) +{ +#if DEBUG + pddf_dbg(LED, "dev_index_check: type:%s index:%d num_psus:%d num_fans:%d\n", + LED_TYPE_STR[type], index, num_psus, num_fans); +#endif + switch(type) + { + case LED_PSU: + if(index >= num_psus) return (-1); + break; + case LED_FANTRAY: + if(index >= num_fans) return (-1); + break; + default: + if(index >= 1) return (-1); + break; + } + return (0); +} + +static LED_OPS_DATA* find_led_ops_data(struct device_attribute *da) +{ + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; + LED_TYPE led_type; + if(!ptr || strlen(ptr->device_name)==0 ) return(NULL); + + + if((led_type=get_dev_type(ptr->device_name))==LED_TYPE_MAX) { + printk(KERN_ERR "PDDF_LED ERROR *%s Unsupported Led Type\n", __func__); + return(NULL); + } + if(dev_index_check(led_type, ptr->index)==-1) { + printk(KERN_ERR "PDDF_LED ERROR %s invalid index: %d for type:%s\n", __func__, ptr->index, ptr->device_name); + return(NULL); + } +#if DEBUG + pddf_dbg(LED, "find_led_ops_data: name:%s; index=%d tempAddr:%p actualAddr:%p\n", + ptr->device_name, ptr->index, ptr, dev_list[led_type]+ptr->index); +#endif + return (dev_list[led_type]+ptr->index); +} + +static void print_led_data(LED_OPS_DATA *ptr) +{ + if(!ptr) return ; + pddf_dbg(LED, KERN_INFO "Print %s index:%d num_psus:%d num_fans:%d ADDR=%p\n", + ptr->device_name, ptr->index, num_psus, num_fans, ptr); + pddf_dbg(LED, KERN_INFO "\tindex: %d\n", ptr->index); + pddf_dbg(LED, KERN_INFO "\tcur_state: %d; %s; %s\n", ptr->cur_state.state, ptr->cur_state.color, ptr->cur_state.color_state); + if(ptr->data[ON].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[ON]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[ON].swpld_addr, ptr->data[ON].swpld_addr_offset, + ptr->data[ON].color, ptr->data[ON].value, ptr->data[ON].bits.mask_bits, ptr->data[ON].bits.pos); + } + + if(ptr->data[OFF].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[OFF]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[OFF].swpld_addr, ptr->data[OFF].swpld_addr_offset, + ptr->data[OFF].color, ptr->data[OFF].value, ptr->data[OFF].bits.mask_bits, ptr->data[OFF].bits.pos); + } + + if(ptr->data[FAULTY].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[FAULTY]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[FAULTY].swpld_addr, ptr->data[FAULTY].swpld_addr_offset, + ptr->data[FAULTY].color, ptr->data[FAULTY].value, ptr->data[FAULTY].bits.mask_bits, ptr->data[FAULTY].bits.pos); + } + + if(ptr->data[BLINK].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[BLINK]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[BLINK].swpld_addr, ptr->data[BLINK].swpld_addr_offset, + ptr->data[BLINK].color, ptr->data[BLINK].value, ptr->data[BLINK].bits.mask_bits, ptr->data[BLINK].bits.pos); + } +} + +ssize_t get_status_led(struct device_attribute *da) +{ + int ret=0; + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + uint32_t color_val=0, sys_val=0; + int state=0; + if (!ops_ptr) { + printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); + return (-1); + } + if (ops_ptr->swpld_addr == 0x0) { + printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", __func__, + temp_data_ptr->device_name, temp_data_ptr->index); + return (-1); + } + sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); + if (sys_val < 0) + return sys_val; + + strcpy(temp_data.cur_state.color_state, "None"); + strcpy(temp_data.cur_state.color, "None"); + for (state=0; statedata[state].bits.mask_bits); + if ((color_val ^ (ops_ptr->data[state].value<data[state].bits.pos))==0) { + if(state == BLINK) + strcpy(temp_data.cur_state.color_state,"Blink"); + else { + strcpy(temp_data.cur_state.color, ops_ptr->data[state].color); + if(strcasecmp(ops_ptr->data[state].color, "off")==0) { + strcpy(temp_data.cur_state.color_state, ""); + } else { + strcpy(temp_data.cur_state.color_state, "Solid"); + } + } + } + } +#if DEBUG + pddf_dbg(LED, KERN_ERR "Get : %s:%d addr/offset:0x%x; 0x%x value=0x%x [%s:%s]\n", + ops_ptr->device_name, ops_ptr->index, + ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, sys_val, + temp_data.cur_state.color, temp_data.cur_state.color_state); +#endif + return(ret); +} + +ssize_t set_status_led(struct device_attribute *da) +{ + int ret=0; + uint32_t sys_val=0, new_val=0; + int cur_state = 0; + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + char* _buf=temp_data_ptr->cur_state.color; + int blink=0; + + if (!ops_ptr) { + printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); + return (-1); + } + if (ops_ptr->swpld_addr == 0x0) { + printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", + __func__, ops_ptr->device_name, ops_ptr->index); + return (-1); + } +#if DEBUG + pddf_dbg(LED, KERN_ERR "%s: Set [%s;%d] color[%s;%s]\n", __func__, + temp_data_ptr->device_name, temp_data_ptr->index, + temp_data_ptr->cur_state.color, temp_data_ptr->cur_state.color_state); +#endif + if(strcasecmp(_buf, "on")==0) { + cur_state = ON; + } else if(strcasecmp(_buf, "off")==0) { + cur_state=OFF; + } else if(strcasecmp(_buf, "faulty")==0) { + cur_state=FAULTY; + } else { + printk(KERN_ERR "PDDF_LED ERROR %s: not supported: %s\n", _buf, __func__); + return (-1); + } + if(ops_ptr->data[cur_state].swpld_addr != 0x0) { + sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); + if (sys_val < 0) + return sys_val; + + new_val = (sys_val & ops_ptr->data[cur_state].bits.mask_bits) | + (ops_ptr->data[cur_state].value << ops_ptr->data[cur_state].bits.pos); + + if(strcasecmp(temp_data_ptr->cur_state.color_state, "blink")==0) { + if (ops_ptr->data[BLINK].swpld_addr != 0x0) { + new_val = (new_val & ops_ptr->data[BLINK].bits.mask_bits) | + (ops_ptr->data[BLINK].value << ops_ptr->data[BLINK].bits.pos); + blink=1; + } else { + printk(KERN_ERR "PDDF_LED ERROR %s: %s %d BLINK is not supported\n",__func__, + ops_ptr->device_name, ops_ptr->index); + return (-1); + } + } + } else { + printk(KERN_ERR "PDDF_LED ERROR %s: %s %d state %d; %s not configured\n",__func__, + ops_ptr->device_name, ops_ptr->index, cur_state, _buf); + return (-1); + } + + board_i2c_cpld_write(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, new_val); +#if DEBUG + pddf_dbg(LED, "Set state:%s;%s;%s 0x%x:0x%x sys_val:0x%x new_val:0x%x read:0x%x\n", + LED_TYPE_STR[cur_state], ops_ptr->data[cur_state].color, blink? "Blink":"Solid", + ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, + sys_val, new_val, + ret = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset)); + if (ret < 0) + { + printk(KERN_ERR "PDDF_LED ERROR %s: Error %d in reading from cpld(0x%x) offset 0x%x\n", __FUNCTION__, ret, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); + return ret; + } +#endif + return(ret); +} + + +ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, + char *buf) +{ + int ret = 0; + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + switch(ptr->type) + { + case PDDF_CHAR: + ret = sprintf(buf, "%s\n", ptr->addr); + break; + case PDDF_INT_DEC: + ret = sprintf(buf, "%d\n", *(int*)(ptr->addr)); + break; + case PDDF_INT_HEX: + ret = sprintf(buf, "0x%x\n", *(int*)(ptr->addr)); + break; + case PDDF_USHORT: + ret = sprintf(buf, "0x%x\n", *(unsigned short *)(ptr->addr)); + break; + case PDDF_UINT32: + ret = sprintf(buf, "0x%x\n", *(uint32_t *)(ptr->addr)); + break; + default: + break; + } +#if DEBUG + pddf_dbg(LED, "[ READ ] DATA ATTR PTR [%s] TYPE:%d, Value:[%s]\n", + ptr->dev_attr.attr.name, ptr->type, buf); +#endif + return ret; +} + +ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + int ret = 0, num = 0; + //pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf); + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + switch(ptr->type) + { + case PDDF_CHAR: + strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf + ptr->addr[strlen(buf)-1] = '\0'; +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_CHAR VALUE:%s\n", + ptr->dev_attr.attr.name, ptr->addr); +#endif + break; + case PDDF_INT_DEC: + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(int *)(ptr->addr) = num; +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_DEC VALUE:%d\n", + ptr->dev_attr.attr.name, *(int *)(ptr->addr)); +#endif + break; + case PDDF_INT_HEX: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(int *)(ptr->addr) = num; +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_HEX VALUE:0x%x\n", + ptr->dev_attr.attr.name, *(int *)(ptr->addr)); +#endif + break; + case PDDF_USHORT: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(unsigned short *)(ptr->addr) = (unsigned short)num; +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_USHORT VALUE:%x\n", + ptr->dev_attr.attr.name, *(unsigned short *)(ptr->addr)); +#endif + break; + case PDDF_UINT32: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(uint32_t *)(ptr->addr) = (uint32_t)num; +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_UINT32 VALUE:%d\n", + ptr->dev_attr.attr.name, *(uint32_t *)(ptr->addr)); +#endif + break; + default: + break; + } + return count; +} + +static int load_led_ops_data(struct device_attribute *da, LED_STATUS state) +{ + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; + LED_TYPE led_type; + LED_OPS_DATA* ops_ptr=NULL; + if(!ptr || strlen(ptr->device_name)==0 ) return(-1); +#if DEBUG + if(ptr->device_name) pddf_dbg(LED, "SYSTEM_LED: load_led_ops_data: name:%s; index=%d ADDR=%p\n", + ptr->device_name, ptr->index, ptr); +#endif + if((led_type=get_dev_type(ptr->device_name))==LED_TYPE_MAX) { + printk(KERN_ERR "PDDF_LED ERROR *%s Unsupported Led Type\n", __func__); + return(-1); + } + if(dev_index_check(led_type, ptr->index)==-1) { + printk(KERN_ERR "PDDF_LED ERROR %s invalid index: %d for type:%d\n", __func__, ptr->index, led_type); + return(-1); + } + ops_ptr = dev_list[led_type]+ptr->index; + + memcpy(ops_ptr->device_name, ptr->device_name, sizeof(ops_ptr->device_name)); + ops_ptr->index = ptr->index; + memcpy(&ops_ptr->data[state], &ptr->data[state], sizeof(LED_DATA)); + ops_ptr->data[state].swpld_addr = ptr->swpld_addr; + ops_ptr->data[state].swpld_addr_offset = ptr->swpld_addr_offset; + ops_ptr->swpld_addr = ptr->swpld_addr; + ops_ptr->swpld_addr_offset = ptr->swpld_addr_offset; +#if DEBUG + print_led_data(ptr); + print_led_data(dev_list[led_type]+ptr->index); +#endif + memset(ptr, 0, sizeof(LED_OPS_DATA)); + return (0); +} + +static int show_led_ops_data(struct device_attribute *da) +{ + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + print_led_data(ops_ptr); + return(0); +} + +static int verify_led_ops_data(struct device_attribute *da) +{ + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + + if(ops_ptr) + memcpy(ptr, ops_ptr, sizeof(LED_OPS_DATA)); + else + pddf_dbg(LED, "SYSTEM_LED: verify_led_ops_data: Failed to find ops_ptr name:%s; index=%d\n", ptr->device_name, ptr->index); + return (0); +} + +ssize_t dev_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + if(strncmp(buf, "create_on", strlen("create_on"))==0 ) { + load_led_ops_data(da, ON); + } + else if(strncmp(buf, "create_off", strlen("create_off"))==0 ) { + load_led_ops_data(da, OFF); + } + else if(strncmp(buf, "create_faulty", strlen("create_faulty"))==0 ) { + load_led_ops_data(da, FAULTY); + } + else if(strncmp(buf, "create_blink", strlen("create_blink"))==0 ) { + load_led_ops_data(da, BLINK); + } + else if(strncmp(buf, "show", strlen("show"))==0 ) { + show_led_ops_data(da); + } + else if(strncmp(buf, "verify", strlen("verify"))==0 ) { + verify_led_ops_data(da); + } + else if(strncmp(buf, "get_status", strlen("get_status"))==0 ) { + get_status_led(da); + } + else if(strncmp(buf, "set_status", strlen("set_status"))==0 ) { + set_status_led(da); + } + else { + printk(KERN_ERR "PDDF_ERROR %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + return(count); +} + +ssize_t store_config_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + int ret, num; + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + if(strncmp(ptr->dev_attr.attr.name, "num_psus", strlen("num_psus"))==0 ) { + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + if(psu_led_ops_data == NULL) { + if ((psu_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for PSU LED\n"); + return (count); + } + pddf_dbg(LED, "Allocate PSU LED Memory ADDR=%p\n", psu_led_ops_data); + dev_list[LED_PSU]=psu_led_ops_data; + } +#if DEBUG + pddf_dbg(LED, "[ WRITE ] ATTR CONFIG [%s] VALUE:%d; %d\n", + ptr->dev_attr.attr.name, num, num_psus); +#endif + return(count); + } + if(strncmp(ptr->dev_attr.attr.name, "num_fans", strlen("num_fans"))==0 ) { + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + if (fantray_led_ops_data == NULL) { + if ((fantray_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for FANTRAY LED\n"); + return (count); + } + pddf_dbg(LED, "Allocate FanTray LED Memory ADDR=%p\n", fantray_led_ops_data); + dev_list[LED_FANTRAY]=fantray_led_ops_data; + } +#if DEBUG + pddf_dbg(LED, "[ WRITE ] ATTR CONFIG [%s] VALUE:%d; %d\n", + ptr->dev_attr.attr.name, num, num_fans); +#endif + return(count); + } + return (count); +} + +ssize_t store_bits_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + int len = 0, num1 = 0, num2 = 0; + char mask=0xFF; + char *pptr=NULL; + char bits[NAME_SIZE]; + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + MASK_BITS* bits_ptr=(MASK_BITS*)(ptr->addr); + strncpy(bits_ptr->bits, buf, strlen(buf)-1); // to discard newline char form buf + bits_ptr->bits[strlen(buf)-1] = '\0'; + if((pptr=strstr(buf,":")) != NULL) { + len=pptr-buf; + sprintf(bits, buf); + bits[len]='\0'; + kstrtoint(bits,16,&num1); + mask = mask & ~(1 << num1); + sprintf(bits, ++pptr); + kstrtoint(bits,16,&num2); + bits_ptr->mask_bits = mask & ~(1 << num2); + bits_ptr->pos = num2; + } else { + kstrtoint(buf,16,&num1); + bits_ptr->mask_bits = mask & ~(1 << num1); + bits_ptr->pos = num1; + } +#if DEBUG + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR Bits [%s] VALUE:%s mask:0x%x; pos:0x%x\n", + ptr->dev_attr.attr.name, bits_ptr->bits, bits_ptr->mask_bits, bits_ptr->pos); +#endif + return (count); +} + +/************************************************************************** + * platform/ attributes + **************************************************************************/ +PDDF_LED_DATA_ATTR(platform, num_psus, S_IWUSR|S_IRUGO, show_pddf_data, + store_config_data, PDDF_INT_DEC, sizeof(int), (void*)&num_psus); +PDDF_LED_DATA_ATTR(platform, num_fans, S_IWUSR|S_IRUGO, show_pddf_data, + store_config_data, PDDF_INT_DEC, sizeof(int), (void*)&num_fans); + +struct attribute* attrs_platform[]={ + &pddf_dev_platform_attr_num_psus.dev_attr.attr, + &pddf_dev_platform_attr_num_fans.dev_attr.attr, + NULL, +}; +struct attribute_group attr_group_platform={ + .attrs = attrs_platform, +}; + +/************************************************************************** + * led/ attributes + **************************************************************************/ +PDDF_LED_DATA_ATTR(dev, device_name, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_CHAR, NAME_SIZE, (void*)&temp_data.device_name); +PDDF_LED_DATA_ATTR(dev, index, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&temp_data.index); +PDDF_LED_DATA_ATTR(dev, swpld_addr, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_INT_HEX, sizeof(int), (void*)&temp_data.swpld_addr); +PDDF_LED_DATA_ATTR(dev, swpld_addr_offset, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_INT_HEX, sizeof(int), (void*)&temp_data.swpld_addr_offset); +PDDF_LED_DATA_ATTR(dev, dev_ops , S_IWUSR, NULL, + dev_operation, PDDF_CHAR, NAME_SIZE, (void*)&temp_data); + +struct attribute* attrs_dev[]={ + &pddf_dev_dev_attr_device_name.dev_attr.attr, + &pddf_dev_dev_attr_index.dev_attr.attr, + &pddf_dev_dev_attr_swpld_addr.dev_attr.attr, + &pddf_dev_dev_attr_swpld_addr_offset.dev_attr.attr, + &pddf_dev_dev_attr_dev_ops.dev_attr.attr, + NULL, +}; +struct attribute_group attr_group_dev={ + .attrs = attrs_dev, +}; + +/************************************************************************** + * on/, off/, faulty/, blink/ attributes + **************************************************************************/ +#define LED_DEV_STATE_ATTR_GROUP(name, func) \ + PDDF_LED_DATA_ATTR(name, bits, S_IWUSR|S_IRUGO, show_pddf_data, \ + store_bits_data, PDDF_CHAR, NAME_SIZE, func.bits.bits); \ + PDDF_LED_DATA_ATTR(name, color, S_IWUSR|S_IRUGO, show_pddf_data, \ + store_pddf_data, PDDF_CHAR, NAME_SIZE, func.color); \ + PDDF_LED_DATA_ATTR(name, value, S_IWUSR|S_IRUGO, show_pddf_data, \ + store_pddf_data, PDDF_USHORT, sizeof(unsigned short), func.value); \ + struct attribute* attrs_##name[]={ \ + &pddf_dev_##name##_attr_bits.dev_attr.attr, \ + &pddf_dev_##name##_attr_color.dev_attr.attr, \ + &pddf_dev_##name##_attr_value.dev_attr.attr, \ + NULL, \ + }; \ + struct attribute_group attr_group_##name={ \ + .attrs = attrs_##name, \ + }; \ + + +LED_DEV_STATE_ATTR_GROUP(on, (void*)&temp_data.data[ON]) +LED_DEV_STATE_ATTR_GROUP(off, (void*)&temp_data.data[OFF]) +LED_DEV_STATE_ATTR_GROUP(faulty, (void*)&temp_data.data[FAULTY]) +LED_DEV_STATE_ATTR_GROUP(blink, (void*)&temp_data.data[BLINK]) + +/************************************************************************** + * cur_state/ attributes + **************************************************************************/ +PDDF_LED_DATA_ATTR(cur_state, color, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_CHAR, NAME_SIZE, (void*)&temp_data.cur_state.color); +PDDF_LED_DATA_ATTR(cur_state, color_state, S_IWUSR|S_IRUGO, show_pddf_data, + store_pddf_data, PDDF_CHAR, NAME_SIZE, (void*)&temp_data.cur_state.color_state); + +struct attribute* attrs_cur_state[]={ + &pddf_dev_cur_state_attr_color.dev_attr.attr, + &pddf_dev_cur_state_attr_color_state.dev_attr.attr, + NULL, +}; +struct attribute_group attr_group_cur_state={ + .attrs = attrs_cur_state, +}; + +/*************************************************************************/ +#define KOBJ_FREE(obj) \ + if(obj) kobject_put(obj); \ + +void free_kobjs(void) +{ + KOBJ_FREE(cur_state_kobj) + KOBJ_FREE(faulty_kobj) + KOBJ_FREE(blink_kobj) + KOBJ_FREE(off_kobj) + KOBJ_FREE(on_kobj) + KOBJ_FREE(led_kobj) + KOBJ_FREE(platform_kobj) +} + +int KBOJ_CREATE(char* name, struct kobject* parent, struct kobject** child) +{ + if (parent) { + *child = kobject_create_and_add(name, parent); + } else { + printk(KERN_ERR "PDDF_LED ERROR to create %s kobj; null parent\n", name); + free_kobjs(); + return (-ENOMEM); + } + return (0); +} + +int LED_DEV_ATTR_CREATE(struct kobject *kobj, const struct attribute_group *attr, const char* name) +{ + int status = sysfs_create_group(kobj, attr); + if(status) { + pddf_dbg(LED, KERN_ERR "Driver ERROR: sysfs_create %s failed rc=%d\n", name, status); + } +} + + +static int __init led_init(void) { + struct kobject *device_kobj; + pddf_dbg(LED, KERN_INFO "PDDF GENERIC LED MODULE init..\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + KBOJ_CREATE("platform", device_kobj, &platform_kobj); + KBOJ_CREATE("led", device_kobj, &led_kobj); + KBOJ_CREATE("on", led_kobj, &on_kobj); + KBOJ_CREATE("off", led_kobj, &off_kobj); + KBOJ_CREATE("blink", led_kobj, &blink_kobj); + KBOJ_CREATE("faulty", led_kobj, &faulty_kobj); + KBOJ_CREATE("cur_state", led_kobj, &cur_state_kobj); + + LED_DEV_ATTR_CREATE(platform_kobj, &attr_group_platform, "attr_group_platform"); + LED_DEV_ATTR_CREATE(led_kobj, &attr_group_dev, "attr_group_dev"); + LED_DEV_ATTR_CREATE(on_kobj, &attr_group_on, "attr_group_on"); + LED_DEV_ATTR_CREATE(off_kobj, &attr_group_off, "attr_group_off"); + LED_DEV_ATTR_CREATE(faulty_kobj, &attr_group_faulty, "attr_group_faulty"); + LED_DEV_ATTR_CREATE(blink_kobj, &attr_group_blink, "attr_group_blink"); + LED_DEV_ATTR_CREATE(cur_state_kobj, &attr_group_cur_state, "attr_group_cur_state"); + return (0); +} + + +static void __exit led_exit(void) { + pddf_dbg(LED, "PDDF GENERIC LED MODULE exit..\n"); + free_kobjs(); + if(psu_led_ops_data) kfree(psu_led_ops_data); + if(fantray_led_ops_data) kfree(fantray_led_ops_data); +} + +module_init(led_init); +module_exit(led_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/pddf/i2c/modules/mux/Makefile b/platform/pddf/i2c/modules/mux/Makefile new file mode 100644 index 000000000000..4050f0dd34ac --- /dev/null +++ b/platform/pddf/i2c/modules/mux/Makefile @@ -0,0 +1,5 @@ + +obj-m := pddf_mux_module.o + +#GCOV_PROFILE := y +CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/mux/pddf_mux_module.c b/platform/pddf/i2c/modules/mux/pddf_mux_module.c new file mode 100644 index 000000000000..4e8d6fe85370 --- /dev/null +++ b/platform/pddf/i2c/modules/mux/pddf_mux_module.c @@ -0,0 +1,206 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create I2C client for pca954x type of multiplexer + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_mux_defs.h" + + +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern void* get_device_table(char *name); +extern void delete_device_table(char *name); + + +MUX_DATA mux_data = {0}; + +/* MUX CLIENT DATA */ +PDDF_DATA_ATTR(virt_bus, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_HEX, sizeof(int), (void*)&mux_data.virt_bus, NULL); +PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&mux_data, (void*)&pddf_data); + + + +static struct attribute *mux_attributes[] = { + &attr_virt_bus.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL +}; + +static const struct attribute_group pddf_mux_client_data_group = { + .attrs = mux_attributes, +}; + +struct i2c_board_info *i2c_get_mux_board_info(MUX_DATA* mdata, NEW_DEV_ATTR *device_data) +{ + static struct i2c_board_info board_info; + static struct pca954x_platform_mode platform_modes[8]; + static struct pca954x_platform_data mux_platform_data; + int num_modes, i; + + if (strncmp(device_data->dev_type, "pca9548", strlen("pca9548")) == 0) + num_modes = 8; + else if (strncmp(device_data->dev_type, "pca9546", strlen("pca9546")) == 0) + num_modes = 6; + else + { + printk(KERN_ERR "%s: Unknown type of mux device\n", __FUNCTION__); + return NULL; + } + + for(i = 0; i < num_modes; i++) { + platform_modes[i] = (struct pca954x_platform_mode) { + .adap_id = (mdata->virt_bus + i), + .deselect_on_exit = 1, + }; + } + + mux_platform_data = (struct pca954x_platform_data) { + .modes = platform_modes, + .num_modes = num_modes, + }; + + board_info = (struct i2c_board_info) { + .platform_data = &mux_platform_data, + }; + + board_info.addr = device_data->dev_addr; + strcpy(board_info.type, device_data->dev_type); + + return &board_info; +} + + +/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + MUX_DATA *mux_ptr = (MUX_DATA *)(ptr->addr); + NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(device_ptr->parent_bus); + board_info = i2c_get_mux_board_info(mux_ptr, device_ptr); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if (client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(MUX, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + add_device_table(device_ptr->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); + if (client_ptr) + { + pddf_dbg(MUX, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + /*TODO: Nullyfy the platform data*/ + delete_device_table(device_ptr->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + +free_data: + memset(mux_ptr, 0, sizeof(MUX_DATA)); + /*TODO: free the device_ptr->data is dynamically allocated*/ + memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); + + return count; +} + + +static struct kobject *mux_kobj; + +int __init mux_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(MUX, "MUX_DATA MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + mux_kobj = kobject_create_and_add("mux", device_kobj); + if(!mux_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(mux_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(mux_kobj); + return ret; + } + pddf_dbg(MUX, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(mux_kobj, &pddf_mux_client_data_group); + if (ret) + { + sysfs_remove_group(mux_kobj, &pddf_clients_data_group); + kobject_put(mux_kobj); + return ret; + } + pddf_dbg(MUX, "CREATED MUX DATA SYSFS GROUP\n"); + + return ret; +} + +void __exit mux_data_exit(void) +{ + pddf_dbg(MUX, "MUX_DATA MODULE.. exit\n"); + sysfs_remove_group(mux_kobj, &pddf_mux_client_data_group); + sysfs_remove_group(mux_kobj, &pddf_clients_data_group); + kobject_put(mux_kobj); + pddf_dbg(MUX, KERN_ERR "%s: Removed the kobjects for 'mux'\n",__FUNCTION__); + return; +} + +module_init(mux_data_init); +module_exit(mux_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("mux platform data"); +MODULE_LICENSE("GPL"); + +/*#endif*/ diff --git a/platform/pddf/i2c/modules/psu/Makefile b/platform/pddf/i2c/modules/psu/Makefile new file mode 100644 index 000000000000..0d5d5423072a --- /dev/null +++ b/platform/pddf/i2c/modules/psu/Makefile @@ -0,0 +1,6 @@ +subdir-m := driver +obj-m := pddf_psu_module.o + +#GCOV_PROFILE := y +CFLAGS_$(obj-m):= -I$(M)/modules/include +#CFLAGS_$(obj-m)+= -I$(M)/modules/psu/driver diff --git a/platform/pddf/i2c/modules/psu/driver/Makefile b/platform/pddf/i2c/modules/psu/driver/Makefile new file mode 100644 index 000000000000..63d437000ffa --- /dev/null +++ b/platform/pddf/i2c/modules/psu/driver/Makefile @@ -0,0 +1,9 @@ +TARGET = pddf_psu_driver_module + +obj-m := $(TARGET).o + +$(TARGET)-objs := pddf_psu_api.o pddf_psu_driver.o +#GCOV_PROFILE := y + +ccflags-y := -I$(M)/modules/include +#ccflags-y += -I$(M)/modules/psu diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c new file mode 100644 index 000000000000..d63192e18d3f --- /dev/null +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c @@ -0,0 +1,610 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description of various APIs related to PSU component + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_psu_defs.h" +#include "pddf_psu_driver.h" + + +/*#define PSU_DEBUG*/ +#ifdef PSU_DEBUG +#define psu_dbg(...) printk(__VA_ARGS__) +#else +#define psu_dbg(...) +#endif + + +void get_psu_duplicate_sysfs(int idx, char *str) +{ + switch (idx) + { + case PSU_V_OUT: + strcpy(str, "in3_input"); + break; + case PSU_I_OUT: + strcpy(str, "curr2_input"); + break; + case PSU_P_OUT: + strcpy(str, "power2_input"); + break; + case PSU_FAN1_SPEED: + strcpy(str, "fan1_input"); + break; + case PSU_TEMP1_INPUT: + strcpy(str, "temp1_input"); + break; + /*case PSU_TEMP_FAULT:*/ + /*strcpy(str, "temp1_fault");*/ + /*break;*/ + default: + break; + } + + return; +} + +static int two_complement_to_int(u16 data, u8 valid_bit, int mask) +{ + u16 valid_data = data & mask; + bool is_negative = valid_data >> (valid_bit - 1); + + return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data; +} + +int psu_update_hw(struct device *dev, struct psu_attr_info *info, PSU_DATA_ATTR *udata) +{ + int status = 0; + struct i2c_client *client = to_i2c_client(dev); + PSU_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; + + + mutex_lock(&info->update_lock); + + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_set != NULL) + { + status = (sysfs_attr_data->pre_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: pre_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_set != NULL) + { + status = (sysfs_attr_data->do_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: do_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + + } + if (sysfs_attr_data->post_set != NULL) + { + status = (sysfs_attr_data->post_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: post_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + + mutex_unlock(&info->update_lock); + + return 0; +} + + +int psu_update_attr(struct device *dev, struct psu_attr_info *data, PSU_DATA_ATTR *udata) +{ + int status = 0; + struct i2c_client *client = to_i2c_client(dev); + PSU_SYSFS_ATTR_DATA *sysfs_attr_data=NULL; + + mutex_lock(&data->update_lock); + + if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) + { + dev_dbg(&client->dev, "Starting update for %s\n", data->name); + + /*psu_dbg(KERN_ERR "%s: UPDATING %s ATTR FOR PSU,#### \n", __FUNCTION__, udata->aname );*/ + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_get != NULL) + { + status = (sysfs_attr_data->pre_get)(client, udata, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_get != NULL) + { + status = (sysfs_attr_data->do_get)(client, udata, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + + } + if (sysfs_attr_data->post_get != NULL) + { + status = (sysfs_attr_data->post_get)(client, udata, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + + data->last_updated = jiffies; + data->valid = 1; + } + + mutex_unlock(&data->update_lock); + return 0; +} + +ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psu_data *data = i2c_get_clientdata(client); + PSU_PDATA *pdata = (PSU_PDATA *)(client->dev.platform_data); + PSU_DATA_ATTR *usr_data = NULL; + struct psu_attr_info *sysfs_attr_info = NULL; + int i, status=0; + u16 value = 0; + int exponent, mantissa; + int multiplier = 1000; + char new_str[ATTR_NAME_LEN] = ""; + PSU_SYSFS_ATTR_DATA *ptr = NULL; + + for (i=0;inum_attr;i++) + { + ptr = (PSU_SYSFS_ATTR_DATA *)pdata->psu_attrs[i].access_data; + get_psu_duplicate_sysfs(ptr->index , new_str); + if ( strcmp(attr->dev_attr.attr.name, pdata->psu_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0 ) + { + /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->psu_attrs[i].aname, ptr->index, new_str);*/ + sysfs_attr_info = &data->attr_info[i]; + usr_data = &pdata->psu_attrs[i]; + strcpy(new_str, ""); + } + } + + if (sysfs_attr_info==NULL || usr_data==NULL) + { + printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); + goto exit; + } + + psu_update_attr(dev, sysfs_attr_info, usr_data); + + switch(attr->index) + { + case PSU_PRESENT: + case PSU_POWER_GOOD: + status = sysfs_attr_info->val.intval; + return sprintf(buf, "%d\n", status); + break; + case PSU_MODEL_NAME: + case PSU_MFR_ID: + case PSU_SERIAL_NUM: + case PSU_FAN_DIR: + return sprintf(buf, "%s\n", sysfs_attr_info->val.strval); + break; + case PSU_V_OUT: + case PSU_I_OUT: + multiplier = 1000; + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); + else + return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); + + break; + case PSU_P_OUT: + multiplier = 1000000; + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); + else + return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); + + break; + case PSU_FAN1_SPEED: + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent)); + else + return sprintf(buf, "%d\n", (mantissa) / (1 << -exponent)); + + break; + case PSU_TEMP1_INPUT: + multiplier = 1000; + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent)); + else + return sprintf(buf, "%d\n", (mantissa) / (1 << -exponent)); + + break; + default: + printk(KERN_ERR "%s: Unable to find attribute index for %s\n", __FUNCTION__, usr_data->aname); + goto exit; + } + +exit: + return sprintf(buf, "%d\n", status); +} + + +ssize_t psu_store_default(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct psu_data *data = i2c_get_clientdata(client); + PSU_PDATA *pdata = (PSU_PDATA *)(client->dev.platform_data); + PSU_DATA_ATTR *usr_data = NULL; + struct psu_attr_info *sysfs_attr_info = NULL; + int i, ret ; + + for (i=0;inum_attr;i++) + { + if (strcmp(data->attr_info[i].name, attr->dev_attr.attr.name) == 0 && strcmp(pdata->psu_attrs[i].aname, attr->dev_attr.attr.name) == 0) + { + sysfs_attr_info = &data->attr_info[i]; + usr_data = &pdata->psu_attrs[i]; + } + } + + if (sysfs_attr_info==NULL || usr_data==NULL) { + printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); + goto exit; + } + + switch(attr->index) + { + /*No write attributes for now in PSU*/ + default: + /*printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname);*/ + goto exit; + } + + psu_update_hw(dev, sysfs_attr_info, usr_data); + +exit: + return count; +} + +int sonic_i2c_get_psu_present_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + int status = 0; + int val = 0; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + + + if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) + { + val = board_i2c_cpld_read(adata->devaddr , adata->offset); + if (val < 0) + return val; + padata->val.intval = ((val & adata->mask) == adata->cmpval); + psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); + } + + return status; +} + +int sonic_i2c_get_psu_power_good_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + int status = 0; + int val = 0; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + + if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) + { + val = board_i2c_cpld_read(adata->devaddr , adata->offset); + if (val < 0) + return val; + padata->val.intval = ((val & adata->mask) == adata->cmpval); + psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); + } + + return status; +} + +int sonic_i2c_get_psu_model_name_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char model[16]=""; //temporary placeholder for model name + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*printk(KERN_ERR "###INSIDE GET MODEL NAME. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, model); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + model[0] = '\0'; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read model name from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + model[data_len-1] = '\0'; + } + + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, model+1, data_len-1); + else + strncpy(padata->val.strval, model, data_len); + + psu_dbg(KERN_ERR "%s: status = %d, model_name : %s\n", __FUNCTION__, status, padata->val.strval); + return 0; +} + +int sonic_i2c_get_psu_mfr_id_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char mfr_id[16] = ""; // temporary place holder for mfr_id + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*psu_dbg(KERN_ERR "###INSIDE GET MFR ID. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, mfr_id); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + mfr_id[0] = '\0'; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read mfr_id from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + mfr_id[data_len-1] = '\0'; + } + + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, mfr_id+1, data_len-1); + else + strncpy(padata->val.strval, mfr_id, data_len); + + psu_dbg(KERN_ERR "%s: status = %d, mfr_id : %s\n", __FUNCTION__, status, padata->val.strval); + return 0; +} + +int sonic_i2c_get_psu_serial_num_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char serial[32] = ""; // temporary string to store the serial num + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*psu_dbg(KERN_ERR "###INSIDE GET SERIAL_NUM. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, serial); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + serial[0] = '\0'; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read serial num from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + serial[data_len-1] = '\0'; + } + + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, serial+1, data_len-1); + else + strncpy(padata->val.strval, serial, data_len); + + psu_dbg(KERN_ERR "%s: status = %d, serial_num : %s\n", __FUNCTION__, status, padata->val.strval); + return 0; +} + +int sonic_i2c_get_psu_fan_dir_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char fan_dir[5] = ""; + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, fan_dir); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + fan_dir[0] = '\0'; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read fan_dir from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + fan_dir[data_len-1] = '\0'; + } + + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, fan_dir+1, data_len-1); + else + strncpy(padata->val.strval, fan_dir, data_len); + + psu_dbg(KERN_ERR "%s: status = %d, fan_dir : %s\n", __FUNCTION__, status, padata->val.strval); + return 0; +} + +int sonic_i2c_get_psu_v_out_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; + + while (retry) { + status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + padata->val.shortval = 0; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read v_out from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + padata->val.shortval = status; + } + + psu_dbg(KERN_ERR "%s: v_out : %d\n", __FUNCTION__, padata->val.shortval); + return 0; +} + +int sonic_i2c_get_psu_i_out_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; + + while (retry) { + status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + padata->val.shortval = 0; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read i_out from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + padata->val.shortval = status; + } + + psu_dbg(KERN_ERR "%s: i_out : %d\n", __FUNCTION__, padata->val.shortval); + return 0; +} + +int sonic_i2c_get_psu_p_out_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; + + while (retry) { + status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + padata->val.shortval = 0; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read p_out from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + padata->val.shortval = status; + } + + psu_dbg(KERN_ERR "%s: p_out : %d\n", __FUNCTION__, padata->val.shortval); + return 0; +} + +int sonic_i2c_get_psu_fan1_speed_rpm_default(void *client, PSU_DATA_ATTR *adata, void *data) +{ + + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; + + while (retry) { + status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); + if (unlikely(status < 0)) { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + padata->val.shortval = 0; + dev_dbg(&((struct i2c_client *)client)->dev, "unable to read fan1_speed_rpm from (0x%x)\n", ((struct i2c_client *)client)->addr); + } + else + { + padata->val.shortval = status; + } + + psu_dbg(KERN_ERR "%s: fan1_speed_rpm : %d\n", __FUNCTION__, padata->val.shortval); + return 0; +} diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c new file mode 100644 index 000000000000..10da2544ea4b --- /dev/null +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c @@ -0,0 +1,366 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module for PSU + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_psu_defs.h" +#include "pddf_psu_driver.h" +#include "pddf_psu_api.h" + + +static unsigned short normal_i2c[] = {0x50, 0x58, 0x51, 0x59, 0x53, 0x5b, I2C_CLIENT_END}; + +struct pddf_ops_t pddf_psu_ops = { + .pre_init = NULL, + .post_init = NULL, + + .pre_probe = NULL, + .post_probe = NULL, + + .pre_remove = NULL, + .post_remove = NULL, + + .pre_exit = NULL, + .post_exit = NULL, +}; +EXPORT_SYMBOL(pddf_psu_ops); + + +PSU_SYSFS_ATTR_DATA access_psu_present = {PSU_PRESENT, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_present_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_present); + +PSU_SYSFS_ATTR_DATA access_psu_model_name = {PSU_MODEL_NAME, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_model_name_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_model_name); + +PSU_SYSFS_ATTR_DATA access_psu_power_good = {PSU_POWER_GOOD, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_power_good_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_power_good); + +PSU_SYSFS_ATTR_DATA access_psu_mfr_id = {PSU_MFR_ID, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_mfr_id_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_mfr_id); + +PSU_SYSFS_ATTR_DATA access_psu_serial_num = {PSU_SERIAL_NUM, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_serial_num_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_serial_num); + +PSU_SYSFS_ATTR_DATA access_psu_fan_dir = {PSU_FAN_DIR, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_fan_dir_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_fan_dir); + +PSU_SYSFS_ATTR_DATA access_psu_v_out = {PSU_V_OUT, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_v_out_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_v_out); + +PSU_SYSFS_ATTR_DATA access_psu_i_out = {PSU_I_OUT, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_i_out_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_i_out); + +PSU_SYSFS_ATTR_DATA access_psu_p_out = {PSU_P_OUT, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_p_out_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_p_out); + +PSU_SYSFS_ATTR_DATA access_psu_fan1_speed_rpm = {PSU_FAN1_SPEED, S_IRUGO, psu_show_default, NULL, sonic_i2c_get_psu_fan1_speed_rpm_default, NULL, NULL, NULL, NULL, NULL}; +EXPORT_SYMBOL(access_psu_fan1_speed_rpm); + + +PSU_SYSFS_ATTR_DATA_ENTRY psu_sysfs_attr_data_tbl[]= +{ + { "psu_present", &access_psu_present}, + { "psu_model_name", &access_psu_model_name}, + { "psu_power_good" , &access_psu_power_good}, + { "psu_mfr_id" , &access_psu_mfr_id}, + { "psu_serial_num" , &access_psu_serial_num}, + { "psu_fan_dir" , &access_psu_fan_dir}, + { "psu_v_out" , &access_psu_v_out}, + { "psu_i_out" , &access_psu_i_out}, + { "psu_p_out" , &access_psu_p_out}, + { "psu_fan1_speed_rpm" , &access_psu_fan1_speed_rpm} +}; + +void *get_psu_access_data(char *name) +{ + int i=0; + for(i=0; i<(sizeof(psu_sysfs_attr_data_tbl)/sizeof(psu_sysfs_attr_data_tbl[0])); i++) + { + if(strcmp(name, psu_sysfs_attr_data_tbl[i].name) ==0) + { + return &psu_sysfs_attr_data_tbl[i]; + } + } + return NULL; +} +EXPORT_SYMBOL(get_psu_access_data); + + +static int psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct psu_data *data; + int status =0; + int i,num, j=0; + PSU_PDATA *psu_platform_data; + PSU_DATA_ATTR *data_attr; + PSU_SYSFS_ATTR_DATA_ENTRY *sysfs_data_entry; + char new_str[ATTR_NAME_LEN] = ""; + + + /*pddf_dbg("GENERIC_PSU_DRIVER Probe called... \n");*/ + + if (client == NULL) { + printk("NULL Client.. \n"); + goto exit; + } + + if (pddf_psu_ops.pre_probe) + { + status = (pddf_psu_ops.pre_probe)(client, dev_id); + if (status != 0) + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct psu_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + dev_info(&client->dev, "chip found\n"); + + /* Take control of the platform data */ + psu_platform_data = (PSU_PDATA *)(client->dev.platform_data); + num = psu_platform_data->len; + data->index = psu_platform_data->idx - 1; + data->num_psu_fans = psu_platform_data->num_psu_fans; + data->num_attr = num; + + + + /* Create and Add supported attr in the 'attributes' list */ + for (i=0; ipsu_attrs + i; + sysfs_data_entry = get_psu_access_data(data_attr->aname); + if (sysfs_data_entry == NULL) + { + printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); + continue; + } + + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, data_attr->aname); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->psu_attribute_list[i] = &dy_ptr->dev_attr.attr; + /*pddf_dbg(KERN_ERR "PSU%d: Allocated %d: 0x%x\n", data->index+1, i, data->psu_attribute_list[i]);*/ + strcpy(data->attr_info[i].name, data_attr->aname); + data->attr_info[i].valid = 0; + mutex_init(&data->attr_info[i].update_lock); + + /*Create a duplicate entry*/ + get_psu_duplicate_sysfs(dy_ptr->index, new_str); + if (strcmp(new_str,"")) + { + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->psu_attribute_list[num+j] = &dy_ptr->dev_attr.attr; + j++; + strcpy(new_str,""); + } + } + data->psu_attribute_list[i+j] = NULL; + data->psu_attribute_group.attrs = data->psu_attribute_list; + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &data->psu_attribute_group); + if (status) { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", + dev_name(data->hwmon_dev), client->name); + + /* Add a support for post probe function */ + if (pddf_psu_ops.post_probe) + { + status = (pddf_psu_ops.post_probe)(client, dev_id); + if (status != 0) + goto exit_remove; + } + + return 0; + + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &data->psu_attribute_group); +exit_free: + /* Free all the allocated attributes */ + for (i=0;data->psu_attribute_list[i]!=NULL;i++) + { + struct sensor_device_attribute *ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; + kfree(ptr); + data->psu_attribute_list[i] = NULL; + pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); + } + kfree(data); +exit: + return status; +} + +static int psu_remove(struct i2c_client *client) +{ + int i=0, idx=0, ret = 0; + struct psu_data *data = i2c_get_clientdata(client); + PSU_PDATA *platdata = (PSU_PDATA *)client->dev.platform_data; // use dev_get_platdata() + PSU_DATA_ATTR *platdata_sub = platdata->psu_attrs; + struct sensor_device_attribute *ptr = NULL; + + if (pddf_psu_ops.pre_remove) + { + ret = (pddf_psu_ops.pre_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN pre_remove function failed\n"); + } + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &data->psu_attribute_group); + for (i=0; data->psu_attribute_list[i]!=NULL; i++) + { + ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; + kfree(ptr); + data->psu_attribute_list[i] = NULL; + /*pddf_dbg(KERN_ERR "PSU%d: Freed %d: 0x%x\n", data->index+1, i, ptr);*/ + } + pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); + kfree(data); + if (platdata_sub) { + printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } + + if (pddf_psu_ops.post_remove) + { + ret = (pddf_psu_ops.post_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN post_remove function failed\n"); + } + + return ret; +} + +enum psu_intf +{ + eeprom_intf, + smbus_intf +}; + +static const struct i2c_device_id psu_id[] = { + {"psu_eeprom", eeprom_intf}, + {"psu_pmbus", smbus_intf}, + {} +}; + +MODULE_DEVICE_TABLE(i2c, psu_id); + +static struct i2c_driver psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "psu", + }, + .probe = psu_probe, + .remove = psu_remove, + .id_table = psu_id, + .address_list = normal_i2c, +}; + +int example_fun(void) +{ + pddf_dbg(PSU, KERN_ERR "CALLING FUN...\n"); + return 0; +} +EXPORT_SYMBOL(example_fun); + + +/*int __init psu_init(void)*/ +int psu_init(void) +{ + int status = 0; + + if (pddf_psu_ops.pre_init) + { + status = (pddf_psu_ops.pre_init)(); + if (status!=0) + return status; + } + + pddf_dbg(PSU, KERN_ERR "GENERIC_PSU_DRIVER.. init Invoked..\n"); + status = i2c_add_driver(&psu_driver); + if (status!=0) + return status; + + if (pddf_psu_ops.post_init) + { + status = (pddf_psu_ops.post_init)(); + if (status!=0) + return status; + } + + return status; +} +EXPORT_SYMBOL(psu_init); + +void __exit psu_exit(void) +{ + pddf_dbg(PSU, "GENERIC_PSU_DRIVER.. exit\n"); + if (pddf_psu_ops.pre_exit) (pddf_psu_ops.pre_exit)(); + i2c_del_driver(&psu_driver); + if (pddf_psu_ops.post_exit) (pddf_psu_ops.post_exit)(); +} +EXPORT_SYMBOL(psu_exit); + +/*#ifdef SONIC*/ +module_init(psu_init); +module_exit(psu_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("psu driver"); +MODULE_LICENSE("GPL"); + +/*#endif*/ diff --git a/platform/pddf/i2c/modules/psu/pddf_psu_module.c b/platform/pddf/i2c/modules/psu/pddf_psu_module.c new file mode 100644 index 000000000000..8d0a368d4f6e --- /dev/null +++ b/platform/pddf/i2c/modules/psu/pddf_psu_module.c @@ -0,0 +1,302 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create I2C client for PSU + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_psu_defs.h" + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern void *get_psu_access_data(char *); +extern void* get_device_table(char *name); +extern void delete_device_table(char *name); + +PSU_DATA psu_data = {0}; + + + +/* PSU CLIENT DATA */ +PDDF_DATA_ATTR(psu_idx, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&psu_data.idx, NULL); +PDDF_DATA_ATTR(psu_fans, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&psu_data.num_psu_fans, NULL); + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&psu_data.psu_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devtype, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 8, (void*)&psu_data.psu_attr.devtype, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&psu_data.psu_attr.devaddr, NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&psu_data.psu_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&psu_data.psu_attr.mask, NULL); +PDDF_DATA_ATTR(attr_cmpval, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&psu_data.psu_attr.cmpval, NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&psu_data.psu_attr.len, NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&psu_data, NULL); +PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&psu_data, (void*)&pddf_data); + + + +static struct attribute *psu_attributes[] = { + &attr_psu_idx.dev_attr.attr, + &attr_psu_fans.dev_attr.attr, + + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL +}; + +static const struct attribute_group pddf_psu_client_data_group = { + .attrs = psu_attributes, +}; + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); + PSU_SYSFS_ATTR_DATA_ENTRY *access_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + pdata->psu_attrs[pdata->len] = pdata->psu_attr; + access_ptr = get_psu_access_data(pdata->psu_attrs[pdata->len].aname); + if (access_ptr != NULL && access_ptr->a_ptr != NULL) + { + pdata->psu_attrs[pdata->len].access_data = access_ptr->a_ptr ; + /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",pdata->psu_attrs[pdata->len].aname, pdata->psu_attrs[pdata->len].access_data);*/ + } + + + pdata->len++; + memset(&pdata->psu_attr, 0, sizeof(pdata->psu_attr)); + + + return count; +} + +struct i2c_board_info *i2c_get_psu_board_info(PSU_DATA *pdata, NEW_DEV_ATTR *cdata) +{ + int num = pdata->len; + int i = 0; + static struct i2c_board_info board_info; + PSU_PDATA *psu_platform_data; + + + if (strcmp(cdata->dev_type, "psu_pmbus")==0 || strcmp(cdata->dev_type, "psu_eeprom")==0 ) + { + /* Allocate the psu_platform_data */ + psu_platform_data = (PSU_PDATA *)kzalloc(sizeof(PSU_PDATA), GFP_KERNEL); + psu_platform_data->psu_attrs = (PSU_DATA_ATTR *)kzalloc(num*sizeof(PSU_DATA_ATTR), GFP_KERNEL); + + + psu_platform_data->idx = pdata->idx; + psu_platform_data->num_psu_fans = pdata->num_psu_fans; + psu_platform_data->len = pdata->len; + + for (i=0;ipsu_attrs[i] = pdata->psu_attrs[i]; + } + + /* Verify that the data is written properly */ +#if 0 + pddf_dbg(PSU, KERN_ERR "\n\n########### psu_platform_data - start ##########\n"); + pddf_dbg(PSU, KERN_ERR "psu_idx: %d\n", psu_platform_data->idx); + pddf_dbg(PSU, KERN_ERR "psu_fans: %d\n", psu_platform_data->num_psu_fans); + pddf_dbg(PSU, KERN_ERR "no_of_usr_attr: %d\n", psu_platform_data->len); + + for (i=0; ipsu_attrs[i].aname); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_type: %s\n", psu_platform_data->psu_attrs[i].devtype); + pddf_dbg(PSU, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", psu_platform_data->psu_attrs[i].devaddr); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_offset: 0x%x\n", psu_platform_data->psu_attrs[i].offset); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_mask: 0x%x\n", psu_platform_data->psu_attrs[i].mask); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", psu_platform_data->psu_attrs[i].cmpval); + pddf_dbg(PSU, KERN_ERR "usr_attr_len: %d\n", psu_platform_data->psu_attrs[i].len); + } + pddf_dbg(PSU, KERN_ERR "########### psu_platform_data - start ##########\n\n"); +#endif + + + board_info = (struct i2c_board_info) { + .platform_data = psu_platform_data, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to clreate I2C client for it\n",__FUNCTION__, cdata->dev_type); + } + + return &board_info; +} + + +/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = i2c_get_psu_board_info(pdata, cdata); + + /* Populate the platform data for psu */ + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if(client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(PSU, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name , client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(PSU, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; + +free_data: + if (board_info->platform_data) + { + PSU_PDATA *psu_platform_data = board_info->platform_data; + if (psu_platform_data->psu_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(psu_platform_data->psu_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(psu_platform_data); + } + +clear_data: + memset(pdata, 0, sizeof(PSU_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; +} + + +static struct kobject *psu_kobj; +static struct kobject *i2c_kobj; + +int __init pddf_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(PSU, "PDDF_DATA MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + psu_kobj = kobject_create_and_add("psu", device_kobj); + if(!psu_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", psu_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(i2c_kobj); + kobject_put(psu_kobj); + return ret; + } + pddf_dbg(PSU, "CREATED PSU I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(i2c_kobj, &pddf_psu_client_data_group); + if (ret) + { + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(psu_kobj); + return ret; + } + pddf_dbg(PSU, "CREATED PDDF PSU DATA SYSFS GROUP\n"); + + return ret; +} + +void __exit pddf_data_exit(void) +{ + + pddf_dbg(PSU, "PDDF_DATA MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_psu_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(psu_kobj); + pddf_dbg(PSU, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'psu'\n",__FUNCTION__); + + return; +} + +module_init(pddf_data_init); +module_exit(pddf_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("psu platform data"); +MODULE_LICENSE("GPL"); + +/*#endif*/ diff --git a/platform/pddf/i2c/modules/sysstatus/Makefile b/platform/pddf/i2c/modules/sysstatus/Makefile new file mode 100644 index 000000000000..6b874aa9395b --- /dev/null +++ b/platform/pddf/i2c/modules/sysstatus/Makefile @@ -0,0 +1,6 @@ +TARGET := pddf_sysstatus_module +obj-m := $(TARGET).o + +#GCOV_PROFILE := y +CFLAGS_$(obj-m):= -I$(M)/modules/include + diff --git a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c new file mode 100644 index 000000000000..9aaea3e66d09 --- /dev/null +++ b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c @@ -0,0 +1,227 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module for system status registers + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_sysstatus_defs.h" + + + +SYSSTATUS_DATA sysstatus_data = {0}; + +extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); +extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf); + + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, + (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&sysstatus_data, NULL); + + + +static struct attribute *sysstatus_addr_attributes[] = { + &attr_attr_name.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + NULL +}; + +PDDF_DATA_ATTR(board_info, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, 32, NULL, NULL); +PDDF_DATA_ATTR(cpld1_version, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(cpld2_version, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(cpld3_version, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(power_module_status, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset1, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset2, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset3, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset4, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset5, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset6, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset7, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(system_reset8, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(misc1, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(misc2, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); +PDDF_DATA_ATTR(misc3, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, sizeof(uint32_t), NULL, NULL); + + + +static struct attribute *sysstatus_data_attributes[] = { + &attr_board_info.dev_attr.attr, + &attr_cpld1_version.dev_attr.attr, + &attr_cpld2_version.dev_attr.attr, + &attr_cpld3_version.dev_attr.attr, + &attr_power_module_status.dev_attr.attr, + &attr_system_reset1.dev_attr.attr, + &attr_system_reset2.dev_attr.attr, + &attr_system_reset3.dev_attr.attr, + &attr_system_reset4.dev_attr.attr, + &attr_system_reset5.dev_attr.attr, + &attr_system_reset6.dev_attr.attr, + &attr_system_reset7.dev_attr.attr, + &attr_system_reset8.dev_attr.attr, + &attr_misc1.dev_attr.attr, + &attr_misc2.dev_attr.attr, + &attr_misc3.dev_attr.attr, + NULL +}; + + + +static const struct attribute_group pddf_sysstatus_addr_group = { + .attrs = sysstatus_addr_attributes, +}; + + +static const struct attribute_group pddf_sysstatus_data_group = { + .attrs = sysstatus_data_attributes, +}; + + +static struct kobject *sysstatus_addr_kobj; +static struct kobject *sysstatus_data_kobj; + + + +ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, char *buf) +{ + + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + + SYSSTATUS_DATA *data = &sysstatus_data; + struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; + int i, status ; + + + for (i=0;isysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) + { + /*pddf_dbg(KERN_ERR "%s: show func called for %s\n\n", __FUNCTION__, attr->dev_attr.attr.name);*/ + sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; + + } + } + + if (sysstatus_addr_attrs==NULL ) + { + printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); + status = 0; + } + else + { + status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); + /*pddf_dbg(KERN_ERR "%s: Data read for %s is 0x%x\n", __FUNCTION__, sysstatus_addr_attrs->aname, status);*/ + } + + return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); + +} + + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); + + pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; + pdata->len++; + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); + memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); + + + return count; +} + + + + +int __init sysstatus_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); + if(!sysstatus_addr_kobj) + return -ENOMEM; + + sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); + if(!sysstatus_data_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + if (ret) + { + kobject_put(sysstatus_addr_kobj); + return ret; + } + + ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + if (ret) + { + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + return ret; + } + + + return ret; +} + +void __exit sysstatus_data_exit(void) +{ + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); + sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + kobject_put(sysstatus_data_kobj); + kobject_put(sysstatus_addr_kobj); + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Removed the kobjects for 'SYSSTATUS'\n",__FUNCTION__); + return; +} + +module_init(sysstatus_data_init); +module_exit(sysstatus_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("SYSSTATUS platform data"); +MODULE_LICENSE("GPL"); + diff --git a/platform/pddf/i2c/modules/xcvr/Makefile b/platform/pddf/i2c/modules/xcvr/Makefile new file mode 100644 index 000000000000..17e856655780 --- /dev/null +++ b/platform/pddf/i2c/modules/xcvr/Makefile @@ -0,0 +1,5 @@ +subdir-m := driver +obj-m := pddf_xcvr_module.o + +#GCOV_PROFILE := y +CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/xcvr/driver/Makefile b/platform/pddf/i2c/modules/xcvr/driver/Makefile new file mode 100644 index 000000000000..6a8cb4d530e6 --- /dev/null +++ b/platform/pddf/i2c/modules/xcvr/driver/Makefile @@ -0,0 +1,9 @@ +TARGET = pddf_xcvr_driver_module + +obj-m := $(TARGET).o + +$(TARGET)-objs := pddf_xcvr_api.o pddf_xcvr_driver.o +#GCOV_PROFILE := y + +ccflags-y := -I$(M)/modules/include +#ccflags-y += -I$(M)/modules/xcvr diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c new file mode 100644 index 000000000000..6390442a9c56 --- /dev/null +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c @@ -0,0 +1,761 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * Description of various APIs related to transciever component + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_xcvr_defs.h" + +/*#define SFP_DEBUG*/ +#ifdef SFP_DEBUG +#define sfp_dbg(...) printk(__VA_ARGS__) +#else +#define sfp_dbg(...) +#endif + +extern XCVR_SYSFS_ATTR_OPS xcvr_ops[]; + +int get_xcvr_module_attr_data(struct i2c_client *client, struct device *dev, + struct device_attribute *da, XCVR_ATTR *xattr); + +int sonic_i2c_get_mod_pres(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t modpres = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + /*sfp_dbg(KERN_ERR "%s: status 0x%x\n", __FUNCTION__, status);*/ + + if (status < 0) + return status; + else + { + modpres = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nMod presence :0x%x, reg_value = 0x%x, devaddr=0x%x, mask=0x%x, offset=0x%x\n", modpres, status, info->devaddr, info->mask, info->offset); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + data->modpres = modpres; + + return 0; +} + +int sonic_i2c_get_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t modreset=0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + modreset = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nMod Reset :0x%x, reg_value = 0x%x\n", modreset, status); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + + data->reset = modreset; + return 0; +} + + +int sonic_i2c_get_mod_intr_status(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t mod_intr = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + mod_intr = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule Interrupt :0x%x, reg_value = 0x%x\n", mod_intr, status); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + + data->intr_status = mod_intr; + return 0; +} + + +int sonic_i2c_get_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t lpmode = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + lpmode = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule LPmode :0x%x, reg_value = 0x%x\n", lpmode, status); + } + } + + data->lpmode = lpmode; + return 0; +} + +int sonic_i2c_get_mod_rxlos(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t rxlos = 0; + + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + rxlos = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule RxLOS :0x%x, reg_value = 0x%x\n", rxlos, status); + } + } + data->rxlos = rxlos; + + return 0; +} + +int sonic_i2c_get_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t txdis = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + txdis = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule TxDisable :0x%x, reg_value = 0x%x\n", txdis, status); + } + } + data->txdisable = txdis; + + return 0; +} + +int sonic_i2c_get_mod_txfault(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + uint32_t txflt = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + txflt = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule TxFault :0x%x, reg_value = 0x%x\n", txflt, status); + } + + } + data->txfault = txflt; + + return 0; +} + +int sonic_i2c_set_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->reset == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; +} + +int sonic_i2c_set_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->lpmode == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; +} + +int sonic_i2c_set_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) +{ + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->txdisable == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; +} + +ssize_t get_module_presence(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0, i; + + for (i=0; ilen; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + /*printk(KERN_ERR "\n attr_data->devaddr: 0x%x, attr_data->mask:0x%x, attr_data->offset:0x%x\n", */ + /*attr_data->devaddr, attr_data->mask, attr_data->offset);*/ + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute. ret %d\n", __FUNCTION__, attr_data->aname, status); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d\n", data->modpres); + } + } + return sprintf(buf, "%s",""); +} + +ssize_t get_module_reset(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0, i; + + for (i=0; ilen; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", data->reset); + } + } + return sprintf(buf, "%s",""); +} + +ssize_t set_module_reset(struct device *dev, struct device_attribute *da, const char *buf, + size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0, i; + unsigned int set_value; + + for (i=0; ilen; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->reset = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + + return count; + } + } + return -EINVAL; +} + +ssize_t get_module_intr_status(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0, i; + + for (i=0; ilen; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d\n", data->intr_status); + } + } + return sprintf(buf, "%s",""); +} + +int get_xcvr_module_attr_data(struct i2c_client *client, struct device *dev, + struct device_attribute *da, XCVR_ATTR *xattr) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + int i; + + for (i=0; i < pdata->len; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + xattr = attr_data; + return 1; + } + } + return 0; +} + +ssize_t get_module_lpmode(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + return sprintf(buf, "%d\n", data->lpmode); + } + else + return sprintf(buf,"%s",""); +} + +ssize_t set_module_lpmode(struct device *dev, struct device_attribute *da, const char *buf, + size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + int status = 0; + uint32_t set_value; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->lpmode = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + } + return count; +} + +ssize_t get_module_rxlos(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + int status = 0; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->rxlos); + } + else + return sprintf(buf,"%s",""); +} + +ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + int status = 0; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->txdisable); + } + else + return sprintf(buf,"%s",""); +} + +ssize_t set_module_txdisable(struct device *dev, struct device_attribute *da, const char *buf, + size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + int status = 0; + uint32_t set_value; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->txdisable = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + } + return count; +} + +ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, + char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + int status = 0; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->txfault); + } + return sprintf(buf,"%s",""); +} diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c new file mode 100644 index 000000000000..363689a703f6 --- /dev/null +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c @@ -0,0 +1,289 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module for Optic component + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_xcvr_defs.h" +#include "pddf_xcvr_api.h" + + +struct pddf_ops_t pddf_xcvr_ops = { + .pre_init = NULL, + .post_init = NULL, + + .pre_probe = NULL, + .post_probe = NULL, + + .pre_remove = NULL, + .post_remove = NULL, + + .pre_exit = NULL, + .post_exit = NULL, +}; +EXPORT_SYMBOL(pddf_xcvr_ops); + +XCVR_SYSFS_ATTR_OPS xcvr_ops[XCVR_ATTR_MAX] = { + {XCVR_PRESENT, get_module_presence, NULL, sonic_i2c_get_mod_pres, NULL, NULL, NULL, NULL, NULL}, + {XCVR_RESET, get_module_reset, NULL, sonic_i2c_get_mod_reset, NULL, set_module_reset, NULL, sonic_i2c_set_mod_reset, NULL}, + {XCVR_INTR_STATUS, get_module_intr_status, NULL, sonic_i2c_get_mod_intr_status, NULL, NULL, NULL, NULL, NULL}, + {XCVR_LPMODE, get_module_lpmode, NULL, sonic_i2c_get_mod_lpmode, NULL, set_module_lpmode, NULL, sonic_i2c_set_mod_lpmode, NULL}, + {XCVR_RXLOS, get_module_rxlos, NULL, sonic_i2c_get_mod_rxlos, NULL, NULL, NULL, NULL, NULL}, + {XCVR_TXDISABLE, get_module_txdisable, NULL, sonic_i2c_get_mod_txdisable, NULL, set_module_txdisable, NULL, sonic_i2c_set_mod_txdisable, NULL}, + {XCVR_TXFAULT, get_module_txfault, NULL, sonic_i2c_get_mod_txfault, NULL, NULL, NULL, NULL, NULL}, +}; +EXPORT_SYMBOL(xcvr_ops); + + +/* sysfs attributes + */ +static SENSOR_DEVICE_ATTR(xcvr_present, S_IWUSR|S_IRUGO, get_module_presence, NULL, XCVR_PRESENT); +static SENSOR_DEVICE_ATTR(xcvr_reset, S_IWUSR|S_IRUGO, get_module_reset, set_module_reset, XCVR_RESET); +static SENSOR_DEVICE_ATTR(xcvr_intr_status, S_IWUSR|S_IRUGO, get_module_intr_status, NULL, XCVR_INTR_STATUS); +static SENSOR_DEVICE_ATTR(xcvr_lpmode, S_IWUSR|S_IRUGO, get_module_lpmode, set_module_lpmode, XCVR_LPMODE); +static SENSOR_DEVICE_ATTR(xcvr_rxlos, S_IWUSR|S_IRUGO, get_module_rxlos, NULL, XCVR_RXLOS); +static SENSOR_DEVICE_ATTR(xcvr_txdisable, S_IWUSR|S_IRUGO, get_module_txdisable, set_module_txdisable, XCVR_TXDISABLE); +static SENSOR_DEVICE_ATTR(xcvr_txfault, S_IWUSR|S_IRUGO, get_module_txfault, NULL, XCVR_TXFAULT); + +/* List of all the xcvr attribute structures + * to get name, use sensor_dev_attr_<>.dev_attr.attr.name + * to get the id, use sensor_dev_attr_<>.dev_attr.index + */ +static struct sensor_device_attribute *xcvr_attr_list[MAX_XCVR_ATTRS] = { + &sensor_dev_attr_xcvr_present, + &sensor_dev_attr_xcvr_reset, + &sensor_dev_attr_xcvr_intr_status, + &sensor_dev_attr_xcvr_lpmode, + &sensor_dev_attr_xcvr_rxlos, + &sensor_dev_attr_xcvr_txdisable, + &sensor_dev_attr_xcvr_txfault, +}; + +static struct attribute *xcvr_attributes[MAX_XCVR_ATTRS] = {NULL}; + +static const struct attribute_group xcvr_group = { + .attrs = xcvr_attributes, +}; + +static int xcvr_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct xcvr_data *data; + int status =0; + int i,j,num; + XCVR_PDATA *xcvr_platform_data; + XCVR_ATTR *attr_data; + + if (client == NULL) { + pddf_dbg(XCVR, "NULL Client.. \n"); + goto exit; + } + + if (pddf_xcvr_ops.pre_probe) + { + status = (pddf_xcvr_ops.pre_probe)(client, dev_id); + if (status != 0) + goto exit; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct xcvr_data), GFP_KERNEL); + if (!data) { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->valid = 0; + /*data->index = dev_id->driver_data;*/ + + dev_info(&client->dev, "chip found\n"); + + /* Take control of the platform data */ + xcvr_platform_data = (XCVR_PDATA *)(client->dev.platform_data); + num = xcvr_platform_data->len; + data->index = xcvr_platform_data->idx - 1; + mutex_init(&data->update_lock); + + /* Add supported attr in the 'attributes' list */ + for (i=0; ixcvr_attrs + i; + for(j=0;jdev_attr.attr; + /*pddf_dbg(KERN_ERR "i:%d, j:%d, aptr->name: %s, attr_data->name: %s\n", i, j, aptr->name, attr_data->aname);*/ + + if (strncmp(aptr->name, attr_data->aname, strlen(attr_data->aname))==0) + break; + } + + if (jdev_attr.attr; + + } + xcvr_attributes[i] = NULL; + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &xcvr_group); + if (status) { + goto exit_free; + } + + data->xdev = hwmon_device_register(&client->dev); + if (IS_ERR(data->xdev)) { + status = PTR_ERR(data->xdev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: xcvr '%s'\n", + dev_name(data->xdev), client->name); + + /* Add a support for post probe function */ + if (pddf_xcvr_ops.post_probe) + { + status = (pddf_xcvr_ops.post_probe)(client, dev_id); + if (status != 0) + goto exit_remove; + } + + + return 0; + + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &xcvr_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int xcvr_remove(struct i2c_client *client) +{ + int ret = 0; + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *platdata = (XCVR_PDATA *)client->dev.platform_data; + XCVR_ATTR *platdata_sub = platdata->xcvr_attrs; + + if (pddf_xcvr_ops.pre_remove) + { + ret = (pddf_xcvr_ops.pre_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN pre_remove function failed\n"); + } + + hwmon_device_unregister(data->xdev); + sysfs_remove_group(&client->dev.kobj, &xcvr_group); + kfree(data); + + if (platdata_sub) { + pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } + + if (pddf_xcvr_ops.post_remove) + { + ret = (pddf_xcvr_ops.post_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN post_remove function failed\n"); + } + + return 0; +} + +enum xcvr_intf +{ + XCVR_CTRL_INTF, +}; + +static const struct i2c_device_id xcvr_ids[] = { + { "pddf_xcvr", XCVR_CTRL_INTF }, + {} +}; + +MODULE_DEVICE_TABLE(i2c, xcvr_ids); + +static struct i2c_driver xcvr_driver = { + /*.class = I2C_CLASS_HWMON,*/ + .driver = { + .name = "xcvr", + .owner = THIS_MODULE, + }, + .probe = xcvr_probe, + .remove = xcvr_remove, + .id_table = xcvr_ids, +}; + + +/*int __init xcvr_init(void)*/ +int xcvr_init(void) +{ + int ret = 0; + + if (pddf_xcvr_ops.pre_init) + { + ret = (pddf_xcvr_ops.pre_init)(); + if (ret!=0) + return ret; + } + + pddf_dbg(XCVR, KERN_ERR "PDDF XCVR DRIVER.. init Invoked..\n"); + ret = i2c_add_driver(&xcvr_driver); + if (ret!=0) + return ret; + + if (pddf_xcvr_ops.post_init) + { + ret = (pddf_xcvr_ops.post_init)(); + if (ret!=0) + return ret; + } + + return ret; +} +EXPORT_SYMBOL(xcvr_init); + +void __exit xcvr_exit(void) +{ + pddf_dbg(XCVR, "PDDF XCVR DRIVER.. exit\n"); + if (pddf_xcvr_ops.pre_exit) (pddf_xcvr_ops.pre_exit)(); + i2c_del_driver(&xcvr_driver); + if (pddf_xcvr_ops.post_exit) (pddf_xcvr_ops.post_exit)(); + +} +EXPORT_SYMBOL(xcvr_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("Driver for transceiver operations"); +MODULE_LICENSE("GPL"); + +/*#ifdef SONIC*/ +module_init(xcvr_init); +module_exit(xcvr_exit); +/*#endif*/ diff --git a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c new file mode 100644 index 000000000000..4186681e258e --- /dev/null +++ b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c @@ -0,0 +1,291 @@ +/* + * Copyright 2019 Broadcom. All rights reserved. + * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. + * + * A pddf kernel module to create i2C client for optics + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "pddf_client_defs.h" +#include "pddf_xcvr_defs.h" + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +extern void* get_device_table(char *name); +extern void delete_device_table(char *name); + +XCVR_DATA xcvr_data = {0}; + +/* XCVR CLIENT DATA */ +PDDF_DATA_ATTR(dev_idx, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&xcvr_data.idx, NULL); + +PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, (void*)&xcvr_data.xcvr_attr.aname, NULL); +PDDF_DATA_ATTR(attr_devtype, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 8, (void*)&xcvr_data.xcvr_attr.devtype, NULL); +PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&xcvr_data.xcvr_attr.devaddr, NULL); +PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&xcvr_data.xcvr_attr.offset, NULL); +PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&xcvr_data.xcvr_attr.mask, NULL); +PDDF_DATA_ATTR(attr_cmpval, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, sizeof(uint32_t), (void*)&xcvr_data.xcvr_attr.cmpval, NULL); +PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_INT_DEC, sizeof(int), (void*)&xcvr_data.xcvr_attr.len, NULL); +PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&xcvr_data, NULL); +PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&xcvr_data, (void*)&pddf_data); + + +static struct attribute *xcvr_attributes[] = { + &attr_dev_idx.dev_attr.attr, + + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL +}; + +static const struct attribute_group pddf_xcvr_client_data_group = { + .attrs = xcvr_attributes, +}; + + +static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + pdata->xcvr_attrs[pdata->len] = pdata->xcvr_attr; + pdata->len++; + memset(&pdata->xcvr_attr, 0, sizeof(pdata->xcvr_attr)); + + + return count; +} + +/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ +static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + int i = 0; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + + struct i2c_adapter *adapter; + struct i2c_board_info board_info; + struct i2c_client *client_ptr; + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + + /* Populate the platform data for xcvr */ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + if (strcmp(cdata->dev_type, "pddf_xcvr")==0) + { + int num = pdata->len; + XCVR_PDATA *xcvr_platform_data; + + adapter = i2c_get_adapter(cdata->parent_bus); + /* Allocate the xcvr_platform_data */ + xcvr_platform_data = (XCVR_PDATA *)kzalloc(sizeof(XCVR_PDATA), GFP_KERNEL); + xcvr_platform_data->xcvr_attrs = (XCVR_ATTR *)kzalloc(num*sizeof(XCVR_ATTR), GFP_KERNEL); + + + xcvr_platform_data->idx = pdata->idx; + xcvr_platform_data->len = pdata->len; + + for (i=0;ixcvr_attrs[i] = pdata->xcvr_attrs[i]; + } + + /* Verify that the data is written properly */ +#if 0 + pddf_dbg(XCVR, KERN_ERR "\n\n########### xcvr_platform_data - start ##########\n"); + pddf_dbg(XCVR, KERN_ERR "dev_idx: %d\n", xcvr_platform_data->idx); + pddf_dbg(XCVR, KERN_ERR "no_of_usr_attr: %d\n", xcvr_platform_data->len); + + for (i=0; ixcvr_attrs[i].aname); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_type: %s\n", xcvr_platform_data->xcvr_attrs[i].devtype); + pddf_dbg(XCVR, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].devaddr); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_offset: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].offset); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_mask: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].mask); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].cmpval); + pddf_dbg(XCVR, KERN_ERR "usr_attr_len: %d\n", xcvr_platform_data->xcvr_attrs[i].len); + } + pddf_dbg(XCVR, KERN_ERR "########### xcvr_platform_data - start ##########\n\n"); +#endif + + + board_info = (struct i2c_board_info) { + .platform_data = xcvr_platform_data, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ + client_ptr = i2c_new_device(adapter, &board_info); + //client_ptr = i2c_new_dummy(adapter, &board_info); + if (client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(XCVR, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if((strcmp(cdata->dev_type, "optoe1")==0) || (strcmp(cdata->dev_type, "optoe2")==0)) + { + + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = (struct i2c_board_info) { + .platform_data = (void *)NULL, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + + client_ptr = i2c_new_device(adapter, &board_info); + if(client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(XCVR, KERN_ERR "Created %s, type:%s client: 0x%x\n", cdata->i2c_name, cdata->dev_type, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + printk(KERN_ERR "Error creating a client %s on 0x%x, client_ptr:0x%x\n", board_info.type, board_info.addr, client_ptr); + goto free_data; + } + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(XCVR, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + pddf_dbg(XCVR, KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; + +free_data: + if (board_info.platform_data) + { + XCVR_PDATA *xcvr_platform_data = board_info.platform_data; + if (xcvr_platform_data->xcvr_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(xcvr_platform_data->xcvr_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(xcvr_platform_data); + } + +clear_data: + memset(pdata, 0, sizeof(XCVR_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; +} + +struct kobject *xcvr_kobj; +struct kobject *i2c_kobj; +int __init pddf_data_init(void) +{ + struct kobject *device_kobj; + int ret = 0; + + pddf_dbg(XCVR, KERN_ERR "XCVR PDDF MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + xcvr_kobj = kobject_create_and_add("xcvr", device_kobj); + if(!xcvr_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", xcvr_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(i2c_kobj); + kobject_put(xcvr_kobj); + return ret; + } + pddf_dbg(XCVR, "CREATED SFP I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(i2c_kobj, &pddf_xcvr_client_data_group); + if (ret) + { + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(xcvr_kobj); + return ret; + } + pddf_dbg(XCVR, "CREATED PDDF SFP DATA SYSFS GROUP\n"); + + return ret; +} + +void __exit pddf_data_exit(void) +{ + + pddf_dbg(XCVR, "XCVR PDDF MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_xcvr_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(xcvr_kobj); + pddf_dbg(XCVR, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'xcvr'\n",__FUNCTION__); + + return; +} + +module_init(pddf_data_init); +module_exit(pddf_data_exit); + +MODULE_AUTHOR("Broadcom"); +MODULE_DESCRIPTION("sfp platform data"); +MODULE_LICENSE("GPL"); + +/*#endif*/ diff --git a/platform/pddf/i2c/service/pddf-platform-init.service b/platform/pddf/i2c/service/pddf-platform-init.service new file mode 100755 index 000000000000..ccb8d1110fb7 --- /dev/null +++ b/platform/pddf/i2c/service/pddf-platform-init.service @@ -0,0 +1,13 @@ +[Unit] +Description=PDDF module and device initialization service +Before=pmon.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/pddf_util.py install +ExecStop=/usr/local/bin/pddf_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/pddf/i2c/setup.py b/platform/pddf/i2c/setup.py new file mode 100755 index 000000000000..b65c9f30bd11 --- /dev/null +++ b/platform/pddf/i2c/setup.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python + +from setuptools import setup +import os + +setup( + name='pddf-platform', + version='%s' % os.environ.get('PLATFORM_MODULE_VERSION', '1.0'), + description='Module consisting of generic drivers to initialize platform', + packages=[ + 'modules', + ], +) + diff --git a/platform/pddf/i2c/utils/pddf_util.py b/platform/pddf/i2c/utils/pddf_util.py new file mode 100755 index 000000000000..7d1759eeb4c2 --- /dev/null +++ b/platform/pddf/i2c/utils/pddf_util.py @@ -0,0 +1,450 @@ +#!/usr/bin/env python + + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes + switch-pddf : switch to pddf mode, installing pddf drivers and generating sysfs nodes + switch-nonpddf : switch to per platform, non-pddf mode +""" + +import os +import commands +import sys, getopt +import logging +import re +import subprocess +import shutil +import time +import json +import pddfparse +from collections import namedtuple + +PLATFORM_ROOT_PATH = '/usr/share/sonic/device' +SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen' +HWSKU_KEY = 'DEVICE_METADATA.localhost.hwsku' +PLATFORM_KEY = 'DEVICE_METADATA.localhost.platform' + +PROJECT_NAME = 'PDDF' +version = '1.1' +verbose = False +DEBUG = False +args = [] +ALL_DEVICE = {} +FORCE = 0 + +# Instantiate the class pddf_obj +pddf_obj = pddfparse.PddfParse() +try: + import pddf_switch_svc +except ImportError: + print "Unable to find pddf_switch_svc.py. PDDF might not be supported on this platform" + sys.exit() + + + +if DEBUG == True: + print sys.argv[0] + print 'ARGV :', sys.argv[1:] + +def main(): + global DEBUG + global args + global FORCE + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print options + print args + print len(sys.argv) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + do_install() + elif arg == 'clean': + do_uninstall() + elif arg == 'switch-pddf': + do_switch_pddf() + elif arg == 'switch-nonpddf': + do_switch_nonpddf() + else: + show_help() + + return 0 + +def show_help(): + print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]} + sys.exit(0) + +def my_log(txt): + if DEBUG == True: + print "[PDDF]"+txt + return + +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + status, output = commands.getstatusoutput(cmd) + my_log (cmd +"with result:" + str(status)) + my_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +def driver_check(): + ret, lsmod = log_os_system("lsmod| grep pddf", 0) + logging.info('mods:'+lsmod) + if len(lsmod) ==0: + return False + return True + +kos = [ +'modprobe i2c-ismt', +'modprobe i2c-i801', +'modprobe i2c_dev', +'modprobe i2c_mux_pca954x force_deselect_on_exit=1', +'modprobe pddf_client_module' , +'modprobe optoe' , +'modprobe pddf_cpld_module' , +'modprobe pddf_xcvr_module', +'modprobe pddf_mux_module' , +'modprobe pddf_cpld_driver' , +'modprobe pddf_xcvr_driver_module' , +'modprobe pddf_psu_driver_module' , +'modprobe pddf_psu_module' , +'modprobe pddf_fan_driver_module' , +#'modprobe -f platform_pddf_fan' , +'modprobe pddf_fan_module' , +'modprobe pddf_led_module' , +'modprobe pddf_sysstatus_module' +] + +devs = [] + +# Returns platform and HW SKU +def get_platform_and_hwsku(): + try: + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + platform = stdout.rstrip('\n') + + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + hwsku = stdout.rstrip('\n') + except OSError, e: + raise OSError("Cannot detect platform") + + return (platform, hwsku) + +def get_path_to_device(): + # Get platform and hwsku + (platform, hwsku) = get_platform_and_hwsku() + + # Load platform module from source + platform_path = "/".join([PLATFORM_ROOT_PATH, platform]) + hwsku_path = "/".join([platform_path, hwsku]) + + return platform_path + +def get_path_to_pddf_plugin(): + pddf_path = "/".join([PLATFORM_ROOT_PATH, "pddf/plugins"]) + return pddf_path + +def config_pddf_utils(): + device_path = get_path_to_device() + device_plugin_path = "/".join([device_path, "plugins"]) + pddf_path = get_path_to_pddf_plugin() + backup_path = "/".join([device_plugin_path, "orig"]) + + if os.path.exists(backup_path) is False: + os.mkdir(backup_path) + log_os_system("mv "+device_plugin_path+"/*.*"+" "+backup_path, 0) + + for item in os.listdir(pddf_path): + shutil.copy(pddf_path+"/"+item, device_plugin_path+"/"+item) + + shutil.copy('/usr/local/bin/pddfparse.py', device_plugin_path+"/pddfparse.py") + # Take a backup of orig fancontrol + if os.path.exists(device_path+"/fancontrol"): + log_os_system("mv "+device_path+"/fancontrol"+" "+device_path+"/fancontrol.bak", 0) + #print "***Created fancotnrol.bak" + + # Create a link to fancontrol of PDDF + if os.path.exists(device_path+"/pddf/fancontrol") and not os.path.exists(device_path+"/fancontrol"): + shutil.copy(device_path+"/pddf/fancontrol",device_path+"/fancontrol") + #print "*** Copied the pddf fancontrol file " + + return 0 + +def cleanup_pddf_utils(): + device_path = get_path_to_device() + device_plugin_path = "/".join([device_path, "plugins"]) + + backup_path = "/".join([device_plugin_path, "orig"]) + if os.path.exists(backup_path) is True: + for item in os.listdir(device_plugin_path): + if os.path.isdir(device_plugin_path+"/"+item) is False: + os.remove(device_plugin_path+"/"+item) + + status = log_os_system("mv "+backup_path+"/*"+" "+device_plugin_path, 1) + os.rmdir(backup_path) + else: + print "\nERR: Unable to locate original device files...\n" + + if os.path.exists(device_path+"/fancontrol"): + os.remove(device_path+"/fancontrol") + #print "Removed the fancontrol" + + if os.path.exists(device_path+"/fancontrol.bak"): + log_os_system("mv "+device_path+"/fancontrol.bak"+" "+device_path+"/fancontrol", 0) + #print "***Moved fancotnrol.bak to fancontrol" + + return 0 + +def create_pddf_log_files(): + if not os.path.exists('/var/log/pddf'): + log_os_system("sudo mkdir /var/log/pddf", 1) + + log_os_system("sudo touch /var/log/pddf/led.txt", 1) + log_os_system("sudo touch /var/log/pddf/psu.txt", 1) + log_os_system("sudo touch /var/log/pddf/fan.txt", 1) + log_os_system("sudo touch /var/log/pddf/xcvr.txt", 1) + log_os_system("sudo touch /var/log/pddf/sysstatus.txt", 1) + log_os_system("sudo touch /var/log/pddf/cpld.txt", 1) + log_os_system("sudo touch /var/log/pddf/client.txt", 1) + log_os_system("sudo touch /var/log/pddf/mux.txt", 1) + +def driver_install(): + global FORCE + status, output = log_os_system("depmod", 1) + for i in range(0,len(kos)): + status, output = log_os_system(kos[i], 1) + if status: + if FORCE == 0: + return status + + output = config_pddf_utils() + + return 0 + +def driver_uninstall(): + global FORCE + + status = cleanup_pddf_utils() + + for i in range(0,len(kos)): + rm = kos[-(i+1)].replace("modprobe", "modprobe -rq") + rm = rm.replace("insmod", "rmmod") + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + return 0 + +def device_install(): + global FORCE + # trigger the pddf_obj script for FAN, PSU, CPLD, MUX, etc + status = pddf_obj.create_pddf_devices() + if status: + if FORCE == 0: + return status + return + +def device_uninstall(): + global FORCE + # Trigger the paloparse script for deletion of FAN, PSU, OPTICS, CPLD clients + status = pddf_obj.delete_pddf_devices() + if status: + if FORCE == 0: + return status + return + +def do_install(): + print "Checking system...." + if not os.path.exists('/usr/share/sonic/platform/pddf_support'): + print PROJECT_NAME.upper() +" mode is not enabled" + return + + if driver_check()== False : + print PROJECT_NAME.upper() +" has no PDDF driver installed...." + create_pddf_log_files() + print "Installing...." + status = driver_install() + if status: + return status + else: + print PROJECT_NAME.upper() +" drivers detected...." + + print "Creating devices ..." + status = device_install() + if status: + return status + + return + +def do_uninstall(): + print "Checking system...." + if not os.path.exists('/usr/share/sonic/platform/pddf_support'): + print PROJECT_NAME.upper() +" mode is not enabled" + return + + + if os.path.exists('/var/log/pddf'): + print "Remove pddf log files....." + log_os_system("sudo rm -rf /var/log/pddf", 1) + + print "Remove all the devices..." + status = device_uninstall() + if status: + return status + + + if driver_check()== False : + print PROJECT_NAME.upper() +" has no PDDF driver installed...." + else: + print "Removing installed driver...." + status = driver_uninstall() + if status: + if FORCE == 0: + return status + return + +def do_switch_pddf(): + print "Check the pddf support..." + status = pddf_switch_svc.check_pddf_support() + if not status: + print "PDDF is not supported on this platform" + return status + + + print "Checking system...." + if os.path.exists('/usr/share/sonic/platform/pddf_support'): + print PROJECT_NAME.upper() +" system is already in pddf mode...." + else: + print "Stopping the pmon service ..." + status, output = log_os_system("systemctl stop pmon.service", 1) + if status: + if FORCE==0: + return status + + print "Stopping the platform services.." + status = pddf_switch_svc.stop_platform_svc() + if not status: + if FORCE==0: + return status + + print "Creating the pddf_support file..." + if os.path.exists('/usr/share/sonic/platform'): + status, output = log_os_system("touch /usr/share/sonic/platform/pddf_support", 1) + else: + print "/usr/share/sonic/platform path doesnt exist. Unable to set pddf mode" + return -1 + + print "Starting the PDDF platform service..." + status = pddf_switch_svc.start_platform_pddf() + if not status: + if FORCE==0: + return status + + print "Disabling the 'skip_fand' from pmon daemon control script..." + if os.path.exists('/usr/share/sonic/platform/pmon_daemon_control.json'): + with open('/usr/share/sonic/platform/pmon_daemon_control.json','r') as fr: + data = json.load(fr) + if 'skip_fand' in data.keys(): + old_val = data['skip_fand'] + if old_val: + data['skip_fand'] = False + with open('/usr/share/sonic/platform/pmon_daemon_control.json','w') as fw: + json.dump(data,fw) + + print "Restart the pmon service ..." + status, output = log_os_system("systemctl start pmon.service", 1) + if status: + if FORCE==0: + return status + + return + +def do_switch_nonpddf(): + print "Checking system...." + if not os.path.exists('/usr/share/sonic/platform/pddf_support'): + print PROJECT_NAME.upper() +" system is already in non-pddf mode...." + else: + print "Stopping the pmon service ..." + status, output = log_os_system("systemctl stop pmon.service", 1) + if status: + if FORCE==0: + return status + + print "Stopping the PDDF platform service..." + status = pddf_switch_svc.stop_platform_pddf() + if not status: + if FORCE==0: + return status + + print "Removing the pddf_support file..." + if os.path.exists('/usr/share/sonic/platform'): + status, output = log_os_system("rm -f /usr/share/sonic/platform/pddf_support", 1) + else: + print "/usr/share/sonic/platform path doesnt exist. Unable to set non-pddf mode" + return -1 + + print "Starting the platform services..." + status = pddf_switch_svc.start_platform_svc() + if not status: + if FORCE==0: + return status + + print "Enabeling the 'skip_fand' from pmon startup script..." + if os.path.exists('/usr/share/sonic/platform/pmon_daemon_control.json'): + with open('/usr/share/sonic/platform/pmon_daemon_control.json','r') as fr: + data = json.load(fr) + if 'skip_fand' in data.keys(): + old_val = data['skip_fand'] + if not old_val: + data['skip_fand'] = True + with open('/usr/share/sonic/platform/pmon_daemon_control.json','w') as fw: + json.dump(data,fw) + + print "Restart the pmon service ..." + status, output = log_os_system("systemctl start pmon.service", 1) + if status: + if FORCE==0: + return status + + return + +if __name__ == "__main__": + main() diff --git a/platform/pddf/i2c/utils/pddfparse.py b/platform/pddf/i2c/utils/pddfparse.py new file mode 100755 index 000000000000..f0501984b6b6 --- /dev/null +++ b/platform/pddf/i2c/utils/pddfparse.py @@ -0,0 +1,1276 @@ +#!/usr/bin/env python +import sys +import json +import re +import argparse +import subprocess +import glob +import os +from jsonschema import validate + + +cache={} +SONIC_CFGGEN_PATH = '/usr/local/bin/sonic-cfggen' +HWSKU_KEY = 'DEVICE_METADATA.localhost.hwsku' +PLATFORM_KEY = 'DEVICE_METADATA.localhost.platform' + +dirname=os.path.dirname(os.path.realpath(__file__)) + + + + +class PddfParse(): + def __init__(self): + if not os.path.exists("/usr/share/sonic/platform"): + self.platform, self.hwsku = self.get_platform_and_hwsku() + os.symlink("/usr/share/sonic/device/"+self.platform, "/usr/share/sonic/platform") + + try: + with open('/usr/share/sonic/platform/pddf/pddf-device.json') as f: + self.data = json.load(f) + except IOError: + #print "Error - required JSON file not found" + if os.path.exists('/usr/share/sonic/platform'): + os.unlink("/usr/share/sonic/platform") + + + self.data_sysfs_obj={} + self.sysfs_obj={} + + + # Returns platform and HW SKU + def get_platform_and_hwsku(self): + try: + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-H', '-v', PLATFORM_KEY], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + platform = stdout.rstrip('\n') + + proc = subprocess.Popen([SONIC_CFGGEN_PATH, '-d', '-v', HWSKU_KEY], + stdout=subprocess.PIPE, + shell=False, + stderr=subprocess.STDOUT) + stdout = proc.communicate()[0] + proc.wait() + hwsku = stdout.rstrip('\n') + except OSError, e: + raise OSError("Cannot detect platform") + + return (platform, hwsku) + + ################################################################################################################################# + # GENERIC DEFS + ################################################################################################################################# + def runcmd(self, cmd): + #print cmd + if os.system(cmd)!=0: + print "%s -- command failed"%cmd + return + + def get_dev_idx(self, dev, ops): + parent=dev['dev_info']['virt_parent'] + pdev=self.data[parent] + + return pdev['dev_attr']['dev_idx'] + + + def get_path(self, target, attr): + aa = target + attr + + if aa in cache: + return cache[aa] + + op={ "cmd": "show_attr", "target":target, "attr":attr } + #print self.data[target] + str = self.dev_parse(self.data[target], op) + #print "[test] str is %s" %str + str = str.rstrip('\n') + cache[aa]=str + return str + + + def get_device_type(self, key): + return self.data[key]['dev_info']['device_type'] + + def get_platform(self): + return self.data['PLATFORM'] + + def get_num_psu_fans(self, dev): + if not dev in self.data.keys(): + return 0 + + if not 'num_psu_fans' in self.data[dev]['dev_attr']: + return 0 + + return self.data[dev]['dev_attr']['num_psu_fans'] + + ################################################################################################################################# + # CREATE DEFS + ################################################################################################################################# + def create_device(self, attr, path, ops): + + for key in attr.keys(): + cmd="echo '%s' > /sys/kernel/%s/%s"%(attr[key], path, key) + self.runcmd(cmd) + + def create_psu_i2c_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PSU']: + self.create_device(dev['i2c']['topo_info'], "pddf/devices/psu/i2c", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/psu/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd= "echo '%s' > /sys/kernel/pddf/devices/psu/i2c/psu_idx"%( self.get_dev_idx(dev, ops)) + self.runcmd(cmd) + for attr in dev['i2c']['attr_list']: + self.create_device(attr, "pddf/devices/psu/i2c", ops) + cmd= "echo 'add' > /sys/kernel/pddf/devices/psu/i2c/attr_ops" + self.runcmd(cmd) + #print "" + + cmd = "echo 'add' > /sys/kernel/pddf/devices/psu/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd = "echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + + ##os.system("sleep 1") + + + def create_psu_bmc_device(self, dev, ops): + print "" + + + def create_psu_device(self, dev, ops): + #if 'i2c' in dev: + self.create_psu_i2c_device(dev, ops ) + return + + #if 'bmc' in dev: + #self.create_psu_bmc_device(dev) + + def create_fan_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['FAN']: + self.create_device(dev['i2c']['topo_info'], "pddf/devices/fan/i2c", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/fan/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + self.create_device(dev['i2c']['dev_attr'], "pddf/devices/fan/i2c", ops) + for attr in dev['i2c']['attr_list']: + self.create_device(attr, "pddf/devices/fan/i2c", ops) + cmd= "echo 'add' > /sys/kernel/pddf/devices/fan/i2c/attr_ops" + self.runcmd(cmd) + #print "" + + cmd= "echo 'add' > /sys/kernel/pddf/devices/fan/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd= "echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + def create_temp_sensor_device(self, dev, ops): + # NO PDDF driver for temp_sensors device + #if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['TEMP_SENSOR']: + #create_device(dev['i2c']['topo_info'], "pddf/devices/fan/i2c", ops) + #create_device(dev['i2c']['dev_attr'], "pddf/devices/fan/i2c", ops) + #for attr in dev['i2c']['attr_list']: + #create_device(attr, "pddf/devices/fan/i2c", ops) + #print "echo 'add' > /sys/kernel/pddf/devices/fan/i2c/attr_ops\n" + + #print "echo 'add' > /sys/kernel/pddf/devices/fan/i2c/dev_ops\n" + #else: + cmd= "echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + + def create_cpld_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['CPLD']: + self.create_device(dev['i2c']['topo_info'], "pddf/devices/cpld", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/cpld/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + #create_device(dev['i2c']['dev_attr'], "pddf/devices/cpld", ops) + # TODO: If attributes are provided then, use 'self.create_device' for them too + cmd= "echo 'add' > /sys/kernel/pddf/devices/cpld/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd= "echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + + def create_mux_device(self, dev, ops): + self.create_device(dev['i2c']['topo_info'], "pddf/devices/mux", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/mux/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + self.create_device(dev['i2c']['dev_attr'], "pddf/devices/mux", ops) + cmd= "echo 'add' > /sys/kernel/pddf/devices/mux/dev_ops" + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def create_xcvr_i2c_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PORT_MODULE']: + self.create_device(dev['i2c']['topo_info'], "pddf/devices/xcvr/i2c", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/xcvr/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + #create_device(dev['i2c']['dev_attr'], "pddf/devices/psu/i2c") + cmd="echo '%s' > /sys/kernel/pddf/devices/xcvr/i2c/dev_idx"%( self.get_dev_idx(dev, ops)) + self.runcmd(cmd) + for attr in dev['i2c']['attr_list']: + self.create_device(attr, "pddf/devices/xcvr/i2c", ops) + cmd="echo 'add' > /sys/kernel/pddf/devices/xcvr/i2c/attr_ops" + self.runcmd(cmd) + #print "" + + cmd="echo 'add' > /sys/kernel/pddf/devices/xcvr/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd="echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + def create_xcvr_bmc_device(self, dev, ops): + print "" + + def create_xcvr_device(self, dev, ops): + #if 'i2c' in dev: + self.create_xcvr_i2c_device(dev, ops ) + return + #if 'bmc' in dev: + #self.create_psu_bmc_device(dev) + + def create_sysstatus_device(self, dev, ops): + for attr in dev['attr_list']: + self.create_device(attr, "pddf/devices/sysstatus", ops) + cmd= "echo 'add' > /sys/kernel/pddf/devices/sysstatus/attr_ops" + self.runcmd(cmd) + #print "\n" + + def create_eeprom_device(self, dev, ops): + if "EEPROM" in self.data['PLATFORM']['drivers'] and dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['EEPROM']: + self.create_device(dev['i2c']['topo_info'], "pddf/devices/eeprom/i2c", ops) + cmd= "echo '%s' > /sys/kernel/pddf/devices/eeprom/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + self.create_device(dev['i2c']['dev_attr'], "pddf/devices/eeprom/i2c", ops) + cmd = "echo 'add' > /sys/kernel/pddf/devices/eeprom/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + + else: + cmd= "echo %s 0x%x > /sys/bus/i2c/devices/i2c-%d/new_device" % (dev['i2c']['topo_info']['dev_type'], int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + ################################################################################################################################# + # DELETE DEFS + ################################################################################################################################# + def delete_eeprom_device(self, dev, ops): + if "EEPROM" in self.data['PLATFORM']['drivers'] and dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['EEPROM']: + cmd= "echo '%s' > /sys/kernel/pddf/devices/eeprom/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd = "echo 'delete' > /sys/kernel/pddf/devices/eeprom/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd= "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def delete_sysstatus_device(self, dev, ops): + # NOT A PHYSICAL DEVICE.... rmmod on module would remove all the artifacts + pass + + #for attr in dev['attr_list']: + #cmd= "echo '%s' > /sys/kernel/pddf/devices/sysstatus/i2c_name"%(dev['dev_info']['device_name']) + #self.runcmd(cmd) + #cmd= "echo 'delete' > /sys/kernel/pddf/devices/sysstatus/attr_ops" + #self.runcmd(cmd) + + def delete_xcvr_i2c_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PORT_MODULE']: + cmd= "echo '%s' > /sys/kernel/pddf/devices/xcvr/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd="echo 'delete' > /sys/kernel/pddf/devices/xcvr/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd="echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def delete_xcvr_device(self, dev, ops): + self.delete_xcvr_i2c_device(dev, ops) + return + + def delete_mux_device(self, dev, ops): + cmd= "echo '%s' > /sys/kernel/pddf/devices/mux/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd= "echo 'delete' > /sys/kernel/pddf/devices/mux/dev_ops" + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def delete_cpld_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['CPLD']: + cmd= "echo '%s' > /sys/kernel/pddf/devices/cpld/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd= "echo 'delete' > /sys/kernel/pddf/devices/cpld/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd= "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def delete_temp_sensor_device(self, dev, ops): + # NO PDDF driver for temp_sensors device + #if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['TEMP_SENSOR']: + #cmd= "echo '%s' > /sys/kernel/pddf/devices/temp_sensor/i2c/i2c_name"%(dev['dev_info']['device_name']) + #self.runcmd(cmd) + #cmd= "echo 'add' > /sys/kernel/pddf/devices/temp_sensor/i2c/dev_ops" + #self.runcmd(cmd) + #else: + cmd= "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + + #os.system("sleep 1") + + def delete_fan_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['FAN']: + cmd= "echo '%s' > /sys/kernel/pddf/devices/fan/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd= "echo 'delete' > /sys/kernel/pddf/devices/fan/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd= "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + + def delete_psu_i2c_device(self, dev, ops): + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PSU']: + cmd= "echo '%s' > /sys/kernel/pddf/devices/psu/i2c/i2c_name"%(dev['dev_info']['device_name']) + self.runcmd(cmd) + cmd = "echo 'delete' > /sys/kernel/pddf/devices/psu/i2c/dev_ops" + self.runcmd(cmd) + #print "\n" + else: + cmd = "echo 0x%x > /sys/bus/i2c/devices/i2c-%d/delete_device" % (int(dev['i2c']['topo_info']['dev_addr'], 0), int(dev['i2c']['topo_info']['parent_bus'], 0)) + self.runcmd(cmd) + #print "\n" + #os.system("sleep 1") + + def delete_psu_device(self, dev, ops): + #if 'i2c' in dev: + self.delete_psu_i2c_device(dev, ops ) + return + + + ################################################################################################################################# + # SHOW ATTRIBIUTES DEFS + ################################################################################################################################# + def is_led_device_configured(self, device_name, index): + for key in self.data.keys(): + if key != 'PLATFORM': + dev_info=self.data[key]['dev_info'] + if dev_info['device_type'] == 'LED': + attr=self.data[key]['dev_attr'] + if((device_name==dev_info['device_name']) and (index==attr['index'])): + return(True) + + return (False) + + def show_device_sysfs(self, dev, ops): + parent=dev['dev_info']['device_parent'] + #print parent + pdev=self.data[parent] + if pdev['dev_info']['device_parent'] == 'SYSTEM': + return "/sys/bus/i2c/devices/"+"i2c-%d"%int(pdev['i2c']['topo_info']['dev_addr'], 0) + return self.show_device_sysfs(pdev, ops) + "/" + "i2c-%d" % int(dev['i2c']['topo_info']['parent_bus'], 0) + + + # This is alid for 'at24' type of EEPROM devices. Only one attribtue 'eeprom' + def show_attr_eeprom_device(self, dev, ops): + str = "" + attr_name=ops['attr'] + attr_list=dev['i2c']['attr_list'] + KEY="eeprom" + dsysfs_path="" + + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all': + #print self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%attr['attr_name'] + if 'drv_attr_name' in attr.keys(): + real_name = attr['drv_attr_name'] + else: + real_name = attr['attr_name'] + + dsysfs_path = self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%real_name + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + str += dsysfs_path+"\n" + return str + + + def show_attr_mux_device(self, dev, ops): + ret = "" + KEY="mux" + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + return ret + + def show_attr_psu_i2c_device(self, dev, ops): + target=ops['target'] + attr_name=ops['attr'] + str = "" + KEY="psu" + dsysfs_path="" + + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + if target == 'all' or target == dev['dev_info']['virt_parent'] : + attr_list=dev['i2c']['attr_list'] + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all' : + #print self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%attr['attr_name'] + if 'drv_attr_name' in attr.keys(): + real_name = attr['drv_attr_name'] + else: + real_name = attr['attr_name'] + + dsysfs_path = self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%real_name + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + str += dsysfs_path+"\n" + return str + + + def show_attr_psu_device(self, dev, ops): + return self.show_attr_psu_i2c_device(dev, ops ) + + + def show_attr_fan_device(self, dev, ops): + str = "" + attr_name=ops['attr'] + attr_list=dev['i2c']['attr_list'] + KEY="fan" + dsysfs_path="" + + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all': + #print self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%attr['attr_name'] + if 'drv_attr_name' in attr.keys(): + real_name = attr['drv_attr_name'] + else: + real_name = attr['attr_name'] + + dsysfs_path= self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%real_name + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + str += dsysfs_path+"\n" + return str + + # This is only valid for LM75 + def show_attr_temp_sensor_device(self, dev, ops): + str = "" + attr_name=ops['attr'] + attr_list=dev['i2c']['attr_list'] + KEY="temp-sensors" + dsysfs_path="" + + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all': + path = self.show_device_sysfs(dev, ops)+"/%d-00%x/" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0)) + #print glob.glob(path+'hwmon/hwmon*/'+attr['attr_name']) + if 'drv_attr_name' in attr.keys(): + real_name = attr['drv_attr_name'] + else: + real_name = attr['attr_name'] + + if (os.path.exists(path)): + full_path = glob.glob(path + 'hwmon/hwmon*/' + real_name)[0] + #full_path = path + 'hwmon/hwmon/' + attr['attr_name'] + dsysfs_path=full_path + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + str += full_path + "\n" + return str + + def show_attr_sysstatus_device(self, dev, ops): + ret = "" + attr_name=ops['attr'] + attr_list=dev['attr_list'] + KEY="sys-status" + dsysfs_path="" + + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all': + dsysfs_path = "/sys/kernel/pddf/devices/sysstatus/sysstatus_data/" + attr['attr_name'] + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + #print path + ret += dsysfs_path+"\n" + return ret + + + def show_attr_xcvr_i2c_device(self, dev, ops): + target=ops['target'] + attr_name=ops['attr'] + str = "" + dsysfs_path = "" + KEY="xcvr" + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + if target == 'all' or target == dev['dev_info']['virt_parent'] : + attr_list=dev['i2c']['attr_list'] + for attr in attr_list: + if attr_name == attr['attr_name'] or attr_name == 'all' : + if 'drv_attr_name' in attr.keys(): + real_name = attr['drv_attr_name'] + else: + real_name = attr['attr_name'] + + dsysfs_path = self.show_device_sysfs(dev, ops)+"/%d-00%x" %(int(dev['i2c']['topo_info']['parent_bus'], 0), int(dev['i2c']['topo_info']['dev_addr'], 0))+"/%s"%real_name + if not dsysfs_path in self.data_sysfs_obj[KEY]: + self.data_sysfs_obj[KEY].append(dsysfs_path) + str += dsysfs_path+"\n" + return str + + + def show_attr_xcvr_device(self, dev, ops): + return self.show_attr_xcvr_i2c_device(dev, ops ) + + def show_attr_cpld_device(self, dev, ops): + ret = "" + KEY="cpld" + if not KEY in self.data_sysfs_obj: + self.data_sysfs_obj[KEY]=[] + + return ret + + + ################################################################################################################################# + # SHOW DEFS + ################################################################################################################################# + def check_led_cmds(self, key, ops): + name = ops['target']+'_LED' + if (ops['target']=='config' or ops['attr']=='all') or (name==self.data[key]['dev_info']['device_name'] and ops['attr']==self.data[key]['dev_attr']['index']): + return (True) + else: + return (False) + + def dump_sysfs_obj(self, obj, key_type): + if (key_type == 'keys'): + for key in obj.keys(): + print key + return + + for key in obj: + if (key == key_type or key_type == 'all'): + print key+":" + for entry in obj[key]: + print "\t"+entry + + def add_list_sysfs_obj(self, obj, KEY, list): + for sysfs in list: + if not sysfs in obj[KEY]: + obj[KEY].append(sysfs) + + def sysfs_attr(self, key, value, path, obj, obj_key): + sysfs_path="/sys/kernel/%s/%s"%(path, key) + if not sysfs_path in obj[obj_key]: + obj[obj_key].append(sysfs_path) + + + def sysfs_device(self, attr, path, obj, obj_key): + for key in attr.keys(): + sysfs_path="/sys/kernel/%s/%s"%(path, key) + if not sysfs_path in obj[obj_key]: + obj[obj_key].append(sysfs_path) + + def show_eeprom_device(self, dev, ops): + return + + + def show_mux_device(self, dev, ops): + KEY ='mux' + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + self.sysfs_device(dev['i2c']['topo_info'], "pddf/devices/mux", self.sysfs_obj, KEY) + self.sysfs_device(dev['i2c']['dev_attr'], "pddf/devices/mux", self.sysfs_obj, KEY) + sysfs_path= "/sys/kernel/pddf/devices/mux/dev_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + list=['/sys/kernel/pddf/devices/mux/i2c_type', + '/sys/kernel/pddf/devices/mux/i2c_name', + '/sys/kernel/pddf/devices/mux/error'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def show_psu_i2c_device(self, dev, ops): + KEY ='psu' + path='pddf/devices/psu/i2c' + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PSU']: + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + self.sysfs_device(dev['i2c']['topo_info'], path, self.sysfs_obj, KEY) + sysfs_path = "/sys/kernel/pddf/devices/psu/i2c/psu_idx" + self.sysfs_obj[KEY].append(sysfs_path) + + for attr in dev['i2c']['attr_list']: + self.sysfs_device(attr, "pddf/devices/psu/i2c", self.sysfs_obj, KEY) + sysfs_path = "/sys/kernel/pddf/devices/psu/i2c/dev_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + list=['/sys/kernel/pddf/devices/psu/i2c/i2c_type', + '/sys/kernel/pddf/devices/fan/i2c/i2c_name', + '/sys/kernel/pddf/devices/psu/i2c/error', + '/sys/kernel/pddf/devices/psu/i2c/attr_ops'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def show_psu_device(self, dev, ops): + self.show_psu_i2c_device(dev, ops ) + return + + def show_client_device(self): + KEY ='client' + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + list=['/sys/kernel/pddf/devices/showall'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def show_fan_device(self, dev, ops): + KEY ='fan' + path='pddf/devices/fan/i2c' + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['FAN']: + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + + self.sysfs_device(dev['i2c']['topo_info'], path, self.sysfs_obj, KEY) + self.sysfs_device(dev['i2c']['dev_attr'], path, self.sysfs_obj, KEY) + for attr in dev['i2c']['attr_list']: + self.sysfs_device(attr, path, self.sysfs_obj, KEY) + list=['/sys/kernel/pddf/devices/fan/i2c/i2c_type', + '/sys/kernel/pddf/devices/fan/i2c/i2c_name', + '/sys/kernel/pddf/devices/fan/i2c/error', + '/sys/kernel/pddf/devices/fan/i2c/attr_ops', + '/sys/kernel/pddf/devices/fan/i2c/dev_ops'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def show_temp_sensor_device(self, dev, ops): + #path= "/sys/bus/i2c/devices/i2c-%d/new_device\n" % (int(dev['i2c']['topo_info']['parent_bus'], 0)) + #print "temp: "+ path + return + + def show_sysstatus_device(self, dev, ops): + KEY ='sysstatus' + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + for attr in dev['attr_list']: + self.sysfs_device(attr, "pddf/devices/sysstatus", self.sysfs_obj, KEY) + sysfs_path= "/sys/kernel/pddf/devices/sysstatus/attr_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + + + def show_xcvr_i2c_device(self, dev, ops): + KEY ='xcvr' + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PORT_MODULE']: + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + self.sysfs_device(dev['i2c']['topo_info'], "pddf/devices/xcvr/i2c", self.sysfs_obj, KEY) + + for attr in dev['i2c']['attr_list']: + self.sysfs_device(attr, "pddf/devices/xcvr/i2c", self.sysfs_obj, KEY) + sysfs_path = "/sys/kernel/pddf/devices/xcvr/i2c/dev_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + list=['/sys/kernel/pddf/devices/xcvr/i2c/i2c_type', + '/sys/kernel/pddf/devices/xcvr/i2c/i2c_name', + '/sys/kernel/pddf/devices/xcvr/i2c/error', + '/sys/kernel/pddf/devices/xcvr/i2c/attr_ops'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def show_xcvr_device(self, dev, ops): + self.show_xcvr_i2c_device(dev, ops ) + return + + def show_cpld_device(self, dev, ops): + KEY ='cpld' + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['CPLD']: + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + self.sysfs_device(dev['i2c']['topo_info'], "pddf/devices/cpld", self.sysfs_obj, KEY) + sysfs_path= "/sys/kernel/pddf/devices/cpld/dev_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + list=['/sys/kernel/pddf/devices/cpld/i2c_type', + '/sys/kernel/pddf/devices/cpld/i2c_name', + '/sys/kernel/pddf/devices/cpld/error'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + def show_led_platform_device(self, key, ops): + if ops['attr']=='all' or ops['attr']=='PLATFORM': + KEY='platform' + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + path='pddf/devices/platform' + self.sysfs_attr('num_psus', self.data['PLATFORM']['num_psus'], path, self.sysfs_obj, KEY) + self.sysfs_attr('num_fans', self.data['PLATFORM']['num_fans'], path, self.sysfs_obj, KEY) + + def show_led_device(self, key, ops): + if self.check_led_cmds(key, ops): + KEY='led' + if not KEY in self.sysfs_obj: + self.sysfs_obj[KEY] = [] + path="pddf/devices/led" + for attr in self.data[key]['i2c']['attr_list']: + self.sysfs_attr('device_name', self.data[key]['dev_info']['device_name'], path, self.sysfs_obj, KEY) + self.sysfs_attr('swpld_addr', self.data[key]['dev_info']['device_name'], path, self.sysfs_obj, KEY) + self.sysfs_attr('swpld_addr_offset', self.data[key]['dev_info']['device_name'], path, self.sysfs_obj, KEY) + self.sysfs_device(self.data[key]['dev_attr'], path, self.sysfs_obj, KEY) + for attr_key in attr.keys(): + attr_path="pddf/devices/led/" + attr['attr_name'] + if (attr_key != 'attr_name' and attr_key != 'swpld_addr' and attr_key != 'swpld_addr_offset'): + self.sysfs_attr(attr_key, attr[attr_key], attr_path, self.sysfs_obj, KEY) + sysfs_path="/sys/kernel/pddf/devices/led/dev_ops" + if not sysfs_path in self.sysfs_obj[KEY]: + self.sysfs_obj[KEY].append(sysfs_path) + list=['/sys/kernel/pddf/devices/led/cur_state/color', + '/sys/kernel/pddf/devices/led/cur_state/color_state'] + self.add_list_sysfs_obj(self.sysfs_obj, KEY, list) + + + def validate_xcvr_device(self, dev, ops): + devtype_list = ['optoe1', 'optoe2'] + dev_addr_list = ['0x50', '0x51', '0x53'] + dev_attribs = ['xcvr_present', 'xcvr_reset', 'xcvr_intr_status', 'xcvr_lpmode'] + ret_val = "xcvr validation failed" + + if dev['i2c']['topo_info']['dev_type'] in devtype_list: + for attr in dev['i2c']['attr_list']: + if 'attr_name' in attr.keys() and 'eeprom' in attr.values(): + ret_val = "xcvr validation success" + else: + print "xcvr validation Failed" + return + + elif dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PORT_MODULE']: + for attr in dev['i2c']['attr_list']: + #if 'attr_name' in attr.keys() and 'xcvr_present' in attr.values(): + if attr.get("attr_name") in dev_attribs: + ret_val = "Success" + else: + print "xcvr validation Failed" + return + print ret_val + + def validate_eeprom_device(self, dev, ops): + devtype_list = ['24c02'] + dev_access_mode = ['BLOCK', 'BYTE'] + dev_attribs = ['eeprom'] + ret_val = "eeprom failed" + + if dev['i2c']['topo_info']['dev_type'] in devtype_list: + if dev['i2c']['dev_attr']['access_mode'] in dev_access_mode: + for attr in dev['i2c']['attr_list']: + if attr.get("attr_name") in dev_attribs: + ret_val = "eeprom success" + print ret_val + + def validate_mux_device(self, dev, ops): + devtype_list = ['pca9548', 'pca954x'] + dev_channels = ["0", "1", "2", "3", "4", "5", "6", "7"] + ret_val = "mux failed" + + if dev['i2c']['topo_info']['dev_type'] in devtype_list: + for attr in dev['i2c']['channel']: + if attr.get("chn") in dev_channels: + ret_val = "Mux success" + print ret_val + + def validate_cpld_device(self, dev, ops): + devtype_list = ['i2c_cpld'] + ret_val = "cpld failed" + + if dev['i2c']['topo_info']['dev_type'] in devtype_list: + ret_val = "cpld success" + print ret_val + + + def validate_sysstatus_device(self, dev, ops): + dev_attribs = ['board_info', 'cpld1_version', 'power_module_status', 'system_reset5', + 'system_reset6', 'system_reset7', 'misc1', 'cpld2_version', 'cpld3_version' + ] + ret_val = "sysstatus failed" + + if dev['dev_info']['device_type'] == "SYSSTAT": + for attr in dev['attr_list']: + if attr.get("attr_name") in dev_attribs: + ret_val = "sysstatus success" + print ret_val + + def validate_temp_sensor_device(self, dev, ops): + devtype_list = ['lm75'] + dev_attribs = ['temp1_max', 'temp1_max_hyst', 'temp1_input'] + ret_val = "temp sensor failed" + + if dev['dev_info']['device_type'] == "TEMP_SENSOR": + if dev['i2c']['topo_info']['dev_type'] in devtype_list: + for attr in dev['i2c']['attr_list']: + if attr.get("attr_name") in dev_attribs: + ret_val = "tempsensor success" + print ret_val + + def validate_fan_device(self, dev, ops): + devtype_list = ['fan_ctrl'] + dev_attribs = ['none'] + ret_val = "fan failed" + + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['FAN']: + if dev['i2c']['dev_attr']['num_fan'] is not None: + numfans = dev['i2c']['dev_attr']['num_fan'] + #for fn in range(0, numfans): + # cmd = "fan"+fn+"_present" + # if attr.get("attr_name") == cmd: + ret_val = "fan success" + + print ret_val + + def validate_psu_device(self, dev, ops): + devtype_list = ['psu_pmbus'] + dev_attribs = ['psu_present', 'psu_model_name', 'psu_power_good', 'psu_mfr_id', 'psu_serial_num', + 'psu_fan_dir', 'psu_v_out', 'psu_i_out', 'psu_p_out', 'psu_fan1_speed_rpm' + ] + ret_val = "psu failed" + + if dev['i2c']['topo_info']['dev_type'] in self.data['PLATFORM']['drivers']['PSU']: + for attr in dev['i2c']['attr_list']: + if attr.get("attr_name") in dev_attribs: + if attr.get("attr_devaddr") is not None: + if attr.get("attr_offset") is not None: + if attr.get("attr_mask") is not None: + if attr.get("attr_len") is not None: + ret_val = "psu success" + else: + ret_val = "psu failed" + + print ret_val + + ################################################################################################################################# + # SPYTEST + ################################################################################################################################# + def verify_attr(self, key, attr, path): + node="/sys/kernel/%s/%s"%(path, key) + try: + with open(node, 'r') as f: + status = f.read() + except IOError: + print "PDDF_VERIFY_ERR: IOError: node:%s key:%s"%(node, key) + return + + status=status.rstrip("\n\r") + if attr[key]!=status: + print "PDDF_VERIFY_ERR: node: %s switch:%s"%(node, status) + + def verify_device(self, attr, path, ops): + for key in attr.keys(): + self.verify_attr(key, attr, path) + + + def get_led_device(self, device_name): + self.create_attr('device_name', self.data[device_name]['dev_info']['device_name'], "pddf/devices/led") + self.create_attr('index', self.data[device_name]['dev_attr']['index'], "pddf/devices/led") + cmd="echo 'verify' > /sys/kernel/pddf/devices/led/dev_ops" + self.runcmd(cmd) + #print "\n" + + def validate_sysfs_creation(self, obj, validate_type): + dir = '/sys/kernel/pddf/devices/'+validate_type + if (os.path.exists(dir) or validate_type=='client'): + for sysfs in obj[validate_type]: + if(not os.path.exists(sysfs)): + print "[SYSFS FILE] " + sysfs + ": does not exist" + else: + print "[SYSFS DIR] " + dir + ": does not exist" + + def validate_dsysfs_creation(self, obj, validate_type): + # There is a possibility that some components dont have any device-self.data attr + if not obj[validate_type]: + print "[SYSFS ATTR] for " + validate_type + ": does not exist" + else: + for sysfs in obj[validate_type]: + if(not os.path.exists(sysfs)): + print "[SYSFS FILE] " + sysfs + ": does not exist" + + def verify_sysfs_data(self, verify_type): + if (verify_type=='LED'): + for key in self.data.keys(): + if key != 'PLATFORM': + attr=self.data[key]['dev_info'] + if attr['device_type'] == 'LED': + self.get_led_device(key) + self.verify_attr('device_name', self.data[key]['dev_info'], "pddf/devices/led") + self.verify_attr('index', self.data[key]['dev_attr'], "pddf/devices/led") + for attr in self.data[key]['i2c']['attr_list']: + path="pddf/devices/led/" + attr['attr_name'] + for entry in attr.keys(): + if (entry != 'attr_name' and entry != 'swpld_addr' and entry != 'swpld_addr_offset'): + self.verify_attr(entry, attr, path) + if ( entry == 'swpld_addr' or entry == 'swpld_addr_offset'): + self.verify_attr(entry, attr, 'pddf/devices/led') + + + def schema_validation(self, validate_type): + for key in self.data.keys(): + if (key != 'PLATFORM'): + temp_obj={} + schema_file="" + device_type=self.data[key]["dev_info"]["device_type"] + if (validate_type=='all' or validate_type==device_type): + temp_obj[device_type]=self.data[key] + schema_file="schema/"+device_type + ".schema" + if (os.path.exists(schema_file)): + #print "Validate " + key + " Schema: " + device_type + json_data=json.dumps(temp_obj) + with open(schema_file, 'r') as f: + schema=json.load(f) + validate(temp_obj, schema) + + ################################################################################################################################# + # PARSE DEFS + ################################################################################################################################# + def psu_parse(self, dev, ops): + str="" + ret="" + for ifce in dev['i2c']['interface']: + ret=getattr(self, ops['cmd']+"_psu_device")(self.data[ifce['dev']], ops ) + if not ret is None: + str+=ret + return str + + def fan_parse(self, dev, ops): + str="" + str=getattr(self, ops['cmd']+"_fan_device")(dev, ops ) + #print "psu_parse -- %s"%str + return str + + def temp_sensor_parse(self, dev, ops): + str="" + str=getattr(self, ops['cmd']+"_temp_sensor_device")(dev, ops ) + #print "temp_sensor_parse -- %s"%str + return str + + def cpld_parse(self, dev, ops): + ret = "" + ret = getattr(self, ops['cmd']+"_cpld_device")(dev, ops) + return ret + + + + + def sysstatus_parse(self, dev,ops): + ret = "" + ret = getattr(self, ops['cmd']+"_sysstatus_device")(dev, ops) + return ret + + + def mux_parse(self, dev, ops): + str = "" + ret = getattr(self, ops['cmd']+"_mux_device")(dev, ops) + if not ret is None: + str += ret + + for ch in dev['i2c']['channel']: + ret = self.dev_parse(self.data[ch['dev']], ops) + if not ret is None: + str += ret + return str + + def mux_parse_reverse(self, dev, ops): + str = "" + for ch in reversed(dev['i2c']['channel']): + ret = self.dev_parse(self.data[ch['dev']], ops) + if not ret is None: + str += ret + + ret = getattr(self, ops['cmd']+"_mux_device")(dev, ops) + if not ret is None: + str += ret + + return str + + + def eeprom_parse(self, dev, ops): + str = "" + str = getattr(self, ops['cmd']+"_eeprom_device")(dev, ops) + return str + + def optic_parse(self, dev, ops): + str="" + ret="" + for ifce in dev['i2c']['interface']: + ret=getattr(self, ops['cmd']+"_xcvr_device")(self.data[ifce['dev']], ops ) + if not ret is None: + str+=ret + return str + + def cpu_parse(self, bus, ops): + str = "" + for dev in bus['i2c']['CONTROLLERS']: + dev1 = self.data[dev['dev']] + for d in dev1['i2c']['DEVICES']: + ret=self.dev_parse(self.data[d['dev']], ops) + if not ret is None: + str += ret + return str + + def cpu_parse_reverse(self, bus, ops): + str = "" + for dev in reversed(bus['i2c']['CONTROLLERS']): + dev1 = self.data[dev['dev']] + for d in dev1['i2c']['DEVICES']: + ret=self.dev_parse(self.data[d['dev']], ops) + if not ret is None: + str += ret + return str + + + def dev_parse(self, dev, ops): + attr=dev['dev_info'] + if attr['device_type'] == 'CPU': + if ops['cmd']=='delete': + return self.cpu_parse_reverse(dev, ops) + else: + return self.cpu_parse(dev, ops) + + if attr['device_type'] == 'EEPROM': + return self.eeprom_parse(dev, ops) + + if attr['device_type'] == 'MUX': + if ops['cmd']=='delete': + return self.mux_parse_reverse(dev, ops) + else: + return self.mux_parse(dev, ops) + + if attr['device_type'] == 'PSU': + return self.psu_parse(dev, ops) + + if attr['device_type'] == 'FAN': + return self.fan_parse(dev, ops) + + if attr['device_type'] == 'TEMP_SENSOR': + return self.temp_sensor_parse(dev, ops) + + if attr['device_type'] == 'SFP' or attr['device_type'] == 'QSFP': + return self.optic_parse(dev, ops) + + if attr['device_type'] == 'CPLD': + return self.cpld_parse(dev, ops) + + if attr['device_type'] == 'SYSSTAT': + return self.sysstatus_parse(dev,ops) + + def create_attr(self, key, value, path): + cmd = "echo '%s' > /sys/kernel/%s/%s"%(value, path, key) + self.runcmd(cmd) + + def create_led_platform_device(self, key, ops): + if ops['attr']=='all' or ops['attr']=='PLATFORM': + path='pddf/devices/platform' + self.create_attr('num_psus', self.data['PLATFORM']['num_psus'], path) + self.create_attr('num_fans', self.data['PLATFORM']['num_fans'], path) + + def create_led_device(self, key, ops): + if ops['attr']=='all' or ops['attr']==self.data[key]['dev_info']['device_name']: + path="pddf/devices/led" + ops_state="" + for attr in self.data[key]['i2c']['attr_list']: + self.create_attr('device_name', self.data[key]['dev_info']['device_name'], path) + self.create_device(self.data[key]['dev_attr'], path, ops) + for attr_key in attr.keys(): + if (attr_key == 'swpld_addr_offset' or attr_key == 'swpld_addr'): + self.create_attr(attr_key, attr[attr_key], path) + elif (attr_key != 'attr_name'): + state_path=path+'/'+attr['attr_name'] + self.create_attr(attr_key, attr[attr_key],state_path) + cmd="echo '" + ops['cmd'] + '_' + attr['attr_name']+"' > /sys/kernel/pddf/devices/led/dev_ops" + self.runcmd(cmd) + #print "\n" + + + + def led_parse(self, ops): + #print "led_parse cmd: " + ops['cmd'] + getattr(self, ops['cmd']+"_led_platform_device")("PLATFORM", ops) + for key in self.data.keys(): + if key != 'PLATFORM': + attr=self.data[key]['dev_info'] + if attr['device_type'] == 'LED': + getattr(self, ops['cmd']+"_led_device")(key, ops) + + + def get_device_list(self, list, type): + for key in self.data.keys(): + if key != 'PLATFORM': + attr=self.data[key]['dev_info'] + if attr['device_type'] == type: + list.append(self.data[key]) + + + def create_pddf_devices(self): + self.dev_parse(self.data['SYSTEM'], { "cmd": "create", "target":"all", "attr":"all" } ) + self.dev_parse(self.data['SYSSTATUS'], { "cmd": "create", "target":"all", "attr":"all" } ) + self.led_parse({ "cmd": "create", "target":"all", "attr":"all" }) + + def delete_pddf_devices(self): + self.dev_parse(self.data['SYSTEM'], { "cmd": "delete", "target":"all", "attr":"all" } ) + self.dev_parse(self.data['SYSSTATUS'], { "cmd": "delete", "target":"all", "attr":"all" } ) + + def populate_pddf_sysfsobj(self): + self.dev_parse(self.data['SYSTEM'], { "cmd": "show", "target":"all", "attr":"all" } ) + self.dev_parse(self.data['SYSSTATUS'], { "cmd": "show", "target":"all", "attr":"all" } ) + self.led_parse({ "cmd": "show", "target":"all", "attr":"all" }) + self.show_client_device() + + def cli_dump_dsysfs(self, component): + self.dev_parse(self.data['SYSTEM'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + self.dev_parse(self.data['SYSSTATUS'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + return self.data_sysfs_obj[component] + + + def validate_pddf_devices(self, *args): + self.populate_pddf_sysfsobj() + alist = [item for item in args] + devtype = alist[0] + v_ops = { 'cmd': 'validate', 'target':'all', 'attr':'all' } + #dev_parse(self.data, self.data[devtype], v_ops ) + self.dev_parse(self.data['SYSTEM'], v_ops ) + + + + + + + + + + + + + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--create", action='store_true', help="create the I2C topology") + parser.add_argument("--sysfs", action='store', nargs="+", help="show access-attributes sysfs for the I2C topology") + parser.add_argument("--dsysfs", action='store', nargs="+", help="show data-attributes sysfs for the I2C topology") + parser.add_argument("--delete", action='store_true', help="Remove all the created I2C clients from topology") + parser.add_argument("--validate", action='store', help="Validate the device specific attribute data elements") + parser.add_argument("--schema", action='store', nargs="+", help="Schema Validation") + args = parser.parse_args() + #print args + pddf_obj = PddfParse() + + str = "" + if args.create: + pddf_obj.create_pddf_devices() + + if args.sysfs: + if args.sysfs[0] == 'all': + pddf_obj.populate_pddf_sysfsobj() + if args.sysfs[0] == 'print': + pddf_obj.populate_pddf_sysfsobj() + pddf_obj.dump_sysfs_obj(pddf_obj.sysfs_obj, args.sysfs[1]) + if args.sysfs[0] == 'validate': + pddf_obj.populate_pddf_sysfsobj() + pddf_obj.validate_sysfs_creation(pddf_obj.sysfs_obj, args.sysfs[1]) + if args.sysfs[0] == 'verify': + pddf_obj.verify_sysfs_data(args.sysfs[1]) + + + if args.dsysfs: + if args.dsysfs[0] == 'validate': + pddf_obj.dev_parse(pddf_obj.data['SYSTEM'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + pddf_obj.dev_parse(pddf_obj.data['SYSSTATUS'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + pddf_obj.validate_dsysfs_creation(pddf_obj.data_sysfs_obj, args.dsysfs[1]) + + elif args.dsysfs[0] == 'print': + pddf_obj.dev_parse(pddf_obj.data['SYSTEM'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + pddf_obj.dev_parse(pddf_obj.data['SYSSTATUS'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + pddf_obj.dump_sysfs_obj(pddf_obj.data_sysfs_obj, args.dsysfs[1]) + + elif args.dsysfs[0] == 'all': + ret = pddf_obj.dev_parse(pddf_obj.data['SYSTEM'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + ret += pddf_obj.dev_parse(pddf_obj.data['SYSSTATUS'], { "cmd": "show_attr", "target":"all", "attr":"all" } ) + pddf_obj.dump_sysfs_obj(pddf_obj.data_sysfs_obj, 'all') + #if not ret is None: + #ret = ret.rstrip('\n') + #print ret + else: + ret = pddf_obj.dev_parse(pddf_obj.data[args.dsysfs[0]], { "cmd": "show_attr", "target":args.dsysfs[0], "attr":args.dsysfs[1] }) + #if not ret is None: + #ret = ret.rstrip('\n') + #print ret + + if args.delete: + pddf_obj.delete_pddf_devices() + + if args.validate: + if args.validate[0] == 'all': + pddf_obj.validate_pddf_devices(args.validate[1:]) + else: + pass + + if args.schema: + pddf_obj.schema_validation(args.schema[0]) + + +if __name__ == "__main__" : + main() diff --git a/platform/pddf/i2c/utils/schema/CPLD.schema b/platform/pddf/i2c/utils/schema/CPLD.schema new file mode 100644 index 000000000000..eeb94a60cbc5 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/CPLD.schema @@ -0,0 +1,68 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "CPLD": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "dev_attr": { + "type": "object" + } + }, + "required": [ + "topo_info", + "dev_attr" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "CPLD" + ] +} diff --git a/platform/pddf/i2c/utils/schema/CPU.schema b/platform/pddf/i2c/utils/schema/CPU.schema new file mode 100644 index 000000000000..9bb07ae0f6bb --- /dev/null +++ b/platform/pddf/i2c/utils/schema/CPU.schema @@ -0,0 +1,80 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "CPU": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "null" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "CONTROLLERS": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "dev_name": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "dev_name", + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev_name": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "dev_name", + "dev" + ] + } + ] + } + }, + "required": [ + "CONTROLLERS" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "CPU" + ] +} diff --git a/platform/pddf/i2c/utils/schema/EEPROM.schema b/platform/pddf/i2c/utils/schema/EEPROM.schema new file mode 100644 index 000000000000..a8e8885e3ad1 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/EEPROM.schema @@ -0,0 +1,93 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "EEPROM": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "access_mode": { + "type": "string" + } + }, + "required": [ + "access_mode" + ] + }, + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + } + }, + "required": [ + "attr_name" + ] + } + ] + } + }, + "required": [ + "topo_info", + "dev_attr", + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "EEPROM" + ] +} diff --git a/platform/pddf/i2c/utils/schema/FAN.schema b/platform/pddf/i2c/utils/schema/FAN.schema new file mode 100644 index 000000000000..e647d056bd26 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/FAN.schema @@ -0,0 +1,113 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "FAN": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "num_fan": { + "type": "string" + } + }, + "required": [ + "num_fan" + ] + }, + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devtype": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_cmpval": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devtype", + "attr_offset", + "attr_mask", + "attr_cmpval", + "attr_len" + ] + } + ] + } + }, + "required": [ + "topo_info", + "dev_attr", + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "FAN" + ] +} diff --git a/platform/pddf/i2c/utils/schema/LED.schema b/platform/pddf/i2c/utils/schema/LED.schema new file mode 100644 index 000000000000..04583ee660aa --- /dev/null +++ b/platform/pddf/i2c/utils/schema/LED.schema @@ -0,0 +1,120 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "LED": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "index": { + "type": "string" + } + }, + "required": [ + "index" + ] + }, + "i2c": { + "type": "object", + "properties": { + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "bits": { + "type": "string" + }, + "color": { + "type": "string" + }, + "value": { + "type": "string" + }, + "swpld_addr": { + "type": "string" + }, + "swpld_addr_offset": { + "type": "string" + } + }, + "required": [ + "attr_name", + "bits", + "color", + "value", + "swpld_addr", + "swpld_addr_offset" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "bits": { + "type": "string" + }, + "color": { + "type": "string" + }, + "value": { + "type": "string" + }, + "swpld_addr": { + "type": "string" + }, + "swpld_addr_offset": { + "type": "string" + } + }, + "required": [ + "attr_name", + "bits", + "color", + "value", + "swpld_addr", + "swpld_addr_offset" + ] + } + ] + } + }, + "required": [ + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "dev_attr", + "i2c" + ] + } + }, + "required": [ + "LED" + ] +} diff --git a/platform/pddf/i2c/utils/schema/MUX.schema b/platform/pddf/i2c/utils/schema/MUX.schema new file mode 100644 index 000000000000..6ef46e8dd2a9 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/MUX.schema @@ -0,0 +1,97 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "MUX": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "virt_bus": { + "type": "string" + } + }, + "required": [ + "virt_bus" + ] + }, + "channel": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "chn": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "chn", + "dev" + ] + } + ] + } + }, + "required": [ + "topo_info", + "dev_attr", + "channel" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "MUX" + ] +} diff --git a/platform/pddf/i2c/utils/schema/PSU-PMBUS.schema b/platform/pddf/i2c/utils/schema/PSU-PMBUS.schema new file mode 100644 index 000000000000..6516d2321371 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/PSU-PMBUS.schema @@ -0,0 +1,109 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "PSU-PMBUS": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + }, + "virt_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent", + "virt_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_devtype": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_cmpval": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_devtype", + "attr_offset", + "attr_mask", + "attr_cmpval", + "attr_len" + ] + } + ] + } + }, + "required": [ + "topo_info", + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "PSU-PMBUS" + ] +} diff --git a/platform/pddf/i2c/utils/schema/PSU.schema b/platform/pddf/i2c/utils/schema/PSU.schema new file mode 100644 index 000000000000..cea5a862bdb3 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/PSU.schema @@ -0,0 +1,136 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "PSU": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "dev_idx": { + "type": "string" + } + }, + "required": [ + "dev_idx" + ] + }, + "i2c": { + "type": "object", + "properties": { + "interface": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "itf": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "itf", + "dev" + ] + } + ] + } + }, + "required": [ + "interface" + ] + }, + "bmc": { + "type": "object", + "properties": { + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "bmc_cmd": { + "type": "string" + } + }, + "required": [ + "attr_name", + "bmc_cmd" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "bmc_cmd": { + "type": "string" + } + }, + "required": [ + "attr_name", + "bmc_cmd" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "bmc_cmd": { + "type": "string" + } + }, + "required": [ + "attr_name", + "bmc_cmd" + ] + } + ] + } + }, + "required": [ + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "dev_attr", + "i2c", + "bmc" + ] + } + }, + "required": [ + "PSU" + ] +} diff --git a/platform/pddf/i2c/utils/schema/QSFP.schema b/platform/pddf/i2c/utils/schema/QSFP.schema new file mode 100644 index 000000000000..4a4d77d4f4fb --- /dev/null +++ b/platform/pddf/i2c/utils/schema/QSFP.schema @@ -0,0 +1,105 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "PORT6": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "dev_attr": { + "type": "object", + "properties": { + "dev_idx": { + "type": "string" + } + }, + "required": [ + "dev_idx" + ] + }, + "i2c": { + "type": "object", + "properties": { + "interface": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "itf": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "itf", + "dev" + ] + }, + { + "type": "object", + "properties": { + "itf": { + "type": "string" + }, + "dev": { + "type": "string" + } + }, + "required": [ + "itf", + "dev" + ] + } + ] + } + }, + "required": [ + "interface" + ] + }, + "bmc": { + "type": "object", + "properties": { + "attr_list": { + "type": "array", + "items": {} + } + }, + "required": [ + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "dev_attr", + "i2c", + "bmc" + ] + } + }, + "required": [ + "PORT6" + ] +} diff --git a/platform/pddf/i2c/utils/schema/SMBUS.schema b/platform/pddf/i2c/utils/schema/SMBUS.schema new file mode 100644 index 000000000000..91429a1d7ee8 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/SMBUS.schema @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "SMBUS": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "dev_addr": { + "type": "string" + } + }, + "required": [ + "dev_addr" + ] + }, + "DEVICES": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + }, + { + "type": "object", + "properties": { + "dev": { + "type": "string" + } + }, + "required": [ + "dev" + ] + } + ] + } + }, + "required": [ + "topo_info", + "DEVICES" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "SMBUS" + ] +} diff --git a/platform/pddf/i2c/utils/schema/SYSSTAT.schema b/platform/pddf/i2c/utils/schema/SYSSTAT.schema new file mode 100644 index 000000000000..d31e10c27222 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/SYSSTAT.schema @@ -0,0 +1,285 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "SYSSTAT": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name" + ] + }, + "dev_attr": { + "type": "object" + }, + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + }, + "attr_devaddr": { + "type": "string" + }, + "attr_offset": { + "type": "string" + }, + "attr_mask": { + "type": "string" + }, + "attr_len": { + "type": "string" + } + }, + "required": [ + "attr_name", + "attr_devaddr", + "attr_offset", + "attr_mask", + "attr_len" + ] + } + ] + } + }, + "required": [ + "dev_info", + "dev_attr", + "attr_list" + ] + } + }, + "required": [ + "SYSSTAT" + ] +} diff --git a/platform/pddf/i2c/utils/schema/TEMP-SENSOR.schema b/platform/pddf/i2c/utils/schema/TEMP-SENSOR.schema new file mode 100644 index 000000000000..d77a0a3c2461 --- /dev/null +++ b/platform/pddf/i2c/utils/schema/TEMP-SENSOR.schema @@ -0,0 +1,103 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "type": "object", + "properties": { + "TEMP_SENSOR": { + "type": "object", + "properties": { + "dev_info": { + "type": "object", + "properties": { + "device_type": { + "type": "string" + }, + "device_name": { + "type": "string" + }, + "device_parent": { + "type": "string" + } + }, + "required": [ + "device_type", + "device_name", + "device_parent" + ] + }, + "i2c": { + "type": "object", + "properties": { + "topo_info": { + "type": "object", + "properties": { + "parent_bus": { + "type": "string" + }, + "dev_addr": { + "type": "string" + }, + "dev_type": { + "type": "string" + } + }, + "required": [ + "parent_bus", + "dev_addr", + "dev_type" + ] + }, + "attr_list": { + "type": "array", + "items": [ + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + } + }, + "required": [ + "attr_name" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + } + }, + "required": [ + "attr_name" + ] + }, + { + "type": "object", + "properties": { + "attr_name": { + "type": "string" + } + }, + "required": [ + "attr_name" + ] + } + ] + } + }, + "required": [ + "topo_info", + "attr_list" + ] + } + }, + "required": [ + "dev_info", + "i2c" + ] + } + }, + "required": [ + "TEMP_SENSOR" + ] +} diff --git a/platform/pddf/platform-modules-pddf.mk b/platform/pddf/platform-modules-pddf.mk new file mode 100644 index 000000000000..8758924ee391 --- /dev/null +++ b/platform/pddf/platform-modules-pddf.mk @@ -0,0 +1,20 @@ +# PDDF Generic Platform modules +#################################################### +PDDF_PLATFORM_MODULE_VERSION = 1.1 + +export PDDF_PLATFORM_MODULE_VERSION + +PDDF_PLATFORM_MODULE = sonic-platform-pddf_$(PDDF_PLATFORM_MODULE_VERSION)_amd64.deb +$(PDDF_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PDDF_PATH)/i2c +$(PDDF_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +SONIC_DPKG_DEBS += $(PDDF_PLATFORM_MODULE) + +ifneq ($(SONIC_ONE_IMAGE),) +$(SONIC_ONE_IMAGE)_INSTALLS += $(PDDF_PLATFORM_MODULE) +endif + +ifneq ($(SONIC_ONE_PDE_IMAGE),) +$(SONIC_ONE_PDE_IMAGE)_INSTALLS += $(PDDF_PLATFORM_MODULE) +endif + +SONIC_STRETCH_DEBS += $(PDDF_PLATFORM_MODULE) diff --git a/platform/pddf/rules.mk b/platform/pddf/rules.mk new file mode 100644 index 000000000000..d3c1082e7a82 --- /dev/null +++ b/platform/pddf/rules.mk @@ -0,0 +1,2 @@ +include $(PLATFORM_PDDF_PATH)/platform-modules-pddf.mk + diff --git a/rules/config b/rules/config index afc9a4b9a374..9209e5cb8d8d 100644 --- a/rules/config +++ b/rules/config @@ -56,6 +56,10 @@ DEFAULT_PASSWORD = YourPaSsWoRd # Uncomment next line to enable: # INSTALL_DEBUG_TOOLS = y +# SONIC_USE_PDDF_FRAMEWORK - Use PDDF generic drivers and plugins +# Uncomment next line to enable: +SONIC_USE_PDDF_FRAMEWORK = y + # SONIC_ROUTING_STACK - specify the routing-stack being elected to drive SONiC's control-plane. # Supported routing stacks on SONiC are: # routing-stacks: quagga, frr. diff --git a/slave.mk b/slave.mk index 15e3f7738ede..e90e7e4838cf 100644 --- a/slave.mk +++ b/slave.mk @@ -113,6 +113,19 @@ ifneq ($(CONFIGURED_PLATFORM), undefined) include $(PLATFORM_PATH)/rules.mk endif + +ifeq ($(SONIC_USE_PDDF_FRAMEWORK),y) +PDDF_SUPPORT = y +endif +export PDDF_SUPPORT + +ifeq ($(PDDF_SUPPORT), y) +PDDF_DIR = pddf +PLATFORM_PDDF_PATH = platform/$(PDDF_DIR) +include $(PLATFORM_PDDF_PATH)/rules.mk +endif + + ifeq ($(USERNAME),) override USERNAME := $(DEFAULT_USERNAME) else @@ -191,6 +204,7 @@ $(info "KERNEL_PROCURE_METHOD" : "$(KERNEL_PROCURE_METHOD)") $(info "BUILD_TIMESTAMP" : "$(BUILD_TIMESTAMP)") $(info "BLDENV" : "$(BLDENV)") $(info "VS_PREPARE_MEM" : "$(VS_PREPARE_MEM)") +$(info "PDDF_SUPPORT" : "$(PDDF_SUPPORT)") $(info ) ifeq ($(SONIC_USE_DOCKER_BUILDKIT),y) From a654dc76da4d7c44c244270d042e5f0ece222ed0 Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Thu, 19 Sep 2019 22:14:08 -0700 Subject: [PATCH 2/6] Changes in common pddf psu plugin based on the changes in psu_base class in PR#62 --- device/common/pddf/plugins/psuutil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/common/pddf/plugins/psuutil.py b/device/common/pddf/plugins/psuutil.py index cc50aeecaabf..3ddc504de93a 100755 --- a/device/common/pddf/plugins/psuutil.py +++ b/device/common/pddf/plugins/psuutil.py @@ -236,7 +236,7 @@ def get_output_power(self, idx): return p_out - def get_fan_rpm(self, idx, fan_idx): + def get_fan_speed(self, idx, fan_idx): if idx is None or fan_idx is None: return 0 From ed922f160dcaeb4d53046c7deb26e67faffb346b Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Thu, 19 Sep 2019 22:39:01 -0700 Subject: [PATCH 3/6] Changes incorporating feedback comments in PR#3387. Chaning tab into 4-spaces --- .../pddf/pd-plugin.json | 56 +- .../pddf/pddf-device.json | 912 ++++++------- .../pddf/pd-plugin.json | 56 +- .../pddf/pddf-device.json | 922 ++++++------- .../i2c/modules/client/pddf_client_module.c | 310 ++--- .../modules/cpld/driver/pddf_cpld_driver.c | 216 +-- .../pddf/i2c/modules/cpld/pddf_cpld_module.c | 174 +-- .../i2c/modules/fan/driver/pddf_fan_api.c | 450 +++---- .../i2c/modules/fan/driver/pddf_fan_driver.c | 222 ++-- .../pddf/i2c/modules/fan/pddf_fan_module.c | 330 ++--- .../i2c/modules/include/pddf_client_defs.h | 40 +- .../pddf/i2c/modules/include/pddf_cpld_defs.h | 2 +- .../pddf/i2c/modules/include/pddf_fan_defs.h | 38 +- .../i2c/modules/include/pddf_fan_driver.h | 22 +- .../pddf/i2c/modules/include/pddf_led_defs.h | 42 +- .../pddf/i2c/modules/include/pddf_mux_defs.h | 4 +- .../pddf/i2c/modules/include/pddf_psu_defs.h | 38 +- .../i2c/modules/include/pddf_psu_driver.h | 40 +- .../i2c/modules/include/pddf_sysstatus_defs.h | 2 +- .../pddf/i2c/modules/include/pddf_xcvr_defs.h | 46 +- .../pddf/i2c/modules/led/pddf_led_module.c | 560 ++++---- .../pddf/i2c/modules/mux/pddf_mux_module.c | 234 ++-- .../i2c/modules/psu/driver/pddf_psu_api.c | 538 ++++---- .../i2c/modules/psu/driver/pddf_psu_driver.c | 282 ++-- .../pddf/i2c/modules/psu/pddf_psu_module.c | 374 +++--- .../modules/sysstatus/pddf_sysstatus_module.c | 158 +-- .../i2c/modules/xcvr/driver/pddf_xcvr_api.c | 1180 ++++++++--------- .../modules/xcvr/driver/pddf_xcvr_driver.c | 172 +-- .../pddf/i2c/modules/xcvr/pddf_xcvr_module.c | 394 +++--- 29 files changed, 3907 insertions(+), 3907 deletions(-) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json index 90dbea990bf3..8811f7b4c3fc 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pd-plugin.json @@ -1,35 +1,35 @@ { - "PSU": - { - "psu_present": - { - "valmap": { "1":true, "0":false } - }, + "PSU": + { + "psu_present": + { + "valmap": { "1":true, "0":false } + }, - "psu_power_good": - { - "valmap": { "1": true, "0":false } - }, + "psu_power_good": + { + "valmap": { "1": true, "0":false } + }, - "psu_fan_dir": - { - "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } - } - }, + "psu_fan_dir": + { + "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + } + }, - "FAN": - { - "direction": - { - "valmap": {"1":"INTAKE", "0":"EXHAUST"} - }, + "FAN": + { + "direction": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + }, - "present": - { - "valmap": {"1":true, "0":false} - }, - - "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" - } + "present": + { + "valmap": {"1":true, "0":false} + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" + } } diff --git a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json index 29f0008c9159..acfff5ea08b1 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7712_32x-r0/pddf/pddf-device.json @@ -1,239 +1,239 @@ { - "PLATFORM": - { - "num_psus":2, - "num_fans":6, - "num_ports":32, - "num_temps": 4, - "drivers": - { - "description":"AS7712 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", - "CPLD": - [ - "i2c_cpld" - ], - "PSU": - [ - "psu_eeprom", - "psu_pmbus" - ], - "FAN": - [ - "fan_ctrl", - "fan_eeprom" - ], + "PLATFORM": + { + "num_psus":2, + "num_fans":6, + "num_ports":32, + "num_temps": 4, + "drivers": + { + "description":"AS7712 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom" + ], "PORT_MODULE": [ "pddf_xcvr" - ] - - } - }, - - "SYSTEM": - { - "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, - "i2c": - { - "CONTROLLERS": - [ - { "dev_name":"i2c-1", "dev":"SMBUS1" }, - { "dev_name":"i2c-0", "dev":"SMBUS0" } - ] - } - }, - - "SMBUS0": - { - "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, - "i2c": - { - "topo_info": {"dev_addr": "0x0"}, - "DEVICES": - [ - {"dev": "EEPROM1"}, - {"dev": "MUX2"}, - {"dev": "MUX3"}, - {"dev": "MUX4"}, - {"dev": "MUX5"}, - {"dev": "MUX6"} - ] - } - }, - - "SMBUS1": - { - "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS1", "device_parent": "SYSTEM"}, - "i2c": - { - "topo_info": {"dev_addr": "0x1"}, - "DEVICES": - [ - {"dev": "MUX1"} - ] - } - }, - "EEPROM1": - { - "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, - "i2c": - { - "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"}, - "dev_attr": {"access_mode": "BLOCK"}, - "attr_list": [ - {"attr_name": "eeprom"} - ] - } - }, - - "MUX1": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x1", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x10"}, - "channel": - [ - { "chn":"0", "dev":"FAN-CTRL" }, - { "chn":"1", "dev":"TEMP1" }, - { "chn":"1", "dev":"TEMP2" }, - { "chn":"1", "dev":"TEMP3" }, - { "chn":"1", "dev":"TEMP4" }, - { "chn":"2", "dev":"CPLD1" }, - { "chn":"3", "dev":"CPLD2" }, - { "chn":"4", "dev":"CPLD3" } - ] - } - }, - - "MUX2": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x20"}, - "channel": - [ - { "chn":"0", "dev":"PSU2" }, - { "chn":"1", "dev":"PSU1" } - ] - } - }, - - "FAN-CTRL": - { - "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, - "dev_attr": { "num_fan":"6"}, - "attr_list": - [ - { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } - ] - } - }, - - "TEMP1" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x48", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP2" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x49", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP3" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4a", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP4" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4b", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "CPLD1": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x12", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, - "dev_attr":{} - } - }, + ] + + } + }, + + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-1", "dev":"SMBUS1" }, + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX2"}, + {"dev": "MUX3"}, + {"dev": "MUX4"}, + {"dev": "MUX5"}, + {"dev": "MUX6"} + ] + } + }, + + "SMBUS1": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS1", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x1"}, + "DEVICES": + [ + {"dev": "MUX1"} + ] + } + }, + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x57", "dev_type": "24c02"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": [ + {"attr_name": "eeprom"} + ] + } + }, + + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x1", "dev_addr":"0x76", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x10"}, + "channel": + [ + { "chn":"0", "dev":"FAN-CTRL" }, + { "chn":"1", "dev":"TEMP1" }, + { "chn":"1", "dev":"TEMP2" }, + { "chn":"1", "dev":"TEMP3" }, + { "chn":"1", "dev":"TEMP4" }, + { "chn":"2", "dev":"CPLD1" }, + { "chn":"3", "dev":"CPLD2" }, + { "chn":"4", "dev":"CPLD3" } + ] + } + }, + + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x20"}, + "channel": + [ + { "chn":"0", "dev":"PSU2" }, + { "chn":"1", "dev":"PSU1" } + ] + } + }, + + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, + "dev_attr": { "num_fan":"6"}, + "attr_list": + [ + { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } + ] + } + }, + + "TEMP1" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP2" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP3" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP4" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x4b", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "CPLD1": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x12", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, "CPLD2": { @@ -255,12 +255,12 @@ } }, - "SYSSTATUS": - { - "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, - "dev_attr":{ }, - "attr_list": - [ + "SYSSTATUS": + { + "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, + "dev_attr":{ }, + "attr_list": + [ { "attr_name":"board_info","attr_devaddr":"0x60", "attr_offset":"0x0","attr_mask":"0xf","attr_len":"0x1"}, { "attr_name":"cpld1_version","attr_devaddr":"0x60","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, @@ -272,186 +272,186 @@ { "attr_name":"cpld2_version","attr_devaddr":"0x62","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, { "attr_name":"cpld3_version","attr_devaddr":"0x64","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"} - ] - }, - - - "PSU1": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX2"}, - "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU1-PMBUS" } - ] - }, - - "bmc": - { - "attr_list": - [ - { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} - ] - } - }, - - "PSU1-PMBUS": - { - "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU1"}, - "i2c": - { - "topo_info":{ "parent_bus":"0x21", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "PSU2": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" }, - "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU2-PMBUS"} - ] - }, - - "bmc": - { - "attr_list":[ - { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} - ] - } - }, - - "PSU2-PMBUS": - { - "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"}, - "i2c": - { - "topo_info": { "parent_bus":"0x20", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "MUX3": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x30"}, - "channel": - [ - { "chn":"0", "dev":"PORT9" }, - { "chn":"1", "dev":"PORT10" }, - { "chn":"2", "dev":"PORT11" }, - { "chn":"3", "dev":"PORT12" }, - { "chn":"4", "dev":"PORT1" }, - { "chn":"5", "dev":"PORT2" }, - { "chn":"6", "dev":"PORT3" }, - { "chn":"7", "dev":"PORT4" } - ] - } - }, - - "MUX4": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x40"}, - "channel": - [ - { "chn":"0", "dev":"PORT6" }, - { "chn":"1", "dev":"PORT5" }, - { "chn":"2", "dev":"PORT8" }, - { "chn":"3", "dev":"PORT7" }, - { "chn":"4", "dev":"PORT13" }, - { "chn":"5", "dev":"PORT14" }, - { "chn":"6", "dev":"PORT15" }, - { "chn":"7", "dev":"PORT16" } - ] - } - }, - - "MUX5": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x74", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x50"}, - "channel": - [ - { "chn":"0", "dev":"PORT17" }, - { "chn":"1", "dev":"PORT18" }, - { "chn":"2", "dev":"PORT19" }, - { "chn":"3", "dev":"PORT20" }, - { "chn":"4", "dev":"PORT25" }, - { "chn":"5", "dev":"PORT26" }, - { "chn":"6", "dev":"PORT27" }, - { "chn":"7", "dev":"PORT28" } - ] - } - }, - - "MUX6": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x75", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x60"}, - "channel": - [ - { "chn":"0", "dev":"PORT29" }, - { "chn":"1", "dev":"PORT30" }, - { "chn":"2", "dev":"PORT31" }, - { "chn":"3", "dev":"PORT32" }, - { "chn":"4", "dev":"PORT21" }, - { "chn":"5", "dev":"PORT22" }, - { "chn":"6", "dev":"PORT23" }, - { "chn":"7", "dev":"PORT24" } - ] - } - }, - - "LOC_LED": - { - "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, + ] + }, + + + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX2"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + }, + + "bmc": + { + "attr_list": + [ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x21", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX2" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + }, + + "bmc": + { + "attr_list":[ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX2", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x20", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "MUX3": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x30"}, + "channel": + [ + { "chn":"0", "dev":"PORT9" }, + { "chn":"1", "dev":"PORT10" }, + { "chn":"2", "dev":"PORT11" }, + { "chn":"3", "dev":"PORT12" }, + { "chn":"4", "dev":"PORT1" }, + { "chn":"5", "dev":"PORT2" }, + { "chn":"6", "dev":"PORT3" }, + { "chn":"7", "dev":"PORT4" } + ] + } + }, + + "MUX4": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x40"}, + "channel": + [ + { "chn":"0", "dev":"PORT6" }, + { "chn":"1", "dev":"PORT5" }, + { "chn":"2", "dev":"PORT8" }, + { "chn":"3", "dev":"PORT7" }, + { "chn":"4", "dev":"PORT13" }, + { "chn":"5", "dev":"PORT14" }, + { "chn":"6", "dev":"PORT15" }, + { "chn":"7", "dev":"PORT16" } + ] + } + }, + + "MUX5": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x74", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x50"}, + "channel": + [ + { "chn":"0", "dev":"PORT17" }, + { "chn":"1", "dev":"PORT18" }, + { "chn":"2", "dev":"PORT19" }, + { "chn":"3", "dev":"PORT20" }, + { "chn":"4", "dev":"PORT25" }, + { "chn":"5", "dev":"PORT26" }, + { "chn":"6", "dev":"PORT27" }, + { "chn":"7", "dev":"PORT28" } + ] + } + }, + + "MUX6": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x75", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x60"}, + "channel": + [ + { "chn":"0", "dev":"PORT29" }, + { "chn":"1", "dev":"PORT30" }, + { "chn":"2", "dev":"PORT31" }, + { "chn":"3", "dev":"PORT32" }, + { "chn":"4", "dev":"PORT21" }, + { "chn":"5", "dev":"PORT22" }, + { "chn":"6", "dev":"PORT23" }, + { "chn":"7", "dev":"PORT24" } + ] + } + }, + + "LOC_LED": + { + "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, "dev_attr": { "index":"0"}, "i2c" : { "attr_list": @@ -460,11 +460,11 @@ {"attr_name":"off", "bits" : "7", "color" : "Off", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} ] } - }, + }, - "DIAG_LED": - { - "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, + "DIAG_LED": + { + "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, "dev_attr": { "index":"0"}, "i2c" : { "attr_list": @@ -475,8 +475,8 @@ ] } - }, - + }, + "PORT1": { @@ -507,7 +507,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT1-CTRL": { @@ -553,7 +553,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT2-CTRL": { @@ -599,7 +599,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT3-CTRL": { @@ -645,7 +645,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT4-CTRL": { @@ -691,7 +691,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT5-CTRL": { @@ -737,7 +737,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT6-CTRL": { @@ -783,7 +783,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT7-CTRL": { @@ -829,7 +829,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT8-CTRL": { @@ -875,7 +875,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT9-CTRL": { @@ -921,7 +921,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT10-CTRL": { @@ -967,7 +967,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT11-CTRL": { @@ -1013,7 +1013,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT12-CTRL": { @@ -1059,7 +1059,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT13-CTRL": { @@ -1105,7 +1105,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT14-CTRL": { @@ -1151,7 +1151,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT15-CTRL": { @@ -1197,7 +1197,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT16-CTRL": { @@ -1243,7 +1243,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT17-CTRL": { @@ -1289,7 +1289,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT18-CTRL": { @@ -1335,7 +1335,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT19-CTRL": { @@ -1381,7 +1381,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT20-CTRL": { @@ -1427,7 +1427,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT21-CTRL": { @@ -1473,7 +1473,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT22-CTRL": { @@ -1519,7 +1519,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT23-CTRL": { @@ -1565,7 +1565,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT24-CTRL": { @@ -1611,7 +1611,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT25-CTRL": { @@ -1657,7 +1657,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT26-CTRL": { @@ -1703,7 +1703,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT27-CTRL": { @@ -1749,7 +1749,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT28-CTRL": { @@ -1795,7 +1795,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT29-CTRL": { @@ -1841,7 +1841,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT30-CTRL": { @@ -1887,7 +1887,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT31-CTRL": { @@ -1933,7 +1933,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT32-CTRL": { diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json index 90dbea990bf3..8811f7b4c3fc 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pd-plugin.json @@ -1,35 +1,35 @@ { - "PSU": - { - "psu_present": - { - "valmap": { "1":true, "0":false } - }, + "PSU": + { + "psu_present": + { + "valmap": { "1":true, "0":false } + }, - "psu_power_good": - { - "valmap": { "1": true, "0":false } - }, + "psu_power_good": + { + "valmap": { "1": true, "0":false } + }, - "psu_fan_dir": - { - "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } - } - }, + "psu_fan_dir": + { + "valmap": { "F2B":"INTAKE", "B2F":"EXHAUST" } + } + }, - "FAN": - { - "direction": - { - "valmap": {"1":"INTAKE", "0":"EXHAUST"} - }, + "FAN": + { + "direction": + { + "valmap": {"1":"INTAKE", "0":"EXHAUST"} + }, - "present": - { - "valmap": {"1":true, "0":false} - }, - - "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" - } + "present": + { + "valmap": {"1":true, "0":false} + }, + + "duty_cycle_to_pwm": "lambda dc: ((dc*100)/625 - 1)" + } } diff --git a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json index 15b36170f3a0..7a62e5ab5116 100644 --- a/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json +++ b/device/accton/x86_64-accton_as7726_32x-r0/pddf/pddf-device.json @@ -1,118 +1,118 @@ { - "PLATFORM": - { - "num_psus":2, - "num_fans":6, - "num_ports":32, - "num_temps":5, - "drivers": - { - "description":"AS7726 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", - "CPLD": - [ - "i2c_cpld" - ], - "PSU": - [ - "psu_eeprom", - "psu_pmbus" - ], - "FAN": - [ - "fan_ctrl", - "fan_eeprom" - ], + "PLATFORM": + { + "num_psus":2, + "num_fans":6, + "num_ports":32, + "num_temps":5, + "drivers": + { + "description":"AS7726 - Below is the list of supported PDDF drivers for various components. If any component uses some other driver, we will create the client using 'echo > /new_device' method", + "CPLD": + [ + "i2c_cpld" + ], + "PSU": + [ + "psu_eeprom", + "psu_pmbus" + ], + "FAN": + [ + "fan_ctrl", + "fan_eeprom" + ], "PORT_MODULE": [ "pddf_xcvr" - ] - - } - }, - - "SYSTEM": - { - "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, - "i2c": - { - "CONTROLLERS": - [ - { "dev_name":"i2c-0", "dev":"SMBUS0" } - ] - } - }, - - "SMBUS0": - { - "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, - "i2c": - { - "topo_info": {"dev_addr": "0x0"}, - "DEVICES": - [ - {"dev": "EEPROM1"}, - {"dev": "MUX1"} - ] - } - }, - - "EEPROM1": - { - "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, - "i2c": - { - "topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c02"}, - "dev_attr": {"access_mode": "BLOCK"}, - "attr_list": [ - {"attr_name": "eeprom"} - ] - } - }, - - "MUX1": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, - "i2c": - { - "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x10"}, - "channel": - [ - { "chn":"0", "dev":"MUX2" }, - { "chn":"0", "dev":"MUX3" }, - { "chn":"0", "dev":"MUX4" }, - { "chn":"0", "dev":"MUX5" }, - { "chn":"0", "dev":"MUX6" }, - { "chn":"1", "dev":"MUX7" } - ] - } - }, - - "MUX2": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x76", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x20"}, - "channel": - [ - { "chn":"2", "dev":"CPLD1" }, - { "chn":"3", "dev":"CPLD2" }, - { "chn":"4", "dev":"CPLD3" } - ] - } - }, - - "CPLD1": - { - "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX2"}, - "i2c": - { - "topo_info": { "parent_bus":"0x22", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, - "dev_attr":{} - } - }, + ] + + } + }, + + "SYSTEM": + { + "dev_info": {"device_type":"CPU", "device_name":"ROOT_COMPLEX", "device_parent":null}, + "i2c": + { + "CONTROLLERS": + [ + { "dev_name":"i2c-0", "dev":"SMBUS0" } + ] + } + }, + + "SMBUS0": + { + "dev_info": {"device_type": "SMBUS", "device_name": "SMBUS0", "device_parent": "SYSTEM"}, + "i2c": + { + "topo_info": {"dev_addr": "0x0"}, + "DEVICES": + [ + {"dev": "EEPROM1"}, + {"dev": "MUX1"} + ] + } + }, + + "EEPROM1": + { + "dev_info": {"device_type": "EEPROM", "device_name": "EEPROM1", "device_parent": "SMBUS0"}, + "i2c": + { + "topo_info": {"parent_bus": "0x0", "dev_addr": "0x56", "dev_type": "24c02"}, + "dev_attr": {"access_mode": "BLOCK"}, + "attr_list": [ + {"attr_name": "eeprom"} + ] + } + }, + + "MUX1": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX1", "device_parent":"SMBUS0"}, + "i2c": + { + "topo_info": { "parent_bus":"0x0", "dev_addr":"0x77", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x10"}, + "channel": + [ + { "chn":"0", "dev":"MUX2" }, + { "chn":"0", "dev":"MUX3" }, + { "chn":"0", "dev":"MUX4" }, + { "chn":"0", "dev":"MUX5" }, + { "chn":"0", "dev":"MUX6" }, + { "chn":"1", "dev":"MUX7" } + ] + } + }, + + "MUX2": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX2", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x76", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x20"}, + "channel": + [ + { "chn":"2", "dev":"CPLD1" }, + { "chn":"3", "dev":"CPLD2" }, + { "chn":"4", "dev":"CPLD3" } + ] + } + }, + + "CPLD1": + { + "dev_info": { "device_type":"CPLD", "device_name":"CPLD1", "device_parent":"MUX2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x22", "dev_addr":"0x60", "dev_type":"i2c_cpld"}, + "dev_attr":{} + } + }, "CPLD2": { @@ -134,15 +134,15 @@ } }, - "MUX3": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x72", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x30"}, - "channel": - [ + "MUX3": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX3", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x72", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x30"}, + "channel": + [ { "chn":"0", "dev":"PORT9" }, { "chn":"1", "dev":"PORT10" }, { "chn":"2", "dev":"PORT11" }, @@ -151,19 +151,19 @@ { "chn":"5", "dev":"PORT2" }, { "chn":"6", "dev":"PORT3" }, { "chn":"7", "dev":"PORT4" } - ] - } - }, - - "MUX4": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x73", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x40"}, - "channel": - [ + ] + } + }, + + "MUX4": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX4", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x73", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x40"}, + "channel": + [ { "chn":"0", "dev":"PORT6" }, { "chn":"1", "dev":"PORT5" }, { "chn":"2", "dev":"PORT8" }, @@ -172,19 +172,19 @@ { "chn":"5", "dev":"PORT14" }, { "chn":"6", "dev":"PORT15" }, { "chn":"7", "dev":"PORT16" } - ] - } - }, - - "MUX5": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x74", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x50"}, - "channel": - [ + ] + } + }, + + "MUX5": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX5", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x74", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x50"}, + "channel": + [ { "chn":"0", "dev":"PORT17" }, { "chn":"1", "dev":"PORT18" }, { "chn":"2", "dev":"PORT19" }, @@ -193,19 +193,19 @@ { "chn":"5", "dev":"PORT26" }, { "chn":"6", "dev":"PORT27" }, { "chn":"7", "dev":"PORT28" } - ] - } - }, - - "MUX6": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x10", "dev_addr":"0x75", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x60"}, - "channel": - [ + ] + } + }, + + "MUX6": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX6", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x10", "dev_addr":"0x75", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x60"}, + "channel": + [ { "chn":"0", "dev":"PORT29" }, { "chn":"1", "dev":"PORT30" }, { "chn":"2", "dev":"PORT31" }, @@ -214,10 +214,10 @@ { "chn":"5", "dev":"PORT22" }, { "chn":"6", "dev":"PORT23" }, { "chn":"7", "dev":"PORT24" } - ] - } - }, - + ] + } + }, + "PORT1": { "dev_info": { "device_type":"QSFP", "device_name":"PORT1", "device_parent":"MUX3"}, @@ -247,7 +247,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT1-CTRL": { @@ -293,7 +293,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT2-CTRL": { @@ -339,7 +339,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT3-CTRL": { @@ -385,7 +385,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT4-CTRL": { @@ -431,7 +431,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT5-CTRL": { @@ -477,7 +477,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT6-CTRL": { @@ -523,7 +523,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT7-CTRL": { @@ -569,7 +569,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT8-CTRL": { @@ -615,7 +615,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT9-CTRL": { @@ -661,7 +661,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT10-CTRL": { @@ -707,7 +707,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT11-CTRL": { @@ -753,7 +753,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT12-CTRL": { @@ -799,7 +799,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT13-CTRL": { @@ -845,7 +845,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT14-CTRL": { @@ -891,7 +891,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT15-CTRL": { @@ -937,7 +937,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT16-CTRL": { @@ -983,7 +983,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT17-CTRL": { @@ -1029,7 +1029,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT18-CTRL": { @@ -1075,7 +1075,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT19-CTRL": { @@ -1121,7 +1121,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT20-CTRL": { @@ -1167,7 +1167,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT21-CTRL": { @@ -1213,7 +1213,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT22-CTRL": { @@ -1259,7 +1259,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT23-CTRL": { @@ -1305,7 +1305,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT24-CTRL": { @@ -1351,7 +1351,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT25-CTRL": { @@ -1397,7 +1397,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT26-CTRL": { @@ -1443,7 +1443,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT27-CTRL": { @@ -1489,7 +1489,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT28-CTRL": { @@ -1535,7 +1535,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT29-CTRL": { @@ -1581,7 +1581,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT30-CTRL": { @@ -1627,7 +1627,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT31-CTRL": { @@ -1673,7 +1673,7 @@ [ { "attr_name":"eeprom"} ] - } + } }, "PORT32-CTRL": { @@ -1690,240 +1690,240 @@ } }, - "MUX7": - { - "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX1"}, - "i2c": - { - "topo_info": { "parent_bus":"0x11", "dev_addr":"0x71", "dev_type":"pca9548"}, - "dev_attr": { "virt_bus":"0x70"}, - "channel": - [ - { "chn":"0", "dev":"PSU2" }, - { "chn":"1", "dev":"PSU1" }, - { "chn":"5", "dev":"FAN-CTRL" }, - { "chn":"5", "dev":"TEMP1" }, - { "chn":"6", "dev":"TEMP2" }, - { "chn":"6", "dev":"TEMP3" }, - { "chn":"6", "dev":"TEMP4" }, - { "chn":"6", "dev":"TEMP5" } - ] - } - }, - - "PSU2": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX7" }, - "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU2-PMBUS"} - ] - }, - - "bmc": - { - "attr_list":[ - { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} - ] - } - }, - - "PSU2-PMBUS": - { - "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU2"}, - "i2c": - { - "topo_info": { "parent_bus":"0x70", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "PSU1": - { - "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX7"}, - "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, - "i2c": - { - "interface": - [ - { "itf":"pmbus", "dev":"PSU1-PMBUS" } - ] - }, - - "bmc": - { - "attr_list": - [ - { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, - { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} - ] - } - }, - - "PSU1-PMBUS": - { - "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU1"}, - "i2c": - { - "topo_info":{ "parent_bus":"0x71", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, - "attr_list": - [ - { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, - { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, - { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, - { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, - { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, - { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, - { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} - ] - } - }, - - "FAN-CTRL": - { - "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x75", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, - "dev_attr": { "num_fan":"6"}, - "attr_list": - [ - { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, - { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, - { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, - { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, - { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, - { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, - { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, - { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, - { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, - { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, - { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } - ] - } - }, - - "TEMP1" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x75", "dev_addr":"0x4c", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP2" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x76", "dev_addr":"0x48", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP3" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x76", "dev_addr":"0x49", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP4" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4a", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "TEMP5" : - { - "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP5", "device_parent":"MUX7"}, - "i2c": - { - "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4b", "dev_type":"lm75"}, - "attr_list": - [ - { "attr_name": "temp1_max"}, - { "attr_name": "temp1_max_hyst"}, - { "attr_name": "temp1_input"} - ] - } - }, - - "SYSSTATUS": - { - "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, - "dev_attr":{ }, - "attr_list": - [ + "MUX7": + { + "dev_info": { "device_type":"MUX", "device_name":"MUX7", "device_parent":"MUX1"}, + "i2c": + { + "topo_info": { "parent_bus":"0x11", "dev_addr":"0x71", "dev_type":"pca9548"}, + "dev_attr": { "virt_bus":"0x70"}, + "channel": + [ + { "chn":"0", "dev":"PSU2" }, + { "chn":"1", "dev":"PSU1" }, + { "chn":"5", "dev":"FAN-CTRL" }, + { "chn":"5", "dev":"TEMP1" }, + { "chn":"6", "dev":"TEMP2" }, + { "chn":"6", "dev":"TEMP3" }, + { "chn":"6", "dev":"TEMP4" }, + { "chn":"6", "dev":"TEMP5" } + ] + } + }, + + "PSU2": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU2", "device_parent":"MUX7" }, + "dev_attr": { "dev_idx":"2", "num_psu_fans":"1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU2-PMBUS"} + ] + }, + + "bmc": + { + "attr_list":[ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU2-PMBUS": + { + "dev_info": {"device_type":"PSU-PMBUS", "device_name":"PSU2-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU2"}, + "i2c": + { + "topo_info": { "parent_bus":"0x70", "dev_addr":"0x58", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x14", "attr_cmpval":"0x14", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x58", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "PSU1": + { + "dev_info": { "device_type":"PSU", "device_name":"PSU1", "device_parent":"MUX7"}, + "dev_attr": { "dev_idx":"1", "num_psu_fans": "1"}, + "i2c": + { + "interface": + [ + { "itf":"pmbus", "dev":"PSU1-PMBUS" } + ] + }, + + "bmc": + { + "attr_list": + [ + { "attr_name":"PSU_OK", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VIN", "bmc_cmd":"ipmitool bmc info"}, + { "attr_name":"PSU_VOUT", "bmc_cmd":"ipmitool bmc info"} + ] + } + }, + + "PSU1-PMBUS": + { + "dev_info": { "device_type":"PSU-PMBUS", "device_name":"PSU1-PMBUS", "device_parent":"MUX7", "virt_parent":"PSU1"}, + "i2c": + { + "topo_info":{ "parent_bus":"0x71", "dev_addr":"0x5b", "dev_type":"psu_pmbus"}, + "attr_list": + [ + { "attr_name":"psu_present", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"psu_model_name", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9a", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"9" }, + { "attr_name":"psu_power_good", "attr_devaddr":"0x60", "attr_devtype":"cpld", "attr_offset":"0x2", "attr_mask":"0x28", "attr_cmpval":"0x28", "attr_len":"1"}, + { "attr_name":"psu_mfr_id", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0X99", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"10" }, + { "attr_name":"psu_serial_num", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x9e", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"20" }, + { "attr_name":"psu_fan_dir", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0xc3", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"5"}, + { "attr_name":"psu_v_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8b", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_i_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x8c", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_p_out", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x96", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"}, + { "attr_name":"psu_fan1_speed_rpm", "attr_devaddr":"0x5b", "attr_devtype":"pmbus", "attr_offset":"0x90", "attr_mask":"0x0", "attr_cmpval":"0xff", "attr_len":"2"} + ] + } + }, + + "FAN-CTRL": + { + "dev_info": { "device_type":"FAN", "device_name":"FAN-CTRL", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x75", "dev_addr":"0x66", "dev_type":"fan_ctrl"}, + "dev_attr": { "num_fan":"6"}, + "attr_list": + [ + { "attr_name":"fan1_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x1", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan2_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x2", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan3_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x4", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan4_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x8", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan5_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x10", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan6_present", "attr_devtype":"FAN-CTRL", "attr_offset":"0x0F", "attr_mask":"0x20", "attr_cmpval":"0x0", "attr_len":"1"}, + { "attr_name":"fan1_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x1", "attr_cmpval":"0x1", "attr_len":"1"}, + { "attr_name":"fan2_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x2", "attr_cmpval":"0x2", "attr_len":"1"}, + { "attr_name":"fan3_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x4", "attr_cmpval":"0x4", "attr_len":"1"}, + { "attr_name":"fan4_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x8", "attr_cmpval":"0x8", "attr_len":"1"}, + { "attr_name":"fan5_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x10", "attr_cmpval":"0x10", "attr_len":"1"}, + { "attr_name":"fan6_direction", "attr_devtype":"FAN-CTRL", "attr_offset":"0x10", "attr_mask":"0x20", "attr_cmpval":"0x20", "attr_len":"1"}, + { "attr_name":"fan1_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x12", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan2_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x13", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan3_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x14", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan4_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x15", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan5_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x16", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan6_front_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x17", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100", "attr_is_divisor":0}, + { "attr_name":"fan1_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x22", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan2_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x23", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan3_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x24", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan4_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x25", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan5_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x26", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan6_rear_rpm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x27", "attr_mask":"0xFF", "attr_len":"1", "attr_mult":"100" , "attr_is_divisor":0}, + { "attr_name":"fan1_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan2_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan3_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan4_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan5_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" }, + { "attr_name":"fan6_pwm", "attr_devtype":"FAN-CTRL", "attr_offset":"0x11", "attr_mask":"0x0F", "attr_len":"1" } + ] + } + }, + + "TEMP1" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP1", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x75", "dev_addr":"0x4c", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP2" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP2", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x48", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP3" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP3", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x49", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP4" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP4", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4a", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "TEMP5" : + { + "dev_info": { "device_type":"TEMP_SENSOR", "device_name":"TEMP5", "device_parent":"MUX7"}, + "i2c": + { + "topo_info": { "parent_bus":"0x76", "dev_addr":"0x4b", "dev_type":"lm75"}, + "attr_list": + [ + { "attr_name": "temp1_max"}, + { "attr_name": "temp1_max_hyst"}, + { "attr_name": "temp1_input"} + ] + } + }, + + "SYSSTATUS": + { + "dev_info":{ "device_type":"SYSSTAT", "device_name":"SYSSTATUS"}, + "dev_attr":{ }, + "attr_list": + [ { "attr_name":"board_info","attr_devaddr":"0x60", "attr_offset":"0x0","attr_mask":"0xf","attr_len":"0x1"}, { "attr_name":"cpld1_version","attr_devaddr":"0x60","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, @@ -1935,36 +1935,36 @@ { "attr_name":"cpld2_version","attr_devaddr":"0x62","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"}, { "attr_name":"cpld3_version","attr_devaddr":"0x64","attr_offset":"0x1","attr_mask":"0xff","attr_len":"0x1"} - ] - }, - - - "LOC_LED": - { - "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, - "dev_attr": { "index":"0"}, - "i2c" : { - "attr_list": - [ - {"attr_name":"on", "bits" : "7", "color" : "Blue", "value" : "0x0", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, - {"attr_name":"off", "bits" : "7", "color" : "Off", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} - ] - } - }, - - "DIAG_LED": - { - "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, - "dev_attr": { "index":"0"}, - "i2c" : { - "attr_list": - [ - {"attr_name":"on", "bits" : "1:0", "color" : "Green", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, - {"attr_name":"faulty", "bits" : "1:0", "color" : "Red", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, - {"attr_name":"off", "bits" : "1:0", "color" : "Off", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} - ] - } - - } - + ] + }, + + + "LOC_LED": + { + "dev_info": { "device_type":"LED", "device_name":"LOC_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "7", "color" : "Blue", "value" : "0x0", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "7", "color" : "Off", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + }, + + "DIAG_LED": + { + "dev_info": { "device_type":"LED", "device_name":"DIAG_LED"}, + "dev_attr": { "index":"0"}, + "i2c" : { + "attr_list": + [ + {"attr_name":"on", "bits" : "1:0", "color" : "Green", "value" : "0x2", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"faulty", "bits" : "1:0", "color" : "Red", "value" : "0x1", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"}, + {"attr_name":"off", "bits" : "1:0", "color" : "Off", "value" : "0x3", "swpld_addr" : "0x60", "swpld_addr_offset" : "0x41"} + ] + } + + } + } diff --git a/platform/pddf/i2c/modules/client/pddf_client_module.c b/platform/pddf/i2c/modules/client/pddf_client_module.c index 5ad0a6a75f59..c378fc84b635 100644 --- a/platform/pddf/i2c/modules/client/pddf_client_module.c +++ b/platform/pddf/i2c/modules/client/pddf_client_module.c @@ -39,13 +39,13 @@ PDDF_DATA_ATTR(error, S_IRUGO, show_error_code, NULL, PDDF_INT_DEC, sizeof(int), static struct attribute *pddf_clients_data_attributes[] = { - &attr_i2c_type.dev_attr.attr, - &attr_i2c_name.dev_attr.attr, - &attr_parent_bus.dev_attr.attr, - &attr_dev_type.dev_attr.attr, - &attr_dev_addr.dev_attr.attr, - &attr_error.dev_attr.attr, - NULL + &attr_i2c_type.dev_attr.attr, + &attr_i2c_name.dev_attr.attr, + &attr_parent_bus.dev_attr.attr, + &attr_dev_type.dev_attr.attr, + &attr_dev_addr.dev_attr.attr, + &attr_error.dev_attr.attr, + NULL }; struct attribute_group pddf_clients_data_group = { @@ -58,8 +58,8 @@ EXPORT_SYMBOL(pddf_clients_data_group); PDDF_DATA_ATTR(showall, S_IRUGO, show_all_devices, NULL, PDDF_INT_DEC, sizeof(int), (void *)&showall, NULL); static struct attribute *pddf_allclients_data_attributes[] = { - &attr_showall.dev_attr.attr, - NULL + &attr_showall.dev_attr.attr, + NULL }; struct attribute_group pddf_allclients_data_group = { .attrs = pddf_allclients_data_attributes, @@ -71,124 +71,124 @@ struct attribute_group pddf_allclients_data_group = { void set_attr_data(void * ptr) { - pddf_data.data=ptr; + pddf_data.data=ptr; } ssize_t show_all_devices(struct device *dev, struct device_attribute *da, char *buf) { - int ret = 0; - PDDF_ATTR *pptr = (PDDF_ATTR *)da; - int *ptr = (int *)pptr->addr; + int ret = 0; + PDDF_ATTR *pptr = (PDDF_ATTR *)da; + int *ptr = (int *)pptr->addr; - traverse_device_table(); - ret = sprintf(buf, "Total Devices: %d\n", *ptr); + traverse_device_table(); + ret = sprintf(buf, "Total Devices: %d\n", *ptr); - return ret; + return ret; } ssize_t show_error_code(struct device *dev, struct device_attribute *da, char *buf) { - int ret = 0; - PDDF_ATTR *pptr = (PDDF_ATTR *)da; - NEW_DEV_ATTR *ptr = ( NEW_DEV_ATTR *)pptr->addr; + int ret = 0; + PDDF_ATTR *pptr = (PDDF_ATTR *)da; + NEW_DEV_ATTR *ptr = ( NEW_DEV_ATTR *)pptr->addr; - ret = sprintf(buf, "0x%x:%s\n", (ptr->error), ptr->errstr); + ret = sprintf(buf, "0x%x:%s\n", (ptr->error), ptr->errstr); - return ret; + return ret; } void set_error_code(int ecode, char *estr) { - pddf_data.error = ecode; - strcpy(pddf_data.errstr, estr); - return; + pddf_data.error = ecode; + strcpy(pddf_data.errstr, estr); + return; } EXPORT_SYMBOL(set_error_code); ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, char *buf) { - int ret = 0; - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - /*pddf_dbg(KERN_ERR "[ READ ] DATA ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ - switch(ptr->type) - { - case PDDF_CHAR: - ret = sprintf(buf, "%s\n", ptr->addr); - break; - case PDDF_UCHAR: - ret = sprintf(buf, "%d\n", *(unsigned char*)(ptr->addr)); - break; - case PDDF_INT_DEC: - ret = sprintf(buf, "%d\n", *(int*)(ptr->addr)); - break; - case PDDF_INT_HEX: - ret = sprintf(buf, "0x%x\n", *(int*)(ptr->addr)); - break; - case PDDF_USHORT: - ret = sprintf(buf, "0x%x\n", *(unsigned short *)(ptr->addr)); - break; - case PDDF_UINT32: - ret = sprintf(buf, "0x%x\n", *(uint32_t *)(ptr->addr)); - break; - default: - break; - } - - return ret; + int ret = 0; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + /*pddf_dbg(KERN_ERR "[ READ ] DATA ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ + switch(ptr->type) + { + case PDDF_CHAR: + ret = sprintf(buf, "%s\n", ptr->addr); + break; + case PDDF_UCHAR: + ret = sprintf(buf, "%d\n", *(unsigned char*)(ptr->addr)); + break; + case PDDF_INT_DEC: + ret = sprintf(buf, "%d\n", *(int*)(ptr->addr)); + break; + case PDDF_INT_HEX: + ret = sprintf(buf, "0x%x\n", *(int*)(ptr->addr)); + break; + case PDDF_USHORT: + ret = sprintf(buf, "0x%x\n", *(unsigned short *)(ptr->addr)); + break; + case PDDF_UINT32: + ret = sprintf(buf, "0x%x\n", *(uint32_t *)(ptr->addr)); + break; + default: + break; + } + + return ret; } EXPORT_SYMBOL(show_pddf_data); ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - int ret = 0, num = 0; - - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - /*pddf_dbg(KERN_ERR "[ WRITE ] ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ - - switch(ptr->type) - { - case PDDF_CHAR: - strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf - ptr->addr[strlen(buf)-1] = '\0'; - /*pddf_dbg(KERN_ERR "Stored value: %s\n", ptr->addr);*/ - break; - case PDDF_UCHAR: - ret = kstrtoint(buf,10,&num); - if (ret==0) - *(unsigned char *)(ptr->addr) = (unsigned char)num; - /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ - break; - case PDDF_INT_DEC: - ret = kstrtoint(buf,10,&num); - if (ret==0) - *(int *)(ptr->addr) = num; - /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ - break; - case PDDF_INT_HEX: - ret = kstrtoint(buf,16,&num); - if (ret==0) - *(int *)(ptr->addr) = num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ - break; - case PDDF_USHORT: - ret = kstrtoint(buf,16,&num); - if (ret==0) - *(unsigned short *)(ptr->addr) = (unsigned short)num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ - break; - case PDDF_UINT32: - ret = kstrtoint(buf,16,&num); - if (ret==0) - *(uint32_t *)(ptr->addr) = (uint32_t)num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ - break; - default: - break; - } - - return count; + int ret = 0, num = 0; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + /*pddf_dbg(KERN_ERR "[ WRITE ] ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ + + switch(ptr->type) + { + case PDDF_CHAR: + strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf + ptr->addr[strlen(buf)-1] = '\0'; + /*pddf_dbg(KERN_ERR "Stored value: %s\n", ptr->addr);*/ + break; + case PDDF_UCHAR: + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(unsigned char *)(ptr->addr) = (unsigned char)num; + /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_INT_DEC: + ret = kstrtoint(buf,10,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_INT_HEX: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(int *)(ptr->addr) = num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_USHORT: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(unsigned short *)(ptr->addr) = (unsigned short)num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + case PDDF_UINT32: + ret = kstrtoint(buf,16,&num); + if (ret==0) + *(uint32_t *)(ptr->addr) = (uint32_t)num; + /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ + break; + default: + break; + } + + return count; } EXPORT_SYMBOL(store_pddf_data); @@ -219,70 +219,70 @@ DEFINE_HASHTABLE(htable, 8); int get_hash(char *name) { - int i=0; - int hash=0; - for(i=0; iname, name); - hdev->data = ptr; - pddf_dbg(CLIENT, KERN_ERR "%s: Adding ptr 0x%x to the hash table\n", __FUNCTION__, ptr); - hash_add(htable, &hdev->node, get_hash(hdev->name)); + PDEVICE *hdev=kmalloc(sizeof(PDEVICE), GFP_KERNEL ); + if(!hdev)return; + strcpy(hdev->name, name); + hdev->data = ptr; + pddf_dbg(CLIENT, KERN_ERR "%s: Adding ptr 0x%x to the hash table\n", __FUNCTION__, ptr); + hash_add(htable, &hdev->node, get_hash(hdev->name)); } EXPORT_SYMBOL(add_device_table); void* get_device_table(char *name) { - PDEVICE *dev=NULL; - int i=0; - - hash_for_each(htable, i, dev, node) { - if(strcmp(dev->name, name)==0) { - pddf_dbg(CLIENT, KERN_ERR "found entry: %s 0x%x\n", dev->name, dev->data); - return (void *)dev->data; - } - } - - return NULL; + PDEVICE *dev=NULL; + int i=0; + + hash_for_each(htable, i, dev, node) { + if(strcmp(dev->name, name)==0) { + pddf_dbg(CLIENT, KERN_ERR "found entry: %s 0x%x\n", dev->name, dev->data); + return (void *)dev->data; + } + } + + return NULL; } EXPORT_SYMBOL(get_device_table); void delete_device_table(char *name) { - PDEVICE *dev=NULL; - int i=0; - - hash_for_each(htable, i, dev, node) { - if(strcmp(dev->name, name)==0) { - pddf_dbg(CLIENT, KERN_ERR "found entry to delete: %s 0x%x\n", dev->name, dev->data); - hash_del(&(dev->node)); - } - } - return; + PDEVICE *dev=NULL; + int i=0; + + hash_for_each(htable, i, dev, node) { + if(strcmp(dev->name, name)==0) { + pddf_dbg(CLIENT, KERN_ERR "found entry to delete: %s 0x%x\n", dev->name, dev->data); + hash_del(&(dev->node)); + } + } + return; } EXPORT_SYMBOL(delete_device_table); void traverse_device_table(void ) { - PDEVICE *dev=NULL; - int i=0; - hash_for_each(htable, i, dev, node) { - pddf_dbg(CLIENT, KERN_ERR "Entry[%d]: %s : 0x%x\n", i, dev->name, dev->data); - } - showall = i; + PDEVICE *dev=NULL; + int i=0; + hash_for_each(htable, i, dev, node) { + pddf_dbg(CLIENT, KERN_ERR "Entry[%d]: %s : 0x%x\n", i, dev->name, dev->data); + } + showall = i; } EXPORT_SYMBOL(traverse_device_table); @@ -291,7 +291,7 @@ static struct kobject *pddf_kobj; struct kobject *get_device_i2c_kobj(void) { - return device_kobj; + return device_kobj; } EXPORT_SYMBOL(get_device_i2c_kobj); @@ -306,21 +306,21 @@ int __init pddf_data_init(void) pddf_kobj = kobject_create_and_add("pddf", kernel_kobj); if(!pddf_kobj) { return -ENOMEM; - } + } device_kobj = kobject_create_and_add("devices", pddf_kobj); if(!device_kobj) { return -ENOMEM; - } + } - init_device_table(); + init_device_table(); - ret = sysfs_create_group(device_kobj, &pddf_allclients_data_group); - if (ret) + ret = sysfs_create_group(device_kobj, &pddf_allclients_data_group); + if (ret) { kobject_put(device_kobj); return ret; } - pddf_dbg(CLIENT, "CREATED PDDF ALLCLIENTS CREATION SYSFS GROUP\n"); + pddf_dbg(CLIENT, "CREATED PDDF ALLCLIENTS CREATION SYSFS GROUP\n"); @@ -330,13 +330,13 @@ int __init pddf_data_init(void) void __exit pddf_data_exit(void) { - pddf_dbg(CLIENT, "PDDF_DATA MODULE.. exit\n"); - sysfs_remove_group(device_kobj, &pddf_allclients_data_group); + pddf_dbg(CLIENT, "PDDF_DATA MODULE.. exit\n"); + sysfs_remove_group(device_kobj, &pddf_allclients_data_group); - kobject_put(device_kobj); - kobject_put(pddf_kobj); - pddf_dbg(CLIENT, KERN_ERR "%s: Removed the kernle object for 'pddf' and 'device' \n", __FUNCTION__); - return; + kobject_put(device_kobj); + kobject_put(pddf_kobj); + pddf_dbg(CLIENT, KERN_ERR "%s: Removed the kernle object for 'pddf' and 'device' \n", __FUNCTION__); + return; } module_init(pddf_data_init); diff --git a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c index a302954a976d..2a287c054b4d 100755 --- a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c +++ b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c @@ -16,11 +16,11 @@ static LIST_HEAD(cpld_client_list); -static struct mutex list_lock; +static struct mutex list_lock; struct cpld_client_node { - struct i2c_client *client; - struct list_head list; + struct i2c_client *client; + struct list_head list; }; /* Addresses scanned for board_i2c_cpld @@ -29,153 +29,153 @@ static const unsigned short normal_i2c[] = { 0x31, 0x32, 0x33, 0x35, 0x60, 0x61, static void board_i2c_cpld_add_client(struct i2c_client *client) { - struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); - - if (!node) { - dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); - return; - } - - node->client = client; - - mutex_lock(&list_lock); - list_add(&node->list, &cpld_client_list); - mutex_unlock(&list_lock); + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); } static void board_i2c_cpld_remove_client(struct i2c_client *client) { - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int found = 0; - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client == client) { - found = 1; - break; - } - } - - if (found) { - list_del(list_node); - kfree(cpld_node); - } - - mutex_unlock(&list_lock); + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); } static int board_i2c_cpld_probe(struct i2c_client *client, - const struct i2c_device_id *dev_id) + const struct i2c_device_id *dev_id) { - int status; + int status; - if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { - dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr); - status = -EIO; - goto exit; - } + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { + dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr); + status = -EIO; + goto exit; + } - dev_dbg(&client->dev, "chip found\n"); - board_i2c_cpld_add_client(client); - - return 0; + dev_dbg(&client->dev, "chip found\n"); + board_i2c_cpld_add_client(client); + + return 0; exit: - return status; + return status; } static int board_i2c_cpld_remove(struct i2c_client *client) { - board_i2c_cpld_remove_client(client); - - return 0; + board_i2c_cpld_remove_client(client); + + return 0; } static const struct i2c_device_id board_i2c_cpld_id[] = { - { "i2c_cpld", 0 }, - {} + { "i2c_cpld", 0 }, + {} }; MODULE_DEVICE_TABLE(i2c, board_i2c_cpld_id); static struct i2c_driver board_i2c_cpld_driver = { - .class = I2C_CLASS_HWMON, - .driver = { - .name = "i2c_cpld", - }, - .probe = board_i2c_cpld_probe, - .remove = board_i2c_cpld_remove, - .id_table = board_i2c_cpld_id, - .address_list = normal_i2c, + .class = I2C_CLASS_HWMON, + .driver = { + .name = "i2c_cpld", + }, + .probe = board_i2c_cpld_probe, + .remove = board_i2c_cpld_remove, + .id_table = board_i2c_cpld_id, + .address_list = normal_i2c, }; int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg) { - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int ret = -EPERM; - - //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client->addr == cpld_addr) { - ret = i2c_smbus_read_byte_data(cpld_node->client, reg); - break; - } - } - - mutex_unlock(&list_lock); - - return ret; + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_read_byte_data(cpld_node->client, reg); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; } EXPORT_SYMBOL(board_i2c_cpld_read); int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) { - struct list_head *list_node = NULL; - struct cpld_client_node *cpld_node = NULL; - int ret = -EIO; - - //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); - - mutex_lock(&list_lock); - - list_for_each(list_node, &cpld_client_list) - { - cpld_node = list_entry(list_node, struct cpld_client_node, list); - - if (cpld_node->client->addr == cpld_addr) { - ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value); - break; - } - } - - mutex_unlock(&list_lock); - - return ret; + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == cpld_addr) { + ret = i2c_smbus_write_byte_data(cpld_node->client, reg, value); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; } EXPORT_SYMBOL(board_i2c_cpld_write); static int __init board_i2c_cpld_init(void) { - mutex_init(&list_lock); - return i2c_add_driver(&board_i2c_cpld_driver); + mutex_init(&list_lock); + return i2c_add_driver(&board_i2c_cpld_driver); } static void __exit board_i2c_cpld_exit(void) { - i2c_del_driver(&board_i2c_cpld_driver); + i2c_del_driver(&board_i2c_cpld_driver); } - + MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("board_i2c_cpld driver"); MODULE_LICENSE("GPL"); diff --git a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c index 0f9f3f2f0a63..cd5f098ef26b 100644 --- a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c +++ b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c @@ -33,83 +33,83 @@ PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, NULL, static struct attribute *cpld_attributes[] = { - &attr_dev_ops.dev_attr.attr, - NULL + &attr_dev_ops.dev_attr.attr, + NULL }; static const struct attribute_group pddf_cpld_client_data_group = { - .attrs = cpld_attributes, + .attrs = cpld_attributes, }; /*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); - struct i2c_adapter *adapter; - static struct i2c_board_info board_info; - struct i2c_client *client_ptr; - - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ - if (strncmp(buf, "add", strlen(buf)-1)==0) - { - adapter = i2c_get_adapter(device_ptr->parent_bus); - - if (strncmp(device_ptr->dev_type, "i2c_cpld", strlen("i2c_cpld"))==0) - { - board_info = (struct i2c_board_info) { - .platform_data = (void *)NULL, - }; - - board_info.addr = device_ptr->dev_addr; - strcpy(board_info.type, device_ptr->dev_type); - - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ - client_ptr = i2c_new_device(adapter, &board_info); - - if (client_ptr != NULL) { - i2c_put_adapter(adapter); - pddf_dbg(CPLD, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); - add_device_table(device_ptr->i2c_name, (void*)client_ptr); - } - else { - i2c_put_adapter(adapter); - goto free_data; - } - - } - else - { - printk(KERN_ERR "%s: Unsupported type of cpld - unable to add i2c client\n", __FUNCTION__); - } - } - else if (strncmp(buf, "delete", strlen(buf)-1)==0) - { - /*Get the i2c_client handle for the created client*/ - client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); - if (client_ptr) - { - pddf_dbg(CPLD, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); - i2c_unregister_device(client_ptr); - delete_device_table(device_ptr->i2c_name); - } - else - { - printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); - } - } - else - { - printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + static struct i2c_board_info board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(device_ptr->parent_bus); + + if (strncmp(device_ptr->dev_type, "i2c_cpld", strlen("i2c_cpld"))==0) + { + board_info = (struct i2c_board_info) { + .platform_data = (void *)NULL, + }; + + board_info.addr = device_ptr->dev_addr; + strcpy(board_info.type, device_ptr->dev_type); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ + client_ptr = i2c_new_device(adapter, &board_info); + + if (client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(CPLD, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + add_device_table(device_ptr->i2c_name, (void*)client_ptr); + } + else { + i2c_put_adapter(adapter); + goto free_data; + } + + } + else + { + printk(KERN_ERR "%s: Unsupported type of cpld - unable to add i2c client\n", __FUNCTION__); + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); + if (client_ptr) + { + pddf_dbg(CPLD, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(device_ptr->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } free_data: - /*TODO: free the device_ptr->data is dynamically allocated*/ - memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); + /*TODO: free the device_ptr->data is dynamically allocated*/ + memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); - return count; + return count; } @@ -117,45 +117,45 @@ static struct kobject *cpld_kobj; int __init cpld_data_init(void) { - struct kobject *device_kobj; - int ret = 0; + struct kobject *device_kobj; + int ret = 0; - pddf_dbg(CPLD, "CPLD_DATA MODULE.. init\n"); + pddf_dbg(CPLD, "CPLD_DATA MODULE.. init\n"); - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; - cpld_kobj = kobject_create_and_add("cpld", device_kobj); - if(!cpld_kobj) - return -ENOMEM; - - - ret = sysfs_create_group(cpld_kobj, &pddf_clients_data_group); - if (ret) + cpld_kobj = kobject_create_and_add("cpld", device_kobj); + if(!cpld_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(cpld_kobj, &pddf_clients_data_group); + if (ret) { kobject_put(cpld_kobj); return ret; } - pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); - ret = sysfs_create_group(cpld_kobj, &pddf_cpld_client_data_group); - if (ret) + ret = sysfs_create_group(cpld_kobj, &pddf_cpld_client_data_group); + if (ret) { - sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); + sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); kobject_put(cpld_kobj); return ret; } - pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); - return ret; + pddf_dbg(CPLD, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + return ret; } void __exit cpld_data_exit(void) { - pddf_dbg(CPLD, "CPLD_DATA MODULE.. exit\n"); - sysfs_remove_group(cpld_kobj, &pddf_cpld_client_data_group); - sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); + pddf_dbg(CPLD, "CPLD_DATA MODULE.. exit\n"); + sysfs_remove_group(cpld_kobj, &pddf_cpld_client_data_group); + sysfs_remove_group(cpld_kobj, &pddf_clients_data_group); kobject_put(cpld_kobj); pddf_dbg(CPLD, KERN_ERR "%s: Removed the kobjects for 'cpld'\n",__FUNCTION__); return; diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c index 723b8ff1f4ea..289f1f6bf4cb 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c @@ -28,81 +28,81 @@ void get_fan_duplicate_sysfs(int idx, char *str) { - switch (idx) - { - case FAN1_FRONT_RPM: - strcpy(str, "fan1_input"); - break; - case FAN2_FRONT_RPM: - strcpy(str, "fan2_input"); + switch (idx) + { + case FAN1_FRONT_RPM: + strcpy(str, "fan1_input"); + break; + case FAN2_FRONT_RPM: + strcpy(str, "fan2_input"); break; - case FAN3_FRONT_RPM: - strcpy(str, "fan3_input"); + case FAN3_FRONT_RPM: + strcpy(str, "fan3_input"); break; - case FAN4_FRONT_RPM: - strcpy(str, "fan4_input"); + case FAN4_FRONT_RPM: + strcpy(str, "fan4_input"); break; - case FAN5_FRONT_RPM: - strcpy(str, "fan5_input"); + case FAN5_FRONT_RPM: + strcpy(str, "fan5_input"); break; - case FAN6_FRONT_RPM: - strcpy(str, "fan6_input"); + case FAN6_FRONT_RPM: + strcpy(str, "fan6_input"); break; - case FAN1_REAR_RPM: - strcpy(str, "fan11_input"); + case FAN1_REAR_RPM: + strcpy(str, "fan11_input"); break; - case FAN2_REAR_RPM: - strcpy(str, "fan12_input"); + case FAN2_REAR_RPM: + strcpy(str, "fan12_input"); break; - case FAN3_REAR_RPM: - strcpy(str, "fan13_input"); + case FAN3_REAR_RPM: + strcpy(str, "fan13_input"); break; - case FAN4_REAR_RPM: - strcpy(str, "fan14_input"); + case FAN4_REAR_RPM: + strcpy(str, "fan14_input"); break; - case FAN5_REAR_RPM: - strcpy(str, "fan15_input"); + case FAN5_REAR_RPM: + strcpy(str, "fan15_input"); break; - case FAN6_REAR_RPM: - strcpy(str, "fan16_input"); + case FAN6_REAR_RPM: + strcpy(str, "fan16_input"); break; - default: - break; - } + default: + break; + } - return; + return; } int fan_update_hw(struct device *dev, struct fan_attr_info *info, FAN_DATA_ATTR *udata) { - int status = 0; + int status = 0; struct i2c_client *client = to_i2c_client(dev); - FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; + FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; mutex_lock(&info->update_lock); - sysfs_attr_data = udata->access_data; - if (sysfs_attr_data->pre_set != NULL) - { - status = (sysfs_attr_data->pre_set)(client, udata, info); - if (status!=0) - printk(KERN_ERR "%s: pre_set function fails for %s attribute\n", __FUNCTION__, udata->aname); - } - if (sysfs_attr_data->do_set != NULL) - { - status = (sysfs_attr_data->do_set)(client, udata, info); - if (status!=0) - printk(KERN_ERR "%s: do_set function fails for %s attribute\n", __FUNCTION__, udata->aname); - - } - if (sysfs_attr_data->post_set != NULL) - { - status = (sysfs_attr_data->post_set)(client, udata, info); - if (status!=0) - printk(KERN_ERR "%s: post_set function fails for %s attribute\n", __FUNCTION__, udata->aname); - } + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_set != NULL) + { + status = (sysfs_attr_data->pre_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: pre_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_set != NULL) + { + status = (sysfs_attr_data->do_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: do_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + + } + if (sysfs_attr_data->post_set != NULL) + { + status = (sysfs_attr_data->post_set)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: post_set function fails for %s attribute\n", __FUNCTION__, udata->aname); + } mutex_unlock(&info->update_lock); @@ -111,40 +111,40 @@ int fan_update_hw(struct device *dev, struct fan_attr_info *info, FAN_DATA_ATTR int fan_update_attr(struct device *dev, struct fan_attr_info *info, FAN_DATA_ATTR *udata) { - int status = 0; + int status = 0; struct i2c_client *client = to_i2c_client(dev); - FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; + FAN_SYSFS_ATTR_DATA *sysfs_attr_data = NULL; mutex_lock(&info->update_lock); if (time_after(jiffies, info->last_updated + HZ + HZ / 2) || !info->valid) - { + { dev_dbg(&client->dev, "Starting pddf_fan update\n"); info->valid = 0; - sysfs_attr_data = udata->access_data; - if (sysfs_attr_data->pre_get != NULL) - { - status = (sysfs_attr_data->pre_get)(client, udata, info); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, udata->aname); - } - if (sysfs_attr_data->do_get != NULL) - { - status = (sysfs_attr_data->do_get)(client, udata, info); - if (status!=0) + sysfs_attr_data = udata->access_data; + if (sysfs_attr_data->pre_get != NULL) + { + status = (sysfs_attr_data->pre_get)(client, udata, info); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, udata->aname); + } + if (sysfs_attr_data->do_get != NULL) + { + status = (sysfs_attr_data->do_get)(client, udata, info); + if (status!=0) printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, udata->aname); - } - if (sysfs_attr_data->post_get != NULL) - { - status = (sysfs_attr_data->post_get)(client, udata, info); - if (status!=0) + } + if (sysfs_attr_data->post_get != NULL) + { + status = (sysfs_attr_data->post_get)(client, udata, info); + if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, udata->aname); - } + } - + info->last_updated = jiffies; info->valid = 1; } @@ -163,75 +163,75 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * FAN_DATA_ATTR *usr_data = NULL; struct fan_attr_info *attr_info = NULL; int i, status=0; - char new_str[ATTR_NAME_LEN] = ""; - FAN_SYSFS_ATTR_DATA *ptr = NULL; + char new_str[ATTR_NAME_LEN] = ""; + FAN_SYSFS_ATTR_DATA *ptr = NULL; for (i=0;inum_attr;i++) { - ptr = (FAN_SYSFS_ATTR_DATA *)pdata->fan_attrs[i].access_data; - get_fan_duplicate_sysfs(ptr->index , new_str); + ptr = (FAN_SYSFS_ATTR_DATA *)pdata->fan_attrs[i].access_data; + get_fan_duplicate_sysfs(ptr->index , new_str); if (strcmp(attr->dev_attr.attr.name, pdata->fan_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0) { - /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->fan_attrs[i].aname, ptr->index, new_str);*/ - attr_info = &data->attr_info[i]; + /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->fan_attrs[i].aname, ptr->index, new_str);*/ + attr_info = &data->attr_info[i]; usr_data = &pdata->fan_attrs[i]; - strcpy(new_str, ""); + strcpy(new_str, ""); } } if (attr_info==NULL || usr_data==NULL) { printk(KERN_ERR "%s is not supported attribute for this client\n", usr_data->aname); - goto exit; - } + goto exit; + } fan_update_attr(dev, attr_info, usr_data); - /*Decide the o/p based on attribute type */ - switch(attr->index) - { - case FAN1_PRESENT: - case FAN2_PRESENT: - case FAN3_PRESENT: - case FAN4_PRESENT: - case FAN5_PRESENT: - case FAN6_PRESENT: - case FAN1_DIRECTION: - case FAN2_DIRECTION: - case FAN3_DIRECTION: - case FAN4_DIRECTION: - case FAN5_DIRECTION: - case FAN6_DIRECTION: - case FAN1_FRONT_RPM: - case FAN2_FRONT_RPM: - case FAN3_FRONT_RPM: - case FAN4_FRONT_RPM: - case FAN5_FRONT_RPM: - case FAN6_FRONT_RPM: - case FAN1_REAR_RPM: - case FAN2_REAR_RPM: - case FAN3_REAR_RPM: - case FAN4_REAR_RPM: - case FAN5_REAR_RPM: - case FAN6_REAR_RPM: - case FAN1_PWM: - case FAN2_PWM: - case FAN3_PWM: - case FAN4_PWM: - case FAN5_PWM: - case FAN6_PWM: - case FAN1_FAULT: - case FAN2_FAULT: - case FAN3_FAULT: - case FAN4_FAULT: - case FAN5_FAULT: - case FAN6_FAULT: + /*Decide the o/p based on attribute type */ + switch(attr->index) + { + case FAN1_PRESENT: + case FAN2_PRESENT: + case FAN3_PRESENT: + case FAN4_PRESENT: + case FAN5_PRESENT: + case FAN6_PRESENT: + case FAN1_DIRECTION: + case FAN2_DIRECTION: + case FAN3_DIRECTION: + case FAN4_DIRECTION: + case FAN5_DIRECTION: + case FAN6_DIRECTION: + case FAN1_FRONT_RPM: + case FAN2_FRONT_RPM: + case FAN3_FRONT_RPM: + case FAN4_FRONT_RPM: + case FAN5_FRONT_RPM: + case FAN6_FRONT_RPM: + case FAN1_REAR_RPM: + case FAN2_REAR_RPM: + case FAN3_REAR_RPM: + case FAN4_REAR_RPM: + case FAN5_REAR_RPM: + case FAN6_REAR_RPM: + case FAN1_PWM: + case FAN2_PWM: + case FAN3_PWM: + case FAN4_PWM: + case FAN5_PWM: + case FAN6_PWM: + case FAN1_FAULT: + case FAN2_FAULT: + case FAN3_FAULT: + case FAN4_FAULT: + case FAN5_FAULT: + case FAN6_FAULT: status = attr_info->val.intval; - break; - default: - fan_dbg(KERN_ERR "%s: Unable to find the attribute index for %s\n", __FUNCTION__, usr_data->aname); - status = 0; - } + break; + default: + fan_dbg(KERN_ERR "%s: Unable to find the attribute index for %s\n", __FUNCTION__, usr_data->aname); + status = 0; + } exit: return sprintf(buf, "%d\n", status); @@ -247,11 +247,11 @@ ssize_t fan_store_default(struct device *dev, struct device_attribute *da, const FAN_DATA_ATTR *usr_data = NULL; struct fan_attr_info *attr_info = NULL; int i, ret ; - uint32_t val; + uint32_t val; for (i=0;inum_attr;i++) { - if (strcmp(data->attr_info[i].name, attr->dev_attr.attr.name) == 0 && strcmp(pdata->fan_attrs[i].aname, attr->dev_attr.attr.name) == 0) + if (strcmp(data->attr_info[i].name, attr->dev_attr.attr.name) == 0 && strcmp(pdata->fan_attrs[i].aname, attr->dev_attr.attr.name) == 0) { attr_info = &data->attr_info[i]; usr_data = &pdata->fan_attrs[i]; @@ -259,37 +259,37 @@ ssize_t fan_store_default(struct device *dev, struct device_attribute *da, const } if (attr_info==NULL || usr_data==NULL) { - printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); - goto exit; - } - - switch(attr->index) - { - case FAN1_PWM: - case FAN2_PWM: - case FAN3_PWM: - case FAN4_PWM: - case FAN5_PWM: - case FAN6_PWM: - ret = kstrtoint(buf, 10, &val); - if (ret) - { - printk(KERN_ERR "%s: Unable to convert string into value for %s\n", __FUNCTION__, usr_data->aname); - return ret; - } - /*Update the value of attr_info here, and use it to update the HW values*/ - attr_info->val.intval = val; - break; - default: - printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname); - goto exit; - } - - fan_dbg(KERN_ERR "%s: pwm to be set is %d\n", __FUNCTION__, val); - fan_update_hw(dev, attr_info, usr_data); + printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); + goto exit; + } + + switch(attr->index) + { + case FAN1_PWM: + case FAN2_PWM: + case FAN3_PWM: + case FAN4_PWM: + case FAN5_PWM: + case FAN6_PWM: + ret = kstrtoint(buf, 10, &val); + if (ret) + { + printk(KERN_ERR "%s: Unable to convert string into value for %s\n", __FUNCTION__, usr_data->aname); + return ret; + } + /*Update the value of attr_info here, and use it to update the HW values*/ + attr_info->val.intval = val; + break; + default: + printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname); + goto exit; + } + + fan_dbg(KERN_ERR "%s: pwm to be set is %d\n", __FUNCTION__, val); + fan_update_hw(dev, attr_info, usr_data); exit: - return count; + return count; } int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *udata, void *info) @@ -298,10 +298,10 @@ int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *udata, void * int val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); - painfo->val.intval = ((val & udata->mask) == udata->cmpval); + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + painfo->val.intval = ((val & udata->mask) == udata->cmpval); - /*fan_dbg(KERN_ERR "presence: val:0x%x, mask:0x%x, present_value = 0x%x\n", val, udata->mask, painfo->val.intval);*/ + /*fan_dbg(KERN_ERR "presence: val:0x%x, mask:0x%x, present_value = 0x%x\n", val, udata->mask, painfo->val.intval);*/ return status; } @@ -309,37 +309,37 @@ int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *udata, void * int sonic_i2c_get_fan_rpm_default(void *client, FAN_DATA_ATTR *udata, void *info) { int status = 0; - uint32_t val = 0; + uint32_t val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - if (udata->len == 1) - { - val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); - } - else if (udata->len ==2) - { - val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); - - } - - if (udata->is_divisor) - painfo->val.intval = udata->mult / (val >> 3); - else - painfo->val.intval = udata->mult * val; - - return status; + if (udata->len == 1) + { + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + } + else if (udata->len ==2) + { + val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); + + } + + if (udata->is_divisor) + painfo->val.intval = udata->mult / (val >> 3); + else + painfo->val.intval = udata->mult * val; + + return status; } int sonic_i2c_get_fan_direction_default(void *client, FAN_DATA_ATTR *udata, void *info) { int status = 0; - uint32_t val = 0; + uint32_t val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); - painfo->val.intval = ((val & udata->mask) == udata->cmpval); - /*fan_dbg(KERN_ERR "direction: val:0x%x, mask:0x%x, final val:0x%x\n", val, udata->mask, painfo->val.intval);*/ + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + painfo->val.intval = ((val & udata->mask) == udata->cmpval); + /*fan_dbg(KERN_ERR "direction: val:0x%x, mask:0x%x, final val:0x%x\n", val, udata->mask, painfo->val.intval);*/ return status; } @@ -348,67 +348,67 @@ int sonic_i2c_get_fan_direction_default(void *client, FAN_DATA_ATTR *udata, void int sonic_i2c_set_fan_pwm_default(struct i2c_client *client, FAN_DATA_ATTR *udata, void *info) { int status = 0; - uint32_t val = 0; + uint32_t val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - val = painfo->val.intval & udata->mask; - - if (val > 255) - { - return -EINVAL; - } - - if (udata->len == 1) - i2c_smbus_write_byte_data(client, udata->offset, val); - else if (udata->len == 2) - { - uint8_t val_lsb = val & 0xFF; - uint8_t val_hsb = (val >> 8) & 0xFF; - /* TODO: Check this logic for LE and BE */ - i2c_smbus_write_byte_data(client, udata->offset, val_lsb); - i2c_smbus_write_byte_data(client, udata->offset+1, val_hsb); - } - else - { - printk(KERN_DEBUG "%s: pwm should be of len 1/2 bytes. Not setting the pwm as the length is %d\n", __FUNCTION__, udata->len); - } - - return status; + val = painfo->val.intval & udata->mask; + + if (val > 255) + { + return -EINVAL; + } + + if (udata->len == 1) + i2c_smbus_write_byte_data(client, udata->offset, val); + else if (udata->len == 2) + { + uint8_t val_lsb = val & 0xFF; + uint8_t val_hsb = (val >> 8) & 0xFF; + /* TODO: Check this logic for LE and BE */ + i2c_smbus_write_byte_data(client, udata->offset, val_lsb); + i2c_smbus_write_byte_data(client, udata->offset+1, val_hsb); + } + else + { + printk(KERN_DEBUG "%s: pwm should be of len 1/2 bytes. Not setting the pwm as the length is %d\n", __FUNCTION__, udata->len); + } + + return status; } int sonic_i2c_get_fan_pwm_default(void *client, FAN_DATA_ATTR *udata, void *info) { int status = 0; - uint32_t val = 0; + uint32_t val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - if (udata->len == 1) - { - val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); - } - else if (udata->len ==2) - { - val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); - - } - - val = val & udata->mask; - painfo->val.intval = val; + if (udata->len == 1) + { + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + } + else if (udata->len ==2) + { + val = i2c_smbus_read_word_swapped((struct i2c_client *)client, udata->offset); + + } + + val = val & udata->mask; + painfo->val.intval = val; return status; } int sonic_i2c_get_fan_fault_default(void *client, FAN_DATA_ATTR *udata, void *info) { int status = 0; - uint32_t val = 0; + uint32_t val = 0; struct fan_attr_info *painfo = (struct fan_attr_info *)info; - /*Assuming fan fault to be denoted by 1 byte only*/ - val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); + /*Assuming fan fault to be denoted by 1 byte only*/ + val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); - val = val & udata->mask; - painfo->val.intval = val; + val = val & udata->mask; + painfo->val.intval = val; return status; } @@ -416,7 +416,7 @@ int sonic_i2c_get_fan_fault_default(void *client, FAN_DATA_ATTR *udata, void *in int pddf_fan_post_probe_default(struct i2c_client *client, const struct i2c_device_id *dev_id) { - /*Dummy func for now - check the respective platform modules*/ + /*Dummy func for now - check the respective platform modules*/ return 0; } diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c index cdbba98c8110..71f6821b2cd9 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c @@ -26,17 +26,17 @@ #define DRVNAME "pddf_fan" struct pddf_ops_t pddf_fan_ops = { - .pre_init = NULL, - .post_init = NULL, + .pre_init = NULL, + .post_init = NULL, - .pre_probe = NULL, - .post_probe = pddf_fan_post_probe_default, + .pre_probe = NULL, + .post_probe = pddf_fan_post_probe_default, - .pre_remove = NULL, - .post_remove = NULL, + .pre_remove = NULL, + .post_remove = NULL, - .pre_exit = NULL, - .post_exit = NULL, + .pre_exit = NULL, + .post_exit = NULL, }; EXPORT_SYMBOL(pddf_fan_ops); @@ -123,37 +123,37 @@ EXPORT_SYMBOL(data_fan6_fault); FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= { - { "fan1_present", &data_fan1_present}, + { "fan1_present", &data_fan1_present}, { "fan2_present", &data_fan2_present}, { "fan3_present", &data_fan3_present}, { "fan4_present", &data_fan4_present}, { "fan5_present", &data_fan5_present}, { "fan6_present", &data_fan6_present}, - { "fan1_direction", &data_fan1_direction}, + { "fan1_direction", &data_fan1_direction}, { "fan2_direction", &data_fan2_direction}, { "fan3_direction", &data_fan3_direction}, { "fan4_direction", &data_fan4_direction}, { "fan5_direction", &data_fan5_direction}, { "fan6_direction", &data_fan6_direction}, - { "fan1_front_rpm", &data_fan1_front_rpm}, + { "fan1_front_rpm", &data_fan1_front_rpm}, { "fan2_front_rpm", &data_fan2_front_rpm}, { "fan3_front_rpm", &data_fan3_front_rpm}, { "fan4_front_rpm", &data_fan4_front_rpm}, { "fan5_front_rpm", &data_fan5_front_rpm}, { "fan6_front_rpm", &data_fan6_front_rpm}, - { "fan1_rear_rpm", &data_fan1_rear_rpm}, + { "fan1_rear_rpm", &data_fan1_rear_rpm}, { "fan2_rear_rpm", &data_fan2_rear_rpm}, { "fan3_rear_rpm", &data_fan3_rear_rpm}, { "fan4_rear_rpm", &data_fan4_rear_rpm}, { "fan5_rear_rpm", &data_fan5_rear_rpm}, { "fan6_rear_rpm", &data_fan6_rear_rpm}, - { "fan1_pwm", &data_fan1_pwm}, + { "fan1_pwm", &data_fan1_pwm}, { "fan2_pwm", &data_fan2_pwm}, { "fan3_pwm", &data_fan3_pwm}, { "fan4_pwm", &data_fan4_pwm}, { "fan5_pwm", &data_fan5_pwm}, { "fan6_pwm", &data_fan6_pwm}, - { "fan1_fault", &data_fan1_fault}, + { "fan1_fault", &data_fan1_fault}, { "fan2_fault", &data_fan2_fault}, { "fan3_fault", &data_fan3_fault}, { "fan4_fault", &data_fan4_fault}, @@ -163,15 +163,15 @@ FAN_SYSFS_ATTR_DATA_ENTRY fan_sysfs_attr_data_tbl[]= void *get_fan_access_data(char *name) { - int i=0; - for(i=0; i<(sizeof(fan_sysfs_attr_data_tbl)/sizeof(fan_sysfs_attr_data_tbl[0])); i++) - { - if(strcmp(name, fan_sysfs_attr_data_tbl[i].name) ==0) - { - return &fan_sysfs_attr_data_tbl[i]; - } - } - return NULL; + int i=0; + for(i=0; i<(sizeof(fan_sysfs_attr_data_tbl)/sizeof(fan_sysfs_attr_data_tbl[0])); i++) + { + if(strcmp(name, fan_sysfs_attr_data_tbl[i].name) ==0) + { + return &fan_sysfs_attr_data_tbl[i]; + } + } + return NULL; } EXPORT_SYMBOL(get_fan_access_data); @@ -182,29 +182,29 @@ static int pddf_fan_probe(struct i2c_client *client, { struct fan_data *data; int status,i,num, j=0; - FAN_PDATA *fan_platform_data; + FAN_PDATA *fan_platform_data; FAN_DATA_ATTR *data_attr; FAN_SYSFS_ATTR_DATA_ENTRY *sysfs_data_entry; - char new_str[ATTR_NAME_LEN] = ""; + char new_str[ATTR_NAME_LEN] = ""; - if (client == NULL) { + if (client == NULL) { printk("NULL Client.. \n"); goto exit; } - if (pddf_fan_ops.pre_probe) - { - status = (pddf_fan_ops.pre_probe)(client, dev_id); - if (status != 0) - goto exit; - } + if (pddf_fan_ops.pre_probe) + { + status = (pddf_fan_ops.pre_probe)(client, dev_id); + if (status != 0) + goto exit; + } if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { status = -EIO; goto exit; } - /* Add support for a pre probe function */ + /* Add support for a pre probe function */ data = kzalloc(sizeof(struct fan_data), GFP_KERNEL); if (!data) { status = -ENOMEM; @@ -215,24 +215,24 @@ static int pddf_fan_probe(struct i2c_client *client, dev_info(&client->dev, "chip found\n"); - /*Take control of the platform data*/ - fan_platform_data = (FAN_PDATA *)(client->dev.platform_data); - num = fan_platform_data->len; - data->num_attr = num; + /*Take control of the platform data*/ + fan_platform_data = (FAN_PDATA *)(client->dev.platform_data); + num = fan_platform_data->len; + data->num_attr = num; - for (i=0;ifan_attrs + i; - sysfs_data_entry = get_fan_access_data(data_attr->aname); - if (sysfs_data_entry == NULL) - { - printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); - continue; - } - - dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + sysfs_data_entry = get_fan_access_data(data_attr->aname); + if (sysfs_data_entry == NULL) + { + printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); + continue; + } + + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; strcpy((char *)dy_ptr->dev_attr.attr.name, data_attr->aname); dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; @@ -243,27 +243,27 @@ static int pddf_fan_probe(struct i2c_client *client, data->fan_attribute_list[i] = &dy_ptr->dev_attr.attr; strcpy(data->attr_info[i].name, data_attr->aname); data->attr_info[i].valid = 0; - mutex_init(&data->attr_info[i].update_lock); - - /*Create a duplicate entry*/ - get_fan_duplicate_sysfs(dy_ptr->index, new_str); - if (strcmp(new_str,"")) - { - dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); - dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; - strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); - dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; - dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; - dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; - dy_ptr->index = sysfs_data_entry->a_ptr->index; - - data->fan_attribute_list[num+j] = &dy_ptr->dev_attr.attr; - j++; - strcpy(new_str, ""); - } - } - data->fan_attribute_list[i+j] = NULL; - data->fan_attribute_group.attrs = data->fan_attribute_list; + mutex_init(&data->attr_info[i].update_lock); + + /*Create a duplicate entry*/ + get_fan_duplicate_sysfs(dy_ptr->index, new_str); + if (strcmp(new_str,"")) + { + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->fan_attribute_list[num+j] = &dy_ptr->dev_attr.attr; + j++; + strcpy(new_str, ""); + } + } + data->fan_attribute_list[i+j] = NULL; + data->fan_attribute_group.attrs = data->fan_attribute_list; /* Register sysfs hooks */ status = sysfs_create_group(&client->dev.kobj, &data->fan_attribute_group); @@ -280,20 +280,20 @@ static int pddf_fan_probe(struct i2c_client *client, dev_info(&client->dev, "%s: fan '%s'\n", dev_name(data->hwmon_dev), client->name); - /* Add a support for post probe function */ - if (pddf_fan_ops.post_probe) - { - status = (pddf_fan_ops.post_probe)(client, dev_id); - if (status != 0) - goto exit_remove; - } + /* Add a support for post probe function */ + if (pddf_fan_ops.post_probe) + { + status = (pddf_fan_ops.post_probe)(client, dev_id); + if (status != 0) + goto exit_remove; + } - return 0; + return 0; exit_remove: sysfs_remove_group(&client->dev.kobj, &data->fan_attribute_group); exit_free: - /* Free all the allocated attributes */ + /* Free all the allocated attributes */ for (i=0; data->fan_attribute_list[i]!=NULL; i++) { struct sensor_device_attribute *ptr = (struct sensor_device_attribute *)data->fan_attribute_list[i]; @@ -307,18 +307,18 @@ static int pddf_fan_probe(struct i2c_client *client, static int pddf_fan_remove(struct i2c_client *client) { - int i = 0, ret = 0; - struct sensor_device_attribute *ptr = NULL; + int i = 0, ret = 0; + struct sensor_device_attribute *ptr = NULL; struct fan_data *data = i2c_get_clientdata(client); - FAN_PDATA *platdata = (FAN_PDATA *)client->dev.platform_data; - FAN_DATA_ATTR *platdata_sub = platdata->fan_attrs; + FAN_PDATA *platdata = (FAN_PDATA *)client->dev.platform_data; + FAN_DATA_ATTR *platdata_sub = platdata->fan_attrs; - if (pddf_fan_ops.pre_remove) - { - ret = (pddf_fan_ops.pre_remove)(client); - if (ret!=0) - printk(KERN_ERR "FAN pre_remove function failed\n"); - } + if (pddf_fan_ops.pre_remove) + { + ret = (pddf_fan_ops.pre_remove)(client); + if (ret!=0) + printk(KERN_ERR "FAN pre_remove function failed\n"); + } hwmon_device_unregister(data->hwmon_dev); sysfs_remove_group(&client->dev.kobj, &data->fan_attribute_group); @@ -330,14 +330,14 @@ static int pddf_fan_remove(struct i2c_client *client) pddf_dbg(FAN, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); kfree(data); - if (platdata_sub) { - printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); - kfree(platdata_sub); - } - if (platdata) { - printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); - kfree(platdata); - } + if (platdata_sub) { + printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } if (pddf_fan_ops.post_remove) { @@ -371,34 +371,34 @@ static struct i2c_driver pddf_fan_driver = { static int __init pddf_fan_init(void) { - int status = 0; + int status = 0; - if (pddf_fan_ops.pre_init) - { - status = (pddf_fan_ops.pre_init)(); - if (status!=0) - return status; - } + if (pddf_fan_ops.pre_init) + { + status = (pddf_fan_ops.pre_init)(); + if (status!=0) + return status; + } - status = i2c_add_driver(&pddf_fan_driver); - if (status!=0) - return status; + status = i2c_add_driver(&pddf_fan_driver); + if (status!=0) + return status; - if (pddf_fan_ops.post_init) + if (pddf_fan_ops.post_init) { status = (pddf_fan_ops.post_init)(); if (status!=0) return status; } - return status; + return status; } static void __exit pddf_fan_exit(void) { - if (pddf_fan_ops.pre_exit) (pddf_fan_ops.pre_exit)(); + if (pddf_fan_ops.pre_exit) (pddf_fan_ops.pre_exit)(); i2c_del_driver(&pddf_fan_driver); - if (pddf_fan_ops.post_exit) (pddf_fan_ops.post_exit)(); + if (pddf_fan_ops.post_exit) (pddf_fan_ops.post_exit)(); } module_init(pddf_fan_init); diff --git a/platform/pddf/i2c/modules/fan/pddf_fan_module.c b/platform/pddf/i2c/modules/fan/pddf_fan_module.c index 213e32e8104e..9025d7cce62e 100644 --- a/platform/pddf/i2c/modules/fan/pddf_fan_module.c +++ b/platform/pddf/i2c/modules/fan/pddf_fan_module.c @@ -49,180 +49,180 @@ PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void* static struct attribute *fan_attributes[] = { - &attr_num_fan.dev_attr.attr, - &attr_attr_name.dev_attr.attr, - &attr_attr_devtype.dev_attr.attr, - &attr_attr_offset.dev_attr.attr, - &attr_attr_mask.dev_attr.attr, - &attr_attr_cmpval.dev_attr.attr, - &attr_attr_len.dev_attr.attr, - &attr_attr_mult.dev_attr.attr, - &attr_attr_is_divisor.dev_attr.attr, - &attr_attr_ops.dev_attr.attr, - &attr_dev_ops.dev_attr.attr, - NULL + &attr_num_fan.dev_attr.attr, + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_mult.dev_attr.attr, + &attr_attr_is_divisor.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL }; static const struct attribute_group pddf_fan_client_data_group = { - .attrs = fan_attributes, + .attrs = fan_attributes, }; static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); - FAN_SYSFS_ATTR_DATA_ENTRY *entry_ptr; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); + FAN_SYSFS_ATTR_DATA_ENTRY *entry_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - fdata->fan_attrs[fdata->len] = fdata->fan_attr; - entry_ptr = get_fan_access_data(fdata->fan_attrs[fdata->len].aname); - if (entry_ptr != NULL && entry_ptr->a_ptr != NULL) - { - fdata->fan_attrs[fdata->len].access_data = entry_ptr->a_ptr ; - /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",fdata->fan_attrs[fdata->len].aname, fdata->fan_attrs[fdata->len].access_data);*/ - } + fdata->fan_attrs[fdata->len] = fdata->fan_attr; + entry_ptr = get_fan_access_data(fdata->fan_attrs[fdata->len].aname); + if (entry_ptr != NULL && entry_ptr->a_ptr != NULL) + { + fdata->fan_attrs[fdata->len].access_data = entry_ptr->a_ptr ; + /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",fdata->fan_attrs[fdata->len].aname, fdata->fan_attrs[fdata->len].access_data);*/ + } - fdata->len++; - memset(&fdata->fan_attr, 0, sizeof(fdata->fan_attr)); + fdata->len++; + memset(&fdata->fan_attr, 0, sizeof(fdata->fan_attr)); - return count; + return count; } struct i2c_board_info *i2c_get_fan_board_info(FAN_DATA *fdata, NEW_DEV_ATTR *cdata) { - int num = fdata->len; - int i = 0; + int num = fdata->len; + int i = 0; static struct i2c_board_info board_info; - FAN_PDATA *fan_platform_data; + FAN_PDATA *fan_platform_data; - if (strcmp(cdata->dev_type, "fan_ctrl")==0 || - strcmp(cdata->dev_type, "fan_eeprom")==0 ) - { - /* Allocate the fan_platform_data */ - fan_platform_data = (FAN_PDATA *)kzalloc(sizeof(FAN_PDATA), GFP_KERNEL); - fan_platform_data->fan_attrs = (FAN_DATA_ATTR *)kzalloc(num*sizeof(FAN_DATA_ATTR), GFP_KERNEL); + if (strcmp(cdata->dev_type, "fan_ctrl")==0 || + strcmp(cdata->dev_type, "fan_eeprom")==0 ) + { + /* Allocate the fan_platform_data */ + fan_platform_data = (FAN_PDATA *)kzalloc(sizeof(FAN_PDATA), GFP_KERNEL); + fan_platform_data->fan_attrs = (FAN_DATA_ATTR *)kzalloc(num*sizeof(FAN_DATA_ATTR), GFP_KERNEL); - fan_platform_data->num_fan = fdata->num_fan; - fan_platform_data->len = fdata->len; + fan_platform_data->num_fan = fdata->num_fan; + fan_platform_data->len = fdata->len; - for (i=0;ifan_attrs[i] = fdata->fan_attrs[i]; - } + for (i=0;ifan_attrs[i] = fdata->fan_attrs[i]; + } - /* Verify that the data is written properly */ + /* Verify that the data is written properly */ #if 0 - pddf_dbg(FAN, KERN_ERR "\n\n########### fan_platform_data - start ##########\n"); - pddf_dbg(FAN, KERN_ERR "num_of_fans: %d\n", fan_platform_data->num_fan); - pddf_dbg(FAN, KERN_ERR "no_of_usr_attr: %d\n", fan_platform_data->len); - - for (i=0; ifan_attrs[i].aname); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_type: %s\n", fan_platform_data->fan_attrs[i].devtype); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_offset: 0x%x\n", fan_platform_data->fan_attrs[i].offset); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_mask: 0x%x\n", fan_platform_data->fan_attrs[i].mask); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", fan_platform_data->fan_attrs[i].cmpval); - pddf_dbg(FAN, KERN_ERR "usr_attr_len: %d\n", fan_platform_data->fan_attrs[i].len); - pddf_dbg(FAN, KERN_ERR "usr_attr_mult: %d\n", fan_platform_data->fan_attrs[i].mult); - pddf_dbg(FAN, KERN_ERR "usr_attr_is_divisor: %d\n", fan_platform_data->fan_attrs[i].is_divisor); - } - pddf_dbg(FAN, KERN_ERR "########### fan_platform_data - end ##########\n\n"); + pddf_dbg(FAN, KERN_ERR "\n\n########### fan_platform_data - start ##########\n"); + pddf_dbg(FAN, KERN_ERR "num_of_fans: %d\n", fan_platform_data->num_fan); + pddf_dbg(FAN, KERN_ERR "no_of_usr_attr: %d\n", fan_platform_data->len); + + for (i=0; ifan_attrs[i].aname); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_type: %s\n", fan_platform_data->fan_attrs[i].devtype); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_offset: 0x%x\n", fan_platform_data->fan_attrs[i].offset); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_mask: 0x%x\n", fan_platform_data->fan_attrs[i].mask); + pddf_dbg(FAN, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", fan_platform_data->fan_attrs[i].cmpval); + pddf_dbg(FAN, KERN_ERR "usr_attr_len: %d\n", fan_platform_data->fan_attrs[i].len); + pddf_dbg(FAN, KERN_ERR "usr_attr_mult: %d\n", fan_platform_data->fan_attrs[i].mult); + pddf_dbg(FAN, KERN_ERR "usr_attr_is_divisor: %d\n", fan_platform_data->fan_attrs[i].is_divisor); + } + pddf_dbg(FAN, KERN_ERR "########### fan_platform_data - end ##########\n\n"); #endif - board_info = (struct i2c_board_info) { - .platform_data = fan_platform_data, - }; + board_info = (struct i2c_board_info) { + .platform_data = fan_platform_data, + }; - board_info.addr = cdata->dev_addr; - strcpy(board_info.type, cdata->dev_type); - } - else - { - printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); - } + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); + } - return &board_info; + return &board_info; } /*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); - NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); - struct i2c_adapter *adapter; - struct i2c_board_info *board_info; - struct i2c_client *client_ptr; - - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ - if (strncmp(buf, "add", strlen(buf)-1)==0) - { - adapter = i2c_get_adapter(cdata->parent_bus); - board_info = i2c_get_fan_board_info(fdata, cdata); - - /* Populate the platform data for fan */ - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ - client_ptr = i2c_new_device(adapter, board_info); - - if(client_ptr != NULL) - { - i2c_put_adapter(adapter); - pddf_dbg(FAN, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); - add_device_table(cdata->i2c_name, (void*)client_ptr); - } - else - { - i2c_put_adapter(adapter); - goto free_data; - } - } - else if (strncmp(buf, "delete", strlen(buf)-1)==0) - { - /*Get the i2c_client handle for the created client*/ - client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); - if (client_ptr) - { - pddf_dbg(FAN, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); - i2c_unregister_device(client_ptr); - delete_device_table(cdata->i2c_name); - } - else - { - printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); - } - } - else - { - printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } - - goto clear_data; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = i2c_get_fan_board_info(fdata, cdata); + + /* Populate the platform data for fan */ + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if(client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(FAN, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(FAN, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; free_data: - if (board_info->platform_data) - { - FAN_PDATA *fan_platform_data = board_info->platform_data; - if (fan_platform_data->fan_attrs) - { - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); - kfree(fan_platform_data->fan_attrs); - } - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); - kfree(fan_platform_data); - } + if (board_info->platform_data) + { + FAN_PDATA *fan_platform_data = board_info->platform_data; + if (fan_platform_data->fan_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(fan_platform_data->fan_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(fan_platform_data); + } clear_data: - memset(fdata, 0, sizeof(FAN_DATA)); - /*TODO: free the data cdata->data if data is dynal=mically allocated*/ - memset(cdata, 0, sizeof(NEW_DEV_ATTR)); - return count; + memset(fdata, 0, sizeof(FAN_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; } @@ -231,56 +231,56 @@ static struct kobject *i2c_kobj; int __init pddf_data_init(void) { - struct kobject *device_kobj; - int ret = 0; + struct kobject *device_kobj; + int ret = 0; - pddf_dbg(FAN, "PDDF FAN MODULE.. init\n"); + pddf_dbg(FAN, "PDDF FAN MODULE.. init\n"); - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; - fan_kobj = kobject_create_and_add("fan", device_kobj); - if(!fan_kobj) - return -ENOMEM; - i2c_kobj = kobject_create_and_add("i2c", fan_kobj); - if(!i2c_kobj) - return -ENOMEM; - - ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); - if (ret) + fan_kobj = kobject_create_and_add("fan", device_kobj); + if(!fan_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", fan_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) { kobject_put(i2c_kobj); kobject_put(fan_kobj); return ret; } - pddf_dbg(FAN, "CREATED FAN I2C CLIENTS CREATION SYSFS GROUP\n"); + pddf_dbg(FAN, "CREATED FAN I2C CLIENTS CREATION SYSFS GROUP\n"); - ret = sysfs_create_group(i2c_kobj, &pddf_fan_client_data_group); - if (ret) + ret = sysfs_create_group(i2c_kobj, &pddf_fan_client_data_group); + if (ret) { - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); kobject_put(i2c_kobj); kobject_put(fan_kobj); return ret; } - pddf_dbg(FAN, "CREATED PDDF FAN DATA SYSFS GROUP\n"); - + pddf_dbg(FAN, "CREATED PDDF FAN DATA SYSFS GROUP\n"); + - return ret; + return ret; } void __exit pddf_data_exit(void) { - pddf_dbg(FAN, "PDDF FAN MODULE.. exit\n"); - sysfs_remove_group(i2c_kobj, &pddf_fan_client_data_group); - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); - kobject_put(i2c_kobj); - kobject_put(fan_kobj); - pddf_dbg(FAN, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'fan'\n",__FUNCTION__); - return; + pddf_dbg(FAN, "PDDF FAN MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_fan_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(fan_kobj); + pddf_dbg(FAN, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'fan'\n",__FUNCTION__); + return; } module_init(pddf_data_init); diff --git a/platform/pddf/i2c/modules/include/pddf_client_defs.h b/platform/pddf/i2c/modules/include/pddf_client_defs.h index c911bd414896..928fa983b9a4 100644 --- a/platform/pddf/i2c/modules/include/pddf_client_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_client_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform I2C client defines/structures header file + * Platform I2C client defines/structures header file */ #ifndef __PDDF_CLIENT_DEFS_H__ @@ -42,7 +42,7 @@ typedef struct pddf_data_attribute{ int type; int len; char *addr; - char *data; + char *data; }PDDF_ATTR; #define PDDF_DATA_ATTR(_name, _mode, _show, _store, _type, _len, _addr, _data) \ @@ -50,7 +50,7 @@ typedef struct pddf_data_attribute{ .type = _type , \ .len = _len , \ .addr = _addr, \ - .data = _data } + .data = _data } enum attribute_data_type { @@ -75,9 +75,9 @@ typedef struct NEW_DEV_ATTR int parent_bus; char dev_type[GEN_NAME_SIZE]; int dev_addr; - char *data; - int error; - char errstr[ERR_STR_SIZE]; + char *data; + int error; + char errstr[ERR_STR_SIZE]; }NEW_DEV_ATTR; extern NEW_DEV_ATTR pddf_data; @@ -97,26 +97,26 @@ void traverse_device_table(void ); /*Various Ops hook which can be used by vendors to provide some deviation from usual pddf functionality*/ struct pddf_ops_t { - /*Module init ops*/ - int (*pre_init)(void); - int (*post_init)(void); - /*probe ops*/ - int (*pre_probe)(struct i2c_client *, const struct i2c_device_id *); - int (*post_probe)(struct i2c_client *, const struct i2c_device_id *); - /*remove ops*/ - int (*pre_remove)(struct i2c_client *); - int (*post_remove)(struct i2c_client *); - /*Module exit ops*/ - void (*pre_exit)(void); + /*Module init ops*/ + int (*pre_init)(void); + int (*post_init)(void); + /*probe ops*/ + int (*pre_probe)(struct i2c_client *, const struct i2c_device_id *); + int (*post_probe)(struct i2c_client *, const struct i2c_device_id *); + /*remove ops*/ + int (*pre_remove)(struct i2c_client *); + int (*post_remove)(struct i2c_client *); + /*Module exit ops*/ + void (*pre_exit)(void); void (*post_exit)(void); }; typedef struct PDEVICE { - struct hlist_node node; - char name[GEN_NAME_SIZE]; - char *data; + struct hlist_node node; + char name[GEN_NAME_SIZE]; + char *data; }PDEVICE; diff --git a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h index 58575763f964..0f95a8f32bef 100644 --- a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform CPLD defines/structures header file + * Platform CPLD defines/structures header file */ #ifndef __PDDF_CPLD_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_defs.h b/platform/pddf/i2c/modules/include/pddf_fan_defs.h index 49c31af748c1..8e36829a22de 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform FAN defines/structures header file + * Platform FAN defines/structures header file */ #ifndef __PDDF_FAN_DEFS_H__ @@ -22,37 +22,37 @@ typedef struct FAN_DATA_ATTR { char aname[ATTR_NAME_LEN]; // attr name, taken from enum fan_sysfs_attributes - char devtype[DEV_TYPE_LEN]; // Type of FAN controller, i.e EMC2305, EMC2302, or FAN-CPLD etc + char devtype[DEV_TYPE_LEN]; // Type of FAN controller, i.e EMC2305, EMC2302, or FAN-CPLD etc uint32_t offset; uint32_t mask; uint32_t cmpval; uint32_t len; - int mult; // Multiplication factor to get the actual data - uint8_t is_divisor; // Check if the value is a divisor and mult is dividend - void *access_data; + int mult; // Multiplication factor to get the actual data + uint8_t is_divisor; // Check if the value is a divisor and mult is dividend + void *access_data; }FAN_DATA_ATTR; typedef struct FAN_SYSFS_ATTR_DATA { - int index; - unsigned short mode; - ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); - int (*pre_get)(void *client, FAN_DATA_ATTR *adata, void *data); - int (*do_get)(void *client, FAN_DATA_ATTR *adata, void *data); - int (*post_get)(void *client, FAN_DATA_ATTR *adata, void *data); - ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); - int (*pre_set)(void *client, FAN_DATA_ATTR *adata, void *data); - int (*do_set)(void *client, FAN_DATA_ATTR *adata, void *data); - int (*post_set)(void *client, FAN_DATA_ATTR *adata, void *data); - void *data; + int index; + unsigned short mode; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*do_get)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*post_get)(void *client, FAN_DATA_ATTR *adata, void *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*do_set)(void *client, FAN_DATA_ATTR *adata, void *data); + int (*post_set)(void *client, FAN_DATA_ATTR *adata, void *data); + void *data; } FAN_SYSFS_ATTR_DATA; typedef struct FAN_SYSFS_ATTR_DATA_ENTRY { - char name[ATTR_NAME_LEN]; - FAN_SYSFS_ATTR_DATA *a_ptr; + char name[ATTR_NAME_LEN]; + FAN_SYSFS_ATTR_DATA *a_ptr; } FAN_SYSFS_ATTR_DATA_ENTRY; @@ -60,7 +60,7 @@ typedef struct FAN_SYSFS_ATTR_DATA_ENTRY typedef struct FAN_DATA { int num_fan; // num of fans controlled by this fan client - FAN_DATA_ATTR fan_attr; + FAN_DATA_ATTR fan_attr; int len; // no of valid attributes for this fan client FAN_DATA_ATTR fan_attrs[MAX_FAN_ATTRS]; }FAN_DATA; diff --git a/platform/pddf/i2c/modules/include/pddf_fan_driver.h b/platform/pddf/i2c/modules/include/pddf_fan_driver.h index 5041660ef028..0088871f65bc 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_driver.h @@ -45,15 +45,15 @@ enum fan_sysfs_attributes { FAN4_FAULT, FAN5_FAULT, FAN6_FAULT, - FAN_MAX_ATTR + FAN_MAX_ATTR }; /* Each client has this additional data */ struct fan_attr_info { - char name[ATTR_NAME_LEN]; - struct mutex update_lock; - char valid; /* != 0 if registers are valid */ - unsigned long last_updated; /* In jiffies */ - union { + char name[ATTR_NAME_LEN]; + struct mutex update_lock; + char valid; /* != 0 if registers are valid */ + unsigned long last_updated; /* In jiffies */ + union { char strval[STR_ATTR_SIZE]; int intval; u16 shortval; @@ -62,11 +62,11 @@ struct fan_attr_info { }; struct fan_data { - struct device *hwmon_dev; - int num_attr; - struct attribute *fan_attribute_list[MAX_FAN_ATTRS]; - struct attribute_group fan_attribute_group; - struct fan_attr_info attr_info[MAX_FAN_ATTRS]; + struct device *hwmon_dev; + int num_attr; + struct attribute *fan_attribute_list[MAX_FAN_ATTRS]; + struct attribute_group fan_attribute_group; + struct fan_attr_info attr_info[MAX_FAN_ATTRS]; }; #endif //__PDDF_FAN_DRIVER_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_led_defs.h b/platform/pddf/i2c/modules/include/pddf_led_defs.h index 2197ecde4628..4a74f0d7dee4 100644 --- a/platform/pddf/i2c/modules/include/pddf_led_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_led_defs.h @@ -26,11 +26,11 @@ struct kobject *cur_state_kobj=NULL; *****************************************/ #define NAME_SIZE 32 typedef enum { - ON, - OFF, - FAULTY, - BLINK, - MAX_LED_STATUS + ON, + OFF, + FAULTY, + BLINK, + MAX_LED_STATUS }LED_STATUS; typedef struct { @@ -41,11 +41,11 @@ typedef struct typedef struct { - int swpld_addr; + int swpld_addr; int swpld_addr_offset; char color[NAME_SIZE]; MASK_BITS bits; - unsigned short value; + unsigned short value; } LED_DATA; typedef struct @@ -62,27 +62,27 @@ typedef struct int index; LED_DATA data[MAX_LED_STATUS]; bool blink; - int swpld_addr; + int swpld_addr; int swpld_addr_offset; } LED_OPS_DATA; typedef enum{ - LED_SYS, - LED_PSU, - LED_FAN, - LED_FANTRAY, - LED_DIAG, - LED_LOC, - LED_TYPE_MAX + LED_SYS, + LED_PSU, + LED_FAN, + LED_FANTRAY, + LED_DIAG, + LED_LOC, + LED_TYPE_MAX } LED_TYPE; char* LED_TYPE_STR[LED_TYPE_MAX] = { - "LED_SYS", - "LED_PSU", - "LED_FAN", - "LED_FANTRAY", - "LED_DIAG", - "LED_LOC", + "LED_SYS", + "LED_PSU", + "LED_FAN", + "LED_FANTRAY", + "LED_DIAG", + "LED_LOC", }; /***************************************** diff --git a/platform/pddf/i2c/modules/include/pddf_mux_defs.h b/platform/pddf/i2c/modules/include/pddf_mux_defs.h index 3bae83552eca..05a6411a858e 100644 --- a/platform/pddf/i2c/modules/include/pddf_mux_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_mux_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform MUX defines/structures header file + * Platform MUX defines/structures header file */ #ifndef __PAL_MUX_DEFS_H__ @@ -12,7 +12,7 @@ /* MUX CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ typedef struct MUX_DATA { - int virt_bus; // Virtual base bus number of the mux channels + int virt_bus; // Virtual base bus number of the mux channels }MUX_DATA; #endif //__PAL_MUX_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_defs.h b/platform/pddf/i2c/modules/include/pddf_psu_defs.h index 83d6be03437a..7243f9b66ad2 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform PSU defines/structures header file + * Platform PSU defines/structures header file */ #ifndef __PDDF_PSU_DEFS_H__ @@ -22,44 +22,44 @@ typedef struct PSU_DATA_ATTR { char aname[ATTR_NAME_LEN]; // attr name, taken from enum psu_sysfs_attributes - char devtype[DEV_TYPE_LEN]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute + char devtype[DEV_TYPE_LEN]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute uint32_t devaddr; uint32_t offset; uint32_t mask; uint32_t cmpval; uint32_t len; - void *access_data; + void *access_data; }PSU_DATA_ATTR; typedef struct PSU_SYSFS_ATTR_DATA { - int index; - unsigned short mode; - ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); - int (*pre_get)(void *client, PSU_DATA_ATTR *adata, void *data); - int (*do_get)(void *client, PSU_DATA_ATTR *adata, void *data); - int (*post_get)(void *client, PSU_DATA_ATTR *adata, void *data); - ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); - int (*pre_set)(void *client, PSU_DATA_ATTR *adata, void *data); - int (*do_set)(void *client, PSU_DATA_ATTR *adata, void *data); - int (*post_set)(void *client, PSU_DATA_ATTR *adata, void *data); - void *data; + int index; + unsigned short mode; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*do_get)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*post_get)(void *client, PSU_DATA_ATTR *adata, void *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*do_set)(void *client, PSU_DATA_ATTR *adata, void *data); + int (*post_set)(void *client, PSU_DATA_ATTR *adata, void *data); + void *data; } PSU_SYSFS_ATTR_DATA; typedef struct PSU_SYSFS_ATTR_DATA_ENTRY { - char name[ATTR_NAME_LEN]; - PSU_SYSFS_ATTR_DATA *a_ptr; + char name[ATTR_NAME_LEN]; + PSU_SYSFS_ATTR_DATA *a_ptr; } PSU_SYSFS_ATTR_DATA_ENTRY; /* PSU CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ typedef struct PSU_DATA { - int idx; // psu index - int num_psu_fans; - PSU_DATA_ATTR psu_attr; + int idx; // psu index + int num_psu_fans; + PSU_DATA_ATTR psu_attr; int len; // no of valid attributes for this psu client PSU_DATA_ATTR psu_attrs[MAX_PSU_ATTRS]; }PSU_DATA; diff --git a/platform/pddf/i2c/modules/include/pddf_psu_driver.h b/platform/pddf/i2c/modules/include/pddf_psu_driver.h index 11baab4d1825..947ccb8e1894 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_driver.h @@ -12,40 +12,40 @@ enum psu_sysfs_attributes { PSU_PRESENT, PSU_MODEL_NAME, PSU_POWER_GOOD, - PSU_MFR_ID, - PSU_SERIAL_NUM, - PSU_FAN_DIR, + PSU_MFR_ID, + PSU_SERIAL_NUM, + PSU_FAN_DIR, PSU_V_OUT, PSU_I_OUT, PSU_P_OUT, /* This is in micro watts to comply with lm-sensors */ PSU_FAN1_SPEED, PSU_TEMP1_INPUT, - PSU_ATTR_MAX + PSU_ATTR_MAX }; /* Every client has psu_data which is divided into per attribute data */ struct psu_attr_info { - char name[ATTR_NAME_LEN]; - struct mutex update_lock; + char name[ATTR_NAME_LEN]; + struct mutex update_lock; char valid; /* !=0 if registers are valid */ unsigned long last_updated; /* In jiffies */ - u8 status; - union { - char strval[STR_ATTR_SIZE]; - int intval; - u16 shortval; - u8 charval; - }val; + u8 status; + union { + char strval[STR_ATTR_SIZE]; + int intval; + u16 shortval; + u8 charval; + }val; }; struct psu_data { - struct device *hwmon_dev; - u8 index; - int num_psu_fans; - int num_attr; - struct attribute *psu_attribute_list[MAX_PSU_ATTRS]; - struct attribute_group psu_attribute_group; - struct psu_attr_info attr_info[MAX_PSU_ATTRS]; + struct device *hwmon_dev; + u8 index; + int num_psu_fans; + int num_attr; + struct attribute *psu_attribute_list[MAX_PSU_ATTRS]; + struct attribute_group psu_attribute_group; + struct psu_attr_info attr_info[MAX_PSU_ATTRS]; }; diff --git a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h index 1cbb80ffc1eb..4b7ce174e877 100644 --- a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h @@ -37,4 +37,4 @@ typedef struct SYSSTATUS_DATA -#endif //__PDDF_SYSSTATUS_DEFS_H__ +#endif //__PDDF_SYSSTATUS_DEFS_H__ diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h index d04f95276460..95875ec8204f 100644 --- a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h @@ -3,7 +3,7 @@ * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * * Description: - * Platform SFP defines/structures header file + * Platform SFP defines/structures header file */ #ifndef __PDDF_XCVR_DEFS_H__ @@ -17,16 +17,16 @@ typedef struct XCVR_ATTR { char aname[32]; // attr name, taken from enum xcvr_sysfs_attributes - char devtype[32]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute + char devtype[32]; // either a 'eeprom' or 'cpld', or 'pmbus' attribute uint32_t devaddr; uint32_t offset; uint32_t mask; uint32_t cmpval; uint32_t len; - int (*pre_access)(void *client, void *data); - int (*do_access)(void *client, void *data); - int (*post_access)(void *client, void *data); + int (*pre_access)(void *client, void *data); + int (*do_access)(void *client, void *data); + int (*post_access)(void *client, void *data); }XCVR_ATTR; @@ -34,7 +34,7 @@ typedef struct XCVR_ATTR typedef struct XCVR_DATA { int idx; // xcvr index - XCVR_ATTR xcvr_attr; + XCVR_ATTR xcvr_attr; int len; // no of valid attributes for this xcvr client XCVR_ATTR xcvr_attrs[MAX_XCVR_ATTRS]; }XCVR_DATA; @@ -76,32 +76,32 @@ struct xcvr_data { uint32_t intr_status; uint32_t lpmode; uint32_t rxlos; - uint32_t txdisable; + uint32_t txdisable; uint32_t txfault; }; typedef struct XCVR_SYSFS_ATTR_OPS { - int index; - ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); - int (*pre_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); - int (*do_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); - int (*post_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); - ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); - int (*pre_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); - int (*do_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); - int (*post_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int index; + ssize_t (*show)(struct device *dev, struct device_attribute *da, char *buf); + int (*pre_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*do_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*post_get)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + ssize_t (*store)(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + int (*pre_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*do_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); + int (*post_set)(struct i2c_client *client, XCVR_ATTR *adata, struct xcvr_data *data); } XCVR_SYSFS_ATTR_OPS; enum xcvr_sysfs_attributes { XCVR_PRESENT, - XCVR_RESET, - XCVR_INTR_STATUS, - XCVR_LPMODE, - XCVR_RXLOS, - XCVR_TXDISABLE, - XCVR_TXFAULT, - XCVR_ATTR_MAX + XCVR_RESET, + XCVR_INTR_STATUS, + XCVR_LPMODE, + XCVR_RXLOS, + XCVR_TXDISABLE, + XCVR_TXFAULT, + XCVR_ATTR_MAX }; extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); diff --git a/platform/pddf/i2c/modules/led/pddf_led_module.c b/platform/pddf/i2c/modules/led/pddf_led_module.c index f89f9b30e899..c74c96b037a5 100644 --- a/platform/pddf/i2c/modules/led/pddf_led_module.c +++ b/platform/pddf/i2c/modules/led/pddf_led_module.c @@ -26,13 +26,13 @@ LED_OPS_DATA loc_led_ops_data[1]= {0}; LED_OPS_DATA* fantray_led_ops_data=NULL; LED_OPS_DATA temp_data={0}; LED_OPS_DATA* dev_list[LED_TYPE_MAX] = { - sys_led_ops_data, - NULL, - fan_led_ops_data, - NULL, - diag_led_ops_data, - loc_led_ops_data, - NULL + sys_led_ops_data, + NULL, + fan_led_ops_data, + NULL, + diag_led_ops_data, + loc_led_ops_data, + NULL }; int num_psus = 0; int num_fans = 0; @@ -66,8 +66,8 @@ static LED_TYPE get_dev_type(char* name) static int dev_index_check(LED_TYPE type, int index) { #if DEBUG - pddf_dbg(LED, "dev_index_check: type:%s index:%d num_psus:%d num_fans:%d\n", - LED_TYPE_STR[type], index, num_psus, num_fans); + pddf_dbg(LED, "dev_index_check: type:%s index:%d num_psus:%d num_fans:%d\n", + LED_TYPE_STR[type], index, num_psus, num_fans); #endif switch(type) { @@ -109,107 +109,107 @@ static LED_OPS_DATA* find_led_ops_data(struct device_attribute *da) static void print_led_data(LED_OPS_DATA *ptr) { - if(!ptr) return ; - pddf_dbg(LED, KERN_INFO "Print %s index:%d num_psus:%d num_fans:%d ADDR=%p\n", - ptr->device_name, ptr->index, num_psus, num_fans, ptr); - pddf_dbg(LED, KERN_INFO "\tindex: %d\n", ptr->index); - pddf_dbg(LED, KERN_INFO "\tcur_state: %d; %s; %s\n", ptr->cur_state.state, ptr->cur_state.color, ptr->cur_state.color_state); - if(ptr->data[ON].swpld_addr) { - pddf_dbg(LED, KERN_INFO "\t\t[ON]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", - ptr->data[ON].swpld_addr, ptr->data[ON].swpld_addr_offset, - ptr->data[ON].color, ptr->data[ON].value, ptr->data[ON].bits.mask_bits, ptr->data[ON].bits.pos); - } - - if(ptr->data[OFF].swpld_addr) { - pddf_dbg(LED, KERN_INFO "\t\t[OFF]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", - ptr->data[OFF].swpld_addr, ptr->data[OFF].swpld_addr_offset, - ptr->data[OFF].color, ptr->data[OFF].value, ptr->data[OFF].bits.mask_bits, ptr->data[OFF].bits.pos); - } - - if(ptr->data[FAULTY].swpld_addr) { - pddf_dbg(LED, KERN_INFO "\t\t[FAULTY]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", - ptr->data[FAULTY].swpld_addr, ptr->data[FAULTY].swpld_addr_offset, - ptr->data[FAULTY].color, ptr->data[FAULTY].value, ptr->data[FAULTY].bits.mask_bits, ptr->data[FAULTY].bits.pos); - } - - if(ptr->data[BLINK].swpld_addr) { - pddf_dbg(LED, KERN_INFO "\t\t[BLINK]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", - ptr->data[BLINK].swpld_addr, ptr->data[BLINK].swpld_addr_offset, - ptr->data[BLINK].color, ptr->data[BLINK].value, ptr->data[BLINK].bits.mask_bits, ptr->data[BLINK].bits.pos); - } + if(!ptr) return ; + pddf_dbg(LED, KERN_INFO "Print %s index:%d num_psus:%d num_fans:%d ADDR=%p\n", + ptr->device_name, ptr->index, num_psus, num_fans, ptr); + pddf_dbg(LED, KERN_INFO "\tindex: %d\n", ptr->index); + pddf_dbg(LED, KERN_INFO "\tcur_state: %d; %s; %s\n", ptr->cur_state.state, ptr->cur_state.color, ptr->cur_state.color_state); + if(ptr->data[ON].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[ON]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[ON].swpld_addr, ptr->data[ON].swpld_addr_offset, + ptr->data[ON].color, ptr->data[ON].value, ptr->data[ON].bits.mask_bits, ptr->data[ON].bits.pos); + } + + if(ptr->data[OFF].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[OFF]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[OFF].swpld_addr, ptr->data[OFF].swpld_addr_offset, + ptr->data[OFF].color, ptr->data[OFF].value, ptr->data[OFF].bits.mask_bits, ptr->data[OFF].bits.pos); + } + + if(ptr->data[FAULTY].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[FAULTY]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[FAULTY].swpld_addr, ptr->data[FAULTY].swpld_addr_offset, + ptr->data[FAULTY].color, ptr->data[FAULTY].value, ptr->data[FAULTY].bits.mask_bits, ptr->data[FAULTY].bits.pos); + } + + if(ptr->data[BLINK].swpld_addr) { + pddf_dbg(LED, KERN_INFO "\t\t[BLINK]: addr/offset:0x%x;0x%x color:%s; value:%x; mask_bits: 0x%x; pos:%d\n", + ptr->data[BLINK].swpld_addr, ptr->data[BLINK].swpld_addr_offset, + ptr->data[BLINK].color, ptr->data[BLINK].value, ptr->data[BLINK].bits.mask_bits, ptr->data[BLINK].bits.pos); + } } - + ssize_t get_status_led(struct device_attribute *da) { - int ret=0; - struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; - LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; - LED_OPS_DATA* ops_ptr=find_led_ops_data(da); - uint32_t color_val=0, sys_val=0; - int state=0; - if (!ops_ptr) { - printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); - return (-1); - } - if (ops_ptr->swpld_addr == 0x0) { - printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", __func__, - temp_data_ptr->device_name, temp_data_ptr->index); - return (-1); - } + int ret=0; + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + uint32_t color_val=0, sys_val=0; + int state=0; + if (!ops_ptr) { + printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); + return (-1); + } + if (ops_ptr->swpld_addr == 0x0) { + printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", __func__, + temp_data_ptr->device_name, temp_data_ptr->index); + return (-1); + } sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); - if (sys_val < 0) - return sys_val; - - strcpy(temp_data.cur_state.color_state, "None"); - strcpy(temp_data.cur_state.color, "None"); - for (state=0; statedata[state].bits.mask_bits); - if ((color_val ^ (ops_ptr->data[state].value<data[state].bits.pos))==0) { - if(state == BLINK) - strcpy(temp_data.cur_state.color_state,"Blink"); - else { - strcpy(temp_data.cur_state.color, ops_ptr->data[state].color); - if(strcasecmp(ops_ptr->data[state].color, "off")==0) { - strcpy(temp_data.cur_state.color_state, ""); - } else { - strcpy(temp_data.cur_state.color_state, "Solid"); - } - } - } - } + if (sys_val < 0) + return sys_val; + + strcpy(temp_data.cur_state.color_state, "None"); + strcpy(temp_data.cur_state.color, "None"); + for (state=0; statedata[state].bits.mask_bits); + if ((color_val ^ (ops_ptr->data[state].value<data[state].bits.pos))==0) { + if(state == BLINK) + strcpy(temp_data.cur_state.color_state,"Blink"); + else { + strcpy(temp_data.cur_state.color, ops_ptr->data[state].color); + if(strcasecmp(ops_ptr->data[state].color, "off")==0) { + strcpy(temp_data.cur_state.color_state, ""); + } else { + strcpy(temp_data.cur_state.color_state, "Solid"); + } + } + } + } #if DEBUG pddf_dbg(LED, KERN_ERR "Get : %s:%d addr/offset:0x%x; 0x%x value=0x%x [%s:%s]\n", - ops_ptr->device_name, ops_ptr->index, + ops_ptr->device_name, ops_ptr->index, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, sys_val, - temp_data.cur_state.color, temp_data.cur_state.color_state); + temp_data.cur_state.color, temp_data.cur_state.color_state); #endif - return(ret); + return(ret); } ssize_t set_status_led(struct device_attribute *da) { - int ret=0; - uint32_t sys_val=0, new_val=0; - int cur_state = 0; - struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; - LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; - LED_OPS_DATA* ops_ptr=find_led_ops_data(da); - char* _buf=temp_data_ptr->cur_state.color; - int blink=0; - - if (!ops_ptr) { - printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); - return (-1); - } - if (ops_ptr->swpld_addr == 0x0) { - printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", - __func__, ops_ptr->device_name, ops_ptr->index); - return (-1); - } + int ret=0; + uint32_t sys_val=0, new_val=0; + int cur_state = 0; + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* temp_data_ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + char* _buf=temp_data_ptr->cur_state.color; + int blink=0; + + if (!ops_ptr) { + printk(KERN_ERR "PDDF_LED ERROR %s: Cannot find LED Ptr", __func__); + return (-1); + } + if (ops_ptr->swpld_addr == 0x0) { + printk(KERN_ERR "PDDF_LED ERROR %s: device: %s %d not configured\n", + __func__, ops_ptr->device_name, ops_ptr->index); + return (-1); + } #if DEBUG - pddf_dbg(LED, KERN_ERR "%s: Set [%s;%d] color[%s;%s]\n", __func__, - temp_data_ptr->device_name, temp_data_ptr->index, - temp_data_ptr->cur_state.color, temp_data_ptr->cur_state.color_state); + pddf_dbg(LED, KERN_ERR "%s: Set [%s;%d] color[%s;%s]\n", __func__, + temp_data_ptr->device_name, temp_data_ptr->index, + temp_data_ptr->cur_state.color, temp_data_ptr->cur_state.color_state); #endif if(strcasecmp(_buf, "on")==0) { cur_state = ON; @@ -221,45 +221,45 @@ ssize_t set_status_led(struct device_attribute *da) printk(KERN_ERR "PDDF_LED ERROR %s: not supported: %s\n", _buf, __func__); return (-1); } - if(ops_ptr->data[cur_state].swpld_addr != 0x0) { - sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); - if (sys_val < 0) - return sys_val; + if(ops_ptr->data[cur_state].swpld_addr != 0x0) { + sys_val = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); + if (sys_val < 0) + return sys_val; - new_val = (sys_val & ops_ptr->data[cur_state].bits.mask_bits) | + new_val = (sys_val & ops_ptr->data[cur_state].bits.mask_bits) | (ops_ptr->data[cur_state].value << ops_ptr->data[cur_state].bits.pos); - if(strcasecmp(temp_data_ptr->cur_state.color_state, "blink")==0) { - if (ops_ptr->data[BLINK].swpld_addr != 0x0) { - new_val = (new_val & ops_ptr->data[BLINK].bits.mask_bits) | - (ops_ptr->data[BLINK].value << ops_ptr->data[BLINK].bits.pos); - blink=1; - } else { - printk(KERN_ERR "PDDF_LED ERROR %s: %s %d BLINK is not supported\n",__func__, - ops_ptr->device_name, ops_ptr->index); - return (-1); - } - } - } else { - printk(KERN_ERR "PDDF_LED ERROR %s: %s %d state %d; %s not configured\n",__func__, - ops_ptr->device_name, ops_ptr->index, cur_state, _buf); - return (-1); - } + if(strcasecmp(temp_data_ptr->cur_state.color_state, "blink")==0) { + if (ops_ptr->data[BLINK].swpld_addr != 0x0) { + new_val = (new_val & ops_ptr->data[BLINK].bits.mask_bits) | + (ops_ptr->data[BLINK].value << ops_ptr->data[BLINK].bits.pos); + blink=1; + } else { + printk(KERN_ERR "PDDF_LED ERROR %s: %s %d BLINK is not supported\n",__func__, + ops_ptr->device_name, ops_ptr->index); + return (-1); + } + } + } else { + printk(KERN_ERR "PDDF_LED ERROR %s: %s %d state %d; %s not configured\n",__func__, + ops_ptr->device_name, ops_ptr->index, cur_state, _buf); + return (-1); + } board_i2c_cpld_write(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, new_val); #if DEBUG pddf_dbg(LED, "Set state:%s;%s;%s 0x%x:0x%x sys_val:0x%x new_val:0x%x read:0x%x\n", - LED_TYPE_STR[cur_state], ops_ptr->data[cur_state].color, blink? "Blink":"Solid", + LED_TYPE_STR[cur_state], ops_ptr->data[cur_state].color, blink? "Blink":"Solid", ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset, sys_val, new_val, - ret = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset)); - if (ret < 0) - { - printk(KERN_ERR "PDDF_LED ERROR %s: Error %d in reading from cpld(0x%x) offset 0x%x\n", __FUNCTION__, ret, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); - return ret; - } + ret = board_i2c_cpld_read(ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset)); + if (ret < 0) + { + printk(KERN_ERR "PDDF_LED ERROR %s: Error %d in reading from cpld(0x%x) offset 0x%x\n", __FUNCTION__, ret, ops_ptr->swpld_addr, ops_ptr->swpld_addr_offset); + return ret; + } #endif - return(ret); + return(ret); } @@ -290,7 +290,7 @@ ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, } #if DEBUG pddf_dbg(LED, "[ READ ] DATA ATTR PTR [%s] TYPE:%d, Value:[%s]\n", - ptr->dev_attr.attr.name, ptr->type, buf); + ptr->dev_attr.attr.name, ptr->type, buf); #endif return ret; } @@ -306,8 +306,8 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf ptr->addr[strlen(buf)-1] = '\0'; #if DEBUG - pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_CHAR VALUE:%s\n", - ptr->dev_attr.attr.name, ptr->addr); + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_CHAR VALUE:%s\n", + ptr->dev_attr.attr.name, ptr->addr); #endif break; case PDDF_INT_DEC: @@ -315,8 +315,8 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c if (ret==0) *(int *)(ptr->addr) = num; #if DEBUG - pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_DEC VALUE:%d\n", - ptr->dev_attr.attr.name, *(int *)(ptr->addr)); + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_DEC VALUE:%d\n", + ptr->dev_attr.attr.name, *(int *)(ptr->addr)); #endif break; case PDDF_INT_HEX: @@ -324,8 +324,8 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c if (ret==0) *(int *)(ptr->addr) = num; #if DEBUG - pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_HEX VALUE:0x%x\n", - ptr->dev_attr.attr.name, *(int *)(ptr->addr)); + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_HEX VALUE:0x%x\n", + ptr->dev_attr.attr.name, *(int *)(ptr->addr)); #endif break; case PDDF_USHORT: @@ -333,8 +333,8 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c if (ret==0) *(unsigned short *)(ptr->addr) = (unsigned short)num; #if DEBUG - pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_USHORT VALUE:%x\n", - ptr->dev_attr.attr.name, *(unsigned short *)(ptr->addr)); + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_USHORT VALUE:%x\n", + ptr->dev_attr.attr.name, *(unsigned short *)(ptr->addr)); #endif break; case PDDF_UINT32: @@ -342,8 +342,8 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c if (ret==0) *(uint32_t *)(ptr->addr) = (uint32_t)num; #if DEBUG - pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_UINT32 VALUE:%d\n", - ptr->dev_attr.attr.name, *(uint32_t *)(ptr->addr)); + pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR [%s] PDDF_UINT32 VALUE:%d\n", + ptr->dev_attr.attr.name, *(uint32_t *)(ptr->addr)); #endif break; default: @@ -354,125 +354,125 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c static int load_led_ops_data(struct device_attribute *da, LED_STATUS state) { - struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; - LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; - LED_TYPE led_type; - LED_OPS_DATA* ops_ptr=NULL; - if(!ptr || strlen(ptr->device_name)==0 ) return(-1); + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; + LED_TYPE led_type; + LED_OPS_DATA* ops_ptr=NULL; + if(!ptr || strlen(ptr->device_name)==0 ) return(-1); #if DEBUG - if(ptr->device_name) pddf_dbg(LED, "SYSTEM_LED: load_led_ops_data: name:%s; index=%d ADDR=%p\n", - ptr->device_name, ptr->index, ptr); + if(ptr->device_name) pddf_dbg(LED, "SYSTEM_LED: load_led_ops_data: name:%s; index=%d ADDR=%p\n", + ptr->device_name, ptr->index, ptr); #endif - if((led_type=get_dev_type(ptr->device_name))==LED_TYPE_MAX) { - printk(KERN_ERR "PDDF_LED ERROR *%s Unsupported Led Type\n", __func__); - return(-1); - } - if(dev_index_check(led_type, ptr->index)==-1) { - printk(KERN_ERR "PDDF_LED ERROR %s invalid index: %d for type:%d\n", __func__, ptr->index, led_type); - return(-1); - } - ops_ptr = dev_list[led_type]+ptr->index; - - memcpy(ops_ptr->device_name, ptr->device_name, sizeof(ops_ptr->device_name)); - ops_ptr->index = ptr->index; - memcpy(&ops_ptr->data[state], &ptr->data[state], sizeof(LED_DATA)); - ops_ptr->data[state].swpld_addr = ptr->swpld_addr; - ops_ptr->data[state].swpld_addr_offset = ptr->swpld_addr_offset; - ops_ptr->swpld_addr = ptr->swpld_addr; - ops_ptr->swpld_addr_offset = ptr->swpld_addr_offset; + if((led_type=get_dev_type(ptr->device_name))==LED_TYPE_MAX) { + printk(KERN_ERR "PDDF_LED ERROR *%s Unsupported Led Type\n", __func__); + return(-1); + } + if(dev_index_check(led_type, ptr->index)==-1) { + printk(KERN_ERR "PDDF_LED ERROR %s invalid index: %d for type:%d\n", __func__, ptr->index, led_type); + return(-1); + } + ops_ptr = dev_list[led_type]+ptr->index; + + memcpy(ops_ptr->device_name, ptr->device_name, sizeof(ops_ptr->device_name)); + ops_ptr->index = ptr->index; + memcpy(&ops_ptr->data[state], &ptr->data[state], sizeof(LED_DATA)); + ops_ptr->data[state].swpld_addr = ptr->swpld_addr; + ops_ptr->data[state].swpld_addr_offset = ptr->swpld_addr_offset; + ops_ptr->swpld_addr = ptr->swpld_addr; + ops_ptr->swpld_addr_offset = ptr->swpld_addr_offset; #if DEBUG - print_led_data(ptr); - print_led_data(dev_list[led_type]+ptr->index); + print_led_data(ptr); + print_led_data(dev_list[led_type]+ptr->index); #endif - memset(ptr, 0, sizeof(LED_OPS_DATA)); - return (0); + memset(ptr, 0, sizeof(LED_OPS_DATA)); + return (0); } static int show_led_ops_data(struct device_attribute *da) { LED_OPS_DATA* ops_ptr=find_led_ops_data(da); print_led_data(ops_ptr); - return(0); + return(0); } static int verify_led_ops_data(struct device_attribute *da) { - struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; - LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; - LED_OPS_DATA* ops_ptr=find_led_ops_data(da); - - if(ops_ptr) - memcpy(ptr, ops_ptr, sizeof(LED_OPS_DATA)); - else - pddf_dbg(LED, "SYSTEM_LED: verify_led_ops_data: Failed to find ops_ptr name:%s; index=%d\n", ptr->device_name, ptr->index); - return (0); + struct pddf_data_attribute *_ptr = (struct pddf_data_attribute *)da; + LED_OPS_DATA* ptr=(LED_OPS_DATA*)_ptr->addr; + LED_OPS_DATA* ops_ptr=find_led_ops_data(da); + + if(ops_ptr) + memcpy(ptr, ops_ptr, sizeof(LED_OPS_DATA)); + else + pddf_dbg(LED, "SYSTEM_LED: verify_led_ops_data: Failed to find ops_ptr name:%s; index=%d\n", ptr->device_name, ptr->index); + return (0); } ssize_t dev_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - if(strncmp(buf, "create_on", strlen("create_on"))==0 ) { - load_led_ops_data(da, ON); - } - else if(strncmp(buf, "create_off", strlen("create_off"))==0 ) { - load_led_ops_data(da, OFF); - } - else if(strncmp(buf, "create_faulty", strlen("create_faulty"))==0 ) { - load_led_ops_data(da, FAULTY); - } - else if(strncmp(buf, "create_blink", strlen("create_blink"))==0 ) { - load_led_ops_data(da, BLINK); - } - else if(strncmp(buf, "show", strlen("show"))==0 ) { - show_led_ops_data(da); - } - else if(strncmp(buf, "verify", strlen("verify"))==0 ) { - verify_led_ops_data(da); - } - else if(strncmp(buf, "get_status", strlen("get_status"))==0 ) { - get_status_led(da); - } - else if(strncmp(buf, "set_status", strlen("set_status"))==0 ) { - set_status_led(da); - } - else { - printk(KERN_ERR "PDDF_ERROR %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } - return(count); + if(strncmp(buf, "create_on", strlen("create_on"))==0 ) { + load_led_ops_data(da, ON); + } + else if(strncmp(buf, "create_off", strlen("create_off"))==0 ) { + load_led_ops_data(da, OFF); + } + else if(strncmp(buf, "create_faulty", strlen("create_faulty"))==0 ) { + load_led_ops_data(da, FAULTY); + } + else if(strncmp(buf, "create_blink", strlen("create_blink"))==0 ) { + load_led_ops_data(da, BLINK); + } + else if(strncmp(buf, "show", strlen("show"))==0 ) { + show_led_ops_data(da); + } + else if(strncmp(buf, "verify", strlen("verify"))==0 ) { + verify_led_ops_data(da); + } + else if(strncmp(buf, "get_status", strlen("get_status"))==0 ) { + get_status_led(da); + } + else if(strncmp(buf, "set_status", strlen("set_status"))==0 ) { + set_status_led(da); + } + else { + printk(KERN_ERR "PDDF_ERROR %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + return(count); } ssize_t store_config_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - int ret, num; - struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; - if(strncmp(ptr->dev_attr.attr.name, "num_psus", strlen("num_psus"))==0 ) { - ret = kstrtoint(buf,10,&num); + int ret, num; + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + if(strncmp(ptr->dev_attr.attr.name, "num_psus", strlen("num_psus"))==0 ) { + ret = kstrtoint(buf,10,&num); if (ret==0) *(int *)(ptr->addr) = num; - if(psu_led_ops_data == NULL) { - if ((psu_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { - printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for PSU LED\n"); - return (count); - } - pddf_dbg(LED, "Allocate PSU LED Memory ADDR=%p\n", psu_led_ops_data); - dev_list[LED_PSU]=psu_led_ops_data; - } + if(psu_led_ops_data == NULL) { + if ((psu_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for PSU LED\n"); + return (count); + } + pddf_dbg(LED, "Allocate PSU LED Memory ADDR=%p\n", psu_led_ops_data); + dev_list[LED_PSU]=psu_led_ops_data; + } #if DEBUG pddf_dbg(LED, "[ WRITE ] ATTR CONFIG [%s] VALUE:%d; %d\n", ptr->dev_attr.attr.name, num, num_psus); #endif - return(count); - } + return(count); + } if(strncmp(ptr->dev_attr.attr.name, "num_fans", strlen("num_fans"))==0 ) { ret = kstrtoint(buf,10,&num); if (ret==0) *(int *)(ptr->addr) = num; - if (fantray_led_ops_data == NULL) { - if ((fantray_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { - printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for FANTRAY LED\n"); - return (count); - } - pddf_dbg(LED, "Allocate FanTray LED Memory ADDR=%p\n", fantray_led_ops_data); - dev_list[LED_FANTRAY]=fantray_led_ops_data; + if (fantray_led_ops_data == NULL) { + if ((fantray_led_ops_data = kzalloc(num * sizeof(LED_OPS_DATA), GFP_KERNEL)) == NULL) { + printk(KERN_ERR "PDDF_LED ERROR failed to allocate memory for FANTRAY LED\n"); + return (count); + } + pddf_dbg(LED, "Allocate FanTray LED Memory ADDR=%p\n", fantray_led_ops_data); + dev_list[LED_FANTRAY]=fantray_led_ops_data; } #if DEBUG pddf_dbg(LED, "[ WRITE ] ATTR CONFIG [%s] VALUE:%d; %d\n", @@ -485,34 +485,34 @@ ssize_t store_config_data(struct device *dev, struct device_attribute *da, const ssize_t store_bits_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - int len = 0, num1 = 0, num2 = 0; - char mask=0xFF; - char *pptr=NULL; - char bits[NAME_SIZE]; - struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; - MASK_BITS* bits_ptr=(MASK_BITS*)(ptr->addr); - strncpy(bits_ptr->bits, buf, strlen(buf)-1); // to discard newline char form buf - bits_ptr->bits[strlen(buf)-1] = '\0'; - if((pptr=strstr(buf,":")) != NULL) { - len=pptr-buf; - sprintf(bits, buf); - bits[len]='\0'; - kstrtoint(bits,16,&num1); + int len = 0, num1 = 0, num2 = 0; + char mask=0xFF; + char *pptr=NULL; + char bits[NAME_SIZE]; + struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; + MASK_BITS* bits_ptr=(MASK_BITS*)(ptr->addr); + strncpy(bits_ptr->bits, buf, strlen(buf)-1); // to discard newline char form buf + bits_ptr->bits[strlen(buf)-1] = '\0'; + if((pptr=strstr(buf,":")) != NULL) { + len=pptr-buf; + sprintf(bits, buf); + bits[len]='\0'; + kstrtoint(bits,16,&num1); mask = mask & ~(1 << num1); - sprintf(bits, ++pptr); - kstrtoint(bits,16,&num2); + sprintf(bits, ++pptr); + kstrtoint(bits,16,&num2); bits_ptr->mask_bits = mask & ~(1 << num2); bits_ptr->pos = num2; - } else { - kstrtoint(buf,16,&num1); + } else { + kstrtoint(buf,16,&num1); bits_ptr->mask_bits = mask & ~(1 << num1); bits_ptr->pos = num1; - } + } #if DEBUG pddf_dbg(LED, KERN_ERR "[ WRITE ] ATTR PTR Bits [%s] VALUE:%s mask:0x%x; pos:0x%x\n", - ptr->dev_attr.attr.name, bits_ptr->bits, bits_ptr->mask_bits, bits_ptr->pos); + ptr->dev_attr.attr.name, bits_ptr->bits, bits_ptr->mask_bits, bits_ptr->pos); #endif - return (count); + return (count); } /************************************************************************** @@ -562,21 +562,21 @@ struct attribute_group attr_group_dev={ * on/, off/, faulty/, blink/ attributes **************************************************************************/ #define LED_DEV_STATE_ATTR_GROUP(name, func) \ - PDDF_LED_DATA_ATTR(name, bits, S_IWUSR|S_IRUGO, show_pddf_data, \ - store_bits_data, PDDF_CHAR, NAME_SIZE, func.bits.bits); \ - PDDF_LED_DATA_ATTR(name, color, S_IWUSR|S_IRUGO, show_pddf_data, \ + PDDF_LED_DATA_ATTR(name, bits, S_IWUSR|S_IRUGO, show_pddf_data, \ + store_bits_data, PDDF_CHAR, NAME_SIZE, func.bits.bits); \ + PDDF_LED_DATA_ATTR(name, color, S_IWUSR|S_IRUGO, show_pddf_data, \ store_pddf_data, PDDF_CHAR, NAME_SIZE, func.color); \ - PDDF_LED_DATA_ATTR(name, value, S_IWUSR|S_IRUGO, show_pddf_data, \ + PDDF_LED_DATA_ATTR(name, value, S_IWUSR|S_IRUGO, show_pddf_data, \ store_pddf_data, PDDF_USHORT, sizeof(unsigned short), func.value); \ - struct attribute* attrs_##name[]={ \ - &pddf_dev_##name##_attr_bits.dev_attr.attr, \ - &pddf_dev_##name##_attr_color.dev_attr.attr, \ - &pddf_dev_##name##_attr_value.dev_attr.attr, \ - NULL, \ - }; \ - struct attribute_group attr_group_##name={ \ - .attrs = attrs_##name, \ - }; \ + struct attribute* attrs_##name[]={ \ + &pddf_dev_##name##_attr_bits.dev_attr.attr, \ + &pddf_dev_##name##_attr_color.dev_attr.attr, \ + &pddf_dev_##name##_attr_value.dev_attr.attr, \ + NULL, \ + }; \ + struct attribute_group attr_group_##name={ \ + .attrs = attrs_##name, \ + }; \ LED_DEV_STATE_ATTR_GROUP(on, (void*)&temp_data.data[ON]) @@ -603,7 +603,7 @@ struct attribute_group attr_group_cur_state={ /*************************************************************************/ #define KOBJ_FREE(obj) \ - if(obj) kobject_put(obj); \ + if(obj) kobject_put(obj); \ void free_kobjs(void) { @@ -618,40 +618,40 @@ void free_kobjs(void) int KBOJ_CREATE(char* name, struct kobject* parent, struct kobject** child) { - if (parent) { - *child = kobject_create_and_add(name, parent); - } else { - printk(KERN_ERR "PDDF_LED ERROR to create %s kobj; null parent\n", name); + if (parent) { + *child = kobject_create_and_add(name, parent); + } else { + printk(KERN_ERR "PDDF_LED ERROR to create %s kobj; null parent\n", name); free_kobjs(); return (-ENOMEM); - } - return (0); + } + return (0); } int LED_DEV_ATTR_CREATE(struct kobject *kobj, const struct attribute_group *attr, const char* name) { - int status = sysfs_create_group(kobj, attr); + int status = sysfs_create_group(kobj, attr); if(status) { pddf_dbg(LED, KERN_ERR "Driver ERROR: sysfs_create %s failed rc=%d\n", name, status); - } + } } static int __init led_init(void) { - struct kobject *device_kobj; - pddf_dbg(LED, KERN_INFO "PDDF GENERIC LED MODULE init..\n"); + struct kobject *device_kobj; + pddf_dbg(LED, KERN_INFO "PDDF GENERIC LED MODULE init..\n"); device_kobj = get_device_i2c_kobj(); if(!device_kobj) return -ENOMEM; - KBOJ_CREATE("platform", device_kobj, &platform_kobj); - KBOJ_CREATE("led", device_kobj, &led_kobj); - KBOJ_CREATE("on", led_kobj, &on_kobj); - KBOJ_CREATE("off", led_kobj, &off_kobj); - KBOJ_CREATE("blink", led_kobj, &blink_kobj); - KBOJ_CREATE("faulty", led_kobj, &faulty_kobj); - KBOJ_CREATE("cur_state", led_kobj, &cur_state_kobj); + KBOJ_CREATE("platform", device_kobj, &platform_kobj); + KBOJ_CREATE("led", device_kobj, &led_kobj); + KBOJ_CREATE("on", led_kobj, &on_kobj); + KBOJ_CREATE("off", led_kobj, &off_kobj); + KBOJ_CREATE("blink", led_kobj, &blink_kobj); + KBOJ_CREATE("faulty", led_kobj, &faulty_kobj); + KBOJ_CREATE("cur_state", led_kobj, &cur_state_kobj); LED_DEV_ATTR_CREATE(platform_kobj, &attr_group_platform, "attr_group_platform"); LED_DEV_ATTR_CREATE(led_kobj, &attr_group_dev, "attr_group_dev"); @@ -660,15 +660,15 @@ static int __init led_init(void) { LED_DEV_ATTR_CREATE(faulty_kobj, &attr_group_faulty, "attr_group_faulty"); LED_DEV_ATTR_CREATE(blink_kobj, &attr_group_blink, "attr_group_blink"); LED_DEV_ATTR_CREATE(cur_state_kobj, &attr_group_cur_state, "attr_group_cur_state"); - return (0); + return (0); } static void __exit led_exit(void) { - pddf_dbg(LED, "PDDF GENERIC LED MODULE exit..\n"); - free_kobjs(); - if(psu_led_ops_data) kfree(psu_led_ops_data); - if(fantray_led_ops_data) kfree(fantray_led_ops_data); + pddf_dbg(LED, "PDDF GENERIC LED MODULE exit..\n"); + free_kobjs(); + if(psu_led_ops_data) kfree(psu_led_ops_data); + if(fantray_led_ops_data) kfree(fantray_led_ops_data); } module_init(led_init); diff --git a/platform/pddf/i2c/modules/mux/pddf_mux_module.c b/platform/pddf/i2c/modules/mux/pddf_mux_module.c index 4e8d6fe85370..4f5fbcb60916 100644 --- a/platform/pddf/i2c/modules/mux/pddf_mux_module.c +++ b/platform/pddf/i2c/modules/mux/pddf_mux_module.c @@ -36,114 +36,114 @@ PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void* static struct attribute *mux_attributes[] = { - &attr_virt_bus.dev_attr.attr, - &attr_dev_ops.dev_attr.attr, - NULL + &attr_virt_bus.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL }; static const struct attribute_group pddf_mux_client_data_group = { - .attrs = mux_attributes, + .attrs = mux_attributes, }; struct i2c_board_info *i2c_get_mux_board_info(MUX_DATA* mdata, NEW_DEV_ATTR *device_data) { - static struct i2c_board_info board_info; - static struct pca954x_platform_mode platform_modes[8]; - static struct pca954x_platform_data mux_platform_data; - int num_modes, i; - - if (strncmp(device_data->dev_type, "pca9548", strlen("pca9548")) == 0) - num_modes = 8; - else if (strncmp(device_data->dev_type, "pca9546", strlen("pca9546")) == 0) - num_modes = 6; - else - { - printk(KERN_ERR "%s: Unknown type of mux device\n", __FUNCTION__); - return NULL; - } - - for(i = 0; i < num_modes; i++) { - platform_modes[i] = (struct pca954x_platform_mode) { - .adap_id = (mdata->virt_bus + i), - .deselect_on_exit = 1, - }; - } - - mux_platform_data = (struct pca954x_platform_data) { - .modes = platform_modes, - .num_modes = num_modes, - }; - - board_info = (struct i2c_board_info) { - .platform_data = &mux_platform_data, - }; - - board_info.addr = device_data->dev_addr; - strcpy(board_info.type, device_data->dev_type); - - return &board_info; + static struct i2c_board_info board_info; + static struct pca954x_platform_mode platform_modes[8]; + static struct pca954x_platform_data mux_platform_data; + int num_modes, i; + + if (strncmp(device_data->dev_type, "pca9548", strlen("pca9548")) == 0) + num_modes = 8; + else if (strncmp(device_data->dev_type, "pca9546", strlen("pca9546")) == 0) + num_modes = 6; + else + { + printk(KERN_ERR "%s: Unknown type of mux device\n", __FUNCTION__); + return NULL; + } + + for(i = 0; i < num_modes; i++) { + platform_modes[i] = (struct pca954x_platform_mode) { + .adap_id = (mdata->virt_bus + i), + .deselect_on_exit = 1, + }; + } + + mux_platform_data = (struct pca954x_platform_data) { + .modes = platform_modes, + .num_modes = num_modes, + }; + + board_info = (struct i2c_board_info) { + .platform_data = &mux_platform_data, + }; + + board_info.addr = device_data->dev_addr; + strcpy(board_info.type, device_data->dev_type); + + return &board_info; } /*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - MUX_DATA *mux_ptr = (MUX_DATA *)(ptr->addr); - NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); - struct i2c_adapter *adapter; - struct i2c_board_info *board_info; - struct i2c_client *client_ptr; - - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ - if (strncmp(buf, "add", strlen(buf)-1)==0) - { - adapter = i2c_get_adapter(device_ptr->parent_bus); - board_info = i2c_get_mux_board_info(mux_ptr, device_ptr); - - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ - client_ptr = i2c_new_device(adapter, board_info); - - if (client_ptr != NULL) - { - i2c_put_adapter(adapter); - pddf_dbg(MUX, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); - add_device_table(device_ptr->i2c_name, (void*)client_ptr); - } - else - { - i2c_put_adapter(adapter); - goto free_data; - } - } - else if (strncmp(buf, "delete", strlen(buf)-1)==0) - { - /*Get the i2c_client handle for the created client*/ - client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); - if (client_ptr) - { - pddf_dbg(MUX, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); - i2c_unregister_device(client_ptr); - /*TODO: Nullyfy the platform data*/ - delete_device_table(device_ptr->i2c_name); - } - else - { - printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); - } - } - else - { - printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + MUX_DATA *mux_ptr = (MUX_DATA *)(ptr->addr); + NEW_DEV_ATTR *device_ptr = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(device_ptr->parent_bus); + board_info = i2c_get_mux_board_info(mux_ptr, device_ptr); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if (client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(MUX, KERN_ERR "Created %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + add_device_table(device_ptr->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(device_ptr->i2c_name); + if (client_ptr) + { + pddf_dbg(MUX, KERN_ERR "Removing %s client: 0x%x\n", device_ptr->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + /*TODO: Nullyfy the platform data*/ + delete_device_table(device_ptr->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", device_ptr->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } free_data: - memset(mux_ptr, 0, sizeof(MUX_DATA)); - /*TODO: free the device_ptr->data is dynamically allocated*/ - memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); + memset(mux_ptr, 0, sizeof(MUX_DATA)); + /*TODO: free the device_ptr->data is dynamically allocated*/ + memset(device_ptr, 0 , sizeof(NEW_DEV_ATTR)); - return count; + return count; } @@ -151,49 +151,49 @@ static struct kobject *mux_kobj; int __init mux_data_init(void) { - struct kobject *device_kobj; - int ret = 0; + struct kobject *device_kobj; + int ret = 0; - pddf_dbg(MUX, "MUX_DATA MODULE.. init\n"); + pddf_dbg(MUX, "MUX_DATA MODULE.. init\n"); - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; - mux_kobj = kobject_create_and_add("mux", device_kobj); - if(!mux_kobj) - return -ENOMEM; - - - ret = sysfs_create_group(mux_kobj, &pddf_clients_data_group); - if (ret) + mux_kobj = kobject_create_and_add("mux", device_kobj); + if(!mux_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(mux_kobj, &pddf_clients_data_group); + if (ret) { kobject_put(mux_kobj); return ret; } - pddf_dbg(MUX, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); + pddf_dbg(MUX, "CREATED PDDF I2C CLIENTS CREATION SYSFS GROUP\n"); - ret = sysfs_create_group(mux_kobj, &pddf_mux_client_data_group); - if (ret) + ret = sysfs_create_group(mux_kobj, &pddf_mux_client_data_group); + if (ret) { - sysfs_remove_group(mux_kobj, &pddf_clients_data_group); + sysfs_remove_group(mux_kobj, &pddf_clients_data_group); kobject_put(mux_kobj); return ret; } - pddf_dbg(MUX, "CREATED MUX DATA SYSFS GROUP\n"); + pddf_dbg(MUX, "CREATED MUX DATA SYSFS GROUP\n"); - return ret; + return ret; } void __exit mux_data_exit(void) { - pddf_dbg(MUX, "MUX_DATA MODULE.. exit\n"); - sysfs_remove_group(mux_kobj, &pddf_mux_client_data_group); - sysfs_remove_group(mux_kobj, &pddf_clients_data_group); - kobject_put(mux_kobj); - pddf_dbg(MUX, KERN_ERR "%s: Removed the kobjects for 'mux'\n",__FUNCTION__); - return; + pddf_dbg(MUX, "MUX_DATA MODULE.. exit\n"); + sysfs_remove_group(mux_kobj, &pddf_mux_client_data_group); + sysfs_remove_group(mux_kobj, &pddf_clients_data_group); + kobject_put(mux_kobj); + pddf_dbg(MUX, KERN_ERR "%s: Removed the kobjects for 'mux'\n",__FUNCTION__); + return; } module_init(mux_data_init); diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c index d63192e18d3f..b8de5b5873ba 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c @@ -32,31 +32,31 @@ void get_psu_duplicate_sysfs(int idx, char *str) { - switch (idx) - { - case PSU_V_OUT: - strcpy(str, "in3_input"); - break; - case PSU_I_OUT: - strcpy(str, "curr2_input"); + switch (idx) + { + case PSU_V_OUT: + strcpy(str, "in3_input"); + break; + case PSU_I_OUT: + strcpy(str, "curr2_input"); break; - case PSU_P_OUT: - strcpy(str, "power2_input"); + case PSU_P_OUT: + strcpy(str, "power2_input"); break; - case PSU_FAN1_SPEED: - strcpy(str, "fan1_input"); + case PSU_FAN1_SPEED: + strcpy(str, "fan1_input"); break; - case PSU_TEMP1_INPUT: - strcpy(str, "temp1_input"); + case PSU_TEMP1_INPUT: + strcpy(str, "temp1_input"); + break; + /*case PSU_TEMP_FAULT:*/ + /*strcpy(str, "temp1_fault");*/ + /*break;*/ + default: break; - /*case PSU_TEMP_FAULT:*/ - /*strcpy(str, "temp1_fault");*/ - /*break;*/ - default: - break; - } - - return; + } + + return; } static int two_complement_to_int(u16 data, u8 valid_bit, int mask) @@ -105,18 +105,18 @@ int psu_update_hw(struct device *dev, struct psu_attr_info *info, PSU_DATA_ATTR int psu_update_attr(struct device *dev, struct psu_attr_info *data, PSU_DATA_ATTR *udata) { - int status = 0; + int status = 0; struct i2c_client *client = to_i2c_client(dev); - PSU_SYSFS_ATTR_DATA *sysfs_attr_data=NULL; + PSU_SYSFS_ATTR_DATA *sysfs_attr_data=NULL; mutex_lock(&data->update_lock); if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) - { + { dev_dbg(&client->dev, "Starting update for %s\n", data->name); - /*psu_dbg(KERN_ERR "%s: UPDATING %s ATTR FOR PSU,#### \n", __FUNCTION__, udata->aname );*/ - sysfs_attr_data = udata->access_data; + /*psu_dbg(KERN_ERR "%s: UPDATING %s ATTR FOR PSU,#### \n", __FUNCTION__, udata->aname );*/ + sysfs_attr_data = udata->access_data; if (sysfs_attr_data->pre_get != NULL) { status = (sysfs_attr_data->pre_get)(client, udata, data); @@ -131,18 +131,18 @@ int psu_update_attr(struct device *dev, struct psu_attr_info *data, PSU_DATA_ATT } if (sysfs_attr_data->post_get != NULL) - { + { status = (sysfs_attr_data->post_get)(client, udata, data); if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, udata->aname); - } + } data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); - return 0; + return 0; } ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char *buf) @@ -154,70 +154,70 @@ ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char * PSU_DATA_ATTR *usr_data = NULL; struct psu_attr_info *sysfs_attr_info = NULL; int i, status=0; - u16 value = 0; - int exponent, mantissa; - int multiplier = 1000; - char new_str[ATTR_NAME_LEN] = ""; - PSU_SYSFS_ATTR_DATA *ptr = NULL; + u16 value = 0; + int exponent, mantissa; + int multiplier = 1000; + char new_str[ATTR_NAME_LEN] = ""; + PSU_SYSFS_ATTR_DATA *ptr = NULL; for (i=0;inum_attr;i++) { - ptr = (PSU_SYSFS_ATTR_DATA *)pdata->psu_attrs[i].access_data; - get_psu_duplicate_sysfs(ptr->index , new_str); + ptr = (PSU_SYSFS_ATTR_DATA *)pdata->psu_attrs[i].access_data; + get_psu_duplicate_sysfs(ptr->index , new_str); if ( strcmp(attr->dev_attr.attr.name, pdata->psu_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0 ) - { - /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->psu_attrs[i].aname, ptr->index, new_str);*/ - sysfs_attr_info = &data->attr_info[i]; + { + /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->psu_attrs[i].aname, ptr->index, new_str);*/ + sysfs_attr_info = &data->attr_info[i]; usr_data = &pdata->psu_attrs[i]; - strcpy(new_str, ""); + strcpy(new_str, ""); } } if (sysfs_attr_info==NULL || usr_data==NULL) { - printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); - goto exit; - } + printk(KERN_ERR "%s is not supported attribute for this client\n", attr->dev_attr.attr.name); + goto exit; + } psu_update_attr(dev, sysfs_attr_info, usr_data); - switch(attr->index) - { - case PSU_PRESENT: - case PSU_POWER_GOOD: - status = sysfs_attr_info->val.intval; - return sprintf(buf, "%d\n", status); - break; - case PSU_MODEL_NAME: - case PSU_MFR_ID: - case PSU_SERIAL_NUM: - case PSU_FAN_DIR: - return sprintf(buf, "%s\n", sysfs_attr_info->val.strval); - break; - case PSU_V_OUT: - case PSU_I_OUT: - multiplier = 1000; - value = sysfs_attr_info->val.shortval; - exponent = two_complement_to_int(value >> 11, 5, 0x1f); - mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); - if (exponent >= 0) - return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); - else - return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); - - break; - case PSU_P_OUT: - multiplier = 1000000; - value = sysfs_attr_info->val.shortval; - exponent = two_complement_to_int(value >> 11, 5, 0x1f); - mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); - if (exponent >= 0) - return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); - else - return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); - - break; - case PSU_FAN1_SPEED: + switch(attr->index) + { + case PSU_PRESENT: + case PSU_POWER_GOOD: + status = sysfs_attr_info->val.intval; + return sprintf(buf, "%d\n", status); + break; + case PSU_MODEL_NAME: + case PSU_MFR_ID: + case PSU_SERIAL_NUM: + case PSU_FAN_DIR: + return sprintf(buf, "%s\n", sysfs_attr_info->val.strval); + break; + case PSU_V_OUT: + case PSU_I_OUT: + multiplier = 1000; + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); + else + return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); + + break; + case PSU_P_OUT: + multiplier = 1000000; + value = sysfs_attr_info->val.shortval; + exponent = two_complement_to_int(value >> 11, 5, 0x1f); + mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); + if (exponent >= 0) + return sprintf(buf, "%d\n", (mantissa << exponent) * multiplier); + else + return sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent)); + + break; + case PSU_FAN1_SPEED: value = sysfs_attr_info->val.shortval; exponent = two_complement_to_int(value >> 11, 5, 0x1f); mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); @@ -225,10 +225,10 @@ ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char * return sprintf(buf, "%d\n", (mantissa << exponent)); else return sprintf(buf, "%d\n", (mantissa) / (1 << -exponent)); - - break; - case PSU_TEMP1_INPUT: - multiplier = 1000; + + break; + case PSU_TEMP1_INPUT: + multiplier = 1000; value = sysfs_attr_info->val.shortval; exponent = two_complement_to_int(value >> 11, 5, 0x1f); mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff); @@ -236,15 +236,15 @@ ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char * return sprintf(buf, "%d\n", (mantissa << exponent)); else return sprintf(buf, "%d\n", (mantissa) / (1 << -exponent)); - - break; - default: - printk(KERN_ERR "%s: Unable to find attribute index for %s\n", __FUNCTION__, usr_data->aname); - goto exit; - } + + break; + default: + printk(KERN_ERR "%s: Unable to find attribute index for %s\n", __FUNCTION__, usr_data->aname); + goto exit; + } exit: - return sprintf(buf, "%d\n", status); + return sprintf(buf, "%d\n", status); } @@ -274,10 +274,10 @@ ssize_t psu_store_default(struct device *dev, struct device_attribute *da, const switch(attr->index) { - /*No write attributes for now in PSU*/ + /*No write attributes for now in PSU*/ default: - /*printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname);*/ - goto exit; + /*printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname);*/ + goto exit; } psu_update_hw(dev, sysfs_attr_info, usr_data); @@ -288,209 +288,209 @@ ssize_t psu_store_default(struct device *dev, struct device_attribute *da, const int sonic_i2c_get_psu_present_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0; + int status = 0; int val = 0; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - - - if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) - { - val = board_i2c_cpld_read(adata->devaddr , adata->offset); - if (val < 0) - return val; - padata->val.intval = ((val & adata->mask) == adata->cmpval); - psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); - } - - return status; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + + + if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) + { + val = board_i2c_cpld_read(adata->devaddr , adata->offset); + if (val < 0) + return val; + padata->val.intval = ((val & adata->mask) == adata->cmpval); + psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); + } + + return status; } int sonic_i2c_get_psu_power_good_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0; + int status = 0; int val = 0; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - - if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) + struct psu_attr_info *padata = (struct psu_attr_info *)data; + + if (strncmp(adata->devtype, "cpld", strlen("cpld")) == 0) { - val = board_i2c_cpld_read(adata->devaddr , adata->offset); - if (val < 0) - return val; - padata->val.intval = ((val & adata->mask) == adata->cmpval); - psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); + val = board_i2c_cpld_read(adata->devaddr , adata->offset); + if (val < 0) + return val; + padata->val.intval = ((val & adata->mask) == adata->cmpval); + psu_dbg(KERN_ERR "%s: status_value = 0x%x\n", __FUNCTION__, padata->val.intval); } - return status; + return status; } int sonic_i2c_get_psu_model_name_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - char model[16]=""; //temporary placeholder for model name - uint8_t offset = (uint8_t)adata->offset; - int data_len = adata->len; - - /*printk(KERN_ERR "###INSIDE GET MODEL NAME. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ - while (retry) - { - status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, model); - if (unlikely(status<0)) - { - msleep(60); - retry--; - continue; - } - break; - } - - if (status < 0) - { - model[0] = '\0'; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char model[16]=""; //temporary placeholder for model name + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*printk(KERN_ERR "###INSIDE GET MODEL NAME. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, model); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + model[0] = '\0'; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read model name from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - model[data_len-1] = '\0'; + { + model[data_len-1] = '\0'; } - if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) - strncpy(padata->val.strval, model+1, data_len-1); - else - strncpy(padata->val.strval, model, data_len); + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, model+1, data_len-1); + else + strncpy(padata->val.strval, model, data_len); - psu_dbg(KERN_ERR "%s: status = %d, model_name : %s\n", __FUNCTION__, status, padata->val.strval); + psu_dbg(KERN_ERR "%s: status = %d, model_name : %s\n", __FUNCTION__, status, padata->val.strval); return 0; } int sonic_i2c_get_psu_mfr_id_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - char mfr_id[16] = ""; // temporary place holder for mfr_id - uint8_t offset = (uint8_t)adata->offset; - int data_len = adata->len; - - /*psu_dbg(KERN_ERR "###INSIDE GET MFR ID. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ - while (retry) - { - status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, mfr_id); - if (unlikely(status<0)) - { - msleep(60); - retry--; - continue; - } - break; - } - - if (status < 0) - { - mfr_id[0] = '\0'; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char mfr_id[16] = ""; // temporary place holder for mfr_id + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*psu_dbg(KERN_ERR "###INSIDE GET MFR ID. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, mfr_id); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + mfr_id[0] = '\0'; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read mfr_id from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - mfr_id[data_len-1] = '\0'; + { + mfr_id[data_len-1] = '\0'; } - if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) - strncpy(padata->val.strval, mfr_id+1, data_len-1); - else - strncpy(padata->val.strval, mfr_id, data_len); + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, mfr_id+1, data_len-1); + else + strncpy(padata->val.strval, mfr_id, data_len); - psu_dbg(KERN_ERR "%s: status = %d, mfr_id : %s\n", __FUNCTION__, status, padata->val.strval); + psu_dbg(KERN_ERR "%s: status = %d, mfr_id : %s\n", __FUNCTION__, status, padata->val.strval); return 0; } int sonic_i2c_get_psu_serial_num_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - char serial[32] = ""; // temporary string to store the serial num - uint8_t offset = (uint8_t)adata->offset; - int data_len = adata->len; - - /*psu_dbg(KERN_ERR "###INSIDE GET SERIAL_NUM. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ - while (retry) - { - status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, serial); - if (unlikely(status<0)) - { - msleep(60); - retry--; - continue; - } - break; - } - - if (status < 0) - { - serial[0] = '\0'; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char serial[32] = ""; // temporary string to store the serial num + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + /*psu_dbg(KERN_ERR "###INSIDE GET SERIAL_NUM. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, serial); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + serial[0] = '\0'; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read serial num from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - serial[data_len-1] = '\0'; + { + serial[data_len-1] = '\0'; } - if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) - strncpy(padata->val.strval, serial+1, data_len-1); - else - strncpy(padata->val.strval, serial, data_len); + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, serial+1, data_len-1); + else + strncpy(padata->val.strval, serial, data_len); - psu_dbg(KERN_ERR "%s: status = %d, serial_num : %s\n", __FUNCTION__, status, padata->val.strval); + psu_dbg(KERN_ERR "%s: status = %d, serial_num : %s\n", __FUNCTION__, status, padata->val.strval); return 0; } int sonic_i2c_get_psu_fan_dir_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - char fan_dir[5] = ""; - uint8_t offset = (uint8_t)adata->offset; - int data_len = adata->len; - - while (retry) - { - status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, fan_dir); - if (unlikely(status<0)) - { - msleep(60); - retry--; - continue; - } - break; - } - - if (status < 0) - { - fan_dir[0] = '\0'; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + char fan_dir[5] = ""; + uint8_t offset = (uint8_t)adata->offset; + int data_len = adata->len; + + while (retry) + { + status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, fan_dir); + if (unlikely(status<0)) + { + msleep(60); + retry--; + continue; + } + break; + } + + if (status < 0) + { + fan_dir[0] = '\0'; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read fan_dir from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - fan_dir[data_len-1] = '\0'; + { + fan_dir[data_len-1] = '\0'; } - if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) - strncpy(padata->val.strval, fan_dir+1, data_len-1); - else - strncpy(padata->val.strval, fan_dir, data_len); + if (strncmp(adata->devtype, "pmbus", strlen("pmbus")) == 0) + strncpy(padata->val.strval, fan_dir+1, data_len-1); + else + strncpy(padata->val.strval, fan_dir, data_len); - psu_dbg(KERN_ERR "%s: status = %d, fan_dir : %s\n", __FUNCTION__, status, padata->val.strval); + psu_dbg(KERN_ERR "%s: status = %d, fan_dir : %s\n", __FUNCTION__, status, padata->val.strval); return 0; } int sonic_i2c_get_psu_v_out_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - uint8_t offset = (uint8_t)adata->offset; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; while (retry) { status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); @@ -502,26 +502,26 @@ int sonic_i2c_get_psu_v_out_default(void *client, PSU_DATA_ATTR *adata, void *da break; } - if (status < 0) - { - padata->val.shortval = 0; + if (status < 0) + { + padata->val.shortval = 0; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read v_out from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - padata->val.shortval = status; + { + padata->val.shortval = status; } - psu_dbg(KERN_ERR "%s: v_out : %d\n", __FUNCTION__, padata->val.shortval); + psu_dbg(KERN_ERR "%s: v_out : %d\n", __FUNCTION__, padata->val.shortval); return 0; } int sonic_i2c_get_psu_i_out_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - uint8_t offset = (uint8_t)adata->offset; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; while (retry) { status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); @@ -533,26 +533,26 @@ int sonic_i2c_get_psu_i_out_default(void *client, PSU_DATA_ATTR *adata, void *da break; } - if (status < 0) - { - padata->val.shortval = 0; + if (status < 0) + { + padata->val.shortval = 0; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read i_out from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - padata->val.shortval = status; + { + padata->val.shortval = status; } - psu_dbg(KERN_ERR "%s: i_out : %d\n", __FUNCTION__, padata->val.shortval); + psu_dbg(KERN_ERR "%s: i_out : %d\n", __FUNCTION__, padata->val.shortval); return 0; } int sonic_i2c_get_psu_p_out_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - uint8_t offset = (uint8_t)adata->offset; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; while (retry) { status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); @@ -564,26 +564,26 @@ int sonic_i2c_get_psu_p_out_default(void *client, PSU_DATA_ATTR *adata, void *da break; } - if (status < 0) - { - padata->val.shortval = 0; + if (status < 0) + { + padata->val.shortval = 0; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read p_out from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - padata->val.shortval = status; + { + padata->val.shortval = status; } - psu_dbg(KERN_ERR "%s: p_out : %d\n", __FUNCTION__, padata->val.shortval); + psu_dbg(KERN_ERR "%s: p_out : %d\n", __FUNCTION__, padata->val.shortval); return 0; } int sonic_i2c_get_psu_fan1_speed_rpm_default(void *client, PSU_DATA_ATTR *adata, void *data) { - int status = 0, retry = 10; - struct psu_attr_info *padata = (struct psu_attr_info *)data; - uint8_t offset = (uint8_t)adata->offset; + int status = 0, retry = 10; + struct psu_attr_info *padata = (struct psu_attr_info *)data; + uint8_t offset = (uint8_t)adata->offset; while (retry) { status = i2c_smbus_read_word_data((struct i2c_client *)client, offset); @@ -595,16 +595,16 @@ int sonic_i2c_get_psu_fan1_speed_rpm_default(void *client, PSU_DATA_ATTR *adata, break; } - if (status < 0) - { - padata->val.shortval = 0; + if (status < 0) + { + padata->val.shortval = 0; dev_dbg(&((struct i2c_client *)client)->dev, "unable to read fan1_speed_rpm from (0x%x)\n", ((struct i2c_client *)client)->addr); } else - { - padata->val.shortval = status; + { + padata->val.shortval = status; } - psu_dbg(KERN_ERR "%s: fan1_speed_rpm : %d\n", __FUNCTION__, padata->val.shortval); + psu_dbg(KERN_ERR "%s: fan1_speed_rpm : %d\n", __FUNCTION__, padata->val.shortval); return 0; } diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c index 10da2544ea4b..bbed95396450 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c @@ -27,17 +27,17 @@ static unsigned short normal_i2c[] = {0x50, 0x58, 0x51, 0x59, 0x53, 0x5b, I2C_CLIENT_END}; struct pddf_ops_t pddf_psu_ops = { - .pre_init = NULL, - .post_init = NULL, + .pre_init = NULL, + .post_init = NULL, - .pre_probe = NULL, - .post_probe = NULL, + .pre_probe = NULL, + .post_probe = NULL, - .pre_remove = NULL, - .post_remove = NULL, + .pre_remove = NULL, + .post_remove = NULL, - .pre_exit = NULL, - .post_exit = NULL, + .pre_exit = NULL, + .post_exit = NULL, }; EXPORT_SYMBOL(pddf_psu_ops); @@ -75,29 +75,29 @@ EXPORT_SYMBOL(access_psu_fan1_speed_rpm); PSU_SYSFS_ATTR_DATA_ENTRY psu_sysfs_attr_data_tbl[]= { - { "psu_present", &access_psu_present}, - { "psu_model_name", &access_psu_model_name}, - { "psu_power_good" , &access_psu_power_good}, - { "psu_mfr_id" , &access_psu_mfr_id}, - { "psu_serial_num" , &access_psu_serial_num}, - { "psu_fan_dir" , &access_psu_fan_dir}, - { "psu_v_out" , &access_psu_v_out}, - { "psu_i_out" , &access_psu_i_out}, - { "psu_p_out" , &access_psu_p_out}, - { "psu_fan1_speed_rpm" , &access_psu_fan1_speed_rpm} + { "psu_present", &access_psu_present}, + { "psu_model_name", &access_psu_model_name}, + { "psu_power_good" , &access_psu_power_good}, + { "psu_mfr_id" , &access_psu_mfr_id}, + { "psu_serial_num" , &access_psu_serial_num}, + { "psu_fan_dir" , &access_psu_fan_dir}, + { "psu_v_out" , &access_psu_v_out}, + { "psu_i_out" , &access_psu_i_out}, + { "psu_p_out" , &access_psu_p_out}, + { "psu_fan1_speed_rpm" , &access_psu_fan1_speed_rpm} }; void *get_psu_access_data(char *name) { - int i=0; - for(i=0; i<(sizeof(psu_sysfs_attr_data_tbl)/sizeof(psu_sysfs_attr_data_tbl[0])); i++) - { - if(strcmp(name, psu_sysfs_attr_data_tbl[i].name) ==0) - { - return &psu_sysfs_attr_data_tbl[i]; - } - } - return NULL; + int i=0; + for(i=0; i<(sizeof(psu_sysfs_attr_data_tbl)/sizeof(psu_sysfs_attr_data_tbl[0])); i++) + { + if(strcmp(name, psu_sysfs_attr_data_tbl[i].name) ==0) + { + return &psu_sysfs_attr_data_tbl[i]; + } + } + return NULL; } EXPORT_SYMBOL(get_psu_access_data); @@ -107,21 +107,21 @@ static int psu_probe(struct i2c_client *client, { struct psu_data *data; int status =0; - int i,num, j=0; - PSU_PDATA *psu_platform_data; - PSU_DATA_ATTR *data_attr; - PSU_SYSFS_ATTR_DATA_ENTRY *sysfs_data_entry; - char new_str[ATTR_NAME_LEN] = ""; + int i,num, j=0; + PSU_PDATA *psu_platform_data; + PSU_DATA_ATTR *data_attr; + PSU_SYSFS_ATTR_DATA_ENTRY *sysfs_data_entry; + char new_str[ATTR_NAME_LEN] = ""; - /*pddf_dbg("GENERIC_PSU_DRIVER Probe called... \n");*/ + /*pddf_dbg("GENERIC_PSU_DRIVER Probe called... \n");*/ - if (client == NULL) { - printk("NULL Client.. \n"); - goto exit; - } + if (client == NULL) { + printk("NULL Client.. \n"); + goto exit; + } - if (pddf_psu_ops.pre_probe) + if (pddf_psu_ops.pre_probe) { status = (pddf_psu_ops.pre_probe)(client, dev_id); if (status != 0) @@ -142,61 +142,61 @@ static int psu_probe(struct i2c_client *client, i2c_set_clientdata(client, data); dev_info(&client->dev, "chip found\n"); - /* Take control of the platform data */ - psu_platform_data = (PSU_PDATA *)(client->dev.platform_data); - num = psu_platform_data->len; - data->index = psu_platform_data->idx - 1; - data->num_psu_fans = psu_platform_data->num_psu_fans; - data->num_attr = num; - - - - /* Create and Add supported attr in the 'attributes' list */ - for (i=0; ipsu_attrs + i; - sysfs_data_entry = get_psu_access_data(data_attr->aname); - if (sysfs_data_entry == NULL) - { - printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); - continue; - } - - dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); - dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; - strcpy((char *)dy_ptr->dev_attr.attr.name, data_attr->aname); - dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; - dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; - dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; - dy_ptr->index = sysfs_data_entry->a_ptr->index; - - data->psu_attribute_list[i] = &dy_ptr->dev_attr.attr; - /*pddf_dbg(KERN_ERR "PSU%d: Allocated %d: 0x%x\n", data->index+1, i, data->psu_attribute_list[i]);*/ - strcpy(data->attr_info[i].name, data_attr->aname); - data->attr_info[i].valid = 0; - mutex_init(&data->attr_info[i].update_lock); - - /*Create a duplicate entry*/ - get_psu_duplicate_sysfs(dy_ptr->index, new_str); - if (strcmp(new_str,"")) - { - dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); - dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; - strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); - dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; - dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; - dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; - dy_ptr->index = sysfs_data_entry->a_ptr->index; - - data->psu_attribute_list[num+j] = &dy_ptr->dev_attr.attr; - j++; - strcpy(new_str,""); - } - } - data->psu_attribute_list[i+j] = NULL; - data->psu_attribute_group.attrs = data->psu_attribute_list; + /* Take control of the platform data */ + psu_platform_data = (PSU_PDATA *)(client->dev.platform_data); + num = psu_platform_data->len; + data->index = psu_platform_data->idx - 1; + data->num_psu_fans = psu_platform_data->num_psu_fans; + data->num_attr = num; + + + + /* Create and Add supported attr in the 'attributes' list */ + for (i=0; ipsu_attrs + i; + sysfs_data_entry = get_psu_access_data(data_attr->aname); + if (sysfs_data_entry == NULL) + { + printk(KERN_ERR "%s: Wrong attribute name provided by user '%s'\n", __FUNCTION__, data_attr->aname); + continue; + } + + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, data_attr->aname); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->psu_attribute_list[i] = &dy_ptr->dev_attr.attr; + /*pddf_dbg(KERN_ERR "PSU%d: Allocated %d: 0x%x\n", data->index+1, i, data->psu_attribute_list[i]);*/ + strcpy(data->attr_info[i].name, data_attr->aname); + data->attr_info[i].valid = 0; + mutex_init(&data->attr_info[i].update_lock); + + /*Create a duplicate entry*/ + get_psu_duplicate_sysfs(dy_ptr->index, new_str); + if (strcmp(new_str,"")) + { + dy_ptr = (struct sensor_device_attribute *)kzalloc(sizeof(struct sensor_device_attribute)+ATTR_NAME_LEN, GFP_KERNEL); + dy_ptr->dev_attr.attr.name = (char *)&dy_ptr[1]; + strcpy((char *)dy_ptr->dev_attr.attr.name, new_str); + dy_ptr->dev_attr.attr.mode = sysfs_data_entry->a_ptr->mode; + dy_ptr->dev_attr.show = sysfs_data_entry->a_ptr->show; + dy_ptr->dev_attr.store = sysfs_data_entry->a_ptr->store; + dy_ptr->index = sysfs_data_entry->a_ptr->index; + + data->psu_attribute_list[num+j] = &dy_ptr->dev_attr.attr; + j++; + strcpy(new_str,""); + } + } + data->psu_attribute_list[i+j] = NULL; + data->psu_attribute_group.attrs = data->psu_attribute_list; /* Register sysfs hooks */ status = sysfs_create_group(&client->dev.kobj, &data->psu_attribute_group); @@ -204,16 +204,16 @@ static int psu_probe(struct i2c_client *client, goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); - if (IS_ERR(data->hwmon_dev)) { - status = PTR_ERR(data->hwmon_dev); - goto exit_remove; - } + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); - /* Add a support for post probe function */ + /* Add a support for post probe function */ if (pddf_psu_ops.post_probe) { status = (pddf_psu_ops.post_probe)(client, dev_id); @@ -227,14 +227,14 @@ static int psu_probe(struct i2c_client *client, exit_remove: sysfs_remove_group(&client->dev.kobj, &data->psu_attribute_group); exit_free: - /* Free all the allocated attributes */ - for (i=0;data->psu_attribute_list[i]!=NULL;i++) - { - struct sensor_device_attribute *ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; - kfree(ptr); - data->psu_attribute_list[i] = NULL; - pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); - } + /* Free all the allocated attributes */ + for (i=0;data->psu_attribute_list[i]!=NULL;i++) + { + struct sensor_device_attribute *ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; + kfree(ptr); + data->psu_attribute_list[i] = NULL; + pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); + } kfree(data); exit: return status; @@ -242,40 +242,40 @@ static int psu_probe(struct i2c_client *client, static int psu_remove(struct i2c_client *client) { - int i=0, idx=0, ret = 0; + int i=0, idx=0, ret = 0; struct psu_data *data = i2c_get_clientdata(client); - PSU_PDATA *platdata = (PSU_PDATA *)client->dev.platform_data; // use dev_get_platdata() - PSU_DATA_ATTR *platdata_sub = platdata->psu_attrs; - struct sensor_device_attribute *ptr = NULL; + PSU_PDATA *platdata = (PSU_PDATA *)client->dev.platform_data; // use dev_get_platdata() + PSU_DATA_ATTR *platdata_sub = platdata->psu_attrs; + struct sensor_device_attribute *ptr = NULL; - if (pddf_psu_ops.pre_remove) + if (pddf_psu_ops.pre_remove) { ret = (pddf_psu_ops.pre_remove)(client); if (ret!=0) printk(KERN_ERR "FAN pre_remove function failed\n"); } - hwmon_device_unregister(data->hwmon_dev); - sysfs_remove_group(&client->dev.kobj, &data->psu_attribute_group); - for (i=0; data->psu_attribute_list[i]!=NULL; i++) + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &data->psu_attribute_group); + for (i=0; data->psu_attribute_list[i]!=NULL; i++) { ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; - kfree(ptr); - data->psu_attribute_list[i] = NULL; - /*pddf_dbg(KERN_ERR "PSU%d: Freed %d: 0x%x\n", data->index+1, i, ptr);*/ - } + kfree(ptr); + data->psu_attribute_list[i] = NULL; + /*pddf_dbg(KERN_ERR "PSU%d: Freed %d: 0x%x\n", data->index+1, i, ptr);*/ + } pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); kfree(data); - if (platdata_sub) { - printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); - kfree(platdata_sub); - } - if (platdata) { - printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); - kfree(platdata); - } + if (platdata_sub) { + printk(KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + printk(KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } - if (pddf_psu_ops.post_remove) + if (pddf_psu_ops.post_remove) { ret = (pddf_psu_ops.post_remove)(client); if (ret!=0) @@ -287,14 +287,14 @@ static int psu_remove(struct i2c_client *client) enum psu_intf { - eeprom_intf, - smbus_intf + eeprom_intf, + smbus_intf }; static const struct i2c_device_id psu_id[] = { - {"psu_eeprom", eeprom_intf}, - {"psu_pmbus", smbus_intf}, - {} + {"psu_eeprom", eeprom_intf}, + {"psu_pmbus", smbus_intf}, + {} }; MODULE_DEVICE_TABLE(i2c, psu_id); @@ -312,8 +312,8 @@ static struct i2c_driver psu_driver = { int example_fun(void) { - pddf_dbg(PSU, KERN_ERR "CALLING FUN...\n"); - return 0; + pddf_dbg(PSU, KERN_ERR "CALLING FUN...\n"); + return 0; } EXPORT_SYMBOL(example_fun); @@ -330,11 +330,11 @@ int psu_init(void) return status; } - pddf_dbg(PSU, KERN_ERR "GENERIC_PSU_DRIVER.. init Invoked..\n"); + pddf_dbg(PSU, KERN_ERR "GENERIC_PSU_DRIVER.. init Invoked..\n"); status = i2c_add_driver(&psu_driver); if (status!=0) return status; - + if (pddf_psu_ops.post_init) { status = (pddf_psu_ops.post_init)(); @@ -342,16 +342,16 @@ int psu_init(void) return status; } - return status; + return status; } EXPORT_SYMBOL(psu_init); void __exit psu_exit(void) { - pddf_dbg(PSU, "GENERIC_PSU_DRIVER.. exit\n"); - if (pddf_psu_ops.pre_exit) (pddf_psu_ops.pre_exit)(); + pddf_dbg(PSU, "GENERIC_PSU_DRIVER.. exit\n"); + if (pddf_psu_ops.pre_exit) (pddf_psu_ops.pre_exit)(); i2c_del_driver(&psu_driver); - if (pddf_psu_ops.post_exit) (pddf_psu_ops.post_exit)(); + if (pddf_psu_ops.post_exit) (pddf_psu_ops.post_exit)(); } EXPORT_SYMBOL(psu_exit); diff --git a/platform/pddf/i2c/modules/psu/pddf_psu_module.c b/platform/pddf/i2c/modules/psu/pddf_psu_module.c index 8d0a368d4f6e..f6c680d70162 100644 --- a/platform/pddf/i2c/modules/psu/pddf_psu_module.c +++ b/platform/pddf/i2c/modules/psu/pddf_psu_module.c @@ -49,189 +49,189 @@ PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void* static struct attribute *psu_attributes[] = { - &attr_psu_idx.dev_attr.attr, - &attr_psu_fans.dev_attr.attr, - - &attr_attr_name.dev_attr.attr, - &attr_attr_devtype.dev_attr.attr, - &attr_attr_devaddr.dev_attr.attr, - &attr_attr_offset.dev_attr.attr, - &attr_attr_mask.dev_attr.attr, - &attr_attr_cmpval.dev_attr.attr, - &attr_attr_len.dev_attr.attr, - &attr_attr_ops.dev_attr.attr, - &attr_dev_ops.dev_attr.attr, - NULL + &attr_psu_idx.dev_attr.attr, + &attr_psu_fans.dev_attr.attr, + + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL }; static const struct attribute_group pddf_psu_client_data_group = { - .attrs = psu_attributes, + .attrs = psu_attributes, }; static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); - PSU_SYSFS_ATTR_DATA_ENTRY *access_ptr; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); + PSU_SYSFS_ATTR_DATA_ENTRY *access_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - pdata->psu_attrs[pdata->len] = pdata->psu_attr; - access_ptr = get_psu_access_data(pdata->psu_attrs[pdata->len].aname); - if (access_ptr != NULL && access_ptr->a_ptr != NULL) - { - pdata->psu_attrs[pdata->len].access_data = access_ptr->a_ptr ; - /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",pdata->psu_attrs[pdata->len].aname, pdata->psu_attrs[pdata->len].access_data);*/ - } + pdata->psu_attrs[pdata->len] = pdata->psu_attr; + access_ptr = get_psu_access_data(pdata->psu_attrs[pdata->len].aname); + if (access_ptr != NULL && access_ptr->a_ptr != NULL) + { + pdata->psu_attrs[pdata->len].access_data = access_ptr->a_ptr ; + /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",pdata->psu_attrs[pdata->len].aname, pdata->psu_attrs[pdata->len].access_data);*/ + } - pdata->len++; - memset(&pdata->psu_attr, 0, sizeof(pdata->psu_attr)); + pdata->len++; + memset(&pdata->psu_attr, 0, sizeof(pdata->psu_attr)); - return count; + return count; } struct i2c_board_info *i2c_get_psu_board_info(PSU_DATA *pdata, NEW_DEV_ATTR *cdata) { - int num = pdata->len; - int i = 0; + int num = pdata->len; + int i = 0; static struct i2c_board_info board_info; - PSU_PDATA *psu_platform_data; - - - if (strcmp(cdata->dev_type, "psu_pmbus")==0 || strcmp(cdata->dev_type, "psu_eeprom")==0 ) - { - /* Allocate the psu_platform_data */ - psu_platform_data = (PSU_PDATA *)kzalloc(sizeof(PSU_PDATA), GFP_KERNEL); - psu_platform_data->psu_attrs = (PSU_DATA_ATTR *)kzalloc(num*sizeof(PSU_DATA_ATTR), GFP_KERNEL); - - - psu_platform_data->idx = pdata->idx; - psu_platform_data->num_psu_fans = pdata->num_psu_fans; - psu_platform_data->len = pdata->len; - - for (i=0;ipsu_attrs[i] = pdata->psu_attrs[i]; - } - - /* Verify that the data is written properly */ + PSU_PDATA *psu_platform_data; + + + if (strcmp(cdata->dev_type, "psu_pmbus")==0 || strcmp(cdata->dev_type, "psu_eeprom")==0 ) + { + /* Allocate the psu_platform_data */ + psu_platform_data = (PSU_PDATA *)kzalloc(sizeof(PSU_PDATA), GFP_KERNEL); + psu_platform_data->psu_attrs = (PSU_DATA_ATTR *)kzalloc(num*sizeof(PSU_DATA_ATTR), GFP_KERNEL); + + + psu_platform_data->idx = pdata->idx; + psu_platform_data->num_psu_fans = pdata->num_psu_fans; + psu_platform_data->len = pdata->len; + + for (i=0;ipsu_attrs[i] = pdata->psu_attrs[i]; + } + + /* Verify that the data is written properly */ #if 0 - pddf_dbg(PSU, KERN_ERR "\n\n########### psu_platform_data - start ##########\n"); - pddf_dbg(PSU, KERN_ERR "psu_idx: %d\n", psu_platform_data->idx); - pddf_dbg(PSU, KERN_ERR "psu_fans: %d\n", psu_platform_data->num_psu_fans); - pddf_dbg(PSU, KERN_ERR "no_of_usr_attr: %d\n", psu_platform_data->len); - - for (i=0; ipsu_attrs[i].aname); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_type: %s\n", psu_platform_data->psu_attrs[i].devtype); - pddf_dbg(PSU, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", psu_platform_data->psu_attrs[i].devaddr); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_offset: 0x%x\n", psu_platform_data->psu_attrs[i].offset); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_mask: 0x%x\n", psu_platform_data->psu_attrs[i].mask); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", psu_platform_data->psu_attrs[i].cmpval); - pddf_dbg(PSU, KERN_ERR "usr_attr_len: %d\n", psu_platform_data->psu_attrs[i].len); - } - pddf_dbg(PSU, KERN_ERR "########### psu_platform_data - start ##########\n\n"); + pddf_dbg(PSU, KERN_ERR "\n\n########### psu_platform_data - start ##########\n"); + pddf_dbg(PSU, KERN_ERR "psu_idx: %d\n", psu_platform_data->idx); + pddf_dbg(PSU, KERN_ERR "psu_fans: %d\n", psu_platform_data->num_psu_fans); + pddf_dbg(PSU, KERN_ERR "no_of_usr_attr: %d\n", psu_platform_data->len); + + for (i=0; ipsu_attrs[i].aname); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_type: %s\n", psu_platform_data->psu_attrs[i].devtype); + pddf_dbg(PSU, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", psu_platform_data->psu_attrs[i].devaddr); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_offset: 0x%x\n", psu_platform_data->psu_attrs[i].offset); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_mask: 0x%x\n", psu_platform_data->psu_attrs[i].mask); + pddf_dbg(PSU, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", psu_platform_data->psu_attrs[i].cmpval); + pddf_dbg(PSU, KERN_ERR "usr_attr_len: %d\n", psu_platform_data->psu_attrs[i].len); + } + pddf_dbg(PSU, KERN_ERR "########### psu_platform_data - start ##########\n\n"); #endif - board_info = (struct i2c_board_info) { - .platform_data = psu_platform_data, - }; + board_info = (struct i2c_board_info) { + .platform_data = psu_platform_data, + }; - board_info.addr = cdata->dev_addr; - strcpy(board_info.type, cdata->dev_type); - } - else - { - printk(KERN_ERR "%s:Unknown type of device %s. Unable to clreate I2C client for it\n",__FUNCTION__, cdata->dev_type); - } + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to clreate I2C client for it\n",__FUNCTION__, cdata->dev_type); + } - return &board_info; + return &board_info; } /*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); - NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); - struct i2c_adapter *adapter; - struct i2c_board_info *board_info; - struct i2c_client *client_ptr; - - - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - - - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ - if (strncmp(buf, "add", strlen(buf)-1)==0) - { - adapter = i2c_get_adapter(cdata->parent_bus); - board_info = i2c_get_psu_board_info(pdata, cdata); - - /* Populate the platform data for psu */ - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ - client_ptr = i2c_new_device(adapter, board_info); - - if(client_ptr != NULL) - { - i2c_put_adapter(adapter); - pddf_dbg(PSU, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name , client_ptr); - add_device_table(cdata->i2c_name, (void*)client_ptr); - } - else - { - i2c_put_adapter(adapter); - goto free_data; - } - } - else if (strncmp(buf, "delete", strlen(buf)-1)==0) - { - /*Get the i2c_client handle for the created client*/ - client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); - if (client_ptr) - { - pddf_dbg(PSU, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); - i2c_unregister_device(client_ptr); - delete_device_table(cdata->i2c_name); - } - else - { - printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); - } - - } - else - { - printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } - - goto clear_data; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + struct i2c_adapter *adapter; + struct i2c_board_info *board_info; + struct i2c_client *client_ptr; + + + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + + + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = i2c_get_psu_board_info(pdata, cdata); + + /* Populate the platform data for psu */ + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ + client_ptr = i2c_new_device(adapter, board_info); + + if(client_ptr != NULL) + { + i2c_put_adapter(adapter); + pddf_dbg(PSU, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name , client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(PSU, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + printk(KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; free_data: - if (board_info->platform_data) - { - PSU_PDATA *psu_platform_data = board_info->platform_data; - if (psu_platform_data->psu_attrs) - { - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); - kfree(psu_platform_data->psu_attrs); - } - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); - kfree(psu_platform_data); - } + if (board_info->platform_data) + { + PSU_PDATA *psu_platform_data = board_info->platform_data; + if (psu_platform_data->psu_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(psu_platform_data->psu_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(psu_platform_data); + } clear_data: - memset(pdata, 0, sizeof(PSU_DATA)); - /*TODO: free the data cdata->data if data is dynal=mically allocated*/ - memset(cdata, 0, sizeof(NEW_DEV_ATTR)); - return count; + memset(pdata, 0, sizeof(PSU_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; } @@ -240,56 +240,56 @@ static struct kobject *i2c_kobj; int __init pddf_data_init(void) { - struct kobject *device_kobj; - int ret = 0; - - - pddf_dbg(PSU, "PDDF_DATA MODULE.. init\n"); - - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; - - psu_kobj = kobject_create_and_add("psu", device_kobj); - if(!psu_kobj) - return -ENOMEM; - i2c_kobj = kobject_create_and_add("i2c", psu_kobj); - if(!i2c_kobj) - return -ENOMEM; - - ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); - if (ret) - { - kobject_put(i2c_kobj); - kobject_put(psu_kobj); - return ret; - } - pddf_dbg(PSU, "CREATED PSU I2C CLIENTS CREATION SYSFS GROUP\n"); - - ret = sysfs_create_group(i2c_kobj, &pddf_psu_client_data_group); - if (ret) + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(PSU, "PDDF_DATA MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + psu_kobj = kobject_create_and_add("psu", device_kobj); + if(!psu_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", psu_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(i2c_kobj); + kobject_put(psu_kobj); + return ret; + } + pddf_dbg(PSU, "CREATED PSU I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(i2c_kobj, &pddf_psu_client_data_group); + if (ret) { - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); kobject_put(i2c_kobj); kobject_put(psu_kobj); return ret; } - pddf_dbg(PSU, "CREATED PDDF PSU DATA SYSFS GROUP\n"); - - return ret; + pddf_dbg(PSU, "CREATED PDDF PSU DATA SYSFS GROUP\n"); + + return ret; } void __exit pddf_data_exit(void) { - pddf_dbg(PSU, "PDDF_DATA MODULE.. exit\n"); - sysfs_remove_group(i2c_kobj, &pddf_psu_client_data_group); - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); - kobject_put(i2c_kobj); - kobject_put(psu_kobj); - pddf_dbg(PSU, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'psu'\n",__FUNCTION__); + pddf_dbg(PSU, "PDDF_DATA MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_psu_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(psu_kobj); + pddf_dbg(PSU, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'psu'\n",__FUNCTION__); - return; + return; } module_init(pddf_data_init); diff --git a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c index 9aaea3e66d09..27aaaa34724d 100644 --- a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c +++ b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c @@ -33,27 +33,27 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha PDDF_DATA_ATTR(attr_name, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_CHAR, 32, - (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); + (void*)&sysstatus_data.sysstatus_addr_attr.aname, NULL); PDDF_DATA_ATTR(attr_devaddr, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, - sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.devaddr , NULL); PDDF_DATA_ATTR(attr_offset, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, - sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.offset, NULL); PDDF_DATA_ATTR(attr_mask, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, - sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.mask , NULL); PDDF_DATA_ATTR(attr_len, S_IWUSR|S_IRUGO, show_pddf_data, store_pddf_data, PDDF_UINT32, - sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); + sizeof(uint32_t), (void*)&sysstatus_data.sysstatus_addr_attr.len , NULL); PDDF_DATA_ATTR(attr_ops, S_IWUSR, NULL, do_attr_operation, PDDF_CHAR, 8, (void*)&sysstatus_data, NULL); static struct attribute *sysstatus_addr_attributes[] = { - &attr_attr_name.dev_attr.attr, - &attr_attr_devaddr.dev_attr.attr, - &attr_attr_offset.dev_attr.attr, - &attr_attr_mask.dev_attr.attr, - &attr_attr_len.dev_attr.attr, - &attr_attr_ops.dev_attr.attr, - NULL + &attr_attr_name.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + NULL }; PDDF_DATA_ATTR(board_info, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, 32, NULL, NULL); @@ -76,34 +76,34 @@ PDDF_DATA_ATTR(misc3, S_IWUSR|S_IRUGO, show_sysstatus_data, NULL, PDDF_UINT32, s static struct attribute *sysstatus_data_attributes[] = { - &attr_board_info.dev_attr.attr, - &attr_cpld1_version.dev_attr.attr, - &attr_cpld2_version.dev_attr.attr, - &attr_cpld3_version.dev_attr.attr, - &attr_power_module_status.dev_attr.attr, - &attr_system_reset1.dev_attr.attr, - &attr_system_reset2.dev_attr.attr, - &attr_system_reset3.dev_attr.attr, - &attr_system_reset4.dev_attr.attr, - &attr_system_reset5.dev_attr.attr, - &attr_system_reset6.dev_attr.attr, - &attr_system_reset7.dev_attr.attr, - &attr_system_reset8.dev_attr.attr, - &attr_misc1.dev_attr.attr, - &attr_misc2.dev_attr.attr, - &attr_misc3.dev_attr.attr, - NULL + &attr_board_info.dev_attr.attr, + &attr_cpld1_version.dev_attr.attr, + &attr_cpld2_version.dev_attr.attr, + &attr_cpld3_version.dev_attr.attr, + &attr_power_module_status.dev_attr.attr, + &attr_system_reset1.dev_attr.attr, + &attr_system_reset2.dev_attr.attr, + &attr_system_reset3.dev_attr.attr, + &attr_system_reset4.dev_attr.attr, + &attr_system_reset5.dev_attr.attr, + &attr_system_reset6.dev_attr.attr, + &attr_system_reset7.dev_attr.attr, + &attr_system_reset8.dev_attr.attr, + &attr_misc1.dev_attr.attr, + &attr_misc2.dev_attr.attr, + &attr_misc3.dev_attr.attr, + NULL }; static const struct attribute_group pddf_sysstatus_addr_group = { - .attrs = sysstatus_addr_attributes, + .attrs = sysstatus_addr_attributes, }; static const struct attribute_group pddf_sysstatus_data_group = { - .attrs = sysstatus_data_attributes, + .attrs = sysstatus_data_attributes, }; @@ -116,8 +116,8 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - - SYSSTATUS_DATA *data = &sysstatus_data; + + SYSSTATUS_DATA *data = &sysstatus_data; struct SYSSTATUS_ADDR_ATTR *sysstatus_addr_attrs = NULL; int i, status ; @@ -126,7 +126,7 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha { if (strcmp(data->sysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) { - /*pddf_dbg(KERN_ERR "%s: show func called for %s\n\n", __FUNCTION__, attr->dev_attr.attr.name);*/ + /*pddf_dbg(KERN_ERR "%s: show func called for %s\n\n", __FUNCTION__, attr->dev_attr.attr.name);*/ sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; } @@ -136,14 +136,14 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha { printk(KERN_DEBUG "%s is not supported attribute for this client\n",data->sysstatus_addr_attrs[i].aname); status = 0; - } - else - { - status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); - /*pddf_dbg(KERN_ERR "%s: Data read for %s is 0x%x\n", __FUNCTION__, sysstatus_addr_attrs->aname, status);*/ - } - - return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); + } + else + { + status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); + /*pddf_dbg(KERN_ERR "%s: Data read for %s is 0x%x\n", __FUNCTION__, sysstatus_addr_attrs->aname, status);*/ + } + + return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); } @@ -151,16 +151,16 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); - - pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; - pdata->len++; - pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); - memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + SYSSTATUS_DATA *pdata = (SYSSTATUS_DATA *)(ptr->addr); + + pdata->sysstatus_addr_attrs[pdata->len] = pdata->sysstatus_addr_attr; + pdata->len++; + pddf_dbg(SYSSTATUS, KERN_ERR "%s: Populating the data for %s\n", __FUNCTION__, pdata->sysstatus_addr_attr.aname); + memset(&pdata->sysstatus_addr_attr, 0, sizeof(pdata->sysstatus_addr_attr)); - return count; + return count; } @@ -168,52 +168,52 @@ static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da int __init sysstatus_data_init(void) { - struct kobject *device_kobj; - int ret = 0; - - - pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); - - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; - - sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); - if(!sysstatus_addr_kobj) - return -ENOMEM; - - sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); - if(!sysstatus_data_kobj) - return -ENOMEM; - - - ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); - if (ret) + struct kobject *device_kobj; + int ret = 0; + + + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + sysstatus_addr_kobj = kobject_create_and_add("sysstatus", device_kobj); + if(!sysstatus_addr_kobj) + return -ENOMEM; + + sysstatus_data_kobj = kobject_create_and_add("sysstatus_data", sysstatus_addr_kobj); + if(!sysstatus_data_kobj) + return -ENOMEM; + + + ret = sysfs_create_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + if (ret) { kobject_put(sysstatus_addr_kobj); return ret; } - ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); - if (ret) + ret = sysfs_create_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + if (ret) { - sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); kobject_put(sysstatus_data_kobj); kobject_put(sysstatus_addr_kobj); return ret; } - return ret; + return ret; } void __exit sysstatus_data_exit(void) { - pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); - sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); - sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); + pddf_dbg(SYSSTATUS, "PDDF SYSSTATUS MODULE.. exit\n"); + sysfs_remove_group(sysstatus_data_kobj, &pddf_sysstatus_data_group); + sysfs_remove_group(sysstatus_addr_kobj, &pddf_sysstatus_addr_group); kobject_put(sysstatus_data_kobj); - kobject_put(sysstatus_addr_kobj); + kobject_put(sysstatus_addr_kobj); pddf_dbg(SYSSTATUS, KERN_ERR "%s: Removed the kobjects for 'SYSSTATUS'\n",__FUNCTION__); return; } diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c index 6390442a9c56..c51fae367a01 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c @@ -34,269 +34,269 @@ int get_xcvr_module_attr_data(struct i2c_client *client, struct device *dev, int sonic_i2c_get_mod_pres(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t modpres = 0; - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - /*sfp_dbg(KERN_ERR "%s: status 0x%x\n", __FUNCTION__, status);*/ - - if (status < 0) - return status; - else - { - modpres = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nMod presence :0x%x, reg_value = 0x%x, devaddr=0x%x, mask=0x%x, offset=0x%x\n", modpres, status, info->devaddr, info->mask, info->offset); - } - } - else if(strcmp(info->devtype, "eeprom") == 0) - { - /* get client client for eeprom - Not Applicable */ - } - data->modpres = modpres; - - return 0; + int status = 0; + uint32_t modpres = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + /*sfp_dbg(KERN_ERR "%s: status 0x%x\n", __FUNCTION__, status);*/ + + if (status < 0) + return status; + else + { + modpres = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nMod presence :0x%x, reg_value = 0x%x, devaddr=0x%x, mask=0x%x, offset=0x%x\n", modpres, status, info->devaddr, info->mask, info->offset); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + data->modpres = modpres; + + return 0; } int sonic_i2c_get_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; + int status = 0; uint32_t modreset=0; - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - modreset = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nMod Reset :0x%x, reg_value = 0x%x\n", modreset, status); - } - } - else if(strcmp(info->devtype, "eeprom") == 0) - { - /* get client client for eeprom - Not Applicable */ - } - - data->reset = modreset; - return 0; + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + modreset = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nMod Reset :0x%x, reg_value = 0x%x\n", modreset, status); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + + data->reset = modreset; + return 0; } int sonic_i2c_get_mod_intr_status(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t mod_intr = 0; - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - mod_intr = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nModule Interrupt :0x%x, reg_value = 0x%x\n", mod_intr, status); - } - } - else if(strcmp(info->devtype, "eeprom") == 0) - { - /* get client client for eeprom - Not Applicable */ - } - - data->intr_status = mod_intr; - return 0; + int status = 0; + uint32_t mod_intr = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + mod_intr = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule Interrupt :0x%x, reg_value = 0x%x\n", mod_intr, status); + } + } + else if(strcmp(info->devtype, "eeprom") == 0) + { + /* get client client for eeprom - Not Applicable */ + } + + data->intr_status = mod_intr; + return 0; } int sonic_i2c_get_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t lpmode = 0; - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - lpmode = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nModule LPmode :0x%x, reg_value = 0x%x\n", lpmode, status); - } - } - - data->lpmode = lpmode; - return 0; + int status = 0; + uint32_t lpmode = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + lpmode = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule LPmode :0x%x, reg_value = 0x%x\n", lpmode, status); + } + } + + data->lpmode = lpmode; + return 0; } int sonic_i2c_get_mod_rxlos(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t rxlos = 0; - - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - rxlos = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nModule RxLOS :0x%x, reg_value = 0x%x\n", rxlos, status); - } - } - data->rxlos = rxlos; - - return 0; + int status = 0; + uint32_t rxlos = 0; + + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + rxlos = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule RxLOS :0x%x, reg_value = 0x%x\n", rxlos, status); + } + } + data->rxlos = rxlos; + + return 0; } int sonic_i2c_get_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t txdis = 0; - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - txdis = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nModule TxDisable :0x%x, reg_value = 0x%x\n", txdis, status); - } - } - data->txdisable = txdis; - - return 0; + int status = 0; + uint32_t txdis = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + txdis = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule TxDisable :0x%x, reg_value = 0x%x\n", txdis, status); + } + } + data->txdisable = txdis; + + return 0; } int sonic_i2c_get_mod_txfault(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - uint32_t txflt = 0; - - if (strcmp(info->devtype, "cpld") == 0) - { - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - txflt = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; - sfp_dbg(KERN_INFO "\nModule TxFault :0x%x, reg_value = 0x%x\n", txflt, status); - } - - } - data->txfault = txflt; - - return 0; + int status = 0; + uint32_t txflt = 0; + + if (strcmp(info->devtype, "cpld") == 0) + { + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + txflt = ((status & BIT_INDEX(info->mask)) == info->cmpval) ? 1 : 0; + sfp_dbg(KERN_INFO "\nModule TxFault :0x%x, reg_value = 0x%x\n", txflt, status); + } + + } + data->txfault = txflt; + + return 0; } int sonic_i2c_set_mod_reset(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - unsigned int val_mask = 0; - uint8_t reg; - - if (strcmp(info->devtype, "cpld") == 0) - { - if(data->reset == 1) { - if(info->cmpval == 0) - val_mask = ~(BIT_INDEX(info->mask)); - else - val_mask = BIT_INDEX(info->mask); - } - else { - if(info->cmpval == 0) - val_mask = BIT_INDEX(info->mask); - else - val_mask = ~(BIT_INDEX(info->mask)); - } - - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - reg = status & val_mask; - status = board_i2c_cpld_write(info->devaddr, info->offset, reg); - } - } - - return status; + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->reset == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; } int sonic_i2c_set_mod_lpmode(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - unsigned int val_mask = 0; - uint8_t reg; - - if (strcmp(info->devtype, "cpld") == 0) - { - if(data->lpmode == 1) { - if(info->cmpval == 0) - val_mask = ~(BIT_INDEX(info->mask)); - else - val_mask = BIT_INDEX(info->mask); - } - else { - if(info->cmpval == 0) - val_mask = BIT_INDEX(info->mask); - else - val_mask = ~(BIT_INDEX(info->mask)); - } - - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - reg = status & val_mask; - status = board_i2c_cpld_write(info->devaddr, info->offset, reg); - } - } - - return status; + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->lpmode == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; } int sonic_i2c_set_mod_txdisable(struct i2c_client *client, XCVR_ATTR *info, struct xcvr_data *data) { - int status = 0; - unsigned int val_mask = 0; - uint8_t reg; - - if (strcmp(info->devtype, "cpld") == 0) - { - if(data->txdisable == 1) { - if(info->cmpval == 0) - val_mask = ~(BIT_INDEX(info->mask)); - else - val_mask = BIT_INDEX(info->mask); - } - else { - if(info->cmpval == 0) - val_mask = BIT_INDEX(info->mask); - else - val_mask = ~(BIT_INDEX(info->mask)); - } - - status = board_i2c_cpld_read(info->devaddr , info->offset); - if (status < 0) - return status; - else - { - reg = status & val_mask; - status = board_i2c_cpld_write(info->devaddr, info->offset, reg); - } - } - - return status; + int status = 0; + unsigned int val_mask = 0; + uint8_t reg; + + if (strcmp(info->devtype, "cpld") == 0) + { + if(data->txdisable == 1) { + if(info->cmpval == 0) + val_mask = ~(BIT_INDEX(info->mask)); + else + val_mask = BIT_INDEX(info->mask); + } + else { + if(info->cmpval == 0) + val_mask = BIT_INDEX(info->mask); + else + val_mask = ~(BIT_INDEX(info->mask)); + } + + status = board_i2c_cpld_read(info->devaddr , info->offset); + if (status < 0) + return status; + else + { + reg = status & val_mask; + status = board_i2c_cpld_write(info->devaddr, info->offset, reg); + } + } + + return status; } ssize_t get_module_presence(struct device *dev, struct device_attribute *da, @@ -305,45 +305,45 @@ ssize_t get_module_presence(struct device *dev, struct device_attribute *da, struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; int status = 0, i; - for (i=0; ilen; i++) + for (i=0; ilen; i++) { - attr_data = &pdata->xcvr_attrs[i]; - /*printk(KERN_ERR "\n attr_data->devaddr: 0x%x, attr_data->mask:0x%x, attr_data->offset:0x%x\n", */ - /*attr_data->devaddr, attr_data->mask, attr_data->offset);*/ - if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute. ret %d\n", __FUNCTION__, attr_data->aname, status); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - mutex_unlock(&data->update_lock); - return sprintf(buf, "%d\n", data->modpres); - } - } - return sprintf(buf, "%s",""); + attr_data = &pdata->xcvr_attrs[i]; + /*printk(KERN_ERR "\n attr_data->devaddr: 0x%x, attr_data->mask:0x%x, attr_data->offset:0x%x\n", */ + /*attr_data->devaddr, attr_data->mask, attr_data->offset);*/ + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute. ret %d\n", __FUNCTION__, attr_data->aname, status); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d\n", data->modpres); + } + } + return sprintf(buf, "%s",""); } ssize_t get_module_reset(struct device *dev, struct device_attribute *da, @@ -352,97 +352,97 @@ ssize_t get_module_reset(struct device *dev, struct device_attribute *da, struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; int status = 0, i; - for (i=0; ilen; i++) + for (i=0; ilen; i++) { - attr_data = &pdata->xcvr_attrs[i]; - if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - - mutex_unlock(&data->update_lock); - - return sprintf(buf, "%d\n", data->reset); - } - } - return sprintf(buf, "%s",""); + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d\n", data->reset); + } + } + return sprintf(buf, "%s",""); } ssize_t set_module_reset(struct device *dev, struct device_attribute *da, const char *buf, - size_t count) + size_t count) { - struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - struct i2c_client *client = to_i2c_client(dev); - struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - int status = 0, i; - unsigned int set_value; - - for (i=0; ilen; i++) - { - attr_data = &pdata->xcvr_attrs[i]; - if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) - { - attr_ops = &xcvr_ops[attr->index]; - if(kstrtoint(buf, 10, &set_value)) - return -EINVAL; - - data->reset = set_value; - - mutex_lock(&data->update_lock); - - if (attr_ops->pre_set != NULL) - { - status = (attr_ops->pre_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_set != NULL) - { - status = (attr_ops->do_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_set != NULL) - { - status = (attr_ops->post_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - mutex_unlock(&data->update_lock); - - return count; - } - } - return -EINVAL; + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct xcvr_data *data = i2c_get_clientdata(client); + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + int status = 0, i; + unsigned int set_value; + + for (i=0; ilen; i++) + { + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->reset = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + + return count; + } + } + return -EINVAL; } ssize_t get_module_intr_status(struct device *dev, struct device_attribute *da, @@ -451,64 +451,64 @@ ssize_t get_module_intr_status(struct device *dev, struct device_attribute *da, struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; int status = 0, i; - for (i=0; ilen; i++) + for (i=0; ilen; i++) { - attr_data = &pdata->xcvr_attrs[i]; - if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - - mutex_unlock(&data->update_lock); - return sprintf(buf, "%d\n", data->intr_status); - } - } - return sprintf(buf, "%s",""); + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d\n", data->intr_status); + } + } + return sprintf(buf, "%s",""); } int get_xcvr_module_attr_data(struct i2c_client *client, struct device *dev, - struct device_attribute *da, XCVR_ATTR *xattr) + struct device_attribute *da, XCVR_ATTR *xattr) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); - XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); - XCVR_ATTR *attr_data = NULL; - int i; + XCVR_PDATA *pdata = (XCVR_PDATA *)(client->dev.platform_data); + XCVR_ATTR *attr_data = NULL; + int i; - for (i=0; i < pdata->len; i++) + for (i=0; i < pdata->len; i++) { - attr_data = &pdata->xcvr_attrs[i]; - if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) - { - xattr = attr_data; - return 1; - } - } - return 0; + attr_data = &pdata->xcvr_attrs[i]; + if (strcmp(attr_data->aname, attr->dev_attr.attr.name) == 0) + { + xattr = attr_data; + return 1; + } + } + return 0; } ssize_t get_module_lpmode(struct device *dev, struct device_attribute *da, char *buf) @@ -516,84 +516,84 @@ ssize_t get_module_lpmode(struct device *dev, struct device_attribute *da, char struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; int status = 0; - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - - return sprintf(buf, "%d\n", data->lpmode); - } - else - return sprintf(buf,"%s",""); + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + + return sprintf(buf, "%d\n", data->lpmode); + } + else + return sprintf(buf,"%s",""); } ssize_t set_module_lpmode(struct device *dev, struct device_attribute *da, const char *buf, - size_t count) + size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - int status = 0; - uint32_t set_value; - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - if(kstrtoint(buf, 10, &set_value)) - return -EINVAL; - - data->lpmode = set_value; - - mutex_lock(&data->update_lock); - - if (attr_ops->pre_set != NULL) - { - status = (attr_ops->pre_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_set != NULL) - { - status = (attr_ops->do_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_set != NULL) - { - status = (attr_ops->post_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - mutex_unlock(&data->update_lock); - } - return count; + int status = 0; + uint32_t set_value; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->lpmode = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + } + return count; } ssize_t get_module_rxlos(struct device *dev, struct device_attribute *da, @@ -603,37 +603,37 @@ ssize_t get_module_rxlos(struct device *dev, struct device_attribute *da, struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); int status = 0; - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - return sprintf(buf, "%d\n", data->rxlos); - } - else - return sprintf(buf,"%s",""); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->rxlos); + } + else + return sprintf(buf,"%s",""); } ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, @@ -643,82 +643,82 @@ ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); int status = 0; - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - return sprintf(buf, "%d\n", data->txdisable); - } - else - return sprintf(buf,"%s",""); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->txdisable); + } + else + return sprintf(buf,"%s",""); } ssize_t set_module_txdisable(struct device *dev, struct device_attribute *da, const char *buf, - size_t count) + size_t count) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); - int status = 0; - uint32_t set_value; - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - if(kstrtoint(buf, 10, &set_value)) - return -EINVAL; - - data->txdisable = set_value; - - mutex_lock(&data->update_lock); - - if (attr_ops->pre_set != NULL) - { - status = (attr_ops->pre_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_set != NULL) - { - status = (attr_ops->do_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_set != NULL) - { - status = (attr_ops->post_set)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - mutex_unlock(&data->update_lock); - } - return count; + int status = 0; + uint32_t set_value; + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + if(kstrtoint(buf, 10, &set_value)) + return -EINVAL; + + data->txdisable = set_value; + + mutex_lock(&data->update_lock); + + if (attr_ops->pre_set != NULL) + { + status = (attr_ops->pre_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_set != NULL) + { + status = (attr_ops->do_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_set != NULL) + { + status = (attr_ops->post_set)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + mutex_unlock(&data->update_lock); + } + return count; } ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, @@ -728,34 +728,34 @@ ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, struct i2c_client *client = to_i2c_client(dev); struct xcvr_data *data = i2c_get_clientdata(client); int status = 0; - XCVR_ATTR *attr_data = NULL; - XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; - - if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) - { - attr_ops = &xcvr_ops[attr->index]; - - mutex_lock(&data->update_lock); - if (attr_ops->pre_get != NULL) - { - status = (attr_ops->pre_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - if (attr_ops->do_get != NULL) - { - status = (attr_ops->do_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - - } - if (attr_ops->post_get != NULL) - { - status = (attr_ops->post_get)(client, attr_data, data); - if (status!=0) - printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } - return sprintf(buf, "%d\n", data->txfault); - } - return sprintf(buf,"%s",""); + XCVR_ATTR *attr_data = NULL; + XCVR_SYSFS_ATTR_OPS *attr_ops = NULL; + + if(get_xcvr_module_attr_data(client, dev, da, attr_data) && (attr_data != NULL)) + { + attr_ops = &xcvr_ops[attr->index]; + + mutex_lock(&data->update_lock); + if (attr_ops->pre_get != NULL) + { + status = (attr_ops->pre_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + if (attr_ops->do_get != NULL) + { + status = (attr_ops->do_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: do_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + + } + if (attr_ops->post_get != NULL) + { + status = (attr_ops->post_get)(client, attr_data, data); + if (status!=0) + printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); + } + return sprintf(buf, "%d\n", data->txfault); + } + return sprintf(buf,"%s",""); } diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c index 363689a703f6..ca72f8a7b072 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c @@ -39,39 +39,39 @@ struct pddf_ops_t pddf_xcvr_ops = { EXPORT_SYMBOL(pddf_xcvr_ops); XCVR_SYSFS_ATTR_OPS xcvr_ops[XCVR_ATTR_MAX] = { - {XCVR_PRESENT, get_module_presence, NULL, sonic_i2c_get_mod_pres, NULL, NULL, NULL, NULL, NULL}, - {XCVR_RESET, get_module_reset, NULL, sonic_i2c_get_mod_reset, NULL, set_module_reset, NULL, sonic_i2c_set_mod_reset, NULL}, - {XCVR_INTR_STATUS, get_module_intr_status, NULL, sonic_i2c_get_mod_intr_status, NULL, NULL, NULL, NULL, NULL}, - {XCVR_LPMODE, get_module_lpmode, NULL, sonic_i2c_get_mod_lpmode, NULL, set_module_lpmode, NULL, sonic_i2c_set_mod_lpmode, NULL}, - {XCVR_RXLOS, get_module_rxlos, NULL, sonic_i2c_get_mod_rxlos, NULL, NULL, NULL, NULL, NULL}, - {XCVR_TXDISABLE, get_module_txdisable, NULL, sonic_i2c_get_mod_txdisable, NULL, set_module_txdisable, NULL, sonic_i2c_set_mod_txdisable, NULL}, - {XCVR_TXFAULT, get_module_txfault, NULL, sonic_i2c_get_mod_txfault, NULL, NULL, NULL, NULL, NULL}, + {XCVR_PRESENT, get_module_presence, NULL, sonic_i2c_get_mod_pres, NULL, NULL, NULL, NULL, NULL}, + {XCVR_RESET, get_module_reset, NULL, sonic_i2c_get_mod_reset, NULL, set_module_reset, NULL, sonic_i2c_set_mod_reset, NULL}, + {XCVR_INTR_STATUS, get_module_intr_status, NULL, sonic_i2c_get_mod_intr_status, NULL, NULL, NULL, NULL, NULL}, + {XCVR_LPMODE, get_module_lpmode, NULL, sonic_i2c_get_mod_lpmode, NULL, set_module_lpmode, NULL, sonic_i2c_set_mod_lpmode, NULL}, + {XCVR_RXLOS, get_module_rxlos, NULL, sonic_i2c_get_mod_rxlos, NULL, NULL, NULL, NULL, NULL}, + {XCVR_TXDISABLE, get_module_txdisable, NULL, sonic_i2c_get_mod_txdisable, NULL, set_module_txdisable, NULL, sonic_i2c_set_mod_txdisable, NULL}, + {XCVR_TXFAULT, get_module_txfault, NULL, sonic_i2c_get_mod_txfault, NULL, NULL, NULL, NULL, NULL}, }; EXPORT_SYMBOL(xcvr_ops); /* sysfs attributes */ -static SENSOR_DEVICE_ATTR(xcvr_present, S_IWUSR|S_IRUGO, get_module_presence, NULL, XCVR_PRESENT); -static SENSOR_DEVICE_ATTR(xcvr_reset, S_IWUSR|S_IRUGO, get_module_reset, set_module_reset, XCVR_RESET); -static SENSOR_DEVICE_ATTR(xcvr_intr_status, S_IWUSR|S_IRUGO, get_module_intr_status, NULL, XCVR_INTR_STATUS); -static SENSOR_DEVICE_ATTR(xcvr_lpmode, S_IWUSR|S_IRUGO, get_module_lpmode, set_module_lpmode, XCVR_LPMODE); -static SENSOR_DEVICE_ATTR(xcvr_rxlos, S_IWUSR|S_IRUGO, get_module_rxlos, NULL, XCVR_RXLOS); -static SENSOR_DEVICE_ATTR(xcvr_txdisable, S_IWUSR|S_IRUGO, get_module_txdisable, set_module_txdisable, XCVR_TXDISABLE); -static SENSOR_DEVICE_ATTR(xcvr_txfault, S_IWUSR|S_IRUGO, get_module_txfault, NULL, XCVR_TXFAULT); +static SENSOR_DEVICE_ATTR(xcvr_present, S_IWUSR|S_IRUGO, get_module_presence, NULL, XCVR_PRESENT); +static SENSOR_DEVICE_ATTR(xcvr_reset, S_IWUSR|S_IRUGO, get_module_reset, set_module_reset, XCVR_RESET); +static SENSOR_DEVICE_ATTR(xcvr_intr_status, S_IWUSR|S_IRUGO, get_module_intr_status, NULL, XCVR_INTR_STATUS); +static SENSOR_DEVICE_ATTR(xcvr_lpmode, S_IWUSR|S_IRUGO, get_module_lpmode, set_module_lpmode, XCVR_LPMODE); +static SENSOR_DEVICE_ATTR(xcvr_rxlos, S_IWUSR|S_IRUGO, get_module_rxlos, NULL, XCVR_RXLOS); +static SENSOR_DEVICE_ATTR(xcvr_txdisable, S_IWUSR|S_IRUGO, get_module_txdisable, set_module_txdisable, XCVR_TXDISABLE); +static SENSOR_DEVICE_ATTR(xcvr_txfault, S_IWUSR|S_IRUGO, get_module_txfault, NULL, XCVR_TXFAULT); /* List of all the xcvr attribute structures * to get name, use sensor_dev_attr_<>.dev_attr.attr.name * to get the id, use sensor_dev_attr_<>.dev_attr.index */ static struct sensor_device_attribute *xcvr_attr_list[MAX_XCVR_ATTRS] = { - &sensor_dev_attr_xcvr_present, - &sensor_dev_attr_xcvr_reset, - &sensor_dev_attr_xcvr_intr_status, - &sensor_dev_attr_xcvr_lpmode, - &sensor_dev_attr_xcvr_rxlos, - &sensor_dev_attr_xcvr_txdisable, - &sensor_dev_attr_xcvr_txfault, + &sensor_dev_attr_xcvr_present, + &sensor_dev_attr_xcvr_reset, + &sensor_dev_attr_xcvr_intr_status, + &sensor_dev_attr_xcvr_lpmode, + &sensor_dev_attr_xcvr_rxlos, + &sensor_dev_attr_xcvr_txdisable, + &sensor_dev_attr_xcvr_txfault, }; static struct attribute *xcvr_attributes[MAX_XCVR_ATTRS] = {NULL}; @@ -85,14 +85,14 @@ static int xcvr_probe(struct i2c_client *client, { struct xcvr_data *data; int status =0; - int i,j,num; - XCVR_PDATA *xcvr_platform_data; - XCVR_ATTR *attr_data; + int i,j,num; + XCVR_PDATA *xcvr_platform_data; + XCVR_ATTR *attr_data; - if (client == NULL) { - pddf_dbg(XCVR, "NULL Client.. \n"); - goto exit; - } + if (client == NULL) { + pddf_dbg(XCVR, "NULL Client.. \n"); + goto exit; + } if (pddf_xcvr_ops.pre_probe) { @@ -114,35 +114,35 @@ static int xcvr_probe(struct i2c_client *client, i2c_set_clientdata(client, data); data->valid = 0; - /*data->index = dev_id->driver_data;*/ + /*data->index = dev_id->driver_data;*/ dev_info(&client->dev, "chip found\n"); - /* Take control of the platform data */ - xcvr_platform_data = (XCVR_PDATA *)(client->dev.platform_data); - num = xcvr_platform_data->len; - data->index = xcvr_platform_data->idx - 1; - mutex_init(&data->update_lock); - - /* Add supported attr in the 'attributes' list */ - for (i=0; ixcvr_attrs + i; - for(j=0;jdev_attr.attr; - /*pddf_dbg(KERN_ERR "i:%d, j:%d, aptr->name: %s, attr_data->name: %s\n", i, j, aptr->name, attr_data->aname);*/ - - if (strncmp(aptr->name, attr_data->aname, strlen(attr_data->aname))==0) - break; - } - - if (jdev_attr.attr; - - } - xcvr_attributes[i] = NULL; + /* Take control of the platform data */ + xcvr_platform_data = (XCVR_PDATA *)(client->dev.platform_data); + num = xcvr_platform_data->len; + data->index = xcvr_platform_data->idx - 1; + mutex_init(&data->update_lock); + + /* Add supported attr in the 'attributes' list */ + for (i=0; ixcvr_attrs + i; + for(j=0;jdev_attr.attr; + /*pddf_dbg(KERN_ERR "i:%d, j:%d, aptr->name: %s, attr_data->name: %s\n", i, j, aptr->name, attr_data->aname);*/ + + if (strncmp(aptr->name, attr_data->aname, strlen(attr_data->aname))==0) + break; + } + + if (jdev_attr.attr; + + } + xcvr_attributes[i] = NULL; /* Register sysfs hooks */ status = sysfs_create_group(&client->dev.kobj, &xcvr_group); @@ -150,11 +150,11 @@ static int xcvr_probe(struct i2c_client *client, goto exit_free; } - data->xdev = hwmon_device_register(&client->dev); - if (IS_ERR(data->xdev)) { - status = PTR_ERR(data->xdev); - goto exit_remove; - } + data->xdev = hwmon_device_register(&client->dev); + if (IS_ERR(data->xdev)) { + status = PTR_ERR(data->xdev); + goto exit_remove; + } dev_info(&client->dev, "%s: xcvr '%s'\n", dev_name(data->xdev), client->name); @@ -182,10 +182,10 @@ static int xcvr_probe(struct i2c_client *client, static int xcvr_remove(struct i2c_client *client) { - int ret = 0; + int ret = 0; struct xcvr_data *data = i2c_get_clientdata(client); - XCVR_PDATA *platdata = (XCVR_PDATA *)client->dev.platform_data; - XCVR_ATTR *platdata_sub = platdata->xcvr_attrs; + XCVR_PDATA *platdata = (XCVR_PDATA *)client->dev.platform_data; + XCVR_ATTR *platdata_sub = platdata->xcvr_attrs; if (pddf_xcvr_ops.pre_remove) { @@ -194,18 +194,18 @@ static int xcvr_remove(struct i2c_client *client) printk(KERN_ERR "FAN pre_remove function failed\n"); } - hwmon_device_unregister(data->xdev); - sysfs_remove_group(&client->dev.kobj, &xcvr_group); + hwmon_device_unregister(data->xdev); + sysfs_remove_group(&client->dev.kobj, &xcvr_group); kfree(data); - if (platdata_sub) { - pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); - kfree(platdata_sub); - } - if (platdata) { - pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); - kfree(platdata); - } + if (platdata_sub) { + pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform subdata\n", __FUNCTION__); + kfree(platdata_sub); + } + if (platdata) { + pddf_dbg(XCVR, KERN_DEBUG "%s: Freeing platform data\n", __FUNCTION__); + kfree(platdata); + } if (pddf_xcvr_ops.post_remove) { @@ -219,12 +219,12 @@ static int xcvr_remove(struct i2c_client *client) enum xcvr_intf { - XCVR_CTRL_INTF, + XCVR_CTRL_INTF, }; static const struct i2c_device_id xcvr_ids[] = { - { "pddf_xcvr", XCVR_CTRL_INTF }, - {} + { "pddf_xcvr", XCVR_CTRL_INTF }, + {} }; MODULE_DEVICE_TABLE(i2c, xcvr_ids); @@ -233,7 +233,7 @@ static struct i2c_driver xcvr_driver = { /*.class = I2C_CLASS_HWMON,*/ .driver = { .name = "xcvr", - .owner = THIS_MODULE, + .owner = THIS_MODULE, }, .probe = xcvr_probe, .remove = xcvr_remove, @@ -244,19 +244,19 @@ static struct i2c_driver xcvr_driver = { /*int __init xcvr_init(void)*/ int xcvr_init(void) { - int ret = 0; + int ret = 0; - if (pddf_xcvr_ops.pre_init) + if (pddf_xcvr_ops.pre_init) { ret = (pddf_xcvr_ops.pre_init)(); if (ret!=0) return ret; } - pddf_dbg(XCVR, KERN_ERR "PDDF XCVR DRIVER.. init Invoked..\n"); + pddf_dbg(XCVR, KERN_ERR "PDDF XCVR DRIVER.. init Invoked..\n"); ret = i2c_add_driver(&xcvr_driver); - if (ret!=0) - return ret; + if (ret!=0) + return ret; if (pddf_xcvr_ops.post_init) { @@ -264,17 +264,17 @@ int xcvr_init(void) if (ret!=0) return ret; } - - return ret; + + return ret; } EXPORT_SYMBOL(xcvr_init); void __exit xcvr_exit(void) { - pddf_dbg(XCVR, "PDDF XCVR DRIVER.. exit\n"); - if (pddf_xcvr_ops.pre_exit) (pddf_xcvr_ops.pre_exit)(); + pddf_dbg(XCVR, "PDDF XCVR DRIVER.. exit\n"); + if (pddf_xcvr_ops.pre_exit) (pddf_xcvr_ops.pre_exit)(); i2c_del_driver(&xcvr_driver); - if (pddf_xcvr_ops.post_exit) (pddf_xcvr_ops.post_exit)(); + if (pddf_xcvr_ops.post_exit) (pddf_xcvr_ops.post_exit)(); } EXPORT_SYMBOL(xcvr_exit); diff --git a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c index 4186681e258e..193e7bb929cb 100644 --- a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c +++ b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c @@ -43,242 +43,242 @@ PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void* static struct attribute *xcvr_attributes[] = { - &attr_dev_idx.dev_attr.attr, - - &attr_attr_name.dev_attr.attr, - &attr_attr_devtype.dev_attr.attr, - &attr_attr_devaddr.dev_attr.attr, - &attr_attr_offset.dev_attr.attr, - &attr_attr_mask.dev_attr.attr, - &attr_attr_cmpval.dev_attr.attr, - &attr_attr_len.dev_attr.attr, - &attr_attr_ops.dev_attr.attr, - &attr_dev_ops.dev_attr.attr, - NULL + &attr_dev_idx.dev_attr.attr, + + &attr_attr_name.dev_attr.attr, + &attr_attr_devtype.dev_attr.attr, + &attr_attr_devaddr.dev_attr.attr, + &attr_attr_offset.dev_attr.attr, + &attr_attr_mask.dev_attr.attr, + &attr_attr_cmpval.dev_attr.attr, + &attr_attr_len.dev_attr.attr, + &attr_attr_ops.dev_attr.attr, + &attr_dev_ops.dev_attr.attr, + NULL }; static const struct attribute_group pddf_xcvr_client_data_group = { - .attrs = xcvr_attributes, + .attrs = xcvr_attributes, }; static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - pdata->xcvr_attrs[pdata->len] = pdata->xcvr_attr; - pdata->len++; - memset(&pdata->xcvr_attr, 0, sizeof(pdata->xcvr_attr)); + pdata->xcvr_attrs[pdata->len] = pdata->xcvr_attr; + pdata->len++; + memset(&pdata->xcvr_attr, 0, sizeof(pdata->xcvr_attr)); - return count; + return count; } /*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { - int i = 0; - PDDF_ATTR *ptr = (PDDF_ATTR *)da; - XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); - NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); - - struct i2c_adapter *adapter; - struct i2c_board_info board_info; - struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ - - /* Populate the platform data for xcvr */ - if (strncmp(buf, "add", strlen(buf)-1)==0) - { - if (strcmp(cdata->dev_type, "pddf_xcvr")==0) - { - int num = pdata->len; - XCVR_PDATA *xcvr_platform_data; - - adapter = i2c_get_adapter(cdata->parent_bus); - /* Allocate the xcvr_platform_data */ - xcvr_platform_data = (XCVR_PDATA *)kzalloc(sizeof(XCVR_PDATA), GFP_KERNEL); - xcvr_platform_data->xcvr_attrs = (XCVR_ATTR *)kzalloc(num*sizeof(XCVR_ATTR), GFP_KERNEL); - - - xcvr_platform_data->idx = pdata->idx; - xcvr_platform_data->len = pdata->len; - - for (i=0;ixcvr_attrs[i] = pdata->xcvr_attrs[i]; - } - - /* Verify that the data is written properly */ + int i = 0; + PDDF_ATTR *ptr = (PDDF_ATTR *)da; + XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); + NEW_DEV_ATTR *cdata = (NEW_DEV_ATTR *)(ptr->data); + + struct i2c_adapter *adapter; + struct i2c_board_info board_info; + struct i2c_client *client_ptr; + /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ + /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ + + /* Populate the platform data for xcvr */ + if (strncmp(buf, "add", strlen(buf)-1)==0) + { + if (strcmp(cdata->dev_type, "pddf_xcvr")==0) + { + int num = pdata->len; + XCVR_PDATA *xcvr_platform_data; + + adapter = i2c_get_adapter(cdata->parent_bus); + /* Allocate the xcvr_platform_data */ + xcvr_platform_data = (XCVR_PDATA *)kzalloc(sizeof(XCVR_PDATA), GFP_KERNEL); + xcvr_platform_data->xcvr_attrs = (XCVR_ATTR *)kzalloc(num*sizeof(XCVR_ATTR), GFP_KERNEL); + + + xcvr_platform_data->idx = pdata->idx; + xcvr_platform_data->len = pdata->len; + + for (i=0;ixcvr_attrs[i] = pdata->xcvr_attrs[i]; + } + + /* Verify that the data is written properly */ #if 0 - pddf_dbg(XCVR, KERN_ERR "\n\n########### xcvr_platform_data - start ##########\n"); - pddf_dbg(XCVR, KERN_ERR "dev_idx: %d\n", xcvr_platform_data->idx); - pddf_dbg(XCVR, KERN_ERR "no_of_usr_attr: %d\n", xcvr_platform_data->len); - - for (i=0; ixcvr_attrs[i].aname); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_type: %s\n", xcvr_platform_data->xcvr_attrs[i].devtype); - pddf_dbg(XCVR, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].devaddr); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_offset: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].offset); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_mask: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].mask); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].cmpval); - pddf_dbg(XCVR, KERN_ERR "usr_attr_len: %d\n", xcvr_platform_data->xcvr_attrs[i].len); - } - pddf_dbg(XCVR, KERN_ERR "########### xcvr_platform_data - start ##########\n\n"); + pddf_dbg(XCVR, KERN_ERR "\n\n########### xcvr_platform_data - start ##########\n"); + pddf_dbg(XCVR, KERN_ERR "dev_idx: %d\n", xcvr_platform_data->idx); + pddf_dbg(XCVR, KERN_ERR "no_of_usr_attr: %d\n", xcvr_platform_data->len); + + for (i=0; ixcvr_attrs[i].aname); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_type: %s\n", xcvr_platform_data->xcvr_attrs[i].devtype); + pddf_dbg(XCVR, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].devaddr); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_offset: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].offset); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_mask: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].mask); + pddf_dbg(XCVR, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].cmpval); + pddf_dbg(XCVR, KERN_ERR "usr_attr_len: %d\n", xcvr_platform_data->xcvr_attrs[i].len); + } + pddf_dbg(XCVR, KERN_ERR "########### xcvr_platform_data - start ##########\n\n"); #endif - board_info = (struct i2c_board_info) { - .platform_data = xcvr_platform_data, - }; - - board_info.addr = cdata->dev_addr; - strcpy(board_info.type, cdata->dev_type); - - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ - client_ptr = i2c_new_device(adapter, &board_info); - //client_ptr = i2c_new_dummy(adapter, &board_info); - if (client_ptr != NULL) { - i2c_put_adapter(adapter); - pddf_dbg(XCVR, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); - add_device_table(cdata->i2c_name, (void*)client_ptr); - } - else - { - i2c_put_adapter(adapter); - goto free_data; - } - } - else if((strcmp(cdata->dev_type, "optoe1")==0) || (strcmp(cdata->dev_type, "optoe2")==0)) - { - - adapter = i2c_get_adapter(cdata->parent_bus); - board_info = (struct i2c_board_info) { - .platform_data = (void *)NULL, - }; - - board_info.addr = cdata->dev_addr; - strcpy(board_info.type, cdata->dev_type); - - client_ptr = i2c_new_device(adapter, &board_info); - if(client_ptr != NULL) { - i2c_put_adapter(adapter); - pddf_dbg(XCVR, KERN_ERR "Created %s, type:%s client: 0x%x\n", cdata->i2c_name, cdata->dev_type, client_ptr); - add_device_table(cdata->i2c_name, (void*)client_ptr); - } - else - { - i2c_put_adapter(adapter); - printk(KERN_ERR "Error creating a client %s on 0x%x, client_ptr:0x%x\n", board_info.type, board_info.addr, client_ptr); - goto free_data; - } - } - else - { - printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); - } - } - else if (strncmp(buf, "delete", strlen(buf)-1)==0) - { - /*Get the i2c_client handle for the created client*/ - client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); - if (client_ptr) - { - pddf_dbg(XCVR, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); - i2c_unregister_device(client_ptr); - delete_device_table(cdata->i2c_name); - } - else - { - pddf_dbg(XCVR, KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); - } - } - else - { - printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); - } - - goto clear_data; + board_info = (struct i2c_board_info) { + .platform_data = xcvr_platform_data, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + + /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ + client_ptr = i2c_new_device(adapter, &board_info); + //client_ptr = i2c_new_dummy(adapter, &board_info); + if (client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(XCVR, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + goto free_data; + } + } + else if((strcmp(cdata->dev_type, "optoe1")==0) || (strcmp(cdata->dev_type, "optoe2")==0)) + { + + adapter = i2c_get_adapter(cdata->parent_bus); + board_info = (struct i2c_board_info) { + .platform_data = (void *)NULL, + }; + + board_info.addr = cdata->dev_addr; + strcpy(board_info.type, cdata->dev_type); + + client_ptr = i2c_new_device(adapter, &board_info); + if(client_ptr != NULL) { + i2c_put_adapter(adapter); + pddf_dbg(XCVR, KERN_ERR "Created %s, type:%s client: 0x%x\n", cdata->i2c_name, cdata->dev_type, client_ptr); + add_device_table(cdata->i2c_name, (void*)client_ptr); + } + else + { + i2c_put_adapter(adapter); + printk(KERN_ERR "Error creating a client %s on 0x%x, client_ptr:0x%x\n", board_info.type, board_info.addr, client_ptr); + goto free_data; + } + } + else + { + printk(KERN_ERR "%s:Unknown type of device %s. Unable to create I2C client for it\n",__FUNCTION__, cdata->dev_type); + } + } + else if (strncmp(buf, "delete", strlen(buf)-1)==0) + { + /*Get the i2c_client handle for the created client*/ + client_ptr = (struct i2c_client *)get_device_table(cdata->i2c_name); + if (client_ptr) + { + pddf_dbg(XCVR, KERN_ERR "Removing %s client: 0x%x\n", cdata->i2c_name, client_ptr); + i2c_unregister_device(client_ptr); + delete_device_table(cdata->i2c_name); + } + else + { + pddf_dbg(XCVR, KERN_ERR "Unable to get the client handle for %s\n", cdata->i2c_name); + } + } + else + { + printk(KERN_ERR "PDDF_ERROR: %s: Invalid value for dev_ops %s", __FUNCTION__, buf); + } + + goto clear_data; free_data: - if (board_info.platform_data) - { - XCVR_PDATA *xcvr_platform_data = board_info.platform_data; - if (xcvr_platform_data->xcvr_attrs) - { - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); - kfree(xcvr_platform_data->xcvr_attrs); - } - printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); - kfree(xcvr_platform_data); - } + if (board_info.platform_data) + { + XCVR_PDATA *xcvr_platform_data = board_info.platform_data; + if (xcvr_platform_data->xcvr_attrs) + { + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform subdata\n", __FUNCTION__); + kfree(xcvr_platform_data->xcvr_attrs); + } + printk(KERN_ERR "%s: Unable to create i2c client. Freeing the platform data\n", __FUNCTION__); + kfree(xcvr_platform_data); + } clear_data: - memset(pdata, 0, sizeof(XCVR_DATA)); - /*TODO: free the data cdata->data if data is dynal=mically allocated*/ - memset(cdata, 0, sizeof(NEW_DEV_ATTR)); - return count; + memset(pdata, 0, sizeof(XCVR_DATA)); + /*TODO: free the data cdata->data if data is dynal=mically allocated*/ + memset(cdata, 0, sizeof(NEW_DEV_ATTR)); + return count; } struct kobject *xcvr_kobj; struct kobject *i2c_kobj; int __init pddf_data_init(void) { - struct kobject *device_kobj; - int ret = 0; - - pddf_dbg(XCVR, KERN_ERR "XCVR PDDF MODULE.. init\n"); - - device_kobj = get_device_i2c_kobj(); - if(!device_kobj) - return -ENOMEM; - - xcvr_kobj = kobject_create_and_add("xcvr", device_kobj); - if(!xcvr_kobj) - return -ENOMEM; - i2c_kobj = kobject_create_and_add("i2c", xcvr_kobj); - if(!i2c_kobj) - return -ENOMEM; - - ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); - if (ret) - { - kobject_put(i2c_kobj); - kobject_put(xcvr_kobj); - return ret; - } - pddf_dbg(XCVR, "CREATED SFP I2C CLIENTS CREATION SYSFS GROUP\n"); - - ret = sysfs_create_group(i2c_kobj, &pddf_xcvr_client_data_group); - if (ret) - { - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); - kobject_put(i2c_kobj); + struct kobject *device_kobj; + int ret = 0; + + pddf_dbg(XCVR, KERN_ERR "XCVR PDDF MODULE.. init\n"); + + device_kobj = get_device_i2c_kobj(); + if(!device_kobj) + return -ENOMEM; + + xcvr_kobj = kobject_create_and_add("xcvr", device_kobj); + if(!xcvr_kobj) + return -ENOMEM; + i2c_kobj = kobject_create_and_add("i2c", xcvr_kobj); + if(!i2c_kobj) + return -ENOMEM; + + ret = sysfs_create_group(i2c_kobj, &pddf_clients_data_group); + if (ret) + { + kobject_put(i2c_kobj); kobject_put(xcvr_kobj); return ret; - } - pddf_dbg(XCVR, "CREATED PDDF SFP DATA SYSFS GROUP\n"); - - return ret; + } + pddf_dbg(XCVR, "CREATED SFP I2C CLIENTS CREATION SYSFS GROUP\n"); + + ret = sysfs_create_group(i2c_kobj, &pddf_xcvr_client_data_group); + if (ret) + { + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(xcvr_kobj); + return ret; + } + pddf_dbg(XCVR, "CREATED PDDF SFP DATA SYSFS GROUP\n"); + + return ret; } void __exit pddf_data_exit(void) { - pddf_dbg(XCVR, "XCVR PDDF MODULE.. exit\n"); - sysfs_remove_group(i2c_kobj, &pddf_xcvr_client_data_group); - sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); - kobject_put(i2c_kobj); - kobject_put(xcvr_kobj); - pddf_dbg(XCVR, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'xcvr'\n",__FUNCTION__); + pddf_dbg(XCVR, "XCVR PDDF MODULE.. exit\n"); + sysfs_remove_group(i2c_kobj, &pddf_xcvr_client_data_group); + sysfs_remove_group(i2c_kobj, &pddf_clients_data_group); + kobject_put(i2c_kobj); + kobject_put(xcvr_kobj); + pddf_dbg(XCVR, KERN_ERR "%s: Removed the kobjects for 'i2c' and 'xcvr'\n",__FUNCTION__); - return; + return; } module_init(pddf_data_init); From f0b4dc289b2a5fdaf95169ffeb6b240e73806ea6 Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Fri, 18 Oct 2019 21:17:03 -0700 Subject: [PATCH 4/6] Changes in psu driver module as per the review comments --- platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c index bbed95396450..09cb726f666f 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c @@ -24,7 +24,7 @@ #include "pddf_psu_api.h" -static unsigned short normal_i2c[] = {0x50, 0x58, 0x51, 0x59, 0x53, 0x5b, I2C_CLIENT_END}; +static unsigned short normal_i2c[] = { I2C_CLIENT_END }; struct pddf_ops_t pddf_psu_ops = { .pre_init = NULL, From 8e8cf2ff93a1b193769dd27c0d974f5bc5518d54 Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Sat, 7 Dec 2019 05:53:13 -0800 Subject: [PATCH 5/6] 1) GPL license disclaimer inclusion 2) Removal of commented code, as per the latest review comments --- device/common/pddf/plugins/fanutil.py | 14 ------------ device/common/pddf/plugins/ledutil.py | 22 ------------------- device/common/pddf/plugins/psuutil.py | 7 ------ device/common/pddf/plugins/sfputil.py | 8 ------- device/common/pddf/plugins/sysstatutil.py | 9 -------- .../i2c/modules/client/pddf_client_module.c | 12 +++++++++- .../modules/cpld/driver/pddf_cpld_driver.c | 12 +++++++++- .../pddf/i2c/modules/cpld/pddf_cpld_module.c | 13 ++++++++++- .../i2c/modules/fan/driver/pddf_fan_api.c | 13 ++++++++++- .../i2c/modules/fan/driver/pddf_fan_driver.c | 13 ++++++++++- .../pddf/i2c/modules/fan/pddf_fan_module.c | 13 ++++++++++- .../i2c/modules/include/pddf_client_defs.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_cpld_defs.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_fan_api.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_fan_defs.h | 13 ++++++++++- .../i2c/modules/include/pddf_fan_driver.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_led_defs.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_mux_defs.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_psu_api.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_psu_defs.h | 13 ++++++++++- .../i2c/modules/include/pddf_psu_driver.h | 13 ++++++++++- .../i2c/modules/include/pddf_sysstatus_defs.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_xcvr_api.h | 13 ++++++++++- .../pddf/i2c/modules/include/pddf_xcvr_defs.h | 13 ++++++++++- .../pddf/i2c/modules/led/pddf_led_module.c | 13 ++++++++++- .../pddf/i2c/modules/mux/pddf_mux_module.c | 13 ++++++++++- .../i2c/modules/psu/driver/pddf_psu_api.c | 13 ++++++++++- .../i2c/modules/psu/driver/pddf_psu_driver.c | 13 ++++++++++- .../pddf/i2c/modules/psu/pddf_psu_module.c | 13 ++++++++++- .../modules/sysstatus/pddf_sysstatus_module.c | 13 ++++++++++- .../i2c/modules/xcvr/driver/pddf_xcvr_api.c | 21 +++++++++++++++--- .../modules/xcvr/driver/pddf_xcvr_driver.c | 13 ++++++++++- .../pddf/i2c/modules/xcvr/pddf_xcvr_module.c | 13 ++++++++++- 33 files changed, 340 insertions(+), 90 deletions(-) diff --git a/device/common/pddf/plugins/fanutil.py b/device/common/pddf/plugins/fanutil.py index 92f9ba430ffd..b2c5b5db8522 100755 --- a/device/common/pddf/plugins/fanutil.py +++ b/device/common/pddf/plugins/fanutil.py @@ -184,8 +184,6 @@ def set_speed(self, val): except IOError: return False - #time.sleep(5) - #print "Done changing the speed of all the fans ... Reading the speed to crossscheck\n" return True def dump_sysfs(self): @@ -200,15 +198,3 @@ def get_change_event(self): raise NotImplementedError - -#if __name__== "__main__": - #obj=FanUtil() - ##for i in range(0,6): - ##obj.get_fan_present(i) - - #obj.get_direction() - ##print(obj.get_direction()) - #print(obj.get_speed()) - #obj.set_speed(100) - #print "Chaning the speed back to 50%\n" - #obj.set_speed(50) diff --git a/device/common/pddf/plugins/ledutil.py b/device/common/pddf/plugins/ledutil.py index a72cc1091bc1..921111473f10 100755 --- a/device/common/pddf/plugins/ledutil.py +++ b/device/common/pddf/plugins/ledutil.py @@ -57,25 +57,3 @@ def get_status_led(self, device_name, index): return (status) status = "%s-%s:\t%s %s\n"%(device_name, index, color, color_state) return (status) - - - -#def main(): -# parser = argparse.ArgumentParser() -# parser.add_argument("--set", action='store', nargs="+", help="set led color: --set ") -# parser.add_argument("--get", action='store', nargs="+", help="get led color: --get ") -# args = parser.parse_args() -# if args.set: -# obj=LedUtil() -# if (len(args.set)==3): -# obj.set_status_led(args.set[0], args.set[1], args.set[2]) -# else: -# obj.set_status_led(args.set[0], args.set[1], args.set[2], args.set[3]) -# -# if args.get: -# obj=LedUtil() -# obj.get_status_led(args.get[0], args.get[1]) - -#if __name__ == "__main__" : -# main() - diff --git a/device/common/pddf/plugins/psuutil.py b/device/common/pddf/plugins/psuutil.py index 3ddc504de93a..4961d7dfc029 100755 --- a/device/common/pddf/plugins/psuutil.py +++ b/device/common/pddf/plugins/psuutil.py @@ -265,10 +265,3 @@ def get_fan_speed(self, idx, fan_idx): def dump_sysfs(self): return pddf_obj.cli_dump_dsysfs('psu') -#if __name__== "__main__": - #obj=PsuUtil() - #print(obj.get_psu_status(1)) - #print(obj.get_psu_status(2)) - #print(obj.get_psu_presence(1)) - #print(obj.get_psu_presence(2)) - #print "END\n" diff --git a/device/common/pddf/plugins/sfputil.py b/device/common/pddf/plugins/sfputil.py index 17ed5158ee59..aba57a5a1fc9 100755 --- a/device/common/pddf/plugins/sfputil.py +++ b/device/common/pddf/plugins/sfputil.py @@ -200,11 +200,3 @@ def get_transceiver_change_event(self): def dump_sysfs(self): return pddf_obj.cli_dump_dsysfs('xcvr') - -#if __name__== "__main__": - #obj=SfpUtil() - #for port in range(1, 32): - #obj.get_presence(port) - #print "\nQSFP ports:" - #print obj.qsfp_ports - diff --git a/device/common/pddf/plugins/sysstatutil.py b/device/common/pddf/plugins/sysstatutil.py index 9f8e96d9111a..5360f62a26cb 100755 --- a/device/common/pddf/plugins/sysstatutil.py +++ b/device/common/pddf/plugins/sysstatutil.py @@ -83,12 +83,3 @@ def get_misc_status(self): def dump_sysfs(self): return pddf_obj.cli_dump_dsysfs('sys-status') - -#if __name__== "__main__": - #obj=SYSStatusUtil() - #obj.get_board_info() - #obj.get_cpld_versio() - #obj.get_power_module_status() - #obj.get_system_reset_status() - #obj.get_misc_status() - diff --git a/platform/pddf/i2c/modules/client/pddf_client_module.c b/platform/pddf/i2c/modules/client/pddf_client_module.c index c378fc84b635..34c0639a3c7d 100644 --- a/platform/pddf/i2c/modules/client/pddf_client_module.c +++ b/platform/pddf/i2c/modules/client/pddf_client_module.c @@ -1,7 +1,17 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * A pddf kernel module to create access-data attributes for client creation */ diff --git a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c index 2a287c054b4d..44b47240b3b2 100755 --- a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c +++ b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c @@ -1,7 +1,17 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * A pddf kernel driver module for CPLD */ diff --git a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c index cd5f098ef26b..31c954b2c9e6 100644 --- a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c +++ b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to create I2C client for a CPLD */ diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c index 289f1f6bf4cb..ca9d98e7f31c 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description of various APIs related to FAN component */ diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c index 71f6821b2cd9..c864a5c2f022 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module for a FAN controller */ diff --git a/platform/pddf/i2c/modules/fan/pddf_fan_module.c b/platform/pddf/i2c/modules/fan/pddf_fan_module.c index 9025d7cce62e..de5ca593bf7b 100644 --- a/platform/pddf/i2c/modules/fan/pddf_fan_module.c +++ b/platform/pddf/i2c/modules/fan/pddf_fan_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to create I2C client for FAN controller */ diff --git a/platform/pddf/i2c/modules/include/pddf_client_defs.h b/platform/pddf/i2c/modules/include/pddf_client_defs.h index 928fa983b9a4..44e0d1d6729a 100644 --- a/platform/pddf/i2c/modules/include/pddf_client_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_client_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform I2C client defines/structures header file */ diff --git a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h index 0f95a8f32bef..fc8d143c000a 100644 --- a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform CPLD defines/structures header file */ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_api.h b/platform/pddf/i2c/modules/include/pddf_fan_api.h index 5dc0c3d53bf3..e4b09af5911a 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_api.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_api.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * * Description * FAN driver api declarations */ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_defs.h b/platform/pddf/i2c/modules/include/pddf_fan_defs.h index 8e36829a22de..9313389d66c9 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform FAN defines/structures header file */ diff --git a/platform/pddf/i2c/modules/include/pddf_fan_driver.h b/platform/pddf/i2c/modules/include/pddf_fan_driver.h index 0088871f65bc..bce16ea5e507 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_driver.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * FAN driver related data structures */ diff --git a/platform/pddf/i2c/modules/include/pddf_led_defs.h b/platform/pddf/i2c/modules/include/pddf_led_defs.h index 4a74f0d7dee4..34e19b0337ec 100644 --- a/platform/pddf/i2c/modules/include/pddf_led_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_led_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * Platform LED related defines and structures */ diff --git a/platform/pddf/i2c/modules/include/pddf_mux_defs.h b/platform/pddf/i2c/modules/include/pddf_mux_defs.h index 05a6411a858e..e4e7c5c2e007 100644 --- a/platform/pddf/i2c/modules/include/pddf_mux_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_mux_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform MUX defines/structures header file */ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_api.h b/platform/pddf/i2c/modules/include/pddf_psu_api.h index 0519f6f7d2bd..1627ef503a7d 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_api.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_api.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * PSU driver related api declarations */ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_defs.h b/platform/pddf/i2c/modules/include/pddf_psu_defs.h index 7243f9b66ad2..670ee29e6a13 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform PSU defines/structures header file */ diff --git a/platform/pddf/i2c/modules/include/pddf_psu_driver.h b/platform/pddf/i2c/modules/include/pddf_psu_driver.h index 947ccb8e1894..feb6ec113cba 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_driver.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * PSU driver data structures */ diff --git a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h index 4b7ce174e877..89f2efb7e8fd 100644 --- a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * Platform system status module structures */ diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_api.h b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h index 5701b4188f0d..3e5e1b59f636 100644 --- a/platform/pddf/i2c/modules/include/pddf_xcvr_api.h +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description * Optics driver related api declarations */ diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h index 95875ec8204f..069da2c58f81 100644 --- a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description: * Platform SFP defines/structures header file */ diff --git a/platform/pddf/i2c/modules/led/pddf_led_module.c b/platform/pddf/i2c/modules/led/pddf_led_module.c index c74c96b037a5..77ef68d3efd6 100644 --- a/platform/pddf/i2c/modules/led/pddf_led_module.c +++ b/platform/pddf/i2c/modules/led/pddf_led_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to manage various LEDs of a switch */ diff --git a/platform/pddf/i2c/modules/mux/pddf_mux_module.c b/platform/pddf/i2c/modules/mux/pddf_mux_module.c index 4f5fbcb60916..9f2399c73240 100644 --- a/platform/pddf/i2c/modules/mux/pddf_mux_module.c +++ b/platform/pddf/i2c/modules/mux/pddf_mux_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to create I2C client for pca954x type of multiplexer */ diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c index b8de5b5873ba..6ffbf04949da 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description of various APIs related to PSU component */ diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c index 09cb726f666f..cbcefcfd53ee 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module for PSU */ diff --git a/platform/pddf/i2c/modules/psu/pddf_psu_module.c b/platform/pddf/i2c/modules/psu/pddf_psu_module.c index f6c680d70162..5f195a9627e2 100644 --- a/platform/pddf/i2c/modules/psu/pddf_psu_module.c +++ b/platform/pddf/i2c/modules/psu/pddf_psu_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to create I2C client for PSU */ diff --git a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c index 27aaaa34724d..744b1b068d67 100644 --- a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c +++ b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module for system status registers */ diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c index c51fae367a01..25c71de27bb4 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_api.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * Description of various APIs related to transciever component */ @@ -544,6 +555,7 @@ ssize_t get_module_lpmode(struct device *dev, struct device_attribute *da, char if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", data->lpmode); } @@ -630,6 +642,7 @@ ssize_t get_module_rxlos(struct device *dev, struct device_attribute *da, if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", data->rxlos); } else @@ -652,11 +665,11 @@ ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, mutex_lock(&data->update_lock); if (attr_ops->pre_get != NULL) - { + { status = (attr_ops->pre_get)(client, attr_data, data); if (status!=0) printk(KERN_ERR "%s: pre_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); - } + } if (attr_ops->do_get != NULL) { status = (attr_ops->do_get)(client, attr_data, data); @@ -670,6 +683,7 @@ ssize_t get_module_txdisable(struct device *dev, struct device_attribute *da, if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", data->txdisable); } else @@ -755,6 +769,7 @@ ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, if (status!=0) printk(KERN_ERR "%s: post_get function fails for %s attribute\n", __FUNCTION__, attr_data->aname); } + mutex_unlock(&data->update_lock); return sprintf(buf, "%d\n", data->txfault); } return sprintf(buf,"%s",""); diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c index ca72f8a7b072..56fb553ff5e1 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module for Optic component */ diff --git a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c index 193e7bb929cb..a42d5e5ab224 100644 --- a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c +++ b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c @@ -1,7 +1,18 @@ /* - * Copyright 2019 Broadcom. All rights reserved. + * Copyright 2019 Broadcom. * The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * * A pddf kernel module to create i2C client for optics */ From 33ab9b7084e67438a772ff6cd107a4d3016af905 Mon Sep 17 00:00:00 2001 From: Fuzail Khan Date: Tue, 10 Dec 2019 22:43:31 -0800 Subject: [PATCH 6/6] Removing commented code as per the latest review comments --- platform/pddf/i2c/modules/client/Makefile | 1 - .../i2c/modules/client/pddf_client_module.c | 8 ----- platform/pddf/i2c/modules/cpld/Makefile | 9 ------ .../pddf/i2c/modules/cpld/driver/Makefile | 5 --- .../modules/cpld/driver/pddf_cpld_driver.c | 7 ---- .../pddf/i2c/modules/cpld/pddf_cpld_module.c | 6 ---- platform/pddf/i2c/modules/fan/Makefile | 1 - platform/pddf/i2c/modules/fan/driver/Makefile | 2 -- .../i2c/modules/fan/driver/pddf_fan_api.c | 3 -- .../i2c/modules/fan/driver/pddf_fan_driver.c | 1 - .../pddf/i2c/modules/fan/pddf_fan_module.c | 28 ---------------- .../i2c/modules/include/pddf_client_defs.h | 6 +--- .../pddf/i2c/modules/include/pddf_cpld_defs.h | 8 ++--- .../pddf/i2c/modules/include/pddf_fan_api.h | 2 +- .../pddf/i2c/modules/include/pddf_fan_defs.h | 2 +- .../i2c/modules/include/pddf_fan_driver.h | 2 +- .../pddf/i2c/modules/include/pddf_mux_defs.h | 2 +- .../pddf/i2c/modules/include/pddf_psu_api.h | 2 +- .../pddf/i2c/modules/include/pddf_psu_defs.h | 2 +- .../i2c/modules/include/pddf_psu_driver.h | 2 +- .../i2c/modules/include/pddf_sysstatus_defs.h | 2 +- .../pddf/i2c/modules/include/pddf_xcvr_api.h | 2 +- .../pddf/i2c/modules/include/pddf_xcvr_defs.h | 3 +- platform/pddf/i2c/modules/led/Makefile | 1 - .../pddf/i2c/modules/led/pddf_led_module.c | 1 - platform/pddf/i2c/modules/mux/Makefile | 1 - .../pddf/i2c/modules/mux/pddf_mux_module.c | 6 ---- platform/pddf/i2c/modules/psu/Makefile | 2 -- platform/pddf/i2c/modules/psu/driver/Makefile | 3 -- .../i2c/modules/psu/driver/pddf_psu_api.c | 9 ------ .../i2c/modules/psu/driver/pddf_psu_driver.c | 7 ---- .../pddf/i2c/modules/psu/pddf_psu_module.c | 32 ------------------- platform/pddf/i2c/modules/sysstatus/Makefile | 2 -- .../modules/sysstatus/pddf_sysstatus_module.c | 3 -- platform/pddf/i2c/modules/xcvr/Makefile | 1 - .../pddf/i2c/modules/xcvr/driver/Makefile | 3 -- .../modules/xcvr/driver/pddf_xcvr_driver.c | 4 --- .../pddf/i2c/modules/xcvr/pddf_xcvr_module.c | 29 ----------------- 38 files changed, 13 insertions(+), 197 deletions(-) diff --git a/platform/pddf/i2c/modules/client/Makefile b/platform/pddf/i2c/modules/client/Makefile index 2be81d40da68..c841a144f2db 100644 --- a/platform/pddf/i2c/modules/client/Makefile +++ b/platform/pddf/i2c/modules/client/Makefile @@ -1,4 +1,3 @@ obj-m:= pddf_client_module.o -#GCOV_PROFILE := y ccflags-y := -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/client/pddf_client_module.c b/platform/pddf/i2c/modules/client/pddf_client_module.c index 34c0639a3c7d..25fbd102ea92 100644 --- a/platform/pddf/i2c/modules/client/pddf_client_module.c +++ b/platform/pddf/i2c/modules/client/pddf_client_module.c @@ -152,47 +152,39 @@ ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const c { int ret = 0, num = 0; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ PDDF_ATTR *ptr = (PDDF_ATTR *)da; - /*pddf_dbg(KERN_ERR "[ WRITE ] ATTR PTR TYPE:%d, ADDR=%p\n", ptr->type, ptr->addr);*/ switch(ptr->type) { case PDDF_CHAR: strncpy(ptr->addr, buf, strlen(buf)-1); // to discard newline char form buf ptr->addr[strlen(buf)-1] = '\0'; - /*pddf_dbg(KERN_ERR "Stored value: %s\n", ptr->addr);*/ break; case PDDF_UCHAR: ret = kstrtoint(buf,10,&num); if (ret==0) *(unsigned char *)(ptr->addr) = (unsigned char)num; - /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ break; case PDDF_INT_DEC: ret = kstrtoint(buf,10,&num); if (ret==0) *(int *)(ptr->addr) = num; - /*pddf_dbg(KERN_ERR "Stored value: %d, num: %d\n", *(int*)(ptr->addr), num);*/ break; case PDDF_INT_HEX: ret = kstrtoint(buf,16,&num); if (ret==0) *(int *)(ptr->addr) = num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ break; case PDDF_USHORT: ret = kstrtoint(buf,16,&num); if (ret==0) *(unsigned short *)(ptr->addr) = (unsigned short)num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ break; case PDDF_UINT32: ret = kstrtoint(buf,16,&num); if (ret==0) *(uint32_t *)(ptr->addr) = (uint32_t)num; - /*pddf_dbg(KERN_ERR "Stored value: 0x%x, num: 0x%x\n", *(int*)(ptr->addr), num);*/ break; default: break; diff --git a/platform/pddf/i2c/modules/cpld/Makefile b/platform/pddf/i2c/modules/cpld/Makefile index e0851f201111..c6182ef4f93d 100644 --- a/platform/pddf/i2c/modules/cpld/Makefile +++ b/platform/pddf/i2c/modules/cpld/Makefile @@ -1,13 +1,4 @@ subdir-m := driver obj-m := pddf_cpld_module.o -#GCOV_PROFILE := y -#$(info ===========$(M)=========) CFLAGS_$(obj-m):= -I$(M)/modules/include - -#all: - #$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) modules ; - -#clean: - #$(MAKE) -C /projects/slxos_dev/fk410167/18.2.01X/slxos_main/build/swbd4000/linux_4_9/ M=$(PWD) clean ; - diff --git a/platform/pddf/i2c/modules/cpld/driver/Makefile b/platform/pddf/i2c/modules/cpld/driver/Makefile index 8d47b4c37002..32ef0a4788a7 100644 --- a/platform/pddf/i2c/modules/cpld/driver/Makefile +++ b/platform/pddf/i2c/modules/cpld/driver/Makefile @@ -1,9 +1,4 @@ TARGET = pddf_cpld_driver - - obj-m := $(TARGET).o -#GCOV_PROFILE := y - ccflags-y := -I$(M)/modules/include -#ccflags-y += -I$(M)/modules/cpld diff --git a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c index 44b47240b3b2..dd5366c533f0 100755 --- a/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c +++ b/platform/pddf/i2c/modules/cpld/driver/pddf_cpld_driver.c @@ -22,9 +22,6 @@ #include -//extern int hw_preaccess_func_cpld_mux_default(uint32_t unit, void *data); - - static LIST_HEAD(cpld_client_list); static struct mutex list_lock; @@ -129,8 +126,6 @@ int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg) struct cpld_client_node *cpld_node = NULL; int ret = -EPERM; - //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); - mutex_lock(&list_lock); list_for_each(list_node, &cpld_client_list) @@ -155,8 +150,6 @@ int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value) struct cpld_client_node *cpld_node = NULL; int ret = -EIO; - //hw_preaccess_func_cpld_mux_default((uint32_t)cpld_addr, NULL); - mutex_lock(&list_lock); list_for_each(list_node, &cpld_client_list) diff --git a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c index 31c954b2c9e6..598992757ed8 100644 --- a/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c +++ b/platform/pddf/i2c/modules/cpld/pddf_cpld_module.c @@ -53,7 +53,6 @@ static const struct attribute_group pddf_cpld_client_data_group = { }; -/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { PDDF_ATTR *ptr = (PDDF_ATTR *)da; @@ -62,8 +61,6 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * static struct i2c_board_info board_info; struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ if (strncmp(buf, "add", strlen(buf)-1)==0) { adapter = i2c_get_adapter(device_ptr->parent_bus); @@ -77,7 +74,6 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * board_info.addr = device_ptr->dev_addr; strcpy(board_info.type, device_ptr->dev_type); - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ client_ptr = i2c_new_device(adapter, &board_info); if (client_ptr != NULL) { @@ -178,5 +174,3 @@ module_exit(cpld_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("cpld platform data"); MODULE_LICENSE("GPL"); - -/*#endif*/ diff --git a/platform/pddf/i2c/modules/fan/Makefile b/platform/pddf/i2c/modules/fan/Makefile index d723bff09888..051dbddf051a 100644 --- a/platform/pddf/i2c/modules/fan/Makefile +++ b/platform/pddf/i2c/modules/fan/Makefile @@ -1,6 +1,5 @@ subdir-m := driver obj-m := pddf_fan_module.o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/fan/driver/Makefile b/platform/pddf/i2c/modules/fan/driver/Makefile index eee76a179cb0..c94f217d3bab 100644 --- a/platform/pddf/i2c/modules/fan/driver/Makefile +++ b/platform/pddf/i2c/modules/fan/driver/Makefile @@ -1,8 +1,6 @@ TARGET := pddf_fan_driver_module - obj-m := $(TARGET).o $(TARGET)-objs := pddf_fan_api.o pddf_fan_driver.o -#GCOV_PROFILE := y ccflags-y := -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c index ca9d98e7f31c..ea06566eaa79 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_api.c @@ -183,7 +183,6 @@ ssize_t fan_show_default(struct device *dev, struct device_attribute *da, char * get_fan_duplicate_sysfs(ptr->index , new_str); if (strcmp(attr->dev_attr.attr.name, pdata->fan_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0) { - /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->fan_attrs[i].aname, ptr->index, new_str);*/ attr_info = &data->attr_info[i]; usr_data = &pdata->fan_attrs[i]; strcpy(new_str, ""); @@ -312,7 +311,6 @@ int sonic_i2c_get_fan_present_default(void *client, FAN_DATA_ATTR *udata, void * val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); painfo->val.intval = ((val & udata->mask) == udata->cmpval); - /*fan_dbg(KERN_ERR "presence: val:0x%x, mask:0x%x, present_value = 0x%x\n", val, udata->mask, painfo->val.intval);*/ return status; } @@ -350,7 +348,6 @@ int sonic_i2c_get_fan_direction_default(void *client, FAN_DATA_ATTR *udata, void val = i2c_smbus_read_byte_data((struct i2c_client *)client, udata->offset); painfo->val.intval = ((val & udata->mask) == udata->cmpval); - /*fan_dbg(KERN_ERR "direction: val:0x%x, mask:0x%x, final val:0x%x\n", val, udata->mask, painfo->val.intval);*/ return status; } diff --git a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c index c864a5c2f022..cf202699243c 100644 --- a/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c +++ b/platform/pddf/i2c/modules/fan/driver/pddf_fan_driver.c @@ -418,4 +418,3 @@ module_exit(pddf_fan_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("pddf_fan driver"); MODULE_LICENSE("GPL"); - diff --git a/platform/pddf/i2c/modules/fan/pddf_fan_module.c b/platform/pddf/i2c/modules/fan/pddf_fan_module.c index de5ca593bf7b..31ed1e9209d9 100644 --- a/platform/pddf/i2c/modules/fan/pddf_fan_module.c +++ b/platform/pddf/i2c/modules/fan/pddf_fan_module.c @@ -85,14 +85,12 @@ static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da FAN_DATA *fdata = (FAN_DATA *)(ptr->addr); FAN_SYSFS_ATTR_DATA_ENTRY *entry_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ fdata->fan_attrs[fdata->len] = fdata->fan_attr; entry_ptr = get_fan_access_data(fdata->fan_attrs[fdata->len].aname); if (entry_ptr != NULL && entry_ptr->a_ptr != NULL) { fdata->fan_attrs[fdata->len].access_data = entry_ptr->a_ptr ; - /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",fdata->fan_attrs[fdata->len].aname, fdata->fan_attrs[fdata->len].access_data);*/ } fdata->len++; @@ -125,28 +123,6 @@ struct i2c_board_info *i2c_get_fan_board_info(FAN_DATA *fdata, NEW_DEV_ATTR *cda fan_platform_data->fan_attrs[i] = fdata->fan_attrs[i]; } - /* Verify that the data is written properly */ -#if 0 - pddf_dbg(FAN, KERN_ERR "\n\n########### fan_platform_data - start ##########\n"); - pddf_dbg(FAN, KERN_ERR "num_of_fans: %d\n", fan_platform_data->num_fan); - pddf_dbg(FAN, KERN_ERR "no_of_usr_attr: %d\n", fan_platform_data->len); - - for (i=0; ifan_attrs[i].aname); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_type: %s\n", fan_platform_data->fan_attrs[i].devtype); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_offset: 0x%x\n", fan_platform_data->fan_attrs[i].offset); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_mask: 0x%x\n", fan_platform_data->fan_attrs[i].mask); - pddf_dbg(FAN, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", fan_platform_data->fan_attrs[i].cmpval); - pddf_dbg(FAN, KERN_ERR "usr_attr_len: %d\n", fan_platform_data->fan_attrs[i].len); - pddf_dbg(FAN, KERN_ERR "usr_attr_mult: %d\n", fan_platform_data->fan_attrs[i].mult); - pddf_dbg(FAN, KERN_ERR "usr_attr_is_divisor: %d\n", fan_platform_data->fan_attrs[i].is_divisor); - } - pddf_dbg(FAN, KERN_ERR "########### fan_platform_data - end ##########\n\n"); -#endif - - board_info = (struct i2c_board_info) { .platform_data = fan_platform_data, }; @@ -163,7 +139,6 @@ struct i2c_board_info *i2c_get_fan_board_info(FAN_DATA *fdata, NEW_DEV_ATTR *cda } -/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { PDDF_ATTR *ptr = (PDDF_ATTR *)da; @@ -173,14 +148,12 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * struct i2c_board_info *board_info; struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ if (strncmp(buf, "add", strlen(buf)-1)==0) { adapter = i2c_get_adapter(cdata->parent_bus); board_info = i2c_get_fan_board_info(fdata, cdata); /* Populate the platform data for fan */ - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ client_ptr = i2c_new_device(adapter, board_info); if(client_ptr != NULL) @@ -300,4 +273,3 @@ module_exit(pddf_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("fan platform data"); MODULE_LICENSE("GPL"); - diff --git a/platform/pddf/i2c/modules/include/pddf_client_defs.h b/platform/pddf/i2c/modules/include/pddf_client_defs.h index 44e0d1d6729a..393ee500ce4c 100644 --- a/platform/pddf/i2c/modules/include/pddf_client_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_client_defs.h @@ -42,8 +42,6 @@ #endif -/*#define MAX_NUM_PSU 5*/ -/*#define MAX_PSU_ATTRS 20*/ #define GEN_NAME_SIZE 32 #define ERR_STR_SIZE 128 @@ -77,8 +75,6 @@ enum attribute_data_type { -// PSU Specific details - typedef struct NEW_DEV_ATTR { char i2c_type[GEN_NAME_SIZE]; @@ -134,4 +130,4 @@ typedef struct PDEVICE void add_device_table(char *name, void *ptr); -#endif //__PDDF_CLIENT_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h index fc8d143c000a..e4c61abbc9f3 100644 --- a/platform/pddf/i2c/modules/include/pddf_cpld_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_cpld_defs.h @@ -20,10 +20,6 @@ #ifndef __PDDF_CPLD_DEFS_H__ #define __PDDF_CPLD_DEFS_H__ -/**//* CPLD CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ -/*typedef struct CPLD_DATA*/ -/*{*/ -/*int virt_bus;*/ -/*}CPLD_DATA;*/ +/* CPLD CLIENT DATA - PLATFORM DATA FOR PSU CLIENT */ -#endif //__PDDF_CPLD_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_fan_api.h b/platform/pddf/i2c/modules/include/pddf_fan_api.h index e4b09af5911a..edc2a11d2e17 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_api.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_api.h @@ -34,4 +34,4 @@ extern int sonic_i2c_get_fan_pwm_default(void *client, FAN_DATA_ATTR *adata, voi extern int sonic_i2c_get_fan_fault_default(void *client, FAN_DATA_ATTR *adata, void *data); extern int sonic_i2c_set_fan_pwm_default(void *client, FAN_DATA_ATTR *adata, void *data); -#endif //__PDDF_FAN_API_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_fan_defs.h b/platform/pddf/i2c/modules/include/pddf_fan_defs.h index 9313389d66c9..470fe2e9a886 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_defs.h @@ -86,4 +86,4 @@ typedef struct FAN_PDATA extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); -#endif //__PDDF_FAN_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_fan_driver.h b/platform/pddf/i2c/modules/include/pddf_fan_driver.h index bce16ea5e507..fb108b027fd8 100644 --- a/platform/pddf/i2c/modules/include/pddf_fan_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_fan_driver.h @@ -80,4 +80,4 @@ struct fan_data { struct fan_attr_info attr_info[MAX_FAN_ATTRS]; }; -#endif //__PDDF_FAN_DRIVER_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_mux_defs.h b/platform/pddf/i2c/modules/include/pddf_mux_defs.h index e4e7c5c2e007..e217e803f8e5 100644 --- a/platform/pddf/i2c/modules/include/pddf_mux_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_mux_defs.h @@ -26,4 +26,4 @@ typedef struct MUX_DATA int virt_bus; // Virtual base bus number of the mux channels }MUX_DATA; -#endif //__PAL_MUX_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_psu_api.h b/platform/pddf/i2c/modules/include/pddf_psu_api.h index 1627ef503a7d..a98683a9d52f 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_api.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_api.h @@ -35,4 +35,4 @@ extern int sonic_i2c_get_psu_i_out_default(void *client, PSU_DATA_ATTR *adata, v extern int sonic_i2c_get_psu_p_out_default(void *client, PSU_DATA_ATTR *adata, void *data); extern int sonic_i2c_get_psu_fan1_speed_rpm_default(void *client, PSU_DATA_ATTR *adata, void *data); -#endif //__PDDF_PSU_API_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_psu_defs.h b/platform/pddf/i2c/modules/include/pddf_psu_defs.h index 670ee29e6a13..e62ca60c0d32 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_defs.h @@ -86,4 +86,4 @@ typedef struct PSU_PDATA extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); -#endif //__PDDF_PSU_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_psu_driver.h b/platform/pddf/i2c/modules/include/pddf_psu_driver.h index feb6ec113cba..5ea3387ad635 100644 --- a/platform/pddf/i2c/modules/include/pddf_psu_driver.h +++ b/platform/pddf/i2c/modules/include/pddf_psu_driver.h @@ -60,4 +60,4 @@ struct psu_data { }; -#endif //__PDDF_PSU_DRIVER_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h index 89f2efb7e8fd..fd23f214d204 100644 --- a/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_sysstatus_defs.h @@ -48,4 +48,4 @@ typedef struct SYSSTATUS_DATA -#endif //__PDDF_SYSSTATUS_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_api.h b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h index 3e5e1b59f636..4a1ce00d5581 100644 --- a/platform/pddf/i2c/modules/include/pddf_xcvr_api.h +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_api.h @@ -41,4 +41,4 @@ extern ssize_t get_module_txdisable(struct device *dev, struct device_attribute extern ssize_t set_module_txdisable(struct device *dev, struct device_attribute *da, const char *buf, size_t count); extern ssize_t get_module_txfault(struct device *dev, struct device_attribute *da, char *buf); -#endif //__PDDF_XCVR_API_H__ +#endif diff --git a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h index 069da2c58f81..dd6188fedd91 100644 --- a/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h +++ b/platform/pddf/i2c/modules/include/pddf_xcvr_defs.h @@ -72,7 +72,6 @@ typedef enum xcvr_port_type_e { PDDF_PORT_TYPE_QSFP28 } xcvr_port_type_t; -/*static int data_parsing_complete = 0;*/ /* Each client has this additional data */ struct xcvr_data { @@ -118,4 +117,4 @@ enum xcvr_sysfs_attributes { extern int board_i2c_cpld_read(unsigned short cpld_addr, u8 reg); extern int board_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); -#endif //__PDDF_XCVR_DEFS_H__ +#endif diff --git a/platform/pddf/i2c/modules/led/Makefile b/platform/pddf/i2c/modules/led/Makefile index 58a2229ad61b..0c450ec70b4c 100644 --- a/platform/pddf/i2c/modules/led/Makefile +++ b/platform/pddf/i2c/modules/led/Makefile @@ -1,5 +1,4 @@ TARGET := pddf_led_module obj-m := $(TARGET).o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/led/pddf_led_module.c b/platform/pddf/i2c/modules/led/pddf_led_module.c index 77ef68d3efd6..a3a6f488958d 100644 --- a/platform/pddf/i2c/modules/led/pddf_led_module.c +++ b/platform/pddf/i2c/modules/led/pddf_led_module.c @@ -309,7 +309,6 @@ ssize_t show_pddf_data(struct device *dev, struct device_attribute *da, ssize_t store_pddf_data(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { int ret = 0, num = 0; - //pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf); struct pddf_data_attribute *ptr = (struct pddf_data_attribute *)da; switch(ptr->type) { diff --git a/platform/pddf/i2c/modules/mux/Makefile b/platform/pddf/i2c/modules/mux/Makefile index 4050f0dd34ac..486e7033435f 100644 --- a/platform/pddf/i2c/modules/mux/Makefile +++ b/platform/pddf/i2c/modules/mux/Makefile @@ -1,5 +1,4 @@ obj-m := pddf_mux_module.o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/mux/pddf_mux_module.c b/platform/pddf/i2c/modules/mux/pddf_mux_module.c index 9f2399c73240..9db8cd55f241 100644 --- a/platform/pddf/i2c/modules/mux/pddf_mux_module.c +++ b/platform/pddf/i2c/modules/mux/pddf_mux_module.c @@ -96,7 +96,6 @@ struct i2c_board_info *i2c_get_mux_board_info(MUX_DATA* mdata, NEW_DEV_ATTR *dev } -/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { PDDF_ATTR *ptr = (PDDF_ATTR *)da; @@ -106,14 +105,11 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * struct i2c_board_info *board_info; struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C MUX client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", device_ptr->parent_bus, device_ptr->dev_type, device_ptr->dev_addr);*/ if (strncmp(buf, "add", strlen(buf)-1)==0) { adapter = i2c_get_adapter(device_ptr->parent_bus); board_info = i2c_get_mux_board_info(mux_ptr, device_ptr); - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ client_ptr = i2c_new_device(adapter, board_info); if (client_ptr != NULL) @@ -213,5 +209,3 @@ module_exit(mux_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("mux platform data"); MODULE_LICENSE("GPL"); - -/*#endif*/ diff --git a/platform/pddf/i2c/modules/psu/Makefile b/platform/pddf/i2c/modules/psu/Makefile index 0d5d5423072a..04db30dfb48b 100644 --- a/platform/pddf/i2c/modules/psu/Makefile +++ b/platform/pddf/i2c/modules/psu/Makefile @@ -1,6 +1,4 @@ subdir-m := driver obj-m := pddf_psu_module.o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include -#CFLAGS_$(obj-m)+= -I$(M)/modules/psu/driver diff --git a/platform/pddf/i2c/modules/psu/driver/Makefile b/platform/pddf/i2c/modules/psu/driver/Makefile index 63d437000ffa..86d508051382 100644 --- a/platform/pddf/i2c/modules/psu/driver/Makefile +++ b/platform/pddf/i2c/modules/psu/driver/Makefile @@ -1,9 +1,6 @@ TARGET = pddf_psu_driver_module - obj-m := $(TARGET).o $(TARGET)-objs := pddf_psu_api.o pddf_psu_driver.o -#GCOV_PROFILE := y ccflags-y := -I$(M)/modules/include -#ccflags-y += -I$(M)/modules/psu diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c index 6ffbf04949da..a40136ba857e 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_api.c @@ -60,9 +60,6 @@ void get_psu_duplicate_sysfs(int idx, char *str) case PSU_TEMP1_INPUT: strcpy(str, "temp1_input"); break; - /*case PSU_TEMP_FAULT:*/ - /*strcpy(str, "temp1_fault");*/ - /*break;*/ default: break; } @@ -126,7 +123,6 @@ int psu_update_attr(struct device *dev, struct psu_attr_info *data, PSU_DATA_ATT { dev_dbg(&client->dev, "Starting update for %s\n", data->name); - /*psu_dbg(KERN_ERR "%s: UPDATING %s ATTR FOR PSU,#### \n", __FUNCTION__, udata->aname );*/ sysfs_attr_data = udata->access_data; if (sysfs_attr_data->pre_get != NULL) { @@ -177,7 +173,6 @@ ssize_t psu_show_default(struct device *dev, struct device_attribute *da, char * get_psu_duplicate_sysfs(ptr->index , new_str); if ( strcmp(attr->dev_attr.attr.name, pdata->psu_attrs[i].aname) == 0 || strcmp(attr->dev_attr.attr.name, new_str) == 0 ) { - /*printk(KERN_ERR "%s's show func: access_data from %s, idx %d, new_str=%s\n", attr->dev_attr.attr.name, pdata->psu_attrs[i].aname, ptr->index, new_str);*/ sysfs_attr_info = &data->attr_info[i]; usr_data = &pdata->psu_attrs[i]; strcpy(new_str, ""); @@ -287,7 +282,6 @@ ssize_t psu_store_default(struct device *dev, struct device_attribute *da, const { /*No write attributes for now in PSU*/ default: - /*printk(KERN_ERR "%s: Unable to find the attr index for %s\n", __FUNCTION__, usr_data->aname);*/ goto exit; } @@ -342,7 +336,6 @@ int sonic_i2c_get_psu_model_name_default(void *client, PSU_DATA_ATTR *adata, voi uint8_t offset = (uint8_t)adata->offset; int data_len = adata->len; - /*printk(KERN_ERR "###INSIDE GET MODEL NAME. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ while (retry) { status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, model); @@ -383,7 +376,6 @@ int sonic_i2c_get_psu_mfr_id_default(void *client, PSU_DATA_ATTR *adata, void *d uint8_t offset = (uint8_t)adata->offset; int data_len = adata->len; - /*psu_dbg(KERN_ERR "###INSIDE GET MFR ID. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ while (retry) { status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, mfr_id); @@ -424,7 +416,6 @@ int sonic_i2c_get_psu_serial_num_default(void *client, PSU_DATA_ATTR *adata, voi uint8_t offset = (uint8_t)adata->offset; int data_len = adata->len; - /*psu_dbg(KERN_ERR "###INSIDE GET SERIAL_NUM. client:0x%x, offset:0x%x, data_len:%d\n", client, offset, data_len);*/ while (retry) { status = i2c_smbus_read_i2c_block_data((struct i2c_client *)client, offset, data_len-1, serial); diff --git a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c index cbcefcfd53ee..1aa8d282d867 100644 --- a/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c +++ b/platform/pddf/i2c/modules/psu/driver/pddf_psu_driver.c @@ -125,8 +125,6 @@ static int psu_probe(struct i2c_client *client, char new_str[ATTR_NAME_LEN] = ""; - /*pddf_dbg("GENERIC_PSU_DRIVER Probe called... \n");*/ - if (client == NULL) { printk("NULL Client.. \n"); goto exit; @@ -184,7 +182,6 @@ static int psu_probe(struct i2c_client *client, dy_ptr->index = sysfs_data_entry->a_ptr->index; data->psu_attribute_list[i] = &dy_ptr->dev_attr.attr; - /*pddf_dbg(KERN_ERR "PSU%d: Allocated %d: 0x%x\n", data->index+1, i, data->psu_attribute_list[i]);*/ strcpy(data->attr_info[i].name, data_attr->aname); data->attr_info[i].valid = 0; mutex_init(&data->attr_info[i].update_lock); @@ -273,7 +270,6 @@ static int psu_remove(struct i2c_client *client) ptr = (struct sensor_device_attribute *)data->psu_attribute_list[i]; kfree(ptr); data->psu_attribute_list[i] = NULL; - /*pddf_dbg(KERN_ERR "PSU%d: Freed %d: 0x%x\n", data->index+1, i, ptr);*/ } pddf_dbg(PSU, KERN_ERR "%s: Freed all the memory allocated for attributes\n", __FUNCTION__); kfree(data); @@ -366,12 +362,9 @@ void __exit psu_exit(void) } EXPORT_SYMBOL(psu_exit); -/*#ifdef SONIC*/ module_init(psu_init); module_exit(psu_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("psu driver"); MODULE_LICENSE("GPL"); - -/*#endif*/ diff --git a/platform/pddf/i2c/modules/psu/pddf_psu_module.c b/platform/pddf/i2c/modules/psu/pddf_psu_module.c index 5f195a9627e2..4156c124cc08 100644 --- a/platform/pddf/i2c/modules/psu/pddf_psu_module.c +++ b/platform/pddf/i2c/modules/psu/pddf_psu_module.c @@ -86,14 +86,12 @@ static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da PSU_DATA *pdata = (PSU_DATA *)(ptr->addr); PSU_SYSFS_ATTR_DATA_ENTRY *access_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ pdata->psu_attrs[pdata->len] = pdata->psu_attr; access_ptr = get_psu_access_data(pdata->psu_attrs[pdata->len].aname); if (access_ptr != NULL && access_ptr->a_ptr != NULL) { pdata->psu_attrs[pdata->len].access_data = access_ptr->a_ptr ; - /*pddf_dbg(KERN_ERR "Attr:%s, access_data_ptr: 0x%x\n",pdata->psu_attrs[pdata->len].aname, pdata->psu_attrs[pdata->len].access_data);*/ } @@ -128,28 +126,6 @@ struct i2c_board_info *i2c_get_psu_board_info(PSU_DATA *pdata, NEW_DEV_ATTR *cda psu_platform_data->psu_attrs[i] = pdata->psu_attrs[i]; } - /* Verify that the data is written properly */ -#if 0 - pddf_dbg(PSU, KERN_ERR "\n\n########### psu_platform_data - start ##########\n"); - pddf_dbg(PSU, KERN_ERR "psu_idx: %d\n", psu_platform_data->idx); - pddf_dbg(PSU, KERN_ERR "psu_fans: %d\n", psu_platform_data->num_psu_fans); - pddf_dbg(PSU, KERN_ERR "no_of_usr_attr: %d\n", psu_platform_data->len); - - for (i=0; ipsu_attrs[i].aname); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_type: %s\n", psu_platform_data->psu_attrs[i].devtype); - pddf_dbg(PSU, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", psu_platform_data->psu_attrs[i].devaddr); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_offset: 0x%x\n", psu_platform_data->psu_attrs[i].offset); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_mask: 0x%x\n", psu_platform_data->psu_attrs[i].mask); - pddf_dbg(PSU, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", psu_platform_data->psu_attrs[i].cmpval); - pddf_dbg(PSU, KERN_ERR "usr_attr_len: %d\n", psu_platform_data->psu_attrs[i].len); - } - pddf_dbg(PSU, KERN_ERR "########### psu_platform_data - start ##########\n\n"); -#endif - - board_info = (struct i2c_board_info) { .platform_data = psu_platform_data, }; @@ -166,7 +142,6 @@ struct i2c_board_info *i2c_get_psu_board_info(PSU_DATA *pdata, NEW_DEV_ATTR *cda } -/*PDDF_DATA_ATTR(dev_ops, S_IWUSR, NULL, do_device_operation, PDDF_CHAR, 8, (void*)&pddf_attr, (void*)NULL);*/ static ssize_t do_device_operation(struct device *dev, struct device_attribute *da, const char *buf, size_t count) { PDDF_ATTR *ptr = (PDDF_ATTR *)da; @@ -177,17 +152,12 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - - - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ if (strncmp(buf, "add", strlen(buf)-1)==0) { adapter = i2c_get_adapter(cdata->parent_bus); board_info = i2c_get_psu_board_info(pdata, cdata); /* Populate the platform data for psu */ - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info->type, board_info->addr, board_info->platform_data);*/ client_ptr = i2c_new_device(adapter, board_info); if(client_ptr != NULL) @@ -309,5 +279,3 @@ module_exit(pddf_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("psu platform data"); MODULE_LICENSE("GPL"); - -/*#endif*/ diff --git a/platform/pddf/i2c/modules/sysstatus/Makefile b/platform/pddf/i2c/modules/sysstatus/Makefile index 6b874aa9395b..150d160eae15 100644 --- a/platform/pddf/i2c/modules/sysstatus/Makefile +++ b/platform/pddf/i2c/modules/sysstatus/Makefile @@ -1,6 +1,4 @@ TARGET := pddf_sysstatus_module obj-m := $(TARGET).o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include - diff --git a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c index 744b1b068d67..bd892d924265 100644 --- a/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c +++ b/platform/pddf/i2c/modules/sysstatus/pddf_sysstatus_module.c @@ -137,7 +137,6 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha { if (strcmp(data->sysstatus_addr_attrs[i].aname, attr->dev_attr.attr.name) == 0 ) { - /*pddf_dbg(KERN_ERR "%s: show func called for %s\n\n", __FUNCTION__, attr->dev_attr.attr.name);*/ sysstatus_addr_attrs = &data->sysstatus_addr_attrs[i]; } @@ -151,7 +150,6 @@ ssize_t show_sysstatus_data(struct device *dev, struct device_attribute *da, cha else { status = board_i2c_cpld_read( sysstatus_addr_attrs->devaddr, sysstatus_addr_attrs->offset); - /*pddf_dbg(KERN_ERR "%s: Data read for %s is 0x%x\n", __FUNCTION__, sysstatus_addr_attrs->aname, status);*/ } return sprintf(buf, "0x%x\n", (status&sysstatus_addr_attrs->mask)); @@ -235,4 +233,3 @@ module_exit(sysstatus_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("SYSSTATUS platform data"); MODULE_LICENSE("GPL"); - diff --git a/platform/pddf/i2c/modules/xcvr/Makefile b/platform/pddf/i2c/modules/xcvr/Makefile index 17e856655780..e72ad6b44233 100644 --- a/platform/pddf/i2c/modules/xcvr/Makefile +++ b/platform/pddf/i2c/modules/xcvr/Makefile @@ -1,5 +1,4 @@ subdir-m := driver obj-m := pddf_xcvr_module.o -#GCOV_PROFILE := y CFLAGS_$(obj-m):= -I$(M)/modules/include diff --git a/platform/pddf/i2c/modules/xcvr/driver/Makefile b/platform/pddf/i2c/modules/xcvr/driver/Makefile index 6a8cb4d530e6..5866bd04df1d 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/Makefile +++ b/platform/pddf/i2c/modules/xcvr/driver/Makefile @@ -1,9 +1,6 @@ TARGET = pddf_xcvr_driver_module - obj-m := $(TARGET).o $(TARGET)-objs := pddf_xcvr_api.o pddf_xcvr_driver.o -#GCOV_PROFILE := y ccflags-y := -I$(M)/modules/include -#ccflags-y += -I$(M)/modules/xcvr diff --git a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c index 56fb553ff5e1..2124f81e636b 100644 --- a/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c +++ b/platform/pddf/i2c/modules/xcvr/driver/pddf_xcvr_driver.c @@ -125,7 +125,6 @@ static int xcvr_probe(struct i2c_client *client, i2c_set_clientdata(client, data); data->valid = 0; - /*data->index = dev_id->driver_data;*/ dev_info(&client->dev, "chip found\n"); @@ -143,7 +142,6 @@ static int xcvr_probe(struct i2c_client *client, for(j=0;jdev_attr.attr; - /*pddf_dbg(KERN_ERR "i:%d, j:%d, aptr->name: %s, attr_data->name: %s\n", i, j, aptr->name, attr_data->aname);*/ if (strncmp(aptr->name, attr_data->aname, strlen(attr_data->aname))==0) break; @@ -294,7 +292,5 @@ MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("Driver for transceiver operations"); MODULE_LICENSE("GPL"); -/*#ifdef SONIC*/ module_init(xcvr_init); module_exit(xcvr_exit); -/*#endif*/ diff --git a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c index a42d5e5ab224..f8b1e3dc01e4 100644 --- a/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c +++ b/platform/pddf/i2c/modules/xcvr/pddf_xcvr_module.c @@ -78,8 +78,6 @@ static ssize_t do_attr_operation(struct device *dev, struct device_attribute *da PDDF_ATTR *ptr = (PDDF_ATTR *)da; XCVR_DATA *pdata = (XCVR_DATA *)(ptr->addr); - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - pdata->xcvr_attrs[pdata->len] = pdata->xcvr_attr; pdata->len++; memset(&pdata->xcvr_attr, 0, sizeof(pdata->xcvr_attr)); @@ -99,8 +97,6 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * struct i2c_adapter *adapter; struct i2c_board_info board_info; struct i2c_client *client_ptr; - /*pddf_dbg(KERN_ERR "%s: %s", __FUNCTION__, buf);*/ - /*pddf_dbg(KERN_ERR "Creating an I2C client with parent_bus:0x%x, dev_type:%s, dev_addr:0x%x\n", cdata->parent_bus, cdata->dev_type, cdata->dev_addr);*/ /* Populate the platform data for xcvr */ if (strncmp(buf, "add", strlen(buf)-1)==0) @@ -124,27 +120,6 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * xcvr_platform_data->xcvr_attrs[i] = pdata->xcvr_attrs[i]; } - /* Verify that the data is written properly */ -#if 0 - pddf_dbg(XCVR, KERN_ERR "\n\n########### xcvr_platform_data - start ##########\n"); - pddf_dbg(XCVR, KERN_ERR "dev_idx: %d\n", xcvr_platform_data->idx); - pddf_dbg(XCVR, KERN_ERR "no_of_usr_attr: %d\n", xcvr_platform_data->len); - - for (i=0; ixcvr_attrs[i].aname); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_type: %s\n", xcvr_platform_data->xcvr_attrs[i].devtype); - pddf_dbg(XCVR, KERN_ERR "usr_attr_clinet_addr: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].devaddr); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_offset: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].offset); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_mask: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].mask); - pddf_dbg(XCVR, KERN_ERR "usr_attr_client_exp_val: 0x%x\n", xcvr_platform_data->xcvr_attrs[i].cmpval); - pddf_dbg(XCVR, KERN_ERR "usr_attr_len: %d\n", xcvr_platform_data->xcvr_attrs[i].len); - } - pddf_dbg(XCVR, KERN_ERR "########### xcvr_platform_data - start ##########\n\n"); -#endif - - board_info = (struct i2c_board_info) { .platform_data = xcvr_platform_data, }; @@ -152,9 +127,7 @@ static ssize_t do_device_operation(struct device *dev, struct device_attribute * board_info.addr = cdata->dev_addr; strcpy(board_info.type, cdata->dev_type); - /*pddf_dbg(KERN_ERR "Creating a client %s on 0x%x, platform_data 0x%x\n", board_info.type, board_info.addr, board_info.platform_data);*/ client_ptr = i2c_new_device(adapter, &board_info); - //client_ptr = i2c_new_dummy(adapter, &board_info); if (client_ptr != NULL) { i2c_put_adapter(adapter); pddf_dbg(XCVR, KERN_ERR "Created a %s client: 0x%x\n", cdata->i2c_name, client_ptr); @@ -298,5 +271,3 @@ module_exit(pddf_data_exit); MODULE_AUTHOR("Broadcom"); MODULE_DESCRIPTION("sfp platform data"); MODULE_LICENSE("GPL"); - -/*#endif*/