* [PATCH] wifi: mt76: mt7921: add rfkill_poll for hardware rfkill
@ 2024-12-06 1:43 Allan Wang
2024-12-09 4:10 ` kernel test robot
0 siblings, 1 reply; 2+ messages in thread
From: Allan Wang @ 2024-12-06 1:43 UTC (permalink / raw)
To: nbd, lorenzo
Cc: deren.wu, mingyen.hsieh, Sean.Wang, Soul.Huang, Leon.Yen,
Michael.Lo, Eric-SY.Chang, km.lin, robin.chiu, ch.yeh, posh.sun,
Quan.Zhou, Ryder.Lee, Shayne.Chen, linux-wireless, linux-mediatek,
Allan Wang
Add mac80211 rfkill_poll ops to monitor hardware rfkill state
and state change will be updated.
Signed-off-by: Allan Wang <allan.wang@mediatek.com>
---
.../wireless/mediatek/mt76/mt76_connac_mcu.h | 2 ++
.../net/wireless/mediatek/mt76/mt7921/main.c | 18 ++++++++++++++++
.../net/wireless/mediatek/mt76/mt7921/mcu.c | 21 +++++++++++++++++++
.../net/wireless/mediatek/mt76/mt7921/mcu.h | 5 +++++
.../wireless/mediatek/mt76/mt7921/mt7921.h | 4 ++++
.../net/wireless/mediatek/mt76/mt7921/pci.c | 4 ++++
drivers/net/wireless/mediatek/mt76/mt792x.h | 1 +
7 files changed, 55 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
index 1b0e80dfc346..d3c03fb0d36a 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h
@@ -1043,6 +1043,7 @@ enum {
MCU_EXT_EVENT_CSA_NOTIFY = 0x4f,
MCU_EXT_EVENT_WA_TX_STAT = 0x74,
MCU_EXT_EVENT_BCC_NOTIFY = 0x75,
+ MCU_EXT_EVENT_WF_RF_PIN_CTRL = 0x9a,
MCU_EXT_EVENT_MURU_CTRL = 0x9f,
};
@@ -1251,6 +1252,7 @@ enum {
MCU_EXT_CMD_GROUP_PRE_CAL_INFO = 0xab,
MCU_EXT_CMD_DPD_PRE_CAL_INFO = 0xac,
MCU_EXT_CMD_PHY_STAT_INFO = 0xad,
+ MCU_EXT_CMD_WF_RF_PIN_CTRL = 0xbd,
};
enum {
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
index 573a2cd7fe45..18daf2bee27b 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
@@ -252,6 +252,11 @@ int __mt7921_start(struct mt792x_phy *phy)
return err;
}
+ if (phy->chip_cap & MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN) {
+ mt7921_mcu_wf_rf_pin_ctrl(phy, WF_RF_PIN_INIT);
+ wiphy_rfkill_start_polling(mphy->hw->wiphy);
+ }
+
return 0;
}
EXPORT_SYMBOL_GPL(__mt7921_start);
@@ -1398,6 +1403,18 @@ static void mt7921_mgd_complete_tx(struct ieee80211_hw *hw,
mt7921_abort_roc(mvif->phy, mvif);
}
+static void mt7921_rfkill_poll(struct ieee80211_hw *hw)
+{
+ struct mt792x_phy *phy = mt792x_hw_phy(hw);
+ int ret = 0;
+
+ mt792x_mutex_acquire(phy->dev);
+ ret = mt7921_mcu_wf_rf_pin_ctrl(phy, WF_RF_PIN_POLL);
+ mt792x_mutex_release(phy->dev);
+
+ wiphy_rfkill_set_hw_state(hw->wiphy, ret ? false : true);
+}
+
const struct ieee80211_ops mt7921_ops = {
.tx = mt792x_tx,
.start = mt7921_start,
@@ -1457,6 +1474,7 @@ const struct ieee80211_ops mt7921_ops = {
.unassign_vif_chanctx = mt792x_unassign_vif_chanctx,
.mgd_prepare_tx = mt7921_mgd_prepare_tx,
.mgd_complete_tx = mt7921_mgd_complete_tx,
+ .rfkill_poll = mt7921_rfkill_poll,
};
EXPORT_SYMBOL_GPL(mt7921_ops);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
index ddc5986086d9..5472a2765ab1 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
@@ -61,6 +61,12 @@ int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,
skb_pull(skb, sizeof(*rxd));
event = (struct mt76_connac_mcu_reg_event *)skb->data;
ret = (int)le32_to_cpu(event->val);
+ } else if (cmd == MCU_EXT_CMD(WF_RF_PIN_CTRL)) {
+ struct mt7921_wf_rf_pin_ctrl_event *event;
+
+ skb_pull(skb, sizeof(*rxd));
+ event = (struct mt7921_wf_rf_pin_ctrl_event *)skb->data;
+ ret = (int)le32_to_cpu(event->result);
} else {
skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
}
@@ -1427,6 +1433,21 @@ int mt7921_mcu_get_temperature(struct mt792x_phy *phy)
sizeof(req), true);
}
+int mt7921_mcu_wf_rf_pin_ctrl(struct mt792x_phy *phy, u8 action)
+{
+ struct mt792x_dev *dev = phy->dev;
+ struct {
+ u8 action;
+ u8 value;
+ } req = {
+ .action = action,
+ .value = 0,
+ };
+
+ return mt76_mcu_send_msg(&dev->mt76, MCU_EXT_CMD(WF_RF_PIN_CTRL), &req,
+ sizeof(req), action ? true : false);
+}
+
int mt7921_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
u8 bit_op, u32 bit_map)
{
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
index f9a259ee6b82..2834c6c53e58 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mcu.h
@@ -74,6 +74,11 @@ struct mt7921_txpwr_event {
struct mt7921_txpwr txpwr;
} __packed;
+struct mt7921_wf_rf_pin_ctrl_event {
+ u8 result;
+ u8 value;
+} __packed;
+
enum {
TM_SWITCH_MODE,
TM_SET_AT_CMD,
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
index 16c89815c0b8..5a221579b092 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
@@ -31,6 +31,9 @@
#define EXT_CMD_RADIO_ON_LED 0x2
#define EXT_CMD_RADIO_OFF_LED 0x3
+#define WF_RF_PIN_INIT 0x0
+#define WF_RF_PIN_POLL 0x1
+
enum {
UNI_ROC_ACQUIRE,
UNI_ROC_ABORT,
@@ -202,6 +205,7 @@ void mt7921_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb);
int mt7921_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,
u8 bit_op, u32 bit_map);
int mt7921_mcu_radio_led_ctrl(struct mt792x_dev *dev, u8 value);
+int mt7921_mcu_wf_rf_pin_ctrl(struct mt792x_phy *phy, u8 action);
static inline u32
mt7921_reg_map_l1(struct mt792x_dev *dev, u32 addr)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 67723c22aea6..b76660325599 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -42,6 +42,10 @@ static void mt7921e_unregister_device(struct mt792x_dev *dev)
{
int i;
struct mt76_connac_pm *pm = &dev->pm;
+ struct ieee80211_hw *hw = mt76_hw(dev);
+
+ if (dev->phy.chip_cap & MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN)
+ wiphy_rfkill_stop_polling(hw->wiphy);
cancel_work_sync(&dev->init_work);
mt76_unregister_device(&dev->mt76);
diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h
index ab12616ec2b8..11c57b9c7bb3 100644
--- a/drivers/net/wireless/mediatek/mt76/mt792x.h
+++ b/drivers/net/wireless/mediatek/mt76/mt792x.h
@@ -28,6 +28,7 @@
#define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0)
#define MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN BIT(1)
#define MT792x_CHIP_CAP_MLO_EVT_EN BIT(2)
+#define MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN BIT(3)
/* NOTE: used to map mt76_rates. idx may change if firmware expands table */
#define MT792x_BASIC_RATES_TBL 11
--
2.45.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] wifi: mt76: mt7921: add rfkill_poll for hardware rfkill
2024-12-06 1:43 [PATCH] wifi: mt76: mt7921: add rfkill_poll for hardware rfkill Allan Wang
@ 2024-12-09 4:10 ` kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2024-12-09 4:10 UTC (permalink / raw)
To: Allan Wang, nbd, lorenzo
Cc: oe-kbuild-all, deren.wu, mingyen.hsieh, Sean.Wang, Soul.Huang,
Leon.Yen, Michael.Lo, Eric-SY.Chang, km.lin, robin.chiu, ch.yeh,
posh.sun, Quan.Zhou, Ryder.Lee, Shayne.Chen, linux-wireless,
linux-mediatek, Allan Wang
Hi Allan,
kernel test robot noticed the following build warnings:
[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main linus/master v6.13-rc1 next-20241206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Allan-Wang/wifi-mt76-mt7921-add-rfkill_poll-for-hardware-rfkill/20241206-094523
base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link: https://lore.kernel.org/r/20241206014355.32426-1-allan.wang%40mediatek.com
patch subject: [PATCH] wifi: mt76: mt7921: add rfkill_poll for hardware rfkill
config: powerpc-randconfig-r113-20241207 (https://download.01.org/0day-ci/archive/20241207/202412071431.tF1EfPaT-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713)
reproduce: (https://download.01.org/0day-ci/archive/20241207/202412071431.tF1EfPaT-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412071431.tF1EfPaT-lkp@intel.com/
sparse warnings: (new ones prefixed by >>)
>> drivers/net/wireless/mediatek/mt76/mt7921/mcu.c:69:28: sparse: sparse: cast to restricted __le32
vim +69 drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
17
18 int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,
19 struct sk_buff *skb, int seq)
20 {
21 int mcu_cmd = FIELD_GET(__MCU_CMD_FIELD_ID, cmd);
22 struct mt76_connac2_mcu_rxd *rxd;
23 int ret = 0;
24
25 if (!skb) {
26 dev_err(mdev->dev, "Message %08x (seq %d) timeout\n",
27 cmd, seq);
28 mt792x_reset(mdev);
29
30 return -ETIMEDOUT;
31 }
32
33 rxd = (struct mt76_connac2_mcu_rxd *)skb->data;
34 if (seq != rxd->seq)
35 return -EAGAIN;
36
37 if (cmd == MCU_CMD(PATCH_SEM_CONTROL) ||
38 cmd == MCU_CMD(PATCH_FINISH_REQ)) {
39 skb_pull(skb, sizeof(*rxd) - 4);
40 ret = *skb->data;
41 } else if (cmd == MCU_EXT_CMD(THERMAL_CTRL)) {
42 skb_pull(skb, sizeof(*rxd) + 4);
43 ret = le32_to_cpu(*(__le32 *)skb->data);
44 } else if (cmd == MCU_UNI_CMD(DEV_INFO_UPDATE) ||
45 cmd == MCU_UNI_CMD(BSS_INFO_UPDATE) ||
46 cmd == MCU_UNI_CMD(STA_REC_UPDATE) ||
47 cmd == MCU_UNI_CMD(HIF_CTRL) ||
48 cmd == MCU_UNI_CMD(OFFLOAD) ||
49 cmd == MCU_UNI_CMD(SUSPEND)) {
50 struct mt76_connac_mcu_uni_event *event;
51
52 skb_pull(skb, sizeof(*rxd));
53 event = (struct mt76_connac_mcu_uni_event *)skb->data;
54 ret = le32_to_cpu(event->status);
55 /* skip invalid event */
56 if (mcu_cmd != event->cid)
57 ret = -EAGAIN;
58 } else if (cmd == MCU_CE_QUERY(REG_READ)) {
59 struct mt76_connac_mcu_reg_event *event;
60
61 skb_pull(skb, sizeof(*rxd));
62 event = (struct mt76_connac_mcu_reg_event *)skb->data;
63 ret = (int)le32_to_cpu(event->val);
64 } else if (cmd == MCU_EXT_CMD(WF_RF_PIN_CTRL)) {
65 struct mt7921_wf_rf_pin_ctrl_event *event;
66
67 skb_pull(skb, sizeof(*rxd));
68 event = (struct mt7921_wf_rf_pin_ctrl_event *)skb->data;
> 69 ret = (int)le32_to_cpu(event->result);
70 } else {
71 skb_pull(skb, sizeof(struct mt76_connac2_mcu_rxd));
72 }
73
74 return ret;
75 }
76 EXPORT_SYMBOL_GPL(mt7921_mcu_parse_response);
77
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-12-09 4:11 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-06 1:43 [PATCH] wifi: mt76: mt7921: add rfkill_poll for hardware rfkill Allan Wang
2024-12-09 4:10 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).