[device/platform] Add reset in sfputil.py for Accton AS7326-56X (#3685)
Add reset in sfputil.py for as7326-56x. Signed-off-by: brandon_chuang <brandon_chuang@edge-core.com>
This commit is contained in:
parent
65fc916dcf
commit
7d4093d6ed
@ -219,8 +219,30 @@ class SfpUtil(SfpUtilBase):
|
|||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
||||||
def reset(self, port_num):
|
def reset(self, port_num):
|
||||||
raise NotImplementedError
|
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
|
||||||
|
return False
|
||||||
|
|
||||||
|
cpld_i = self.get_cpld_num(port_num)
|
||||||
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
|
path = "/sys/bus/i2c/devices/{0}/module_reset_{1}"
|
||||||
|
port_ps = path.format(cpld_ps, port_num)
|
||||||
|
|
||||||
|
self.__port_to_mod_rst = port_ps
|
||||||
|
try:
|
||||||
|
reg_file = open(self.__port_to_mod_rst, 'r+', buffering=0)
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
|
||||||
|
#toggle reset
|
||||||
|
reg_file.seek(0)
|
||||||
|
reg_file.write('1')
|
||||||
|
time.sleep(1)
|
||||||
|
reg_file.seek(0)
|
||||||
|
reg_file.write('0')
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
return True
|
||||||
@property
|
@property
|
||||||
def _get_present_bitmap(self):
|
def _get_present_bitmap(self):
|
||||||
nodes = []
|
nodes = []
|
||||||
|
@ -285,6 +285,14 @@ enum as7326_56x_cpld_sysfs_attributes {
|
|||||||
TRANSCEIVER_TXFAULT_ATTR_ID(48),
|
TRANSCEIVER_TXFAULT_ATTR_ID(48),
|
||||||
TRANSCEIVER_TXFAULT_ATTR_ID(57),
|
TRANSCEIVER_TXFAULT_ATTR_ID(57),
|
||||||
TRANSCEIVER_TXFAULT_ATTR_ID(58),
|
TRANSCEIVER_TXFAULT_ATTR_ID(58),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(49),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(50),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(51),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(52),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(53),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(54),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(55),
|
||||||
|
TRANSCEIVER_RESET_ATTR_ID(56),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* sysfs attributes for hwmon
|
/* sysfs attributes for hwmon
|
||||||
@ -297,6 +305,8 @@ static ssize_t show_rxlos_all(struct device *dev, struct device_attribute *da,
|
|||||||
char *buf);
|
char *buf);
|
||||||
static ssize_t set_tx_disable(struct device *dev, struct device_attribute *da,
|
static ssize_t set_tx_disable(struct device *dev, struct device_attribute *da,
|
||||||
const char *buf, size_t count);
|
const char *buf, size_t count);
|
||||||
|
static ssize_t set_reset(struct device *dev, struct device_attribute *da,
|
||||||
|
const char *buf, size_t count);
|
||||||
static ssize_t access(struct device *dev, struct device_attribute *da,
|
static ssize_t access(struct device *dev, struct device_attribute *da,
|
||||||
const char *buf, size_t count);
|
const char *buf, size_t count);
|
||||||
static ssize_t show_version(struct device *dev, struct device_attribute *da,
|
static ssize_t show_version(struct device *dev, struct device_attribute *da,
|
||||||
@ -437,6 +447,15 @@ DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(48);
|
|||||||
DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(57);
|
DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(57);
|
||||||
DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(58);
|
DECLARE_SFP_TRANSCEIVER_SENSOR_DEVICE_ATTR(58);
|
||||||
|
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(49);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(50);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(51);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(52);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(53);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(54);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(55);
|
||||||
|
DECLARE_TRANSCEIVER_RESET_SENSOR_DEVICE_ATTR(56);
|
||||||
|
|
||||||
static struct attribute *as7326_56x_cpld3_attributes[] = {
|
static struct attribute *as7326_56x_cpld3_attributes[] = {
|
||||||
&sensor_dev_attr_version.dev_attr.attr,
|
&sensor_dev_attr_version.dev_attr.attr,
|
||||||
&sensor_dev_attr_access.dev_attr.attr,
|
&sensor_dev_attr_access.dev_attr.attr,
|
||||||
@ -507,7 +526,7 @@ static struct attribute *as7326_56x_cpld2_attributes[] = {
|
|||||||
DECLARE_SFP_TRANSCEIVER_ATTR(22),
|
DECLARE_SFP_TRANSCEIVER_ATTR(22),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(23),
|
DECLARE_SFP_TRANSCEIVER_ATTR(23),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(24),
|
DECLARE_SFP_TRANSCEIVER_ATTR(24),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(25),
|
DECLARE_SFP_TRANSCEIVER_ATTR(25),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(26),
|
DECLARE_SFP_TRANSCEIVER_ATTR(26),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(27),
|
DECLARE_SFP_TRANSCEIVER_ATTR(27),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(28),
|
DECLARE_SFP_TRANSCEIVER_ATTR(28),
|
||||||
@ -574,6 +593,14 @@ static struct attribute *as7326_56x_cpld1_attributes[] = {
|
|||||||
DECLARE_SFP_TRANSCEIVER_ATTR(48),
|
DECLARE_SFP_TRANSCEIVER_ATTR(48),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(57),
|
DECLARE_SFP_TRANSCEIVER_ATTR(57),
|
||||||
DECLARE_SFP_TRANSCEIVER_ATTR(58),
|
DECLARE_SFP_TRANSCEIVER_ATTR(58),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(49),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(50),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(51),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(52),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(53),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(54),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(55),
|
||||||
|
DECLARE_TRANSCEIVER_RESET_ATTR(56),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -724,6 +751,11 @@ static ssize_t show_status(struct device *dev, struct device_attribute *da,
|
|||||||
reg = 0x19;
|
reg = 0x19;
|
||||||
mask = 0x1 << (( attr->index - MODULE_RXLOS_57)+2);
|
mask = 0x1 << (( attr->index - MODULE_RXLOS_57)+2);
|
||||||
break;
|
break;
|
||||||
|
case MODULE_RESET_49 ... MODULE_RESET_56:
|
||||||
|
reg = 0x4;
|
||||||
|
mask = 0x1 << (attr->index - MODULE_RESET_49);
|
||||||
|
revert = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -806,6 +838,59 @@ exit:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t set_reset(struct device *dev, struct device_attribute *da,
|
||||||
|
const char *buf, size_t count)
|
||||||
|
{
|
||||||
|
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||||
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
|
struct as7326_56x_cpld_data *data = i2c_get_clientdata(client);
|
||||||
|
long reset;
|
||||||
|
int status;
|
||||||
|
u8 reg = 0, mask = 0;
|
||||||
|
|
||||||
|
status = kstrtol(buf, 10, &reset);
|
||||||
|
if (status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (attr->index)
|
||||||
|
{
|
||||||
|
case MODULE_RESET_49 ... MODULE_RESET_56:
|
||||||
|
reg = 0x4;
|
||||||
|
mask = 0x1 << (attr->index - MODULE_RESET_49);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read current status */
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
status = as7326_56x_cpld_read_internal(client, reg);
|
||||||
|
if (unlikely(status < 0)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update reset status */
|
||||||
|
if (!reset) {
|
||||||
|
status |= mask;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
status &= ~mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = as7326_56x_cpld_write_internal(client, reg, status);
|
||||||
|
if (unlikely(status < 0)) {
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
return count;
|
||||||
|
|
||||||
|
exit:
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t access(struct device *dev, struct device_attribute *da,
|
static ssize_t access(struct device *dev, struct device_attribute *da,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user