10e3d6777SRyder Lee /* SPDX-License-Identifier: ISC */
22735a6ddSStanislaw Gruszka /*
32735a6ddSStanislaw Gruszka * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
42735a6ddSStanislaw Gruszka * Copyright (C) 2018 Stanislaw Gruszka <stf_xl@wp.pl>
52735a6ddSStanislaw Gruszka */
62735a6ddSStanislaw Gruszka
72735a6ddSStanislaw Gruszka #ifndef __MT76X02_MAC_H
82735a6ddSStanislaw Gruszka #define __MT76X02_MAC_H
92735a6ddSStanislaw Gruszka
10d9f8934eSLorenzo Bianconi struct mt76x02_dev;
11d9f8934eSLorenzo Bianconi
12f5a7f126SStanislaw Gruszka struct mt76x02_tx_status {
13f5a7f126SStanislaw Gruszka u8 valid:1;
14f5a7f126SStanislaw Gruszka u8 success:1;
15f5a7f126SStanislaw Gruszka u8 aggr:1;
16f5a7f126SStanislaw Gruszka u8 ack_req:1;
17f5a7f126SStanislaw Gruszka u8 wcid;
18f5a7f126SStanislaw Gruszka u8 pktid;
19f5a7f126SStanislaw Gruszka u8 retry;
20f5a7f126SStanislaw Gruszka u16 rate;
21f5a7f126SStanislaw Gruszka } __packed __aligned(2);
22f5a7f126SStanislaw Gruszka
23cab12953SStanislaw Gruszka #define MT_VIF_WCID(_n) (254 - ((_n) & 7))
24cab12953SStanislaw Gruszka #define MT_MAX_VIFS 8
25cab12953SStanislaw Gruszka
26355f8d00SFelix Fietkau #define MT_PKTID_RATE GENMASK(4, 0)
27355f8d00SFelix Fietkau #define MT_PKTID_AC GENMASK(6, 5)
28355f8d00SFelix Fietkau
2998ff26e5SStanislaw Gruszka struct mt76x02_vif {
30c30bdfeaSFelix Fietkau struct mt76_wcid group_wcid; /* must be first */
3198ff26e5SStanislaw Gruszka u8 idx;
3298ff26e5SStanislaw Gruszka };
3398ff26e5SStanislaw Gruszka
34355f8d00SFelix Fietkau DECLARE_EWMA(pktlen, 8, 8);
35355f8d00SFelix Fietkau
36f5a7f126SStanislaw Gruszka struct mt76x02_sta {
37f5a7f126SStanislaw Gruszka struct mt76_wcid wcid; /* must be first */
38f5a7f126SStanislaw Gruszka
39f5a7f126SStanislaw Gruszka struct mt76x02_vif *vif;
40f5a7f126SStanislaw Gruszka struct mt76x02_tx_status status;
41f5a7f126SStanislaw Gruszka int n_frames;
42b2d91fb3SStanislaw Gruszka
43355f8d00SFelix Fietkau struct ewma_pktlen pktlen;
44f5a7f126SStanislaw Gruszka };
45f5a7f126SStanislaw Gruszka
465327b5eaSStanislaw Gruszka #define MT_RXINFO_BA BIT(0)
475327b5eaSStanislaw Gruszka #define MT_RXINFO_DATA BIT(1)
485327b5eaSStanislaw Gruszka #define MT_RXINFO_NULL BIT(2)
495327b5eaSStanislaw Gruszka #define MT_RXINFO_FRAG BIT(3)
505327b5eaSStanislaw Gruszka #define MT_RXINFO_UNICAST BIT(4)
515327b5eaSStanislaw Gruszka #define MT_RXINFO_MULTICAST BIT(5)
525327b5eaSStanislaw Gruszka #define MT_RXINFO_BROADCAST BIT(6)
535327b5eaSStanislaw Gruszka #define MT_RXINFO_MYBSS BIT(7)
545327b5eaSStanislaw Gruszka #define MT_RXINFO_CRCERR BIT(8)
555327b5eaSStanislaw Gruszka #define MT_RXINFO_ICVERR BIT(9)
565327b5eaSStanislaw Gruszka #define MT_RXINFO_MICERR BIT(10)
575327b5eaSStanislaw Gruszka #define MT_RXINFO_AMSDU BIT(11)
585327b5eaSStanislaw Gruszka #define MT_RXINFO_HTC BIT(12)
595327b5eaSStanislaw Gruszka #define MT_RXINFO_RSSI BIT(13)
605327b5eaSStanislaw Gruszka #define MT_RXINFO_L2PAD BIT(14)
615327b5eaSStanislaw Gruszka #define MT_RXINFO_AMPDU BIT(15)
625327b5eaSStanislaw Gruszka #define MT_RXINFO_DECRYPT BIT(16)
635327b5eaSStanislaw Gruszka #define MT_RXINFO_BSSIDX3 BIT(17)
645327b5eaSStanislaw Gruszka #define MT_RXINFO_WAPI_KEY BIT(18)
655327b5eaSStanislaw Gruszka #define MT_RXINFO_PN_LEN GENMASK(21, 19)
665327b5eaSStanislaw Gruszka #define MT_RXINFO_SW_FTYPE0 BIT(22)
675327b5eaSStanislaw Gruszka #define MT_RXINFO_SW_FTYPE1 BIT(23)
685327b5eaSStanislaw Gruszka #define MT_RXINFO_PROBE_RESP BIT(24)
695327b5eaSStanislaw Gruszka #define MT_RXINFO_BEACON BIT(25)
705327b5eaSStanislaw Gruszka #define MT_RXINFO_DISASSOC BIT(26)
715327b5eaSStanislaw Gruszka #define MT_RXINFO_DEAUTH BIT(27)
725327b5eaSStanislaw Gruszka #define MT_RXINFO_ACTION BIT(28)
735327b5eaSStanislaw Gruszka #define MT_RXINFO_TCP_SUM_ERR BIT(30)
745327b5eaSStanislaw Gruszka #define MT_RXINFO_IP_SUM_ERR BIT(31)
755327b5eaSStanislaw Gruszka
765327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_WCID GENMASK(7, 0)
775327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_KEY_IDX GENMASK(9, 8)
785327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_BSS_IDX GENMASK(12, 10)
795327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_UDF GENMASK(15, 13)
805327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_MPDU_LEN GENMASK(29, 16)
815327b5eaSStanislaw Gruszka #define MT_RXWI_CTL_EOF BIT(31)
825327b5eaSStanislaw Gruszka
835327b5eaSStanislaw Gruszka #define MT_RXWI_TID GENMASK(3, 0)
845327b5eaSStanislaw Gruszka #define MT_RXWI_SN GENMASK(15, 4)
855327b5eaSStanislaw Gruszka
865327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_INDEX GENMASK(5, 0)
875327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_LDPC BIT(6)
885327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_BW GENMASK(8, 7)
895327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_SGI BIT(9)
905327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_STBC BIT(10)
915327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_LDPC_EXSYM BIT(11)
925327b5eaSStanislaw Gruszka #define MT_RXWI_RATE_PHY GENMASK(15, 13)
935327b5eaSStanislaw Gruszka
945327b5eaSStanislaw Gruszka #define MT_RATE_INDEX_VHT_IDX GENMASK(3, 0)
955327b5eaSStanislaw Gruszka #define MT_RATE_INDEX_VHT_NSS GENMASK(5, 4)
965327b5eaSStanislaw Gruszka
975944cd02SStanislaw Gruszka struct mt76x02_rxwi {
985944cd02SStanislaw Gruszka __le32 rxinfo;
995944cd02SStanislaw Gruszka
1005944cd02SStanislaw Gruszka __le32 ctl;
1015944cd02SStanislaw Gruszka
1025944cd02SStanislaw Gruszka __le16 tid_sn;
1035944cd02SStanislaw Gruszka __le16 rate;
1045944cd02SStanislaw Gruszka
1055944cd02SStanislaw Gruszka u8 rssi[4];
1065944cd02SStanislaw Gruszka
1075944cd02SStanislaw Gruszka __le32 bbp_rxinfo[4];
1085944cd02SStanislaw Gruszka };
1095944cd02SStanislaw Gruszka
1105944cd02SStanislaw Gruszka #define MT_TX_PWR_ADJ GENMASK(3, 0)
1115944cd02SStanislaw Gruszka
1125944cd02SStanislaw Gruszka enum mt76x2_phy_bandwidth {
1135944cd02SStanislaw Gruszka MT_PHY_BW_20,
1145944cd02SStanislaw Gruszka MT_PHY_BW_40,
1155944cd02SStanislaw Gruszka MT_PHY_BW_80,
1165944cd02SStanislaw Gruszka };
1175944cd02SStanislaw Gruszka
1185944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_FRAG BIT(0)
1195944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_MMPS BIT(1)
1205944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_CFACK BIT(2)
1215944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_TS BIT(3)
1225944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_AMPDU BIT(4)
1235944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_MPDU_DENSITY GENMASK(7, 5)
1245944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_TXOP GENMASK(9, 8)
1255944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_NDPS BIT(10)
1265944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_RTSBWSIG BIT(11)
1275944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_NDP_BW GENMASK(13, 12)
1285944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_SOUND BIT(14)
1295944cd02SStanislaw Gruszka #define MT_TXWI_FLAGS_TX_RATE_LUT BIT(15)
1305944cd02SStanislaw Gruszka
1315944cd02SStanislaw Gruszka #define MT_TXWI_ACK_CTL_REQ BIT(0)
1325944cd02SStanislaw Gruszka #define MT_TXWI_ACK_CTL_NSEQ BIT(1)
1335944cd02SStanislaw Gruszka #define MT_TXWI_ACK_CTL_BA_WINDOW GENMASK(7, 2)
1345944cd02SStanislaw Gruszka
1355944cd02SStanislaw Gruszka struct mt76x02_txwi {
1365944cd02SStanislaw Gruszka __le16 flags;
1375944cd02SStanislaw Gruszka __le16 rate;
1385944cd02SStanislaw Gruszka u8 ack_ctl;
1395944cd02SStanislaw Gruszka u8 wcid;
1405944cd02SStanislaw Gruszka __le16 len_ctl;
1415944cd02SStanislaw Gruszka __le32 iv;
1425944cd02SStanislaw Gruszka __le32 eiv;
1435944cd02SStanislaw Gruszka u8 aid;
1445944cd02SStanislaw Gruszka u8 txstream;
1455944cd02SStanislaw Gruszka u8 ctl2;
1465944cd02SStanislaw Gruszka u8 pktid;
1475944cd02SStanislaw Gruszka } __packed __aligned(4);
1485944cd02SStanislaw Gruszka
mt76x02_wait_for_mac(struct mt76_dev * dev)1492735a6ddSStanislaw Gruszka static inline bool mt76x02_wait_for_mac(struct mt76_dev *dev)
1502735a6ddSStanislaw Gruszka {
1512735a6ddSStanislaw Gruszka const u32 MAC_CSR0 = 0x1000;
1522735a6ddSStanislaw Gruszka int i;
1532735a6ddSStanislaw Gruszka
1542735a6ddSStanislaw Gruszka for (i = 0; i < 500; i++) {
155011849e0SFelix Fietkau if (test_bit(MT76_REMOVED, &dev->phy.state))
1562cf5ac31SStanislaw Gruszka return false;
1572735a6ddSStanislaw Gruszka
1582735a6ddSStanislaw Gruszka switch (dev->bus->rr(dev, MAC_CSR0)) {
1592735a6ddSStanislaw Gruszka case 0:
1602735a6ddSStanislaw Gruszka case ~0:
1612735a6ddSStanislaw Gruszka break;
1622735a6ddSStanislaw Gruszka default:
1632735a6ddSStanislaw Gruszka return true;
1642735a6ddSStanislaw Gruszka }
1652735a6ddSStanislaw Gruszka usleep_range(5000, 10000);
1662735a6ddSStanislaw Gruszka }
1672735a6ddSStanislaw Gruszka return false;
1682735a6ddSStanislaw Gruszka }
1692735a6ddSStanislaw Gruszka
1707b37cce0SLorenzo Bianconi void mt76x02_mac_reset_counters(struct mt76x02_dev *dev);
171dd61100dSLorenzo Bianconi void mt76x02_mac_set_short_preamble(struct mt76x02_dev *dev, bool enable);
1728d66af49SLorenzo Bianconi int mt76x02_mac_shared_key_setup(struct mt76x02_dev *dev, u8 vif_idx,
1738d66af49SLorenzo Bianconi u8 key_idx, struct ieee80211_key_conf *key);
1748d66af49SLorenzo Bianconi int mt76x02_mac_wcid_set_key(struct mt76x02_dev *dev, u8 idx,
175047aed1cSStanislaw Gruszka struct ieee80211_key_conf *key);
17600496042SFelix Fietkau void mt76x02_mac_wcid_sync_pn(struct mt76x02_dev *dev, u8 idx,
17700496042SFelix Fietkau struct ieee80211_key_conf *key);
1788d66af49SLorenzo Bianconi void mt76x02_mac_wcid_setup(struct mt76x02_dev *dev, u8 idx, u8 vif_idx,
1798d66af49SLorenzo Bianconi u8 *mac);
1808d66af49SLorenzo Bianconi void mt76x02_mac_wcid_set_drop(struct mt76x02_dev *dev, u8 idx, bool drop);
1818d66af49SLorenzo Bianconi void mt76x02_mac_wcid_set_rate(struct mt76x02_dev *dev, struct mt76_wcid *wcid,
1825327b5eaSStanislaw Gruszka const struct ieee80211_tx_rate *rate);
1838d66af49SLorenzo Bianconi bool mt76x02_mac_load_tx_status(struct mt76x02_dev *dev,
184b490b1dfSStanislaw Gruszka struct mt76x02_tx_status *stat);
1858d66af49SLorenzo Bianconi void mt76x02_send_tx_status(struct mt76x02_dev *dev,
1867c1f8881SStanislaw Gruszka struct mt76x02_tx_status *stat, u8 *update);
187d9f8934eSLorenzo Bianconi int mt76x02_mac_process_rx(struct mt76x02_dev *dev, struct sk_buff *skb,
188d9f8934eSLorenzo Bianconi void *rxi);
18926a7b547SStanislaw Gruszka void mt76x02_mac_set_tx_protection(struct mt76x02_dev *dev, bool legacy_prot,
19026a7b547SStanislaw Gruszka int ht_mode);
19120ce270eSStanislaw Gruszka void mt76x02_mac_set_rts_thresh(struct mt76x02_dev *dev, u32 val);
1920b2d27e5SStanislaw Gruszka void mt76x02_mac_setaddr(struct mt76x02_dev *dev, const u8 *addr);
1938d66af49SLorenzo Bianconi void mt76x02_mac_write_txwi(struct mt76x02_dev *dev, struct mt76x02_txwi *txwi,
194427f9ebeSLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid,
195427f9ebeSLorenzo Bianconi struct ieee80211_sta *sta, int len);
1963e2342edSLorenzo Bianconi void mt76x02_mac_poll_tx_status(struct mt76x02_dev *dev, bool irq);
197d80e52c7SFelix Fietkau void mt76x02_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue_entry *e);
198*c560b137SRyder Lee void mt76x02_update_channel(struct mt76_phy *mphy);
1997dd73588SLorenzo Bianconi void mt76x02_mac_work(struct work_struct *work);
200dc33b251SLorenzo Bianconi
201aec65e48SFelix Fietkau void mt76x02_mac_cc_reset(struct mt76x02_dev *dev);
202dc33b251SLorenzo Bianconi void mt76x02_mac_set_bssid(struct mt76x02_dev *dev, u8 idx, const u8 *addr);
203b74f98b8SStanislaw Gruszka void mt76x02_mac_set_beacon(struct mt76x02_dev *dev, struct sk_buff *skb);
204dbb2b22bSStanislaw Gruszka void mt76x02_mac_set_beacon_enable(struct mt76x02_dev *dev,
205d5160d86SLorenzo Bianconi struct ieee80211_vif *vif, bool enable);
206f82ce8d9SLorenzo Bianconi
207a78f1547SLorenzo Bianconi void mt76x02_edcca_init(struct mt76x02_dev *dev);
2082735a6ddSStanislaw Gruszka #endif
209