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 222a92b08bSLorenzo Bianconi #define MT_SKB_HEAD_LEN 128 2317f1de56SFelix Fietkau 24e1378e52SFelix Fietkau #define MT_MAX_NON_AQL_PKT 16 25e1378e52SFelix Fietkau #define MT_TXQ_FREE_THR 32 26e1378e52SFelix Fietkau 2717f1de56SFelix Fietkau struct mt76_dev; 2896747a51SFelix Fietkau struct mt76_phy; 29469d4818SLorenzo Bianconi struct mt76_wcid; 3017f1de56SFelix Fietkau 316da5a291SStanislaw Gruszka struct mt76_reg_pair { 326da5a291SStanislaw Gruszka u32 reg; 336da5a291SStanislaw Gruszka u32 value; 346da5a291SStanislaw Gruszka }; 356da5a291SStanislaw Gruszka 36c50479faSStanislaw Gruszka enum mt76_bus_type { 37c50479faSStanislaw Gruszka MT76_BUS_MMIO, 38c50479faSStanislaw Gruszka MT76_BUS_USB, 39d39b52e3SSean Wang MT76_BUS_SDIO, 40c50479faSStanislaw Gruszka }; 41c50479faSStanislaw Gruszka 4217f1de56SFelix Fietkau struct mt76_bus_ops { 4317f1de56SFelix Fietkau u32 (*rr)(struct mt76_dev *dev, u32 offset); 4417f1de56SFelix Fietkau void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); 4517f1de56SFelix Fietkau u32 (*rmw)(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 4635e4ebeaSLorenzo Bianconi void (*write_copy)(struct mt76_dev *dev, u32 offset, const void *data, 4735e4ebeaSLorenzo Bianconi int len); 4835e4ebeaSLorenzo Bianconi void (*read_copy)(struct mt76_dev *dev, u32 offset, void *data, 4917f1de56SFelix Fietkau int len); 506da5a291SStanislaw Gruszka int (*wr_rp)(struct mt76_dev *dev, u32 base, 516da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 526da5a291SStanislaw Gruszka int (*rd_rp)(struct mt76_dev *dev, u32 base, 536da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 54c50479faSStanislaw Gruszka enum mt76_bus_type type; 5517f1de56SFelix Fietkau }; 5617f1de56SFelix Fietkau 5761c51a74SLorenzo Bianconi #define mt76_is_usb(dev) ((dev)->bus->type == MT76_BUS_USB) 5861c51a74SLorenzo Bianconi #define mt76_is_mmio(dev) ((dev)->bus->type == MT76_BUS_MMIO) 59d39b52e3SSean Wang #define mt76_is_sdio(dev) ((dev)->bus->type == MT76_BUS_SDIO) 60c50479faSStanislaw Gruszka 6117f1de56SFelix Fietkau enum mt76_txq_id { 6217f1de56SFelix Fietkau MT_TXQ_VO = IEEE80211_AC_VO, 6317f1de56SFelix Fietkau MT_TXQ_VI = IEEE80211_AC_VI, 6417f1de56SFelix Fietkau MT_TXQ_BE = IEEE80211_AC_BE, 6517f1de56SFelix Fietkau MT_TXQ_BK = IEEE80211_AC_BK, 6617f1de56SFelix Fietkau MT_TXQ_PSD, 6717f1de56SFelix Fietkau MT_TXQ_BEACON, 6817f1de56SFelix Fietkau MT_TXQ_CAB, 6917f1de56SFelix Fietkau __MT_TXQ_MAX 7017f1de56SFelix Fietkau }; 7117f1de56SFelix Fietkau 72b1cb42adSLorenzo Bianconi enum mt76_mcuq_id { 73e637763bSLorenzo Bianconi MT_MCUQ_WM, 74e637763bSLorenzo Bianconi MT_MCUQ_WA, 75e637763bSLorenzo Bianconi MT_MCUQ_FWDL, 76b1cb42adSLorenzo Bianconi __MT_MCUQ_MAX 77b1cb42adSLorenzo Bianconi }; 78b1cb42adSLorenzo Bianconi 7917f1de56SFelix Fietkau enum mt76_rxq_id { 8017f1de56SFelix Fietkau MT_RXQ_MAIN, 8117f1de56SFelix Fietkau MT_RXQ_MCU, 82d3377b78SRyder Lee MT_RXQ_MCU_WA, 834c430774SLorenzo Bianconi MT_RXQ_EXT, 8476027f40SFelix Fietkau MT_RXQ_EXT_WA, 8517f1de56SFelix Fietkau __MT_RXQ_MAX 8617f1de56SFelix Fietkau }; 8717f1de56SFelix Fietkau 8817f1de56SFelix Fietkau struct mt76_queue_buf { 8917f1de56SFelix Fietkau dma_addr_t addr; 9027d5c528SFelix Fietkau u16 len; 9127d5c528SFelix Fietkau bool skip_unmap; 9217f1de56SFelix Fietkau }; 9317f1de56SFelix Fietkau 94b5903c47SLorenzo Bianconi struct mt76_tx_info { 95b5903c47SLorenzo Bianconi struct mt76_queue_buf buf[32]; 96cfaae9e6SLorenzo Bianconi struct sk_buff *skb; 97b5903c47SLorenzo Bianconi int nbuf; 98b5903c47SLorenzo Bianconi u32 info; 99b5903c47SLorenzo Bianconi }; 100b5903c47SLorenzo Bianconi 10117f1de56SFelix Fietkau struct mt76_queue_entry { 10217f1de56SFelix Fietkau union { 10317f1de56SFelix Fietkau void *buf; 10417f1de56SFelix Fietkau struct sk_buff *skb; 10517f1de56SFelix Fietkau }; 106b40b15e1SLorenzo Bianconi union { 10717f1de56SFelix Fietkau struct mt76_txwi_cache *txwi; 108d7d4ea9aSStanislaw Gruszka struct urb *urb; 109d39b52e3SSean Wang int buf_sz; 110b40b15e1SLorenzo Bianconi }; 11175d4bf1fSFelix Fietkau u32 dma_addr[2]; 11275d4bf1fSFelix Fietkau u16 dma_len[2]; 113e1378e52SFelix Fietkau u16 wcid; 1147bd0650bSLorenzo Bianconi bool skip_buf0:1; 11527d5c528SFelix Fietkau bool skip_buf1:1; 1167bd0650bSLorenzo Bianconi bool done:1; 11717f1de56SFelix Fietkau }; 11817f1de56SFelix Fietkau 11917f1de56SFelix Fietkau struct mt76_queue_regs { 12017f1de56SFelix Fietkau u32 desc_base; 12117f1de56SFelix Fietkau u32 ring_size; 12217f1de56SFelix Fietkau u32 cpu_idx; 12317f1de56SFelix Fietkau u32 dma_idx; 12417f1de56SFelix Fietkau } __packed __aligned(4); 12517f1de56SFelix Fietkau 12617f1de56SFelix Fietkau struct mt76_queue { 12717f1de56SFelix Fietkau struct mt76_queue_regs __iomem *regs; 12817f1de56SFelix Fietkau 12917f1de56SFelix Fietkau spinlock_t lock; 1309716ef04SFelix Fietkau spinlock_t cleanup_lock; 13117f1de56SFelix Fietkau struct mt76_queue_entry *entry; 13217f1de56SFelix Fietkau struct mt76_desc *desc; 13317f1de56SFelix Fietkau 134b40b15e1SLorenzo Bianconi u16 first; 13517f1de56SFelix Fietkau u16 head; 13617f1de56SFelix Fietkau u16 tail; 13717f1de56SFelix Fietkau int ndesc; 13817f1de56SFelix Fietkau int queued; 13917f1de56SFelix Fietkau int buf_size; 140cd44bc40SLorenzo Bianconi bool stopped; 14190d494c9SFelix Fietkau bool blocked; 14217f1de56SFelix Fietkau 14317f1de56SFelix Fietkau u8 buf_offset; 14417f1de56SFelix Fietkau u8 hw_idx; 145b671da33SLorenzo Bianconi u8 qid; 14617f1de56SFelix Fietkau 14717f1de56SFelix Fietkau dma_addr_t desc_dma; 14817f1de56SFelix Fietkau struct sk_buff *rx_head; 149c12128ceSFelix Fietkau struct page_frag_cache rx_page; 15017f1de56SFelix Fietkau }; 15117f1de56SFelix Fietkau 152db0f04f3SLorenzo Bianconi struct mt76_mcu_ops { 153bb31a80eSLorenzo Bianconi u32 headroom; 154bb31a80eSLorenzo Bianconi u32 tailroom; 155bb31a80eSLorenzo Bianconi 156a74d6336SStanislaw Gruszka int (*mcu_send_msg)(struct mt76_dev *dev, int cmd, const void *data, 157a74d6336SStanislaw Gruszka int len, bool wait_resp); 158f4d45fe2SLorenzo Bianconi int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb, 159e452c6ebSFelix Fietkau int cmd, int *seq); 160f320d812SFelix Fietkau int (*mcu_parse_response)(struct mt76_dev *dev, int cmd, 161f320d812SFelix Fietkau struct sk_buff *skb, int seq); 162d39b52e3SSean Wang u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset); 163d39b52e3SSean Wang void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val); 1646da5a291SStanislaw Gruszka int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base, 1656da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 1666da5a291SStanislaw Gruszka int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base, 1676da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 16800496042SFelix Fietkau int (*mcu_restart)(struct mt76_dev *dev); 169acf337c3SLorenzo Bianconi void (*mcu_reset)(struct mt76_dev *dev); 170db0f04f3SLorenzo Bianconi }; 171db0f04f3SLorenzo Bianconi 17217f1de56SFelix Fietkau struct mt76_queue_ops { 17317f1de56SFelix Fietkau int (*init)(struct mt76_dev *dev); 17417f1de56SFelix Fietkau 175b1bfbe70SLorenzo Bianconi int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q, 176b1bfbe70SLorenzo Bianconi int idx, int n_desc, int bufsize, 177b1bfbe70SLorenzo Bianconi u32 ring_base); 17817f1de56SFelix Fietkau 17989870594SLorenzo Bianconi int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q, 180469d4818SLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid, 181469d4818SLorenzo Bianconi struct ieee80211_sta *sta); 182469d4818SLorenzo Bianconi 183d95093a1SLorenzo Bianconi int (*tx_queue_skb_raw)(struct mt76_dev *dev, struct mt76_queue *q, 1845ed31128SLorenzo Bianconi struct sk_buff *skb, u32 tx_info); 1855ed31128SLorenzo Bianconi 18617f1de56SFelix Fietkau void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 18717f1de56SFelix Fietkau int *len, u32 *info, bool *more); 18817f1de56SFelix Fietkau 18917f1de56SFelix Fietkau void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 19017f1de56SFelix Fietkau 191e5655492SLorenzo Bianconi void (*tx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q, 19217f1de56SFelix Fietkau bool flush); 19317f1de56SFelix Fietkau 194c001df97SLorenzo Bianconi void (*rx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q); 195c001df97SLorenzo Bianconi 19617f1de56SFelix Fietkau void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 1973990465dSLorenzo Bianconi 1983990465dSLorenzo Bianconi void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q); 19917f1de56SFelix Fietkau }; 20017f1de56SFelix Fietkau 201d71ef286SFelix Fietkau enum mt76_wcid_flags { 202d71ef286SFelix Fietkau MT_WCID_FLAG_CHECK_PS, 203d71ef286SFelix Fietkau MT_WCID_FLAG_PS, 204e151d71eSFelix Fietkau MT_WCID_FLAG_4ADDR, 20590e3abf0SFelix Fietkau MT_WCID_FLAG_HDR_TRANS, 206d71ef286SFelix Fietkau }; 207d71ef286SFelix Fietkau 20849e649c3SRyder Lee #define MT76_N_WCIDS 288 20936404c06SStanislaw Gruszka 210e394b575SFelix Fietkau /* stored in ieee80211_tx_info::hw_queue */ 211e394b575SFelix Fietkau #define MT_TX_HW_QUEUE_EXT_PHY BIT(3) 212e394b575SFelix Fietkau 213ef13edc0SFelix Fietkau DECLARE_EWMA(signal, 10, 8); 214ef13edc0SFelix Fietkau 215db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_RATE GENMASK(15, 0) 216db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_NSS GENMASK(17, 16) 217db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_TXPWR_ADJ GENMASK(25, 18) 218db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_SET BIT(31) 219db9f11d3SFelix Fietkau 22017f1de56SFelix Fietkau struct mt76_wcid { 221aee5b8cfSFelix Fietkau struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 222aee5b8cfSFelix Fietkau 223e1378e52SFelix Fietkau atomic_t non_aql_packets; 224d71ef286SFelix Fietkau unsigned long flags; 225d71ef286SFelix Fietkau 226ef13edc0SFelix Fietkau struct ewma_signal rssi; 227ef13edc0SFelix Fietkau int inactive_count; 228ef13edc0SFelix Fietkau 22949e649c3SRyder Lee u16 idx; 23017f1de56SFelix Fietkau u8 hw_key_idx; 231730d6d0dSFelix Fietkau u8 hw_key_idx2; 23217f1de56SFelix Fietkau 2339c68a57bSFelix Fietkau u8 sta:1; 234c7d2d631SFelix Fietkau u8 ext_phy:1; 235b443e55fSRyder Lee u8 amsdu:1; 2369c68a57bSFelix Fietkau 23730ce7f44SFelix Fietkau u8 rx_check_pn; 23830ce7f44SFelix Fietkau u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 23901cfc1b4SLorenzo Bianconi u16 cipher; 24030ce7f44SFelix Fietkau 241db9f11d3SFelix Fietkau u32 tx_info; 24223405236SFelix Fietkau bool sw_iv; 24388046b2cSFelix Fietkau 24488046b2cSFelix Fietkau u8 packet_id; 24517f1de56SFelix Fietkau }; 24617f1de56SFelix Fietkau 24717f1de56SFelix Fietkau struct mt76_txq { 24817f1de56SFelix Fietkau struct mt76_wcid *wcid; 24917f1de56SFelix Fietkau 25017f1de56SFelix Fietkau u16 agg_ssn; 25117f1de56SFelix Fietkau bool send_bar; 25217f1de56SFelix Fietkau bool aggr; 25317f1de56SFelix Fietkau }; 25417f1de56SFelix Fietkau 25517f1de56SFelix Fietkau struct mt76_txwi_cache { 25617f1de56SFelix Fietkau struct list_head list; 257f3950a41SLorenzo Bianconi dma_addr_t dma_addr; 2586ca66722SLorenzo Bianconi 2596ca66722SLorenzo Bianconi struct sk_buff *skb; 26017f1de56SFelix Fietkau }; 26117f1de56SFelix Fietkau 262aee5b8cfSFelix Fietkau struct mt76_rx_tid { 263aee5b8cfSFelix Fietkau struct rcu_head rcu_head; 264aee5b8cfSFelix Fietkau 265aee5b8cfSFelix Fietkau struct mt76_dev *dev; 266aee5b8cfSFelix Fietkau 267aee5b8cfSFelix Fietkau spinlock_t lock; 268aee5b8cfSFelix Fietkau struct delayed_work reorder_work; 269aee5b8cfSFelix Fietkau 270aee5b8cfSFelix Fietkau u16 head; 2717c4f744dSRyder Lee u16 size; 2727c4f744dSRyder Lee u16 nframes; 273aee5b8cfSFelix Fietkau 274e7ec563eSMarkus Theil u8 num; 275e7ec563eSMarkus Theil 276aee5b8cfSFelix Fietkau u8 started:1, stopped:1, timer_pending:1; 277aee5b8cfSFelix Fietkau 278aee5b8cfSFelix Fietkau struct sk_buff *reorder_buf[]; 279aee5b8cfSFelix Fietkau }; 280aee5b8cfSFelix Fietkau 28188046b2cSFelix Fietkau #define MT_TX_CB_DMA_DONE BIT(0) 28288046b2cSFelix Fietkau #define MT_TX_CB_TXS_DONE BIT(1) 28388046b2cSFelix Fietkau #define MT_TX_CB_TXS_FAILED BIT(2) 28488046b2cSFelix Fietkau 2858548c6ebSFelix Fietkau #define MT_PACKET_ID_MASK GENMASK(6, 0) 286013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_ACK 0 287013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_SKB 1 288013b2dffSFelix Fietkau #define MT_PACKET_ID_FIRST 2 2898548c6ebSFelix Fietkau #define MT_PACKET_ID_HAS_RATE BIT(7) 29088046b2cSFelix Fietkau 29188046b2cSFelix Fietkau #define MT_TX_STATUS_SKB_TIMEOUT HZ 29288046b2cSFelix Fietkau 29388046b2cSFelix Fietkau struct mt76_tx_cb { 29488046b2cSFelix Fietkau unsigned long jiffies; 29549e649c3SRyder Lee u16 wcid; 29688046b2cSFelix Fietkau u8 pktid; 29788046b2cSFelix Fietkau u8 flags; 29888046b2cSFelix Fietkau }; 29988046b2cSFelix Fietkau 30017f1de56SFelix Fietkau enum { 30117f1de56SFelix Fietkau MT76_STATE_INITIALIZED, 30217f1de56SFelix Fietkau MT76_STATE_RUNNING, 30387e022deSStanislaw Gruszka MT76_STATE_MCU_RUNNING, 30417f1de56SFelix Fietkau MT76_SCANNING, 305fcdfc29eSLorenzo Bianconi MT76_HW_SCANNING, 30620305f98SLorenzo Bianconi MT76_HW_SCHED_SCANNING, 307fd6c2dfaSFelix Fietkau MT76_RESTART, 30817f1de56SFelix Fietkau MT76_RESET, 30961c4fa72SFelix Fietkau MT76_MCU_RESET, 310b40b15e1SLorenzo Bianconi MT76_REMOVED, 311b40b15e1SLorenzo Bianconi MT76_READING_STATS, 312eb99cc95SLorenzo Bianconi MT76_STATE_POWER_OFF, 313c6bf2010SLorenzo Bianconi MT76_STATE_SUSPEND, 3147307f296SLorenzo Bianconi MT76_STATE_ROC, 31508523a2aSLorenzo Bianconi MT76_STATE_PM, 31617f1de56SFelix Fietkau }; 31717f1de56SFelix Fietkau 31817f1de56SFelix Fietkau struct mt76_hw_cap { 31917f1de56SFelix Fietkau bool has_2ghz; 32017f1de56SFelix Fietkau bool has_5ghz; 32117f1de56SFelix Fietkau }; 32217f1de56SFelix Fietkau 3239ec0b821SFelix Fietkau #define MT_DRV_TXWI_NO_FREE BIT(0) 3249ec0b821SFelix Fietkau #define MT_DRV_TX_ALIGNED4_SKBS BIT(1) 3255ce09c1aSFelix Fietkau #define MT_DRV_SW_RX_AIRTIME BIT(2) 32694d4d076SLorenzo Bianconi #define MT_DRV_RX_DMA_HDR BIT(3) 327d3c82998SLorenzo Bianconi #define MT_DRV_HW_MGMT_TXQ BIT(4) 328b443e55fSRyder Lee #define MT_DRV_AMSDU_OFFLOAD BIT(5) 3296ca66722SLorenzo Bianconi 33017f1de56SFelix Fietkau struct mt76_driver_ops { 3319ec0b821SFelix Fietkau u32 drv_flags; 332ea565833SFelix Fietkau u32 survey_flags; 33317f1de56SFelix Fietkau u16 txwi_size; 33417f1de56SFelix Fietkau 33517f1de56SFelix Fietkau void (*update_survey)(struct mt76_dev *dev); 33617f1de56SFelix Fietkau 33717f1de56SFelix Fietkau int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 338cfaae9e6SLorenzo Bianconi enum mt76_txq_id qid, struct mt76_wcid *wcid, 339b5903c47SLorenzo Bianconi struct ieee80211_sta *sta, 340b5903c47SLorenzo Bianconi struct mt76_tx_info *tx_info); 34117f1de56SFelix Fietkau 342d80e52c7SFelix Fietkau void (*tx_complete_skb)(struct mt76_dev *dev, 343e226ba2eSLorenzo Bianconi struct mt76_queue_entry *e); 34417f1de56SFelix Fietkau 345b40b15e1SLorenzo Bianconi bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 346b40b15e1SLorenzo Bianconi 34717f1de56SFelix Fietkau void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 34817f1de56SFelix Fietkau struct sk_buff *skb); 34917f1de56SFelix Fietkau 35017f1de56SFelix Fietkau void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 351d71ef286SFelix Fietkau 352d71ef286SFelix Fietkau void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 353d71ef286SFelix Fietkau bool ps); 354e28487eaSFelix Fietkau 355e28487eaSFelix Fietkau int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif, 356e28487eaSFelix Fietkau struct ieee80211_sta *sta); 357e28487eaSFelix Fietkau 3589c193de5SFelix Fietkau void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3599c193de5SFelix Fietkau struct ieee80211_sta *sta); 3609c193de5SFelix Fietkau 361e28487eaSFelix Fietkau void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, 362e28487eaSFelix Fietkau struct ieee80211_sta *sta); 36317f1de56SFelix Fietkau }; 36417f1de56SFelix Fietkau 36517f1de56SFelix Fietkau struct mt76_channel_state { 36617f1de56SFelix Fietkau u64 cc_active; 36717f1de56SFelix Fietkau u64 cc_busy; 3686bfa6e38SLorenzo Bianconi u64 cc_rx; 3695ce09c1aSFelix Fietkau u64 cc_bss_rx; 370ea565833SFelix Fietkau u64 cc_tx; 371e5051965SFelix Fietkau 372e5051965SFelix Fietkau s8 noise; 37317f1de56SFelix Fietkau }; 37417f1de56SFelix Fietkau 37517f1de56SFelix Fietkau struct mt76_sband { 37617f1de56SFelix Fietkau struct ieee80211_supported_band sband; 37717f1de56SFelix Fietkau struct mt76_channel_state *chan; 37817f1de56SFelix Fietkau }; 37917f1de56SFelix Fietkau 380b6862effSLorenzo Bianconi struct mt76_rate_power { 381b6862effSLorenzo Bianconi union { 382b6862effSLorenzo Bianconi struct { 383b6862effSLorenzo Bianconi s8 cck[4]; 384b6862effSLorenzo Bianconi s8 ofdm[8]; 385b6862effSLorenzo Bianconi s8 stbc[10]; 386b6862effSLorenzo Bianconi s8 ht[16]; 387b6862effSLorenzo Bianconi s8 vht[10]; 388b6862effSLorenzo Bianconi }; 389b6862effSLorenzo Bianconi s8 all[48]; 390b6862effSLorenzo Bianconi }; 391b6862effSLorenzo Bianconi }; 392b6862effSLorenzo Bianconi 393b40b15e1SLorenzo Bianconi /* addr req mask */ 394b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_EEPROM BIT(31) 395b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_CFG BIT(30) 396b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 397b40b15e1SLorenzo Bianconi 398b40b15e1SLorenzo Bianconi #define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 399b40b15e1SLorenzo Bianconi enum mt_vendor_req { 400b40b15e1SLorenzo Bianconi MT_VEND_DEV_MODE = 0x1, 401b40b15e1SLorenzo Bianconi MT_VEND_WRITE = 0x2, 4021e816c65SLorenzo Bianconi MT_VEND_POWER_ON = 0x4, 403b40b15e1SLorenzo Bianconi MT_VEND_MULTI_WRITE = 0x6, 404b40b15e1SLorenzo Bianconi MT_VEND_MULTI_READ = 0x7, 405b40b15e1SLorenzo Bianconi MT_VEND_READ_EEPROM = 0x9, 406b40b15e1SLorenzo Bianconi MT_VEND_WRITE_FCE = 0x42, 407b40b15e1SLorenzo Bianconi MT_VEND_WRITE_CFG = 0x46, 408b40b15e1SLorenzo Bianconi MT_VEND_READ_CFG = 0x47, 4091e816c65SLorenzo Bianconi MT_VEND_READ_EXT = 0x63, 4101e816c65SLorenzo Bianconi MT_VEND_WRITE_EXT = 0x66, 411d0846f08SSean Wang MT_VEND_FEATURE_SET = 0x91, 412b40b15e1SLorenzo Bianconi }; 413b40b15e1SLorenzo Bianconi 414b40b15e1SLorenzo Bianconi enum mt76u_in_ep { 415b40b15e1SLorenzo Bianconi MT_EP_IN_PKT_RX, 416b40b15e1SLorenzo Bianconi MT_EP_IN_CMD_RESP, 417b40b15e1SLorenzo Bianconi __MT_EP_IN_MAX, 418b40b15e1SLorenzo Bianconi }; 419b40b15e1SLorenzo Bianconi 420b40b15e1SLorenzo Bianconi enum mt76u_out_ep { 421b40b15e1SLorenzo Bianconi MT_EP_OUT_INBAND_CMD, 422b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BE, 42323cb16d2SLorenzo Bianconi MT_EP_OUT_AC_BK, 424b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VI, 425b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VO, 426b40b15e1SLorenzo Bianconi MT_EP_OUT_HCCA, 427b40b15e1SLorenzo Bianconi __MT_EP_OUT_MAX, 428b40b15e1SLorenzo Bianconi }; 429b40b15e1SLorenzo Bianconi 43009872957SLorenzo Bianconi struct mt76_mcu { 43109872957SLorenzo Bianconi struct mutex mutex; 43209872957SLorenzo Bianconi u32 msg_seq; 433e452c6ebSFelix Fietkau int timeout; 43409872957SLorenzo Bianconi 43509872957SLorenzo Bianconi struct sk_buff_head res_q; 43609872957SLorenzo Bianconi wait_queue_head_t wait; 43709872957SLorenzo Bianconi }; 43809872957SLorenzo Bianconi 43914663f0cSLorenzo Bianconi #define MT_TX_SG_MAX_SIZE 8 440972c5981SSean Wang #define MT_RX_SG_MAX_SIZE 4 441b40b15e1SLorenzo Bianconi #define MT_NUM_TX_ENTRIES 256 442b40b15e1SLorenzo Bianconi #define MT_NUM_RX_ENTRIES 128 443b40b15e1SLorenzo Bianconi #define MCU_RESP_URB_SIZE 1024 444b40b15e1SLorenzo Bianconi struct mt76_usb { 445b40b15e1SLorenzo Bianconi struct mutex usb_ctrl_mtx; 446a6bfb6d1SStanislaw Gruszka u8 *data; 447a6bfb6d1SStanislaw Gruszka u16 data_len; 448b40b15e1SLorenzo Bianconi 4499daf27e6SLorenzo Bianconi struct mt76_worker status_worker; 450be83a7e2SLorenzo Bianconi struct mt76_worker rx_worker; 4519daf27e6SLorenzo Bianconi 452284efb47SLorenzo Bianconi struct work_struct stat_work; 453b40b15e1SLorenzo Bianconi 454b40b15e1SLorenzo Bianconi u8 out_ep[__MT_EP_OUT_MAX]; 455b40b15e1SLorenzo Bianconi u8 in_ep[__MT_EP_IN_MAX]; 45663a7de5dSLorenzo Bianconi bool sg_en; 457b40b15e1SLorenzo Bianconi 458b40b15e1SLorenzo Bianconi struct mt76u_mcu { 459a18a494fSStanislaw Gruszka u8 *data; 460851ab66eSLorenzo Bianconi /* multiple reads */ 461851ab66eSLorenzo Bianconi struct mt76_reg_pair *rp; 462851ab66eSLorenzo Bianconi int rp_len; 463851ab66eSLorenzo Bianconi u32 base; 464851ab66eSLorenzo Bianconi bool burst; 465b40b15e1SLorenzo Bianconi } mcu; 466b40b15e1SLorenzo Bianconi }; 467b40b15e1SLorenzo Bianconi 4681522ff73SLorenzo Bianconi #define MT76S_XMIT_BUF_SZ (16 * PAGE_SIZE) 469d39b52e3SSean Wang struct mt76_sdio { 470fefb584dSLorenzo Bianconi struct mt76_worker txrx_worker; 4716a618acbSLorenzo Bianconi struct mt76_worker status_worker; 4726a618acbSLorenzo Bianconi struct mt76_worker net_worker; 4736a618acbSLorenzo Bianconi 474d74fda4cSLorenzo Bianconi struct work_struct stat_work; 475974327a4SLorenzo Bianconi 476264b7b19SLorenzo Bianconi u8 *xmit_buf[IEEE80211_NUM_ACS + 2]; 4771522ff73SLorenzo Bianconi 478d39b52e3SSean Wang struct sdio_func *func; 479b4964908SSean Wang void *intr_data; 480d39b52e3SSean Wang 481d39b52e3SSean Wang struct { 482d39b52e3SSean Wang int pse_data_quota; 483d39b52e3SSean Wang int ple_data_quota; 484d39b52e3SSean Wang int pse_mcu_quota; 485d39b52e3SSean Wang int deficit; 486d39b52e3SSean Wang } sched; 487d39b52e3SSean Wang }; 488d39b52e3SSean Wang 489f7bbb80fSLorenzo Bianconi struct mt76_mmio { 49027db1ad1SLorenzo Bianconi void __iomem *regs; 491957068c2SLorenzo Bianconi spinlock_t irq_lock; 492957068c2SLorenzo Bianconi u32 irqmask; 493f7bbb80fSLorenzo Bianconi }; 494f7bbb80fSLorenzo Bianconi 4955ce09c1aSFelix Fietkau struct mt76_rx_status { 4965ce09c1aSFelix Fietkau union { 4975ce09c1aSFelix Fietkau struct mt76_wcid *wcid; 49849e649c3SRyder Lee u16 wcid_idx; 4995ce09c1aSFelix Fietkau }; 5005ce09c1aSFelix Fietkau 5010fda6d7bSRyder Lee u32 reorder_time; 5025ce09c1aSFelix Fietkau 5035ce09c1aSFelix Fietkau u32 ampdu_ref; 5040fda6d7bSRyder Lee u32 timestamp; 5055ce09c1aSFelix Fietkau 5065ce09c1aSFelix Fietkau u8 iv[6]; 5075ce09c1aSFelix Fietkau 508bfc394ddSFelix Fietkau u8 ext_phy:1; 5095ce09c1aSFelix Fietkau u8 aggr:1; 510e195dad1SFelix Fietkau u8 qos_ctl; 5115ce09c1aSFelix Fietkau u16 seqno; 5125ce09c1aSFelix Fietkau 5135ce09c1aSFelix Fietkau u16 freq; 5145ce09c1aSFelix Fietkau u32 flag; 5155ce09c1aSFelix Fietkau u8 enc_flags; 516af4a2f2fSRyder Lee u8 encoding:2, bw:3, he_ru:3; 517af4a2f2fSRyder Lee u8 he_gi:2, he_dcm:1; 518cc4b3c13SLorenzo Bianconi u8 amsdu:1, first_amsdu:1, last_amsdu:1; 5195ce09c1aSFelix Fietkau u8 rate_idx; 5205ce09c1aSFelix Fietkau u8 nss; 5215ce09c1aSFelix Fietkau u8 band; 5225ce09c1aSFelix Fietkau s8 signal; 5235ce09c1aSFelix Fietkau u8 chains; 5245ce09c1aSFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 5255ce09c1aSFelix Fietkau }; 5265ce09c1aSFelix Fietkau 527f0efa862SFelix Fietkau struct mt76_testmode_ops { 528c918c74dSShayne Chen int (*set_state)(struct mt76_phy *phy, enum mt76_testmode_state state); 529c918c74dSShayne Chen int (*set_params)(struct mt76_phy *phy, struct nlattr **tb, 530f0efa862SFelix Fietkau enum mt76_testmode_state new_state); 531c918c74dSShayne Chen int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg); 532f0efa862SFelix Fietkau }; 533f0efa862SFelix Fietkau 534f0efa862SFelix Fietkau struct mt76_testmode_data { 535f0efa862SFelix Fietkau enum mt76_testmode_state state; 536f0efa862SFelix Fietkau 537f0efa862SFelix Fietkau u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)]; 538f0efa862SFelix Fietkau struct sk_buff *tx_skb; 539f0efa862SFelix Fietkau 540f0efa862SFelix Fietkau u32 tx_count; 541f0efa862SFelix Fietkau u16 tx_msdu_len; 542f0efa862SFelix Fietkau 543f0efa862SFelix Fietkau u8 tx_rate_mode; 544f0efa862SFelix Fietkau u8 tx_rate_idx; 545f0efa862SFelix Fietkau u8 tx_rate_nss; 546f0efa862SFelix Fietkau u8 tx_rate_sgi; 547f0efa862SFelix Fietkau u8 tx_rate_ldpc; 5487f54c742SShayne Chen u8 tx_rate_stbc; 5491a38c2f5SShayne Chen u8 tx_ltf; 550f0efa862SFelix Fietkau 551f0efa862SFelix Fietkau u8 tx_antenna_mask; 552fdc9c18eSShayne Chen u8 tx_spe_idx; 553f0efa862SFelix Fietkau 554b8cbdb97SShayne Chen u8 tx_duty_cycle; 555b8cbdb97SShayne Chen u32 tx_time; 556b8cbdb97SShayne Chen u32 tx_ipg; 557b8cbdb97SShayne Chen 558f0efa862SFelix Fietkau u32 freq_offset; 559f0efa862SFelix Fietkau 560f0efa862SFelix Fietkau u8 tx_power[4]; 561f0efa862SFelix Fietkau u8 tx_power_control; 562f0efa862SFelix Fietkau 563f0efa862SFelix Fietkau u32 tx_pending; 564f0efa862SFelix Fietkau u32 tx_queued; 565ba459094SShayne Chen u16 tx_queued_limit; 566f0efa862SFelix Fietkau u32 tx_done; 567f0efa862SFelix Fietkau struct { 568f0efa862SFelix Fietkau u64 packets[__MT_RXQ_MAX]; 569f0efa862SFelix Fietkau u64 fcs_error[__MT_RXQ_MAX]; 570f0efa862SFelix Fietkau } rx_stats; 571f0efa862SFelix Fietkau }; 572f0efa862SFelix Fietkau 57385d96704SLorenzo Bianconi struct mt76_vif { 57485d96704SLorenzo Bianconi u8 idx; 57585d96704SLorenzo Bianconi u8 omac_idx; 57685d96704SLorenzo Bianconi u8 band_idx; 57785d96704SLorenzo Bianconi u8 wmm_idx; 57885d96704SLorenzo Bianconi u8 scan_seq_num; 57985d96704SLorenzo Bianconi }; 58085d96704SLorenzo Bianconi 581ac24dd35SFelix Fietkau struct mt76_phy { 582ac24dd35SFelix Fietkau struct ieee80211_hw *hw; 583ac24dd35SFelix Fietkau struct mt76_dev *dev; 584a3d01038SFelix Fietkau void *priv; 58596747a51SFelix Fietkau 586011849e0SFelix Fietkau unsigned long state; 587011849e0SFelix Fietkau 58891990519SLorenzo Bianconi struct mt76_queue *q_tx[__MT_TXQ_MAX]; 58991990519SLorenzo Bianconi 59096747a51SFelix Fietkau struct cfg80211_chan_def chandef; 59196747a51SFelix Fietkau struct ieee80211_channel *main_chan; 59296747a51SFelix Fietkau 59396747a51SFelix Fietkau struct mt76_channel_state *chan_state; 59496747a51SFelix Fietkau ktime_t survey_time; 59596747a51SFelix Fietkau 59648dbce5cSLorenzo Bianconi struct mt76_hw_cap cap; 59796747a51SFelix Fietkau struct mt76_sband sband_2g; 59896747a51SFelix Fietkau struct mt76_sband sband_5g; 599beaaeb6bSFelix Fietkau 60098df2baeSLorenzo Bianconi u8 macaddr[ETH_ALEN]; 60198df2baeSLorenzo Bianconi 602beaaeb6bSFelix Fietkau int txpower_cur; 603beaaeb6bSFelix Fietkau u8 antenna_mask; 604b9027e08SLorenzo Bianconi u16 chainmask; 605c918c74dSShayne Chen 606c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 607c918c74dSShayne Chen struct mt76_testmode_data test; 608c918c74dSShayne Chen #endif 609a782f8bfSLorenzo Bianconi 610a782f8bfSLorenzo Bianconi struct delayed_work mac_work; 611a782f8bfSLorenzo Bianconi u8 mac_work_count; 612cc4b3c13SLorenzo Bianconi 613cc4b3c13SLorenzo Bianconi struct { 614cc4b3c13SLorenzo Bianconi struct sk_buff *head; 615cc4b3c13SLorenzo Bianconi struct sk_buff **tail; 616cc4b3c13SLorenzo Bianconi u16 seqno; 617cc4b3c13SLorenzo Bianconi } rx_amsdu[__MT_RXQ_MAX]; 618ac24dd35SFelix Fietkau }; 619ac24dd35SFelix Fietkau 62017f1de56SFelix Fietkau struct mt76_dev { 621ac24dd35SFelix Fietkau struct mt76_phy phy; /* must be first */ 622ac24dd35SFelix Fietkau 623bfc394ddSFelix Fietkau struct mt76_phy *phy2; 624bfc394ddSFelix Fietkau 62517f1de56SFelix Fietkau struct ieee80211_hw *hw; 62617f1de56SFelix Fietkau 62717f1de56SFelix Fietkau spinlock_t lock; 62817f1de56SFelix Fietkau spinlock_t cc_lock; 629108a4861SStanislaw Gruszka 6305ce09c1aSFelix Fietkau u32 cur_cc_bss_rx; 6315ce09c1aSFelix Fietkau 6325ce09c1aSFelix Fietkau struct mt76_rx_status rx_ampdu_status; 6335ce09c1aSFelix Fietkau u32 rx_ampdu_len; 6345ce09c1aSFelix Fietkau u32 rx_ampdu_ref; 6355ce09c1aSFelix Fietkau 636108a4861SStanislaw Gruszka struct mutex mutex; 637108a4861SStanislaw Gruszka 63817f1de56SFelix Fietkau const struct mt76_bus_ops *bus; 63917f1de56SFelix Fietkau const struct mt76_driver_ops *drv; 640db0f04f3SLorenzo Bianconi const struct mt76_mcu_ops *mcu_ops; 64117f1de56SFelix Fietkau struct device *dev; 64217f1de56SFelix Fietkau 64309872957SLorenzo Bianconi struct mt76_mcu mcu; 64409872957SLorenzo Bianconi 64517f1de56SFelix Fietkau struct net_device napi_dev; 646aa40528aSFelix Fietkau struct net_device tx_napi_dev; 647c3d7c82aSFelix Fietkau spinlock_t rx_lock; 64817f1de56SFelix Fietkau struct napi_struct napi[__MT_RXQ_MAX]; 64917f1de56SFelix Fietkau struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 65017f1de56SFelix Fietkau 65117f1de56SFelix Fietkau struct list_head txwi_cache; 652b1cb42adSLorenzo Bianconi struct mt76_queue *q_mcu[__MT_MCUQ_MAX]; 65317f1de56SFelix Fietkau struct mt76_queue q_rx[__MT_RXQ_MAX]; 65417f1de56SFelix Fietkau const struct mt76_queue_ops *queue_ops; 655c1e0d2beSLorenzo Bianconi int tx_dma_idx[4]; 65617f1de56SFelix Fietkau 657781eef5bSFelix Fietkau struct mt76_worker tx_worker; 6588402650aSLorenzo Bianconi struct napi_struct tx_napi; 659a33b8ab8SFelix Fietkau 66026e40d4cSFelix Fietkau wait_queue_head_t tx_wait; 66188046b2cSFelix Fietkau struct sk_buff_head status_list; 66226e40d4cSFelix Fietkau 6635e616ad2SFelix Fietkau u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 6645e616ad2SFelix Fietkau u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 66536404c06SStanislaw Gruszka 6662ab33b8dSFelix Fietkau u32 vif_mask; 6672ab33b8dSFelix Fietkau 66836404c06SStanislaw Gruszka struct mt76_wcid global_wcid; 66936404c06SStanislaw Gruszka struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 67036404c06SStanislaw Gruszka 67117f1de56SFelix Fietkau u32 rev; 67217f1de56SFelix Fietkau 673d7b47bbdSLorenzo Bianconi u32 aggr_stats[32]; 674d7b47bbdSLorenzo Bianconi 675dc6057f4SLorenzo Bianconi struct tasklet_struct pre_tbtt_tasklet; 6763041c445SLorenzo Bianconi int beacon_int; 677c8a04d98SLorenzo Bianconi u8 beacon_mask; 6783041c445SLorenzo Bianconi 67917f1de56SFelix Fietkau struct debugfs_blob_wrapper eeprom; 68017f1de56SFelix Fietkau struct debugfs_blob_wrapper otp; 68117f1de56SFelix Fietkau 682b6862effSLorenzo Bianconi struct mt76_rate_power rate_power; 683b6862effSLorenzo Bianconi 6845b257371SLorenzo Bianconi char alpha2[3]; 685d8b8890dSLorenzo Bianconi enum nl80211_dfs_regions region; 686d8b8890dSLorenzo Bianconi 68717f1de56SFelix Fietkau u32 debugfs_reg; 68817f1de56SFelix Fietkau 68917f1de56SFelix Fietkau struct led_classdev led_cdev; 69017f1de56SFelix Fietkau char led_name[32]; 69117f1de56SFelix Fietkau bool led_al; 69217f1de56SFelix Fietkau u8 led_pin; 693b40b15e1SLorenzo Bianconi 694e7173858SFelix Fietkau u8 csa_complete; 695e7173858SFelix Fietkau 696108a4861SStanislaw Gruszka u32 rxfilter; 697108a4861SStanislaw Gruszka 698f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 699f0efa862SFelix Fietkau const struct mt76_testmode_ops *test_ops; 700e7a6a044SShayne Chen struct { 701e7a6a044SShayne Chen const char *name; 702e7a6a044SShayne Chen u32 offset; 703e7a6a044SShayne Chen } test_mtd; 704f0efa862SFelix Fietkau #endif 705a86f1d01SLorenzo Bianconi struct workqueue_struct *wq; 706a86f1d01SLorenzo Bianconi 707f7bbb80fSLorenzo Bianconi union { 708f7bbb80fSLorenzo Bianconi struct mt76_mmio mmio; 709b40b15e1SLorenzo Bianconi struct mt76_usb usb; 710d39b52e3SSean Wang struct mt76_sdio sdio; 71117f1de56SFelix Fietkau }; 712f7bbb80fSLorenzo Bianconi }; 71317f1de56SFelix Fietkau 71417f1de56SFelix Fietkau enum mt76_phy_type { 71517f1de56SFelix Fietkau MT_PHY_TYPE_CCK, 71617f1de56SFelix Fietkau MT_PHY_TYPE_OFDM, 71717f1de56SFelix Fietkau MT_PHY_TYPE_HT, 71817f1de56SFelix Fietkau MT_PHY_TYPE_HT_GF, 71917f1de56SFelix Fietkau MT_PHY_TYPE_VHT, 720d3377b78SRyder Lee MT_PHY_TYPE_HE_SU = 8, 721d3377b78SRyder Lee MT_PHY_TYPE_HE_EXT_SU, 722d3377b78SRyder Lee MT_PHY_TYPE_HE_TB, 723d3377b78SRyder Lee MT_PHY_TYPE_HE_MU, 72417f1de56SFelix Fietkau }; 72517f1de56SFelix Fietkau 726d4131273SStanislaw Gruszka #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 727d4131273SStanislaw Gruszka #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 728d4131273SStanislaw Gruszka #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 72935e4ebeaSLorenzo Bianconi #define __mt76_wr_copy(dev, ...) (dev)->bus->write_copy((dev), __VA_ARGS__) 73035e4ebeaSLorenzo Bianconi #define __mt76_rr_copy(dev, ...) (dev)->bus->read_copy((dev), __VA_ARGS__) 731d4131273SStanislaw Gruszka 73222c575c4SStanislaw Gruszka #define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 73322c575c4SStanislaw Gruszka #define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 73422c575c4SStanislaw Gruszka 73517f1de56SFelix Fietkau #define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 73617f1de56SFelix Fietkau #define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 73717f1de56SFelix Fietkau #define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 73835e4ebeaSLorenzo Bianconi #define mt76_wr_copy(dev, ...) (dev)->mt76.bus->write_copy(&((dev)->mt76), __VA_ARGS__) 73935e4ebeaSLorenzo Bianconi #define mt76_rr_copy(dev, ...) (dev)->mt76.bus->read_copy(&((dev)->mt76), __VA_ARGS__) 7406da5a291SStanislaw Gruszka #define mt76_wr_rp(dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__) 7416da5a291SStanislaw Gruszka #define mt76_rd_rp(dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__) 74217f1de56SFelix Fietkau 743f4d45fe2SLorenzo Bianconi 744e2c2fd0fSLorenzo Bianconi #define mt76_mcu_restart(dev, ...) (dev)->mt76.mcu_ops->mcu_restart(&((dev)->mt76)) 745e2c2fd0fSLorenzo Bianconi #define __mt76_mcu_restart(dev, ...) (dev)->mcu_ops->mcu_restart((dev)) 746db0f04f3SLorenzo Bianconi 74717f1de56SFelix Fietkau #define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 74817f1de56SFelix Fietkau #define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 74917f1de56SFelix Fietkau 75017f1de56SFelix Fietkau #define mt76_get_field(_dev, _reg, _field) \ 75117f1de56SFelix Fietkau FIELD_GET(_field, mt76_rr(dev, _reg)) 75217f1de56SFelix Fietkau 75317f1de56SFelix Fietkau #define mt76_rmw_field(_dev, _reg, _field, _val) \ 75417f1de56SFelix Fietkau mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 75517f1de56SFelix Fietkau 75646436b5eSStanislaw Gruszka #define __mt76_rmw_field(_dev, _reg, _field, _val) \ 75746436b5eSStanislaw Gruszka __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 75846436b5eSStanislaw Gruszka 759ac24dd35SFelix Fietkau #define mt76_hw(dev) (dev)->mphy.hw 76017f1de56SFelix Fietkau 761426e8e41SFelix Fietkau static inline struct ieee80211_hw * 76249e649c3SRyder Lee mt76_wcid_hw(struct mt76_dev *dev, u16 wcid) 763426e8e41SFelix Fietkau { 764426e8e41SFelix Fietkau if (wcid <= MT76_N_WCIDS && 765426e8e41SFelix Fietkau mt76_wcid_mask_test(dev->wcid_phy_mask, wcid)) 766426e8e41SFelix Fietkau return dev->phy2->hw; 767426e8e41SFelix Fietkau 768426e8e41SFelix Fietkau return dev->phy.hw; 769426e8e41SFelix Fietkau } 770426e8e41SFelix Fietkau 77117f1de56SFelix Fietkau bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 77217f1de56SFelix Fietkau int timeout); 77317f1de56SFelix Fietkau 77417f1de56SFelix Fietkau #define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 77517f1de56SFelix Fietkau 77617f1de56SFelix Fietkau bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 77717f1de56SFelix Fietkau int timeout); 77817f1de56SFelix Fietkau 77917f1de56SFelix Fietkau #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 78017f1de56SFelix Fietkau 78117f1de56SFelix Fietkau void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 782f37f0550SLorenzo Bianconi void mt76_pci_disable_aspm(struct pci_dev *pdev); 78317f1de56SFelix Fietkau 78417f1de56SFelix Fietkau static inline u16 mt76_chip(struct mt76_dev *dev) 78517f1de56SFelix Fietkau { 78617f1de56SFelix Fietkau return dev->rev >> 16; 78717f1de56SFelix Fietkau } 78817f1de56SFelix Fietkau 78917f1de56SFelix Fietkau static inline u16 mt76_rev(struct mt76_dev *dev) 79017f1de56SFelix Fietkau { 79117f1de56SFelix Fietkau return dev->rev & 0xffff; 79217f1de56SFelix Fietkau } 79317f1de56SFelix Fietkau 79417f1de56SFelix Fietkau #define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 79517f1de56SFelix Fietkau #define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 79617f1de56SFelix Fietkau 797a23fde09SLorenzo Bianconi #define mt76_init_queues(dev) (dev)->mt76.queue_ops->init(&((dev)->mt76)) 798a23fde09SLorenzo Bianconi #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 7995ed31128SLorenzo Bianconi #define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__) 800eb9ca7ecSLorenzo Bianconi #define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__) 80117f1de56SFelix Fietkau #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 80217f1de56SFelix Fietkau #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 803c001df97SLorenzo Bianconi #define mt76_queue_rx_cleanup(dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__) 80417f1de56SFelix Fietkau #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 8053990465dSLorenzo Bianconi #define mt76_queue_reset(dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__) 80617f1de56SFelix Fietkau 807f473b42aSFelix Fietkau #define mt76_for_each_q_rx(dev, i) \ 808f473b42aSFelix Fietkau for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ 809f473b42aSFelix Fietkau (dev)->q_rx[i].ndesc; i++) 810f473b42aSFelix Fietkau 811c0f7b25aSLorenzo Bianconi struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, 812c0f7b25aSLorenzo Bianconi const struct ieee80211_ops *ops, 813c0f7b25aSLorenzo Bianconi const struct mt76_driver_ops *drv_ops); 81417f1de56SFelix Fietkau int mt76_register_device(struct mt76_dev *dev, bool vht, 81517f1de56SFelix Fietkau struct ieee80211_rate *rates, int n_rates); 81617f1de56SFelix Fietkau void mt76_unregister_device(struct mt76_dev *dev); 817def34a2fSLorenzo Bianconi void mt76_free_device(struct mt76_dev *dev); 818c89d3625SFelix Fietkau void mt76_unregister_phy(struct mt76_phy *phy); 819c89d3625SFelix Fietkau 820c89d3625SFelix Fietkau struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, 821c89d3625SFelix Fietkau const struct ieee80211_ops *ops); 822db78a791SLorenzo Bianconi int mt76_register_phy(struct mt76_phy *phy, bool vht, 823db78a791SLorenzo Bianconi struct ieee80211_rate *rates, int n_rates); 82417f1de56SFelix Fietkau 82517f1de56SFelix Fietkau struct dentry *mt76_register_debugfs(struct mt76_dev *dev); 8260b82a8e8SLorenzo Bianconi int mt76_queues_read(struct seq_file *s, void *data); 8278f410a8bSLorenzo Bianconi void mt76_seq_puts_array(struct seq_file *file, const char *str, 8288f410a8bSLorenzo Bianconi s8 *val, int len); 82917f1de56SFelix Fietkau 83017f1de56SFelix Fietkau int mt76_eeprom_init(struct mt76_dev *dev, int len); 83198df2baeSLorenzo Bianconi void mt76_eeprom_override(struct mt76_phy *phy); 83217f1de56SFelix Fietkau 833b1cb42adSLorenzo Bianconi struct mt76_queue * 834b1cb42adSLorenzo Bianconi mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc, 835b1cb42adSLorenzo Bianconi int ring_base); 836b1cb42adSLorenzo Bianconi static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx, 837b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 838b1cb42adSLorenzo Bianconi { 839b1cb42adSLorenzo Bianconi struct mt76_queue *q; 840b1cb42adSLorenzo Bianconi 841b1cb42adSLorenzo Bianconi q = mt76_init_queue(phy->dev, qid, idx, n_desc, ring_base); 842b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 843b1cb42adSLorenzo Bianconi return PTR_ERR(q); 844b1cb42adSLorenzo Bianconi 845b1cb42adSLorenzo Bianconi q->qid = qid; 84691990519SLorenzo Bianconi phy->q_tx[qid] = q; 847b1cb42adSLorenzo Bianconi 848b1cb42adSLorenzo Bianconi return 0; 849b1cb42adSLorenzo Bianconi } 850b1cb42adSLorenzo Bianconi 851b1cb42adSLorenzo Bianconi static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx, 852b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 853b1cb42adSLorenzo Bianconi { 854b1cb42adSLorenzo Bianconi struct mt76_queue *q; 855b1cb42adSLorenzo Bianconi 856b1cb42adSLorenzo Bianconi q = mt76_init_queue(dev, qid, idx, n_desc, ring_base); 857b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 858b1cb42adSLorenzo Bianconi return PTR_ERR(q); 859b1cb42adSLorenzo Bianconi 860e637763bSLorenzo Bianconi q->qid = __MT_TXQ_MAX + qid; 861b1cb42adSLorenzo Bianconi dev->q_mcu[qid] = q; 862b1cb42adSLorenzo Bianconi 863b1cb42adSLorenzo Bianconi return 0; 864b1cb42adSLorenzo Bianconi } 865b671da33SLorenzo Bianconi 866011849e0SFelix Fietkau static inline struct mt76_phy * 867011849e0SFelix Fietkau mt76_dev_phy(struct mt76_dev *dev, bool phy_ext) 868011849e0SFelix Fietkau { 869011849e0SFelix Fietkau if (phy_ext && dev->phy2) 870011849e0SFelix Fietkau return dev->phy2; 871011849e0SFelix Fietkau return &dev->phy; 872011849e0SFelix Fietkau } 873011849e0SFelix Fietkau 874bfc394ddSFelix Fietkau static inline struct ieee80211_hw * 875bfc394ddSFelix Fietkau mt76_phy_hw(struct mt76_dev *dev, bool phy_ext) 876bfc394ddSFelix Fietkau { 877011849e0SFelix Fietkau return mt76_dev_phy(dev, phy_ext)->hw; 878bfc394ddSFelix Fietkau } 879bfc394ddSFelix Fietkau 880f3950a41SLorenzo Bianconi static inline u8 * 881f3950a41SLorenzo Bianconi mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t) 882f3950a41SLorenzo Bianconi { 883f3950a41SLorenzo Bianconi return (u8 *)t - dev->drv->txwi_size; 884f3950a41SLorenzo Bianconi } 885f3950a41SLorenzo Bianconi 886ee8aa945SLorenzo Bianconi /* increment with wrap-around */ 887ee8aa945SLorenzo Bianconi static inline int mt76_incr(int val, int size) 888ee8aa945SLorenzo Bianconi { 889ee8aa945SLorenzo Bianconi return (val + 1) & (size - 1); 890ee8aa945SLorenzo Bianconi } 891ee8aa945SLorenzo Bianconi 892ee8aa945SLorenzo Bianconi /* decrement with wrap-around */ 893ee8aa945SLorenzo Bianconi static inline int mt76_decr(int val, int size) 894ee8aa945SLorenzo Bianconi { 895ee8aa945SLorenzo Bianconi return (val - 1) & (size - 1); 896ee8aa945SLorenzo Bianconi } 897ee8aa945SLorenzo Bianconi 8981d0496c6SStanislaw Gruszka u8 mt76_ac_to_hwq(u8 ac); 899b40b15e1SLorenzo Bianconi 90017f1de56SFelix Fietkau static inline struct ieee80211_txq * 90117f1de56SFelix Fietkau mtxq_to_txq(struct mt76_txq *mtxq) 90217f1de56SFelix Fietkau { 90317f1de56SFelix Fietkau void *ptr = mtxq; 90417f1de56SFelix Fietkau 90517f1de56SFelix Fietkau return container_of(ptr, struct ieee80211_txq, drv_priv); 90617f1de56SFelix Fietkau } 90717f1de56SFelix Fietkau 9089c68a57bSFelix Fietkau static inline struct ieee80211_sta * 9099c68a57bSFelix Fietkau wcid_to_sta(struct mt76_wcid *wcid) 9109c68a57bSFelix Fietkau { 9119c68a57bSFelix Fietkau void *ptr = wcid; 9129c68a57bSFelix Fietkau 9139c68a57bSFelix Fietkau if (!wcid || !wcid->sta) 9149c68a57bSFelix Fietkau return NULL; 9159c68a57bSFelix Fietkau 9169c68a57bSFelix Fietkau return container_of(ptr, struct ieee80211_sta, drv_priv); 9179c68a57bSFelix Fietkau } 9189c68a57bSFelix Fietkau 91988046b2cSFelix Fietkau static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb) 92088046b2cSFelix Fietkau { 92188046b2cSFelix Fietkau BUILD_BUG_ON(sizeof(struct mt76_tx_cb) > 92288046b2cSFelix Fietkau sizeof(IEEE80211_SKB_CB(skb)->status.status_driver_data)); 92388046b2cSFelix Fietkau return ((void *)IEEE80211_SKB_CB(skb)->status.status_driver_data); 92488046b2cSFelix Fietkau } 92588046b2cSFelix Fietkau 92677ae1d5eSRyder Lee static inline void *mt76_skb_get_hdr(struct sk_buff *skb) 92777ae1d5eSRyder Lee { 92877ae1d5eSRyder Lee struct mt76_rx_status mstat; 92977ae1d5eSRyder Lee u8 *data = skb->data; 93077ae1d5eSRyder Lee 93177ae1d5eSRyder Lee /* Alignment concerns */ 93277ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4); 93377ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4); 93477ae1d5eSRyder Lee 93577ae1d5eSRyder Lee mstat = *((struct mt76_rx_status *)skb->cb); 93677ae1d5eSRyder Lee 93777ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE) 93877ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he); 93977ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE_MU) 94077ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he_mu); 94177ae1d5eSRyder Lee 94277ae1d5eSRyder Lee return data; 94377ae1d5eSRyder Lee } 94477ae1d5eSRyder Lee 9453bb45b5fSLorenzo Bianconi static inline void mt76_insert_hdr_pad(struct sk_buff *skb) 9463bb45b5fSLorenzo Bianconi { 9473bb45b5fSLorenzo Bianconi int len = ieee80211_get_hdrlen_from_skb(skb); 9483bb45b5fSLorenzo Bianconi 9493bb45b5fSLorenzo Bianconi if (len % 4 == 0) 9503bb45b5fSLorenzo Bianconi return; 9513bb45b5fSLorenzo Bianconi 9523bb45b5fSLorenzo Bianconi skb_push(skb, 2); 9533bb45b5fSLorenzo Bianconi memmove(skb->data, skb->data + 2, len); 9543bb45b5fSLorenzo Bianconi 9553bb45b5fSLorenzo Bianconi skb->data[len] = 0; 9563bb45b5fSLorenzo Bianconi skb->data[len + 1] = 0; 9573bb45b5fSLorenzo Bianconi } 9583bb45b5fSLorenzo Bianconi 9598548c6ebSFelix Fietkau static inline bool mt76_is_skb_pktid(u8 pktid) 9608548c6ebSFelix Fietkau { 9618548c6ebSFelix Fietkau if (pktid & MT_PACKET_ID_HAS_RATE) 9628548c6ebSFelix Fietkau return false; 9638548c6ebSFelix Fietkau 9648548c6ebSFelix Fietkau return pktid >= MT_PACKET_ID_FIRST; 9658548c6ebSFelix Fietkau } 9668548c6ebSFelix Fietkau 96707cda406SFelix Fietkau static inline u8 mt76_tx_power_nss_delta(u8 nss) 96807cda406SFelix Fietkau { 96907cda406SFelix Fietkau static const u8 nss_delta[4] = { 0, 6, 9, 12 }; 97007cda406SFelix Fietkau 97107cda406SFelix Fietkau return nss_delta[nss - 1]; 97207cda406SFelix Fietkau } 97307cda406SFelix Fietkau 974c918c74dSShayne Chen static inline bool mt76_testmode_enabled(struct mt76_phy *phy) 975f0efa862SFelix Fietkau { 976f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 977c918c74dSShayne Chen return phy->test.state != MT76_TM_STATE_OFF; 978c918c74dSShayne Chen #else 979c918c74dSShayne Chen return false; 980c918c74dSShayne Chen #endif 981c918c74dSShayne Chen } 982c918c74dSShayne Chen 983c918c74dSShayne Chen static inline bool mt76_is_testmode_skb(struct mt76_dev *dev, 984c918c74dSShayne Chen struct sk_buff *skb, 985c918c74dSShayne Chen struct ieee80211_hw **hw) 986c918c74dSShayne Chen { 987c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 988c918c74dSShayne Chen if (skb == dev->phy.test.tx_skb) 989c918c74dSShayne Chen *hw = dev->phy.hw; 990c918c74dSShayne Chen else if (dev->phy2 && skb == dev->phy2->test.tx_skb) 991c918c74dSShayne Chen *hw = dev->phy2->hw; 992c918c74dSShayne Chen else 993c918c74dSShayne Chen return false; 994c918c74dSShayne Chen return true; 995f0efa862SFelix Fietkau #else 996f0efa862SFelix Fietkau return false; 997f0efa862SFelix Fietkau #endif 998f0efa862SFelix Fietkau } 999f0efa862SFelix Fietkau 100017f1de56SFelix Fietkau void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 10019fba6d07SFelix Fietkau void mt76_tx(struct mt76_phy *dev, struct ieee80211_sta *sta, 100217f1de56SFelix Fietkau struct mt76_wcid *wcid, struct sk_buff *skb); 100317f1de56SFelix Fietkau void mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 100491990519SLorenzo Bianconi void mt76_stop_tx_queues(struct mt76_phy *phy, struct ieee80211_sta *sta, 100517f1de56SFelix Fietkau bool send_bar); 1006c50d105aSFelix Fietkau void mt76_tx_check_agg_ssn(struct ieee80211_sta *sta, struct sk_buff *skb); 10079fba6d07SFelix Fietkau void mt76_txq_schedule(struct mt76_phy *phy, enum mt76_txq_id qid); 10089fba6d07SFelix Fietkau void mt76_txq_schedule_all(struct mt76_phy *phy); 1009781eef5bSFelix Fietkau void mt76_tx_worker(struct mt76_worker *w); 101017f1de56SFelix Fietkau void mt76_release_buffered_frames(struct ieee80211_hw *hw, 101117f1de56SFelix Fietkau struct ieee80211_sta *sta, 101217f1de56SFelix Fietkau u16 tids, int nframes, 101317f1de56SFelix Fietkau enum ieee80211_frame_release_type reason, 101417f1de56SFelix Fietkau bool more_data); 10155a95ca41SFelix Fietkau bool mt76_has_tx_pending(struct mt76_phy *phy); 101696747a51SFelix Fietkau void mt76_set_channel(struct mt76_phy *phy); 10175ce09c1aSFelix Fietkau void mt76_update_survey(struct mt76_dev *dev); 101804414240SLorenzo Bianconi void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time); 101917f1de56SFelix Fietkau int mt76_get_survey(struct ieee80211_hw *hw, int idx, 102017f1de56SFelix Fietkau struct survey_info *survey); 1021bb3e3fecSRyder Lee void mt76_set_stream_caps(struct mt76_phy *phy, bool vht); 102217f1de56SFelix Fietkau 1023aee5b8cfSFelix Fietkau int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 10247c4f744dSRyder Lee u16 ssn, u16 size); 1025aee5b8cfSFelix Fietkau void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 1026aee5b8cfSFelix Fietkau 102730ce7f44SFelix Fietkau void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 102830ce7f44SFelix Fietkau struct ieee80211_key_conf *key); 102979d1c94cSFelix Fietkau 103079d1c94cSFelix Fietkau void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 103179d1c94cSFelix Fietkau __acquires(&dev->status_list.lock); 103279d1c94cSFelix Fietkau void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 103379d1c94cSFelix Fietkau __releases(&dev->status_list.lock); 103479d1c94cSFelix Fietkau 103588046b2cSFelix Fietkau int mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 103688046b2cSFelix Fietkau struct sk_buff *skb); 103788046b2cSFelix Fietkau struct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev, 103879d1c94cSFelix Fietkau struct mt76_wcid *wcid, int pktid, 103979d1c94cSFelix Fietkau struct sk_buff_head *list); 104079d1c94cSFelix Fietkau void mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, 104179d1c94cSFelix Fietkau struct sk_buff_head *list); 1042e1378e52SFelix Fietkau void mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb); 104379d1c94cSFelix Fietkau void mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, 104479d1c94cSFelix Fietkau bool flush); 1045e28487eaSFelix Fietkau int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1046e28487eaSFelix Fietkau struct ieee80211_sta *sta, 1047e28487eaSFelix Fietkau enum ieee80211_sta_state old_state, 1048e28487eaSFelix Fietkau enum ieee80211_sta_state new_state); 104913f61dfcSLorenzo Bianconi void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 105013f61dfcSLorenzo Bianconi struct ieee80211_sta *sta); 105143ba1922SFelix Fietkau void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 105243ba1922SFelix Fietkau struct ieee80211_sta *sta); 105330ce7f44SFelix Fietkau 10548af63fedSFelix Fietkau int mt76_get_min_avg_rssi(struct mt76_dev *dev, bool ext_phy); 1055ef13edc0SFelix Fietkau 10569313faacSFelix Fietkau int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 10579313faacSFelix Fietkau int *dbm); 10589313faacSFelix Fietkau 1059e7173858SFelix Fietkau void mt76_csa_check(struct mt76_dev *dev); 1060e7173858SFelix Fietkau void mt76_csa_finish(struct mt76_dev *dev); 1061e7173858SFelix Fietkau 1062e49c76d4SLorenzo Bianconi int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); 106387d53103SStanislaw Gruszka int mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set); 1064eadfd98fSLorenzo Bianconi void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id); 1065d2679d65SLorenzo Bianconi int mt76_get_rate(struct mt76_dev *dev, 1066d2679d65SLorenzo Bianconi struct ieee80211_supported_band *sband, 1067d2679d65SLorenzo Bianconi int idx, bool cck); 10688b8ab5c2SLorenzo Bianconi void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 10698b8ab5c2SLorenzo Bianconi const u8 *mac); 10708b8ab5c2SLorenzo Bianconi void mt76_sw_scan_complete(struct ieee80211_hw *hw, 10718b8ab5c2SLorenzo Bianconi struct ieee80211_vif *vif); 1072f0efa862SFelix Fietkau int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1073f0efa862SFelix Fietkau void *data, int len); 1074f0efa862SFelix Fietkau int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, 1075f0efa862SFelix Fietkau struct netlink_callback *cb, void *data, int len); 1076c918c74dSShayne Chen int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state); 1077f0efa862SFelix Fietkau 1078c918c74dSShayne Chen static inline void mt76_testmode_reset(struct mt76_phy *phy, bool disable) 1079f0efa862SFelix Fietkau { 1080f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 1081f0efa862SFelix Fietkau enum mt76_testmode_state state = MT76_TM_STATE_IDLE; 1082f0efa862SFelix Fietkau 1083c918c74dSShayne Chen if (disable || phy->test.state == MT76_TM_STATE_OFF) 1084f0efa862SFelix Fietkau state = MT76_TM_STATE_OFF; 1085f0efa862SFelix Fietkau 1086c918c74dSShayne Chen mt76_testmode_set_state(phy, state); 1087f0efa862SFelix Fietkau #endif 1088f0efa862SFelix Fietkau } 1089f0efa862SFelix Fietkau 109087d53103SStanislaw Gruszka 109117f1de56SFelix Fietkau /* internal */ 1092e394b575SFelix Fietkau static inline struct ieee80211_hw * 1093e394b575SFelix Fietkau mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) 1094e394b575SFelix Fietkau { 1095e394b575SFelix Fietkau struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1096e394b575SFelix Fietkau struct ieee80211_hw *hw = dev->phy.hw; 1097e394b575SFelix Fietkau 1098e394b575SFelix Fietkau if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) 1099e394b575SFelix Fietkau hw = dev->phy2->hw; 1100e394b575SFelix Fietkau 1101e394b575SFelix Fietkau info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY; 1102e394b575SFelix Fietkau 1103e394b575SFelix Fietkau return hw; 1104e394b575SFelix Fietkau } 1105e394b575SFelix Fietkau 110617f1de56SFelix Fietkau void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 11079d9d738bSFelix Fietkau void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 110881e850efSLorenzo Bianconi struct napi_struct *napi); 110981e850efSLorenzo Bianconi void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 111081e850efSLorenzo Bianconi struct napi_struct *napi); 1111aee5b8cfSFelix Fietkau void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 1112c918c74dSShayne Chen void mt76_testmode_tx_pending(struct mt76_phy *phy); 1113fe5b5ab5SFelix Fietkau void mt76_queue_tx_complete(struct mt76_dev *dev, struct mt76_queue *q, 1114fe5b5ab5SFelix Fietkau struct mt76_queue_entry *e); 111517f1de56SFelix Fietkau 1116b40b15e1SLorenzo Bianconi /* usb */ 1117b40b15e1SLorenzo Bianconi static inline bool mt76u_urb_error(struct urb *urb) 1118b40b15e1SLorenzo Bianconi { 1119b40b15e1SLorenzo Bianconi return urb->status && 1120b40b15e1SLorenzo Bianconi urb->status != -ECONNRESET && 1121b40b15e1SLorenzo Bianconi urb->status != -ESHUTDOWN && 1122b40b15e1SLorenzo Bianconi urb->status != -ENOENT; 1123b40b15e1SLorenzo Bianconi } 1124b40b15e1SLorenzo Bianconi 1125b40b15e1SLorenzo Bianconi /* Map hardware queues to usb endpoints */ 1126b40b15e1SLorenzo Bianconi static inline u8 q2ep(u8 qid) 1127b40b15e1SLorenzo Bianconi { 1128b40b15e1SLorenzo Bianconi /* TODO: take management packets to queue 5 */ 1129b40b15e1SLorenzo Bianconi return qid + 1; 1130b40b15e1SLorenzo Bianconi } 1131b40b15e1SLorenzo Bianconi 11325de4db8fSStanislaw Gruszka static inline int 1133b63aa031SStanislaw Gruszka mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, 11343bcd979cSLorenzo Bianconi int timeout, int ep) 11355de4db8fSStanislaw Gruszka { 113680df01f4SLorenzo Bianconi struct usb_interface *uintf = to_usb_interface(dev->dev); 113780df01f4SLorenzo Bianconi struct usb_device *udev = interface_to_usbdev(uintf); 11385de4db8fSStanislaw Gruszka struct mt76_usb *usb = &dev->usb; 11395de4db8fSStanislaw Gruszka unsigned int pipe; 11405de4db8fSStanislaw Gruszka 1141b63aa031SStanislaw Gruszka if (actual_len) 11423bcd979cSLorenzo Bianconi pipe = usb_rcvbulkpipe(udev, usb->in_ep[ep]); 1143b63aa031SStanislaw Gruszka else 11443bcd979cSLorenzo Bianconi pipe = usb_sndbulkpipe(udev, usb->out_ep[ep]); 1145b63aa031SStanislaw Gruszka 1146b63aa031SStanislaw Gruszka return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 11475de4db8fSStanislaw Gruszka } 11485de4db8fSStanislaw Gruszka 1149e98e6df6SLorenzo Bianconi int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 1150b40b15e1SLorenzo Bianconi int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 1151b40b15e1SLorenzo Bianconi u8 req_type, u16 val, u16 offset, 1152b40b15e1SLorenzo Bianconi void *buf, size_t len); 1153b40b15e1SLorenzo Bianconi void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 1154b40b15e1SLorenzo Bianconi const u16 offset, const u32 val); 11551e816c65SLorenzo Bianconi int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 11561e816c65SLorenzo Bianconi bool ext); 115794e1cfa8SLorenzo Bianconi int mt76u_alloc_mcu_queue(struct mt76_dev *dev); 1158b40b15e1SLorenzo Bianconi int mt76u_alloc_queues(struct mt76_dev *dev); 115939d501d9SStanislaw Gruszka void mt76u_stop_tx(struct mt76_dev *dev); 116039d501d9SStanislaw Gruszka void mt76u_stop_rx(struct mt76_dev *dev); 116139d501d9SStanislaw Gruszka int mt76u_resume_rx(struct mt76_dev *dev); 1162b40b15e1SLorenzo Bianconi void mt76u_queues_deinit(struct mt76_dev *dev); 1163b40b15e1SLorenzo Bianconi 1164d39b52e3SSean Wang int mt76s_init(struct mt76_dev *dev, struct sdio_func *func, 1165d39b52e3SSean Wang const struct mt76_bus_ops *bus_ops); 1166d39b52e3SSean Wang int mt76s_alloc_queues(struct mt76_dev *dev); 1167d39b52e3SSean Wang void mt76s_deinit(struct mt76_dev *dev); 1168d39b52e3SSean Wang 11699df0fab9SLorenzo Bianconi struct sk_buff * 1170bb31a80eSLorenzo Bianconi mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data, 1171bb31a80eSLorenzo Bianconi int data_len); 1172c07a49d4SLorenzo Bianconi void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb); 1173680abb25SLorenzo Bianconi struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 1174680abb25SLorenzo Bianconi unsigned long expires); 1175ae5ad627SFelix Fietkau int mt76_mcu_send_and_get_msg(struct mt76_dev *dev, int cmd, const void *data, 1176ae5ad627SFelix Fietkau int len, bool wait_resp, struct sk_buff **ret); 1177ae5ad627SFelix Fietkau int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb, 1178ae5ad627SFelix Fietkau int cmd, bool wait_resp, struct sk_buff **ret); 11793cb43b66SLorenzo Bianconi int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 11803cb43b66SLorenzo Bianconi int len); 1181ae5ad627SFelix Fietkau static inline int 1182ae5ad627SFelix Fietkau mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data, int len, 1183ae5ad627SFelix Fietkau bool wait_resp) 1184ae5ad627SFelix Fietkau { 1185ae5ad627SFelix Fietkau return mt76_mcu_send_and_get_msg(dev, cmd, data, len, wait_resp, NULL); 1186ae5ad627SFelix Fietkau } 1187ae5ad627SFelix Fietkau 1188ae5ad627SFelix Fietkau static inline int 1189ae5ad627SFelix Fietkau mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb, int cmd, 1190ae5ad627SFelix Fietkau bool wait_resp) 1191ae5ad627SFelix Fietkau { 1192ae5ad627SFelix Fietkau return mt76_mcu_skb_send_and_get_msg(dev, skb, cmd, wait_resp, NULL); 1193ae5ad627SFelix Fietkau } 11949df0fab9SLorenzo Bianconi 11959220f695SLorenzo Bianconi void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set); 11969220f695SLorenzo Bianconi 119717f1de56SFelix Fietkau #endif 1198