> From: Ben Greear <greearb@xxxxxxxxxxxxxxx> > > Allow sensors tool to read radio's temperature, example: > > mt7921_phy17-pci-1800 > Adapter: PCI adapter > temp1: +72.0°C > > Signed-off-by: Ben Greear <greearb@xxxxxxxxxxxxxxx> > --- > .../net/wireless/mediatek/mt76/mt7921/init.c | 53 +++++++++++++++++++ > .../net/wireless/mediatek/mt76/mt7921/mcu.c | 17 ++++++ > .../wireless/mediatek/mt76/mt7921/mt7921.h | 1 + > 3 files changed, 71 insertions(+) > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/init.c b/drivers/net/wireless/mediatek/mt76/mt7921/init.c > index c15ce1a19000..18f0f2dfbbcf 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/init.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/init.c > @@ -2,6 +2,9 @@ > /* Copyright (C) 2020 MediaTek Inc. */ > > #include <linux/etherdevice.h> > +#include <linux/hwmon.h> > +#include <linux/hwmon-sysfs.h> > +#include <linux/thermal.h> > #include <linux/firmware.h> > #include "mt7921.h" > #include "../mt76_connac2_mac.h" > @@ -58,6 +61,50 @@ static const struct ieee80211_iface_combination if_comb_chanctx[] = { > } > }; > > +static ssize_t mt7921_thermal_temp_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct mt7921_phy *phy = dev_get_drvdata(dev); > + int i = to_sensor_dev_attr(attr)->index; > + int temperature; > + > + switch (i) { nit: you can drop i and just use to_sensor_dev_attr(attr)->index > + case 0: I think you need to wake the device up here running mt7921_mutex_acquire before sending the mcu command. nit: you can move temperature variable definition here. Regards, Lorenzo > + temperature = mt7921_mcu_get_temperature(phy); > + if (temperature < 0) > + return temperature; > + /* display in millidegree celcius */ > + return sprintf(buf, "%u\n", temperature * 1000); > + default: > + return -EINVAL; > + } > +} > +static SENSOR_DEVICE_ATTR_RO(temp1_input, mt7921_thermal_temp, 0); > + > +static struct attribute *mt7921_hwmon_attrs[] = { > + &sensor_dev_attr_temp1_input.dev_attr.attr, > + NULL, > +}; > +ATTRIBUTE_GROUPS(mt7921_hwmon); > + > +static int mt7921_thermal_init(struct mt7921_phy *phy) > +{ > + struct wiphy *wiphy = phy->mt76->hw->wiphy; > + struct device *hwmon; > + const char *name; > + > + name = devm_kasprintf(&wiphy->dev, GFP_KERNEL, "mt7921_%s", > + wiphy_name(wiphy)); > + > + hwmon = devm_hwmon_device_register_with_groups(&wiphy->dev, name, phy, > + mt7921_hwmon_groups); > + if (IS_ERR(hwmon)) > + return PTR_ERR(hwmon); > + > + return 0; > +} > + > static void > mt7921_regd_notifier(struct wiphy *wiphy, > struct regulatory_request *request) > @@ -384,6 +431,12 @@ static void mt7921_init_work(struct work_struct *work) > return; > } > > + ret = mt7921_thermal_init(&dev->phy); > + if (ret) { > + dev_err(dev->mt76.dev, "thermal_init failed\n"); > + return; > + } > + > /* we support chip reset now */ > dev->hw_init_done = true; > > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > index 9c4dcc0e5a7c..abeedacc28f2 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c > @@ -1346,6 +1346,23 @@ int mt7921_mcu_set_clc(struct mt7921_dev *dev, u8 *alpha2, > return 0; > } > > +int mt7921_mcu_get_temperature(struct mt7921_phy *phy) > +{ > + struct mt7921_dev *dev = phy->dev; > + struct { > + u8 ctrl_id; > + u8 action; > + u8 band_idx; > + u8 rsv[5]; > + } req = { > + .ctrl_id = THERMAL_SENSOR_TEMP_QUERY, > + .band_idx = phy->mt76->band_idx, > + }; > + > + return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(THERMAL_CTRL), &req, > + sizeof(req), true); > +} > + > int mt7921_mcu_set_rxfilter(struct mt7921_dev *dev, u32 fif, > u8 bit_op, u32 bit_map) > { > diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > index 706f00df6836..85fddf99d497 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > +++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h > @@ -568,6 +568,7 @@ int mt7921_mcu_set_sniffer(struct mt7921_dev *dev, struct ieee80211_vif *vif, > bool enable); > int mt7921_mcu_config_sniffer(struct mt7921_vif *vif, > struct ieee80211_chanctx_conf *ctx); > +int mt7921_mcu_get_temperature(struct mt7921_phy *phy); > > int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, > enum mt76_txq_id qid, struct mt76_wcid *wcid, > -- > 2.40.0 >
Attachment:
signature.asc
Description: PGP signature