in dfl-n3000-nios.c [238:284]
static ssize_t fec_mode_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
unsigned int val, retimer_a_mode, retimer_b_mode, fec_modes;
struct n3000_nios *nn = dev_get_drvdata(dev);
int ret;
/* FEC mode setting is not supported in early FW versions */
ret = regmap_read(nn->regmap, N3000_NIOS_FW_VERSION, &val);
if (ret)
return ret;
if (FIELD_GET(N3000_NIOS_FW_VERSION_MAJOR, val) < 3)
return sysfs_emit(buf, "not supported\n");
/* If no 25G links, FEC mode setting is not supported either */
ret = get_retimer_mode(nn, N3000_NIOS_PKVL_A_MODE_STS, &retimer_a_mode);
if (ret)
return ret;
ret = get_retimer_mode(nn, N3000_NIOS_PKVL_B_MODE_STS, &retimer_b_mode);
if (ret)
return ret;
if (!IS_RETIMER_FEC_SUPPORTED(retimer_a_mode) &&
!IS_RETIMER_FEC_SUPPORTED(retimer_b_mode))
return sysfs_emit(buf, "not supported\n");
/* get the valid FEC mode for 25G links */
ret = regmap_read(nn->regmap, N3000_NIOS_INIT, &val);
if (ret)
return ret;
/*
* FEC mode should always be the same for all links, as we set them
* in this way.
*/
fec_modes = (val & N3000_NIOS_INIT_REQ_FEC_MODE_MSK_ALL);
if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_NO_ALL)
return sysfs_emit(buf, "no\n");
else if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_KR_ALL)
return sysfs_emit(buf, "kr\n");
else if (fec_modes == N3000_NIOS_INIT_REQ_FEC_MODE_RS_ALL)
return sysfs_emit(buf, "rs\n");
return -EFAULT;
}