bnxt_en: Add hwmon sysfs support to read temperature
Export temperature sensor reading via hwmon sysfs. Signed-off-by: Vasundhara Volam <vasundhara-v.volam@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									25e1acd6b9
								
							
						
					
					
						commit
						cde49a42a9
					
				| @ -230,4 +230,12 @@ config BNXT_DCB | |||||||
| 
 | 
 | ||||||
| 	  If unsure, say N. | 	  If unsure, say N. | ||||||
| 
 | 
 | ||||||
|  | config BNXT_HWMON | ||||||
|  | 	bool "Broadcom NetXtreme-C/E HWMON support" | ||||||
|  | 	default y | ||||||
|  | 	depends on BNXT && HWMON && !(BNXT=y && HWMON=m) | ||||||
|  | 	---help--- | ||||||
|  | 	  Say Y if you want to expose the thermal sensor data on NetXtreme-C/E | ||||||
|  | 	  devices, via the hwmon sysfs interface. | ||||||
|  | 
 | ||||||
| endif # NET_VENDOR_BROADCOM | endif # NET_VENDOR_BROADCOM | ||||||
|  | |||||||
| @ -51,6 +51,8 @@ | |||||||
| #include <linux/cpu_rmap.h> | #include <linux/cpu_rmap.h> | ||||||
| #include <linux/cpumask.h> | #include <linux/cpumask.h> | ||||||
| #include <net/pkt_cls.h> | #include <net/pkt_cls.h> | ||||||
|  | #include <linux/hwmon.h> | ||||||
|  | #include <linux/hwmon-sysfs.h> | ||||||
| 
 | 
 | ||||||
| #include "bnxt_hsi.h" | #include "bnxt_hsi.h" | ||||||
| #include "bnxt.h" | #include "bnxt.h" | ||||||
| @ -6789,6 +6791,62 @@ static void bnxt_get_wol_settings(struct bnxt *bp) | |||||||
| 	} while (handle && handle != 0xffff); | 	} while (handle && handle != 0xffff); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_BNXT_HWMON | ||||||
|  | static ssize_t bnxt_show_temp(struct device *dev, | ||||||
|  | 			      struct device_attribute *devattr, char *buf) | ||||||
|  | { | ||||||
|  | 	struct hwrm_temp_monitor_query_input req = {0}; | ||||||
|  | 	struct hwrm_temp_monitor_query_output *resp; | ||||||
|  | 	struct bnxt *bp = dev_get_drvdata(dev); | ||||||
|  | 	u32 temp = 0; | ||||||
|  | 
 | ||||||
|  | 	resp = bp->hwrm_cmd_resp_addr; | ||||||
|  | 	bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_TEMP_MONITOR_QUERY, -1, -1); | ||||||
|  | 	mutex_lock(&bp->hwrm_cmd_lock); | ||||||
|  | 	if (!_hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT)) | ||||||
|  | 		temp = resp->temp * 1000; /* display millidegree */ | ||||||
|  | 	mutex_unlock(&bp->hwrm_cmd_lock); | ||||||
|  | 
 | ||||||
|  | 	return sprintf(buf, "%u\n", temp); | ||||||
|  | } | ||||||
|  | static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0); | ||||||
|  | 
 | ||||||
|  | static struct attribute *bnxt_attrs[] = { | ||||||
|  | 	&sensor_dev_attr_temp1_input.dev_attr.attr, | ||||||
|  | 	NULL | ||||||
|  | }; | ||||||
|  | ATTRIBUTE_GROUPS(bnxt); | ||||||
|  | 
 | ||||||
|  | static void bnxt_hwmon_close(struct bnxt *bp) | ||||||
|  | { | ||||||
|  | 	if (bp->hwmon_dev) { | ||||||
|  | 		hwmon_device_unregister(bp->hwmon_dev); | ||||||
|  | 		bp->hwmon_dev = NULL; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void bnxt_hwmon_open(struct bnxt *bp) | ||||||
|  | { | ||||||
|  | 	struct pci_dev *pdev = bp->pdev; | ||||||
|  | 
 | ||||||
|  | 	bp->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, | ||||||
|  | 							  DRV_MODULE_NAME, bp, | ||||||
|  | 							  bnxt_groups); | ||||||
|  | 	if (IS_ERR(bp->hwmon_dev)) { | ||||||
|  | 		bp->hwmon_dev = NULL; | ||||||
|  | 		dev_warn(&pdev->dev, "Cannot register hwmon device\n"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | #else | ||||||
|  | static void bnxt_hwmon_close(struct bnxt *bp) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void bnxt_hwmon_open(struct bnxt *bp) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| static bool bnxt_eee_config_ok(struct bnxt *bp) | static bool bnxt_eee_config_ok(struct bnxt *bp) | ||||||
| { | { | ||||||
| 	struct ethtool_eee *eee = &bp->eee; | 	struct ethtool_eee *eee = &bp->eee; | ||||||
| @ -7040,6 +7098,9 @@ static int bnxt_open(struct net_device *dev) | |||||||
| 	rc = __bnxt_open_nic(bp, true, true); | 	rc = __bnxt_open_nic(bp, true, true); | ||||||
| 	if (rc) | 	if (rc) | ||||||
| 		bnxt_hwrm_if_change(bp, false); | 		bnxt_hwrm_if_change(bp, false); | ||||||
|  | 
 | ||||||
|  | 	bnxt_hwmon_open(bp); | ||||||
|  | 
 | ||||||
| 	return rc; | 	return rc; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -7102,6 +7163,7 @@ static int bnxt_close(struct net_device *dev) | |||||||
| { | { | ||||||
| 	struct bnxt *bp = netdev_priv(dev); | 	struct bnxt *bp = netdev_priv(dev); | ||||||
| 
 | 
 | ||||||
|  | 	bnxt_hwmon_close(bp); | ||||||
| 	bnxt_close_nic(bp, true, true); | 	bnxt_close_nic(bp, true, true); | ||||||
| 	bnxt_hwrm_shutdown_link(bp); | 	bnxt_hwrm_shutdown_link(bp); | ||||||
| 	bnxt_hwrm_if_change(bp, false); | 	bnxt_hwrm_if_change(bp, false); | ||||||
|  | |||||||
| @ -1411,6 +1411,7 @@ struct bnxt { | |||||||
| 	struct bnxt_tc_info	*tc_info; | 	struct bnxt_tc_info	*tc_info; | ||||||
| 	struct dentry		*debugfs_pdev; | 	struct dentry		*debugfs_pdev; | ||||||
| 	struct dentry		*debugfs_dim; | 	struct dentry		*debugfs_dim; | ||||||
|  | 	struct device		*hwmon_dev; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #define BNXT_RX_STATS_OFFSET(counter)			\ | #define BNXT_RX_STATS_OFFSET(counter)			\ | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user