[as7712-32x] Add support for OOM

This commit is contained in:
Brandon Chuang
2017-12-28 15:10:10 +08:00
parent b77d4dde8e
commit cfdcc95d70
7 changed files with 1794 additions and 1319 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,558 @@
/*
* A hwmon driver for the as7712_32x_cpld
*
* Copyright (C) 2013 Accton Technology Corporation.
* Brandon Chuang <brandon_chuang@accton.com.tw>
*
* Based on ad7414.c
* Copyright 2006 Stefan Roese <sr at denx.de>, DENX Software Engineering
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/i2c.h>
#include <linux/hwmon.h>
#include <linux/hwmon-sysfs.h>
#include <linux/err.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/list.h>
static LIST_HEAD(cpld_client_list);
static struct mutex list_lock;
struct cpld_client_node {
struct i2c_client *client;
struct list_head list;
};
#define I2C_RW_RETRY_COUNT 10
#define I2C_RW_RETRY_INTERVAL 60 /* ms */
static ssize_t show_present(struct device *dev, struct device_attribute *da,
char *buf);
static ssize_t show_present_all(struct device *dev, struct device_attribute *da,
char *buf);
static ssize_t access(struct device *dev, struct device_attribute *da,
const char *buf, size_t count);
static ssize_t show_version(struct device *dev, struct device_attribute *da,
char *buf);
static int as7712_32x_cpld_read_internal(struct i2c_client *client, u8 reg);
static int as7712_32x_cpld_write_internal(struct i2c_client *client, u8 reg, u8 value);
struct as7712_32x_cpld_data {
struct device *hwmon_dev;
struct mutex update_lock;
};
/* Addresses scanned for as7712_32x_cpld
*/
static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
#define TRANSCEIVER_PRESENT_ATTR_ID(index) MODULE_PRESENT_##index
enum as7712_32x_cpld_sysfs_attributes {
CPLD_VERSION,
ACCESS,
MODULE_PRESENT_ALL,
/* transceiver attributes */
TRANSCEIVER_PRESENT_ATTR_ID(1),
TRANSCEIVER_PRESENT_ATTR_ID(2),
TRANSCEIVER_PRESENT_ATTR_ID(3),
TRANSCEIVER_PRESENT_ATTR_ID(4),
TRANSCEIVER_PRESENT_ATTR_ID(5),
TRANSCEIVER_PRESENT_ATTR_ID(6),
TRANSCEIVER_PRESENT_ATTR_ID(7),
TRANSCEIVER_PRESENT_ATTR_ID(8),
TRANSCEIVER_PRESENT_ATTR_ID(9),
TRANSCEIVER_PRESENT_ATTR_ID(10),
TRANSCEIVER_PRESENT_ATTR_ID(11),
TRANSCEIVER_PRESENT_ATTR_ID(12),
TRANSCEIVER_PRESENT_ATTR_ID(13),
TRANSCEIVER_PRESENT_ATTR_ID(14),
TRANSCEIVER_PRESENT_ATTR_ID(15),
TRANSCEIVER_PRESENT_ATTR_ID(16),
TRANSCEIVER_PRESENT_ATTR_ID(17),
TRANSCEIVER_PRESENT_ATTR_ID(18),
TRANSCEIVER_PRESENT_ATTR_ID(19),
TRANSCEIVER_PRESENT_ATTR_ID(20),
TRANSCEIVER_PRESENT_ATTR_ID(21),
TRANSCEIVER_PRESENT_ATTR_ID(22),
TRANSCEIVER_PRESENT_ATTR_ID(23),
TRANSCEIVER_PRESENT_ATTR_ID(24),
TRANSCEIVER_PRESENT_ATTR_ID(25),
TRANSCEIVER_PRESENT_ATTR_ID(26),
TRANSCEIVER_PRESENT_ATTR_ID(27),
TRANSCEIVER_PRESENT_ATTR_ID(28),
TRANSCEIVER_PRESENT_ATTR_ID(29),
TRANSCEIVER_PRESENT_ATTR_ID(30),
TRANSCEIVER_PRESENT_ATTR_ID(31),
TRANSCEIVER_PRESENT_ATTR_ID(32),
};
/* sysfs attributes for hwmon
*/
/* transceiver attributes */
#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(index) \
static SENSOR_DEVICE_ATTR(module_present_##index, S_IRUGO, show_present, NULL, MODULE_PRESENT_##index)
#define DECLARE_TRANSCEIVER_ATTR(index) &sensor_dev_attr_module_present_##index.dev_attr.attr
static SENSOR_DEVICE_ATTR(version, S_IRUGO, show_version, NULL, CPLD_VERSION);
static SENSOR_DEVICE_ATTR(access, S_IWUSR, NULL, access, ACCESS);
/* transceiver attributes */
static SENSOR_DEVICE_ATTR(module_present_all, S_IRUGO, show_present_all, NULL, MODULE_PRESENT_ALL);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(1);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(2);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(3);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(4);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(5);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(6);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(7);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(8);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(9);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(10);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(11);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(12);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(13);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(14);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(15);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(16);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(17);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(18);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(19);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(20);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(21);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(22);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(23);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(24);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(25);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(26);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(27);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(28);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(29);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(30);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(31);
DECLARE_TRANSCEIVER_SENSOR_DEVICE_ATTR(32);
static struct attribute *as7712_32x_cpld_attributes[] = {
&sensor_dev_attr_version.dev_attr.attr,
&sensor_dev_attr_access.dev_attr.attr,
/* transceiver attributes */
&sensor_dev_attr_module_present_all.dev_attr.attr,
DECLARE_TRANSCEIVER_ATTR(1),
DECLARE_TRANSCEIVER_ATTR(2),
DECLARE_TRANSCEIVER_ATTR(3),
DECLARE_TRANSCEIVER_ATTR(4),
DECLARE_TRANSCEIVER_ATTR(5),
DECLARE_TRANSCEIVER_ATTR(6),
DECLARE_TRANSCEIVER_ATTR(7),
DECLARE_TRANSCEIVER_ATTR(8),
DECLARE_TRANSCEIVER_ATTR(9),
DECLARE_TRANSCEIVER_ATTR(10),
DECLARE_TRANSCEIVER_ATTR(11),
DECLARE_TRANSCEIVER_ATTR(12),
DECLARE_TRANSCEIVER_ATTR(13),
DECLARE_TRANSCEIVER_ATTR(14),
DECLARE_TRANSCEIVER_ATTR(15),
DECLARE_TRANSCEIVER_ATTR(16),
DECLARE_TRANSCEIVER_ATTR(17),
DECLARE_TRANSCEIVER_ATTR(18),
DECLARE_TRANSCEIVER_ATTR(19),
DECLARE_TRANSCEIVER_ATTR(20),
DECLARE_TRANSCEIVER_ATTR(21),
DECLARE_TRANSCEIVER_ATTR(22),
DECLARE_TRANSCEIVER_ATTR(23),
DECLARE_TRANSCEIVER_ATTR(24),
DECLARE_TRANSCEIVER_ATTR(25),
DECLARE_TRANSCEIVER_ATTR(26),
DECLARE_TRANSCEIVER_ATTR(27),
DECLARE_TRANSCEIVER_ATTR(28),
DECLARE_TRANSCEIVER_ATTR(29),
DECLARE_TRANSCEIVER_ATTR(30),
DECLARE_TRANSCEIVER_ATTR(31),
DECLARE_TRANSCEIVER_ATTR(32),
NULL
};
static const struct attribute_group as7712_32x_cpld_group = {
.attrs = as7712_32x_cpld_attributes,
};
static ssize_t show_present_all(struct device *dev, struct device_attribute *da,
char *buf)
{
int i, status;
u8 values[4] = {0};
u8 regs[] = {0x30, 0x31, 0x32, 0x33};
struct i2c_client *client = to_i2c_client(dev);
struct as7712_32x_cpld_data *data = i2c_get_clientdata(client);
mutex_lock(&data->update_lock);
for (i = 0; i < ARRAY_SIZE(regs); i++) {
status = as7712_32x_cpld_read_internal(client, regs[i]);
if (status < 0) {
goto exit;
}
values[i] = ~(u8)status;
}
mutex_unlock(&data->update_lock);
/* Return values 1 -> 32 in order */
return sprintf(buf, "%.2x %.2x %.2x %.2x\n",
values[0], values[1], values[2],
values[3]);
exit:
mutex_unlock(&data->update_lock);
return status;
}
static ssize_t show_present(struct device *dev, struct device_attribute *da,
char *buf)
{
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *client = to_i2c_client(dev);
struct as7712_32x_cpld_data *data = i2c_get_clientdata(client);
int status = 0;
u8 reg = 0, mask = 0;
switch (attr->index) {
case MODULE_PRESENT_1 ... MODULE_PRESENT_8:
reg = 0x30;
mask = 0x1 << (attr->index - MODULE_PRESENT_1);
break;
case MODULE_PRESENT_9 ... MODULE_PRESENT_16:
reg = 0x31;
mask = 0x1 << (attr->index - MODULE_PRESENT_9);
break;
case MODULE_PRESENT_17 ... MODULE_PRESENT_24:
reg = 0x32;
mask = 0x1 << (attr->index - MODULE_PRESENT_17);
break;
case MODULE_PRESENT_25 ... MODULE_PRESENT_32:
reg = 0x33;
mask = 0x1 << (attr->index - MODULE_PRESENT_25);
break;
default:
return 0;
}
mutex_lock(&data->update_lock);
status = as7712_32x_cpld_read_internal(client, reg);
if (unlikely(status < 0)) {
goto exit;
}
mutex_unlock(&data->update_lock);
return sprintf(buf, "%d\n", !(status & mask));
exit:
mutex_unlock(&data->update_lock);
return status;
}
static ssize_t show_version(struct device *dev, struct device_attribute *da,
char *buf)
{
u8 reg = 0, mask = 0;
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
struct i2c_client *client = to_i2c_client(dev);
struct as7712_32x_cpld_data *data = i2c_get_clientdata(client);
int status = 0;
switch (attr->index) {
case CPLD_VERSION:
reg = 0x1;
mask = 0xFF;
break;
default:
break;
}
mutex_lock(&data->update_lock);
status = as7712_32x_cpld_read_internal(client, reg);
if (unlikely(status < 0)) {
goto exit;
}
mutex_unlock(&data->update_lock);
return sprintf(buf, "%d\n", (status & mask));
exit:
mutex_unlock(&data->update_lock);
return status;
}
static ssize_t access(struct device *dev, struct device_attribute *da,
const char *buf, size_t count)
{
int status;
u32 addr, val;
struct i2c_client *client = to_i2c_client(dev);
struct as7712_32x_cpld_data *data = i2c_get_clientdata(client);
if (sscanf(buf, "0x%x 0x%x", &addr, &val) != 2) {
return -EINVAL;
}
if (addr > 0xFF || val > 0xFF) {
return -EINVAL;
}
mutex_lock(&data->update_lock);
status = as7712_32x_cpld_write_internal(client, addr, val);
if (unlikely(status < 0)) {
goto exit;
}
mutex_unlock(&data->update_lock);
return count;
exit:
mutex_unlock(&data->update_lock);
return status;
}
static int as7712_32x_cpld_read_internal(struct i2c_client *client, u8 reg)
{
int status = 0, retry = I2C_RW_RETRY_COUNT;
while (retry) {
status = i2c_smbus_read_byte_data(client, reg);
if (unlikely(status < 0)) {
msleep(I2C_RW_RETRY_INTERVAL);
retry--;
continue;
}
break;
}
return status;
}
static int as7712_32x_cpld_write_internal(struct i2c_client *client, u8 reg, u8 value)
{
int status = 0, retry = I2C_RW_RETRY_COUNT;
while (retry) {
status = i2c_smbus_write_byte_data(client, reg, value);
if (unlikely(status < 0)) {
msleep(I2C_RW_RETRY_INTERVAL);
retry--;
continue;
}
break;
}
return status;
}
static void as7712_32x_cpld_add_client(struct i2c_client *client)
{
struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL);
if (!node) {
dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr);
return;
}
node->client = client;
mutex_lock(&list_lock);
list_add(&node->list, &cpld_client_list);
mutex_unlock(&list_lock);
}
static void as7712_32x_cpld_remove_client(struct i2c_client *client)
{
struct list_head *list_node = NULL;
struct cpld_client_node *cpld_node = NULL;
int found = 0;
mutex_lock(&list_lock);
list_for_each(list_node, &cpld_client_list)
{
cpld_node = list_entry(list_node, struct cpld_client_node, list);
if (cpld_node->client == client) {
found = 1;
break;
}
}
if (found) {
list_del(list_node);
kfree(cpld_node);
}
mutex_unlock(&list_lock);
}
static int as7712_32x_cpld_probe(struct i2c_client *client,
const struct i2c_device_id *dev_id)
{
int status;
struct as7712_32x_cpld_data *data = NULL;
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
dev_dbg(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr);
status = -EIO;
goto exit;
}
data = kzalloc(sizeof(struct as7712_32x_cpld_data), GFP_KERNEL);
if (!data) {
status = -ENOMEM;
goto exit;
}
i2c_set_clientdata(client, data);
mutex_init(&data->update_lock);
dev_info(&client->dev, "chip found\n");
/* Register sysfs hooks */
status = sysfs_create_group(&client->dev.kobj, &as7712_32x_cpld_group);
if (status) {
goto exit_free;
}
data->hwmon_dev = hwmon_device_register(&client->dev);
if (IS_ERR(data->hwmon_dev)) {
status = PTR_ERR(data->hwmon_dev);
goto exit_remove;
}
as7712_32x_cpld_add_client(client);
dev_info(&client->dev, "%s: cpld '%s'\n",
dev_name(data->hwmon_dev), client->name);
return 0;
exit_remove:
sysfs_remove_group(&client->dev.kobj, &as7712_32x_cpld_group);
exit_free:
kfree(data);
exit:
return status;
}
static int as7712_32x_cpld_remove(struct i2c_client *client)
{
struct as7712_32x_cpld_data *data = i2c_get_clientdata(client);
hwmon_device_unregister(data->hwmon_dev);
sysfs_remove_group(&client->dev.kobj, &as7712_32x_cpld_group);
kfree(data);
as7712_32x_cpld_remove_client(client);
return 0;
}
int as7712_32x_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;
}
EXPORT_SYMBOL(as7712_32x_cpld_read);
int as7712_32x_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;
}
EXPORT_SYMBOL(as7712_32x_cpld_write);
static const struct i2c_device_id as7712_32x_cpld_id[] = {
{ "as7712_32x_cpld1", 0 },
{}
};
MODULE_DEVICE_TABLE(i2c, as7712_32x_cpld_id);
static struct i2c_driver as7712_32x_cpld_driver = {
.class = I2C_CLASS_HWMON,
.driver = {
.name = "as7712_32x_cpld1",
},
.probe = as7712_32x_cpld_probe,
.remove = as7712_32x_cpld_remove,
.id_table = as7712_32x_cpld_id,
.address_list = normal_i2c,
};
static int __init as7712_32x_cpld_init(void)
{
mutex_init(&list_lock);
return i2c_add_driver(&as7712_32x_cpld_driver);
}
static void __exit as7712_32x_cpld_exit(void)
{
i2c_del_driver(&as7712_32x_cpld_driver);
}
module_init(as7712_32x_cpld_init);
module_exit(as7712_32x_cpld_exit);
MODULE_AUTHOR("Brandon Chuang <brandon_chuang@accton.com.tw>");
MODULE_DESCRIPTION("as7712_32x_cpld driver");
MODULE_LICENSE("GPL");

