blob: d233469e6cbeae5fe0f70ed6d1468334416ad3e7 [file] [log] [blame]
From 370321466ca479086d6e41c817552450030bd27a Mon Sep 17 00:00:00 2001
From: Howard Hsu <howard-yh.hsu@mediatek.com>
Date: Thu, 4 Jan 2024 19:53:37 +0800
Subject: [PATCH 096/120] mtk: wifi: mt76: mt7996: support thermal recal debug
command
Add support thermal recal debug command.
Usage:
$ echo val > debugfs/thermal_recal
The val can be the following values:
0 = disable
1 = enable
2 = manual trigger
CR-Id: WCNCR00261410
Change-Id: Ief064633dd7ab0faeb298ac3902ca1b399e70365
Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
---
mt76_connac_mcu.h | 1 +
mt7996/mt7996.h | 1 +
mt7996/mtk_debugfs.c | 17 +++++++++++++++++
mt7996/mtk_mcu.c | 21 +++++++++++++++++++++
4 files changed, 40 insertions(+)
diff --git a/mt76_connac_mcu.h b/mt76_connac_mcu.h
index 12fdc6e12..151183d08 100644
--- a/mt76_connac_mcu.h
+++ b/mt76_connac_mcu.h
@@ -1285,6 +1285,7 @@ enum {
MCU_UNI_CMD_TESTMODE_TRX_PARAM = 0x42,
MCU_UNI_CMD_TESTMODE_CTRL = 0x46,
MCU_UNI_CMD_PRECAL_RESULT = 0x47,
+ MCU_UNI_CMD_THERMAL_CAL = 0x4c,
MCU_UNI_CMD_RRO = 0x57,
MCU_UNI_CMD_OFFCH_SCAN_CTRL = 0x58,
MCU_UNI_CMD_PER_STA_INFO = 0x6d,
diff --git a/mt7996/mt7996.h b/mt7996/mt7996.h
index c8348bbcf..34c3167e7 100644
--- a/mt7996/mt7996.h
+++ b/mt7996/mt7996.h
@@ -1028,6 +1028,7 @@ void mt7996_mcu_set_cert(struct mt7996_phy *phy, u8 type);
void mt7996_tm_update_channel(struct mt7996_phy *phy);
int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val);
+int mt7996_mcu_thermal_debug(struct mt7996_dev *dev, u8 mode, u8 action);
#endif
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
diff --git a/mt7996/mtk_debugfs.c b/mt7996/mtk_debugfs.c
index 31319a46c..5f6c177e4 100644
--- a/mt7996/mtk_debugfs.c
+++ b/mt7996/mtk_debugfs.c
@@ -3153,6 +3153,22 @@ out:
DEFINE_DEBUGFS_ATTRIBUTE(fops_thermal_enable, mt7996_thermal_enable_get,
mt7996_thermal_enable_set, "%lld\n");
+static int
+mt7996_thermal_recal_set(void *data, u64 val)
+{
+#define THERMAL_DEBUG_OPERATION_MANUAL_TRIGGER 2
+#define THERMAL_DEBUG_MODE_RECAL 1
+ struct mt7996_dev *dev = data;
+
+ if (val > THERMAL_DEBUG_OPERATION_MANUAL_TRIGGER)
+ return -EINVAL;
+
+ return mt7996_mcu_thermal_debug(dev, THERMAL_DEBUG_MODE_RECAL, val);
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(fops_thermal_recal, NULL,
+ mt7996_thermal_recal_set, "%llu\n");
+
int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
{
struct mt7996_dev *dev = phy->dev;
@@ -3261,6 +3277,7 @@ int mt7996_mtk_init_debugfs(struct mt7996_phy *phy, struct dentry *dir)
}
debugfs_create_file("thermal_enable", 0600, dir, phy, &fops_thermal_enable);
+ debugfs_create_file("thermal_recal", 0200, dir, dev, &fops_thermal_recal);
return 0;
}
diff --git a/mt7996/mtk_mcu.c b/mt7996/mtk_mcu.c
index aed32e982..aa44b4710 100644
--- a/mt7996/mtk_mcu.c
+++ b/mt7996/mtk_mcu.c
@@ -1342,4 +1342,25 @@ int mt7996_mcu_set_vow_drr_dbg(struct mt7996_dev *dev, u32 val)
sizeof(req), true);
}
+int mt7996_mcu_thermal_debug(struct mt7996_dev *dev, u8 mode, u8 action)
+{
+ struct {
+ u8 __rsv1[4];
+
+ __le16 tag;
+ __le16 len;
+
+ u8 mode;
+ u8 action;
+ u8 __rsv2[2];
+ } __packed req = {
+ .tag = cpu_to_le16(mode),
+ .len = cpu_to_le16(sizeof(req) - 4),
+ .mode = mode,
+ .action = action,
+ };
+
+ return mt76_mcu_send_msg(&dev->mt76, MCU_WM_UNI_CMD(THERMAL_CAL), &req,
+ sizeof(req), true);
+}
#endif
--
2.39.2