mediatek: mt76-6e-usb: Copied entire code from v5.18.y
[platform/kernel/linux-rpi.git] / drivers / net / wireless / mediatek / mt76-6e-usb / mt7921 / pci_mac.c
1 // SPDX-License-Identifier: ISC
2 /* Copyright (C) 2021 MediaTek Inc. */
3
4 #include "mt7921.h"
5 #include "../dma.h"
6 #include "mac.h"
7
8 static void
9 mt7921_write_hw_txp(struct mt7921_dev *dev, struct mt76_tx_info *tx_info,
10                     void *txp_ptr, u32 id)
11 {
12         struct mt7921_hw_txp *txp = txp_ptr;
13         struct mt7921_txp_ptr *ptr = &txp->ptr[0];
14         int i, nbuf = tx_info->nbuf - 1;
15
16         tx_info->buf[0].len = MT_TXD_SIZE + sizeof(*txp);
17         tx_info->nbuf = 1;
18
19         txp->msdu_id[0] = cpu_to_le16(id | MT_MSDU_ID_VALID);
20
21         for (i = 0; i < nbuf; i++) {
22                 u16 len = tx_info->buf[i + 1].len & MT_TXD_LEN_MASK;
23                 u32 addr = tx_info->buf[i + 1].addr;
24
25                 if (i == nbuf - 1)
26                         len |= MT_TXD_LEN_LAST;
27
28                 if (i & 1) {
29                         ptr->buf1 = cpu_to_le32(addr);
30                         ptr->len1 = cpu_to_le16(len);
31                         ptr++;
32                 } else {
33                         ptr->buf0 = cpu_to_le32(addr);
34                         ptr->len0 = cpu_to_le16(len);
35                 }
36         }
37 }
38
39 int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
40                            enum mt76_txq_id qid, struct mt76_wcid *wcid,
41                            struct ieee80211_sta *sta,
42                            struct mt76_tx_info *tx_info)
43 {
44         struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
45         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
46         struct ieee80211_key_conf *key = info->control.hw_key;
47         struct mt76_txwi_cache *t;
48         struct mt7921_txp_common *txp;
49         int id, pid;
50         u8 *txwi = (u8 *)txwi_ptr;
51
52         if (unlikely(tx_info->skb->len <= ETH_HLEN))
53                 return -EINVAL;
54
55         if (!wcid)
56                 wcid = &dev->mt76.global_wcid;
57
58         t = (struct mt76_txwi_cache *)(txwi + mdev->drv->txwi_size);
59         t->skb = tx_info->skb;
60
61         id = mt76_token_consume(mdev, &t);
62         if (id < 0)
63                 return id;
64
65         if (sta) {
66                 struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;
67
68                 if (time_after(jiffies, msta->last_txs + HZ / 4)) {
69                         info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
70                         msta->last_txs = jiffies;
71                 }
72         }
73
74         pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
75         mt7921_mac_write_txwi(dev, txwi_ptr, tx_info->skb, wcid, key,
76                               pid, false);
77
78         txp = (struct mt7921_txp_common *)(txwi + MT_TXD_SIZE);
79         memset(txp, 0, sizeof(struct mt7921_txp_common));
80         mt7921_write_hw_txp(dev, tx_info, txp, id);
81
82         tx_info->skb = DMA_DUMMY_DATA;
83
84         return 0;
85 }
86
87 static void
88 mt7921_txp_skb_unmap(struct mt76_dev *dev, struct mt76_txwi_cache *t)
89 {
90         struct mt7921_txp_common *txp;
91         int i;
92
93         txp = mt7921_txwi_to_txp(dev, t);
94
95         for (i = 0; i < ARRAY_SIZE(txp->hw.ptr); i++) {
96                 struct mt7921_txp_ptr *ptr = &txp->hw.ptr[i];
97                 bool last;
98                 u16 len;
99
100                 len = le16_to_cpu(ptr->len0);
101                 last = len & MT_TXD_LEN_LAST;
102                 len &= MT_TXD_LEN_MASK;
103                 dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf0), len,
104                                  DMA_TO_DEVICE);
105                 if (last)
106                         break;
107
108                 len = le16_to_cpu(ptr->len1);
109                 last = len & MT_TXD_LEN_LAST;
110                 len &= MT_TXD_LEN_MASK;
111                 dma_unmap_single(dev->dev, le32_to_cpu(ptr->buf1), len,
112                                  DMA_TO_DEVICE);
113                 if (last)
114                         break;
115         }
116 }
117
118 static void
119 mt7921_txwi_free(struct mt7921_dev *dev, struct mt76_txwi_cache *t,
120                  struct ieee80211_sta *sta, bool clear_status,
121                  struct list_head *free_list)
122 {
123         struct mt76_dev *mdev = &dev->mt76;
124         __le32 *txwi;
125         u16 wcid_idx;
126
127         mt7921_txp_skb_unmap(mdev, t);
128         if (!t->skb)
129                 goto out;
130
131         txwi = (__le32 *)mt76_get_txwi_ptr(mdev, t);
132         if (sta) {
133                 struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
134
135                 if (likely(t->skb->protocol != cpu_to_be16(ETH_P_PAE)))
136                         mt7921_tx_check_aggr(sta, txwi);
137
138                 wcid_idx = wcid->idx;
139         } else {
140                 wcid_idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX);
141         }
142
143         __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list);
144
145 out:
146         t->skb = NULL;
147         mt76_put_txwi(mdev, t);
148 }
149
150 static void
151 mt7921e_mac_tx_free(struct mt7921_dev *dev, void *data, int len)
152 {
153         struct mt7921_tx_free *free = (struct mt7921_tx_free *)data;
154         struct mt76_dev *mdev = &dev->mt76;
155         struct mt76_txwi_cache *txwi;
156         struct ieee80211_sta *sta = NULL;
157         struct sk_buff *skb, *tmp;
158         void *end = data + len;
159         LIST_HEAD(free_list);
160         bool wake = false;
161         u8 i, count;
162
163         /* clean DMA queues and unmap buffers first */
164         mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false);
165         mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false);
166
167         count = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_CNT);
168         if (WARN_ON_ONCE((void *)&free->info[count] > end))
169                 return;
170
171         for (i = 0; i < count; i++) {
172                 u32 msdu, info = le32_to_cpu(free->info[i]);
173                 u8 stat;
174
175                 /* 1'b1: new wcid pair.
176                  * 1'b0: msdu_id with the same 'wcid pair' as above.
177                  */
178                 if (info & MT_TX_FREE_PAIR) {
179                         struct mt7921_sta *msta;
180                         struct mt76_wcid *wcid;
181                         u16 idx;
182
183                         count++;
184                         idx = FIELD_GET(MT_TX_FREE_WLAN_ID, info);
185                         wcid = rcu_dereference(dev->mt76.wcid[idx]);
186                         sta = wcid_to_sta(wcid);
187                         if (!sta)
188                                 continue;
189
190                         msta = container_of(wcid, struct mt7921_sta, wcid);
191                         spin_lock_bh(&dev->sta_poll_lock);
192                         if (list_empty(&msta->poll_list))
193                                 list_add_tail(&msta->poll_list, &dev->sta_poll_list);
194                         spin_unlock_bh(&dev->sta_poll_lock);
195                         continue;
196                 }
197
198                 msdu = FIELD_GET(MT_TX_FREE_MSDU_ID, info);
199                 stat = FIELD_GET(MT_TX_FREE_STATUS, info);
200
201                 txwi = mt76_token_release(mdev, msdu, &wake);
202                 if (!txwi)
203                         continue;
204
205                 mt7921_txwi_free(dev, txwi, sta, stat, &free_list);
206         }
207
208         if (wake)
209                 mt76_set_tx_blocked(&dev->mt76, false);
210
211         list_for_each_entry_safe(skb, tmp, &free_list, list) {
212                 skb_list_del_init(skb);
213                 napi_consume_skb(skb, 1);
214         }
215
216         rcu_read_lock();
217         mt7921_mac_sta_poll(dev);
218         rcu_read_unlock();
219
220         mt76_worker_schedule(&dev->mt76.tx_worker);
221 }
222
223 bool mt7921e_rx_check(struct mt76_dev *mdev, void *data, int len)
224 {
225         struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
226         __le32 *rxd = (__le32 *)data;
227         __le32 *end = (__le32 *)&rxd[len / 4];
228         enum rx_pkt_type type;
229
230         type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
231
232         switch (type) {
233         case PKT_TYPE_TXRX_NOTIFY:
234                 mt7921e_mac_tx_free(dev, data, len);
235                 return false;
236         case PKT_TYPE_TXS:
237                 for (rxd += 2; rxd + 8 <= end; rxd += 8)
238                         mt7921_mac_add_txs(dev, rxd);
239                 return false;
240         default:
241                 return true;
242         }
243 }
244
245 void mt7921e_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,
246                           struct sk_buff *skb)
247 {
248         struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);
249         __le32 *rxd = (__le32 *)skb->data;
250         enum rx_pkt_type type;
251
252         type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);
253
254         switch (type) {
255         case PKT_TYPE_TXRX_NOTIFY:
256                 mt7921e_mac_tx_free(dev, skb->data, skb->len);
257                 napi_consume_skb(skb, 1);
258                 break;
259         default:
260                 mt7921_queue_rx_skb(mdev, q, skb);
261                 break;
262         }
263 }
264
265 void mt7921e_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e)
266 {
267         if (!e->txwi) {
268                 dev_kfree_skb_any(e->skb);
269                 return;
270         }
271
272         /* error path */
273         if (e->skb == DMA_DUMMY_DATA) {
274                 struct mt76_txwi_cache *t;
275                 struct mt7921_txp_common *txp;
276                 u16 token;
277
278                 txp = mt7921_txwi_to_txp(mdev, e->txwi);
279                 token = le16_to_cpu(txp->hw.msdu_id[0]) & ~MT_MSDU_ID_VALID;
280                 t = mt76_token_put(mdev, token);
281                 e->skb = t ? t->skb : NULL;
282         }
283
284         if (e->skb)
285                 mt76_tx_complete_skb(mdev, e->wcid, e->skb);
286 }
287
288 void mt7921_tx_token_put(struct mt7921_dev *dev)
289 {
290         struct mt76_txwi_cache *txwi;
291         int id;
292
293         spin_lock_bh(&dev->mt76.token_lock);
294         idr_for_each_entry(&dev->mt76.token, txwi, id) {
295                 mt7921_txwi_free(dev, txwi, NULL, false, NULL);
296                 dev->mt76.token_count--;
297         }
298         spin_unlock_bh(&dev->mt76.token_lock);
299         idr_destroy(&dev->mt76.token);
300 }
301
302 int mt7921e_mac_reset(struct mt7921_dev *dev)
303 {
304         int i, err;
305
306         mt7921e_mcu_drv_pmctrl(dev);
307
308         mt76_connac_free_pending_tx_skbs(&dev->pm, NULL);
309
310         mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA, 0);
311         mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0x0);
312
313         set_bit(MT76_RESET, &dev->mphy.state);
314         set_bit(MT76_MCU_RESET, &dev->mphy.state);
315         wake_up(&dev->mt76.mcu.wait);
316         skb_queue_purge(&dev->mt76.mcu.res_q);
317
318         mt76_txq_schedule_all(&dev->mphy);
319
320         mt76_worker_disable(&dev->mt76.tx_worker);
321         napi_disable(&dev->mt76.napi[MT_RXQ_MAIN]);
322         napi_disable(&dev->mt76.napi[MT_RXQ_MCU]);
323         napi_disable(&dev->mt76.napi[MT_RXQ_MCU_WA]);
324         napi_disable(&dev->mt76.tx_napi);
325
326         mt7921_tx_token_put(dev);
327         idr_init(&dev->mt76.token);
328
329         mt7921_wpdma_reset(dev, true);
330
331         local_bh_disable();
332         mt76_for_each_q_rx(&dev->mt76, i) {
333                 napi_enable(&dev->mt76.napi[i]);
334                 napi_schedule(&dev->mt76.napi[i]);
335         }
336         local_bh_enable();
337
338         dev->fw_assert = false;
339         clear_bit(MT76_MCU_RESET, &dev->mphy.state);
340
341         mt76_wr(dev, MT_WFDMA0_HOST_INT_ENA,
342                 MT_INT_RX_DONE_ALL | MT_INT_TX_DONE_ALL |
343                 MT_INT_MCU_CMD);
344         mt76_wr(dev, MT_PCIE_MAC_INT_ENABLE, 0xff);
345
346         err = mt7921e_driver_own(dev);
347         if (err)
348                 return err;
349
350         err = mt7921_run_firmware(dev);
351         if (err)
352                 goto out;
353
354         err = mt7921_mcu_set_eeprom(dev);
355         if (err)
356                 goto out;
357
358         err = mt7921_mac_init(dev);
359         if (err)
360                 goto out;
361
362         err = __mt7921_start(&dev->phy);
363 out:
364         clear_bit(MT76_RESET, &dev->mphy.state);
365
366         local_bh_disable();
367         napi_enable(&dev->mt76.tx_napi);
368         napi_schedule(&dev->mt76.tx_napi);
369         local_bh_enable();
370
371         mt76_worker_enable(&dev->mt76.tx_worker);
372
373         return err;
374 }