diff options
author | Corey Minyard <cminyard@mvista.com> | 2017-09-16 15:53:12 -0400 |
---|---|---|
committer | Corey Minyard <cminyard@mvista.com> | 2017-09-28 13:26:01 -0400 |
commit | 3dd377b5b07707c1a37e9129b36eaa1a86ccf9cf (patch) | |
tree | f5e5bd4f7e07ef8720fec15cc931ca5f437344fe | |
parent | 67f4fb025d8e2189f91f6ccfc8f62f76f56f889d (diff) |
ipmi_si: Add device attrs for the things in proc
Create a device attribute for everything we show in proc, getting
ready for removing the proc stuff.
Signed-off-by: Corey Minyard <cminyard@mvista.com>
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 104 |
1 files changed, 103 insertions, 1 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 3758560a6ab2..6ce5b7c8cf93 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -1699,6 +1699,92 @@ static const struct file_operations smi_params_proc_ops = { | |||
1699 | .release = single_release, | 1699 | .release = single_release, |
1700 | }; | 1700 | }; |
1701 | 1701 | ||
1702 | #define IPMI_SI_ATTR(name) \ | ||
1703 | static ssize_t ipmi_##name##_show(struct device *dev, \ | ||
1704 | struct device_attribute *attr, \ | ||
1705 | char *buf) \ | ||
1706 | { \ | ||
1707 | struct smi_info *smi_info = dev_get_drvdata(dev); \ | ||
1708 | \ | ||
1709 | return snprintf(buf, 10, "%u\n", smi_get_stat(smi_info, name)); \ | ||
1710 | } \ | ||
1711 | static DEVICE_ATTR(name, S_IRUGO, ipmi_##name##_show, NULL) | ||
1712 | |||
1713 | static ssize_t ipmi_type_show(struct device *dev, | ||
1714 | struct device_attribute *attr, | ||
1715 | char *buf) | ||
1716 | { | ||
1717 | struct smi_info *smi_info = dev_get_drvdata(dev); | ||
1718 | |||
1719 | return snprintf(buf, 10, "%s\n", si_to_str[smi_info->io.si_type]); | ||
1720 | } | ||
1721 | static DEVICE_ATTR(type, S_IRUGO, ipmi_type_show, NULL); | ||
1722 | |||
1723 | static ssize_t ipmi_interrupts_enabled_show(struct device *dev, | ||
1724 | struct device_attribute *attr, | ||
1725 | char *buf) | ||
1726 | { | ||
1727 | struct smi_info *smi_info = dev_get_drvdata(dev); | ||
1728 | int enabled = smi_info->io.irq && !smi_info->interrupt_disabled; | ||
1729 | |||
1730 | return snprintf(buf, 10, "%d\n", enabled); | ||
1731 | } | ||
1732 | static DEVICE_ATTR(interrupts_enabled, S_IRUGO, | ||
1733 | ipmi_interrupts_enabled_show, NULL); | ||
1734 | |||
1735 | IPMI_SI_ATTR(short_timeouts); | ||
1736 | IPMI_SI_ATTR(long_timeouts); | ||
1737 | IPMI_SI_ATTR(idles); | ||
1738 | IPMI_SI_ATTR(interrupts); | ||
1739 | IPMI_SI_ATTR(attentions); | ||
1740 | IPMI_SI_ATTR(flag_fetches); | ||
1741 | IPMI_SI_ATTR(hosed_count); | ||
1742 | IPMI_SI_ATTR(complete_transactions); | ||
1743 | IPMI_SI_ATTR(events); | ||
1744 | IPMI_SI_ATTR(watchdog_pretimeouts); | ||
1745 | IPMI_SI_ATTR(incoming_messages); | ||
1746 | |||
1747 | static ssize_t ipmi_params_show(struct device *dev, | ||
1748 | struct device_attribute *attr, | ||
1749 | char *buf) | ||
1750 | { | ||
1751 | struct smi_info *smi_info = dev_get_drvdata(dev); | ||
1752 | |||
1753 | return snprintf(buf, 200, | ||
1754 | "%s,%s,0x%lx,rsp=%d,rsi=%d,rsh=%d,irq=%d,ipmb=%d\n", | ||
1755 | si_to_str[smi_info->io.si_type], | ||
1756 | addr_space_to_str[smi_info->io.addr_type], | ||
1757 | smi_info->io.addr_data, | ||
1758 | smi_info->io.regspacing, | ||
1759 | smi_info->io.regsize, | ||
1760 | smi_info->io.regshift, | ||
1761 | smi_info->io.irq, | ||
1762 | smi_info->io.slave_addr); | ||
1763 | } | ||
1764 | static DEVICE_ATTR(params, S_IRUGO, ipmi_params_show, NULL); | ||
1765 | |||
1766 | static struct attribute *ipmi_si_dev_attrs[] = { | ||
1767 | &dev_attr_type.attr, | ||
1768 | &dev_attr_interrupts_enabled.attr, | ||
1769 | &dev_attr_short_timeouts.attr, | ||
1770 | &dev_attr_long_timeouts.attr, | ||
1771 | &dev_attr_idles.attr, | ||
1772 | &dev_attr_interrupts.attr, | ||
1773 | &dev_attr_attentions.attr, | ||
1774 | &dev_attr_flag_fetches.attr, | ||
1775 | &dev_attr_hosed_count.attr, | ||
1776 | &dev_attr_complete_transactions.attr, | ||
1777 | &dev_attr_events.attr, | ||
1778 | &dev_attr_watchdog_pretimeouts.attr, | ||
1779 | &dev_attr_incoming_messages.attr, | ||
1780 | &dev_attr_params.attr, | ||
1781 | NULL | ||
1782 | }; | ||
1783 | |||
1784 | static const struct attribute_group ipmi_si_dev_attr_group = { | ||
1785 | .attrs = ipmi_si_dev_attrs, | ||
1786 | }; | ||
1787 | |||
1702 | /* | 1788 | /* |
1703 | * oem_data_avail_to_receive_msg_avail | 1789 | * oem_data_avail_to_receive_msg_avail |
1704 | * @info - smi_info structure with msg_flags set | 1790 | * @info - smi_info structure with msg_flags set |
@@ -2085,6 +2171,15 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2085 | } | 2171 | } |
2086 | } | 2172 | } |
2087 | 2173 | ||
2174 | dev_set_drvdata(new_smi->io.dev, new_smi); | ||
2175 | rv = device_add_group(new_smi->io.dev, &ipmi_si_dev_attr_group); | ||
2176 | if (rv) { | ||
2177 | dev_err(new_smi->io.dev, | ||
2178 | "Unable to add device attributes: error %d\n", | ||
2179 | rv); | ||
2180 | goto out_err_stop_timer; | ||
2181 | } | ||
2182 | |||
2088 | rv = ipmi_register_smi(&handlers, | 2183 | rv = ipmi_register_smi(&handlers, |
2089 | new_smi, | 2184 | new_smi, |
2090 | new_smi->io.dev, | 2185 | new_smi->io.dev, |
@@ -2093,7 +2188,7 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2093 | dev_err(new_smi->io.dev, | 2188 | dev_err(new_smi->io.dev, |
2094 | "Unable to register device: error %d\n", | 2189 | "Unable to register device: error %d\n", |
2095 | rv); | 2190 | rv); |
2096 | goto out_err_stop_timer; | 2191 | goto out_err_remove_attrs; |
2097 | } | 2192 | } |
2098 | 2193 | ||
2099 | rv = ipmi_smi_add_proc_entry(new_smi->intf, "type", | 2194 | rv = ipmi_smi_add_proc_entry(new_smi->intf, "type", |
@@ -2134,6 +2229,10 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2134 | 2229 | ||
2135 | return 0; | 2230 | return 0; |
2136 | 2231 | ||
2232 | out_err_remove_attrs: | ||
2233 | device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group); | ||
2234 | dev_set_drvdata(new_smi->io.dev, NULL); | ||
2235 | |||
2137 | out_err_stop_timer: | 2236 | out_err_stop_timer: |
2138 | wait_for_timer_and_thread(new_smi); | 2237 | wait_for_timer_and_thread(new_smi); |
2139 | 2238 | ||
@@ -2274,6 +2373,9 @@ static void cleanup_one_si(struct smi_info *to_clean) | |||
2274 | } | 2373 | } |
2275 | } | 2374 | } |
2276 | 2375 | ||
2376 | device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group); | ||
2377 | dev_set_drvdata(to_clean->io.dev, NULL); | ||
2378 | |||
2277 | list_del(&to_clean->link); | 2379 | list_del(&to_clean->link); |
2278 | 2380 | ||
2279 | /* | 2381 | /* |