From 3e6e037d67a686040dacbb7c67d59347f7f64c3e Mon Sep 17 00:00:00 2001 From: JohnsonYJLu <31528297+JohnsonYJLu@users.noreply.github.com> Date: Fri, 9 Aug 2019 07:50:28 +0800 Subject: [PATCH] Modify ag9064 platform module and add support psutil. (#3305) Signed-off-by: johnson --- .../x86_64-delta_ag9064-r0/plugins/psuutil.py | 78 ++ .../x86_64-delta_ag9064-r0/plugins/sfputil.py | 4 +- .../ag9064/modules/delta_ag9064_common.h | 83 +- .../ag9064/modules/delta_ag9064_cpld.c | 128 ++- .../ag9064/modules/delta_ag9064_platform.c | 782 +++++++++++------- .../ag9064/modules/delta_ag9064_swpld.c | 37 +- .../debian/platform-modules-ag9064.init | 12 + 7 files changed, 797 insertions(+), 327 deletions(-) create mode 100644 device/delta/x86_64-delta_ag9064-r0/plugins/psuutil.py diff --git a/device/delta/x86_64-delta_ag9064-r0/plugins/psuutil.py b/device/delta/x86_64-delta_ag9064-r0/plugins/psuutil.py new file mode 100644 index 0000000000..2a2bd1eea6 --- /dev/null +++ b/device/delta/x86_64-delta_ag9064-r0/plugins/psuutil.py @@ -0,0 +1,78 @@ +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# + +import os.path +import subprocess + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + self.psu_presence = "cat /sys/devices/platform/delta-ag9064-cpld.0/psu{}_scan" + self.psu_status = "cat /sys/devices/platform/delta-ag9064-swpld1.0/psu{}_pwr_ok" + + def get_num_psus(self): + """ + Retrieves the number of PSUs available on the device + + :return: An integer, the number of PSUs available on the device + """ + return 2 + + def get_psu_status(self, index): + """ + Retrieves the oprational status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is operating properly, False if PSU is faulty + """ + if index is None: + return False + + status = 0 + try: + p = os.popen(self.psu_status.format(index)) + content = p.readline().rstrip() + reg_value = int(content) + if reg_value != 0: + return False + status = 1 + p.close() + except IOError: + return False + return status == 1 + + + + def get_psu_presence(self, index): + """ + Retrieves the presence status of power supply unit (PSU) defined + by 1-based index + + :param index: An integer, 1-based index of the PSU of which to query status + :return: Boolean, True if PSU is plugged, False if not + """ + if index is None: + return False + status = 0 + try: + p = os.popen(self.psu_presence.format(index)) + content = p.readline().rstrip() + reg_value = int(content, 16) + if reg_value != 0: + return False + status = 1 + p.close() + except IOError: + return False + return status == 1 + diff --git a/device/delta/x86_64-delta_ag9064-r0/plugins/sfputil.py b/device/delta/x86_64-delta_ag9064-r0/plugins/sfputil.py index 4b33dd8b09..8b1b1aea1d 100644 --- a/device/delta/x86_64-delta_ag9064-r0/plugins/sfputil.py +++ b/device/delta/x86_64-delta_ag9064-r0/plugins/sfputil.py @@ -17,7 +17,7 @@ class SfpUtil(SfpUtilBase): PORT_END = 63 PORTS_IN_BLOCK = 64 - EEPROM_OFFSET = 20 + EEPROM_OFFSET = 1 _port_to_eeprom_mapping = {} @@ -38,7 +38,7 @@ class SfpUtil(SfpUtilBase): return self._port_to_eeprom_mapping def __init__(self): - eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + eeprom_path = "/sys/kernel/sfp/eeprom_sfp_{0}" for x in range(0, self.port_end + 1): self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h index 5be2eb91fe..da91750887 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_common.h @@ -14,8 +14,10 @@ #define IPMI_MAX_INTF (4) #define DELTA_NETFN 0x38 #define BMC_BUS_5 0x04 +#define BMC_BUS_1 0x00 #define CMD_SETDATA 0x03 #define CMD_GETDATA 0x02 +#define CMD_DEVICE_SCAN 0x01 #define CPUPLD_ADDR 0x31 #define SWPLD1_ADDR 0x35 @@ -23,19 +25,27 @@ #define SWPLD3_ADDR 0x33 #define SWPLD4_ADDR 0x32 #define QSFP_PORT_MUX_REG 0x13 +#define PSU1_EEPROM_ADDR 0x50 +#define PSU2_EEPROM_ADDR 0x51 #define DEFAULT_NUM 1 #define BUS9_DEV_NUM 64 #define BUS9_BASE_NUM 20 +#define EEPROM_SIZE 640 +#define EEPROM_ARCH_SIZE 256 +#define EEPROM_MASK 20 +#define ATTR_R 1 +#define ATTR_W 2 extern int dni_bmc_cmd(char set_cmd, char *cmd_data, int cmd_data_len); extern int dni_create_user(void); extern unsigned char dni_log2 (unsigned char num); - extern void device_release(struct device *dev); extern void msg_handler(struct ipmi_recv_msg *recv_msg,void* handler_data); extern void dummy_smi_free(struct ipmi_smi_msg *msg); extern void dummy_recv_free(struct ipmi_recv_msg *msg); +extern void dni_klock(void); +extern void dni_kunlock(void); static ipmi_user_t ipmi_mh_user = NULL; static struct ipmi_user_hndl ipmi_hndlrs = { .ipmi_recv_hndl = msg_handler,}; @@ -129,6 +139,8 @@ enum cpld_attributes { SWPLD3_REG_VALUE, SWPLD4_REG_ADDR, SWPLD4_REG_VALUE, + PSU1_SCAN, + PSU2_SCAN, //CPLD CPLD_VER, CPU_BOARD_VER, @@ -203,6 +215,73 @@ enum cpld_attributes { FAN_EEPROM_WP, }; +enum sfp_attributes{ + EEPROM_SFP_1, + EEPROM_SFP_2, + EEPROM_SFP_3, + EEPROM_SFP_4, + EEPROM_SFP_5, + EEPROM_SFP_6, + EEPROM_SFP_7, + EEPROM_SFP_8, + EEPROM_SFP_9, + EEPROM_SFP_10, + EEPROM_SFP_11, + EEPROM_SFP_12, + EEPROM_SFP_13, + EEPROM_SFP_14, + EEPROM_SFP_15, + EEPROM_SFP_16, + EEPROM_SFP_17, + EEPROM_SFP_18, + EEPROM_SFP_19, + EEPROM_SFP_20, + EEPROM_SFP_21, + EEPROM_SFP_22, + EEPROM_SFP_23, + EEPROM_SFP_24, + EEPROM_SFP_25, + EEPROM_SFP_26, + EEPROM_SFP_27, + EEPROM_SFP_28, + EEPROM_SFP_29, + EEPROM_SFP_30, + EEPROM_SFP_31, + EEPROM_SFP_32, + EEPROM_SFP_33, + EEPROM_SFP_34, + EEPROM_SFP_35, + EEPROM_SFP_36, + EEPROM_SFP_37, + EEPROM_SFP_38, + EEPROM_SFP_39, + EEPROM_SFP_40, + EEPROM_SFP_41, + EEPROM_SFP_42, + EEPROM_SFP_43, + EEPROM_SFP_44, + EEPROM_SFP_45, + EEPROM_SFP_46, + EEPROM_SFP_47, + EEPROM_SFP_48, + EEPROM_SFP_49, + EEPROM_SFP_50, + EEPROM_SFP_51, + EEPROM_SFP_52, + EEPROM_SFP_53, + EEPROM_SFP_54, + EEPROM_SFP_55, + EEPROM_SFP_56, + EEPROM_SFP_57, + EEPROM_SFP_58, + EEPROM_SFP_59, + EEPROM_SFP_60, + EEPROM_SFP_61, + EEPROM_SFP_62, + EEPROM_SFP_63, + EEPROM_SFP_64, +}; + static struct cpld_attribute_data attribute_data[] = { [CPLD_REG_ADDR] = { }, @@ -564,4 +643,4 @@ static struct cpld_attribute_data attribute_data[] = { .reg = 0x15, .mask = 1 << 2, .note = "ā€œ1ā€ = enables the lock-down mechanism.\nā€œ0ā€ = overrides the lock-down function enabling blocks to be erased or programmed using software commands." }, -}; \ No newline at end of file +}; diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c index 97e1b64001..75bab55d7e 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_cpld.c @@ -65,9 +65,10 @@ static ssize_t get_present(struct device *dev, struct device_attribute \ uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_GETDATA; + dni_klock(); + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -119,6 +120,7 @@ static ssize_t get_present(struct device *dev, struct device_attribute \ ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); data |= (u64)(ret & 0xff) << 56; + dni_kunlock(); return sprintf(buf, "0x%016llx\n", data); } @@ -130,9 +132,10 @@ static ssize_t get_lpmode(struct device *dev, struct device_attribute \ uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_GETDATA; + dni_klock(); + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -184,6 +187,8 @@ static ssize_t get_lpmode(struct device *dev, struct device_attribute \ ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); data |= (u64)(ret & 0xff) << 56; + dni_kunlock(); + return sprintf(buf, "0x%016llx\n", data); } @@ -195,9 +200,10 @@ static ssize_t get_reset(struct device *dev, struct device_attribute \ uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_GETDATA; + dni_klock(); + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -249,6 +255,8 @@ static ssize_t get_reset(struct device *dev, struct device_attribute \ ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); data |= (u64)(ret & 0xff) << 56; + dni_kunlock(); + return sprintf(buf, "0x%016llx\n", data); } @@ -260,9 +268,10 @@ static ssize_t get_response(struct device *dev, struct device_attribute \ uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_GETDATA; + dni_klock(); + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -314,6 +323,8 @@ static ssize_t get_response(struct device *dev, struct device_attribute \ ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); data |= (u64)(ret & 0xff) << 56; + dni_kunlock(); + return sprintf(buf, "0x%016llx\n", data); } @@ -325,9 +336,10 @@ static ssize_t get_interrupt(struct device *dev, struct device_attribute \ uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_GETDATA; + dni_klock(); + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -379,6 +391,8 @@ static ssize_t get_interrupt(struct device *dev, struct device_attribute \ ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); data |= (u64)(ret & 0xff) << 56; + dni_kunlock(); + return sprintf(buf, "0x%016llx\n", data); } @@ -386,16 +400,19 @@ static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, { unsigned long long set_data; int err; - - err = kstrtoull(buf, 16, &set_data); - if (err){ - return err; - } uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_SETDATA; + + dni_klock(); + + err = kstrtoull(buf, 16, &set_data); + if (err){ + dni_kunlock(); + return err; + } + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -446,6 +463,8 @@ static ssize_t set_lpmode(struct device *dev, struct device_attribute *devattr, cmd_data[3] = ((set_data >> 56 ) & 0xff); dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + dni_kunlock(); + return count; } @@ -453,17 +472,19 @@ static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, c { unsigned long long set_data; int err; - - err = kstrtoull(buf, 16, &set_data); - if (err){ - return err; - } uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_SETDATA; + dni_klock(); + + err = kstrtoull(buf, 16, &set_data); + if (err){ + dni_kunlock(); + return err; + } + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -514,6 +535,8 @@ static ssize_t set_reset(struct device *dev, struct device_attribute *devattr, c cmd_data[3] = ((set_data >> 56 ) & 0xff); dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + dni_kunlock(); + return count; } @@ -521,17 +544,19 @@ static ssize_t set_response(struct device *dev, struct device_attribute *devattr { unsigned long long set_data; int err; - - err = kstrtoull(buf, 16, &set_data); - if (err){ - return err; - } uint8_t cmd_data[4]={0}; uint8_t set_cmd; int cmd_data_len; - set_cmd = CMD_SETDATA; + dni_klock(); + + err = kstrtoull(buf, 16, &set_data); + if (err){ + dni_kunlock(); + return err; + } + /*QSFP1~8*/ cmd_data[0] = BMC_BUS_5; cmd_data[1] = SWPLD1_ADDR; @@ -581,10 +606,38 @@ static ssize_t set_response(struct device *dev, struct device_attribute *devattr cmd_data[2] = QSFP_RESPONSE_8; cmd_data[3] = ((set_data >> 56 ) & 0xff); dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + + dni_kunlock(); return count; } +static ssize_t psu_scan(struct device *dev, struct device_attribute *dev_attr, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + int ret; + uint8_t cmd_data[2]={0}; + uint8_t set_cmd; + int cmd_data_len; + set_cmd = CMD_DEVICE_SCAN; + + dni_klock(); + cmd_data[0] = BMC_BUS_1; + switch (attr->index) + { + case PSU1_SCAN: + cmd_data[1] = PSU1_EEPROM_ADDR; + break; + case PSU2_SCAN: + cmd_data[1] = PSU2_EEPROM_ADDR; + break; + } + cmd_data_len = sizeof(cmd_data); + ret = dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + dni_kunlock(); + return sprintf(buf, "0x%x\n", ret); +} + static ssize_t get_cpld_reg(struct device *dev, struct device_attribute *dev_attr, char *buf) { int ret; @@ -594,12 +647,16 @@ static ssize_t get_cpld_reg(struct device *dev, struct device_attribute *dev_att unsigned char reg; struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); struct cpld_platform_data *pdata = dev->platform_data; + + dni_klock(); switch (attr->index) { case CPLD_REG_ADDR: + dni_kunlock(); return sprintf(buf, "0x%02x\n", cpupld_reg_addr); case CPLD_REG_VALUE: ret = i2c_smbus_read_byte_data(pdata[system_cpld].client, cpupld_reg_addr); + dni_kunlock(); return sprintf(buf, "0x%02x\n", ret); case CPLD_VER ... OP_MODULE_INT: reg = attribute_data[attr->index].reg; @@ -609,21 +666,28 @@ static ssize_t get_cpld_reg(struct device *dev, struct device_attribute *dev_att value = (value & mask); break; default: + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } switch (mask) { case 0xFF: + dni_kunlock(); return sprintf(buf, "0x%02x%s", value, note); case 0x0F: + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); case 0xF0: value = value >> 4; + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); default : value = value >> dni_log2(mask); + dni_kunlock(); return sprintf(buf, "%d%s", value, note); } + dni_kunlock(); + return sprintf(buf, "%d not found", attr->index); } static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_attr, @@ -636,27 +700,32 @@ static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_att unsigned char reg; unsigned char mask; unsigned char mask_out; - struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); struct cpld_platform_data *pdata = dev->platform_data; + dni_klock(); + err = kstrtoul(buf, 0, &set_data_ul); if (err){ + dni_kunlock(); return err; } set_data = (int)set_data_ul; if (set_data > 0xff){ printk(KERN_ALERT "address out of range (0x00-0xFF)\n"); + dni_kunlock(); return count; } switch (attr->index) { case CPLD_REG_ADDR: cpupld_reg_addr = set_data; + dni_kunlock(); return count; case CPLD_REG_VALUE: i2c_smbus_write_byte_data(pdata[system_cpld].client, cpupld_reg_addr, set_data); + dni_kunlock(); return count; case CPLD_VER ... OP_MODULE_INT: reg = attribute_data[attr->index].reg; @@ -665,6 +734,7 @@ static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_att mask_out = value & ~(mask); break; default: + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } @@ -684,6 +754,7 @@ static ssize_t set_cpld_reg(struct device *dev, struct device_attribute *dev_att } i2c_smbus_write_byte_data(pdata[system_cpld].client, reg, set_data); + dni_kunlock(); return count; } @@ -712,6 +783,8 @@ static SENSOR_DEVICE_ATTR(mb_pwr, S_IRUGO, get_cpld_reg, NU static SENSOR_DEVICE_ATTR(mb_rst, S_IRUGO | S_IWUSR, get_cpld_reg, set_cpld_reg, MB_RST); static SENSOR_DEVICE_ATTR(psu_fan_int, S_IRUGO, get_cpld_reg, NULL, PSU_FAN_INT); static SENSOR_DEVICE_ATTR(op_module_int, S_IRUGO, get_cpld_reg, NULL, OP_MODULE_INT); +static SENSOR_DEVICE_ATTR(psu1_scan, S_IRUGO, psu_scan, NULL, PSU1_SCAN); +static SENSOR_DEVICE_ATTR(psu2_scan, S_IRUGO, psu_scan, NULL, PSU2_SCAN); static struct attribute *ag9064_cpld_attrs[] = { &dev_attr_qsfp_present.attr, @@ -738,6 +811,8 @@ static struct attribute *ag9064_cpld_attrs[] = { &sensor_dev_attr_mb_rst.dev_attr.attr, &sensor_dev_attr_psu_fan_int.dev_attr.attr, &sensor_dev_attr_op_module_int.dev_attr.attr, + &sensor_dev_attr_psu1_scan.dev_attr.attr, + &sensor_dev_attr_psu2_scan.dev_attr.attr, NULL, }; @@ -823,11 +898,6 @@ static int __init delta_ag9064_cpupld_init(void) int ret; printk(KERN_WARNING "ag9064_platform_cpupld module initialization\n"); - ret = dni_create_user(); - if (ret != 0){ - printk(KERN_WARNING "Fail to create IPMI user\n"); - } - // set the CPUPLD prob and remove ret = platform_driver_register(&cpld_driver); if (ret) { diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_platform.c b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_platform.c index 099d7ea987..4de9799d46 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_platform.c +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_platform.c @@ -7,15 +7,13 @@ #include #include #include +#include +#include +#include +#include #include "delta_ag9064_common.h" -#define SFF8436_INFO(data) \ - .type = "sff8436", .addr = 0x50, .platform_data = (data) - -#define SFF_8346_PORT(eedata) \ - .byte_len = 256, .page_size = 1, .flags = SFF_8436_FLAG_READONLY - #define ag9064_i2c_device_num(NUM){ \ .name = "delta-ag9064-i2c-device", \ .id = NUM, \ @@ -26,7 +24,19 @@ } struct i2c_client * i2c_client_9548; +static struct kobject *kobj_sfp; +struct mutex dni_lock;; +void dni_klock(void) +{ + mutex_lock(&dni_lock); +} +EXPORT_SYMBOL(dni_klock); +void dni_kunlock(void) +{ + mutex_unlock(&dni_lock); +} +EXPORT_SYMBOL(dni_kunlock); /* pca9548 - add 8 bus */ static struct pca954x_platform_mode pca954x_mode[] = @@ -79,73 +89,6 @@ static struct i2c_board_info __initdata i2c_info_pca9548[] = }, }; -static struct sff_8436_platform_data sff_8436_port[] = { - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, - { SFF_8346_PORT() }, -}; - void device_release(struct device *dev) { return; @@ -245,6 +188,17 @@ int dni_bmc_cmd(char set_cmd, char *cmd_data, int cmd_data_len) printk(KERN_ERR "IPMI set error!\n"); return -6; } + case CMD_DEVICE_SCAN: + if( rv == 0) + { + return halt_recv_msg.msg.data[1]; + } + else + { + printk(KERN_ERR "IPMI scan error!\n"); + return -6; + } + break; } ipmi_free_recv_msg(&halt_recv_msg); @@ -278,385 +232,385 @@ static struct i2c_device_platform_data ag9064_i2c_device_platform_data[] = { { /* qsfp 1 (0x50) */ .parent = 20, - .info = { SFF8436_INFO(&sff_8436_port[0]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 2 (0x50) */ .parent = 21, - .info = { SFF8436_INFO(&sff_8436_port[1]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 3 (0x50) */ .parent = 22, - .info = { SFF8436_INFO(&sff_8436_port[2]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 4 (0x50) */ .parent = 23, - .info = { SFF8436_INFO(&sff_8436_port[3]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 5 (0x50) */ .parent = 24, - .info = { SFF8436_INFO(&sff_8436_port[4]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 6 (0x50) */ .parent = 25, - .info = { SFF8436_INFO(&sff_8436_port[5]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 7 (0x50) */ .parent = 26, - .info = { SFF8436_INFO(&sff_8436_port[6]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 8 (0x50) */ .parent = 27, - .info = { SFF8436_INFO(&sff_8436_port[7]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 9 (0x50) */ .parent = 28, - .info = { SFF8436_INFO(&sff_8436_port[8]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 10 (0x50) */ .parent = 29, - .info = { SFF8436_INFO(&sff_8436_port[9]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 11 (0x50) */ .parent = 30, - .info = { SFF8436_INFO(&sff_8436_port[10]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 12 (0x50) */ .parent = 31, - .info = { SFF8436_INFO(&sff_8436_port[11]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 13 (0x50) */ .parent = 32, - .info = { SFF8436_INFO(&sff_8436_port[12]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 14 (0x50) */ .parent = 33, - .info = { SFF8436_INFO(&sff_8436_port[13]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 15 (0x50) */ .parent = 34, - .info = { SFF8436_INFO(&sff_8436_port[14]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 16 (0x50) */ .parent = 35, - .info = { SFF8436_INFO(&sff_8436_port[15]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 17 (0x50) */ .parent = 36, - .info = { SFF8436_INFO(&sff_8436_port[16]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 18 (0x50) */ .parent = 37, - .info = { SFF8436_INFO(&sff_8436_port[17]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 19 (0x50) */ .parent = 38, - .info = { SFF8436_INFO(&sff_8436_port[18]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 20 (0x50) */ .parent = 39, - .info = { SFF8436_INFO(&sff_8436_port[19]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 21 (0x50) */ .parent = 40, - .info = { SFF8436_INFO(&sff_8436_port[20]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 22 (0x50) */ .parent = 41, - .info = { SFF8436_INFO(&sff_8436_port[21]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 23 (0x50) */ .parent = 42, - .info = { SFF8436_INFO(&sff_8436_port[22]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 24 (0x50) */ .parent = 43, - .info = { SFF8436_INFO(&sff_8436_port[23]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 25 (0x50) */ .parent = 44, - .info = { SFF8436_INFO(&sff_8436_port[24]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 26 (0x50) */ .parent = 45, - .info = { SFF8436_INFO(&sff_8436_port[25]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 27 (0x50) */ .parent = 46, - .info = { SFF8436_INFO(&sff_8436_port[26]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 28 (0x50) */ .parent = 47, - .info = { SFF8436_INFO(&sff_8436_port[27]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 29 (0x50) */ .parent = 48, - .info = { SFF8436_INFO(&sff_8436_port[28]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 30 (0x50) */ .parent = 49, - .info = { SFF8436_INFO(&sff_8436_port[29]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 31 (0x50) */ .parent = 50, - .info = { SFF8436_INFO(&sff_8436_port[30]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 32 (0x50) */ .parent = 51, - .info = { SFF8436_INFO(&sff_8436_port[31]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 33 (0x50) */ .parent = 52, - .info = { SFF8436_INFO(&sff_8436_port[32]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 34 (0x50) */ .parent = 53, - .info = { SFF8436_INFO(&sff_8436_port[33]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 35 (0x50) */ .parent = 54, - .info = { SFF8436_INFO(&sff_8436_port[34]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 36 (0x50) */ .parent = 55, - .info = { SFF8436_INFO(&sff_8436_port[35]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 37 (0x50) */ .parent = 56, - .info = { SFF8436_INFO(&sff_8436_port[36]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 38 (0x50) */ .parent = 57, - .info = { SFF8436_INFO(&sff_8436_port[37]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 39 (0x50) */ .parent = 58, - .info = { SFF8436_INFO(&sff_8436_port[38]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 40 (0x50) */ .parent = 59, - .info = { SFF8436_INFO(&sff_8436_port[39]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 41 (0x50) */ .parent = 60, - .info = { SFF8436_INFO(&sff_8436_port[40]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 42 (0x50) */ .parent = 61, - .info = { SFF8436_INFO(&sff_8436_port[41]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 43 (0x50) */ .parent = 62, - .info = { SFF8436_INFO(&sff_8436_port[42]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 44 (0x50) */ .parent = 63, - .info = { SFF8436_INFO(&sff_8436_port[43]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 45 (0x50) */ .parent = 64, - .info = { SFF8436_INFO(&sff_8436_port[44]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 46 (0x50) */ .parent = 65, - .info = { SFF8436_INFO(&sff_8436_port[45]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 47 (0x50) */ .parent = 66, - .info = { SFF8436_INFO(&sff_8436_port[46]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 48 (0x50) */ .parent = 67, - .info = { SFF8436_INFO(&sff_8436_port[47]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 49 (0x50) */ .parent = 68, - .info = { SFF8436_INFO(&sff_8436_port[48]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 50 (0x50) */ .parent = 69, - .info = { SFF8436_INFO(&sff_8436_port[49]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 51 (0x50) */ .parent = 70, - .info = { SFF8436_INFO(&sff_8436_port[50]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 52 (0x50) */ .parent = 71, - .info = { SFF8436_INFO(&sff_8436_port[51]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 53 (0x50) */ .parent = 72, - .info = { SFF8436_INFO(&sff_8436_port[52]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 54 (0x50) */ .parent = 73, - .info = { SFF8436_INFO(&sff_8436_port[53]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 55 (0x50) */ .parent = 74, - .info = { SFF8436_INFO(&sff_8436_port[54]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 56 (0x50) */ .parent = 75, - .info = { SFF8436_INFO(&sff_8436_port[55]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 57 (0x50) */ .parent = 76, - .info = { SFF8436_INFO(&sff_8436_port[56]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 58 (0x50) */ .parent = 77, - .info = { SFF8436_INFO(&sff_8436_port[57]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 59 (0x50) */ .parent = 78, - .info = { SFF8436_INFO(&sff_8436_port[58]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 60 (0x50) */ .parent = 79, - .info = { SFF8436_INFO(&sff_8436_port[59]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 61 (0x50) */ .parent = 80, - .info = { SFF8436_INFO(&sff_8436_port[60]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 62 (0x50) */ .parent = 81, - .info = { SFF8436_INFO(&sff_8436_port[61]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 63 (0x50) */ .parent = 82, - .info = { SFF8436_INFO(&sff_8436_port[62]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, { /* qsfp 64 (0x50) */ .parent = 83, - .info = { SFF8436_INFO(&sff_8436_port[63]) }, + .info = { I2C_BOARD_INFO("optoe1", 0x50) }, .client = NULL, }, }; @@ -798,7 +752,6 @@ static struct platform_driver i2c_device_driver = { struct swpld_mux_platform_data { int parent; int base_nr; -// struct i2c_client *cpld; }; struct swpld_mux { @@ -811,7 +764,6 @@ static struct swpld_mux_platform_data ag9064_swpld_mux_platform_data[] = { { .parent = BUS9, .base_nr = BUS9_BASE_NUM, -// .cpld = NULL, }, }; @@ -826,31 +778,7 @@ static struct platform_device ag9064_swpld_mux[] = }, }, }; -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -static int swpld_mux_select(struct i2c_adapter *adap, void *data, u8 chan) -{ - uint8_t cmd_data[4]={0}; - struct swpld_mux *mux = data; - uint8_t set_cmd; - int cmd_data_len; - if ( mux->data.base_nr == BUS9_BASE_NUM ) - { - set_cmd = CMD_SETDATA; - cmd_data[0] = BMC_BUS_5; - cmd_data[1] = SWPLD2_ADDR; - cmd_data[2] = QSFP_PORT_MUX_REG; - cmd_data[3] = chan + 1; - cmd_data_len = sizeof(cmd_data); - return dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); - } - else - { - printk(KERN_ERR "Swpld mux QSFP select port error\n"); - return 0; - } -} -#else static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan) { uint8_t cmd_data[4]={0}; @@ -875,84 +803,7 @@ static int swpld_mux_select(struct i2c_mux_core *muxc, u32 chan) } } -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -static int __init swpld_mux_probe(struct platform_device *pdev) -{ - struct swpld_mux *mux; - struct swpld_mux_platform_data *pdata; - struct i2c_adapter *parent; - int i, ret, dev_num; - - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "SWPLD platform data not found\n"); - return -ENODEV; - } - - parent = i2c_get_adapter(pdata->parent); - if (!parent) { - dev_err(&pdev->dev, "Parent adapter (%d) not found\n", pdata->parent); - return -ENODEV; - } - /* Judge bus number to decide how many devices*/ - switch (pdata->parent) { - case BUS9: - dev_num = BUS9_DEV_NUM; - break; - default : - dev_num = DEFAULT_NUM; - break; - } - - mux = kzalloc(sizeof(*mux), GFP_KERNEL); - if (!mux) { - ret = -ENOMEM; - printk(KERN_ERR "Failed to allocate memory for mux\n"); - goto alloc_failed; - } - - mux->parent = parent; - mux->data = *pdata; - mux->child = kzalloc(sizeof(struct i2c_adapter *) * dev_num, GFP_KERNEL); - if (!mux->child) { - ret = -ENOMEM; - printk(KERN_ERR "Failed to allocate memory for device on mux\n"); - goto alloc_failed2; - } - - for (i = 0; i < dev_num; i++) - { - int nr = pdata->base_nr + i; - unsigned int class = 0; - - mux->child[i] = i2c_add_mux_adapter(parent, &pdev->dev, mux, - nr, i, class, - swpld_mux_select, NULL); - if (!mux->child[i]) - { - ret = -ENODEV; - dev_err(&pdev->dev, "Failed to add adapter %d\n", i); - goto add_adapter_failed; - } - } - - platform_set_drvdata(pdev, mux); - return 0; - -add_adapter_failed: - for (; i > 0; i--) - i2c_del_mux_adapter(mux->child[i - 1]); - kfree(mux->child); -alloc_failed2: - kfree(mux); -alloc_failed: - i2c_put_adapter(parent); - - return ret; -} -#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) static int __init swpld_mux_probe(struct platform_device *pdev) { struct i2c_mux_core *muxc; @@ -1012,56 +863,13 @@ static int __init swpld_mux_probe(struct platform_device *pdev) add_adapter_failed: i2c_mux_del_adapters(muxc); -alloc_failed2: - kfree(mux); alloc_failed: i2c_put_adapter(parent); + kfree(mux); return ret; } -#endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(4,7,0) -static int __exit swpld_mux_remove(struct platform_device *pdev) -{ - int i; - struct swpld_mux *mux = platform_get_drvdata(pdev); - struct swpld_mux_platform_data *pdata; - struct i2c_adapter *parent; - int dev_num; - - pdata = pdev->dev.platform_data; - if (!pdata) { - dev_err(&pdev->dev, "SWPLD platform data not found\n"); - return -ENODEV; - } - - parent = i2c_get_adapter(pdata->parent); - if (!parent) { - dev_err(&pdev->dev, "Parent adapter (%d) not found\n", - pdata->parent); - return -ENODEV; - } - switch (pdata->parent) { - case BUS9: - dev_num = BUS9_DEV_NUM; - break; - default : - dev_num = DEFAULT_NUM; - break; - } - - for (i = 0; i < dev_num; i++) - i2c_del_mux_adapter(mux->child[i]); - - platform_set_drvdata(pdev, NULL); - i2c_put_adapter(mux->parent); - kfree(mux->child); - kfree(mux); - - return 0; -} -#else // #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,7,0) static int __exit swpld_mux_remove(struct platform_device *pdev) { struct i2c_mux_core *muxc = platform_get_drvdata(pdev); @@ -1072,7 +880,6 @@ static int __exit swpld_mux_remove(struct platform_device *pdev) return 0; } -#endif static struct platform_driver swpld_mux_driver = { .probe = swpld_mux_probe, @@ -1085,18 +892,401 @@ static struct platform_driver swpld_mux_driver = { /*---------------- MUX - end ------------- */ +/*---------------- SFP - start ------------- */ + +struct delta_bin_attribute { + struct bin_attribute attr; + int index; +}; + +#define to_delta_attr(x) container_of(x, struct delta_bin_attribute, attr) + +#define BIN_ATTR(_name, _mode, _read, _write, _size, _index) { \ + .attr = { \ + .attr = {.name = __stringify(_name), .mode = _mode }, \ + .read = _read, \ + .write = _write, \ + .size = _size, \ + }, \ + .index = _index, \ +} + +#define DELTA_BIN_ATTR(_name, _mode, _read, _write, _size, _index) \ +struct delta_bin_attribute delta_attr_##_name \ + = BIN_ATTR(_name, _mode, _read, _write, _size, _index) + +static char eeprom_data[EEPROM_SIZE]; + +static ssize_t access_user_space(const char *name, char *buf, size_t len, loff_t offset, int mode) +{ + struct file *fp; + mm_segment_t fs; + loff_t pos = offset; + ssize_t vfs_ret = 0; + int i = 0; + + fs = get_fs(); + set_fs(get_ds()); + + switch(mode) + { + case ATTR_W: + fp = filp_open(name, O_WRONLY, S_IWUGO); + if (IS_ERR(fp)){ + return -ENOENT; + } + for(i = 0; i < ((len / EEPROM_ARCH_SIZE) + 1); i++) + { + len = len - pos; + vfs_ret = vfs_write(fp, buf + pos, len, &pos); + } + break; + case ATTR_R: + fp = filp_open(name, O_RDONLY, S_IRUGO); + if (IS_ERR(fp)){ + return -ENOENT; + } + vfs_ret = vfs_read(fp, buf, len, &pos); + break; + } + + set_fs(fs); + filp_close(fp, NULL); + return vfs_ret; +} + +static ssize_t delta_bin_attr_read(struct file *filp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct delta_bin_attribute *delta_attr = to_delta_attr(attr); + char attr_path[100]; + + dni_klock(); + + memset(buf, 0, count); + switch(delta_attr->index) { + case EEPROM_SFP_1: + case EEPROM_SFP_2: + case EEPROM_SFP_3: + case EEPROM_SFP_4: + case EEPROM_SFP_5: + case EEPROM_SFP_6: + case EEPROM_SFP_7: + case EEPROM_SFP_8: + case EEPROM_SFP_9: + case EEPROM_SFP_10: + case EEPROM_SFP_11: + case EEPROM_SFP_12: + case EEPROM_SFP_13: + case EEPROM_SFP_14: + case EEPROM_SFP_15: + case EEPROM_SFP_16: + case EEPROM_SFP_17: + case EEPROM_SFP_18: + case EEPROM_SFP_19: + case EEPROM_SFP_20: + case EEPROM_SFP_21: + case EEPROM_SFP_22: + case EEPROM_SFP_23: + case EEPROM_SFP_24: + case EEPROM_SFP_25: + case EEPROM_SFP_26: + case EEPROM_SFP_27: + case EEPROM_SFP_28: + case EEPROM_SFP_29: + case EEPROM_SFP_30: + case EEPROM_SFP_31: + case EEPROM_SFP_32: + case EEPROM_SFP_33: + case EEPROM_SFP_34: + case EEPROM_SFP_35: + case EEPROM_SFP_36: + case EEPROM_SFP_37: + case EEPROM_SFP_38: + case EEPROM_SFP_39: + case EEPROM_SFP_40: + case EEPROM_SFP_41: + case EEPROM_SFP_42: + case EEPROM_SFP_43: + case EEPROM_SFP_44: + case EEPROM_SFP_45: + case EEPROM_SFP_46: + case EEPROM_SFP_47: + case EEPROM_SFP_48: + case EEPROM_SFP_49: + case EEPROM_SFP_50: + case EEPROM_SFP_51: + case EEPROM_SFP_52: + case EEPROM_SFP_53: + case EEPROM_SFP_54: + case EEPROM_SFP_55: + case EEPROM_SFP_56: + case EEPROM_SFP_57: + case EEPROM_SFP_58: + case EEPROM_SFP_59: + case EEPROM_SFP_60: + case EEPROM_SFP_61: + case EEPROM_SFP_62: + case EEPROM_SFP_63: + case EEPROM_SFP_64: + sprintf(attr_path, "/sys/bus/i2c/devices/%d-0050/eeprom", delta_attr->index + EEPROM_MASK); + if (access_user_space(attr_path, eeprom_data, EEPROM_SIZE, off, ATTR_R) < 0) { + goto ACCESS_ERROR; + } + count = (count <= EEPROM_SIZE) ? count : EEPROM_SIZE; + memcpy(buf, eeprom_data + off, count); + break; + default: + goto ACCESS_ERROR; + } + dni_kunlock(); + return count; + +ACCESS_ERROR: + dni_kunlock(); + return -ETIMEDOUT; +} + +static ssize_t delta_bin_attr_write(struct file *filp, struct kobject *kobj, struct bin_attribute *attr, + char *buf, loff_t off, size_t count) +{ + struct delta_bin_attribute *delta_attr = to_delta_attr(attr); + char attr_path[100]; + + dni_klock(); + + switch(delta_attr->index){ + case EEPROM_SFP_1: + case EEPROM_SFP_2: + case EEPROM_SFP_3: + case EEPROM_SFP_4: + case EEPROM_SFP_5: + case EEPROM_SFP_6: + case EEPROM_SFP_7: + case EEPROM_SFP_8: + case EEPROM_SFP_9: + case EEPROM_SFP_10: + case EEPROM_SFP_11: + case EEPROM_SFP_12: + case EEPROM_SFP_13: + case EEPROM_SFP_14: + case EEPROM_SFP_15: + case EEPROM_SFP_16: + case EEPROM_SFP_17: + case EEPROM_SFP_18: + case EEPROM_SFP_19: + case EEPROM_SFP_20: + case EEPROM_SFP_21: + case EEPROM_SFP_22: + case EEPROM_SFP_23: + case EEPROM_SFP_24: + case EEPROM_SFP_25: + case EEPROM_SFP_26: + case EEPROM_SFP_27: + case EEPROM_SFP_28: + case EEPROM_SFP_29: + case EEPROM_SFP_30: + case EEPROM_SFP_31: + case EEPROM_SFP_32: + case EEPROM_SFP_33: + case EEPROM_SFP_34: + case EEPROM_SFP_35: + case EEPROM_SFP_36: + case EEPROM_SFP_37: + case EEPROM_SFP_38: + case EEPROM_SFP_39: + case EEPROM_SFP_40: + case EEPROM_SFP_41: + case EEPROM_SFP_42: + case EEPROM_SFP_43: + case EEPROM_SFP_44: + case EEPROM_SFP_45: + case EEPROM_SFP_46: + case EEPROM_SFP_47: + case EEPROM_SFP_48: + case EEPROM_SFP_49: + case EEPROM_SFP_50: + case EEPROM_SFP_51: + case EEPROM_SFP_52: + case EEPROM_SFP_53: + case EEPROM_SFP_54: + case EEPROM_SFP_55: + case EEPROM_SFP_56: + case EEPROM_SFP_57: + case EEPROM_SFP_58: + case EEPROM_SFP_59: + case EEPROM_SFP_60: + case EEPROM_SFP_61: + case EEPROM_SFP_62: + case EEPROM_SFP_63: + case EEPROM_SFP_64: + sprintf(attr_path, "/sys/bus/i2c/devices/%d-0050/eeprom", delta_attr->index + EEPROM_MASK); + if (access_user_space(attr_path, buf, count, off, ATTR_W) < 0) { + goto ACCESS_ERROR; + } + break; + default: + goto ACCESS_ERROR; + } + + dni_kunlock(); + return count; +ACCESS_ERROR: + dni_kunlock(); + return -ETIMEDOUT; +} + +DELTA_BIN_ATTR(eeprom_sfp_1, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_1); +DELTA_BIN_ATTR(eeprom_sfp_2, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_2); +DELTA_BIN_ATTR(eeprom_sfp_3, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_3); +DELTA_BIN_ATTR(eeprom_sfp_4, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_4); +DELTA_BIN_ATTR(eeprom_sfp_5, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_5); +DELTA_BIN_ATTR(eeprom_sfp_6, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_6); +DELTA_BIN_ATTR(eeprom_sfp_7, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_7); +DELTA_BIN_ATTR(eeprom_sfp_8, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_8); +DELTA_BIN_ATTR(eeprom_sfp_9, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_9); +DELTA_BIN_ATTR(eeprom_sfp_10, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_10); +DELTA_BIN_ATTR(eeprom_sfp_11, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_11); +DELTA_BIN_ATTR(eeprom_sfp_12, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_12); +DELTA_BIN_ATTR(eeprom_sfp_13, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_13); +DELTA_BIN_ATTR(eeprom_sfp_14, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_14); +DELTA_BIN_ATTR(eeprom_sfp_15, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_15); +DELTA_BIN_ATTR(eeprom_sfp_16, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_16); +DELTA_BIN_ATTR(eeprom_sfp_17, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_17); +DELTA_BIN_ATTR(eeprom_sfp_18, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_18); +DELTA_BIN_ATTR(eeprom_sfp_19, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_19); +DELTA_BIN_ATTR(eeprom_sfp_20, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_20); +DELTA_BIN_ATTR(eeprom_sfp_21, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_21); +DELTA_BIN_ATTR(eeprom_sfp_22, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_22); +DELTA_BIN_ATTR(eeprom_sfp_23, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_23); +DELTA_BIN_ATTR(eeprom_sfp_24, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_24); +DELTA_BIN_ATTR(eeprom_sfp_25, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_25); +DELTA_BIN_ATTR(eeprom_sfp_26, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_26); +DELTA_BIN_ATTR(eeprom_sfp_27, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_27); +DELTA_BIN_ATTR(eeprom_sfp_28, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_28); +DELTA_BIN_ATTR(eeprom_sfp_29, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_29); +DELTA_BIN_ATTR(eeprom_sfp_30, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_30); +DELTA_BIN_ATTR(eeprom_sfp_31, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_31); +DELTA_BIN_ATTR(eeprom_sfp_32, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_32); +DELTA_BIN_ATTR(eeprom_sfp_33, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_33); +DELTA_BIN_ATTR(eeprom_sfp_34, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_34); +DELTA_BIN_ATTR(eeprom_sfp_35, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_35); +DELTA_BIN_ATTR(eeprom_sfp_36, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_36); +DELTA_BIN_ATTR(eeprom_sfp_37, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_37); +DELTA_BIN_ATTR(eeprom_sfp_38, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_38); +DELTA_BIN_ATTR(eeprom_sfp_39, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_39); +DELTA_BIN_ATTR(eeprom_sfp_40, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_40); +DELTA_BIN_ATTR(eeprom_sfp_41, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_41); +DELTA_BIN_ATTR(eeprom_sfp_42, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_42); +DELTA_BIN_ATTR(eeprom_sfp_43, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_43); +DELTA_BIN_ATTR(eeprom_sfp_44, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_44); +DELTA_BIN_ATTR(eeprom_sfp_45, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_45); +DELTA_BIN_ATTR(eeprom_sfp_46, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_46); +DELTA_BIN_ATTR(eeprom_sfp_47, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_47); +DELTA_BIN_ATTR(eeprom_sfp_48, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_48); +DELTA_BIN_ATTR(eeprom_sfp_49, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_49); +DELTA_BIN_ATTR(eeprom_sfp_50, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_50); +DELTA_BIN_ATTR(eeprom_sfp_51, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_51); +DELTA_BIN_ATTR(eeprom_sfp_52, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_52); +DELTA_BIN_ATTR(eeprom_sfp_53, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_53); +DELTA_BIN_ATTR(eeprom_sfp_54, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_54); +DELTA_BIN_ATTR(eeprom_sfp_55, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_55); +DELTA_BIN_ATTR(eeprom_sfp_56, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_56); +DELTA_BIN_ATTR(eeprom_sfp_57, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_57); +DELTA_BIN_ATTR(eeprom_sfp_58, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_58); +DELTA_BIN_ATTR(eeprom_sfp_59, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_59); +DELTA_BIN_ATTR(eeprom_sfp_60, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_60); +DELTA_BIN_ATTR(eeprom_sfp_61, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_61); +DELTA_BIN_ATTR(eeprom_sfp_62, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_62); +DELTA_BIN_ATTR(eeprom_sfp_63, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_63); +DELTA_BIN_ATTR(eeprom_sfp_64, 0664, delta_bin_attr_read, delta_bin_attr_write, EEPROM_SIZE, EEPROM_SFP_64); + +static struct bin_attribute *sfp_attrs[] = { + &delta_attr_eeprom_sfp_1.attr, + &delta_attr_eeprom_sfp_2.attr, + &delta_attr_eeprom_sfp_3.attr, + &delta_attr_eeprom_sfp_4.attr, + &delta_attr_eeprom_sfp_5.attr, + &delta_attr_eeprom_sfp_6.attr, + &delta_attr_eeprom_sfp_7.attr, + &delta_attr_eeprom_sfp_8.attr, + &delta_attr_eeprom_sfp_9.attr, + &delta_attr_eeprom_sfp_10.attr, + &delta_attr_eeprom_sfp_11.attr, + &delta_attr_eeprom_sfp_12.attr, + &delta_attr_eeprom_sfp_13.attr, + &delta_attr_eeprom_sfp_14.attr, + &delta_attr_eeprom_sfp_15.attr, + &delta_attr_eeprom_sfp_16.attr, + &delta_attr_eeprom_sfp_17.attr, + &delta_attr_eeprom_sfp_18.attr, + &delta_attr_eeprom_sfp_19.attr, + &delta_attr_eeprom_sfp_20.attr, + &delta_attr_eeprom_sfp_21.attr, + &delta_attr_eeprom_sfp_22.attr, + &delta_attr_eeprom_sfp_23.attr, + &delta_attr_eeprom_sfp_24.attr, + &delta_attr_eeprom_sfp_25.attr, + &delta_attr_eeprom_sfp_26.attr, + &delta_attr_eeprom_sfp_27.attr, + &delta_attr_eeprom_sfp_28.attr, + &delta_attr_eeprom_sfp_29.attr, + &delta_attr_eeprom_sfp_30.attr, + &delta_attr_eeprom_sfp_31.attr, + &delta_attr_eeprom_sfp_32.attr, + &delta_attr_eeprom_sfp_33.attr, + &delta_attr_eeprom_sfp_34.attr, + &delta_attr_eeprom_sfp_35.attr, + &delta_attr_eeprom_sfp_36.attr, + &delta_attr_eeprom_sfp_37.attr, + &delta_attr_eeprom_sfp_38.attr, + &delta_attr_eeprom_sfp_39.attr, + &delta_attr_eeprom_sfp_40.attr, + &delta_attr_eeprom_sfp_41.attr, + &delta_attr_eeprom_sfp_42.attr, + &delta_attr_eeprom_sfp_43.attr, + &delta_attr_eeprom_sfp_44.attr, + &delta_attr_eeprom_sfp_45.attr, + &delta_attr_eeprom_sfp_46.attr, + &delta_attr_eeprom_sfp_47.attr, + &delta_attr_eeprom_sfp_48.attr, + &delta_attr_eeprom_sfp_49.attr, + &delta_attr_eeprom_sfp_50.attr, + &delta_attr_eeprom_sfp_51.attr, + &delta_attr_eeprom_sfp_52.attr, + &delta_attr_eeprom_sfp_53.attr, + &delta_attr_eeprom_sfp_54.attr, + &delta_attr_eeprom_sfp_55.attr, + &delta_attr_eeprom_sfp_56.attr, + &delta_attr_eeprom_sfp_57.attr, + &delta_attr_eeprom_sfp_58.attr, + &delta_attr_eeprom_sfp_59.attr, + &delta_attr_eeprom_sfp_60.attr, + &delta_attr_eeprom_sfp_61.attr, + &delta_attr_eeprom_sfp_62.attr, + &delta_attr_eeprom_sfp_63.attr, + &delta_attr_eeprom_sfp_64.attr, + NULL, /* need to NULL terminate the list of attributes */ +}; + +static struct attribute_group sfp_attr_grp = { + .bin_attrs = sfp_attrs, +}; +/*---------------- SFP - end ------------- */ + + /*---------------- module initialization ------------- */ static int __init delta_ag9064_platform_init(void) { -// struct i2c_client *client; struct i2c_adapter *adapter; struct swpld_mux_platform_data *swpld_pdata; -// struct cpld_platform_data * cpld_pdata; int ret,i = 0; printk("ag9064_platform module initialization\n"); + mutex_init(&dni_lock); + adapter = i2c_get_adapter(BUS2); i2c_client_9548 = i2c_new_device(adapter, &i2c_info_pca9548[0]); i2c_put_adapter(adapter); @@ -1136,11 +1326,26 @@ static int __init delta_ag9064_platform_init(void) goto error_ag9064_i2c_device; } } + + kobj_sfp = kobject_create_and_add("sfp", kernel_kobj); + if(!kobj_sfp) + { + return -ENOMEM; + } + ret = sysfs_create_group(kobj_sfp, &sfp_attr_grp); if (ret) - goto error_ag9064_swpld_mux; + { + printk(KERN_WARNING "Fail to create sysfs of sfp group\n"); + goto error_create_sfp_group; + } + + if (ret) + goto error_create_sfp_group; return 0; +error_create_sfp_group: + kobject_put(kobj_sfp); error_ag9064_i2c_device: i--; for (; i >= 0; i--) { @@ -1160,6 +1365,7 @@ static void __exit delta_ag9064_platform_exit(void) { int i = 0; + kobject_put(kobj_sfp); for ( i = 0; i < ARRAY_SIZE(ag9064_i2c_device); i++ ) { platform_device_unregister(&ag9064_i2c_device[i]); } diff --git a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c index cab54a43bb..084f0c74f2 100644 --- a/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c +++ b/platform/broadcom/sonic-platform-modules-delta/ag9064/modules/delta_ag9064_swpld.c @@ -52,6 +52,7 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at uint8_t get_cmd; struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr); + dni_klock(); cmd_data_len = sizeof(cmd_data); get_cmd = CMD_GETDATA; cmd_data[0] = BMC_BUS_5; @@ -62,12 +63,16 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at if (attr->index <= SWPLD4_REG_VALUE){ switch (attr->index) { case SWPLD1_REG_ADDR: + dni_kunlock(); return sprintf(buf, "0x%02x\n", swpld1_reg_addr); case SWPLD2_REG_ADDR: + dni_kunlock(); return sprintf(buf, "0x%02x\n", swpld2_reg_addr); case SWPLD3_REG_ADDR: + dni_kunlock(); return sprintf(buf, "0x%02x\n", swpld3_reg_addr); case SWPLD4_REG_ADDR: + dni_kunlock(); return sprintf(buf, "0x%02x\n", swpld4_reg_addr); case SWPLD1_REG_VALUE: cmd_data[1] = SWPLD1_ADDR; @@ -86,10 +91,12 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at cmd_data[2] = swpld4_reg_addr; break; default: + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } ret = dni_bmc_cmd(get_cmd, cmd_data, cmd_data_len); ret = ret & 0xff; + dni_kunlock(); return sprintf(buf, "0x%02x\n", ret); }else{ @@ -107,6 +114,7 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at cmd_data[1] = SWPLD4_ADDR; break; default: + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } cmd_data[2] = attribute_data[attr->index].reg; @@ -114,23 +122,31 @@ static ssize_t get_swpld_reg(struct device *dev, struct device_attribute *dev_at value = value & mask; switch (mask) { case 0xFF: + dni_kunlock(); return sprintf(buf, "0x%02x%s", value, note); case 0x0F: + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); case 0xF0: value = value >> 4; + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); case 0xC0: value = value >> 6; + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); case 0x30: value = value >> 4; + dni_kunlock(); return sprintf(buf, "0x%01x%s", value, note); default : value = value >> dni_log2(mask); + dni_kunlock(); return sprintf(buf, "%d%s", value, note); } - } + } + dni_kunlock(); + return sprintf(buf, "%d not found", attr->index); } static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_attr, @@ -152,13 +168,17 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at set_cmd = CMD_SETDATA; get_cmd = CMD_GETDATA; + dni_klock(); + err = kstrtoul(buf, 0, &set_data_ul); if (err){ + dni_kunlock(); return err; } if (set_data > 0xff){ printk(KERN_ALERT "address out of range (0x00-0xFF)\n"); + dni_kunlock(); return count; } @@ -170,15 +190,19 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at //reg_addr case SWPLD1_REG_ADDR: swpld1_reg_addr = set_data; + dni_kunlock(); return count; case SWPLD2_REG_ADDR: swpld2_reg_addr = set_data; + dni_kunlock(); return count; case SWPLD3_REG_ADDR: swpld3_reg_addr = set_data; + dni_kunlock(); return count; case SWPLD4_REG_ADDR: swpld4_reg_addr = set_data; + dni_kunlock(); return count; //reg_value case SWPLD1_REG_VALUE: @@ -198,9 +222,11 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at cmd_data[2] = swpld4_reg_addr; break; default : + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + dni_kunlock(); return count; } else{ @@ -222,6 +248,7 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at cmd_data[1] = SWPLD4_ADDR; break; default: + dni_kunlock(); return sprintf(buf, "%d not found", attr->index); } @@ -252,8 +279,11 @@ static ssize_t set_swpld_reg(struct device *dev, struct device_attribute *dev_at set_data = mask_out | (set_data << dni_log2(mask) ); } dni_bmc_cmd(set_cmd, cmd_data, cmd_data_len); + dni_kunlock(); return count; } + dni_kunlock(); + return count; } //SWPLD @@ -524,11 +554,6 @@ static int __init delta_ag9064_swpld_init(void) int ret; printk(KERN_WARNING "ag9064_platform_swpld module initialization\n"); - ret = dni_create_user(); - if (ret != 0){ - printk(KERN_WARNING "Fail to create IPMI user\n"); - } - // set the SWPLD prob and remove ret = platform_driver_register(&swpld1_driver); if (ret) { diff --git a/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.init b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.init index 57665353e3..74137b8b2d 100755 --- a/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.init +++ b/platform/broadcom/sonic-platform-modules-delta/debian/platform-modules-ag9064.init @@ -14,6 +14,18 @@ case "$1" in start) echo -n "Setting up board... " + if [ `grep -c usemsi /etc/init.d/opennsl-modules` = "0" ]; then + sed -i "s/debug=4 dma_debug=1/debug=4 dma_debug=1 usemsi=1/g" /etc/init.d/opennsl-modules + rmmod linux_knet_cb + rmmod linux_bcm_knet + rmmod linux_user_bde + rmmod linux_kernel_bde + /etc/init.d/opennsl-modules start + modprobe linux_kernel_bde + modprobe linux_user_bde + modprobe linux_bcm_knet + modprobe linux_knet_cb + fi depmod -a rmmod i2c-i801 rmmod i2c-ismt