aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorey Minyard <cminyard@mvista.com>2017-09-16 15:53:12 -0400
committerCorey Minyard <cminyard@mvista.com>2017-09-28 13:26:01 -0400
commit3dd377b5b07707c1a37e9129b36eaa1a86ccf9cf (patch)
treef5e5bd4f7e07ef8720fec15cc931ca5f437344fe
parent67f4fb025d8e2189f91f6ccfc8f62f76f56f889d (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.c104
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) \
1703static 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} \
1711static DEVICE_ATTR(name, S_IRUGO, ipmi_##name##_show, NULL)
1712
1713static 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}
1721static DEVICE_ATTR(type, S_IRUGO, ipmi_type_show, NULL);
1722
1723static 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}
1732static DEVICE_ATTR(interrupts_enabled, S_IRUGO,
1733 ipmi_interrupts_enabled_show, NULL);
1734
1735IPMI_SI_ATTR(short_timeouts);
1736IPMI_SI_ATTR(long_timeouts);
1737IPMI_SI_ATTR(idles);
1738IPMI_SI_ATTR(interrupts);
1739IPMI_SI_ATTR(attentions);
1740IPMI_SI_ATTR(flag_fetches);
1741IPMI_SI_ATTR(hosed_count);
1742IPMI_SI_ATTR(complete_transactions);
1743IPMI_SI_ATTR(events);
1744IPMI_SI_ATTR(watchdog_pretimeouts);
1745IPMI_SI_ATTR(incoming_messages);
1746
1747static 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}
1764static DEVICE_ATTR(params, S_IRUGO, ipmi_params_show, NULL);
1765
1766static 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
1784static 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
2232out_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
2137out_err_stop_timer: 2236out_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 /*