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); 169db0f04f3SLorenzo Bianconi }; 170db0f04f3SLorenzo Bianconi 17117f1de56SFelix Fietkau struct mt76_queue_ops { 17217f1de56SFelix Fietkau int (*init)(struct mt76_dev *dev); 17317f1de56SFelix Fietkau 174b1bfbe70SLorenzo Bianconi int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q, 175b1bfbe70SLorenzo Bianconi int idx, int n_desc, int bufsize, 176b1bfbe70SLorenzo Bianconi u32 ring_base); 17717f1de56SFelix Fietkau 17889870594SLorenzo Bianconi int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q, 179469d4818SLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid, 180469d4818SLorenzo Bianconi struct ieee80211_sta *sta); 181469d4818SLorenzo Bianconi 182d95093a1SLorenzo Bianconi int (*tx_queue_skb_raw)(struct mt76_dev *dev, struct mt76_queue *q, 1835ed31128SLorenzo Bianconi struct sk_buff *skb, u32 tx_info); 1845ed31128SLorenzo Bianconi 18517f1de56SFelix Fietkau void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 18617f1de56SFelix Fietkau int *len, u32 *info, bool *more); 18717f1de56SFelix Fietkau 18817f1de56SFelix Fietkau void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 18917f1de56SFelix Fietkau 190e5655492SLorenzo Bianconi void (*tx_cleanup)(struct mt76_dev *dev, struct mt76_queue *q, 19117f1de56SFelix Fietkau bool flush); 19217f1de56SFelix Fietkau 19317f1de56SFelix Fietkau void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 19417f1de56SFelix Fietkau }; 19517f1de56SFelix Fietkau 196d71ef286SFelix Fietkau enum mt76_wcid_flags { 197d71ef286SFelix Fietkau MT_WCID_FLAG_CHECK_PS, 198d71ef286SFelix Fietkau MT_WCID_FLAG_PS, 199e151d71eSFelix Fietkau MT_WCID_FLAG_4ADDR, 200d71ef286SFelix Fietkau }; 201d71ef286SFelix Fietkau 20249e649c3SRyder Lee #define MT76_N_WCIDS 288 20336404c06SStanislaw Gruszka 204e394b575SFelix Fietkau /* stored in ieee80211_tx_info::hw_queue */ 205e394b575SFelix Fietkau #define MT_TX_HW_QUEUE_EXT_PHY BIT(3) 206e394b575SFelix Fietkau 207ef13edc0SFelix Fietkau DECLARE_EWMA(signal, 10, 8); 208ef13edc0SFelix Fietkau 209db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_RATE GENMASK(15, 0) 210db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_NSS GENMASK(17, 16) 211db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_TXPWR_ADJ GENMASK(25, 18) 212db9f11d3SFelix Fietkau #define MT_WCID_TX_INFO_SET BIT(31) 213db9f11d3SFelix Fietkau 21417f1de56SFelix Fietkau struct mt76_wcid { 215aee5b8cfSFelix Fietkau struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 216aee5b8cfSFelix Fietkau 217e1378e52SFelix Fietkau atomic_t non_aql_packets; 218d71ef286SFelix Fietkau unsigned long flags; 219d71ef286SFelix Fietkau 220ef13edc0SFelix Fietkau struct ewma_signal rssi; 221ef13edc0SFelix Fietkau int inactive_count; 222ef13edc0SFelix Fietkau 22349e649c3SRyder Lee u16 idx; 22417f1de56SFelix Fietkau u8 hw_key_idx; 22517f1de56SFelix Fietkau 2269c68a57bSFelix Fietkau u8 sta:1; 227c7d2d631SFelix Fietkau u8 ext_phy:1; 228b443e55fSRyder Lee u8 amsdu:1; 2299c68a57bSFelix Fietkau 23030ce7f44SFelix Fietkau u8 rx_check_pn; 23130ce7f44SFelix Fietkau u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 23201cfc1b4SLorenzo Bianconi u16 cipher; 23330ce7f44SFelix Fietkau 234db9f11d3SFelix Fietkau u32 tx_info; 23523405236SFelix Fietkau bool sw_iv; 23688046b2cSFelix Fietkau 23788046b2cSFelix Fietkau u8 packet_id; 23817f1de56SFelix Fietkau }; 23917f1de56SFelix Fietkau 24017f1de56SFelix Fietkau struct mt76_txq { 24117f1de56SFelix Fietkau struct mt76_wcid *wcid; 24217f1de56SFelix Fietkau 24317f1de56SFelix Fietkau u16 agg_ssn; 24417f1de56SFelix Fietkau bool send_bar; 24517f1de56SFelix Fietkau bool aggr; 24617f1de56SFelix Fietkau }; 24717f1de56SFelix Fietkau 24817f1de56SFelix Fietkau struct mt76_txwi_cache { 24917f1de56SFelix Fietkau struct list_head list; 250f3950a41SLorenzo Bianconi dma_addr_t dma_addr; 2516ca66722SLorenzo Bianconi 2526ca66722SLorenzo Bianconi struct sk_buff *skb; 25317f1de56SFelix Fietkau }; 25417f1de56SFelix Fietkau 255aee5b8cfSFelix Fietkau struct mt76_rx_tid { 256aee5b8cfSFelix Fietkau struct rcu_head rcu_head; 257aee5b8cfSFelix Fietkau 258aee5b8cfSFelix Fietkau struct mt76_dev *dev; 259aee5b8cfSFelix Fietkau 260aee5b8cfSFelix Fietkau spinlock_t lock; 261aee5b8cfSFelix Fietkau struct delayed_work reorder_work; 262aee5b8cfSFelix Fietkau 263aee5b8cfSFelix Fietkau u16 head; 2647c4f744dSRyder Lee u16 size; 2657c4f744dSRyder Lee u16 nframes; 266aee5b8cfSFelix Fietkau 267e7ec563eSMarkus Theil u8 num; 268e7ec563eSMarkus Theil 269aee5b8cfSFelix Fietkau u8 started:1, stopped:1, timer_pending:1; 270aee5b8cfSFelix Fietkau 271aee5b8cfSFelix Fietkau struct sk_buff *reorder_buf[]; 272aee5b8cfSFelix Fietkau }; 273aee5b8cfSFelix Fietkau 27488046b2cSFelix Fietkau #define MT_TX_CB_DMA_DONE BIT(0) 27588046b2cSFelix Fietkau #define MT_TX_CB_TXS_DONE BIT(1) 27688046b2cSFelix Fietkau #define MT_TX_CB_TXS_FAILED BIT(2) 27788046b2cSFelix Fietkau 2788548c6ebSFelix Fietkau #define MT_PACKET_ID_MASK GENMASK(6, 0) 279013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_ACK 0 280013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_SKB 1 281013b2dffSFelix Fietkau #define MT_PACKET_ID_FIRST 2 2828548c6ebSFelix Fietkau #define MT_PACKET_ID_HAS_RATE BIT(7) 28388046b2cSFelix Fietkau 28488046b2cSFelix Fietkau #define MT_TX_STATUS_SKB_TIMEOUT HZ 28588046b2cSFelix Fietkau 28688046b2cSFelix Fietkau struct mt76_tx_cb { 28788046b2cSFelix Fietkau unsigned long jiffies; 28849e649c3SRyder Lee u16 wcid; 28988046b2cSFelix Fietkau u8 pktid; 29088046b2cSFelix Fietkau u8 flags; 29188046b2cSFelix Fietkau }; 29288046b2cSFelix Fietkau 29317f1de56SFelix Fietkau enum { 29417f1de56SFelix Fietkau MT76_STATE_INITIALIZED, 29517f1de56SFelix Fietkau MT76_STATE_RUNNING, 29687e022deSStanislaw Gruszka MT76_STATE_MCU_RUNNING, 29717f1de56SFelix Fietkau MT76_SCANNING, 298fcdfc29eSLorenzo Bianconi MT76_HW_SCANNING, 29920305f98SLorenzo Bianconi MT76_HW_SCHED_SCANNING, 300fd6c2dfaSFelix Fietkau MT76_RESTART, 30117f1de56SFelix Fietkau MT76_RESET, 30261c4fa72SFelix Fietkau MT76_MCU_RESET, 303b40b15e1SLorenzo Bianconi MT76_REMOVED, 304b40b15e1SLorenzo Bianconi MT76_READING_STATS, 305eb99cc95SLorenzo Bianconi MT76_STATE_POWER_OFF, 306c6bf2010SLorenzo Bianconi MT76_STATE_SUSPEND, 3077307f296SLorenzo Bianconi MT76_STATE_ROC, 30808523a2aSLorenzo Bianconi MT76_STATE_PM, 30917f1de56SFelix Fietkau }; 31017f1de56SFelix Fietkau 31117f1de56SFelix Fietkau struct mt76_hw_cap { 31217f1de56SFelix Fietkau bool has_2ghz; 31317f1de56SFelix Fietkau bool has_5ghz; 31417f1de56SFelix Fietkau }; 31517f1de56SFelix Fietkau 3169ec0b821SFelix Fietkau #define MT_DRV_TXWI_NO_FREE BIT(0) 3179ec0b821SFelix Fietkau #define MT_DRV_TX_ALIGNED4_SKBS BIT(1) 3185ce09c1aSFelix Fietkau #define MT_DRV_SW_RX_AIRTIME BIT(2) 31994d4d076SLorenzo Bianconi #define MT_DRV_RX_DMA_HDR BIT(3) 320d3c82998SLorenzo Bianconi #define MT_DRV_HW_MGMT_TXQ BIT(4) 321b443e55fSRyder Lee #define MT_DRV_AMSDU_OFFLOAD BIT(5) 3226ca66722SLorenzo Bianconi 32317f1de56SFelix Fietkau struct mt76_driver_ops { 3249ec0b821SFelix Fietkau u32 drv_flags; 325ea565833SFelix Fietkau u32 survey_flags; 32617f1de56SFelix Fietkau u16 txwi_size; 32717f1de56SFelix Fietkau 32817f1de56SFelix Fietkau void (*update_survey)(struct mt76_dev *dev); 32917f1de56SFelix Fietkau 33017f1de56SFelix Fietkau int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 331cfaae9e6SLorenzo Bianconi enum mt76_txq_id qid, struct mt76_wcid *wcid, 332b5903c47SLorenzo Bianconi struct ieee80211_sta *sta, 333b5903c47SLorenzo Bianconi struct mt76_tx_info *tx_info); 33417f1de56SFelix Fietkau 335d80e52c7SFelix Fietkau void (*tx_complete_skb)(struct mt76_dev *dev, 336e226ba2eSLorenzo Bianconi struct mt76_queue_entry *e); 33717f1de56SFelix Fietkau 338b40b15e1SLorenzo Bianconi bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 339b40b15e1SLorenzo Bianconi 34017f1de56SFelix Fietkau void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 34117f1de56SFelix Fietkau struct sk_buff *skb); 34217f1de56SFelix Fietkau 34317f1de56SFelix Fietkau void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 344d71ef286SFelix Fietkau 345d71ef286SFelix Fietkau void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 346d71ef286SFelix Fietkau bool ps); 347e28487eaSFelix Fietkau 348e28487eaSFelix Fietkau int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif, 349e28487eaSFelix Fietkau struct ieee80211_sta *sta); 350e28487eaSFelix Fietkau 3519c193de5SFelix Fietkau void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3529c193de5SFelix Fietkau struct ieee80211_sta *sta); 3539c193de5SFelix Fietkau 354e28487eaSFelix Fietkau void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, 355e28487eaSFelix Fietkau struct ieee80211_sta *sta); 35617f1de56SFelix Fietkau }; 35717f1de56SFelix Fietkau 35817f1de56SFelix Fietkau struct mt76_channel_state { 35917f1de56SFelix Fietkau u64 cc_active; 36017f1de56SFelix Fietkau u64 cc_busy; 3616bfa6e38SLorenzo Bianconi u64 cc_rx; 3625ce09c1aSFelix Fietkau u64 cc_bss_rx; 363ea565833SFelix Fietkau u64 cc_tx; 364e5051965SFelix Fietkau 365e5051965SFelix Fietkau s8 noise; 36617f1de56SFelix Fietkau }; 36717f1de56SFelix Fietkau 36817f1de56SFelix Fietkau struct mt76_sband { 36917f1de56SFelix Fietkau struct ieee80211_supported_band sband; 37017f1de56SFelix Fietkau struct mt76_channel_state *chan; 37117f1de56SFelix Fietkau }; 37217f1de56SFelix Fietkau 373b6862effSLorenzo Bianconi struct mt76_rate_power { 374b6862effSLorenzo Bianconi union { 375b6862effSLorenzo Bianconi struct { 376b6862effSLorenzo Bianconi s8 cck[4]; 377b6862effSLorenzo Bianconi s8 ofdm[8]; 378b6862effSLorenzo Bianconi s8 stbc[10]; 379b6862effSLorenzo Bianconi s8 ht[16]; 380b6862effSLorenzo Bianconi s8 vht[10]; 381b6862effSLorenzo Bianconi }; 382b6862effSLorenzo Bianconi s8 all[48]; 383b6862effSLorenzo Bianconi }; 384b6862effSLorenzo Bianconi }; 385b6862effSLorenzo Bianconi 386b40b15e1SLorenzo Bianconi /* addr req mask */ 387b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_EEPROM BIT(31) 388b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_CFG BIT(30) 389b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 390b40b15e1SLorenzo Bianconi 391b40b15e1SLorenzo Bianconi #define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 392b40b15e1SLorenzo Bianconi enum mt_vendor_req { 393b40b15e1SLorenzo Bianconi MT_VEND_DEV_MODE = 0x1, 394b40b15e1SLorenzo Bianconi MT_VEND_WRITE = 0x2, 3951e816c65SLorenzo Bianconi MT_VEND_POWER_ON = 0x4, 396b40b15e1SLorenzo Bianconi MT_VEND_MULTI_WRITE = 0x6, 397b40b15e1SLorenzo Bianconi MT_VEND_MULTI_READ = 0x7, 398b40b15e1SLorenzo Bianconi MT_VEND_READ_EEPROM = 0x9, 399b40b15e1SLorenzo Bianconi MT_VEND_WRITE_FCE = 0x42, 400b40b15e1SLorenzo Bianconi MT_VEND_WRITE_CFG = 0x46, 401b40b15e1SLorenzo Bianconi MT_VEND_READ_CFG = 0x47, 4021e816c65SLorenzo Bianconi MT_VEND_READ_EXT = 0x63, 4031e816c65SLorenzo Bianconi MT_VEND_WRITE_EXT = 0x66, 404d0846f08SSean Wang MT_VEND_FEATURE_SET = 0x91, 405b40b15e1SLorenzo Bianconi }; 406b40b15e1SLorenzo Bianconi 407b40b15e1SLorenzo Bianconi enum mt76u_in_ep { 408b40b15e1SLorenzo Bianconi MT_EP_IN_PKT_RX, 409b40b15e1SLorenzo Bianconi MT_EP_IN_CMD_RESP, 410b40b15e1SLorenzo Bianconi __MT_EP_IN_MAX, 411b40b15e1SLorenzo Bianconi }; 412b40b15e1SLorenzo Bianconi 413b40b15e1SLorenzo Bianconi enum mt76u_out_ep { 414b40b15e1SLorenzo Bianconi MT_EP_OUT_INBAND_CMD, 415b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BE, 41623cb16d2SLorenzo Bianconi MT_EP_OUT_AC_BK, 417b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VI, 418b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VO, 419b40b15e1SLorenzo Bianconi MT_EP_OUT_HCCA, 420b40b15e1SLorenzo Bianconi __MT_EP_OUT_MAX, 421b40b15e1SLorenzo Bianconi }; 422b40b15e1SLorenzo Bianconi 42309872957SLorenzo Bianconi struct mt76_mcu { 42409872957SLorenzo Bianconi struct mutex mutex; 42509872957SLorenzo Bianconi u32 msg_seq; 426e452c6ebSFelix Fietkau int timeout; 42709872957SLorenzo Bianconi 42809872957SLorenzo Bianconi struct sk_buff_head res_q; 42909872957SLorenzo Bianconi wait_queue_head_t wait; 43009872957SLorenzo Bianconi }; 43109872957SLorenzo Bianconi 43214663f0cSLorenzo Bianconi #define MT_TX_SG_MAX_SIZE 8 433972c5981SSean Wang #define MT_RX_SG_MAX_SIZE 4 434b40b15e1SLorenzo Bianconi #define MT_NUM_TX_ENTRIES 256 435b40b15e1SLorenzo Bianconi #define MT_NUM_RX_ENTRIES 128 436b40b15e1SLorenzo Bianconi #define MCU_RESP_URB_SIZE 1024 437b40b15e1SLorenzo Bianconi struct mt76_usb { 438b40b15e1SLorenzo Bianconi struct mutex usb_ctrl_mtx; 439a6bfb6d1SStanislaw Gruszka u8 *data; 440a6bfb6d1SStanislaw Gruszka u16 data_len; 441b40b15e1SLorenzo Bianconi 4429daf27e6SLorenzo Bianconi struct mt76_worker status_worker; 443be83a7e2SLorenzo Bianconi struct mt76_worker rx_worker; 4449daf27e6SLorenzo Bianconi 445284efb47SLorenzo Bianconi struct work_struct stat_work; 446b40b15e1SLorenzo Bianconi 447b40b15e1SLorenzo Bianconi u8 out_ep[__MT_EP_OUT_MAX]; 448b40b15e1SLorenzo Bianconi u8 in_ep[__MT_EP_IN_MAX]; 44963a7de5dSLorenzo Bianconi bool sg_en; 450b40b15e1SLorenzo Bianconi 451b40b15e1SLorenzo Bianconi struct mt76u_mcu { 452a18a494fSStanislaw Gruszka u8 *data; 453851ab66eSLorenzo Bianconi /* multiple reads */ 454851ab66eSLorenzo Bianconi struct mt76_reg_pair *rp; 455851ab66eSLorenzo Bianconi int rp_len; 456851ab66eSLorenzo Bianconi u32 base; 457851ab66eSLorenzo Bianconi bool burst; 458b40b15e1SLorenzo Bianconi } mcu; 459b40b15e1SLorenzo Bianconi }; 460b40b15e1SLorenzo Bianconi 4611522ff73SLorenzo Bianconi #define MT76S_XMIT_BUF_SZ (16 * PAGE_SIZE) 462d39b52e3SSean Wang struct mt76_sdio { 463fefb584dSLorenzo Bianconi struct mt76_worker txrx_worker; 4646a618acbSLorenzo Bianconi struct mt76_worker status_worker; 4656a618acbSLorenzo Bianconi struct mt76_worker net_worker; 4666a618acbSLorenzo Bianconi 467d74fda4cSLorenzo Bianconi struct work_struct stat_work; 468974327a4SLorenzo Bianconi 469264b7b19SLorenzo Bianconi u8 *xmit_buf[IEEE80211_NUM_ACS + 2]; 4701522ff73SLorenzo Bianconi 471d39b52e3SSean Wang struct sdio_func *func; 472b4964908SSean Wang void *intr_data; 473d39b52e3SSean Wang 474d39b52e3SSean Wang struct { 475d39b52e3SSean Wang int pse_data_quota; 476d39b52e3SSean Wang int ple_data_quota; 477d39b52e3SSean Wang int pse_mcu_quota; 478d39b52e3SSean Wang int deficit; 479d39b52e3SSean Wang } sched; 480d39b52e3SSean Wang }; 481d39b52e3SSean Wang 482f7bbb80fSLorenzo Bianconi struct mt76_mmio { 48327db1ad1SLorenzo Bianconi void __iomem *regs; 484957068c2SLorenzo Bianconi spinlock_t irq_lock; 485957068c2SLorenzo Bianconi u32 irqmask; 486f7bbb80fSLorenzo Bianconi }; 487f7bbb80fSLorenzo Bianconi 4885ce09c1aSFelix Fietkau struct mt76_rx_status { 4895ce09c1aSFelix Fietkau union { 4905ce09c1aSFelix Fietkau struct mt76_wcid *wcid; 49149e649c3SRyder Lee u16 wcid_idx; 4925ce09c1aSFelix Fietkau }; 4935ce09c1aSFelix Fietkau 4945ce09c1aSFelix Fietkau unsigned long reorder_time; 4955ce09c1aSFelix Fietkau 4965ce09c1aSFelix Fietkau u32 ampdu_ref; 4975ce09c1aSFelix Fietkau 4985ce09c1aSFelix Fietkau u8 iv[6]; 4995ce09c1aSFelix Fietkau 500bfc394ddSFelix Fietkau u8 ext_phy:1; 5015ce09c1aSFelix Fietkau u8 aggr:1; 502e195dad1SFelix Fietkau u8 qos_ctl; 5035ce09c1aSFelix Fietkau u16 seqno; 5045ce09c1aSFelix Fietkau 5055ce09c1aSFelix Fietkau u16 freq; 5065ce09c1aSFelix Fietkau u32 flag; 5075ce09c1aSFelix Fietkau u8 enc_flags; 508af4a2f2fSRyder Lee u8 encoding:2, bw:3, he_ru:3; 509af4a2f2fSRyder Lee u8 he_gi:2, he_dcm:1; 510cc4b3c13SLorenzo Bianconi u8 amsdu:1, first_amsdu:1, last_amsdu:1; 5115ce09c1aSFelix Fietkau u8 rate_idx; 5125ce09c1aSFelix Fietkau u8 nss; 5135ce09c1aSFelix Fietkau u8 band; 5145ce09c1aSFelix Fietkau s8 signal; 5155ce09c1aSFelix Fietkau u8 chains; 5165ce09c1aSFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 5175ce09c1aSFelix Fietkau }; 5185ce09c1aSFelix Fietkau 519f0efa862SFelix Fietkau struct mt76_testmode_ops { 520c918c74dSShayne Chen int (*set_state)(struct mt76_phy *phy, enum mt76_testmode_state state); 521c918c74dSShayne Chen int (*set_params)(struct mt76_phy *phy, struct nlattr **tb, 522f0efa862SFelix Fietkau enum mt76_testmode_state new_state); 523c918c74dSShayne Chen int (*dump_stats)(struct mt76_phy *phy, struct sk_buff *msg); 524f0efa862SFelix Fietkau }; 525f0efa862SFelix Fietkau 526f0efa862SFelix Fietkau struct mt76_testmode_data { 527f0efa862SFelix Fietkau enum mt76_testmode_state state; 528f0efa862SFelix Fietkau 529f0efa862SFelix Fietkau u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)]; 530f0efa862SFelix Fietkau struct sk_buff *tx_skb; 531f0efa862SFelix Fietkau 532f0efa862SFelix Fietkau u32 tx_count; 533f0efa862SFelix Fietkau u16 tx_msdu_len; 534f0efa862SFelix Fietkau 535f0efa862SFelix Fietkau u8 tx_rate_mode; 536f0efa862SFelix Fietkau u8 tx_rate_idx; 537f0efa862SFelix Fietkau u8 tx_rate_nss; 538f0efa862SFelix Fietkau u8 tx_rate_sgi; 539f0efa862SFelix Fietkau u8 tx_rate_ldpc; 5407f54c742SShayne Chen u8 tx_rate_stbc; 5411a38c2f5SShayne Chen u8 tx_ltf; 542f0efa862SFelix Fietkau 543f0efa862SFelix Fietkau u8 tx_antenna_mask; 544fdc9c18eSShayne Chen u8 tx_spe_idx; 545f0efa862SFelix Fietkau 546b8cbdb97SShayne Chen u8 tx_duty_cycle; 547b8cbdb97SShayne Chen u32 tx_time; 548b8cbdb97SShayne Chen u32 tx_ipg; 549b8cbdb97SShayne Chen 550f0efa862SFelix Fietkau u32 freq_offset; 551f0efa862SFelix Fietkau 552f0efa862SFelix Fietkau u8 tx_power[4]; 553f0efa862SFelix Fietkau u8 tx_power_control; 554f0efa862SFelix Fietkau 555f0efa862SFelix Fietkau u32 tx_pending; 556f0efa862SFelix Fietkau u32 tx_queued; 557ba459094SShayne Chen u16 tx_queued_limit; 558f0efa862SFelix Fietkau u32 tx_done; 559f0efa862SFelix Fietkau struct { 560f0efa862SFelix Fietkau u64 packets[__MT_RXQ_MAX]; 561f0efa862SFelix Fietkau u64 fcs_error[__MT_RXQ_MAX]; 562f0efa862SFelix Fietkau } rx_stats; 563f0efa862SFelix Fietkau }; 564f0efa862SFelix Fietkau 56585d96704SLorenzo Bianconi struct mt76_vif { 56685d96704SLorenzo Bianconi u8 idx; 56785d96704SLorenzo Bianconi u8 omac_idx; 56885d96704SLorenzo Bianconi u8 band_idx; 56985d96704SLorenzo Bianconi u8 wmm_idx; 57085d96704SLorenzo Bianconi u8 scan_seq_num; 57185d96704SLorenzo Bianconi }; 57285d96704SLorenzo Bianconi 573ac24dd35SFelix Fietkau struct mt76_phy { 574ac24dd35SFelix Fietkau struct ieee80211_hw *hw; 575ac24dd35SFelix Fietkau struct mt76_dev *dev; 576a3d01038SFelix Fietkau void *priv; 57796747a51SFelix Fietkau 578011849e0SFelix Fietkau unsigned long state; 579011849e0SFelix Fietkau 58091990519SLorenzo Bianconi struct mt76_queue *q_tx[__MT_TXQ_MAX]; 58191990519SLorenzo Bianconi 58296747a51SFelix Fietkau struct cfg80211_chan_def chandef; 58396747a51SFelix Fietkau struct ieee80211_channel *main_chan; 58496747a51SFelix Fietkau 58596747a51SFelix Fietkau struct mt76_channel_state *chan_state; 58696747a51SFelix Fietkau ktime_t survey_time; 58796747a51SFelix Fietkau 58848dbce5cSLorenzo Bianconi struct mt76_hw_cap cap; 58996747a51SFelix Fietkau struct mt76_sband sband_2g; 59096747a51SFelix Fietkau struct mt76_sband sband_5g; 591beaaeb6bSFelix Fietkau 59298df2baeSLorenzo Bianconi u8 macaddr[ETH_ALEN]; 59398df2baeSLorenzo Bianconi 594beaaeb6bSFelix Fietkau int txpower_cur; 595beaaeb6bSFelix Fietkau u8 antenna_mask; 596b9027e08SLorenzo Bianconi u16 chainmask; 597c918c74dSShayne Chen 598c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 599c918c74dSShayne Chen struct mt76_testmode_data test; 600c918c74dSShayne Chen #endif 601a782f8bfSLorenzo Bianconi 602a782f8bfSLorenzo Bianconi struct delayed_work mac_work; 603a782f8bfSLorenzo Bianconi u8 mac_work_count; 604cc4b3c13SLorenzo Bianconi 605cc4b3c13SLorenzo Bianconi struct { 606cc4b3c13SLorenzo Bianconi struct sk_buff *head; 607cc4b3c13SLorenzo Bianconi struct sk_buff **tail; 608cc4b3c13SLorenzo Bianconi u16 seqno; 609cc4b3c13SLorenzo Bianconi } rx_amsdu[__MT_RXQ_MAX]; 610ac24dd35SFelix Fietkau }; 611ac24dd35SFelix Fietkau 61217f1de56SFelix Fietkau struct mt76_dev { 613ac24dd35SFelix Fietkau struct mt76_phy phy; /* must be first */ 614ac24dd35SFelix Fietkau 615bfc394ddSFelix Fietkau struct mt76_phy *phy2; 616bfc394ddSFelix Fietkau 61717f1de56SFelix Fietkau struct ieee80211_hw *hw; 61817f1de56SFelix Fietkau 61917f1de56SFelix Fietkau spinlock_t lock; 62017f1de56SFelix Fietkau spinlock_t cc_lock; 621108a4861SStanislaw Gruszka 6225ce09c1aSFelix Fietkau u32 cur_cc_bss_rx; 6235ce09c1aSFelix Fietkau 6245ce09c1aSFelix Fietkau struct mt76_rx_status rx_ampdu_status; 6255ce09c1aSFelix Fietkau u32 rx_ampdu_len; 6265ce09c1aSFelix Fietkau u32 rx_ampdu_ref; 6275ce09c1aSFelix Fietkau 628108a4861SStanislaw Gruszka struct mutex mutex; 629108a4861SStanislaw Gruszka 63017f1de56SFelix Fietkau const struct mt76_bus_ops *bus; 63117f1de56SFelix Fietkau const struct mt76_driver_ops *drv; 632db0f04f3SLorenzo Bianconi const struct mt76_mcu_ops *mcu_ops; 63317f1de56SFelix Fietkau struct device *dev; 63417f1de56SFelix Fietkau 63509872957SLorenzo Bianconi struct mt76_mcu mcu; 63609872957SLorenzo Bianconi 63717f1de56SFelix Fietkau struct net_device napi_dev; 638c3d7c82aSFelix Fietkau spinlock_t rx_lock; 63917f1de56SFelix Fietkau struct napi_struct napi[__MT_RXQ_MAX]; 64017f1de56SFelix Fietkau struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 64117f1de56SFelix Fietkau 64217f1de56SFelix Fietkau struct list_head txwi_cache; 643b1cb42adSLorenzo Bianconi struct mt76_queue *q_mcu[__MT_MCUQ_MAX]; 64417f1de56SFelix Fietkau struct mt76_queue q_rx[__MT_RXQ_MAX]; 64517f1de56SFelix Fietkau const struct mt76_queue_ops *queue_ops; 646c1e0d2beSLorenzo Bianconi int tx_dma_idx[4]; 64717f1de56SFelix Fietkau 648781eef5bSFelix Fietkau struct mt76_worker tx_worker; 6498402650aSLorenzo Bianconi struct napi_struct tx_napi; 650a33b8ab8SFelix Fietkau 65126e40d4cSFelix Fietkau wait_queue_head_t tx_wait; 65288046b2cSFelix Fietkau struct sk_buff_head status_list; 65326e40d4cSFelix Fietkau 6545e616ad2SFelix Fietkau u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 6555e616ad2SFelix Fietkau u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 65636404c06SStanislaw Gruszka 6572ab33b8dSFelix Fietkau u32 vif_mask; 6582ab33b8dSFelix Fietkau 65936404c06SStanislaw Gruszka struct mt76_wcid global_wcid; 66036404c06SStanislaw Gruszka struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 66136404c06SStanislaw Gruszka 66217f1de56SFelix Fietkau u32 rev; 66317f1de56SFelix Fietkau 664d7b47bbdSLorenzo Bianconi u32 aggr_stats[32]; 665d7b47bbdSLorenzo Bianconi 666dc6057f4SLorenzo Bianconi struct tasklet_struct pre_tbtt_tasklet; 6673041c445SLorenzo Bianconi int beacon_int; 668c8a04d98SLorenzo Bianconi u8 beacon_mask; 6693041c445SLorenzo Bianconi 67017f1de56SFelix Fietkau struct debugfs_blob_wrapper eeprom; 67117f1de56SFelix Fietkau struct debugfs_blob_wrapper otp; 67217f1de56SFelix Fietkau 673b6862effSLorenzo Bianconi struct mt76_rate_power rate_power; 674b6862effSLorenzo Bianconi 6755b257371SLorenzo Bianconi char alpha2[3]; 676d8b8890dSLorenzo Bianconi enum nl80211_dfs_regions region; 677d8b8890dSLorenzo Bianconi 67817f1de56SFelix Fietkau u32 debugfs_reg; 67917f1de56SFelix Fietkau 68017f1de56SFelix Fietkau struct led_classdev led_cdev; 68117f1de56SFelix Fietkau char led_name[32]; 68217f1de56SFelix Fietkau bool led_al; 68317f1de56SFelix Fietkau u8 led_pin; 684b40b15e1SLorenzo Bianconi 685e7173858SFelix Fietkau u8 csa_complete; 686e7173858SFelix Fietkau 687108a4861SStanislaw Gruszka u32 rxfilter; 688108a4861SStanislaw Gruszka 689f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 690f0efa862SFelix Fietkau const struct mt76_testmode_ops *test_ops; 691e7a6a044SShayne Chen struct { 692e7a6a044SShayne Chen const char *name; 693e7a6a044SShayne Chen u32 offset; 694e7a6a044SShayne Chen } test_mtd; 695f0efa862SFelix Fietkau #endif 696a86f1d01SLorenzo Bianconi struct workqueue_struct *wq; 697a86f1d01SLorenzo Bianconi 698f7bbb80fSLorenzo Bianconi union { 699f7bbb80fSLorenzo Bianconi struct mt76_mmio mmio; 700b40b15e1SLorenzo Bianconi struct mt76_usb usb; 701d39b52e3SSean Wang struct mt76_sdio sdio; 70217f1de56SFelix Fietkau }; 703f7bbb80fSLorenzo Bianconi }; 70417f1de56SFelix Fietkau 70517f1de56SFelix Fietkau enum mt76_phy_type { 70617f1de56SFelix Fietkau MT_PHY_TYPE_CCK, 70717f1de56SFelix Fietkau MT_PHY_TYPE_OFDM, 70817f1de56SFelix Fietkau MT_PHY_TYPE_HT, 70917f1de56SFelix Fietkau MT_PHY_TYPE_HT_GF, 71017f1de56SFelix Fietkau MT_PHY_TYPE_VHT, 711d3377b78SRyder Lee MT_PHY_TYPE_HE_SU = 8, 712d3377b78SRyder Lee MT_PHY_TYPE_HE_EXT_SU, 713d3377b78SRyder Lee MT_PHY_TYPE_HE_TB, 714d3377b78SRyder Lee MT_PHY_TYPE_HE_MU, 71517f1de56SFelix Fietkau }; 71617f1de56SFelix Fietkau 717d4131273SStanislaw Gruszka #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 718d4131273SStanislaw Gruszka #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 719d4131273SStanislaw Gruszka #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 72035e4ebeaSLorenzo Bianconi #define __mt76_wr_copy(dev, ...) (dev)->bus->write_copy((dev), __VA_ARGS__) 72135e4ebeaSLorenzo Bianconi #define __mt76_rr_copy(dev, ...) (dev)->bus->read_copy((dev), __VA_ARGS__) 722d4131273SStanislaw Gruszka 72322c575c4SStanislaw Gruszka #define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 72422c575c4SStanislaw Gruszka #define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 72522c575c4SStanislaw Gruszka 72617f1de56SFelix Fietkau #define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 72717f1de56SFelix Fietkau #define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 72817f1de56SFelix Fietkau #define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 72935e4ebeaSLorenzo Bianconi #define mt76_wr_copy(dev, ...) (dev)->mt76.bus->write_copy(&((dev)->mt76), __VA_ARGS__) 73035e4ebeaSLorenzo Bianconi #define mt76_rr_copy(dev, ...) (dev)->mt76.bus->read_copy(&((dev)->mt76), __VA_ARGS__) 7316da5a291SStanislaw Gruszka #define mt76_wr_rp(dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__) 7326da5a291SStanislaw Gruszka #define mt76_rd_rp(dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__) 73317f1de56SFelix Fietkau 734f4d45fe2SLorenzo Bianconi 735e2c2fd0fSLorenzo Bianconi #define mt76_mcu_restart(dev, ...) (dev)->mt76.mcu_ops->mcu_restart(&((dev)->mt76)) 736e2c2fd0fSLorenzo Bianconi #define __mt76_mcu_restart(dev, ...) (dev)->mcu_ops->mcu_restart((dev)) 737db0f04f3SLorenzo Bianconi 73817f1de56SFelix Fietkau #define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 73917f1de56SFelix Fietkau #define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 74017f1de56SFelix Fietkau 74117f1de56SFelix Fietkau #define mt76_get_field(_dev, _reg, _field) \ 74217f1de56SFelix Fietkau FIELD_GET(_field, mt76_rr(dev, _reg)) 74317f1de56SFelix Fietkau 74417f1de56SFelix Fietkau #define mt76_rmw_field(_dev, _reg, _field, _val) \ 74517f1de56SFelix Fietkau mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 74617f1de56SFelix Fietkau 74746436b5eSStanislaw Gruszka #define __mt76_rmw_field(_dev, _reg, _field, _val) \ 74846436b5eSStanislaw Gruszka __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 74946436b5eSStanislaw Gruszka 750ac24dd35SFelix Fietkau #define mt76_hw(dev) (dev)->mphy.hw 75117f1de56SFelix Fietkau 752426e8e41SFelix Fietkau static inline struct ieee80211_hw * 75349e649c3SRyder Lee mt76_wcid_hw(struct mt76_dev *dev, u16 wcid) 754426e8e41SFelix Fietkau { 755426e8e41SFelix Fietkau if (wcid <= MT76_N_WCIDS && 756426e8e41SFelix Fietkau mt76_wcid_mask_test(dev->wcid_phy_mask, wcid)) 757426e8e41SFelix Fietkau return dev->phy2->hw; 758426e8e41SFelix Fietkau 759426e8e41SFelix Fietkau return dev->phy.hw; 760426e8e41SFelix Fietkau } 761426e8e41SFelix Fietkau 76217f1de56SFelix Fietkau bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 76317f1de56SFelix Fietkau int timeout); 76417f1de56SFelix Fietkau 76517f1de56SFelix Fietkau #define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 76617f1de56SFelix Fietkau 76717f1de56SFelix Fietkau bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 76817f1de56SFelix Fietkau int timeout); 76917f1de56SFelix Fietkau 77017f1de56SFelix Fietkau #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 77117f1de56SFelix Fietkau 77217f1de56SFelix Fietkau void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 773f37f0550SLorenzo Bianconi void mt76_pci_disable_aspm(struct pci_dev *pdev); 77417f1de56SFelix Fietkau 77517f1de56SFelix Fietkau static inline u16 mt76_chip(struct mt76_dev *dev) 77617f1de56SFelix Fietkau { 77717f1de56SFelix Fietkau return dev->rev >> 16; 77817f1de56SFelix Fietkau } 77917f1de56SFelix Fietkau 78017f1de56SFelix Fietkau static inline u16 mt76_rev(struct mt76_dev *dev) 78117f1de56SFelix Fietkau { 78217f1de56SFelix Fietkau return dev->rev & 0xffff; 78317f1de56SFelix Fietkau } 78417f1de56SFelix Fietkau 78517f1de56SFelix Fietkau #define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 78617f1de56SFelix Fietkau #define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 78717f1de56SFelix Fietkau 788a23fde09SLorenzo Bianconi #define mt76_init_queues(dev) (dev)->mt76.queue_ops->init(&((dev)->mt76)) 789a23fde09SLorenzo Bianconi #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 7905ed31128SLorenzo Bianconi #define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__) 791eb9ca7ecSLorenzo Bianconi #define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__) 79217f1de56SFelix Fietkau #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 79317f1de56SFelix Fietkau #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 79417f1de56SFelix Fietkau #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 79517f1de56SFelix Fietkau 796f473b42aSFelix Fietkau #define mt76_for_each_q_rx(dev, i) \ 797f473b42aSFelix Fietkau for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ 798f473b42aSFelix Fietkau (dev)->q_rx[i].ndesc; i++) 799f473b42aSFelix Fietkau 800c0f7b25aSLorenzo Bianconi struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, 801c0f7b25aSLorenzo Bianconi const struct ieee80211_ops *ops, 802c0f7b25aSLorenzo Bianconi const struct mt76_driver_ops *drv_ops); 80317f1de56SFelix Fietkau int mt76_register_device(struct mt76_dev *dev, bool vht, 80417f1de56SFelix Fietkau struct ieee80211_rate *rates, int n_rates); 80517f1de56SFelix Fietkau void mt76_unregister_device(struct mt76_dev *dev); 806def34a2fSLorenzo Bianconi void mt76_free_device(struct mt76_dev *dev); 807c89d3625SFelix Fietkau void mt76_unregister_phy(struct mt76_phy *phy); 808c89d3625SFelix Fietkau 809c89d3625SFelix Fietkau struct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, 810c89d3625SFelix Fietkau const struct ieee80211_ops *ops); 811db78a791SLorenzo Bianconi int mt76_register_phy(struct mt76_phy *phy, bool vht, 812db78a791SLorenzo Bianconi struct ieee80211_rate *rates, int n_rates); 81317f1de56SFelix Fietkau 81417f1de56SFelix Fietkau struct dentry *mt76_register_debugfs(struct mt76_dev *dev); 8150b82a8e8SLorenzo Bianconi int mt76_queues_read(struct seq_file *s, void *data); 8168f410a8bSLorenzo Bianconi void mt76_seq_puts_array(struct seq_file *file, const char *str, 8178f410a8bSLorenzo Bianconi s8 *val, int len); 81817f1de56SFelix Fietkau 81917f1de56SFelix Fietkau int mt76_eeprom_init(struct mt76_dev *dev, int len); 82098df2baeSLorenzo Bianconi void mt76_eeprom_override(struct mt76_phy *phy); 82117f1de56SFelix Fietkau 822b1cb42adSLorenzo Bianconi struct mt76_queue * 823b1cb42adSLorenzo Bianconi mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc, 824b1cb42adSLorenzo Bianconi int ring_base); 825b1cb42adSLorenzo Bianconi static inline int mt76_init_tx_queue(struct mt76_phy *phy, int qid, int idx, 826b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 827b1cb42adSLorenzo Bianconi { 828b1cb42adSLorenzo Bianconi struct mt76_queue *q; 829b1cb42adSLorenzo Bianconi 830b1cb42adSLorenzo Bianconi q = mt76_init_queue(phy->dev, qid, idx, n_desc, ring_base); 831b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 832b1cb42adSLorenzo Bianconi return PTR_ERR(q); 833b1cb42adSLorenzo Bianconi 834b1cb42adSLorenzo Bianconi q->qid = qid; 83591990519SLorenzo Bianconi phy->q_tx[qid] = q; 836b1cb42adSLorenzo Bianconi 837b1cb42adSLorenzo Bianconi return 0; 838b1cb42adSLorenzo Bianconi } 839b1cb42adSLorenzo Bianconi 840b1cb42adSLorenzo Bianconi static inline int mt76_init_mcu_queue(struct mt76_dev *dev, int qid, int idx, 841b1cb42adSLorenzo Bianconi int n_desc, int ring_base) 842b1cb42adSLorenzo Bianconi { 843b1cb42adSLorenzo Bianconi struct mt76_queue *q; 844b1cb42adSLorenzo Bianconi 845b1cb42adSLorenzo Bianconi q = mt76_init_queue(dev, qid, idx, n_desc, ring_base); 846b1cb42adSLorenzo Bianconi if (IS_ERR(q)) 847b1cb42adSLorenzo Bianconi return PTR_ERR(q); 848b1cb42adSLorenzo Bianconi 849e637763bSLorenzo Bianconi q->qid = __MT_TXQ_MAX + qid; 850b1cb42adSLorenzo Bianconi dev->q_mcu[qid] = q; 851b1cb42adSLorenzo Bianconi 852b1cb42adSLorenzo Bianconi return 0; 853b1cb42adSLorenzo Bianconi } 854b671da33SLorenzo Bianconi 855011849e0SFelix Fietkau static inline struct mt76_phy * 856011849e0SFelix Fietkau mt76_dev_phy(struct mt76_dev *dev, bool phy_ext) 857011849e0SFelix Fietkau { 858011849e0SFelix Fietkau if (phy_ext && dev->phy2) 859011849e0SFelix Fietkau return dev->phy2; 860011849e0SFelix Fietkau return &dev->phy; 861011849e0SFelix Fietkau } 862011849e0SFelix Fietkau 863bfc394ddSFelix Fietkau static inline struct ieee80211_hw * 864bfc394ddSFelix Fietkau mt76_phy_hw(struct mt76_dev *dev, bool phy_ext) 865bfc394ddSFelix Fietkau { 866011849e0SFelix Fietkau return mt76_dev_phy(dev, phy_ext)->hw; 867bfc394ddSFelix Fietkau } 868bfc394ddSFelix Fietkau 869f3950a41SLorenzo Bianconi static inline u8 * 870f3950a41SLorenzo Bianconi mt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t) 871f3950a41SLorenzo Bianconi { 872f3950a41SLorenzo Bianconi return (u8 *)t - dev->drv->txwi_size; 873f3950a41SLorenzo Bianconi } 874f3950a41SLorenzo Bianconi 875ee8aa945SLorenzo Bianconi /* increment with wrap-around */ 876ee8aa945SLorenzo Bianconi static inline int mt76_incr(int val, int size) 877ee8aa945SLorenzo Bianconi { 878ee8aa945SLorenzo Bianconi return (val + 1) & (size - 1); 879ee8aa945SLorenzo Bianconi } 880ee8aa945SLorenzo Bianconi 881ee8aa945SLorenzo Bianconi /* decrement with wrap-around */ 882ee8aa945SLorenzo Bianconi static inline int mt76_decr(int val, int size) 883ee8aa945SLorenzo Bianconi { 884ee8aa945SLorenzo Bianconi return (val - 1) & (size - 1); 885ee8aa945SLorenzo Bianconi } 886ee8aa945SLorenzo Bianconi 8871d0496c6SStanislaw Gruszka u8 mt76_ac_to_hwq(u8 ac); 888b40b15e1SLorenzo Bianconi 88917f1de56SFelix Fietkau static inline struct ieee80211_txq * 89017f1de56SFelix Fietkau mtxq_to_txq(struct mt76_txq *mtxq) 89117f1de56SFelix Fietkau { 89217f1de56SFelix Fietkau void *ptr = mtxq; 89317f1de56SFelix Fietkau 89417f1de56SFelix Fietkau return container_of(ptr, struct ieee80211_txq, drv_priv); 89517f1de56SFelix Fietkau } 89617f1de56SFelix Fietkau 8979c68a57bSFelix Fietkau static inline struct ieee80211_sta * 8989c68a57bSFelix Fietkau wcid_to_sta(struct mt76_wcid *wcid) 8999c68a57bSFelix Fietkau { 9009c68a57bSFelix Fietkau void *ptr = wcid; 9019c68a57bSFelix Fietkau 9029c68a57bSFelix Fietkau if (!wcid || !wcid->sta) 9039c68a57bSFelix Fietkau return NULL; 9049c68a57bSFelix Fietkau 9059c68a57bSFelix Fietkau return container_of(ptr, struct ieee80211_sta, drv_priv); 9069c68a57bSFelix Fietkau } 9079c68a57bSFelix Fietkau 90888046b2cSFelix Fietkau static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb) 90988046b2cSFelix Fietkau { 91088046b2cSFelix Fietkau BUILD_BUG_ON(sizeof(struct mt76_tx_cb) > 91188046b2cSFelix Fietkau sizeof(IEEE80211_SKB_CB(skb)->status.status_driver_data)); 91288046b2cSFelix Fietkau return ((void *)IEEE80211_SKB_CB(skb)->status.status_driver_data); 91388046b2cSFelix Fietkau } 91488046b2cSFelix Fietkau 91577ae1d5eSRyder Lee static inline void *mt76_skb_get_hdr(struct sk_buff *skb) 91677ae1d5eSRyder Lee { 91777ae1d5eSRyder Lee struct mt76_rx_status mstat; 91877ae1d5eSRyder Lee u8 *data = skb->data; 91977ae1d5eSRyder Lee 92077ae1d5eSRyder Lee /* Alignment concerns */ 92177ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4); 92277ae1d5eSRyder Lee BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4); 92377ae1d5eSRyder Lee 92477ae1d5eSRyder Lee mstat = *((struct mt76_rx_status *)skb->cb); 92577ae1d5eSRyder Lee 92677ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE) 92777ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he); 92877ae1d5eSRyder Lee if (mstat.flag & RX_FLAG_RADIOTAP_HE_MU) 92977ae1d5eSRyder Lee data += sizeof(struct ieee80211_radiotap_he_mu); 93077ae1d5eSRyder Lee 93177ae1d5eSRyder Lee return data; 93277ae1d5eSRyder Lee } 93377ae1d5eSRyder Lee 9343bb45b5fSLorenzo Bianconi static inline void mt76_insert_hdr_pad(struct sk_buff *skb) 9353bb45b5fSLorenzo Bianconi { 9363bb45b5fSLorenzo Bianconi int len = ieee80211_get_hdrlen_from_skb(skb); 9373bb45b5fSLorenzo Bianconi 9383bb45b5fSLorenzo Bianconi if (len % 4 == 0) 9393bb45b5fSLorenzo Bianconi return; 9403bb45b5fSLorenzo Bianconi 9413bb45b5fSLorenzo Bianconi skb_push(skb, 2); 9423bb45b5fSLorenzo Bianconi memmove(skb->data, skb->data + 2, len); 9433bb45b5fSLorenzo Bianconi 9443bb45b5fSLorenzo Bianconi skb->data[len] = 0; 9453bb45b5fSLorenzo Bianconi skb->data[len + 1] = 0; 9463bb45b5fSLorenzo Bianconi } 9473bb45b5fSLorenzo Bianconi 9488548c6ebSFelix Fietkau static inline bool mt76_is_skb_pktid(u8 pktid) 9498548c6ebSFelix Fietkau { 9508548c6ebSFelix Fietkau if (pktid & MT_PACKET_ID_HAS_RATE) 9518548c6ebSFelix Fietkau return false; 9528548c6ebSFelix Fietkau 9538548c6ebSFelix Fietkau return pktid >= MT_PACKET_ID_FIRST; 9548548c6ebSFelix Fietkau } 9558548c6ebSFelix Fietkau 95607cda406SFelix Fietkau static inline u8 mt76_tx_power_nss_delta(u8 nss) 95707cda406SFelix Fietkau { 95807cda406SFelix Fietkau static const u8 nss_delta[4] = { 0, 6, 9, 12 }; 95907cda406SFelix Fietkau 96007cda406SFelix Fietkau return nss_delta[nss - 1]; 96107cda406SFelix Fietkau } 96207cda406SFelix Fietkau 963c918c74dSShayne Chen static inline bool mt76_testmode_enabled(struct mt76_phy *phy) 964f0efa862SFelix Fietkau { 965f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 966c918c74dSShayne Chen return phy->test.state != MT76_TM_STATE_OFF; 967c918c74dSShayne Chen #else 968c918c74dSShayne Chen return false; 969c918c74dSShayne Chen #endif 970c918c74dSShayne Chen } 971c918c74dSShayne Chen 972c918c74dSShayne Chen static inline bool mt76_is_testmode_skb(struct mt76_dev *dev, 973c918c74dSShayne Chen struct sk_buff *skb, 974c918c74dSShayne Chen struct ieee80211_hw **hw) 975c918c74dSShayne Chen { 976c918c74dSShayne Chen #ifdef CONFIG_NL80211_TESTMODE 977c918c74dSShayne Chen if (skb == dev->phy.test.tx_skb) 978c918c74dSShayne Chen *hw = dev->phy.hw; 979c918c74dSShayne Chen else if (dev->phy2 && skb == dev->phy2->test.tx_skb) 980c918c74dSShayne Chen *hw = dev->phy2->hw; 981c918c74dSShayne Chen else 982c918c74dSShayne Chen return false; 983c918c74dSShayne Chen return true; 984f0efa862SFelix Fietkau #else 985f0efa862SFelix Fietkau return false; 986f0efa862SFelix Fietkau #endif 987f0efa862SFelix Fietkau } 988f0efa862SFelix Fietkau 98917f1de56SFelix Fietkau void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 9909fba6d07SFelix Fietkau void mt76_tx(struct mt76_phy *dev, struct ieee80211_sta *sta, 99117f1de56SFelix Fietkau struct mt76_wcid *wcid, struct sk_buff *skb); 99217f1de56SFelix Fietkau void mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 99391990519SLorenzo Bianconi void mt76_stop_tx_queues(struct mt76_phy *phy, struct ieee80211_sta *sta, 99417f1de56SFelix Fietkau bool send_bar); 995c50d105aSFelix Fietkau void mt76_tx_check_agg_ssn(struct ieee80211_sta *sta, struct sk_buff *skb); 9969fba6d07SFelix Fietkau void mt76_txq_schedule(struct mt76_phy *phy, enum mt76_txq_id qid); 9979fba6d07SFelix Fietkau void mt76_txq_schedule_all(struct mt76_phy *phy); 998781eef5bSFelix Fietkau void mt76_tx_worker(struct mt76_worker *w); 99917f1de56SFelix Fietkau void mt76_release_buffered_frames(struct ieee80211_hw *hw, 100017f1de56SFelix Fietkau struct ieee80211_sta *sta, 100117f1de56SFelix Fietkau u16 tids, int nframes, 100217f1de56SFelix Fietkau enum ieee80211_frame_release_type reason, 100317f1de56SFelix Fietkau bool more_data); 10045a95ca41SFelix Fietkau bool mt76_has_tx_pending(struct mt76_phy *phy); 100596747a51SFelix Fietkau void mt76_set_channel(struct mt76_phy *phy); 10065ce09c1aSFelix Fietkau void mt76_update_survey(struct mt76_dev *dev); 100704414240SLorenzo Bianconi void mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time); 100817f1de56SFelix Fietkau int mt76_get_survey(struct ieee80211_hw *hw, int idx, 100917f1de56SFelix Fietkau struct survey_info *survey); 1010bb3e3fecSRyder Lee void mt76_set_stream_caps(struct mt76_phy *phy, bool vht); 101117f1de56SFelix Fietkau 1012aee5b8cfSFelix Fietkau int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 10137c4f744dSRyder Lee u16 ssn, u16 size); 1014aee5b8cfSFelix Fietkau void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 1015aee5b8cfSFelix Fietkau 101630ce7f44SFelix Fietkau void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 101730ce7f44SFelix Fietkau struct ieee80211_key_conf *key); 101879d1c94cSFelix Fietkau 101979d1c94cSFelix Fietkau void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 102079d1c94cSFelix Fietkau __acquires(&dev->status_list.lock); 102179d1c94cSFelix Fietkau void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 102279d1c94cSFelix Fietkau __releases(&dev->status_list.lock); 102379d1c94cSFelix Fietkau 102488046b2cSFelix Fietkau int mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 102588046b2cSFelix Fietkau struct sk_buff *skb); 102688046b2cSFelix Fietkau struct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev, 102779d1c94cSFelix Fietkau struct mt76_wcid *wcid, int pktid, 102879d1c94cSFelix Fietkau struct sk_buff_head *list); 102979d1c94cSFelix Fietkau void mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, 103079d1c94cSFelix Fietkau struct sk_buff_head *list); 1031e1378e52SFelix Fietkau void mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb); 103279d1c94cSFelix Fietkau void mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, 103379d1c94cSFelix Fietkau bool flush); 1034e28487eaSFelix Fietkau int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1035e28487eaSFelix Fietkau struct ieee80211_sta *sta, 1036e28487eaSFelix Fietkau enum ieee80211_sta_state old_state, 1037e28487eaSFelix Fietkau enum ieee80211_sta_state new_state); 103813f61dfcSLorenzo Bianconi void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 103913f61dfcSLorenzo Bianconi struct ieee80211_sta *sta); 104043ba1922SFelix Fietkau void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 104143ba1922SFelix Fietkau struct ieee80211_sta *sta); 104230ce7f44SFelix Fietkau 10438af63fedSFelix Fietkau int mt76_get_min_avg_rssi(struct mt76_dev *dev, bool ext_phy); 1044ef13edc0SFelix Fietkau 10459313faacSFelix Fietkau int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 10469313faacSFelix Fietkau int *dbm); 10479313faacSFelix Fietkau 1048e7173858SFelix Fietkau void mt76_csa_check(struct mt76_dev *dev); 1049e7173858SFelix Fietkau void mt76_csa_finish(struct mt76_dev *dev); 1050e7173858SFelix Fietkau 1051e49c76d4SLorenzo Bianconi int mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); 105287d53103SStanislaw Gruszka int mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set); 1053eadfd98fSLorenzo Bianconi void mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id); 1054d2679d65SLorenzo Bianconi int mt76_get_rate(struct mt76_dev *dev, 1055d2679d65SLorenzo Bianconi struct ieee80211_supported_band *sband, 1056d2679d65SLorenzo Bianconi int idx, bool cck); 10578b8ab5c2SLorenzo Bianconi void mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 10588b8ab5c2SLorenzo Bianconi const u8 *mac); 10598b8ab5c2SLorenzo Bianconi void mt76_sw_scan_complete(struct ieee80211_hw *hw, 10608b8ab5c2SLorenzo Bianconi struct ieee80211_vif *vif); 1061f0efa862SFelix Fietkau int mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1062f0efa862SFelix Fietkau void *data, int len); 1063f0efa862SFelix Fietkau int mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, 1064f0efa862SFelix Fietkau struct netlink_callback *cb, void *data, int len); 1065c918c74dSShayne Chen int mt76_testmode_set_state(struct mt76_phy *phy, enum mt76_testmode_state state); 1066f0efa862SFelix Fietkau 1067c918c74dSShayne Chen static inline void mt76_testmode_reset(struct mt76_phy *phy, bool disable) 1068f0efa862SFelix Fietkau { 1069f0efa862SFelix Fietkau #ifdef CONFIG_NL80211_TESTMODE 1070f0efa862SFelix Fietkau enum mt76_testmode_state state = MT76_TM_STATE_IDLE; 1071f0efa862SFelix Fietkau 1072c918c74dSShayne Chen if (disable || phy->test.state == MT76_TM_STATE_OFF) 1073f0efa862SFelix Fietkau state = MT76_TM_STATE_OFF; 1074f0efa862SFelix Fietkau 1075c918c74dSShayne Chen mt76_testmode_set_state(phy, state); 1076f0efa862SFelix Fietkau #endif 1077f0efa862SFelix Fietkau } 1078f0efa862SFelix Fietkau 107987d53103SStanislaw Gruszka 108017f1de56SFelix Fietkau /* internal */ 1081e394b575SFelix Fietkau static inline struct ieee80211_hw * 1082e394b575SFelix Fietkau mt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) 1083e394b575SFelix Fietkau { 1084e394b575SFelix Fietkau struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1085e394b575SFelix Fietkau struct ieee80211_hw *hw = dev->phy.hw; 1086e394b575SFelix Fietkau 1087e394b575SFelix Fietkau if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) 1088e394b575SFelix Fietkau hw = dev->phy2->hw; 1089e394b575SFelix Fietkau 1090e394b575SFelix Fietkau info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY; 1091e394b575SFelix Fietkau 1092e394b575SFelix Fietkau return hw; 1093e394b575SFelix Fietkau } 1094e394b575SFelix Fietkau 109517f1de56SFelix Fietkau void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 10969d9d738bSFelix Fietkau void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 109781e850efSLorenzo Bianconi struct napi_struct *napi); 109881e850efSLorenzo Bianconi void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 109981e850efSLorenzo Bianconi struct napi_struct *napi); 1100aee5b8cfSFelix Fietkau void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 1101c918c74dSShayne Chen void mt76_testmode_tx_pending(struct mt76_phy *phy); 1102fe5b5ab5SFelix Fietkau void mt76_queue_tx_complete(struct mt76_dev *dev, struct mt76_queue *q, 1103fe5b5ab5SFelix Fietkau struct mt76_queue_entry *e); 110417f1de56SFelix Fietkau 1105b40b15e1SLorenzo Bianconi /* usb */ 1106b40b15e1SLorenzo Bianconi static inline bool mt76u_urb_error(struct urb *urb) 1107b40b15e1SLorenzo Bianconi { 1108b40b15e1SLorenzo Bianconi return urb->status && 1109b40b15e1SLorenzo Bianconi urb->status != -ECONNRESET && 1110b40b15e1SLorenzo Bianconi urb->status != -ESHUTDOWN && 1111b40b15e1SLorenzo Bianconi urb->status != -ENOENT; 1112b40b15e1SLorenzo Bianconi } 1113b40b15e1SLorenzo Bianconi 1114b40b15e1SLorenzo Bianconi /* Map hardware queues to usb endpoints */ 1115b40b15e1SLorenzo Bianconi static inline u8 q2ep(u8 qid) 1116b40b15e1SLorenzo Bianconi { 1117b40b15e1SLorenzo Bianconi /* TODO: take management packets to queue 5 */ 1118b40b15e1SLorenzo Bianconi return qid + 1; 1119b40b15e1SLorenzo Bianconi } 1120b40b15e1SLorenzo Bianconi 11215de4db8fSStanislaw Gruszka static inline int 1122b63aa031SStanislaw Gruszka mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, 11233bcd979cSLorenzo Bianconi int timeout, int ep) 11245de4db8fSStanislaw Gruszka { 112580df01f4SLorenzo Bianconi struct usb_interface *uintf = to_usb_interface(dev->dev); 112680df01f4SLorenzo Bianconi struct usb_device *udev = interface_to_usbdev(uintf); 11275de4db8fSStanislaw Gruszka struct mt76_usb *usb = &dev->usb; 11285de4db8fSStanislaw Gruszka unsigned int pipe; 11295de4db8fSStanislaw Gruszka 1130b63aa031SStanislaw Gruszka if (actual_len) 11313bcd979cSLorenzo Bianconi pipe = usb_rcvbulkpipe(udev, usb->in_ep[ep]); 1132b63aa031SStanislaw Gruszka else 11333bcd979cSLorenzo Bianconi pipe = usb_sndbulkpipe(udev, usb->out_ep[ep]); 1134b63aa031SStanislaw Gruszka 1135b63aa031SStanislaw Gruszka return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 11365de4db8fSStanislaw Gruszka } 11375de4db8fSStanislaw Gruszka 1138e98e6df6SLorenzo Bianconi int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 1139b40b15e1SLorenzo Bianconi int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 1140b40b15e1SLorenzo Bianconi u8 req_type, u16 val, u16 offset, 1141b40b15e1SLorenzo Bianconi void *buf, size_t len); 1142b40b15e1SLorenzo Bianconi void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 1143b40b15e1SLorenzo Bianconi const u16 offset, const u32 val); 11441e816c65SLorenzo Bianconi int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 11451e816c65SLorenzo Bianconi bool ext); 114694e1cfa8SLorenzo Bianconi int mt76u_alloc_mcu_queue(struct mt76_dev *dev); 1147b40b15e1SLorenzo Bianconi int mt76u_alloc_queues(struct mt76_dev *dev); 114839d501d9SStanislaw Gruszka void mt76u_stop_tx(struct mt76_dev *dev); 114939d501d9SStanislaw Gruszka void mt76u_stop_rx(struct mt76_dev *dev); 115039d501d9SStanislaw Gruszka int mt76u_resume_rx(struct mt76_dev *dev); 1151b40b15e1SLorenzo Bianconi void mt76u_queues_deinit(struct mt76_dev *dev); 1152b40b15e1SLorenzo Bianconi 1153d39b52e3SSean Wang int mt76s_init(struct mt76_dev *dev, struct sdio_func *func, 1154d39b52e3SSean Wang const struct mt76_bus_ops *bus_ops); 1155d39b52e3SSean Wang int mt76s_alloc_queues(struct mt76_dev *dev); 1156d39b52e3SSean Wang void mt76s_deinit(struct mt76_dev *dev); 1157d39b52e3SSean Wang 11589df0fab9SLorenzo Bianconi struct sk_buff * 1159bb31a80eSLorenzo Bianconi mt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data, 1160bb31a80eSLorenzo Bianconi int data_len); 1161c07a49d4SLorenzo Bianconi void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb); 1162680abb25SLorenzo Bianconi struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 1163680abb25SLorenzo Bianconi unsigned long expires); 1164ae5ad627SFelix Fietkau int mt76_mcu_send_and_get_msg(struct mt76_dev *dev, int cmd, const void *data, 1165ae5ad627SFelix Fietkau int len, bool wait_resp, struct sk_buff **ret); 1166ae5ad627SFelix Fietkau int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb, 1167ae5ad627SFelix Fietkau int cmd, bool wait_resp, struct sk_buff **ret); 11683cb43b66SLorenzo Bianconi int mt76_mcu_send_firmware(struct mt76_dev *dev, int cmd, const void *data, 11693cb43b66SLorenzo Bianconi int len); 1170ae5ad627SFelix Fietkau static inline int 1171ae5ad627SFelix Fietkau mt76_mcu_send_msg(struct mt76_dev *dev, int cmd, const void *data, int len, 1172ae5ad627SFelix Fietkau bool wait_resp) 1173ae5ad627SFelix Fietkau { 1174ae5ad627SFelix Fietkau return mt76_mcu_send_and_get_msg(dev, cmd, data, len, wait_resp, NULL); 1175ae5ad627SFelix Fietkau } 1176ae5ad627SFelix Fietkau 1177ae5ad627SFelix Fietkau static inline int 1178ae5ad627SFelix Fietkau mt76_mcu_skb_send_msg(struct mt76_dev *dev, struct sk_buff *skb, int cmd, 1179ae5ad627SFelix Fietkau bool wait_resp) 1180ae5ad627SFelix Fietkau { 1181ae5ad627SFelix Fietkau return mt76_mcu_skb_send_and_get_msg(dev, skb, cmd, wait_resp, NULL); 1182ae5ad627SFelix Fietkau } 11839df0fab9SLorenzo Bianconi 11849220f695SLorenzo Bianconi void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set); 11859220f695SLorenzo Bianconi 118617f1de56SFelix Fietkau #endif 1187