View File

@@ -30,8 +30,8 @@
#include <linux/slab.h>
#include <linux/dmi.h>
extern int accton_i2c_cpld_read (unsigned short cpld_addr, u8 reg);
extern int accton_i2c_cpld_write(unsigned short cpld_addr, u8 reg, u8 value);
extern int as7712_32x_cpld_read (unsigned short cpld_addr, u8 reg);
extern int as7712_32x_cpld_write(unsigned short cpld_addr, u8 reg, u8 value);
extern void led_classdev_unregister(struct led_classdev *led_cdev);
extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev);
@@ -175,12 +175,12 @@ static u8 led_light_mode_to_reg_val(enum led_type type,
static int accton_as7712_32x_led_read_value(u8 reg)
{
return accton_i2c_cpld_read(LED_CNTRLER_I2C_ADDRESS, reg);
return as7712_32x_cpld_read(LED_CNTRLER_I2C_ADDRESS, reg);
}
static int accton_as7712_32x_led_write_value(u8 reg, u8 value)
{
return accton_i2c_cpld_write(LED_CNTRLER_I2C_ADDRESS, reg, value);
return as7712_32x_cpld_write(LED_CNTRLER_I2C_ADDRESS, reg, value);
}
static void accton_as7712_32x_led_update(void)

View File

@@ -41,7 +41,7 @@
static ssize_t show_status(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);
extern int as7712_32x_cpld_read (unsigned short cpld_addr, u8 reg);
/* Addresses scanned
*/
@@ -314,7 +314,7 @@ static struct as7712_32x_psu_data *as7712_32x_psu_update_device(struct device *d
dev_dbg(&client->dev, "Starting as7712_32x update\n");
/* Read psu status */
status = accton_i2c_cpld_read(0x60, 0x2);
status = as7712_32x_cpld_read(0x60, 0x2);
if (status < 0) {
dev_dbg(&client->dev, "cpld reg 0x60 err %d\n", status);

View File

@@ -25,53 +25,24 @@
***********************************************************/
#include <onlp/platformi/sfpi.h>
#include <fcntl.h> /* For O_RDWR && open */
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <onlplib/i2c.h>
#include <onlplib/file.h>
#include "platform_lib.h"
#define MAX_SFP_PATH 64
static char sfp_node_path[MAX_SFP_PATH] = {0};
#define MUX_START_INDEX 18
#define NUM_OF_SFP_PORT 32
static const int sfp_mux_index[NUM_OF_SFP_PORT] = {
static const int port_bus_index[NUM_OF_SFP_PORT] = {
4, 5, 6, 7, 9, 8, 11, 10,
0, 1, 2, 3, 12, 13, 14, 15,
16, 17, 18, 19, 28, 29, 30, 31,
20, 21, 22, 23, 24, 25, 26, 27
};
#define FRONT_PORT_TO_MUX_INDEX(port) (sfp_mux_index[port]+MUX_START_INDEX)
#define PORT_BUS_INDEX(port) (port_bus_index[port]+MUX_START_INDEX)
#define PORT_FORMAT "/sys/bus/i2c/devices/%d-0050/%s"
static int
as7512_32x_sfp_node_read_int(char *node_path, int *value, int data_len)
{
int ret = 0;
char buf[8];
*value = 0;
ret = deviceNodeReadString(node_path, buf, sizeof(buf), data_len);
if (ret == 0) {
*value = atoi(buf);
}
return ret;
}
static char*
as7512_32x_sfp_get_port_path(int port, char *node_name)
{
sprintf(sfp_node_path, "/sys/bus/i2c/devices/%d-0050/%s",
FRONT_PORT_TO_MUX_INDEX(port),
node_name);
return sfp_node_path;
}
#define MODULE_PRESENT_FORMAT "/sys/bus/i2c/devices/4-0060/module_present_%d"
#define MODULE_PRESENT_ALL_ATTR "/sys/bus/i2c/devices/4-0060/module_present_all"
/************************************************************
*
@@ -110,9 +81,8 @@ onlp_sfpi_is_present(int port)
* Return < 0 if error.
*/
int present;
char* path = as7512_32x_sfp_get_port_path(port, "sfp_is_present");
if (as7512_32x_sfp_node_read_int(path, &present, 0) != 0) {
if (onlp_file_read_int(&present, MODULE_PRESENT_FORMAT, (port+1)) < 0) {
AIM_LOG_ERROR("Unable to read present status from port(%d)\r\n", port);
return ONLP_STATUS_E_INTERNAL;
}
@@ -124,11 +94,9 @@ int
onlp_sfpi_presence_bitmap_get(onlp_sfp_bitmap_t* dst)
{
uint32_t bytes[4];
char* path;
FILE* fp;
path = as7512_32x_sfp_get_port_path(0, "sfp_is_present_all");
fp = fopen(path, "r");
fp = fopen(MODULE_PRESENT_ALL_ATTR, "r");
if(fp == NULL) {
AIM_LOG_ERROR("Unable to open the sfp_is_present_all device file.");
@@ -167,17 +135,16 @@ onlp_sfpi_presence_bitmap_get(onlp_sfp_bitmap_t* dst)
int
onlp_sfpi_eeprom_read(int port, uint8_t data[256])
{
char* path = as7512_32x_sfp_get_port_path(port, "sfp_eeprom");
/*
* Read the SFP eeprom into data[]
*
* Return MISSING if SFP is missing.
* Return OK if eeprom is read
*/
int size = 0;
memset(data, 0, 256);
if (deviceNodeReadBinary(path, (char*)data, 256, 256) != 0) {
if(onlp_file_read(data, 256, &size, PORT_FORMAT, PORT_BUS_INDEX(port), "eeprom") != ONLP_STATUS_OK) {
AIM_LOG_ERROR("Unable to read eeprom from port(%d)\r\n", port);
return ONLP_STATUS_E_INTERNAL;
}
@@ -188,28 +155,28 @@ onlp_sfpi_eeprom_read(int port, uint8_t data[256])
int
onlp_sfpi_dev_readb(int port, uint8_t devaddr, uint8_t addr)
{
int bus = FRONT_PORT_TO_MUX_INDEX(port);
int bus = PORT_BUS_INDEX(port);
return onlp_i2c_readb(bus, devaddr, addr, ONLP_I2C_F_FORCE);
}
int
onlp_sfpi_dev_writeb(int port, uint8_t devaddr, uint8_t addr, uint8_t value)
{
int bus = FRONT_PORT_TO_MUX_INDEX(port);
int bus = PORT_BUS_INDEX(port);
return onlp_i2c_writeb(bus, devaddr, addr, value, ONLP_I2C_F_FORCE);
}
int
onlp_sfpi_dev_readw(int port, uint8_t devaddr, uint8_t addr)
{
int bus = FRONT_PORT_TO_MUX_INDEX(port);
int bus = PORT_BUS_INDEX(port);
return onlp_i2c_readw(bus, devaddr, addr, ONLP_I2C_F_FORCE);
}
int
onlp_sfpi_dev_writew(int port, uint8_t devaddr, uint8_t addr, uint16_t value)
{
int bus = FRONT_PORT_TO_MUX_INDEX(port);
int bus = PORT_BUS_INDEX(port);
return onlp_i2c_writew(bus, devaddr, addr, value, ONLP_I2C_F_FORCE);
}

View File

@@ -8,9 +8,10 @@ class OnlPlatform_x86_64_accton_as7712_32x_r0(OnlPlatformAccton,
SYS_OBJECT_ID=".7712.32"
def baseconfig(self):
self.insmod('optoe')
self.insmod('ym2651y')
self.insmod('accton_i2c_cpld')
for m in [ 'fan', 'psu', 'leds', 'sfp' ]:
for m in [ 'fan', 'cpld1', 'psu', 'leds' ]:
self.insmod("x86-64-accton-as7712-32x-%s.ko" % m)
########### initialize I2C bus 0 ###########
@@ -28,7 +29,7 @@ class OnlPlatform_x86_64_accton_as7712_32x_r0(OnlPlatformAccton,
('lm75', 0x4a, 3),
('lm75', 0x4b, 3),
('accton_i2c_cpld', 0x60, 4),
('as7712_32x_cpld1', 0x60, 4),
('accton_i2c_cpld', 0x62, 5),
('accton_i2c_cpld', 0x64, 6),
])
@@ -57,39 +58,72 @@ class OnlPlatform_x86_64_accton_as7712_32x_r0(OnlPlatformAccton,
# initialize QSFP port 1~32
self.new_i2c_devices([
('as7712_32x_sfp9', 0x50, 18),
('as7712_32x_sfp10', 0x50, 19),
('as7712_32x_sfp11', 0x50, 20),
('as7712_32x_sfp12', 0x50, 21),
('as7712_32x_sfp1', 0x50, 22),
('as7712_32x_sfp2', 0x50, 23),
('as7712_32x_sfp3', 0x50, 24),
('as7712_32x_sfp4', 0x50, 25),
('as7712_32x_sfp6', 0x50, 26),
('as7712_32x_sfp5', 0x50, 27),
('as7712_32x_sfp8', 0x50, 28),
('as7712_32x_sfp7', 0x50, 29),
('as7712_32x_sfp13', 0x50, 30),
('as7712_32x_sfp14', 0x50, 31),
('as7712_32x_sfp15', 0x50, 32),
('as7712_32x_sfp16', 0x50, 33),
('as7712_32x_sfp17', 0x50, 34),
('as7712_32x_sfp18', 0x50, 35),
('as7712_32x_sfp19', 0x50, 36),
('as7712_32x_sfp20', 0x50, 37),
('as7712_32x_sfp25', 0x50, 38),
('as7712_32x_sfp26', 0x50, 39),
('as7712_32x_sfp27', 0x50, 40),
('as7712_32x_sfp28', 0x50, 41),
('as7712_32x_sfp29', 0x50, 42),
('as7712_32x_sfp30', 0x50, 43),
('as7712_32x_sfp31', 0x50, 44),
('as7712_32x_sfp32', 0x50, 45),
('as7712_32x_sfp21', 0x50, 46),
('as7712_32x_sfp22', 0x50, 47),
('as7712_32x_sfp23', 0x50, 48),
('as7712_32x_sfp24', 0x50, 49),
('optoe1', 0x50, 18),
('optoe1', 0x50, 19),
('optoe1', 0x50, 20),
('optoe1', 0x50, 21),
('optoe1', 0x50, 22),
('optoe1', 0x50, 23),
('optoe1', 0x50, 24),
('optoe1', 0x50, 25),
('optoe1', 0x50, 26),
('optoe1', 0x50, 27),
('optoe1', 0x50, 28),
('optoe1', 0x50, 29),
('optoe1', 0x50, 30),
('optoe1', 0x50, 31),
('optoe1', 0x50, 32),
('optoe1', 0x50, 33),
('optoe1', 0x50, 34),
('optoe1', 0x50, 35),
('optoe1', 0x50, 36),
('optoe1', 0x50, 37),
('optoe1', 0x50, 38),
('optoe1', 0x50, 39),
('optoe1', 0x50, 40),
('optoe1', 0x50, 41),
('optoe1', 0x50, 42),
('optoe1', 0x50, 43),
('optoe1', 0x50, 44),
('optoe1', 0x50, 45),
('optoe1', 0x50, 46),
('optoe1', 0x50, 47),
('optoe1', 0x50, 48),
('optoe1', 0x50, 49),
])
subprocess.call('echo port9 > /sys/bus/i2c/devices/18-0050/port_name', shell=True)
subprocess.call('echo port10 > /sys/bus/i2c/devices/19-0050/port_name', shell=True)
subprocess.call('echo port11 > /sys/bus/i2c/devices/20-0050/port_name', shell=True)
subprocess.call('echo port12 > /sys/bus/i2c/devices/21-0050/port_name', shell=True)
subprocess.call('echo port1 > /sys/bus/i2c/devices/22-0050/port_name', shell=True)
subprocess.call('echo port2 > /sys/bus/i2c/devices/23-0050/port_name', shell=True)
subprocess.call('echo port3 > /sys/bus/i2c/devices/24-0050/port_name', shell=True)
subprocess.call('echo port4 > /sys/bus/i2c/devices/25-0050/port_name', shell=True)
subprocess.call('echo port6 > /sys/bus/i2c/devices/26-0050/port_name', shell=True)
subprocess.call('echo port5 > /sys/bus/i2c/devices/27-0050/port_name', shell=True)
subprocess.call('echo port8 > /sys/bus/i2c/devices/28-0050/port_name', shell=True)
subprocess.call('echo port7 > /sys/bus/i2c/devices/29-0050/port_name', shell=True)
subprocess.call('echo port13 > /sys/bus/i2c/devices/30-0050/port_name', shell=True)
subprocess.call('echo port14 > /sys/bus/i2c/devices/31-0050/port_name', shell=True)
subprocess.call('echo port15 > /sys/bus/i2c/devices/32-0050/port_name', shell=True)
subprocess.call('echo port16 > /sys/bus/i2c/devices/33-0050/port_name', shell=True)
subprocess.call('echo port17 > /sys/bus/i2c/devices/34-0050/port_name', shell=True)
subprocess.call('echo port18 > /sys/bus/i2c/devices/35-0050/port_name', shell=True)
subprocess.call('echo port19 > /sys/bus/i2c/devices/36-0050/port_name', shell=True)
subprocess.call('echo port20 > /sys/bus/i2c/devices/37-0050/port_name', shell=True)
subprocess.call('echo port25 > /sys/bus/i2c/devices/38-0050/port_name', shell=True)
subprocess.call('echo port26 > /sys/bus/i2c/devices/39-0050/port_name', shell=True)
subprocess.call('echo port27 > /sys/bus/i2c/devices/40-0050/port_name', shell=True)
subprocess.call('echo port28 > /sys/bus/i2c/devices/41-0050/port_name', shell=True)
subprocess.call('echo port29 > /sys/bus/i2c/devices/42-0050/port_name', shell=True)
subprocess.call('echo port30 > /sys/bus/i2c/devices/43-0050/port_name', shell=True)
subprocess.call('echo port31 > /sys/bus/i2c/devices/44-0050/port_name', shell=True)
subprocess.call('echo port32 > /sys/bus/i2c/devices/45-0050/port_name', shell=True)
subprocess.call('echo port21 > /sys/bus/i2c/devices/46-0050/port_name', shell=True)
subprocess.call('echo port22 > /sys/bus/i2c/devices/47-0050/port_name', shell=True)
subprocess.call('echo port23 > /sys/bus/i2c/devices/48-0050/port_name', shell=True)
subprocess.call('echo port24 > /sys/bus/i2c/devices/49-0050/port_name', shell=True)
self.new_i2c_device('24c02', 0x57, 1)
return True