diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/Makefile index 9de6dc2f..20ef0708 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as5712-54x ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/x86-64-accton-as5712-54x-cpld.c b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/x86-64-accton-as5712-54x-cpld.c index a947fca1..ad09168d 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/x86-64-accton-as5712-54x-cpld.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/modules/builds/x86-64-accton-as5712-54x-cpld.c @@ -33,6 +33,7 @@ #include #include #include +#include static struct dmi_system_id as5712_dmi_table[] = { { @@ -266,7 +267,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg)); return len; -} +} static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL); @@ -313,9 +314,11 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client, int idx; #endif data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan, - I2C_CLASS_HWMON | I2C_CLASS_SPD, - accton_i2c_cpld_mux_select_chan, - accton_i2c_cpld_mux_deselect_mux); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + I2C_CLASS_HWMON | I2C_CLASS_SPD, +#endif + accton_i2c_cpld_mux_select_chan, + accton_i2c_cpld_mux_deselect_mux); if (data->virt_adaps[chan] == NULL) { ret = -ENODEV; @@ -463,5 +466,3 @@ MODULE_LICENSE("GPL"); module_init(accton_i2c_cpld_mux_init); module_exit(accton_i2c_cpld_mux_exit); - - diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/lib/x86-64-accton-as5712-54x-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/lib/x86-64-accton-as5712-54x-r0.yml index e03fe786..fa4eea34 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/lib/x86-64-accton-as5712-54x-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/lib/x86-64-accton-as5712-54x-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as5712-54x-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/python/x86_64_accton_as5712_54x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/python/x86_64_accton_as5712_54x_r0/__init__.py index 6e9d0aa0..f5999753 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/python/x86_64_accton_as5712_54x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5712-54x/platform-config/r0/src/python/x86_64_accton_as5712_54x_r0/__init__.py @@ -9,9 +9,9 @@ class OnlPlatform_x86_64_accton_as5712_54x_r0(OnlPlatformAccton, SYS_OBJECT_ID=".5712.54" def baseconfig(self): - self.insmod('cpr_4011_4mxx', required=False) + self.insmod('cpr_4011_4mxx') for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]: - self.insmod("x86-64-accton-as5712-54x-%s.ko" % m, required=False) + self.insmod("x86-64-accton-as5712-54x-%s.ko" % m) ########### initialize I2C bus 0 ########### # initialize CPLDs diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/modules/builds/Makefile index 46ebca16..5385dc37 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as5812-54t ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/lib/x86-64-accton-as5812-54t-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/lib/x86-64-accton-as5812-54t-r0.yml index 62190b5a..0741e829 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/lib/x86-64-accton-as5812-54t-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/lib/x86-64-accton-as5812-54t-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as5812-54t-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/python/x86_64_accton_as5812_54t_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/python/x86_64_accton_as5812_54t_r0/__init__.py index c372a4e7..e5d139c9 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/python/x86_64_accton_as5812_54t_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54t/platform-config/r0/src/python/x86_64_accton_as5812_54t_r0/__init__.py @@ -10,10 +10,10 @@ class OnlPlatform_x86_64_accton_as5812_54t_r0(OnlPlatformAccton, def baseconfig(self): ########### initialize I2C bus 0 ########### - self.insmod("accton_i2c_cpld", required=False) - self.insmod("cpr_4011_4mxx", required=False) + self.insmod("accton_i2c_cpld") + self.insmod("cpr_4011_4mxx") for m in [ "sfp", "psu", "fan", "leds" ]: - self.insmod("x86-64-accton-as5812-54t-%s" % m, required=False) + self.insmod("x86-64-accton-as5812-54t-%s" % m) # initialize CPLDs self.new_i2c_device('accton_i2c_cpld', 0x60, 0) diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/Makefile index 9fc1159e..af7d8095 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as5812-54x ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/x86-64-accton-as5812-54x-cpld.c b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/x86-64-accton-as5812-54x-cpld.c index 710c5202..14e1d860 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/x86-64-accton-as5812-54x-cpld.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/modules/builds/x86-64-accton-as5812-54x-cpld.c @@ -34,6 +34,7 @@ #include #include #include +#include static struct dmi_system_id as5812_54x_dmi_table[] = { { @@ -228,7 +229,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg)); return len; -} +} static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL); @@ -262,9 +263,11 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client, /* Now create an adapter for each channel */ for (chan = 0; chan < chips[data->type].nchans; chan++) { data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan, - I2C_CLASS_HWMON | I2C_CLASS_SPD, - accton_i2c_cpld_mux_select_chan, - accton_i2c_cpld_mux_deselect_mux); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + I2C_CLASS_HWMON | I2C_CLASS_SPD, +#endif + accton_i2c_cpld_mux_select_chan, + accton_i2c_cpld_mux_deselect_mux); if (data->virt_adaps[chan] == NULL) { ret = -ENODEV; @@ -391,5 +394,3 @@ MODULE_LICENSE("GPL"); module_init(accton_i2c_cpld_mux_init); module_exit(accton_i2c_cpld_mux_exit); - - diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/lib/x86-64-accton-as5812-54x-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/lib/x86-64-accton-as5812-54x-r0.yml index 014340dc..d0f26744 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/lib/x86-64-accton-as5812-54x-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/lib/x86-64-accton-as5812-54x-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as5812-54x-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/python/x86_64_accton_as5812_54x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/python/x86_64_accton_as5812_54x_r0/__init__.py index f6c28147..b71c2674 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/python/x86_64_accton_as5812_54x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as5812-54x/platform-config/r0/src/python/x86_64_accton_as5812_54x_r0/__init__.py @@ -9,9 +9,9 @@ class OnlPlatform_x86_64_accton_as5812_54x_r0(OnlPlatformAccton, SYS_OBJECT_ID=".5812.54.1" def baseconfig(self): - self.insmod('cpr_4011_4mxx', required=False) + self.insmod('cpr_4011_4mxx') for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]: - self.insmod("x86-64-accton-as5812-54x-%s.ko" % m, required=False) + self.insmod("x86-64-accton-as5812-54x-%s.ko" % m) ########### initialize I2C bus 0 ########### diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/Makefile index 7a8c22ac..b1af96e3 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as6712-32x ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/x86-64-accton-as6712-32x-cpld.c b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/x86-64-accton-as6712-32x-cpld.c index e37d06bc..d1c1892e 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/x86-64-accton-as6712-32x-cpld.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/modules/builds/x86-64-accton-as6712-32x-cpld.c @@ -33,6 +33,7 @@ #include #include #include +#include static struct dmi_system_id as6712_dmi_table[] = { { @@ -132,7 +133,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap, buf[1] = val; msg.buf = buf; ret = adap->algo->master_xfer(adap, &msg, 1); - } + } else { union i2c_smbus_data data; ret = adap->algo->smbus_xfer(adap, client->addr, @@ -157,7 +158,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap, /* Retry automatically on arbitration loss */ orig_jiffies = jiffies; for (res = 0, try = 0; try <= adap->retries; try++) { - res = adap->algo->smbus_xfer(adap, client->addr, flags, + res = adap->algo->smbus_xfer(adap, client->addr, flags, I2C_SMBUS_WRITE, 0x2, I2C_SMBUS_BYTE_DATA, &data); if (res != -EAGAIN) @@ -196,21 +197,21 @@ static int accton_i2c_cpld_mux_deselect_mux(struct i2c_adapter *adap, /* Deselect active channel */ data->last_chan = chips[data->type].deselectChan; - + return accton_i2c_cpld_mux_reg_write(adap, client, data->last_chan); } static void accton_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); @@ -221,24 +222,24 @@ static void accton_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); } @@ -252,7 +253,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg)); return len; -} +} static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL); @@ -294,17 +295,19 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client, data->last_chan = chips[data->type].deselectChan; /* force the first selection */ /* Now create an adapter for each channel */ - for (chan = 0; chan < chips[data->type].nchans; chan++) { + for (chan = 0; chan < chips[data->type].nchans; chan++) { data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan, - I2C_CLASS_HWMON | I2C_CLASS_SPD, - accton_i2c_cpld_mux_select_chan, - accton_i2c_cpld_mux_deselect_mux); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + I2C_CLASS_HWMON | I2C_CLASS_SPD, +#endif + accton_i2c_cpld_mux_select_chan, + accton_i2c_cpld_mux_deselect_mux); if (data->virt_adaps[chan] == NULL) { ret = -ENODEV; dev_err(&client->dev, "failed to register multiplexed adapter %d\n", chan); goto virt_reg_failed; - } + } } dev_info(&client->dev, "registered %d multiplexed busses for I2C mux %s\n", @@ -338,14 +341,14 @@ static int accton_i2c_cpld_mux_remove(struct i2c_client *client) for (chan = 0; chan < chip->nchans; ++chan) { if (data->virt_adaps[chan]) { - i2c_del_mux_adapter(data->virt_adaps[chan]); + i2c_del_mux_adapter(data->virt_adaps[chan]); data->virt_adaps[chan] = NULL; } } kfree(data); accton_i2c_cpld_remove_client(client); - + return 0; } @@ -354,19 +357,19 @@ int as6712_32x_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; - + 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; @@ -378,19 +381,19 @@ int as6712_32x_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; - + 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; @@ -424,5 +427,3 @@ MODULE_LICENSE("GPL"); module_init(accton_i2c_cpld_mux_init); module_exit(accton_i2c_cpld_mux_exit); - - diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/lib/x86-64-accton-as6712-32x-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/lib/x86-64-accton-as6712-32x-r0.yml index f685f030..beb9db4c 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/lib/x86-64-accton-as6712-32x-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/lib/x86-64-accton-as6712-32x-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as6712-32x-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/python/x86_64_accton_as6712_32x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/python/x86_64_accton_as6712_32x_r0/__init__.py index 9ac98c66..a27d74e5 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/python/x86_64_accton_as6712_32x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6712-32x/platform-config/r0/src/python/x86_64_accton_as6712_32x_r0/__init__.py @@ -8,9 +8,9 @@ class OnlPlatform_x86_64_accton_as6712_32x_r0(OnlPlatformAccton, SYS_OBJECT_ID=".6712.32" def baseconfig(self): - self.insmod('cpr_4011_4mxx', required=False) + self.insmod('cpr_4011_4mxx') for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]: - self.insmod("x86-64-accton-as6712-32x-%s.ko" % m, required=False) + self.insmod("x86-64-accton-as6712-32x-%s.ko" % m) ########### initialize I2C bus 0 ########### # initialize CPLD diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/Makefile index 81d692dd..0ee5e509 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as6812-32x ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/x86-64-accton-as6812-32x-cpld.c b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/x86-64-accton-as6812-32x-cpld.c index dafa5e1b..6c146767 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/x86-64-accton-as6812-32x-cpld.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/modules/builds/x86-64-accton-as6812-32x-cpld.c @@ -34,6 +34,7 @@ #include #include #include +#include static struct dmi_system_id as6812_dmi_table[] = { { @@ -132,7 +133,7 @@ static int accton_i2c_cpld_mux_reg_write(struct i2c_adapter *adap, /* Retry automatically on arbitration loss */ orig_jiffies = jiffies; for (res = 0, try = 0; try <= adap->retries; try++) { - res = adap->algo->smbus_xfer(adap, client->addr, flags, + res = adap->algo->smbus_xfer(adap, client->addr, flags, I2C_SMBUS_WRITE, 0x2, I2C_SMBUS_BYTE_DATA, &data); if (res != -EAGAIN) @@ -170,21 +171,21 @@ static int accton_i2c_cpld_mux_deselect_mux(struct i2c_adapter *adap, /* Deselect active channel */ data->last_chan = chips[data->type].deselectChan; - + return accton_i2c_cpld_mux_reg_write(adap, client, data->last_chan); } static void accton_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); @@ -195,24 +196,24 @@ static void accton_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); } @@ -226,7 +227,7 @@ static ssize_t show_cpld_version(struct device *dev, struct device_attribute *at len = sprintf(buf, "%d", i2c_smbus_read_byte_data(client, reg)); return len; -} +} static struct device_attribute ver = __ATTR(version, 0600, show_cpld_version, NULL); @@ -258,17 +259,19 @@ static int accton_i2c_cpld_mux_probe(struct i2c_client *client, data->last_chan = chips[data->type].deselectChan; /* force the first selection */ /* Now create an adapter for each channel */ - for (chan = 0; chan < chips[data->type].nchans; chan++) { + for (chan = 0; chan < chips[data->type].nchans; chan++) { data->virt_adaps[chan] = i2c_add_mux_adapter(adap, &client->dev, client, 0, chan, - I2C_CLASS_HWMON | I2C_CLASS_SPD, - accton_i2c_cpld_mux_select_chan, - accton_i2c_cpld_mux_deselect_mux); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,7,0) + I2C_CLASS_HWMON | I2C_CLASS_SPD, +#endif + accton_i2c_cpld_mux_select_chan, + accton_i2c_cpld_mux_deselect_mux); if (data->virt_adaps[chan] == NULL) { ret = -ENODEV; dev_err(&client->dev, "failed to register multiplexed adapter %d\n", chan); goto virt_reg_failed; - } + } } dev_info(&client->dev, "registered %d multiplexed busses for I2C mux %s\n", @@ -302,14 +305,14 @@ static int accton_i2c_cpld_mux_remove(struct i2c_client *client) for (chan = 0; chan < chip->nchans; ++chan) { if (data->virt_adaps[chan]) { - i2c_del_mux_adapter(data->virt_adaps[chan]); + i2c_del_mux_adapter(data->virt_adaps[chan]); data->virt_adaps[chan] = NULL; } } kfree(data); accton_i2c_cpld_remove_client(client); - + return 0; } @@ -318,19 +321,19 @@ int as6812_32x_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; - + 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; @@ -342,19 +345,19 @@ int as6812_32x_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; - + 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; diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/lib/x86-64-accton-as6812-32x-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/lib/x86-64-accton-as6812-32x-r0.yml index 18dda3ba..97f6b35a 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/lib/x86-64-accton-as6812-32x-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/lib/x86-64-accton-as6812-32x-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as6812-32x-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/python/x86_64_accton_as6812_32x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/python/x86_64_accton_as6812_32x_r0/__init__.py index 2dd65d5d..edc5c26a 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/python/x86_64_accton_as6812_32x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as6812-32x/platform-config/r0/src/python/x86_64_accton_as6812_32x_r0/__init__.py @@ -8,10 +8,9 @@ class OnlPlatform_x86_64_accton_as6812_32x_r0(OnlPlatformAccton, SYS_OBJECT_ID=".6812.32" def baseconfig(self): - - self.insmod('cpr_4011_4mxx', required=False) + self.insmod('cpr_4011_4mxx') for m in [ 'cpld', 'fan', 'psu', 'leds', 'sfp' ]: - self.insmod("x86-64-accton-as6812-32x-%s.ko" % m, required=False) + self.insmod("x86-64-accton-as6812-32x-%s.ko" % m) ########### initialize I2C bus 0 ########### # initialize CPLD diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/Makefile b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/Makefile index 3be04999..35af35dc 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/Makefile @@ -1,4 +1,4 @@ -KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 +KERNELS := onl-kernel-3.16-lts-x86-64-all:amd64 onl-kernel-3.2-deb7-x86-64-all:amd64 KMODULES := $(wildcard *.c) PLATFORM := x86-64-accton-as7712-32x ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-fan.c b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-fan.c index dae9a9e7..74c577d4 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-fan.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-fan.c @@ -43,6 +43,7 @@ extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value); */ static const u8 fan_reg[] = { 0x0F, /* fan 1-6 present status */ + 0x10, /* fan 1-6 direction(0:B2F 1:F2B) */ 0x11, /* fan PWM(for all fan) */ 0x12, /* front fan 1 speed(rpm) */ 0x13, /* front fan 2 speed(rpm) */ @@ -78,6 +79,7 @@ enum fan_id { enum sysfs_fan_attributes { FAN_PRESENT_REG, + FAN_DIRECTION_REG, FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ FAN1_FRONT_SPEED_RPM, FAN2_FRONT_SPEED_RPM, @@ -91,6 +93,12 @@ enum sysfs_fan_attributes { FAN4_REAR_SPEED_RPM, FAN5_REAR_SPEED_RPM, FAN6_REAR_SPEED_RPM, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, FAN1_PRESENT, FAN2_PRESENT, FAN3_PRESENT, @@ -150,6 +158,13 @@ DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(3); DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(4); DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(5); DECLARE_FAN_PRESENT_SENSOR_DEV_ATTR(6); +/* 6 fan direction attribute in this platform */ +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6); /* 1 fan duty cycle attribute in this platform */ DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); @@ -173,6 +188,12 @@ static struct attribute *as7712_32x_fan_attributes[] = { DECLARE_FAN_PRESENT_ATTR(4), DECLARE_FAN_PRESENT_ATTR(5), DECLARE_FAN_PRESENT_ATTR(6), + DECLARE_FAN_DIRECTION_ATTR(1), + DECLARE_FAN_DIRECTION_ATTR(2), + DECLARE_FAN_DIRECTION_ATTR(3), + DECLARE_FAN_DIRECTION_ATTR(4), + DECLARE_FAN_DIRECTION_ATTR(5), + DECLARE_FAN_DIRECTION_ATTR(6), DECLARE_FAN_DUTY_CYCLE_ATTR(), NULL }; @@ -209,6 +230,14 @@ static u32 reg_val_to_speed_rpm(u8 reg_val) return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP; } +static u8 reg_val_to_direction(u8 reg_val, enum fan_id id) +{ + u8 mask = (1 << id); + + reg_val &= mask; + + return reg_val ? 1 : 0; +} static u8 reg_val_to_is_present(u8 reg_val, enum fan_id id) { u8 mask = (1 << id); @@ -299,6 +328,16 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, case FAN6_FAULT: ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT)); break; + case FAN1_DIRECTION: + case FAN2_DIRECTION: + case FAN3_DIRECTION: + case FAN4_DIRECTION: + case FAN5_DIRECTION: + case FAN6_DIRECTION: + ret = sprintf(buf, "%d\n", + reg_val_to_direction(data->reg_val[FAN_DIRECTION_REG], + attr->index - FAN1_DIRECTION)); + break; default: break; } @@ -430,10 +469,10 @@ static struct i2c_driver as7712_32x_fan_driver = { static int __init as7712_32x_fan_init(void) { - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } return i2c_add_driver(&as7712_32x_fan_driver); } diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-psu.c b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-psu.c index 4de2db3a..65f7a16a 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-psu.c +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/modules/builds/x86-64-accton-as7712-32x-psu.c @@ -34,14 +34,18 @@ #include #include +#define MAX_MODEL_NAME 16 + +#define DC12V_FAN_DIR_OFFSET 0x34 +#define DC12V_FAN_DIR_LEN 3 + static ssize_t show_status(struct device *dev, struct device_attribute *da, char *buf); -static ssize_t show_model_name(struct device *dev, struct device_attribute *da, char *buf); static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 *data,int data_len); extern int accton_i2c_cpld_read(unsigned short cpld_addr, u8 reg); /* Addresses scanned */ -static const unsigned short normal_i2c[] = { 0x50, 0x53, I2C_CLIENT_END }; +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; /* Each client has this additional data */ @@ -52,27 +56,32 @@ struct as7712_32x_psu_data { unsigned long last_updated; /* In jiffies */ u8 index; /* PSU index */ u8 status; /* Status(present/power_good) register read from CPLD */ - char model_name[9]; /* Model name, read from eeprom */ + char model_name[MAX_MODEL_NAME]; /* Model name, read from eeprom */ + char fan_dir[DC12V_FAN_DIR_LEN+1]; /* DC12V fan direction */ }; +static ssize_t show_string(struct device *dev, struct device_attribute *da, char *buf); static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev); enum as7712_32x_psu_sysfs_attributes { PSU_PRESENT, PSU_MODEL_NAME, - PSU_POWER_GOOD + PSU_POWER_GOOD, + PSU_FAN_DIR /* For DC12V only */ }; /* sysfs attributes for hwmon */ -static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT); -static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_model_name,NULL, PSU_MODEL_NAME); -static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(psu_present, S_IRUGO, show_status, NULL, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(psu_model_name, S_IRUGO, show_string, NULL, PSU_MODEL_NAME); +static SENSOR_DEVICE_ATTR(psu_power_good, S_IRUGO, show_status, NULL, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IRUGO, show_string, NULL, PSU_FAN_DIR); static struct attribute *as7712_32x_psu_attributes[] = { &sensor_dev_attr_psu_present.dev_attr.attr, &sensor_dev_attr_psu_model_name.dev_attr.attr, &sensor_dev_attr_psu_power_good.dev_attr.attr, + &sensor_dev_attr_psu_fan_dir.dev_attr.attr, NULL }; @@ -83,6 +92,10 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da, struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); u8 status = 0; + if (!data->valid) { + return -EIO; + } + if (attr->index == PSU_PRESENT) { status = !(data->status >> (1-data->index) & 0x1); } @@ -93,12 +106,25 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da, return sprintf(buf, "%d\n", status); } -static ssize_t show_model_name(struct device *dev, struct device_attribute *da, +static ssize_t show_string(struct device *dev, struct device_attribute *da, char *buf) { + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); struct as7712_32x_psu_data *data = as7712_32x_psu_update_device(dev); - - return sprintf(buf, "%s\n", data->model_name); + char *ptr = NULL; + + if (!data->valid) { + return -EIO; + } + + if (attr->index == PSU_MODEL_NAME) { + ptr = data->model_name; + } + else { /* PSU_FAN_DIR */ + ptr = data->fan_dir; + } + + return sprintf(buf, "%s\n", ptr); } static const struct attribute_group as7712_32x_psu_group = { @@ -195,30 +221,83 @@ static int as7712_32x_psu_read_block(struct i2c_client *client, u8 command, u8 * { int result = 0; int retry_count = 5; - - while (retry_count) { - retry_count--; - - result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); - - if (unlikely(result < 0)) { - msleep(10); - continue; - } - - if (unlikely(result != data_len)) { - result = -EIO; - msleep(10); + + while (retry_count) { + retry_count--; + + result = i2c_smbus_read_i2c_block_data(client, command, data_len, data); + + if (unlikely(result < 0)) { + msleep(10); continue; } - - result = 0; - break; - } - + + if (unlikely(result != data_len)) { + result = -EIO; + msleep(10); + continue; + } + + result = 0; + break; + } + return result; } +enum psu_type { + PSU_TYPE_AC_110V, + PSU_TYPE_DC_48V, + PSU_TYPE_DC_12V +}; + +struct model_name_info { + enum psu_type type; + u8 offset; + u8 length; + char* model_name; +}; + +struct model_name_info models[] = { +{PSU_TYPE_AC_110V, 0x20, 8, "YM-2651Y"}, +{PSU_TYPE_DC_48V, 0x20, 8, "YM-2651V"}, +{PSU_TYPE_DC_12V, 0x00, 11, "PSU-12V-750"}, +}; + +static int as7712_32x_psu_model_name_get(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct as7712_32x_psu_data *data = i2c_get_clientdata(client); + int i, status; + + for (i = 0; i < ARRAY_SIZE(models); i++) { + memset(data->model_name, 0, sizeof(data->model_name)); + + status = as7712_32x_psu_read_block(client, models[i].offset, + data->model_name, models[i].length); + if (status < 0) { + data->model_name[0] = '\0'; + dev_dbg(&client->dev, "unable to read model name from (0x%x) offset(0x%x)\n", + client->addr, models[i].offset); + return status; + } + else { + data->model_name[models[i].length] = '\0'; + } + + /* Determine if the model name is known, if not, read next index + */ + if (strncmp(data->model_name, models[i].model_name, models[i].length) == 0) { + return 0; + } + else { + data->model_name[0] = '\0'; + } + } + + return -ENODATA; +} + static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); @@ -229,8 +308,9 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d if (time_after(jiffies, data->last_updated + HZ + HZ / 2) || !data->valid) { int status; - int power_good = 0; + int power_good = 0; + data->valid = 0; dev_dbg(&client->dev, "Starting as7712_32x update\n"); /* Read psu status */ @@ -238,25 +318,35 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d if (status < 0) { dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status); + goto exit; } else { data->status = status; } - + /* Read model name */ memset(data->model_name, 0, sizeof(data->model_name)); + memset(data->fan_dir, 0, sizeof(data->fan_dir)); power_good = (data->status >> (3-data->index) & 0x1); - - if (power_good) { - status = as7712_32x_psu_read_block(client, 0x20, data->model_name, - ARRAY_SIZE(data->model_name)-1); - if (status < 0) { - data->model_name[0] = '\0'; - dev_dbg(&client->dev, "unable to read model name from (0x%x)\n", client->addr); + if (power_good) { + if (as7712_32x_psu_model_name_get(dev) < 0) { + goto exit; } - else { - data->model_name[ARRAY_SIZE(data->model_name)-1] = '\0'; + + if (strncmp(data->model_name, + models[PSU_TYPE_DC_12V].model_name, + models[PSU_TYPE_DC_12V].length) == 0) { + /* Read fan direction */ + status = as7712_32x_psu_read_block(client, DC12V_FAN_DIR_OFFSET, + data->fan_dir, DC12V_FAN_DIR_LEN); + + if (status < 0) { + data->fan_dir[0] = '\0'; + dev_dbg(&client->dev, "unable to read fan direction from (0x%x) offset(0x%x)\n", + client->addr, DC12V_FAN_DIR_OFFSET); + goto exit; + } } } @@ -264,6 +354,7 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d data->valid = 1; } +exit: mutex_unlock(&data->update_lock); return data; @@ -271,10 +362,10 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d static int __init as7712_32x_psu_init(void) { - extern int platform_accton_as7712_32x(void); - if (!platform_accton_as7712_32x()) { - return -ENODEV; - } + extern int platform_accton_as7712_32x(void); + if (!platform_accton_as7712_32x()) { + return -ENODEV; + } return i2c_add_driver(&as7712_32x_psu_driver); } diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/lib/x86-64-accton-as7712-32x-r0.yml b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/lib/x86-64-accton-as7712-32x-r0.yml index 1aef0594..2352f103 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/lib/x86-64-accton-as7712-32x-r0.yml +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/lib/x86-64-accton-as7712-32x-r0.yml @@ -18,7 +18,7 @@ x86-64-accton-as7712-32x-r0: --stop=1 kernel: - <<: *kernel-3-16 + <<: *kernel-3-2 args: >- nopat diff --git a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/python/x86_64_accton_as7712_32x_r0/__init__.py b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/python/x86_64_accton_as7712_32x_r0/__init__.py index 4040d2a7..e460484f 100644 --- a/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/python/x86_64_accton_as7712_32x_r0/__init__.py +++ b/packages/platforms/accton/x86-64/x86-64-accton-as7712-32x/platform-config/r0/src/python/x86_64_accton_as7712_32x_r0/__init__.py @@ -11,7 +11,7 @@ class OnlPlatform_x86_64_accton_as7712_32x_r0(OnlPlatformAccton, self.insmod('ym2651y') self.insmod('accton_i2c_cpld') for m in [ 'fan', 'psu', 'leds', 'sfp' ]: - self.insmod("x86-64-accton-as7712-32x-%s.ko" % m, required=False) + self.insmod("x86-64-accton-as7712-32x-%s.ko" % m) ########### initialize I2C bus 0 ########### self.new_i2c_devices([