summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2026-08-01 14:53:26 +0000
committerFelix Fietkau <nbd@nbd.name>2026-08-01 15:22:41 +0000
commitdc930cf883c81799f11f4da33a3711cad983de24 (patch)
tree76a9a425e8dc5644c08c8263643e67e7a7aec84f
parenta547b414bf7ea9877456b5630573293cc0e2cae7 (diff)
downloadlinux-dc930cf883c81799f11f4da33a3711cad983de24.tar.gz
linux-dc930cf883c81799f11f4da33a3711cad983de24.zip
wifi: mt76: mt7915: handle MCU PS sync events
Enable MT_DRV_HW_PS_BUFFERING and handle MCU_EXT_EVENT_PS_SYNC to track station power-save state via firmware notifications. Link: https://patch.msgid.link/20260801145334.1166751-2-nbd@nbd.name Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7915/mcu.c18
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7915/mcu.h9
-rw-r--r--drivers/net/wireless/mediatek/mt76/mt7915/mmio.c3
3 files changed, 29 insertions, 1 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
index 88955aed62e2..5bfe0366562f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
@@ -403,6 +403,21 @@ mt7915_mcu_rx_bcc_notify(struct mt7915_dev *dev, struct sk_buff *skb)
}
static void
+mt7915_mcu_rx_ps_sync(struct mt7915_dev *dev, struct sk_buff *skb)
+{
+ struct mt7915_mcu_ps_notify *p = (void *)skb->data;
+ struct mt76_wcid *wcid;
+ u16 wcid_idx;
+
+ wcid_idx = p->wtbl_lower | (p->wtbl_higher << 8);
+ wcid = mt76_wcid_ptr(dev, wcid_idx);
+ if (!wcid || !wcid_to_sta(wcid))
+ return;
+
+ mt76_sta_ps_transition(&dev->mt76, wcid, !!p->ps_bit);
+}
+
+static void
mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
{
struct mt76_connac2_mcu_rxd *rxd;
@@ -424,6 +439,9 @@ mt7915_mcu_rx_ext_event(struct mt7915_dev *dev, struct sk_buff *skb)
case MCU_EXT_EVENT_BCC_NOTIFY:
mt7915_mcu_rx_bcc_notify(dev, skb);
break;
+ case MCU_EXT_EVENT_PS_SYNC:
+ mt7915_mcu_rx_ps_sync(dev, skb);
+ break;
default:
break;
}
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
index 7c472062a90e..76e39e899797 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mcu.h
@@ -54,6 +54,15 @@ struct mt7915_mcu_bcc_notify {
u8 rsv;
} __packed;
+struct mt7915_mcu_ps_notify {
+ struct mt76_connac2_mcu_rxd_hdr rxd;
+
+ u8 wtbl_lower;
+ u8 ps_bit;
+ u8 wtbl_higher;
+ u8 rsv;
+} __packed;
+
struct mt7915_mcu_rdd_report {
struct mt76_connac2_mcu_rxd_hdr rxd;
diff --git a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
index 2708b1556f40..28377c964843 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
@@ -921,7 +921,8 @@ struct mt7915_dev *mt7915_mmio_probe(struct device *pdev,
/* txwi_size = txd size + txp size */
.txwi_size = MT_TXD_SIZE + sizeof(struct mt76_connac_fw_txp),
.drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ |
- MT_DRV_AMSDU_OFFLOAD,
+ MT_DRV_AMSDU_OFFLOAD |
+ MT_DRV_HW_PS_BUFFERING,
.survey_flags = SURVEY_INFO_TIME_TX |
SURVEY_INFO_TIME_RX |
SURVEY_INFO_TIME_BSS_RX,