xref: /openbmc/linux/drivers/net/wireless/mediatek/mt76/mt76x02_mac.h (revision 762f99f4f3cb41a775b5157dd761217beba65873)
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