developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 1 | From a92a1c7b40b57f5d6594ae8170d7d9e3cd993aef Mon Sep 17 00:00:00 2001 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 2 | From: Sujuan Chen <sujuan.chen@mediatek.com> |
| 3 | Date: Sat, 10 Sep 2022 17:09:21 +0800 |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 4 | Subject: [PATCH 3002/3011] mt76: mt7915: wed: add-wed-tx-wds-support-on-mt7986 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 5 | |
| 6 | Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> |
| 7 | --- |
| 8 | mac80211.c | 5 ++++- |
| 9 | mt76.h | 2 ++ |
| 10 | mt7915/init.c | 9 +++++++++ |
developer | 275185a | 2022-10-12 18:25:15 +0800 | [diff] [blame] | 11 | mt7915/main.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 12 | mt7915/mcu.c | 12 ++++++++++-- |
| 13 | mt7915/mcu.h | 1 + |
developer | 3609d78 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 14 | mt7915/mmio.c | 1 + |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 15 | mt7915/mt7915.h | 4 ++++ |
developer | 3609d78 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 16 | 8 files changed, 74 insertions(+), 5 deletions(-) |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 17 | |
| 18 | diff --git a/mac80211.c b/mac80211.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 19 | index de9ef237..15d300a9 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 20 | --- a/mac80211.c |
| 21 | +++ b/mac80211.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 22 | @@ -1385,7 +1385,10 @@ void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 23 | |
| 24 | mt76_packet_id_flush(dev, wcid); |
| 25 | |
| 26 | - mt76_wcid_mask_clear(dev->wcid_mask, idx); |
developer | 275185a | 2022-10-12 18:25:15 +0800 | [diff] [blame] | 27 | + if (dev->drv->wed_wds_check && dev->drv->wed_wds_check(dev, sta)) |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 28 | + mt76_wcid_mask_clear(dev->wcid_wds_mask, idx); |
| 29 | + else |
| 30 | + mt76_wcid_mask_clear(dev->wcid_mask, idx); |
| 31 | mt76_wcid_mask_clear(dev->wcid_phy_mask, idx); |
| 32 | } |
| 33 | EXPORT_SYMBOL_GPL(__mt76_sta_remove); |
| 34 | diff --git a/mt76.h b/mt76.h |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 35 | index d102333b..74818a59 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 36 | --- a/mt76.h |
| 37 | +++ b/mt76.h |
developer | 3609d78 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 38 | @@ -465,6 +465,7 @@ struct mt76_driver_ops { |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 39 | |
| 40 | void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, |
| 41 | struct ieee80211_sta *sta); |
| 42 | + bool (*wed_wds_check)(struct mt76_dev *dev, struct ieee80211_sta *sta); |
| 43 | }; |
| 44 | |
| 45 | struct mt76_channel_state { |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 46 | @@ -849,6 +850,7 @@ struct mt76_dev { |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 47 | spinlock_t status_lock; |
| 48 | |
| 49 | u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; |
| 50 | + u32 wcid_wds_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; |
| 51 | u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; |
| 52 | |
| 53 | u64 vif_mask; |
| 54 | diff --git a/mt7915/init.c b/mt7915/init.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 55 | index 3f0a9d93..1ed519be 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 56 | --- a/mt7915/init.c |
| 57 | +++ b/mt7915/init.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 58 | @@ -793,6 +793,15 @@ mt7915_init_hardware(struct mt7915_dev *dev, struct mt7915_phy *phy2) |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 59 | return ret; |
| 60 | } |
| 61 | |
| 62 | + /* wds workaround for mt7986 */ |
| 63 | + if (mtk_wed_device_active(&dev->mt76.mmio.wed) && is_mt7986(&dev->mt76)) { |
| 64 | + for(idx = MT7915_WTBL_WDS_START; idx < MT7915_WTBL_WDS_END; idx++) |
| 65 | + mt76_wcid_mask_set(dev->mt76.wcid_mask, idx); |
| 66 | + |
| 67 | + for (idx = 0; idx < DIV_ROUND_UP(MT7915_WTBL_STA, 32); idx++) |
| 68 | + dev->mt76.wcid_wds_mask[idx] = ~dev->mt76.wcid_mask[idx]; |
| 69 | + } |
| 70 | + |
| 71 | /* Beacon and mgmt frames should occupy wcid 0 */ |
| 72 | idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); |
| 73 | if (idx) |
| 74 | diff --git a/mt7915/main.c b/mt7915/main.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 75 | index 370bfad7..0e08bde6 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 76 | --- a/mt7915/main.c |
| 77 | +++ b/mt7915/main.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 78 | @@ -663,6 +663,24 @@ mt7915_channel_switch_beacon(struct ieee80211_hw *hw, |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 79 | mutex_unlock(&dev->mt76.mutex); |
| 80 | } |
| 81 | |
| 82 | +bool |
| 83 | +mt7915_wed_wds_check(struct mt76_dev *mdev, struct ieee80211_sta *sta) |
| 84 | +{ |
| 85 | + struct mt7915_sta *msta = (struct mt7915_sta *)sta->drv_priv; |
| 86 | + |
| 87 | + if (!mtk_wed_device_active(&mdev->mmio.wed)) |
| 88 | + return false; |
| 89 | + |
| 90 | + if(!is_mt7986(mdev)) |
| 91 | + return false; |
| 92 | + |
| 93 | + if((msta->wcid.idx < MT7915_WTBL_WDS_START || |
| 94 | + msta->wcid.idx > MT7915_WTBL_WDS_END)) |
| 95 | + return false; |
| 96 | + |
| 97 | + return true; |
| 98 | +} |
| 99 | + |
| 100 | int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, |
| 101 | struct ieee80211_sta *sta) |
| 102 | { |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 103 | @@ -675,8 +693,18 @@ int mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 104 | #endif |
| 105 | int ret, idx; |
| 106 | u32 addr; |
| 107 | + bool wed_wds = false; |
developer | ec56711 | 2022-10-11 11:02:55 +0800 | [diff] [blame] | 108 | + |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 109 | + if (mtk_wed_device_active(&mdev->mmio.wed) && is_mt7986(mdev)) |
| 110 | + wed_wds = !!test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); |
developer | ec56711 | 2022-10-11 11:02:55 +0800 | [diff] [blame] | 111 | |
| 112 | - idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA); |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 113 | + if (wed_wds) |
| 114 | + idx = mt76_wcid_alloc(mdev->wcid_wds_mask, MT7915_WTBL_STA); |
| 115 | + else { |
| 116 | + idx = mt76_wcid_alloc(mdev->wcid_mask, MT7915_WTBL_STA); |
| 117 | + if (idx < 0) |
| 118 | + idx = mt76_wcid_alloc(mdev->wcid_wds_mask, MT7915_WTBL_STA); |
| 119 | + } |
| 120 | if (idx < 0) |
| 121 | return -ENOSPC; |
| 122 | |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 123 | @@ -1148,6 +1176,15 @@ static void mt7915_sta_set_4addr(struct ieee80211_hw *hw, |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 124 | else |
| 125 | clear_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags); |
| 126 | |
| 127 | + if (mtk_wed_device_active(&dev->mt76.mmio.wed) && |
| 128 | + is_mt7986(&dev->mt76) && |
| 129 | + (msta->wcid.idx < MT7915_WTBL_WDS_START || |
| 130 | + msta->wcid.idx > MT7915_WTBL_WDS_END)) { |
| 131 | + mt7915_sta_remove(hw, vif, sta); |
developer | 275185a | 2022-10-12 18:25:15 +0800 | [diff] [blame] | 132 | + mt76_sta_pre_rcu_remove(hw, vif, sta); |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 133 | + mt7915_sta_add(hw, vif, sta); |
| 134 | + } |
| 135 | + |
| 136 | mt76_connac_mcu_wtbl_update_hdr_trans(&dev->mt76, vif, sta); |
| 137 | } |
| 138 | |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 139 | @@ -1519,7 +1556,11 @@ mt7915_net_fill_forward_path(struct ieee80211_hw *hw, |
developer | 4b17052 | 2022-09-19 14:33:58 +0800 | [diff] [blame] | 140 | path->dev = ctx->dev; |
| 141 | path->mtk_wdma.wdma_idx = wed->wdma_idx; |
| 142 | path->mtk_wdma.bss = mvif->mt76.idx; |
developer | ec56711 | 2022-10-11 11:02:55 +0800 | [diff] [blame] | 143 | - path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? 0xff : 0x3ff; |
| 144 | + |
| 145 | + if (test_bit(MT_WCID_FLAG_4ADDR, &msta->wcid.flags)) |
developer | 4b17052 | 2022-09-19 14:33:58 +0800 | [diff] [blame] | 146 | + path->mtk_wdma.wcid = msta->wcid.idx; |
developer | ec56711 | 2022-10-11 11:02:55 +0800 | [diff] [blame] | 147 | + else |
| 148 | + path->mtk_wdma.wcid = is_mt7915(&dev->mt76) ? 0xff : 0x3ff; |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 149 | path->mtk_wdma.queue = phy != &dev->phy; |
| 150 | |
| 151 | ctx->dev = NULL; |
| 152 | diff --git a/mt7915/mcu.c b/mt7915/mcu.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 153 | index 785c3c10..0ad110ff 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 154 | --- a/mt7915/mcu.c |
| 155 | +++ b/mt7915/mcu.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 156 | @@ -2321,6 +2321,7 @@ mt7915_mcu_init_rx_airtime(struct mt7915_dev *dev) |
developer | 047bc18 | 2022-11-16 12:20:48 +0800 | [diff] [blame] | 157 | int mt7915_mcu_init_firmware(struct mt7915_dev *dev) |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 158 | { |
| 159 | int ret; |
| 160 | + struct mtk_wed_device *wed = &dev->mt76.mmio.wed; |
| 161 | |
| 162 | /* force firmware operation mode into normal state, |
| 163 | * which should be set before firmware download stage. |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 164 | @@ -2350,8 +2351,15 @@ int mt7915_mcu_init_firmware(struct mt7915_dev *dev) |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 165 | if (ret) |
| 166 | return ret; |
| 167 | |
| 168 | - if (mtk_wed_device_active(&dev->mt76.mmio.wed) && is_mt7915(&dev->mt76)) |
| 169 | - mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY), 0, 0, 0); |
| 170 | + if (mtk_wed_device_active(wed)) { |
| 171 | + if (is_mt7915(&dev->mt76)) |
| 172 | + mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(CAPABILITY), |
| 173 | + 0, 0, 0); |
| 174 | + else |
| 175 | + mt7915_mcu_wa_cmd(dev, MCU_WA_PARAM_CMD(SET), |
| 176 | + MCU_WA_PARAM_WED_VERSION, |
| 177 | + wed->rev_id, 0); |
| 178 | + } |
| 179 | |
| 180 | ret = mt7915_mcu_set_mwds(dev, 1); |
| 181 | if (ret) |
| 182 | diff --git a/mt7915/mcu.h b/mt7915/mcu.h |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 183 | index 08476eb6..cf1d7d7a 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 184 | --- a/mt7915/mcu.h |
| 185 | +++ b/mt7915/mcu.h |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 186 | @@ -288,6 +288,7 @@ enum { |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 187 | MCU_WA_PARAM_RED_SHOW_STA = 0xf, |
| 188 | MCU_WA_PARAM_RED_TARGET_DELAY = 0x10, |
| 189 | #endif |
| 190 | + MCU_WA_PARAM_WED_VERSION = 0x32, |
| 191 | }; |
| 192 | |
| 193 | enum mcu_mmps_mode { |
| 194 | diff --git a/mt7915/mmio.c b/mt7915/mmio.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 195 | index ac574722..ffe23406 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 196 | --- a/mt7915/mmio.c |
| 197 | +++ b/mt7915/mmio.c |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 198 | @@ -998,6 +998,7 @@ struct mt7915_dev *mt7915_mmio_probe(struct device *pdev, |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 199 | .sta_add = mt7915_mac_sta_add, |
| 200 | .sta_remove = mt7915_mac_sta_remove, |
| 201 | .update_survey = mt7915_update_channel, |
| 202 | + .wed_wds_check = mt7915_wed_wds_check, |
| 203 | }; |
| 204 | struct mt7915_dev *dev; |
| 205 | struct mt76_dev *mdev; |
| 206 | diff --git a/mt7915/mt7915.h b/mt7915/mt7915.h |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 207 | index 2d3769c6..51453058 100644 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 208 | --- a/mt7915/mt7915.h |
| 209 | +++ b/mt7915/mt7915.h |
| 210 | @@ -18,6 +18,9 @@ |
| 211 | #define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ |
| 212 | MT7915_MAX_INTERFACES) |
| 213 | |
| 214 | +#define MT7915_WTBL_WDS_START 256 |
| 215 | +#define MT7915_WTBL_WDS_END 271 |
| 216 | + |
| 217 | #define MT7915_WATCHDOG_TIME (HZ / 10) |
| 218 | #define MT7915_RESET_TIMEOUT (30 * HZ) |
| 219 | |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 220 | @@ -724,6 +727,7 @@ void mt7915_tx_token_put(struct mt7915_dev *dev); |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 221 | void mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, |
developer | 3609d78 | 2022-11-29 18:07:22 +0800 | [diff] [blame] | 222 | struct sk_buff *skb, u32 *info); |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 223 | bool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len); |
| 224 | +bool mt7915_wed_wds_check(struct mt76_dev *mdev, struct ieee80211_sta *sta); |
| 225 | void mt7915_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps); |
| 226 | void mt7915_stats_work(struct work_struct *work); |
| 227 | int mt76_dfs_start_rdd(struct mt7915_dev *dev, bool force); |
| 228 | -- |
developer | 17bb0a8 | 2022-12-13 15:52:04 +0800 | [diff] [blame^] | 229 | 2.25.1 |
developer | 5bbdf8b | 2022-09-12 14:42:56 +0800 | [diff] [blame] | 230 | |