Commit d84e0b28 authored by Michael Albaugh's avatar Michael Albaugh Committed by Roland Dreier

IB/ipath: EEPROM support for 7220 devices, robustness improvements, cleanup

Add support for reading newer card's EEPROMs while continuing to support
older EEPROMs.

Also, add support for the temperature sensor if present.
Signed-off-by: default avatarMichael Albaugh <Michael.Albaugh@qlogic.com>
Signed-off-by: default avatarRoland Dreier <rolandd@cisco.com>
parent d98b1937
This diff is collapsed.
...@@ -654,8 +654,9 @@ struct ipath_devdata { ...@@ -654,8 +654,9 @@ struct ipath_devdata {
* Register bits for selecting i2c direction and values, used for * Register bits for selecting i2c direction and values, used for
* I2C serial flash. * I2C serial flash.
*/ */
u16 ipath_gpio_sda_num; u8 ipath_gpio_sda_num;
u16 ipath_gpio_scl_num; u8 ipath_gpio_scl_num;
u8 ipath_i2c_chain_type;
u64 ipath_gpio_sda; u64 ipath_gpio_sda;
u64 ipath_gpio_scl; u64 ipath_gpio_scl;
...@@ -906,6 +907,8 @@ void ipath_release_user_pages(struct page **, size_t); ...@@ -906,6 +907,8 @@ void ipath_release_user_pages(struct page **, size_t);
void ipath_release_user_pages_on_close(struct page **, size_t); void ipath_release_user_pages_on_close(struct page **, size_t);
int ipath_eeprom_read(struct ipath_devdata *, u8, void *, int); int ipath_eeprom_read(struct ipath_devdata *, u8, void *, int);
int ipath_eeprom_write(struct ipath_devdata *, u8, const void *, int); int ipath_eeprom_write(struct ipath_devdata *, u8, const void *, int);
int ipath_tempsense_read(struct ipath_devdata *, u8 regnum);
int ipath_tempsense_write(struct ipath_devdata *, u8 regnum, u8 data);
/* these are used for the registers that vary with port */ /* these are used for the registers that vary with port */
void ipath_write_kreg_port(const struct ipath_devdata *, ipath_kreg, void ipath_write_kreg_port(const struct ipath_devdata *, ipath_kreg,
......
...@@ -943,6 +943,7 @@ static ssize_t store_rx_polinv_enb(struct device *dev, ...@@ -943,6 +943,7 @@ static ssize_t store_rx_polinv_enb(struct device *dev,
bail: bail:
return ret; return ret;
} }
/* /*
* Get/Set RX lane-reversal enable. 0=no, 1=yes. * Get/Set RX lane-reversal enable. 0=no, 1=yes.
*/ */
...@@ -997,6 +998,75 @@ static struct attribute_group driver_attr_group = { ...@@ -997,6 +998,75 @@ static struct attribute_group driver_attr_group = {
.attrs = driver_attributes .attrs = driver_attributes
}; };
static ssize_t store_tempsense(struct device *dev,
struct device_attribute *attr,
const char *buf,
size_t count)
{
struct ipath_devdata *dd = dev_get_drvdata(dev);
int ret, stat;
u16 val;
ret = ipath_parse_ushort(buf, &val);
if (ret <= 0) {
ipath_dev_err(dd, "attempt to set invalid tempsense config\n");
goto bail;
}
/* If anything but the highest limit, enable T_CRIT_A "interrupt" */
stat = ipath_tempsense_write(dd, 9, (val == 0x7f7f) ? 0x80 : 0);
if (stat) {
ipath_dev_err(dd, "Unable to set tempsense config\n");
ret = -1;
goto bail;
}
stat = ipath_tempsense_write(dd, 0xB, (u8) (val & 0xFF));
if (stat) {
ipath_dev_err(dd, "Unable to set local Tcrit\n");
ret = -1;
goto bail;
}
stat = ipath_tempsense_write(dd, 0xD, (u8) (val >> 8));
if (stat) {
ipath_dev_err(dd, "Unable to set remote Tcrit\n");
ret = -1;
goto bail;
}
bail:
return ret;
}
/*
* dump tempsense regs. in decimal, to ease shell-scripts.
*/
static ssize_t show_tempsense(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct ipath_devdata *dd = dev_get_drvdata(dev);
int ret;
int idx;
u8 regvals[8];
ret = -ENXIO;
for (idx = 0; idx < 8; ++idx) {
if (idx == 6)
continue;
ret = ipath_tempsense_read(dd, idx);
if (ret < 0)
break;
regvals[idx] = ret;
}
if (idx == 8)
ret = scnprintf(buf, PAGE_SIZE, "%d %d %02X %02X %d %d\n",
*(signed char *)(regvals),
*(signed char *)(regvals + 1),
regvals[2], regvals[3],
*(signed char *)(regvals + 5),
*(signed char *)(regvals + 7));
return ret;
}
struct attribute_group *ipath_driver_attr_groups[] = { struct attribute_group *ipath_driver_attr_groups[] = {
&driver_attr_group, &driver_attr_group,
NULL, NULL,
...@@ -1025,6 +1095,8 @@ static DEVICE_ATTR(jint_max_packets, S_IWUSR | S_IRUGO, ...@@ -1025,6 +1095,8 @@ static DEVICE_ATTR(jint_max_packets, S_IWUSR | S_IRUGO,
show_jint_max_packets, store_jint_max_packets); show_jint_max_packets, store_jint_max_packets);
static DEVICE_ATTR(jint_idle_ticks, S_IWUSR | S_IRUGO, static DEVICE_ATTR(jint_idle_ticks, S_IWUSR | S_IRUGO,
show_jint_idle_ticks, store_jint_idle_ticks); show_jint_idle_ticks, store_jint_idle_ticks);
static DEVICE_ATTR(tempsense, S_IWUSR | S_IRUGO,
show_tempsense, store_tempsense);
static struct attribute *dev_attributes[] = { static struct attribute *dev_attributes[] = {
&dev_attr_guid.attr, &dev_attr_guid.attr,
...@@ -1044,6 +1116,7 @@ static struct attribute *dev_attributes[] = { ...@@ -1044,6 +1116,7 @@ static struct attribute *dev_attributes[] = {
&dev_attr_rx_pol_inv.attr, &dev_attr_rx_pol_inv.attr,
&dev_attr_led_override.attr, &dev_attr_led_override.attr,
&dev_attr_logged_errors.attr, &dev_attr_logged_errors.attr,
&dev_attr_tempsense.attr,
&dev_attr_localbus_info.attr, &dev_attr_localbus_info.attr,
NULL NULL
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment