10e3d6777SRyder Lee /* SPDX-License-Identifier: ISC */ 217f1de56SFelix Fietkau /* 317f1de56SFelix Fietkau * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 417f1de56SFelix Fietkau */ 517f1de56SFelix Fietkau 617f1de56SFelix Fietkau #ifndef __MT76_H 717f1de56SFelix Fietkau #define __MT76_H 817f1de56SFelix Fietkau 917f1de56SFelix Fietkau #include <linux/kernel.h> 1017f1de56SFelix Fietkau #include <linux/io.h> 1117f1de56SFelix Fietkau #include <linux/spinlock.h> 1217f1de56SFelix Fietkau #include <linux/skbuff.h> 1317f1de56SFelix Fietkau #include <linux/leds.h> 14b40b15e1SLorenzo Bianconi #include <linux/usb.h> 15ef13edc0SFelix Fietkau #include <linux/average.h> 1617f1de56SFelix Fietkau #include <net/mac80211.h> 1717f1de56SFelix Fietkau #include "util.h" 18f0efa862SFelix Fietkau #include "testmode.h" 1917f1de56SFelix Fietkau 2017f1de56SFelix Fietkau #define MT_MCU_RING_SIZE 32 2117f1de56SFelix Fietkau #define MT_RX_BUF_SIZE 2048 22123bc712SDeren Wu #define MT_SKB_HEAD_LEN 256 2317f1de56SFelix Fietkau 24e1378e52SFelix Fietkau #define MT_MAX_NON_AQL_PKT 16 25e1378e52SFelix Fietkau #define MT_TXQ_FREE_THR 32 26e1378e52SFelix Fietkau 27d089692bSLorenzo Bianconi #define MT76_TOKEN_FREE_THR 64 28d089692bSLorenzo Bianconi 2917f1de56SFelix Fietkau struct mt76_dev; 3096747a51SFelix Fietkau struct mt76_phy; 31469d4818SLorenzo Bianconi struct mt76_wcid; 323ad08509SLorenzo Bianconi struct mt76s_intr; 3317f1de56SFelix Fietkau 346da5a291SStanislaw Gruszka struct mt76_reg_pair { 356da5a291SStanislaw Gruszka u32 reg; 366da5a291SStanislaw Gruszka u32 value; 376da5a291SStanislaw Gruszka }; 386da5a291SStanislaw Gruszka 39c50479faSStanislaw Gruszka enum mt76_bus_type { 40c50479faSStanislaw Gruszka MT76_BUS_MMIO, 41c50479faSStanislaw Gruszka MT76_BUS_USB, 42d39b52e3SSean Wang MT76_BUS_SDIO, 43c50479faSStanislaw Gruszka }; 44c50479faSStanislaw Gruszka 4517f1de56SFelix Fietkau struct mt76_bus_ops { 4617f1de56SFelix Fietkau u32 (*rr)(struct mt76_dev *dev, u32 offset); 4717f1de56SFelix Fietkau void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); 4817f1de56SFelix Fietkau u32 (*rmw)(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 4935e4ebeaSLorenzo Bianconi void (*write_copy)(struct mt76_dev *dev, u32 offset, const void *data, 5035e4ebeaSLorenzo Bianconi int len); 5135e4ebeaSLorenzo Bianconi void (*read_copy)(struct mt76_dev *dev, u32 offset, void *data, 5217f1de56SFelix Fietkau int len); 536da5a291SStanislaw Gruszka int (*wr_rp)(struct mt76_dev *dev, u32 base, 546da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 556da5a291SStanislaw Gruszka int (*rd_rp)(struct mt76_dev *dev, u32 base, 566da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 57c50479faSStanislaw Gruszka enum mt76_bus_type type; 5817f1de56SFelix Fietkau }; 5917f1de56SFelix Fietkau 6061c51a74SLorenzo Bianconi #define mt76_is_usb(dev) ((dev)->bus->type == MT76_BUS_USB) 6161c51a74SLorenzo Bianconi #define mt76_is_mmio(dev) ((dev)->bus->type == MT76_BUS_MMIO) 62d39b52e3SSean Wang #define mt76_is_sdio(dev) ((dev)->bus->type == MT76_BUS_SDIO) 63c50479faSStanislaw Gruszka 6417f1de56SFelix Fietkau enum mt76_txq_id { 6517f1de56SFelix Fietkau MT_TXQ_VO = IEEE80211_AC_VO, 6617f1de56SFelix Fietkau MT_TXQ_VI = IEEE80211_AC_VI, 6717f1de56SFelix Fietkau MT_TXQ_BE = IEEE80211_AC_BE, 6817f1de56SFelix Fietkau MT_TXQ_BK = IEEE80211_AC_BK, 6917f1de56SFelix Fietkau MT_TXQ_PSD, 7017f1de56SFelix Fietkau MT_TXQ_BEACON, 7117f1de56SFelix Fietkau MT_TXQ_CAB, 7217f1de56SFelix Fietkau __MT_TXQ_MAX 7317f1de56SFelix Fietkau }; 7417f1de56SFelix Fietkau 75b1cb42adSLorenzo Bianconi enum mt76_mcuq_id { 76e637763bSLorenzo Bianconi MT_MCUQ_WM, 77e637763bSLorenzo Bianconi MT_MCUQ_WA, 78e637763bSLorenzo Bianconi MT_MCUQ_FWDL, 79b1cb42adSLorenzo Bianconi __MT_MCUQ_MAX 80b1cb42adSLorenzo Bianconi }; 81b1cb42adSLorenzo Bianconi 8217f1de56SFelix Fietkau enum mt76_rxq_id { 8317f1de56SFelix Fietkau MT_RXQ_MAIN, 8417f1de56SFelix Fietkau MT_RXQ_MCU, 85d3377b78SRyder Lee MT_RXQ_MCU_WA, 864c430774SLorenzo Bianconi MT_RXQ_EXT, 8776027f40SFelix Fietkau MT_RXQ_EXT_WA, 88f9b627f1SBo Jiao MT_RXQ_MAIN_WA, 8917f1de56SFelix Fietkau __MT_RXQ_MAX 9017f1de56SFelix Fietkau }; 9117f1de56SFelix Fietkau 92c368362cSRyder Lee enum mt76_cipher_type { 93c368362cSRyder Lee MT_CIPHER_NONE, 94c368362cSRyder Lee MT_CIPHER_WEP40, 95c368362cSRyder Lee MT_CIPHER_TKIP, 96c368362cSRyder Lee MT_CIPHER_TKIP_NO_MIC, 97c368362cSRyder Lee MT_CIPHER_AES_CCMP, 98c368362cSRyder Lee MT_CIPHER_WEP104, 99c368362cSRyder Lee MT_CIPHER_BIP_CMAC_128, 100c368362cSRyder Lee MT_CIPHER_WEP128, 101c368362cSRyder Lee MT_CIPHER_WAPI, 102c368362cSRyder Lee MT_CIPHER_CCMP_CCX, 103c368362cSRyder Lee MT_CIPHER_CCMP_256, 104c368362cSRyder Lee MT_CIPHER_GCMP, 105c368362cSRyder Lee MT_CIPHER_GCMP_256, 106c368362cSRyder Lee }; 107c368362cSRyder Lee 1083f306448SFelix Fietkau enum mt76_dfs_state { 1093f306448SFelix Fietkau MT_DFS_STATE_UNKNOWN, 1103f306448SFelix Fietkau MT_DFS_STATE_DISABLED, 1113f306448SFelix Fietkau MT_DFS_STATE_CAC, 1123f306448SFelix Fietkau MT_DFS_STATE_ACTIVE, 1133f306448SFelix Fietkau }; 1143f306448SFelix Fietkau 11517f1de56SFelix Fietkau struct mt76_queue_buf { 11617f1de56SFelix Fietkau dma_addr_t addr; 11727d5c528SFelix Fietkau u16 len; 11827d5c528SFelix Fietkau bool skip_unmap; 11917f1de56SFelix Fietkau }; 12017f1de56SFelix Fietkau 121b5903c47SLorenzo Bianconi struct mt76_tx_info { 122b5903c47SLorenzo Bianconi struct mt76_queue_buf buf[32]; 123cfaae9e6SLorenzo Bianconi struct sk_buff *skb; 124b5903c47SLorenzo Bianconi int nbuf; 125b5903c47SLorenzo Bianconi u32 info; 126b5903c47SLorenzo Bianconi }; 127b5903c47SLorenzo Bianconi 12817f1de56SFelix Fietkau struct mt76_queue_entry { 12917f1de56SFelix Fietkau union { 13017f1de56SFelix Fietkau void *buf; 13117f1de56SFelix Fietkau struct sk_buff *skb; 13217f1de56SFelix Fietkau }; 133b40b15e1SLorenzo Bianconi union { 13417f1de56SFelix Fietkau struct mt76_txwi_cache *txwi; 135d7d4ea9aSStanislaw Gruszka struct urb *urb; 136d39b52e3SSean Wang int buf_sz; 137b40b15e1SLorenzo Bianconi }; 13875d4bf1fSFelix Fietkau u32 dma_addr[2]; 13975d4bf1fSFelix Fietkau u16 dma_len[2]; 140e1378e52SFelix Fietkau u16 wcid; 1417bd0650bSLorenzo Bianconi bool skip_buf0:1; 14227d5c528SFelix Fietkau bool skip_buf1:1; 1437bd0650bSLorenzo Bianconi bool done:1; 14417f1de56SFelix Fietkau }; 14517f1de56SFelix Fietkau 14617f1de56SFelix Fietkau struct mt76_queue_regs { 14717f1de56SFelix Fietkau u32 desc_base; 14817f1de56SFelix Fietkau u32 ring_size; 14917f1de56SFelix Fietkau u32 cpu_idx; 15017f1de56SFelix Fietkau u32 dma_idx; 15117f1de56SFelix Fietkau } __packed __aligned(4); 15217f1de56SFelix Fietkau 15317f1de56SFelix Fietkau struct mt76_queue { 15417f1de56SFelix Fietkau struct mt76_queue_regs __iomem *regs; 15517f1de56SFelix Fietkau 15617f1de56SFelix Fietkau spinlock_t lock; 1579716ef04SFelix Fietkau spinlock_t cleanup_lock; 15817f1de56SFelix Fietkau struct mt76_queue_entry *entry; 15917f1de56SFelix Fietkau struct mt76_desc *desc; 16017f1de56SFelix Fietkau 161b40b15e1SLorenzo Bianconi u16 first; 16217f1de56SFelix Fietkau u16 head; 16317f1de56SFelix Fietkau u16 tail; 16417f1de56SFelix Fietkau int ndesc; 16517f1de56SFelix Fietkau int queued; 16617f1de56SFelix Fietkau int buf_size; 167cd44bc40SLorenzo Bianconi bool stopped; 16890d494c9SFelix Fietkau bool blocked; 16917f1de56SFelix Fietkau 17017f1de56SFelix Fietkau u8 buf_offset; 17117f1de56SFelix Fietkau u8 hw_idx; 172b671da33SLorenzo Bianconi u8 qid; 17317f1de56SFelix Fietkau 17417f1de56SFelix Fietkau dma_addr_t desc_dma; 17517f1de56SFelix Fietkau struct sk_buff *rx_head; 176c12128ceSFelix Fietkau struct page_frag_cache rx_page; 17717f1de56SFelix Fietkau }; 17817f1de56SFelix Fietkau 179db0f04f3SLorenzo Bianconi struct mt76_mcu_ops { 180bb31a80eSLorenzo Bianconi u32 headroom; 181bb31a80eSLorenzo Bianconi u32 tailroom; 182bb31a80eSLorenzo Bianconi 183a74d6336SStanislaw Gruszka int (*mcu_send_msg)(struct mt76_dev *dev, int cmd, const void *data, 184a74d6336SStanislaw Gruszka int len, bool wait_resp); 185f4d45fe2SLorenzo Bianconi int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb, 186e452c6ebSFelix Fietkau int cmd, int *seq); 187f320d812SFelix Fietkau int (*mcu_parse_response)(struct mt76_dev *dev, int cmd, 188f320d812SFelix Fietkau struct sk_buff *skb, int seq); 189d39b52e3SSean Wang u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset); 190d39b52e3SSean Wang void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val); 1916da5a291SStanislaw Gruszka int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base, 1926da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 1936da5a291SStanislaw Gruszka int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base, 1946da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 19500496042SFelix Fietkau int (*mcu_restart)(struct mt76_dev *dev); 196db0f04f3SLorenzo Bianconi }; 197db0f04f3SLorenzo Bianconi 19817f1de56SFelix Fietkau struct mt76_queue_ops { 199cb8ed33dSLorenzo Bianconi int (*init)(struct mt76_dev *dev, 200cb8ed33dSLorenzo Bianconi int (*poll)(struct napi_struct *napi, int budget)); 20117f1de56SFelix Fietkau 202b1bfbe70SLorenzo Bianconi int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q, 203b1bfbe70SLorenzo Bianconi int idx, int n_desc, int bufsize, 204b1bfbe70SLorenzo Bianconi u32 ring_base); 20517f1de56SFelix Fietkau 20689870594SLorenzo Bianconi int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q, 207469d4818SLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid, 208469d4818SLorenzo Bianconi struct ieee80211_sta *sta); 209469d4818SLorenzo Bianconi 210d95093a1SLorenzo Bianconi int (*tx_queue_skb_raw)(struct mt76_dev *dev, struct mt76_queue *q, 2115ed31128SLorenzo Bianconi struct sk_buff *skb, u32 tx_info); 2125ed31128SLorenzo Bianconi 21317f1de56SFelix Fietkau void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 21417f1de56SFelix Fietkau int *len, u32 *info, bool *more); 21517f1de56SFelix Fietkau 21617f1de56SFelix Fietkau void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 21717f1de56SFelix Fietkau 218e5655492SLorenzo Bianconi void (*tx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q, 21917f1de56SFelix Fietkau bool flush); 22017f1de56SFelix Fietkau 221c001df97SLorenzo Bianconi void (*rx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q); 222c001df97SLorenzo Bianconi 22317f1de56SFelix Fietkau void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 2243990465dSLorenzo Bianconi 2253990465dSLorenzo Bianconi void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q); 22617f1de56SFelix Fietkau }; 22717f1de56SFelix Fietkau 228d71ef286SFelix Fietkau enum mt76_wcid_flags { 229d71ef286SFelix Fietkau MT_WCID_FLAG_CHECK_PS, 230d71ef286SFelix Fietkau MT_WCID_FLAG_PS, 231e151d71eSFelix Fietkau MT_WCID_FLAG_4ADDR, 23290e3abf0SFelix Fietkau MT_WCID_FLAG_HDR_TRANS, 233d71ef286SFelix Fietkau }; 234d71ef286SFelix Fietkau 235b37d0c97SBo Jiao #define MT76_N_WCIDS 544 23636404c06SStanislaw Gruszka 237e394b575SFelix Fietkau /* stored in ieee80211_tx_info::hw_queue */ 238e394b575SFelix Fietkau #define MT_TX_HW_QUEUE_EXT_PHY BIT(3) 239e394b575SFelix Fietkau 240ef13edc0SFelix Fietkau DECLARE_EWMA(signal, 10, 8); 241ef13edc0SFelix Fietkau 242db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_RATE GENMASK(15, 0) 243db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_NSS GENMASK(17, 16) 244db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_TXPWR_ADJ GENMASK(25, 18) 245db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_SET BIT(31) 246db9f11d3SFelix Fietkau 24717f1de56SFelix Fietkau struct mt76_wcid { 248aee5b8cfSFelix Fietkau struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 249aee5b8cfSFelix Fietkau 250e1378e52SFelix Fietkau atomic_t non_aql_packets; 251d71ef286SFelix Fietkau unsigned long flags; 252d71ef286SFelix Fietkau 253ef13edc0SFelix Fietkau struct ewma_signal rssi; 254ef13edc0SFelix Fietkau int inactive_count; 255ef13edc0SFelix Fietkau 2569908d98aSRyder Lee struct rate_info rate; 2579908d98aSRyder Lee 25849e649c3SRyder Lee u16 idx; 25917f1de56SFelix Fietkau u8 hw_key_idx; 260730d6d0dSFelix Fietkau u8 hw_key_idx2; 26117f1de56SFelix Fietkau 2629c68a57bSFelix Fietkau u8 sta:1; 263c7d2d631SFelix Fietkau u8 ext_phy:1; 264b443e55fSRyder Lee u8 amsdu:1; 2659c68a57bSFelix Fietkau 26630ce7f44SFelix Fietkau u8 rx_check_pn; 267a1b0bbd4SXing Song u8 rx_key_pn[IEEE80211_NUM_TIDS + 1][6]; 26801cfc1b4SLorenzo Bianconi u16 cipher; 26930ce7f44SFelix Fietkau 270db9f11d3SFelix Fietkau u32 tx_info; 27123405236SFelix Fietkau bool sw_iv; 27288046b2cSFelix Fietkau 273bd1e3e7bSLorenzo Bianconi struct list_head list; 274bd1e3e7bSLorenzo Bianconi struct idr pktid; 27517f1de56SFelix Fietkau }; 27617f1de56SFelix Fietkau 27717f1de56SFelix Fietkau struct mt76_txq { 27851fb1278SFelix Fietkau u16 wcid; 27917f1de56SFelix Fietkau 28017f1de56SFelix Fietkau u16 agg_ssn; 28117f1de56SFelix Fietkau bool send_bar; 28217f1de56SFelix Fietkau bool aggr; 28317f1de56SFelix Fietkau }; 28417f1de56SFelix Fietkau 28517f1de56SFelix Fietkau struct mt76_txwi_cache { 28617f1de56SFelix Fietkau struct list_head list; 287f3950a41SLorenzo Bianconi dma_addr_t dma_addr; 2886ca66722SLorenzo Bianconi 2896ca66722SLorenzo Bianconi struct sk_buff *skb; 29017f1de56SFelix Fietkau }; 29117f1de56SFelix Fietkau 292aee5b8cfSFelix Fietkau struct mt76_rx_tid { 293aee5b8cfSFelix Fietkau struct rcu_head rcu_head; 294aee5b8cfSFelix Fietkau 295aee5b8cfSFelix Fietkau struct mt76_dev *dev; 296aee5b8cfSFelix Fietkau 297aee5b8cfSFelix Fietkau spinlock_t lock; 298aee5b8cfSFelix Fietkau struct delayed_work reorder_work; 299aee5b8cfSFelix Fietkau 300aee5b8cfSFelix Fietkau u16 head; 3017c4f744dSRyder Lee u16 size; 3027c4f744dSRyder Lee u16 nframes; 303aee5b8cfSFelix Fietkau 304e7ec563eSMarkus Theil u8 num; 305e7ec563eSMarkus Theil 306aee5b8cfSFelix Fietkau u8 started:1, stopped:1, timer_pending:1; 307aee5b8cfSFelix Fietkau 308aee5b8cfSFelix Fietkau struct sk_buff *reorder_buf[]; 309aee5b8cfSFelix Fietkau }; 310aee5b8cfSFelix Fietkau 31188046b2cSFelix Fietkau #define MT_TX_CB_DMA_DONE BIT(0) 31288046b2cSFelix Fietkau #define MT_TX_CB_TXS_DONE BIT(1) 31388046b2cSFelix Fietkau #define MT_TX_CB_TXS_FAILED BIT(2) 31488046b2cSFelix Fietkau 3158548c6ebSFelix Fietkau #define MT_PACKET_ID_MASK GENMASK(6, 0) 316013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_ACK 0 317013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_SKB 1 318013b2dffSFelix Fietkau #define MT_PACKET_ID_FIRST 2 3198548c6ebSFelix Fietkau #define MT_PACKET_ID_HAS_RATE BIT(7) 320c4a784e3SLorenzo Bianconi /* This is timer for when to give up when waiting for TXS callback, 321c4a784e3SLorenzo Bianconi * with starting time being the time at which the DMA_DONE callback 322c4a784e3SLorenzo Bianconi * was seen (so, we know packet was processed then, it should not take 323c4a784e3SLorenzo Bianconi * long after that for firmware to send the TXS callback if it is going 324c4a784e3SLorenzo Bianconi * to do so.) 325c4a784e3SLorenzo Bianconi */ 326c4a784e3SLorenzo Bianconi #define MT_TX_STATUS_SKB_TIMEOUT (HZ / 4) 32788046b2cSFelix Fietkau 32888046b2cSFelix Fietkau struct mt76_tx_cb { 32988046b2cSFelix Fietkau unsigned long jiffies; 33049e649c3SRyder Lee u16 wcid; 33188046b2cSFelix Fietkau u8 pktid; 33288046b2cSFelix Fietkau u8 flags; 33388046b2cSFelix Fietkau }; 33488046b2cSFelix Fietkau 33517f1de56SFelix Fietkau enum { 33617f1de56SFelix Fietkau MT76_STATE_INITIALIZED, 33717f1de56SFelix Fietkau MT76_STATE_RUNNING, 33887e022deSStanislaw Gruszka MT76_STATE_MCU_RUNNING, 33917f1de56SFelix Fietkau MT76_SCANNING, 340fcdfc29eSLorenzo Bianconi MT76_HW_SCANNING, 34120305f98SLorenzo Bianconi MT76_HW_SCHED_SCANNING, 342fd6c2dfaSFelix Fietkau MT76_RESTART, 34317f1de56SFelix Fietkau MT76_RESET, 34461c4fa72SFelix Fietkau MT76_MCU_RESET, 345b40b15e1SLorenzo Bianconi MT76_REMOVED, 346b40b15e1SLorenzo Bianconi MT76_READING_STATS, 347eb99cc95SLorenzo Bianconi MT76_STATE_POWER_OFF, 348c6bf2010SLorenzo Bianconi MT76_STATE_SUSPEND, 3497307f296SLorenzo Bianconi MT76_STATE_ROC, 35008523a2aSLorenzo Bianconi MT76_STATE_PM, 35117f1de56SFelix Fietkau }; 35217f1de56SFelix Fietkau 35317f1de56SFelix Fietkau struct mt76_hw_cap { 35417f1de56SFelix Fietkau bool has_2ghz; 35517f1de56SFelix Fietkau bool has_5ghz; 356f7d2958cSLorenzo Bianconi bool has_6ghz; 35717f1de56SFelix Fietkau }; 35817f1de56SFelix Fietkau 3599ec0b821SFelix Fietkau #define MT_DRV_TXWI_NO_FREE BIT(0) 3609ec0b821SFelix Fietkau #define MT_DRV_TX_ALIGNED4_SKBS BIT(1) 3615ce09c1aSFelix Fietkau #define MT_DRV_SW_RX_AIRTIME BIT(2) 36294d4d076SLorenzo Bianconi #define MT_DRV_RX_DMA_HDR BIT(3) 363d3c82998SLorenzo Bianconi #define MT_DRV_HW_MGMT_TXQ BIT(4) 3646ca66722SLorenzo Bianconi 36517f1de56SFelix Fietkau struct mt76_driver_ops { 3669ec0b821SFelix Fietkau u32 drv_flags; 367ea565833SFelix Fietkau u32 survey_flags; 36817f1de56SFelix Fietkau u16 txwi_size; 369d089692bSLorenzo Bianconi u16 token_size; 37022b980baSFelix Fietkau u8 mcs_rates; 37117f1de56SFelix Fietkau 372c560b137SRyder Lee void (*update_survey)(struct mt76_phy *phy); 37317f1de56SFelix Fietkau 37417f1de56SFelix Fietkau int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 375cfaae9e6SLorenzo Bianconi enum mt76_txq_id qid, struct mt76_wcid *wcid, 376b5903c47SLorenzo Bianconi struct ieee80211_sta *sta, 377b5903c47SLorenzo Bianconi struct mt76_tx_info *tx_info); 37817f1de56SFelix Fietkau 379d80e52c7SFelix Fietkau void (*tx_complete_skb)(struct mt76_dev *dev, 380e226ba2eSLorenzo Bianconi struct mt76_queue_entry *e); 38117f1de56SFelix Fietkau 382b40b15e1SLorenzo Bianconi bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 383b40b15e1SLorenzo Bianconi 384fbe50d9aSFelix Fietkau bool (*rx_check)(struct mt76_dev *dev, void *data, int len); 385fbe50d9aSFelix Fietkau 38617f1de56SFelix Fietkau void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 38717f1de56SFelix Fietkau struct sk_buff *skb); 38817f1de56SFelix Fietkau 38917f1de56SFelix Fietkau void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 390d71ef286SFelix Fietkau 391d71ef286SFelix Fietkau void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 392d71ef286SFelix Fietkau bool ps); 393e28487eaSFelix Fietkau 394e28487eaSFelix Fietkau int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif, 395e28487eaSFelix Fietkau struct ieee80211_sta *sta); 396e28487eaSFelix Fietkau 3979c193de5SFelix Fietkau void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3989c193de5SFelix Fietkau struct ieee80211_sta *sta); 3999c193de5SFelix Fietkau 400e28487eaSFelix Fietkau void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, 401e28487eaSFelix Fietkau struct ieee80211_sta *sta); 40217f1de56SFelix Fietkau }; 40317f1de56SFelix Fietkau 40417f1de56SFelix Fietkau struct mt76_channel_state { 40517f1de56SFelix Fietkau u64 cc_active; 40617f1de56SFelix Fietkau u64 cc_busy; 4076bfa6e38SLorenzo Bianconi u64 cc_rx; 4085ce09c1aSFelix Fietkau u64 cc_bss_rx; 409ea565833SFelix Fietkau u64 cc_tx; 410e5051965SFelix Fietkau 411e5051965SFelix Fietkau s8 noise; 41217f1de56SFelix Fietkau }; 41317f1de56SFelix Fietkau 41417f1de56SFelix Fietkau struct mt76_sband { 41517f1de56SFelix Fietkau struct ieee80211_supported_band sband; 41617f1de56SFelix Fietkau struct mt76_channel_state *chan; 41717f1de56SFelix Fietkau }; 41817f1de56SFelix Fietkau 419b6862effSLorenzo Bianconi struct mt76_rate_power { 420b6862effSLorenzo Bianconi union { 421b6862effSLorenzo Bianconi struct { 422b6862effSLorenzo Bianconi s8 cck[4]; 423b6862effSLorenzo Bianconi s8 ofdm[8]; 424b6862effSLorenzo Bianconi s8 stbc[10]; 425b6862effSLorenzo Bianconi s8 ht[16]; 426b6862effSLorenzo Bianconi s8 vht[10]; 427b6862effSLorenzo Bianconi }; 428b6862effSLorenzo Bianconi s8 all[48]; 429b6862effSLorenzo Bianconi }; 430b6862effSLorenzo Bianconi }; 431b6862effSLorenzo Bianconi 432b40b15e1SLorenzo Bianconi /* addr req mask */ 433b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_EEPROM BIT(31) 434b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_CFG BIT(30) 435b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 436b40b15e1SLorenzo Bianconi 437b40b15e1SLorenzo Bianconi #define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 438b40b15e1SLorenzo Bianconi enum mt_vendor_req { 439b40b15e1SLorenzo Bianconi MT_VEND_DEV_MODE = 0x1, 440b40b15e1SLorenzo Bianconi MT_VEND_WRITE = 0x2, 4411e816c65SLorenzo Bianconi MT_VEND_POWER_ON = 0x4, 442b40b15e1SLorenzo Bianconi MT_VEND_MULTI_WRITE = 0x6, 443b40b15e1SLorenzo Bianconi MT_VEND_MULTI_READ = 0x7, 444b40b15e1SLorenzo Bianconi MT_VEND_READ_EEPROM = 0x9, 445b40b15e1SLorenzo Bianconi MT_VEND_WRITE_FCE = 0x42, 446b40b15e1SLorenzo Bianconi MT_VEND_WRITE_CFG = 0x46, 447b40b15e1SLorenzo Bianconi MT_VEND_READ_CFG = 0x47, 4481e816c65SLorenzo Bianconi MT_VEND_READ_EXT = 0x63, 4491e816c65SLorenzo Bianconi MT_VEND_WRITE_EXT = 0x66, 450d0846f08SSean Wang MT_VEND_FEATURE_SET = 0x91, 451b40b15e1SLorenzo Bianconi }; 452b40b15e1SLorenzo Bianconi 453b40b15e1SLorenzo Bianconi enum mt76u_in_ep { 454b40b15e1SLorenzo Bianconi MT_EP_IN_PKT_RX, 455b40b15e1SLorenzo Bianconi MT_EP_IN_CMD_RESP, 456b40b15e1SLorenzo Bianconi __MT_EP_IN_MAX, 457b40b15e1SLorenzo Bianconi }; 458b40b15e1SLorenzo Bianconi 459b40b15e1SLorenzo Bianconi enum mt76u_out_ep { 460b40b15e1SLorenzo Bianconi MT_EP_OUT_INBAND_CMD, 461b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BE, 46223cb16d2SLorenzo Bianconi MT_EP_OUT_AC_BK, 463b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VI, 464b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VO, 465b40b15e1SLorenzo Bianconi MT_EP_OUT_HCCA, 466b40b15e1SLorenzo Bianconi __MT_EP_OUT_MAX, 467b40b15e1SLorenzo Bianconi }; 468b40b15e1SLorenzo Bianconi 46909872957SLorenzo Bianconi struct mt76_mcu { 47009872957SLorenzo Bianconi struct mutex mutex; 47109872957SLorenzo Bianconi u32 msg_seq; 472e452c6ebSFelix Fietkau int timeout; 47309872957SLorenzo Bianconi 47409872957SLorenzo Bianconi struct sk_buff_head res_q; 47509872957SLorenzo Bianconi wait_queue_head_t wait; 47609872957SLorenzo Bianconi }; 47709872957SLorenzo Bianconi 47814663f0cSLorenzo Bianconi #define MT_TX_SG_MAX_SIZE 8 479972c5981SSean Wang #define MT_RX_SG_MAX_SIZE 4 480b40b15e1SLorenzo Bianconi #define MT_NUM_TX_ENTRIES 256 481b40b15e1SLorenzo Bianconi #define MT_NUM_RX_ENTRIES 128 482b40b15e1SLorenzo Bianconi #define MCU_RESP_URB_SIZE 1024 483b40b15e1SLorenzo Bianconi struct mt76_usb { 484b40b15e1SLorenzo Bianconi struct mutex usb_ctrl_mtx; 485a6bfb6d1SStanislaw Gruszka u8 *data; 486a6bfb6d1SStanislaw Gruszka u16 data_len; 487b40b15e1SLorenzo Bianconi 4889daf27e6SLorenzo Bianconi struct mt76_worker status_worker; 489be83a7e2SLorenzo Bianconi struct mt76_worker rx_worker; 4909daf27e6SLorenzo Bianconi 491284efb47SLorenzo Bianconi struct work_struct stat_work; 492b40b15e1SLorenzo Bianconi 493b40b15e1SLorenzo Bianconi u8 out_ep[__MT_EP_OUT_MAX]; 494b40b15e1SLorenzo Bianconi u8 in_ep[__MT_EP_IN_MAX]; 49563a7de5dSLorenzo Bianconi bool sg_en; 496b40b15e1SLorenzo Bianconi 497b40b15e1SLorenzo Bianconi struct mt76u_mcu { 498a18a494fSStanislaw Gruszka u8 *data; 499851ab66eSLorenzo Bianconi /* multiple reads */ 500851ab66eSLorenzo Bianconi struct mt76_reg_pair *rp; 501851ab66eSLorenzo Bianconi int rp_len; 502851ab66eSLorenzo Bianconi u32 base; 503851ab66eSLorenzo Bianconi bool burst; 504b40b15e1SLorenzo Bianconi } mcu; 505b40b15e1SLorenzo Bianconi }; 506b40b15e1SLorenzo Bianconi 507bf08d585SSean Wang #define MT76S_XMIT_BUF_SZ 0x3fe00 508b1460bb4SDeren Wu #define MT76S_NUM_TX_ENTRIES 256 509b1460bb4SDeren Wu #define MT76S_NUM_RX_ENTRIES 512 510d39b52e3SSean Wang struct mt76_sdio { 511fefb584dSLorenzo Bianconi struct mt76_worker txrx_worker; 5126a618acbSLorenzo Bianconi struct mt76_worker status_worker; 5136a618acbSLorenzo Bianconi struct mt76_worker net_worker; 5146a618acbSLorenzo Bianconi 515d74fda4cSLorenzo Bianconi struct work_struct stat_work; 516974327a4SLorenzo Bianconi 517bf08d585SSean Wang u8 *xmit_buf; 518bf08d585SSean Wang u32 xmit_buf_sz; 5191522ff73SLorenzo Bianconi 520d39b52e3SSean Wang struct sdio_func *func; 521b4964908SSean Wang void *intr_data; 522dacf0acfSSean Wang u8 hw_ver; 523ca74b9b9SSean Wang wait_queue_head_t wait; 524d39b52e3SSean Wang 525d39b52e3SSean Wang struct { 526d39b52e3SSean Wang int pse_data_quota; 527d39b52e3SSean Wang int ple_data_quota; 528d39b52e3SSean Wang int pse_mcu_quota; 5298c94f0e6SSean Wang int pse_page_size; 530d39b52e3SSean Wang int deficit; 531d39b52e3SSean Wang } sched; 5323ad08509SLorenzo Bianconi 5333ad08509SLorenzo Bianconi int (*parse_irq)(struct mt76_dev *dev, struct mt76s_intr *intr); 534d39b52e3SSean Wang }; 535d39b52e3SSean Wang 536f7bbb80fSLorenzo Bianconi struct mt76_mmio { 53727db1ad1SLorenzo Bianconi void __iomem *regs; 538957068c2SLorenzo Bianconi spinlock_t irq_lock; 539957068c2SLorenzo Bianconi u32 irqmask; 540f7bbb80fSLorenzo Bianconi }; 541f7bbb80fSLorenzo Bianconi 5425ce09c1aSFelix Fietkau struct mt76_rx_status { 5435ce09c1aSFelix Fietkau union { 5445ce09c1aSFelix Fietkau struct mt76_wcid *wcid; 54549e649c3SRyder Lee u16 wcid_idx; 5465ce09c1aSFelix Fietkau }; 5475ce09c1aSFelix Fietkau 5480fda6d7bSRyder Lee u32 reorder_time; 5495ce09c1aSFelix Fietkau 5505ce09c1aSFelix Fietkau u32 ampdu_ref; 5510fda6d7bSRyder Lee u32 timestamp; 5525ce09c1aSFelix Fietkau 5535ce09c1aSFelix Fietkau u8 iv[6]; 5545ce09c1aSFelix Fietkau 555bfc394ddSFelix Fietkau u8 ext_phy:1; 5565ce09c1aSFelix Fietkau u8 aggr:1; 557e195dad1SFelix Fietkau u8 qos_ctl; 5585ce09c1aSFelix Fietkau u16 seqno; 5595ce09c1aSFelix Fietkau 5605ce09c1aSFelix Fietkau u16 freq; 5615ce09c1aSFelix Fietkau u32 flag; 5625ce09c1aSFelix Fietkau u8 enc_flags; 563af4a2f2fSRyder Lee u8 encoding:2, bw:3, he_ru:3; 564af4a2f2fSRyder Lee u8 he_gi:2, he_dcm:1; 565cc4b3c13SLorenzo Bianconi u8 amsdu:1, first_amsdu:1, last_amsdu:1; 5665ce09c1aSFelix Fietkau u8 rate_idx; 5675ce09c1aSFelix Fietkau u8 nss; 5685ce09c1aSFelix Fietkau u8 band; 5695ce09c1aSFelix Fietkau s8 signal; 5705ce09c1aSFelix Fietkau u8 chains; 5715ce09c1aSFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 5725ce09c1aSFelix Fietkau }; 5735ce09c1aSFelix Fietkau 574502604f5SYN Chen struct mt76_freq_range_power { 575502604f5SYN Chen const struct cfg80211_sar_freq_ranges *range; 576502604f5SYN Chen s8 power; 577502604f5SYN Chen }; 578502604f5SYN Chen 579f0efa862SFelix Fietkau struct mt76_testmode_ops { 580c918c74dSShayne Chen int (*set_state)(struct mt76_phy *phy, enum mt76_testmode_state state); 581c918c74dSShayne Chen int (*set_params)(struct mt76_phy *phy, struct nlattr **tb, 582f0efa862SFelix Fietkau enum mt76_testmode_state new_state); 583c918c74dSShayne Chen int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg); 584f0efa862SFelix Fietkau }; 585f0efa862SFelix Fietkau 586f0efa862SFelix Fietkau struct mt76_testmode_data { 587f0efa862SFelix Fietkau enum mt76_testmode_state state; 588f0efa862SFelix Fietkau 589f0efa862SFelix Fietkau u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)]; 590f0efa862SFelix Fietkau struct sk_buff *tx_skb; 591f0efa862SFelix Fietkau 592f0efa862SFelix Fietkau u32 tx_count; 5932601dda8SShayne Chen u16 tx_mpdu_len; 594f0efa862SFelix Fietkau 595f0efa862SFelix Fietkau u8 tx_rate_mode; 596f0efa862SFelix Fietkau u8 tx_rate_idx; 597f0efa862SFelix Fietkau u8 tx_rate_nss; 598f0efa862SFelix Fietkau u8 tx_rate_sgi; 599f0efa862SFelix Fietkau u8 tx_rate_ldpc; 6007f54c742SShayne Chen u8 tx_rate_stbc; 6011a38c2f5SShayne Chen u8 tx_ltf; 602f0efa862SFelix Fietkau 603f0efa862SFelix Fietkau u8 tx_antenna_mask; 604fdc9c18eSShayne Chen u8 tx_spe_idx; 605f0efa862SFelix Fietkau 606b8cbdb97SShayne Chen u8 tx_duty_cycle; 607b8cbdb97SShayne Chen u32 tx_time; 608b8cbdb97SShayne Chen u32 tx_ipg; 609b8cbdb97SShayne Chen 610f0efa862SFelix Fietkau u32 freq_offset; 611f0efa862SFelix Fietkau 612f0efa862SFelix Fietkau u8 tx_power[4]; 613f0efa862SFelix Fietkau u8 tx_power_control; 614f0efa862SFelix Fietkau 615c40b42c2SShayne Chen u8 addr[3][ETH_ALEN]; 616c40b42c2SShayne Chen 617f0efa862SFelix Fietkau u32 tx_pending; 618f0efa862SFelix Fietkau u32 tx_queued; 619ba459094SShayne Chen u16 tx_queued_limit; 620f0efa862SFelix Fietkau u32 tx_done; 621f0efa862SFelix Fietkau struct { 622f0efa862SFelix Fietkau u64 packets[__MT_RXQ_MAX]; 623f0efa862SFelix Fietkau u64 fcs_error[__MT_RXQ_MAX]; 624f0efa862SFelix Fietkau } rx_stats; 625f0efa862SFelix Fietkau }; 626f0efa862SFelix Fietkau 62785d96704SLorenzo Bianconi struct mt76_vif { 62885d96704SLorenzo Bianconi u8 idx; 62985d96704SLorenzo Bianconi u8 omac_idx; 63085d96704SLorenzo Bianconi u8 band_idx; 63185d96704SLorenzo Bianconi u8 wmm_idx; 63285d96704SLorenzo Bianconi u8 scan_seq_num; 6335ea3d983SFelix Fietkau u8 cipher; 63485d96704SLorenzo Bianconi }; 63585d96704SLorenzo Bianconi 636ac24dd35SFelix Fietkau struct mt76_phy { 637ac24dd35SFelix Fietkau struct ieee80211_hw *hw; 638ac24dd35SFelix Fietkau struct mt76_dev *dev; 639a3d01038SFelix Fietkau void *priv; 64096747a51SFelix Fietkau 641011849e0SFelix Fietkau unsigned long state; 642011849e0SFelix Fietkau 64391990519SLorenzo Bianconi struct mt76_queue *q_tx[__MT_TXQ_MAX]; 64491990519SLorenzo Bianconi 64596747a51SFelix Fietkau struct cfg80211_chan_def chandef; 64696747a51SFelix Fietkau struct ieee80211_channel *main_chan; 64796747a51SFelix Fietkau 64896747a51SFelix Fietkau struct mt76_channel_state *chan_state; 6493f306448SFelix Fietkau enum mt76_dfs_state dfs_state; 65096747a51SFelix Fietkau ktime_t survey_time; 65196747a51SFelix Fietkau 65248dbce5cSLorenzo Bianconi struct mt76_hw_cap cap; 65396747a51SFelix Fietkau struct mt76_sband sband_2g; 65496747a51SFelix Fietkau struct mt76_sband sband_5g; 655cee3fd29SLorenzo Bianconi struct mt76_sband sband_6g; 656beaaeb6bSFelix Fietkau 65798df2baeSLorenzo Bianconi u8 macaddr[ETH_ALEN]; 65898df2baeSLorenzo Bianconi 659beaaeb6bSFelix Fietkau int txpower_cur; 660beaaeb6bSFelix Fietkau u8 antenna_mask; 661b9027e08SLorenzo Bianconi u16 chainmask; 662c918c74dSShayne Chen 663c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 664c918c74dSShayne Chen struct mt76_testmode_data test; 665c918c74dSShayne Chen #endif 666a782f8bfSLorenzo Bianconi 667a782f8bfSLorenzo Bianconi struct delayed_work mac_work; 668a782f8bfSLorenzo Bianconi u8 mac_work_count; 669cc4b3c13SLorenzo Bianconi 670cc4b3c13SLorenzo Bianconi struct { 671cc4b3c13SLorenzo Bianconi struct sk_buff *head; 672cc4b3c13SLorenzo Bianconi struct sk_buff **tail; 673cc4b3c13SLorenzo Bianconi u16 seqno; 674cc4b3c13SLorenzo Bianconi } rx_amsdu[__MT_RXQ_MAX]; 675502604f5SYN Chen 676502604f5SYN Chen struct mt76_freq_range_power *frp; 677ac24dd35SFelix Fietkau }; 678ac24dd35SFelix Fietkau 67917f1de56SFelix Fietkau struct mt76_dev { 680ac24dd35SFelix Fietkau struct mt76_phy phy; /* must be first */ 681ac24dd35SFelix Fietkau 682bfc394ddSFelix Fietkau struct mt76_phy *phy2; 683bfc394ddSFelix Fietkau 68417f1de56SFelix Fietkau struct ieee80211_hw *hw; 68517f1de56SFelix Fietkau 68617f1de56SFelix Fietkau spinlock_t lock; 68717f1de56SFelix Fietkau spinlock_t cc_lock; 688108a4861SStanislaw Gruszka 6895ce09c1aSFelix Fietkau u32 cur_cc_bss_rx; 6905ce09c1aSFelix Fietkau 6915ce09c1aSFelix Fietkau struct mt76_rx_status rx_ampdu_status; 6925ce09c1aSFelix Fietkau u32 rx_ampdu_len; 6935ce09c1aSFelix Fietkau u32 rx_ampdu_ref; 6945ce09c1aSFelix Fietkau 695108a4861SStanislaw Gruszka struct mutex mutex; 696108a4861SStanislaw Gruszka 69717f1de56SFelix Fietkau const struct mt76_bus_ops *bus; 69817f1de56SFelix Fietkau const struct mt76_driver_ops *drv; 699db0f04f3SLorenzo Bianconi const struct mt76_mcu_ops *mcu_ops; 70017f1de56SFelix Fietkau struct device *dev; 701*d1ddc536SFelix Fietkau struct device *dma_dev; 70217f1de56SFelix Fietkau 70309872957SLorenzo Bianconi struct mt76_mcu mcu; 70409872957SLorenzo Bianconi 70517f1de56SFelix Fietkau struct net_device napi_dev; 706aa40528aSFelix Fietkau struct net_device tx_napi_dev; 707c3d7c82aSFelix Fietkau spinlock_t rx_lock; 70817f1de56SFelix Fietkau struct napi_struct napi[__MT_RXQ_MAX]; 70917f1de56SFelix Fietkau struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 71017f1de56SFelix Fietkau 71117f1de56SFelix Fietkau struct list_head txwi_cache; 712b1cb42adSLorenzo Bianconi struct mt76_queue *q_mcu[__MT_MCUQ_MAX]; 71317f1de56SFelix Fietkau struct mt76_queue q_rx[__MT_RXQ_MAX]; 71417f1de56SFelix Fietkau const struct mt76_queue_ops *queue_ops; 715c1e0d2beSLorenzo Bianconi int tx_dma_idx[4]; 71617f1de56SFelix Fietkau 717781eef5bSFelix Fietkau struct mt76_worker tx_worker; 7188402650aSLorenzo Bianconi struct napi_struct tx_napi; 719a33b8ab8SFelix Fietkau 720b17aff33SLorenzo Bianconi spinlock_t token_lock; 721b17aff33SLorenzo Bianconi struct idr token; 722b17aff33SLorenzo Bianconi int token_count; 723b17aff33SLorenzo Bianconi 72426e40d4cSFelix Fietkau wait_queue_head_t tx_wait; 725c34f1005SLorenzo Bianconi /* spinclock used to protect wcid pktid linked list */ 726c34f1005SLorenzo Bianconi spinlock_t status_lock; 72726e40d4cSFelix Fietkau 7285e616ad2SFelix Fietkau u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 7295e616ad2SFelix Fietkau u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 73036404c06SStanislaw Gruszka 731b619e013SEvelyn Tsai u64 vif_mask; 7322ab33b8dSFelix Fietkau 73336404c06SStanislaw Gruszka struct mt76_wcid global_wcid; 73436404c06SStanislaw Gruszka struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 735bd1e3e7bSLorenzo Bianconi struct list_head wcid_list; 73636404c06SStanislaw Gruszka 73717f1de56SFelix Fietkau u32 rev; 73817f1de56SFelix Fietkau 739d7b47bbdSLorenzo Bianconi u32 aggr_stats[32]; 740d7b47bbdSLorenzo Bianconi 741dc6057f4SLorenzo Bianconi struct tasklet_struct pre_tbtt_tasklet; 7423041c445SLorenzo Bianconi int beacon_int; 743c8a04d98SLorenzo Bianconi u8 beacon_mask; 7443041c445SLorenzo Bianconi 74517f1de56SFelix Fietkau struct debugfs_blob_wrapper eeprom; 74617f1de56SFelix Fietkau struct debugfs_blob_wrapper otp; 74717f1de56SFelix Fietkau 748b6862effSLorenzo Bianconi struct mt76_rate_power rate_power; 749b6862effSLorenzo Bianconi 7505b257371SLorenzo Bianconi char alpha2[3]; 751d8b8890dSLorenzo Bianconi enum nl80211_dfs_regions region; 752d8b8890dSLorenzo Bianconi 75317f1de56SFelix Fietkau u32 debugfs_reg; 75417f1de56SFelix Fietkau 75517f1de56SFelix Fietkau struct led_classdev led_cdev; 75617f1de56SFelix Fietkau char led_name[32]; 75717f1de56SFelix Fietkau bool led_al; 75817f1de56SFelix Fietkau u8 led_pin; 759b40b15e1SLorenzo Bianconi 760e7173858SFelix Fietkau u8 csa_complete; 761e7173858SFelix Fietkau 762108a4861SStanislaw Gruszka u32 rxfilter; 763108a4861SStanislaw Gruszka 764f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 765f0efa862SFelix Fietkau const struct mt76_testmode_ops *test_ops; 766e7a6a044SShayne Chen struct { 767e7a6a044SShayne Chen const char *name; 768e7a6a044SShayne Chen u32 offset; 769e7a6a044SShayne Chen } test_mtd; 770f0efa862SFelix Fietkau #endif 771a86f1d01SLorenzo Bianconi struct workqueue_struct *wq; 772a86f1d01SLorenzo Bianconi 773f7bbb80fSLorenzo Bianconi union { 774f7bbb80fSLorenzo Bianconi struct mt76_mmio mmio; 775b40b15e1SLorenzo Bianconi struct mt76_usb usb; 776d39b52e3SSean Wang struct mt76_sdio sdio; 77717f1de56SFelix Fietkau }; 778f7bbb80fSLorenzo Bianconi }; 77917f1de56SFelix Fietkau 78022b980baSFelix Fietkau struct mt76_power_limits { 78122b980baSFelix Fietkau s8 cck[4]; 78222b980baSFelix Fietkau s8 ofdm[8]; 78322b980baSFelix Fietkau s8 mcs[4][10]; 784a9627d99SShayne Chen s8 ru[7][12]; 78522b980baSFelix Fietkau }; 78622b980baSFelix Fietkau 78717f1de56SFelix Fietkau enum mt76_phy_type { 78817f1de56SFelix Fietkau MT_PHY_TYPE_CCK, 78917f1de56SFelix Fietkau MT_PHY_TYPE_OFDM, 79017f1de56SFelix Fietkau MT_PHY_TYPE_HT, 79117f1de56SFelix Fietkau MT_PHY_TYPE_HT_GF, 79217f1de56SFelix Fietkau MT_PHY_TYPE_VHT, 793d3377b78SRyder Lee MT_PHY_TYPE_HE_SU = 8, 794d3377b78SRyder Lee MT_PHY_TYPE_HE_EXT_SU, 795d3377b78SRyder Lee MT_PHY_TYPE_HE_TB, 796d3377b78SRyder Lee MT_PHY_TYPE_HE_MU, 797c4c2a370SBen Greear __MT_PHY_TYPE_HE_MAX, 79817f1de56SFelix Fietkau }; 79917f1de56SFelix Fietkau 80099043e99SLorenzo Bianconi struct mt76_sta_stats { 80199043e99SLorenzo Bianconi u64 tx_mode[__MT_PHY_TYPE_HE_MAX]; 80299043e99SLorenzo Bianconi u64 tx_bw[4]; /* 20, 40, 80, 160 */ 80399043e99SLorenzo Bianconi u64 tx_nss[4]; /* 1, 2, 3, 4 */ 80499043e99SLorenzo Bianconi u64 tx_mcs[16]; /* mcs idx */ 80599043e99SLorenzo Bianconi }; 80699043e99SLorenzo Bianconi 80754ae98ffSLorenzo Bianconi struct mt76_ethtool_worker_info { 80854ae98ffSLorenzo Bianconi u64 *data; 80954ae98ffSLorenzo Bianconi int idx; 81054ae98ffSLorenzo Bianconi int initial_stat_idx; 81154ae98ffSLorenzo Bianconi int worker_stat_count; 81254ae98ffSLorenzo Bianconi int sta_count; 81354ae98ffSLorenzo Bianconi }; 81454ae98ffSLorenzo Bianconi 81554b8fdebSLorenzo Bianconi #define CCK_RATE(_idx, _rate) { \ 81654b8fdebSLorenzo Bianconi .bitrate = _rate, \ 81754b8fdebSLorenzo Bianconi .flags = IEEE80211_RATE_SHORT_PREAMBLE, \ 81854b8fdebSLorenzo Bianconi .hw_value = (MT_PHY_TYPE_CCK << 8) | (_idx), \ 81954b8fdebSLorenzo Bianconi .hw_value_short = (MT_PHY_TYPE_CCK << 8) | (4 + _idx), \ 82054b8fdebSLorenzo Bianconi } 82154b8fdebSLorenzo Bianconi 82254b8fdebSLorenzo Bianconi #define OFDM_RATE(_idx, _rate) { \ 82354b8fdebSLorenzo Bianconi .bitrate = _rate, \ 82454b8fdebSLorenzo Bianconi .hw_value = (MT_PHY_TYPE_OFDM << 8) | (_idx), \ 82554b8fdebSLorenzo Bianconi .hw_value_short = (MT_PHY_TYPE_OFDM << 8) | (_idx), \ 82654b8fdebSLorenzo Bianconi } 82754b8fdebSLorenzo Bianconi 82854b8fdebSLorenzo Bianconi extern struct ieee80211_rate mt76_rates[12]; 82954b8fdebSLorenzo Bianconi 830d4131273SStanislaw Gruszka #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 831d4131273SStanislaw Gruszka #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 832d4131273SStanislaw Gruszka #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 83335e4ebeaSLorenzo Bianconi #define __mt76_wr_copy(dev, ...) (dev)->bus->write_copy((dev), __VA_ARGS__) 83435e4ebeaSLorenzo Bianconi #define __mt76_rr_copy(dev, ...) (dev)->bus->read_copy((dev), __VA_ARGS__) 835d4131273SStanislaw Gruszka 83622c575c4SStanislaw Gruszka #define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 83722c575c4SStanislaw Gruszka #define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 83822c575c4SStanislaw Gruszka 83917f1de56SFelix Fietkau #define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 84017f1de56SFelix Fietkau #define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 84117f1de56SFelix Fietkau #define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 84235e4ebeaSLorenzo Bianconi #define mt76_wr_copy(dev, ...) (dev)->mt76.bus->write_copy(&((dev)->mt76), __VA_ARGS__) 84335e4ebeaSLorenzo Bianconi #define mt76_rr_copy(dev, ...) (dev)->mt76.bus->read_copy(&((dev)->mt76), __VA_ARGS__) 8446da5a291SStanislaw Gruszka #define mt76_wr_rp(dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__) 8456da5a291SStanislaw Gruszka #define mt76_rd_rp(dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__) 84617f1de56SFelix Fietkau 847f4d45fe2SLorenzo Bianconi 848e2c2fd0fSLorenzo Bianconi #define mt76_mcu_restart(dev, ...) (dev)->mt76.mcu_ops->mcu_restart(&((dev)->mt76)) 849e2c2fd0fSLorenzo Bianconi #define __mt76_mcu_restart(dev, ...) (dev)->mcu_ops->mcu_restart((dev)) 850db0f04f3SLorenzo Bianconi 85117f1de56SFelix Fietkau #define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 85217f1de56SFelix Fietkau #define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 85317f1de56SFelix Fietkau 85417f1de56SFelix Fietkau #define mt76_get_field(_dev, _reg, _field) \ 85517f1de56SFelix Fietkau FIELD_GET(_field, mt76_rr(dev, _reg)) 85617f1de56SFelix Fietkau 85717f1de56SFelix Fietkau #define mt76_rmw_field(_dev, _reg, _field, _val) \ 85817f1de56SFelix Fietkau mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 85917f1de56SFelix Fietkau 86046436b5eSStanislaw Gruszka #define __mt76_rmw_field(_dev, _reg, _field, _val) \ 86146436b5eSStanislaw Gruszka __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 86246436b5eSStanislaw Gruszka 863ac24dd35SFelix Fietkau #define mt76_hw(dev) (dev)->mphy.hw 86417f1de56SFelix Fietkau 865426e8e41SFelix Fietkau static inline struct ieee80211_hw * 86649e649c3SRyder Lee mt76_wcid_hw(struct mt76_dev *dev, u16 wcid) 867426e8e41SFelix Fietkau { 868426e8e41SFelix Fietkau if (wcid <= MT76_N_WCIDS && 869426e8e41SFelix Fietkau mt76_wcid_mask_test(dev->wcid_phy_mask, wcid)) 870426e8e41SFelix Fietkau return dev->phy2->hw; 871426e8e41SFelix Fietkau 872426e8e41SFelix Fietkau return dev->phy.hw; 873426e8e41SFelix Fietkau } 874426e8e41SFelix Fietkau 87517f1de56SFelix Fietkau bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 87617f1de56SFelix Fietkau int timeout); 87717f1de56SFelix Fietkau 87817f1de56SFelix Fietkau #define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 87917f1de56SFelix Fietkau 88017f1de56SFelix Fietkau bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 88117f1de56SFelix Fietkau int timeout); 88217f1de56SFelix Fietkau 88317f1de56SFelix Fietkau #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 88417f1de56SFelix Fietkau 88517f1de56SFelix Fietkau void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 886f37f0550SLorenzo Bianconi void mt76_pci_disable_aspm(struct pci_dev *pdev); 88717f1de56SFelix Fietkau 88817f1de56SFelix Fietkau static inline u16 mt76_chip(struct mt76_dev *dev) 88917f1de56SFelix Fietkau { 89017f1de56SFelix Fietkau return dev->rev >> 16; 89117f1de56SFelix Fietkau } 89217f1de56SFelix Fietkau 89317f1de56SFelix Fietkau static inline u16 mt76_rev(struct mt76_dev *dev) 89417f1de56SFelix Fietkau { 89517f1de56SFelix Fietkau return dev->rev & 0xffff; 89617f1de56SFelix Fietkau } 89717f1de56SFelix Fietkau 89817f1de56SFelix Fietkau #define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 89917f1de56SFelix Fietkau #define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 90017f1de56SFelix Fietkau 901cb8ed33dSLorenzo Bianconi #define mt76_init_queues(dev, ...) (dev)->mt76.queue_ops->init(&((dev)->mt76), __VA_ARGS__) 902a23fde09SLorenzo Bianconi #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 9035ed31128SLorenzo Bianconi #define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__) 904eb9ca7ecSLorenzo Bianconi #define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__) 90517f1de56SFelix Fietkau #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 90617f1de56SFelix Fietkau #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 907c001df97SLorenzo Bianconi #define mt76_queue_rx_cleanup(dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__) 90817f1de56SFelix Fietkau #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 9093990465dSLorenzo Bianconi #define mt76_queue_reset(dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__) 91017f1de56SFelix Fietkau 911f473b42aSFelix Fietkau #define mt76_for_each_q_rx(dev, i) \ 912b3ad9d6aSBo Jiao for (i = 0; i < ARRAY_SIZE((dev)->q_rx); i++) \ 913b3ad9d6aSBo Jiao if ((dev)->q_rx[i].ndesc) 914f473b42aSFelix Fietkau 915c0f7b25aSLorenzo Bianconi struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, 916c0f7b25aSLorenzo Bianconi const struct ieee80211_ops *ops, 917c0f7b25aSLorenzo Bianconi const struct mt76_driver_ops *drv_ops); 91817f1de56SFelix Fietkau int mt76_register_device(struct mt76_dev *dev, bool vht, 91917f1de56SFelix Fietkau struct ieee80211_rate *rates, int n_rates); 92017f1de56SFelix Fietkau void mt76_unregister_device(struct mt76_dev *dev); 921def34a2fSLorenzo Bianconi void mt76_free_device(struct mt76_dev *dev); 922c89d3625SFelix Fietkau void mt76_unregister_phy(struct mt76_phy *phy); 923c89d3625SFelix Fietkau 924c89d3625SFelix Fietkau struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, 925c89d3625SFelix Fietkau const struct ieee80211_ops *ops); 926db78a791SLorenzo Bianconi int mt76_register_phy(struct mt76_phy *phy, bool vht, 927db78a791SLorenzo Bianconi struct ieee80211_rate *rates, int n_rates); 92817f1de56SFelix Fietkau 9293263039dSLorenzo Bianconi struct dentry *mt76_register_debugfs_fops(struct mt76_phy *phy, 930f6e1f598SLorenzo Bianconi const struct file_operations *ops); 931f6e1f598SLorenzo Bianconi static inline struct dentry *mt76_register_debugfs(struct mt76_dev *dev) 932f6e1f598SLorenzo Bianconi { 9333263039dSLorenzo Bianconi return mt76_register_debugfs_fops(&dev->phy, NULL); 934f6e1f598SLorenzo Bianconi } 935f6e1f598SLorenzo Bianconi 9360b82a8e8SLorenzo Bianconi int mt76_queues_read(struct seq_file *s, void *data); 9378f410a8bSLorenzo Bianconi void mt76_seq_puts_array(struct seq_file *file, const char *str, 9388f410a8bSLorenzo Bianconi s8 *val, int len); 93917f1de56SFelix Fietkau 94017f1de56SFelix Fietkau int mt76_eeprom_init(struct mt76_dev *dev, int len); 94198df2baeSLorenzo Bianconi void mt76_eeprom_override(struct mt76_phy *phy); 942495184acSRyder Lee int mt76_get_of_eeprom(struct mt76_dev *dev, void *data, int offset, int len); 94317f1de56SFelix Fietkau 944b1cb42adSLorenzo Bianconi struct mt76_queue * 945b1cb42adSLorenzo Bianconi mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc, 946b1cb42adSLorenzo Bianconi int ring_base); 94733920b2bSRyder Lee u16 mt76_calculate_default_rate(struct mt76_phy *phy, int rateidx); 948b1cb42adSLorenzo Bianconi static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx, 949b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 950b1cb42adSLorenzo Bianconi { 951b1cb42adSLorenzo Bianconi struct mt76_queue *q; 952b1cb42adSLorenzo Bianconi 953b1cb42adSLorenzo Bianconi q = mt76_init_queue(phy->dev, qid, idx, n_desc, ring_base); 954b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 955b1cb42adSLorenzo Bianconi return PTR_ERR(q); 956b1cb42adSLorenzo Bianconi 957b1cb42adSLorenzo Bianconi q->qid = qid; 95891990519SLorenzo Bianconi phy->q_tx[qid] = q; 959b1cb42adSLorenzo Bianconi 960b1cb42adSLorenzo Bianconi return 0; 961b1cb42adSLorenzo Bianconi } 962b1cb42adSLorenzo Bianconi 963b1cb42adSLorenzo Bianconi static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx, 964b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 965b1cb42adSLorenzo Bianconi { 966b1cb42adSLorenzo Bianconi struct mt76_queue *q; 967b1cb42adSLorenzo Bianconi 968b1cb42adSLorenzo Bianconi q = mt76_init_queue(dev, qid, idx, n_desc, ring_base); 969b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 970b1cb42adSLorenzo Bianconi return PTR_ERR(q); 971b1cb42adSLorenzo Bianconi 972e637763bSLorenzo Bianconi q->qid = __MT_TXQ_MAX + qid; 973b1cb42adSLorenzo Bianconi dev->q_mcu[qid] = q; 974b1cb42adSLorenzo Bianconi 975b1cb42adSLorenzo Bianconi return 0; 976b1cb42adSLorenzo Bianconi } 977b671da33SLorenzo Bianconi 978011849e0SFelix Fietkau static inline struct mt76_phy * 979011849e0SFelix Fietkau mt76_dev_phy(struct mt76_dev *dev, bool phy_ext) 980011849e0SFelix Fietkau { 981011849e0SFelix Fietkau if (phy_ext && dev->phy2) 982011849e0SFelix Fietkau return dev->phy2; 983011849e0SFelix Fietkau return &dev->phy; 984011849e0SFelix Fietkau } 985011849e0SFelix Fietkau 986bfc394ddSFelix Fietkau static inline struct ieee80211_hw * 987bfc394ddSFelix Fietkau mt76_phy_hw(struct mt76_dev *dev, bool phy_ext) 988bfc394ddSFelix Fietkau { 989011849e0SFelix Fietkau return mt76_dev_phy(dev, phy_ext)->hw; 990bfc394ddSFelix Fietkau } 991bfc394ddSFelix Fietkau 992f3950a41SLorenzo Bianconi static inline u8 * 993f3950a41SLorenzo Bianconi mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t) 994f3950a41SLorenzo Bianconi { 995f3950a41SLorenzo Bianconi return (u8 *)t - dev->drv->txwi_size; 996f3950a41SLorenzo Bianconi } 997f3950a41SLorenzo Bianconi 998ee8aa945SLorenzo Bianconi /* increment with wrap-around */ 999ee8aa945SLorenzo Bianconi static inline int mt76_incr(int val, int size) 1000ee8aa945SLorenzo Bianconi { 1001ee8aa945SLorenzo Bianconi return (val + 1) & (size - 1); 1002ee8aa945SLorenzo Bianconi } 1003ee8aa945SLorenzo Bianconi 1004ee8aa945SLorenzo Bianconi /* decrement with wrap-around */ 1005ee8aa945SLorenzo Bianconi static inline int mt76_decr(int val, int size) 1006ee8aa945SLorenzo Bianconi { 1007ee8aa945SLorenzo Bianconi return (val - 1) & (size - 1); 1008ee8aa945SLorenzo Bianconi } 1009ee8aa945SLorenzo Bianconi 10101d0496c6SStanislaw Gruszka u8 mt76_ac_to_hwq(u8 ac); 1011b40b15e1SLorenzo Bianconi 101217f1de56SFelix Fietkau static inline struct ieee80211_txq * 101317f1de56SFelix Fietkau mtxq_to_txq(struct mt76_txq *mtxq) 101417f1de56SFelix Fietkau { 101517f1de56SFelix Fietkau void *ptr = mtxq; 101617f1de56SFelix Fietkau 101717f1de56SFelix Fietkau return container_of(ptr, struct ieee80211_txq, drv_priv); 101817f1de56SFelix Fietkau } 101917f1de56SFelix Fietkau 10209c68a57bSFelix Fietkau static inline struct ieee80211_sta * 10219c68a57bSFelix Fietkau wcid_to_sta(struct mt76_wcid *wcid) 10229c68a57bSFelix Fietkau { 10239c68a57bSFelix Fietkau void *ptr = wcid; 10249c68a57bSFelix Fietkau 10259c68a57bSFelix Fietkau if (!wcid || !wcid->sta) 10269c68a57bSFelix Fietkau return NULL; 10279c68a57bSFelix Fietkau 10289c68a57bSFelix Fietkau return container_of(ptr, struct ieee80211_sta, drv_priv); 10299c68a57bSFelix Fietkau } 10309c68a57bSFelix Fietkau 103188046b2cSFelix Fietkau static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb) 103288046b2cSFelix Fietkau { 103388046b2cSFelix Fietkau BUILD_BUG_ON(sizeof(struct mt76_tx_cb) > 103488046b2cSFelix Fietkau sizeof(IEEE80211_SKB_CB(skb)->status.status_driver_data)); 103588046b2cSFelix Fietkau return ((void *)IEEE80211_SKB_CB(skb)->status.status_driver_data); 103688046b2cSFelix Fietkau } 103788046b2cSFelix Fietkau 103877ae1d5eSRyder Lee static inline void *mt76_skb_get_hdr(struct sk_buff *skb) 103977ae1d5eSRyder Lee { 104077ae1d5eSRyder Lee struct mt76_rx_status mstat; 104177ae1d5eSRyder Lee u8 *data = skb->data; 104277ae1d5eSRyder Lee 104377ae1d5eSRyder Lee /* Alignment concerns */ 104477ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4); 104577ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4); 104677ae1d5eSRyder Lee 104777ae1d5eSRyder Lee mstat = *((struct mt76_rx_status *)skb->cb); 104877ae1d5eSRyder Lee 104977ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE) 105077ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he); 105177ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE_MU) 105277ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he_mu); 105377ae1d5eSRyder Lee 105477ae1d5eSRyder Lee return data; 105577ae1d5eSRyder Lee } 105677ae1d5eSRyder Lee 10573bb45b5fSLorenzo Bianconi static inline void mt76_insert_hdr_pad(struct sk_buff *skb) 10583bb45b5fSLorenzo Bianconi { 10593bb45b5fSLorenzo Bianconi int len = ieee80211_get_hdrlen_from_skb(skb); 10603bb45b5fSLorenzo Bianconi 10613bb45b5fSLorenzo Bianconi if (len % 4 == 0) 10623bb45b5fSLorenzo Bianconi return; 10633bb45b5fSLorenzo Bianconi 10643bb45b5fSLorenzo Bianconi skb_push(skb, 2); 10653bb45b5fSLorenzo Bianconi memmove(skb->data, skb->data + 2, len); 10663bb45b5fSLorenzo Bianconi 10673bb45b5fSLorenzo Bianconi skb->data[len] = 0; 10683bb45b5fSLorenzo Bianconi skb->data[len + 1] = 0; 10693bb45b5fSLorenzo Bianconi } 10703bb45b5fSLorenzo Bianconi 10718548c6ebSFelix Fietkau static inline bool mt76_is_skb_pktid(u8 pktid) 10728548c6ebSFelix Fietkau { 10738548c6ebSFelix Fietkau if (pktid & MT_PACKET_ID_HAS_RATE) 10748548c6ebSFelix Fietkau return false; 10758548c6ebSFelix Fietkau 10768548c6ebSFelix Fietkau return pktid >= MT_PACKET_ID_FIRST; 10778548c6ebSFelix Fietkau } 10788548c6ebSFelix Fietkau 107907cda406SFelix Fietkau static inline u8 mt76_tx_power_nss_delta(u8 nss) 108007cda406SFelix Fietkau { 108107cda406SFelix Fietkau static const u8 nss_delta[4] = { 0, 6, 9, 12 }; 108207cda406SFelix Fietkau 108307cda406SFelix Fietkau return nss_delta[nss - 1]; 108407cda406SFelix Fietkau } 108507cda406SFelix Fietkau 1086c918c74dSShayne Chen static inline bool mt76_testmode_enabled(struct mt76_phy *phy) 1087f0efa862SFelix Fietkau { 1088f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 1089c918c74dSShayne Chen return phy->test.state != MT76_TM_STATE_OFF; 1090c918c74dSShayne Chen #else 1091c918c74dSShayne Chen return false; 1092c918c74dSShayne Chen #endif 1093c918c74dSShayne Chen } 1094c918c74dSShayne Chen 1095c918c74dSShayne Chen static inline bool mt76_is_testmode_skb(struct mt76_dev *dev, 1096c918c74dSShayne Chen struct sk_buff *skb, 1097c918c74dSShayne Chen struct ieee80211_hw **hw) 1098c918c74dSShayne Chen { 1099c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 1100c918c74dSShayne Chen if (skb == dev->phy.test.tx_skb) 1101c918c74dSShayne Chen *hw = dev->phy.hw; 1102c918c74dSShayne Chen else if (dev->phy2 && skb == dev->phy2->test.tx_skb) 1103c918c74dSShayne Chen *hw = dev->phy2->hw; 1104c918c74dSShayne Chen else 1105c918c74dSShayne Chen return false; 1106c918c74dSShayne Chen return true; 1107f0efa862SFelix Fietkau #else 1108f0efa862SFelix Fietkau return false; 1109f0efa862SFelix Fietkau #endif 1110f0efa862SFelix Fietkau } 1111f0efa862SFelix Fietkau 111217f1de56SFelix Fietkau void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 11139fba6d07SFelix Fietkau void mt76_tx(struct mt76_phy *dev, struct ieee80211_sta *sta, 111417f1de56SFelix Fietkau struct mt76_wcid *wcid, struct sk_buff *skb); 111517f1de56SFelix Fietkau void mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 111691990519SLorenzo Bianconi void mt76_stop_tx_queues(struct mt76_phy *phy, struct ieee80211_sta *sta, 111717f1de56SFelix Fietkau bool send_bar); 1118c50d105aSFelix Fietkau void mt76_tx_check_agg_ssn(struct ieee80211_sta *sta, struct sk_buff *skb); 11199fba6d07SFelix Fietkau void mt76_txq_schedule(struct mt76_phy *phy, enum mt76_txq_id qid); 11209fba6d07SFelix Fietkau void mt76_txq_schedule_all(struct mt76_phy *phy); 1121335e97acSLorenzo Bianconi void mt76_tx_worker_run(struct mt76_dev *dev); 1122781eef5bSFelix Fietkau void mt76_tx_worker(struct mt76_worker *w); 112317f1de56SFelix Fietkau void mt76_release_buffered_frames(struct ieee80211_hw *hw, 112417f1de56SFelix Fietkau struct ieee80211_sta *sta, 112517f1de56SFelix Fietkau u16 tids, int nframes, 112617f1de56SFelix Fietkau enum ieee80211_frame_release_type reason, 112717f1de56SFelix Fietkau bool more_data); 11285a95ca41SFelix Fietkau bool mt76_has_tx_pending(struct mt76_phy *phy); 112996747a51SFelix Fietkau void mt76_set_channel(struct mt76_phy *phy); 1130c560b137SRyder Lee void mt76_update_survey(struct mt76_phy *phy); 113104414240SLorenzo Bianconi void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time); 113217f1de56SFelix Fietkau int mt76_get_survey(struct ieee80211_hw *hw, int idx, 113317f1de56SFelix Fietkau struct survey_info *survey); 1134bb3e3fecSRyder Lee void mt76_set_stream_caps(struct mt76_phy *phy, bool vht); 113517f1de56SFelix Fietkau 1136aee5b8cfSFelix Fietkau int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 11377c4f744dSRyder Lee u16 ssn, u16 size); 1138aee5b8cfSFelix Fietkau void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 1139aee5b8cfSFelix Fietkau 114030ce7f44SFelix Fietkau void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 114130ce7f44SFelix Fietkau struct ieee80211_key_conf *key); 114279d1c94cSFelix Fietkau 114379d1c94cSFelix Fietkau void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 1144c34f1005SLorenzo Bianconi __acquires(&dev->status_lock); 114579d1c94cSFelix Fietkau void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 1146c34f1005SLorenzo Bianconi __releases(&dev->status_lock); 114779d1c94cSFelix Fietkau 114888046b2cSFelix Fietkau int mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 114988046b2cSFelix Fietkau struct sk_buff *skb); 115088046b2cSFelix Fietkau struct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev, 115179d1c94cSFelix Fietkau struct mt76_wcid *wcid, int pktid, 115279d1c94cSFelix Fietkau struct sk_buff_head *list); 115379d1c94cSFelix Fietkau void mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, 115479d1c94cSFelix Fietkau struct sk_buff_head *list); 11550fe88644SFelix Fietkau void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb, 11560fe88644SFelix Fietkau struct list_head *free_list); 11570fe88644SFelix Fietkau static inline void 11580fe88644SFelix Fietkau mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb) 11590fe88644SFelix Fietkau { 11600fe88644SFelix Fietkau __mt76_tx_complete_skb(dev, wcid, skb, NULL); 11610fe88644SFelix Fietkau } 11620fe88644SFelix Fietkau 1163c02f86eeSLorenzo Bianconi void mt76_tx_status_check(struct mt76_dev *dev, bool flush); 1164e28487eaSFelix Fietkau int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1165e28487eaSFelix Fietkau struct ieee80211_sta *sta, 1166e28487eaSFelix Fietkau enum ieee80211_sta_state old_state, 1167e28487eaSFelix Fietkau enum ieee80211_sta_state new_state); 116813f61dfcSLorenzo Bianconi void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 116913f61dfcSLorenzo Bianconi struct ieee80211_sta *sta); 117043ba1922SFelix Fietkau void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 117143ba1922SFelix Fietkau struct ieee80211_sta *sta); 117230ce7f44SFelix Fietkau 11738af63fedSFelix Fietkau int mt76_get_min_avg_rssi(struct mt76_dev *dev, bool ext_phy); 1174ef13edc0SFelix Fietkau 11759313faacSFelix Fietkau int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 11769313faacSFelix Fietkau int *dbm); 1177b3cb885eSLorenzo Bianconi int mt76_init_sar_power(struct ieee80211_hw *hw, 1178b3cb885eSLorenzo Bianconi const struct cfg80211_sar_specs *sar); 1179b3cb885eSLorenzo Bianconi int mt76_get_sar_power(struct mt76_phy *phy, 1180b3cb885eSLorenzo Bianconi struct ieee80211_channel *chan, 1181b3cb885eSLorenzo Bianconi int power); 11829313faacSFelix Fietkau 1183e7173858SFelix Fietkau void mt76_csa_check(struct mt76_dev *dev); 1184e7173858SFelix Fietkau void mt76_csa_finish(struct mt76_dev *dev); 1185e7173858SFelix Fietkau 1186e49c76d4SLorenzo Bianconi int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); 118787d53103SStanislaw Gruszka int mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set); 1188eadfd98fSLorenzo Bianconi void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id); 1189d2679d65SLorenzo Bianconi int mt76_get_rate(struct mt76_dev *dev, 1190d2679d65SLorenzo Bianconi struct ieee80211_supported_band *sband, 1191d2679d65SLorenzo Bianconi int idx, bool cck); 11928b8ab5c2SLorenzo Bianconi void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 11938b8ab5c2SLorenzo Bianconi const u8 *mac); 11948b8ab5c2SLorenzo Bianconi void mt76_sw_scan_complete(struct ieee80211_hw *hw, 11958b8ab5c2SLorenzo Bianconi struct ieee80211_vif *vif); 11963f306448SFelix Fietkau enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy); 1197f0efa862SFelix Fietkau int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1198f0efa862SFelix Fietkau void *data, int len); 1199f0efa862SFelix Fietkau int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, 1200f0efa862SFelix Fietkau struct netlink_callback *cb, void *data, int len); 1201c918c74dSShayne Chen int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state); 12022601dda8SShayne Chen int mt76_testmode_alloc_skb(struct mt76_phy *phy, u32 len); 1203f0efa862SFelix Fietkau 1204c918c74dSShayne Chen static inline void mt76_testmode_reset(struct mt76_phy *phy, bool disable) 1205f0efa862SFelix Fietkau { 1206f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 1207f0efa862SFelix Fietkau enum mt76_testmode_state state = MT76_TM_STATE_IDLE; 1208f0efa862SFelix Fietkau 1209c918c74dSShayne Chen if (disable || phy->test.state == MT76_TM_STATE_OFF) 1210f0efa862SFelix Fietkau state = MT76_TM_STATE_OFF; 1211f0efa862SFelix Fietkau 1212c918c74dSShayne Chen mt76_testmode_set_state(phy, state); 1213f0efa862SFelix Fietkau #endif 1214f0efa862SFelix Fietkau } 1215f0efa862SFelix Fietkau 121687d53103SStanislaw Gruszka 121717f1de56SFelix Fietkau /* internal */ 1218e394b575SFelix Fietkau static inline struct ieee80211_hw * 1219e394b575SFelix Fietkau mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) 1220e394b575SFelix Fietkau { 1221e394b575SFelix Fietkau struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1222e394b575SFelix Fietkau struct ieee80211_hw *hw = dev->phy.hw; 1223e394b575SFelix Fietkau 1224e394b575SFelix Fietkau if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) 1225e394b575SFelix Fietkau hw = dev->phy2->hw; 1226e394b575SFelix Fietkau 1227e394b575SFelix Fietkau info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY; 1228e394b575SFelix Fietkau 1229e394b575SFelix Fietkau return hw; 1230e394b575SFelix Fietkau } 1231e394b575SFelix Fietkau 123217f1de56SFelix Fietkau void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 12339d9d738bSFelix Fietkau void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 123481e850efSLorenzo Bianconi struct napi_struct *napi); 123581e850efSLorenzo Bianconi void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 123681e850efSLorenzo Bianconi struct napi_struct *napi); 1237aee5b8cfSFelix Fietkau void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 1238c918c74dSShayne Chen void mt76_testmode_tx_pending(struct mt76_phy *phy); 1239fe5b5ab5SFelix Fietkau void mt76_queue_tx_complete(struct mt76_dev *dev, struct mt76_queue *q, 1240fe5b5ab5SFelix Fietkau struct mt76_queue_entry *e); 124117f1de56SFelix Fietkau 1242b40b15e1SLorenzo Bianconi /* usb */ 1243b40b15e1SLorenzo Bianconi static inline bool mt76u_urb_error(struct urb *urb) 1244b40b15e1SLorenzo Bianconi { 1245b40b15e1SLorenzo Bianconi return urb->status && 1246b40b15e1SLorenzo Bianconi urb->status != -ECONNRESET && 1247b40b15e1SLorenzo Bianconi urb->status != -ESHUTDOWN && 1248b40b15e1SLorenzo Bianconi urb->status != -ENOENT; 1249b40b15e1SLorenzo Bianconi } 1250b40b15e1SLorenzo Bianconi 1251b40b15e1SLorenzo Bianconi /* Map hardware queues to usb endpoints */ 1252b40b15e1SLorenzo Bianconi static inline u8 q2ep(u8 qid) 1253b40b15e1SLorenzo Bianconi { 1254b40b15e1SLorenzo Bianconi /* TODO: take management packets to queue 5 */ 1255b40b15e1SLorenzo Bianconi return qid + 1; 1256b40b15e1SLorenzo Bianconi } 1257b40b15e1SLorenzo Bianconi 12585de4db8fSStanislaw Gruszka static inline int 1259b63aa031SStanislaw Gruszka mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, 12603bcd979cSLorenzo Bianconi int timeout, int ep) 12615de4db8fSStanislaw Gruszka { 126280df01f4SLorenzo Bianconi struct usb_interface *uintf = to_usb_interface(dev->dev); 126380df01f4SLorenzo Bianconi struct usb_device *udev = interface_to_usbdev(uintf); 12645de4db8fSStanislaw Gruszka struct mt76_usb *usb = &dev->usb; 12655de4db8fSStanislaw Gruszka unsigned int pipe; 12665de4db8fSStanislaw Gruszka 1267b63aa031SStanislaw Gruszka if (actual_len) 12683bcd979cSLorenzo Bianconi pipe = usb_rcvbulkpipe(udev, usb->in_ep[ep]); 1269b63aa031SStanislaw Gruszka else 12703bcd979cSLorenzo Bianconi pipe = usb_sndbulkpipe(udev, usb->out_ep[ep]); 1271b63aa031SStanislaw Gruszka 1272b63aa031SStanislaw Gruszka return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 12735de4db8fSStanislaw Gruszka } 12745de4db8fSStanislaw Gruszka 127554ae98ffSLorenzo Bianconi void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, 127654ae98ffSLorenzo Bianconi struct mt76_sta_stats *stats); 1277e98e6df6SLorenzo Bianconi int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 12786cb596baSLorenzo Bianconi int __mt76u_vendor_request(struct mt76_dev *dev, u8 req, u8 req_type, 12796cb596baSLorenzo Bianconi u16 val, u16 offset, void *buf, size_t len); 1280b40b15e1SLorenzo Bianconi int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 1281b40b15e1SLorenzo Bianconi u8 req_type, u16 val, u16 offset, 1282b40b15e1SLorenzo Bianconi void *buf, size_t len); 1283b40b15e1SLorenzo Bianconi void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 1284b40b15e1SLorenzo Bianconi const u16 offset, const u32 val); 12856cb596baSLorenzo Bianconi void mt76u_read_copy(struct mt76_dev *dev, u32 offset, 12866cb596baSLorenzo Bianconi void *data, int len); 12876cb596baSLorenzo Bianconi u32 ___mt76u_rr(struct mt76_dev *dev, u8 req, u8 req_type, u32 addr); 12886cb596baSLorenzo Bianconi void ___mt76u_wr(struct mt76_dev *dev, u8 req, u8 req_type, 12896cb596baSLorenzo Bianconi u32 addr, u32 val); 12906cb596baSLorenzo Bianconi int __mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 12916cb596baSLorenzo Bianconi struct mt76_bus_ops *ops); 12926cb596baSLorenzo Bianconi int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf); 129394e1cfa8SLorenzo Bianconi int mt76u_alloc_mcu_queue(struct mt76_dev *dev); 1294b40b15e1SLorenzo Bianconi int mt76u_alloc_queues(struct mt76_dev *dev); 129539d501d9SStanislaw Gruszka void mt76u_stop_tx(struct mt76_dev *dev); 129639d501d9SStanislaw Gruszka void mt76u_stop_rx(struct mt76_dev *dev); 129739d501d9SStanislaw Gruszka int mt76u_resume_rx(struct mt76_dev *dev); 1298b40b15e1SLorenzo Bianconi void mt76u_queues_deinit(struct mt76_dev *dev); 1299b40b15e1SLorenzo Bianconi 1300d39b52e3SSean Wang int mt76s_init(struct mt76_dev *dev, struct sdio_func *func, 1301d39b52e3SSean Wang const struct mt76_bus_ops *bus_ops); 1302d512b008SLorenzo Bianconi int mt76s_alloc_rx_queue(struct mt76_dev *dev, enum mt76_rxq_id qid); 1303d512b008SLorenzo Bianconi int mt76s_alloc_tx(struct mt76_dev *dev); 1304d39b52e3SSean Wang void mt76s_deinit(struct mt76_dev *dev); 1305764dee47SLorenzo Bianconi void mt76s_sdio_irq(struct sdio_func *func); 1306764dee47SLorenzo Bianconi void mt76s_txrx_worker(struct mt76_sdio *sdio); 1307ca74b9b9SSean Wang bool mt76s_txqs_empty(struct mt76_dev *dev); 1308dacf0acfSSean Wang int mt76s_hw_init(struct mt76_dev *dev, struct sdio_func *func, 1309dacf0acfSSean Wang int hw_ver); 1310764dee47SLorenzo Bianconi u32 mt76s_rr(struct mt76_dev *dev, u32 offset); 1311764dee47SLorenzo Bianconi void mt76s_wr(struct mt76_dev *dev, u32 offset, u32 val); 1312764dee47SLorenzo Bianconi u32 mt76s_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 1313764dee47SLorenzo Bianconi u32 mt76s_read_pcr(struct mt76_dev *dev); 1314764dee47SLorenzo Bianconi void mt76s_write_copy(struct mt76_dev *dev, u32 offset, 1315764dee47SLorenzo Bianconi const void *data, int len); 1316764dee47SLorenzo Bianconi void mt76s_read_copy(struct mt76_dev *dev, u32 offset, 1317764dee47SLorenzo Bianconi void *data, int len); 1318764dee47SLorenzo Bianconi int mt76s_wr_rp(struct mt76_dev *dev, u32 base, 1319764dee47SLorenzo Bianconi const struct mt76_reg_pair *data, 1320764dee47SLorenzo Bianconi int len); 1321764dee47SLorenzo Bianconi int mt76s_rd_rp(struct mt76_dev *dev, u32 base, 1322764dee47SLorenzo Bianconi struct mt76_reg_pair *data, int len); 1323d39b52e3SSean Wang 13249df0fab9SLorenzo Bianconi struct sk_buff * 1325bb31a80eSLorenzo Bianconi mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data, 1326bb31a80eSLorenzo Bianconi int data_len); 1327c07a49d4SLorenzo Bianconi void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb); 1328680abb25SLorenzo Bianconi struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 1329680abb25SLorenzo Bianconi unsigned long expires); 1330ae5ad627SFelix Fietkau int mt76_mcu_send_and_get_msg(struct mt76_dev *dev, int cmd, const void *data, 1331ae5ad627SFelix Fietkau int len, bool wait_resp, struct sk_buff **ret); 1332ae5ad627SFelix Fietkau int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb, 1333ae5ad627SFelix Fietkau int cmd, bool wait_resp, struct sk_buff **ret); 1334215a2efaSLorenzo Bianconi int __mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 1335215a2efaSLorenzo Bianconi int len, int max_len); 1336215a2efaSLorenzo Bianconi static inline int 1337215a2efaSLorenzo Bianconi mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 1338215a2efaSLorenzo Bianconi int len) 1339215a2efaSLorenzo Bianconi { 13405b8f1840SSean Wang int max_len = 4096 - dev->mcu_ops->headroom; 13415b8f1840SSean Wang 13425b8f1840SSean Wang return __mt76_mcu_send_firmware(dev, cmd, data, len, max_len); 1343215a2efaSLorenzo Bianconi } 1344215a2efaSLorenzo Bianconi 1345ae5ad627SFelix Fietkau static inline int 1346ae5ad627SFelix Fietkau mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data, int len, 1347ae5ad627SFelix Fietkau bool wait_resp) 1348ae5ad627SFelix Fietkau { 1349ae5ad627SFelix Fietkau return mt76_mcu_send_and_get_msg(dev, cmd, data, len, wait_resp, NULL); 1350ae5ad627SFelix Fietkau } 1351ae5ad627SFelix Fietkau 1352ae5ad627SFelix Fietkau static inline int 1353ae5ad627SFelix Fietkau mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb, int cmd, 1354ae5ad627SFelix Fietkau bool wait_resp) 1355ae5ad627SFelix Fietkau { 1356ae5ad627SFelix Fietkau return mt76_mcu_skb_send_and_get_msg(dev, skb, cmd, wait_resp, NULL); 1357ae5ad627SFelix Fietkau } 13589df0fab9SLorenzo Bianconi 13599220f695SLorenzo Bianconi void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set); 13609220f695SLorenzo Bianconi 136122b980baSFelix Fietkau s8 mt76_get_rate_power_limits(struct mt76_phy *phy, 136222b980baSFelix Fietkau struct ieee80211_channel *chan, 136322b980baSFelix Fietkau struct mt76_power_limits *dest, 136422b980baSFelix Fietkau s8 target_power); 136522b980baSFelix Fietkau 1366d089692bSLorenzo Bianconi struct mt76_txwi_cache * 1367d089692bSLorenzo Bianconi mt76_token_release(struct mt76_dev *dev, int token, bool *wake); 1368d089692bSLorenzo Bianconi int mt76_token_consume(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi); 1369d089692bSLorenzo Bianconi void __mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked); 1370d089692bSLorenzo Bianconi 1371d089692bSLorenzo Bianconi static inline void mt76_set_tx_blocked(struct mt76_dev *dev, bool blocked) 1372d089692bSLorenzo Bianconi { 1373d089692bSLorenzo Bianconi spin_lock_bh(&dev->token_lock); 1374d089692bSLorenzo Bianconi __mt76_set_tx_blocked(dev, blocked); 1375d089692bSLorenzo Bianconi spin_unlock_bh(&dev->token_lock); 1376d089692bSLorenzo Bianconi } 1377d089692bSLorenzo Bianconi 1378d089692bSLorenzo Bianconi static inline int 1379d089692bSLorenzo Bianconi mt76_token_get(struct mt76_dev *dev, struct mt76_txwi_cache **ptxwi) 1380d089692bSLorenzo Bianconi { 1381d089692bSLorenzo Bianconi int token; 1382d089692bSLorenzo Bianconi 1383d089692bSLorenzo Bianconi spin_lock_bh(&dev->token_lock); 1384d089692bSLorenzo Bianconi token = idr_alloc(&dev->token, *ptxwi, 0, dev->drv->token_size, 1385d089692bSLorenzo Bianconi GFP_ATOMIC); 1386d089692bSLorenzo Bianconi spin_unlock_bh(&dev->token_lock); 1387d089692bSLorenzo Bianconi 1388d089692bSLorenzo Bianconi return token; 1389d089692bSLorenzo Bianconi } 1390d089692bSLorenzo Bianconi 1391d089692bSLorenzo Bianconi static inline struct mt76_txwi_cache * 1392d089692bSLorenzo Bianconi mt76_token_put(struct mt76_dev *dev, int token) 1393d089692bSLorenzo Bianconi { 1394d089692bSLorenzo Bianconi struct mt76_txwi_cache *txwi; 1395d089692bSLorenzo Bianconi 1396d089692bSLorenzo Bianconi spin_lock_bh(&dev->token_lock); 1397d089692bSLorenzo Bianconi txwi = idr_remove(&dev->token, token); 1398d089692bSLorenzo Bianconi spin_unlock_bh(&dev->token_lock); 1399d089692bSLorenzo Bianconi 1400d089692bSLorenzo Bianconi return txwi; 1401d089692bSLorenzo Bianconi } 140290052b84SLorenzo Bianconi 1403bd1e3e7bSLorenzo Bianconi static inline void mt76_packet_id_init(struct mt76_wcid *wcid) 140490052b84SLorenzo Bianconi { 1405bd1e3e7bSLorenzo Bianconi INIT_LIST_HEAD(&wcid->list); 1406bd1e3e7bSLorenzo Bianconi idr_init(&wcid->pktid); 140790052b84SLorenzo Bianconi } 1408bd1e3e7bSLorenzo Bianconi 1409bd1e3e7bSLorenzo Bianconi static inline void 1410bd1e3e7bSLorenzo Bianconi mt76_packet_id_flush(struct mt76_dev *dev, struct mt76_wcid *wcid) 1411bd1e3e7bSLorenzo Bianconi { 1412bd1e3e7bSLorenzo Bianconi struct sk_buff_head list; 1413bd1e3e7bSLorenzo Bianconi 1414bd1e3e7bSLorenzo Bianconi mt76_tx_status_lock(dev, &list); 1415bd1e3e7bSLorenzo Bianconi mt76_tx_status_skb_get(dev, wcid, -1, &list); 1416bd1e3e7bSLorenzo Bianconi mt76_tx_status_unlock(dev, &list); 1417bd1e3e7bSLorenzo Bianconi 1418bd1e3e7bSLorenzo Bianconi idr_destroy(&wcid->pktid); 1419bd1e3e7bSLorenzo Bianconi } 1420bd1e3e7bSLorenzo Bianconi 142117f1de56SFelix Fietkau #endif 1422