18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: ISC */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#ifndef __MT76_H 78c2ecf20Sopenharmony_ci#define __MT76_H 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/kernel.h> 108c2ecf20Sopenharmony_ci#include <linux/io.h> 118c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 128c2ecf20Sopenharmony_ci#include <linux/skbuff.h> 138c2ecf20Sopenharmony_ci#include <linux/leds.h> 148c2ecf20Sopenharmony_ci#include <linux/usb.h> 158c2ecf20Sopenharmony_ci#include <linux/average.h> 168c2ecf20Sopenharmony_ci#include <net/mac80211.h> 178c2ecf20Sopenharmony_ci#include "util.h" 188c2ecf20Sopenharmony_ci#include "testmode.h" 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define MT_MCU_RING_SIZE 32 218c2ecf20Sopenharmony_ci#define MT_RX_BUF_SIZE 2048 228c2ecf20Sopenharmony_ci#define MT_SKB_HEAD_LEN 128 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define MT_MAX_NON_AQL_PKT 16 258c2ecf20Sopenharmony_ci#define MT_TXQ_FREE_THR 32 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistruct mt76_dev; 288c2ecf20Sopenharmony_cistruct mt76_phy; 298c2ecf20Sopenharmony_cistruct mt76_wcid; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistruct mt76_reg_pair { 328c2ecf20Sopenharmony_ci u32 reg; 338c2ecf20Sopenharmony_ci u32 value; 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cienum mt76_bus_type { 378c2ecf20Sopenharmony_ci MT76_BUS_MMIO, 388c2ecf20Sopenharmony_ci MT76_BUS_USB, 398c2ecf20Sopenharmony_ci MT76_BUS_SDIO, 408c2ecf20Sopenharmony_ci}; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_cistruct mt76_bus_ops { 438c2ecf20Sopenharmony_ci u32 (*rr)(struct mt76_dev *dev, u32 offset); 448c2ecf20Sopenharmony_ci void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); 458c2ecf20Sopenharmony_ci u32 (*rmw)(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 468c2ecf20Sopenharmony_ci void (*write_copy)(struct mt76_dev *dev, u32 offset, const void *data, 478c2ecf20Sopenharmony_ci int len); 488c2ecf20Sopenharmony_ci void (*read_copy)(struct mt76_dev *dev, u32 offset, void *data, 498c2ecf20Sopenharmony_ci int len); 508c2ecf20Sopenharmony_ci int (*wr_rp)(struct mt76_dev *dev, u32 base, 518c2ecf20Sopenharmony_ci const struct mt76_reg_pair *rp, int len); 528c2ecf20Sopenharmony_ci int (*rd_rp)(struct mt76_dev *dev, u32 base, 538c2ecf20Sopenharmony_ci struct mt76_reg_pair *rp, int len); 548c2ecf20Sopenharmony_ci enum mt76_bus_type type; 558c2ecf20Sopenharmony_ci}; 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci#define mt76_is_usb(dev) ((dev)->bus->type == MT76_BUS_USB) 588c2ecf20Sopenharmony_ci#define mt76_is_mmio(dev) ((dev)->bus->type == MT76_BUS_MMIO) 598c2ecf20Sopenharmony_ci#define mt76_is_sdio(dev) ((dev)->bus->type == MT76_BUS_SDIO) 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cienum mt76_txq_id { 628c2ecf20Sopenharmony_ci MT_TXQ_VO = IEEE80211_AC_VO, 638c2ecf20Sopenharmony_ci MT_TXQ_VI = IEEE80211_AC_VI, 648c2ecf20Sopenharmony_ci MT_TXQ_BE = IEEE80211_AC_BE, 658c2ecf20Sopenharmony_ci MT_TXQ_BK = IEEE80211_AC_BK, 668c2ecf20Sopenharmony_ci MT_TXQ_PSD, 678c2ecf20Sopenharmony_ci MT_TXQ_MCU, 688c2ecf20Sopenharmony_ci MT_TXQ_MCU_WA, 698c2ecf20Sopenharmony_ci MT_TXQ_BEACON, 708c2ecf20Sopenharmony_ci MT_TXQ_CAB, 718c2ecf20Sopenharmony_ci MT_TXQ_FWDL, 728c2ecf20Sopenharmony_ci __MT_TXQ_MAX 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_cienum mt76_rxq_id { 768c2ecf20Sopenharmony_ci MT_RXQ_MAIN, 778c2ecf20Sopenharmony_ci MT_RXQ_MCU, 788c2ecf20Sopenharmony_ci MT_RXQ_MCU_WA, 798c2ecf20Sopenharmony_ci __MT_RXQ_MAX 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_cistruct mt76_queue_buf { 838c2ecf20Sopenharmony_ci dma_addr_t addr; 848c2ecf20Sopenharmony_ci u16 len; 858c2ecf20Sopenharmony_ci bool skip_unmap; 868c2ecf20Sopenharmony_ci}; 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cistruct mt76_tx_info { 898c2ecf20Sopenharmony_ci struct mt76_queue_buf buf[32]; 908c2ecf20Sopenharmony_ci struct sk_buff *skb; 918c2ecf20Sopenharmony_ci int nbuf; 928c2ecf20Sopenharmony_ci u32 info; 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cistruct mt76_queue_entry { 968c2ecf20Sopenharmony_ci union { 978c2ecf20Sopenharmony_ci void *buf; 988c2ecf20Sopenharmony_ci struct sk_buff *skb; 998c2ecf20Sopenharmony_ci }; 1008c2ecf20Sopenharmony_ci union { 1018c2ecf20Sopenharmony_ci struct mt76_txwi_cache *txwi; 1028c2ecf20Sopenharmony_ci struct urb *urb; 1038c2ecf20Sopenharmony_ci int buf_sz; 1048c2ecf20Sopenharmony_ci }; 1058c2ecf20Sopenharmony_ci u32 dma_addr[2]; 1068c2ecf20Sopenharmony_ci u16 dma_len[2]; 1078c2ecf20Sopenharmony_ci u16 wcid; 1088c2ecf20Sopenharmony_ci bool skip_buf0:1; 1098c2ecf20Sopenharmony_ci bool skip_buf1:1; 1108c2ecf20Sopenharmony_ci bool done:1; 1118c2ecf20Sopenharmony_ci}; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistruct mt76_queue_regs { 1148c2ecf20Sopenharmony_ci u32 desc_base; 1158c2ecf20Sopenharmony_ci u32 ring_size; 1168c2ecf20Sopenharmony_ci u32 cpu_idx; 1178c2ecf20Sopenharmony_ci u32 dma_idx; 1188c2ecf20Sopenharmony_ci} __packed __aligned(4); 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistruct mt76_queue { 1218c2ecf20Sopenharmony_ci struct mt76_queue_regs __iomem *regs; 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci spinlock_t lock; 1248c2ecf20Sopenharmony_ci struct mt76_queue_entry *entry; 1258c2ecf20Sopenharmony_ci struct mt76_desc *desc; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci u16 first; 1288c2ecf20Sopenharmony_ci u16 head; 1298c2ecf20Sopenharmony_ci u16 tail; 1308c2ecf20Sopenharmony_ci int ndesc; 1318c2ecf20Sopenharmony_ci int queued; 1328c2ecf20Sopenharmony_ci int buf_size; 1338c2ecf20Sopenharmony_ci bool stopped; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci u8 buf_offset; 1368c2ecf20Sopenharmony_ci u8 hw_idx; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci dma_addr_t desc_dma; 1398c2ecf20Sopenharmony_ci struct sk_buff *rx_head; 1408c2ecf20Sopenharmony_ci struct page_frag_cache rx_page; 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistruct mt76_mcu_ops { 1448c2ecf20Sopenharmony_ci u32 headroom; 1458c2ecf20Sopenharmony_ci u32 tailroom; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci int (*mcu_send_msg)(struct mt76_dev *dev, int cmd, const void *data, 1488c2ecf20Sopenharmony_ci int len, bool wait_resp); 1498c2ecf20Sopenharmony_ci int (*mcu_skb_send_msg)(struct mt76_dev *dev, struct sk_buff *skb, 1508c2ecf20Sopenharmony_ci int cmd, bool wait_resp); 1518c2ecf20Sopenharmony_ci u32 (*mcu_rr)(struct mt76_dev *dev, u32 offset); 1528c2ecf20Sopenharmony_ci void (*mcu_wr)(struct mt76_dev *dev, u32 offset, u32 val); 1538c2ecf20Sopenharmony_ci int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base, 1548c2ecf20Sopenharmony_ci const struct mt76_reg_pair *rp, int len); 1558c2ecf20Sopenharmony_ci int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base, 1568c2ecf20Sopenharmony_ci struct mt76_reg_pair *rp, int len); 1578c2ecf20Sopenharmony_ci int (*mcu_restart)(struct mt76_dev *dev); 1588c2ecf20Sopenharmony_ci}; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistruct mt76_queue_ops { 1618c2ecf20Sopenharmony_ci int (*init)(struct mt76_dev *dev); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q, 1648c2ecf20Sopenharmony_ci int idx, int n_desc, int bufsize, 1658c2ecf20Sopenharmony_ci u32 ring_base); 1668c2ecf20Sopenharmony_ci 1678c2ecf20Sopenharmony_ci int (*tx_queue_skb)(struct mt76_dev *dev, enum mt76_txq_id qid, 1688c2ecf20Sopenharmony_ci struct sk_buff *skb, struct mt76_wcid *wcid, 1698c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci int (*tx_queue_skb_raw)(struct mt76_dev *dev, enum mt76_txq_id qid, 1728c2ecf20Sopenharmony_ci struct sk_buff *skb, u32 tx_info); 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 1758c2ecf20Sopenharmony_ci int *len, u32 *info, bool *more); 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci void (*tx_cleanup)(struct mt76_dev *dev, enum mt76_txq_id qid, 1808c2ecf20Sopenharmony_ci bool flush); 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 1838c2ecf20Sopenharmony_ci}; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cienum mt76_wcid_flags { 1868c2ecf20Sopenharmony_ci MT_WCID_FLAG_CHECK_PS, 1878c2ecf20Sopenharmony_ci MT_WCID_FLAG_PS, 1888c2ecf20Sopenharmony_ci}; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci#define MT76_N_WCIDS 288 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* stored in ieee80211_tx_info::hw_queue */ 1938c2ecf20Sopenharmony_ci#define MT_TX_HW_QUEUE_EXT_PHY BIT(3) 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ciDECLARE_EWMA(signal, 10, 8); 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci#define MT_WCID_TX_INFO_RATE GENMASK(15, 0) 1988c2ecf20Sopenharmony_ci#define MT_WCID_TX_INFO_NSS GENMASK(17, 16) 1998c2ecf20Sopenharmony_ci#define MT_WCID_TX_INFO_TXPWR_ADJ GENMASK(25, 18) 2008c2ecf20Sopenharmony_ci#define MT_WCID_TX_INFO_SET BIT(31) 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_cistruct mt76_wcid { 2038c2ecf20Sopenharmony_ci struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci atomic_t non_aql_packets; 2068c2ecf20Sopenharmony_ci unsigned long flags; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci struct ewma_signal rssi; 2098c2ecf20Sopenharmony_ci int inactive_count; 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci u16 idx; 2128c2ecf20Sopenharmony_ci u8 hw_key_idx; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci u8 sta:1; 2158c2ecf20Sopenharmony_ci u8 ext_phy:1; 2168c2ecf20Sopenharmony_ci u8 amsdu:1; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci u8 rx_check_pn; 2198c2ecf20Sopenharmony_ci u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 2208c2ecf20Sopenharmony_ci u16 cipher; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci u32 tx_info; 2238c2ecf20Sopenharmony_ci bool sw_iv; 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci u8 packet_id; 2268c2ecf20Sopenharmony_ci}; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistruct mt76_txq { 2298c2ecf20Sopenharmony_ci struct mt76_wcid *wcid; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci u16 agg_ssn; 2328c2ecf20Sopenharmony_ci bool send_bar; 2338c2ecf20Sopenharmony_ci bool aggr; 2348c2ecf20Sopenharmony_ci}; 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_cistruct mt76_txwi_cache { 2378c2ecf20Sopenharmony_ci struct list_head list; 2388c2ecf20Sopenharmony_ci dma_addr_t dma_addr; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci struct sk_buff *skb; 2418c2ecf20Sopenharmony_ci}; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cistruct mt76_rx_tid { 2448c2ecf20Sopenharmony_ci struct rcu_head rcu_head; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci struct mt76_dev *dev; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci spinlock_t lock; 2498c2ecf20Sopenharmony_ci struct delayed_work reorder_work; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci u16 head; 2528c2ecf20Sopenharmony_ci u16 size; 2538c2ecf20Sopenharmony_ci u16 nframes; 2548c2ecf20Sopenharmony_ci 2558c2ecf20Sopenharmony_ci u8 num; 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci u8 started:1, stopped:1, timer_pending:1; 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci struct sk_buff *reorder_buf[]; 2608c2ecf20Sopenharmony_ci}; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci#define MT_TX_CB_DMA_DONE BIT(0) 2638c2ecf20Sopenharmony_ci#define MT_TX_CB_TXS_DONE BIT(1) 2648c2ecf20Sopenharmony_ci#define MT_TX_CB_TXS_FAILED BIT(2) 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci#define MT_PACKET_ID_MASK GENMASK(6, 0) 2678c2ecf20Sopenharmony_ci#define MT_PACKET_ID_NO_ACK 0 2688c2ecf20Sopenharmony_ci#define MT_PACKET_ID_NO_SKB 1 2698c2ecf20Sopenharmony_ci#define MT_PACKET_ID_FIRST 2 2708c2ecf20Sopenharmony_ci#define MT_PACKET_ID_HAS_RATE BIT(7) 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci#define MT_TX_STATUS_SKB_TIMEOUT HZ 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_cistruct mt76_tx_cb { 2758c2ecf20Sopenharmony_ci unsigned long jiffies; 2768c2ecf20Sopenharmony_ci u16 wcid; 2778c2ecf20Sopenharmony_ci u8 pktid; 2788c2ecf20Sopenharmony_ci u8 flags; 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cienum { 2828c2ecf20Sopenharmony_ci MT76_STATE_INITIALIZED, 2838c2ecf20Sopenharmony_ci MT76_STATE_RUNNING, 2848c2ecf20Sopenharmony_ci MT76_STATE_MCU_RUNNING, 2858c2ecf20Sopenharmony_ci MT76_SCANNING, 2868c2ecf20Sopenharmony_ci MT76_HW_SCANNING, 2878c2ecf20Sopenharmony_ci MT76_HW_SCHED_SCANNING, 2888c2ecf20Sopenharmony_ci MT76_RESTART, 2898c2ecf20Sopenharmony_ci MT76_RESET, 2908c2ecf20Sopenharmony_ci MT76_MCU_RESET, 2918c2ecf20Sopenharmony_ci MT76_REMOVED, 2928c2ecf20Sopenharmony_ci MT76_READING_STATS, 2938c2ecf20Sopenharmony_ci MT76_STATE_POWER_OFF, 2948c2ecf20Sopenharmony_ci MT76_STATE_SUSPEND, 2958c2ecf20Sopenharmony_ci MT76_STATE_ROC, 2968c2ecf20Sopenharmony_ci MT76_STATE_PM, 2978c2ecf20Sopenharmony_ci}; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_cistruct mt76_hw_cap { 3008c2ecf20Sopenharmony_ci bool has_2ghz; 3018c2ecf20Sopenharmony_ci bool has_5ghz; 3028c2ecf20Sopenharmony_ci}; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci#define MT_DRV_TXWI_NO_FREE BIT(0) 3058c2ecf20Sopenharmony_ci#define MT_DRV_TX_ALIGNED4_SKBS BIT(1) 3068c2ecf20Sopenharmony_ci#define MT_DRV_SW_RX_AIRTIME BIT(2) 3078c2ecf20Sopenharmony_ci#define MT_DRV_RX_DMA_HDR BIT(3) 3088c2ecf20Sopenharmony_ci#define MT_DRV_HW_MGMT_TXQ BIT(4) 3098c2ecf20Sopenharmony_ci#define MT_DRV_AMSDU_OFFLOAD BIT(5) 3108c2ecf20Sopenharmony_ci 3118c2ecf20Sopenharmony_cistruct mt76_driver_ops { 3128c2ecf20Sopenharmony_ci u32 drv_flags; 3138c2ecf20Sopenharmony_ci u32 survey_flags; 3148c2ecf20Sopenharmony_ci u16 txwi_size; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci void (*update_survey)(struct mt76_dev *dev); 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 3198c2ecf20Sopenharmony_ci enum mt76_txq_id qid, struct mt76_wcid *wcid, 3208c2ecf20Sopenharmony_ci struct ieee80211_sta *sta, 3218c2ecf20Sopenharmony_ci struct mt76_tx_info *tx_info); 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci void (*tx_complete_skb)(struct mt76_dev *dev, 3248c2ecf20Sopenharmony_ci struct mt76_queue_entry *e); 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 3298c2ecf20Sopenharmony_ci struct sk_buff *skb); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_ci void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_ci void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 3348c2ecf20Sopenharmony_ci bool ps); 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3378c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 3388c2ecf20Sopenharmony_ci 3398c2ecf20Sopenharmony_ci void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3408c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_ci void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3438c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 3448c2ecf20Sopenharmony_ci}; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistruct mt76_channel_state { 3478c2ecf20Sopenharmony_ci u64 cc_active; 3488c2ecf20Sopenharmony_ci u64 cc_busy; 3498c2ecf20Sopenharmony_ci u64 cc_rx; 3508c2ecf20Sopenharmony_ci u64 cc_bss_rx; 3518c2ecf20Sopenharmony_ci u64 cc_tx; 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_ci s8 noise; 3548c2ecf20Sopenharmony_ci}; 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_cistruct mt76_sband { 3578c2ecf20Sopenharmony_ci struct ieee80211_supported_band sband; 3588c2ecf20Sopenharmony_ci struct mt76_channel_state *chan; 3598c2ecf20Sopenharmony_ci}; 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_cistruct mt76_rate_power { 3628c2ecf20Sopenharmony_ci union { 3638c2ecf20Sopenharmony_ci struct { 3648c2ecf20Sopenharmony_ci s8 cck[4]; 3658c2ecf20Sopenharmony_ci s8 ofdm[8]; 3668c2ecf20Sopenharmony_ci s8 stbc[10]; 3678c2ecf20Sopenharmony_ci s8 ht[16]; 3688c2ecf20Sopenharmony_ci s8 vht[10]; 3698c2ecf20Sopenharmony_ci }; 3708c2ecf20Sopenharmony_ci s8 all[48]; 3718c2ecf20Sopenharmony_ci }; 3728c2ecf20Sopenharmony_ci}; 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci/* addr req mask */ 3758c2ecf20Sopenharmony_ci#define MT_VEND_TYPE_EEPROM BIT(31) 3768c2ecf20Sopenharmony_ci#define MT_VEND_TYPE_CFG BIT(30) 3778c2ecf20Sopenharmony_ci#define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ci#define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 3808c2ecf20Sopenharmony_cienum mt_vendor_req { 3818c2ecf20Sopenharmony_ci MT_VEND_DEV_MODE = 0x1, 3828c2ecf20Sopenharmony_ci MT_VEND_WRITE = 0x2, 3838c2ecf20Sopenharmony_ci MT_VEND_POWER_ON = 0x4, 3848c2ecf20Sopenharmony_ci MT_VEND_MULTI_WRITE = 0x6, 3858c2ecf20Sopenharmony_ci MT_VEND_MULTI_READ = 0x7, 3868c2ecf20Sopenharmony_ci MT_VEND_READ_EEPROM = 0x9, 3878c2ecf20Sopenharmony_ci MT_VEND_WRITE_FCE = 0x42, 3888c2ecf20Sopenharmony_ci MT_VEND_WRITE_CFG = 0x46, 3898c2ecf20Sopenharmony_ci MT_VEND_READ_CFG = 0x47, 3908c2ecf20Sopenharmony_ci MT_VEND_READ_EXT = 0x63, 3918c2ecf20Sopenharmony_ci MT_VEND_WRITE_EXT = 0x66, 3928c2ecf20Sopenharmony_ci MT_VEND_FEATURE_SET = 0x91, 3938c2ecf20Sopenharmony_ci}; 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_cienum mt76u_in_ep { 3968c2ecf20Sopenharmony_ci MT_EP_IN_PKT_RX, 3978c2ecf20Sopenharmony_ci MT_EP_IN_CMD_RESP, 3988c2ecf20Sopenharmony_ci __MT_EP_IN_MAX, 3998c2ecf20Sopenharmony_ci}; 4008c2ecf20Sopenharmony_ci 4018c2ecf20Sopenharmony_cienum mt76u_out_ep { 4028c2ecf20Sopenharmony_ci MT_EP_OUT_INBAND_CMD, 4038c2ecf20Sopenharmony_ci MT_EP_OUT_AC_BE, 4048c2ecf20Sopenharmony_ci MT_EP_OUT_AC_BK, 4058c2ecf20Sopenharmony_ci MT_EP_OUT_AC_VI, 4068c2ecf20Sopenharmony_ci MT_EP_OUT_AC_VO, 4078c2ecf20Sopenharmony_ci MT_EP_OUT_HCCA, 4088c2ecf20Sopenharmony_ci __MT_EP_OUT_MAX, 4098c2ecf20Sopenharmony_ci}; 4108c2ecf20Sopenharmony_ci 4118c2ecf20Sopenharmony_cistruct mt76_mcu { 4128c2ecf20Sopenharmony_ci struct mutex mutex; 4138c2ecf20Sopenharmony_ci u32 msg_seq; 4148c2ecf20Sopenharmony_ci 4158c2ecf20Sopenharmony_ci struct sk_buff_head res_q; 4168c2ecf20Sopenharmony_ci wait_queue_head_t wait; 4178c2ecf20Sopenharmony_ci}; 4188c2ecf20Sopenharmony_ci 4198c2ecf20Sopenharmony_ci#define MT_TX_SG_MAX_SIZE 8 4208c2ecf20Sopenharmony_ci#define MT_RX_SG_MAX_SIZE 4 4218c2ecf20Sopenharmony_ci#define MT_NUM_TX_ENTRIES 256 4228c2ecf20Sopenharmony_ci#define MT_NUM_RX_ENTRIES 128 4238c2ecf20Sopenharmony_ci#define MCU_RESP_URB_SIZE 1024 4248c2ecf20Sopenharmony_cistruct mt76_usb { 4258c2ecf20Sopenharmony_ci struct mutex usb_ctrl_mtx; 4268c2ecf20Sopenharmony_ci u8 *data; 4278c2ecf20Sopenharmony_ci u16 data_len; 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci struct tasklet_struct rx_tasklet; 4308c2ecf20Sopenharmony_ci struct work_struct stat_work; 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_ci u8 out_ep[__MT_EP_OUT_MAX]; 4338c2ecf20Sopenharmony_ci u8 in_ep[__MT_EP_IN_MAX]; 4348c2ecf20Sopenharmony_ci bool sg_en; 4358c2ecf20Sopenharmony_ci 4368c2ecf20Sopenharmony_ci struct mt76u_mcu { 4378c2ecf20Sopenharmony_ci u8 *data; 4388c2ecf20Sopenharmony_ci /* multiple reads */ 4398c2ecf20Sopenharmony_ci struct mt76_reg_pair *rp; 4408c2ecf20Sopenharmony_ci int rp_len; 4418c2ecf20Sopenharmony_ci u32 base; 4428c2ecf20Sopenharmony_ci bool burst; 4438c2ecf20Sopenharmony_ci } mcu; 4448c2ecf20Sopenharmony_ci}; 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ci#define MT76S_XMIT_BUF_SZ (16 * PAGE_SIZE) 4478c2ecf20Sopenharmony_cistruct mt76_sdio { 4488c2ecf20Sopenharmony_ci struct workqueue_struct *txrx_wq; 4498c2ecf20Sopenharmony_ci struct { 4508c2ecf20Sopenharmony_ci struct work_struct xmit_work; 4518c2ecf20Sopenharmony_ci struct work_struct status_work; 4528c2ecf20Sopenharmony_ci } tx; 4538c2ecf20Sopenharmony_ci struct { 4548c2ecf20Sopenharmony_ci struct work_struct recv_work; 4558c2ecf20Sopenharmony_ci struct work_struct net_work; 4568c2ecf20Sopenharmony_ci } rx; 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_ci struct work_struct stat_work; 4598c2ecf20Sopenharmony_ci 4608c2ecf20Sopenharmony_ci u8 *xmit_buf[MT_TXQ_MCU_WA]; 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci struct sdio_func *func; 4638c2ecf20Sopenharmony_ci void *intr_data; 4648c2ecf20Sopenharmony_ci 4658c2ecf20Sopenharmony_ci struct { 4668c2ecf20Sopenharmony_ci struct mutex lock; 4678c2ecf20Sopenharmony_ci int pse_data_quota; 4688c2ecf20Sopenharmony_ci int ple_data_quota; 4698c2ecf20Sopenharmony_ci int pse_mcu_quota; 4708c2ecf20Sopenharmony_ci int deficit; 4718c2ecf20Sopenharmony_ci } sched; 4728c2ecf20Sopenharmony_ci}; 4738c2ecf20Sopenharmony_ci 4748c2ecf20Sopenharmony_cistruct mt76_mmio { 4758c2ecf20Sopenharmony_ci void __iomem *regs; 4768c2ecf20Sopenharmony_ci spinlock_t irq_lock; 4778c2ecf20Sopenharmony_ci u32 irqmask; 4788c2ecf20Sopenharmony_ci}; 4798c2ecf20Sopenharmony_ci 4808c2ecf20Sopenharmony_cistruct mt76_rx_status { 4818c2ecf20Sopenharmony_ci union { 4828c2ecf20Sopenharmony_ci struct mt76_wcid *wcid; 4838c2ecf20Sopenharmony_ci u16 wcid_idx; 4848c2ecf20Sopenharmony_ci }; 4858c2ecf20Sopenharmony_ci 4868c2ecf20Sopenharmony_ci unsigned long reorder_time; 4878c2ecf20Sopenharmony_ci 4888c2ecf20Sopenharmony_ci u32 ampdu_ref; 4898c2ecf20Sopenharmony_ci 4908c2ecf20Sopenharmony_ci u8 iv[6]; 4918c2ecf20Sopenharmony_ci 4928c2ecf20Sopenharmony_ci u8 ext_phy:1; 4938c2ecf20Sopenharmony_ci u8 aggr:1; 4948c2ecf20Sopenharmony_ci u8 tid; 4958c2ecf20Sopenharmony_ci u16 seqno; 4968c2ecf20Sopenharmony_ci 4978c2ecf20Sopenharmony_ci u16 freq; 4988c2ecf20Sopenharmony_ci u32 flag; 4998c2ecf20Sopenharmony_ci u8 enc_flags; 5008c2ecf20Sopenharmony_ci u8 encoding:2, bw:3, he_ru:3; 5018c2ecf20Sopenharmony_ci u8 he_gi:2, he_dcm:1; 5028c2ecf20Sopenharmony_ci u8 rate_idx; 5038c2ecf20Sopenharmony_ci u8 nss; 5048c2ecf20Sopenharmony_ci u8 band; 5058c2ecf20Sopenharmony_ci s8 signal; 5068c2ecf20Sopenharmony_ci u8 chains; 5078c2ecf20Sopenharmony_ci s8 chain_signal[IEEE80211_MAX_CHAINS]; 5088c2ecf20Sopenharmony_ci}; 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_cistruct mt76_testmode_ops { 5118c2ecf20Sopenharmony_ci int (*set_state)(struct mt76_dev *dev, enum mt76_testmode_state state); 5128c2ecf20Sopenharmony_ci int (*set_params)(struct mt76_dev *dev, struct nlattr **tb, 5138c2ecf20Sopenharmony_ci enum mt76_testmode_state new_state); 5148c2ecf20Sopenharmony_ci int (*dump_stats)(struct mt76_dev *dev, struct sk_buff *msg); 5158c2ecf20Sopenharmony_ci}; 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_cistruct mt76_testmode_data { 5188c2ecf20Sopenharmony_ci enum mt76_testmode_state state; 5198c2ecf20Sopenharmony_ci 5208c2ecf20Sopenharmony_ci u32 param_set[DIV_ROUND_UP(NUM_MT76_TM_ATTRS, 32)]; 5218c2ecf20Sopenharmony_ci struct sk_buff *tx_skb; 5228c2ecf20Sopenharmony_ci 5238c2ecf20Sopenharmony_ci u32 tx_count; 5248c2ecf20Sopenharmony_ci u16 tx_msdu_len; 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci u8 tx_rate_mode; 5278c2ecf20Sopenharmony_ci u8 tx_rate_idx; 5288c2ecf20Sopenharmony_ci u8 tx_rate_nss; 5298c2ecf20Sopenharmony_ci u8 tx_rate_sgi; 5308c2ecf20Sopenharmony_ci u8 tx_rate_ldpc; 5318c2ecf20Sopenharmony_ci 5328c2ecf20Sopenharmony_ci u8 tx_antenna_mask; 5338c2ecf20Sopenharmony_ci 5348c2ecf20Sopenharmony_ci u32 freq_offset; 5358c2ecf20Sopenharmony_ci 5368c2ecf20Sopenharmony_ci u8 tx_power[4]; 5378c2ecf20Sopenharmony_ci u8 tx_power_control; 5388c2ecf20Sopenharmony_ci 5398c2ecf20Sopenharmony_ci const char *mtd_name; 5408c2ecf20Sopenharmony_ci u32 mtd_offset; 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_ci u32 tx_pending; 5438c2ecf20Sopenharmony_ci u32 tx_queued; 5448c2ecf20Sopenharmony_ci u32 tx_done; 5458c2ecf20Sopenharmony_ci struct { 5468c2ecf20Sopenharmony_ci u64 packets[__MT_RXQ_MAX]; 5478c2ecf20Sopenharmony_ci u64 fcs_error[__MT_RXQ_MAX]; 5488c2ecf20Sopenharmony_ci } rx_stats; 5498c2ecf20Sopenharmony_ci}; 5508c2ecf20Sopenharmony_ci 5518c2ecf20Sopenharmony_cistruct mt76_phy { 5528c2ecf20Sopenharmony_ci struct ieee80211_hw *hw; 5538c2ecf20Sopenharmony_ci struct mt76_dev *dev; 5548c2ecf20Sopenharmony_ci void *priv; 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci unsigned long state; 5578c2ecf20Sopenharmony_ci 5588c2ecf20Sopenharmony_ci struct cfg80211_chan_def chandef; 5598c2ecf20Sopenharmony_ci struct ieee80211_channel *main_chan; 5608c2ecf20Sopenharmony_ci 5618c2ecf20Sopenharmony_ci struct mt76_channel_state *chan_state; 5628c2ecf20Sopenharmony_ci ktime_t survey_time; 5638c2ecf20Sopenharmony_ci 5648c2ecf20Sopenharmony_ci struct mt76_hw_cap cap; 5658c2ecf20Sopenharmony_ci struct mt76_sband sband_2g; 5668c2ecf20Sopenharmony_ci struct mt76_sband sband_5g; 5678c2ecf20Sopenharmony_ci 5688c2ecf20Sopenharmony_ci u32 vif_mask; 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci int txpower_cur; 5718c2ecf20Sopenharmony_ci u8 antenna_mask; 5728c2ecf20Sopenharmony_ci}; 5738c2ecf20Sopenharmony_ci 5748c2ecf20Sopenharmony_cistruct mt76_dev { 5758c2ecf20Sopenharmony_ci struct mt76_phy phy; /* must be first */ 5768c2ecf20Sopenharmony_ci 5778c2ecf20Sopenharmony_ci struct mt76_phy *phy2; 5788c2ecf20Sopenharmony_ci 5798c2ecf20Sopenharmony_ci struct ieee80211_hw *hw; 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci spinlock_t lock; 5828c2ecf20Sopenharmony_ci spinlock_t cc_lock; 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ci u32 cur_cc_bss_rx; 5858c2ecf20Sopenharmony_ci 5868c2ecf20Sopenharmony_ci struct mt76_rx_status rx_ampdu_status; 5878c2ecf20Sopenharmony_ci u32 rx_ampdu_len; 5888c2ecf20Sopenharmony_ci u32 rx_ampdu_ref; 5898c2ecf20Sopenharmony_ci 5908c2ecf20Sopenharmony_ci struct mutex mutex; 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci const struct mt76_bus_ops *bus; 5938c2ecf20Sopenharmony_ci const struct mt76_driver_ops *drv; 5948c2ecf20Sopenharmony_ci const struct mt76_mcu_ops *mcu_ops; 5958c2ecf20Sopenharmony_ci struct device *dev; 5968c2ecf20Sopenharmony_ci 5978c2ecf20Sopenharmony_ci struct mt76_mcu mcu; 5988c2ecf20Sopenharmony_ci 5998c2ecf20Sopenharmony_ci struct net_device napi_dev; 6008c2ecf20Sopenharmony_ci spinlock_t rx_lock; 6018c2ecf20Sopenharmony_ci struct napi_struct napi[__MT_RXQ_MAX]; 6028c2ecf20Sopenharmony_ci struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_ci struct list_head txwi_cache; 6058c2ecf20Sopenharmony_ci struct mt76_queue *q_tx[2 * __MT_TXQ_MAX]; 6068c2ecf20Sopenharmony_ci struct mt76_queue q_rx[__MT_RXQ_MAX]; 6078c2ecf20Sopenharmony_ci const struct mt76_queue_ops *queue_ops; 6088c2ecf20Sopenharmony_ci int tx_dma_idx[4]; 6098c2ecf20Sopenharmony_ci 6108c2ecf20Sopenharmony_ci struct mt76_worker tx_worker; 6118c2ecf20Sopenharmony_ci struct napi_struct tx_napi; 6128c2ecf20Sopenharmony_ci struct delayed_work mac_work; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci wait_queue_head_t tx_wait; 6158c2ecf20Sopenharmony_ci struct sk_buff_head status_list; 6168c2ecf20Sopenharmony_ci 6178c2ecf20Sopenharmony_ci u32 wcid_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 6188c2ecf20Sopenharmony_ci u32 wcid_phy_mask[DIV_ROUND_UP(MT76_N_WCIDS, 32)]; 6198c2ecf20Sopenharmony_ci 6208c2ecf20Sopenharmony_ci struct mt76_wcid global_wcid; 6218c2ecf20Sopenharmony_ci struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 6228c2ecf20Sopenharmony_ci 6238c2ecf20Sopenharmony_ci u8 macaddr[ETH_ALEN]; 6248c2ecf20Sopenharmony_ci u32 rev; 6258c2ecf20Sopenharmony_ci 6268c2ecf20Sopenharmony_ci u32 aggr_stats[32]; 6278c2ecf20Sopenharmony_ci 6288c2ecf20Sopenharmony_ci struct tasklet_struct pre_tbtt_tasklet; 6298c2ecf20Sopenharmony_ci int beacon_int; 6308c2ecf20Sopenharmony_ci u8 beacon_mask; 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci struct debugfs_blob_wrapper eeprom; 6338c2ecf20Sopenharmony_ci struct debugfs_blob_wrapper otp; 6348c2ecf20Sopenharmony_ci 6358c2ecf20Sopenharmony_ci struct mt76_rate_power rate_power; 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ci enum nl80211_dfs_regions region; 6388c2ecf20Sopenharmony_ci 6398c2ecf20Sopenharmony_ci u32 debugfs_reg; 6408c2ecf20Sopenharmony_ci 6418c2ecf20Sopenharmony_ci struct led_classdev led_cdev; 6428c2ecf20Sopenharmony_ci char led_name[32]; 6438c2ecf20Sopenharmony_ci bool led_al; 6448c2ecf20Sopenharmony_ci u8 led_pin; 6458c2ecf20Sopenharmony_ci 6468c2ecf20Sopenharmony_ci u8 csa_complete; 6478c2ecf20Sopenharmony_ci 6488c2ecf20Sopenharmony_ci u32 rxfilter; 6498c2ecf20Sopenharmony_ci 6508c2ecf20Sopenharmony_ci#ifdef CONFIG_NL80211_TESTMODE 6518c2ecf20Sopenharmony_ci const struct mt76_testmode_ops *test_ops; 6528c2ecf20Sopenharmony_ci struct mt76_testmode_data test; 6538c2ecf20Sopenharmony_ci#endif 6548c2ecf20Sopenharmony_ci 6558c2ecf20Sopenharmony_ci struct workqueue_struct *wq; 6568c2ecf20Sopenharmony_ci 6578c2ecf20Sopenharmony_ci union { 6588c2ecf20Sopenharmony_ci struct mt76_mmio mmio; 6598c2ecf20Sopenharmony_ci struct mt76_usb usb; 6608c2ecf20Sopenharmony_ci struct mt76_sdio sdio; 6618c2ecf20Sopenharmony_ci }; 6628c2ecf20Sopenharmony_ci}; 6638c2ecf20Sopenharmony_ci 6648c2ecf20Sopenharmony_cienum mt76_phy_type { 6658c2ecf20Sopenharmony_ci MT_PHY_TYPE_CCK, 6668c2ecf20Sopenharmony_ci MT_PHY_TYPE_OFDM, 6678c2ecf20Sopenharmony_ci MT_PHY_TYPE_HT, 6688c2ecf20Sopenharmony_ci MT_PHY_TYPE_HT_GF, 6698c2ecf20Sopenharmony_ci MT_PHY_TYPE_VHT, 6708c2ecf20Sopenharmony_ci MT_PHY_TYPE_HE_SU = 8, 6718c2ecf20Sopenharmony_ci MT_PHY_TYPE_HE_EXT_SU, 6728c2ecf20Sopenharmony_ci MT_PHY_TYPE_HE_TB, 6738c2ecf20Sopenharmony_ci MT_PHY_TYPE_HE_MU, 6748c2ecf20Sopenharmony_ci}; 6758c2ecf20Sopenharmony_ci 6768c2ecf20Sopenharmony_ci#define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 6778c2ecf20Sopenharmony_ci#define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 6788c2ecf20Sopenharmony_ci#define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 6798c2ecf20Sopenharmony_ci#define __mt76_wr_copy(dev, ...) (dev)->bus->write_copy((dev), __VA_ARGS__) 6808c2ecf20Sopenharmony_ci#define __mt76_rr_copy(dev, ...) (dev)->bus->read_copy((dev), __VA_ARGS__) 6818c2ecf20Sopenharmony_ci 6828c2ecf20Sopenharmony_ci#define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 6838c2ecf20Sopenharmony_ci#define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 6848c2ecf20Sopenharmony_ci 6858c2ecf20Sopenharmony_ci#define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 6868c2ecf20Sopenharmony_ci#define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 6878c2ecf20Sopenharmony_ci#define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 6888c2ecf20Sopenharmony_ci#define mt76_wr_copy(dev, ...) (dev)->mt76.bus->write_copy(&((dev)->mt76), __VA_ARGS__) 6898c2ecf20Sopenharmony_ci#define mt76_rr_copy(dev, ...) (dev)->mt76.bus->read_copy(&((dev)->mt76), __VA_ARGS__) 6908c2ecf20Sopenharmony_ci#define mt76_wr_rp(dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__) 6918c2ecf20Sopenharmony_ci#define mt76_rd_rp(dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__) 6928c2ecf20Sopenharmony_ci 6938c2ecf20Sopenharmony_ci#define mt76_mcu_send_msg(dev, ...) (dev)->mt76.mcu_ops->mcu_send_msg(&((dev)->mt76), __VA_ARGS__) 6948c2ecf20Sopenharmony_ci 6958c2ecf20Sopenharmony_ci#define __mt76_mcu_send_msg(dev, ...) (dev)->mcu_ops->mcu_send_msg((dev), __VA_ARGS__) 6968c2ecf20Sopenharmony_ci#define __mt76_mcu_skb_send_msg(dev, ...) (dev)->mcu_ops->mcu_skb_send_msg((dev), __VA_ARGS__) 6978c2ecf20Sopenharmony_ci#define mt76_mcu_restart(dev, ...) (dev)->mt76.mcu_ops->mcu_restart(&((dev)->mt76)) 6988c2ecf20Sopenharmony_ci#define __mt76_mcu_restart(dev, ...) (dev)->mcu_ops->mcu_restart((dev)) 6998c2ecf20Sopenharmony_ci 7008c2ecf20Sopenharmony_ci#define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 7018c2ecf20Sopenharmony_ci#define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 7028c2ecf20Sopenharmony_ci 7038c2ecf20Sopenharmony_ci#define mt76_get_field(_dev, _reg, _field) \ 7048c2ecf20Sopenharmony_ci FIELD_GET(_field, mt76_rr(dev, _reg)) 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci#define mt76_rmw_field(_dev, _reg, _field, _val) \ 7078c2ecf20Sopenharmony_ci mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 7088c2ecf20Sopenharmony_ci 7098c2ecf20Sopenharmony_ci#define __mt76_rmw_field(_dev, _reg, _field, _val) \ 7108c2ecf20Sopenharmony_ci __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ci#define mt76_hw(dev) (dev)->mphy.hw 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_cistatic inline struct ieee80211_hw * 7158c2ecf20Sopenharmony_cimt76_wcid_hw(struct mt76_dev *dev, u16 wcid) 7168c2ecf20Sopenharmony_ci{ 7178c2ecf20Sopenharmony_ci if (wcid <= MT76_N_WCIDS && 7188c2ecf20Sopenharmony_ci mt76_wcid_mask_test(dev->wcid_phy_mask, wcid)) 7198c2ecf20Sopenharmony_ci return dev->phy2->hw; 7208c2ecf20Sopenharmony_ci 7218c2ecf20Sopenharmony_ci return dev->phy.hw; 7228c2ecf20Sopenharmony_ci} 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_cibool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 7258c2ecf20Sopenharmony_ci int timeout); 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci#define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_cibool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 7308c2ecf20Sopenharmony_ci int timeout); 7318c2ecf20Sopenharmony_ci 7328c2ecf20Sopenharmony_ci#define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 7338c2ecf20Sopenharmony_ci 7348c2ecf20Sopenharmony_civoid mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 7358c2ecf20Sopenharmony_civoid mt76_pci_disable_aspm(struct pci_dev *pdev); 7368c2ecf20Sopenharmony_ci 7378c2ecf20Sopenharmony_cistatic inline u16 mt76_chip(struct mt76_dev *dev) 7388c2ecf20Sopenharmony_ci{ 7398c2ecf20Sopenharmony_ci return dev->rev >> 16; 7408c2ecf20Sopenharmony_ci} 7418c2ecf20Sopenharmony_ci 7428c2ecf20Sopenharmony_cistatic inline u16 mt76_rev(struct mt76_dev *dev) 7438c2ecf20Sopenharmony_ci{ 7448c2ecf20Sopenharmony_ci return dev->rev & 0xffff; 7458c2ecf20Sopenharmony_ci} 7468c2ecf20Sopenharmony_ci 7478c2ecf20Sopenharmony_ci#define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 7488c2ecf20Sopenharmony_ci#define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 7498c2ecf20Sopenharmony_ci 7508c2ecf20Sopenharmony_ci#define mt76_init_queues(dev) (dev)->mt76.queue_ops->init(&((dev)->mt76)) 7518c2ecf20Sopenharmony_ci#define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 7528c2ecf20Sopenharmony_ci#define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__) 7538c2ecf20Sopenharmony_ci#define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__) 7548c2ecf20Sopenharmony_ci#define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 7558c2ecf20Sopenharmony_ci#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 7568c2ecf20Sopenharmony_ci#define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_ci#define mt76_for_each_q_rx(dev, i) \ 7598c2ecf20Sopenharmony_ci for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \ 7608c2ecf20Sopenharmony_ci (dev)->q_rx[i].ndesc; i++) 7618c2ecf20Sopenharmony_ci 7628c2ecf20Sopenharmony_cistruct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, 7638c2ecf20Sopenharmony_ci const struct ieee80211_ops *ops, 7648c2ecf20Sopenharmony_ci const struct mt76_driver_ops *drv_ops); 7658c2ecf20Sopenharmony_ciint mt76_register_device(struct mt76_dev *dev, bool vht, 7668c2ecf20Sopenharmony_ci struct ieee80211_rate *rates, int n_rates); 7678c2ecf20Sopenharmony_civoid mt76_unregister_device(struct mt76_dev *dev); 7688c2ecf20Sopenharmony_civoid mt76_free_device(struct mt76_dev *dev); 7698c2ecf20Sopenharmony_civoid mt76_unregister_phy(struct mt76_phy *phy); 7708c2ecf20Sopenharmony_ci 7718c2ecf20Sopenharmony_cistruct mt76_phy *mt76_alloc_phy(struct mt76_dev *dev, unsigned int size, 7728c2ecf20Sopenharmony_ci const struct ieee80211_ops *ops); 7738c2ecf20Sopenharmony_ciint mt76_register_phy(struct mt76_phy *phy); 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_cistruct dentry *mt76_register_debugfs(struct mt76_dev *dev); 7768c2ecf20Sopenharmony_ciint mt76_queues_read(struct seq_file *s, void *data); 7778c2ecf20Sopenharmony_civoid mt76_seq_puts_array(struct seq_file *file, const char *str, 7788c2ecf20Sopenharmony_ci s8 *val, int len); 7798c2ecf20Sopenharmony_ci 7808c2ecf20Sopenharmony_ciint mt76_eeprom_init(struct mt76_dev *dev, int len); 7818c2ecf20Sopenharmony_civoid mt76_eeprom_override(struct mt76_dev *dev); 7828c2ecf20Sopenharmony_ci 7838c2ecf20Sopenharmony_cistatic inline struct mt76_phy * 7848c2ecf20Sopenharmony_cimt76_dev_phy(struct mt76_dev *dev, bool phy_ext) 7858c2ecf20Sopenharmony_ci{ 7868c2ecf20Sopenharmony_ci if (phy_ext && dev->phy2) 7878c2ecf20Sopenharmony_ci return dev->phy2; 7888c2ecf20Sopenharmony_ci return &dev->phy; 7898c2ecf20Sopenharmony_ci} 7908c2ecf20Sopenharmony_ci 7918c2ecf20Sopenharmony_cistatic inline struct ieee80211_hw * 7928c2ecf20Sopenharmony_cimt76_phy_hw(struct mt76_dev *dev, bool phy_ext) 7938c2ecf20Sopenharmony_ci{ 7948c2ecf20Sopenharmony_ci return mt76_dev_phy(dev, phy_ext)->hw; 7958c2ecf20Sopenharmony_ci} 7968c2ecf20Sopenharmony_ci 7978c2ecf20Sopenharmony_cistatic inline u8 * 7988c2ecf20Sopenharmony_cimt76_get_txwi_ptr(struct mt76_dev *dev, struct mt76_txwi_cache *t) 7998c2ecf20Sopenharmony_ci{ 8008c2ecf20Sopenharmony_ci return (u8 *)t - dev->drv->txwi_size; 8018c2ecf20Sopenharmony_ci} 8028c2ecf20Sopenharmony_ci 8038c2ecf20Sopenharmony_ci/* increment with wrap-around */ 8048c2ecf20Sopenharmony_cistatic inline int mt76_incr(int val, int size) 8058c2ecf20Sopenharmony_ci{ 8068c2ecf20Sopenharmony_ci return (val + 1) & (size - 1); 8078c2ecf20Sopenharmony_ci} 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_ci/* decrement with wrap-around */ 8108c2ecf20Sopenharmony_cistatic inline int mt76_decr(int val, int size) 8118c2ecf20Sopenharmony_ci{ 8128c2ecf20Sopenharmony_ci return (val - 1) & (size - 1); 8138c2ecf20Sopenharmony_ci} 8148c2ecf20Sopenharmony_ci 8158c2ecf20Sopenharmony_ciu8 mt76_ac_to_hwq(u8 ac); 8168c2ecf20Sopenharmony_ci 8178c2ecf20Sopenharmony_cistatic inline struct ieee80211_txq * 8188c2ecf20Sopenharmony_cimtxq_to_txq(struct mt76_txq *mtxq) 8198c2ecf20Sopenharmony_ci{ 8208c2ecf20Sopenharmony_ci void *ptr = mtxq; 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci return container_of(ptr, struct ieee80211_txq, drv_priv); 8238c2ecf20Sopenharmony_ci} 8248c2ecf20Sopenharmony_ci 8258c2ecf20Sopenharmony_cistatic inline struct ieee80211_sta * 8268c2ecf20Sopenharmony_ciwcid_to_sta(struct mt76_wcid *wcid) 8278c2ecf20Sopenharmony_ci{ 8288c2ecf20Sopenharmony_ci void *ptr = wcid; 8298c2ecf20Sopenharmony_ci 8308c2ecf20Sopenharmony_ci if (!wcid || !wcid->sta) 8318c2ecf20Sopenharmony_ci return NULL; 8328c2ecf20Sopenharmony_ci 8338c2ecf20Sopenharmony_ci return container_of(ptr, struct ieee80211_sta, drv_priv); 8348c2ecf20Sopenharmony_ci} 8358c2ecf20Sopenharmony_ci 8368c2ecf20Sopenharmony_cistatic inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb) 8378c2ecf20Sopenharmony_ci{ 8388c2ecf20Sopenharmony_ci BUILD_BUG_ON(sizeof(struct mt76_tx_cb) > 8398c2ecf20Sopenharmony_ci sizeof(IEEE80211_SKB_CB(skb)->status.status_driver_data)); 8408c2ecf20Sopenharmony_ci return ((void *)IEEE80211_SKB_CB(skb)->status.status_driver_data); 8418c2ecf20Sopenharmony_ci} 8428c2ecf20Sopenharmony_ci 8438c2ecf20Sopenharmony_cistatic inline void *mt76_skb_get_hdr(struct sk_buff *skb) 8448c2ecf20Sopenharmony_ci{ 8458c2ecf20Sopenharmony_ci struct mt76_rx_status mstat; 8468c2ecf20Sopenharmony_ci u8 *data = skb->data; 8478c2ecf20Sopenharmony_ci 8488c2ecf20Sopenharmony_ci /* Alignment concerns */ 8498c2ecf20Sopenharmony_ci BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4); 8508c2ecf20Sopenharmony_ci BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4); 8518c2ecf20Sopenharmony_ci 8528c2ecf20Sopenharmony_ci mstat = *((struct mt76_rx_status *)skb->cb); 8538c2ecf20Sopenharmony_ci 8548c2ecf20Sopenharmony_ci if (mstat.flag & RX_FLAG_RADIOTAP_HE) 8558c2ecf20Sopenharmony_ci data += sizeof(struct ieee80211_radiotap_he); 8568c2ecf20Sopenharmony_ci if (mstat.flag & RX_FLAG_RADIOTAP_HE_MU) 8578c2ecf20Sopenharmony_ci data += sizeof(struct ieee80211_radiotap_he_mu); 8588c2ecf20Sopenharmony_ci 8598c2ecf20Sopenharmony_ci return data; 8608c2ecf20Sopenharmony_ci} 8618c2ecf20Sopenharmony_ci 8628c2ecf20Sopenharmony_cistatic inline void mt76_insert_hdr_pad(struct sk_buff *skb) 8638c2ecf20Sopenharmony_ci{ 8648c2ecf20Sopenharmony_ci int len = ieee80211_get_hdrlen_from_skb(skb); 8658c2ecf20Sopenharmony_ci 8668c2ecf20Sopenharmony_ci if (len % 4 == 0) 8678c2ecf20Sopenharmony_ci return; 8688c2ecf20Sopenharmony_ci 8698c2ecf20Sopenharmony_ci skb_push(skb, 2); 8708c2ecf20Sopenharmony_ci memmove(skb->data, skb->data + 2, len); 8718c2ecf20Sopenharmony_ci 8728c2ecf20Sopenharmony_ci skb->data[len] = 0; 8738c2ecf20Sopenharmony_ci skb->data[len + 1] = 0; 8748c2ecf20Sopenharmony_ci} 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_cistatic inline bool mt76_is_skb_pktid(u8 pktid) 8778c2ecf20Sopenharmony_ci{ 8788c2ecf20Sopenharmony_ci if (pktid & MT_PACKET_ID_HAS_RATE) 8798c2ecf20Sopenharmony_ci return false; 8808c2ecf20Sopenharmony_ci 8818c2ecf20Sopenharmony_ci return pktid >= MT_PACKET_ID_FIRST; 8828c2ecf20Sopenharmony_ci} 8838c2ecf20Sopenharmony_ci 8848c2ecf20Sopenharmony_cistatic inline u8 mt76_tx_power_nss_delta(u8 nss) 8858c2ecf20Sopenharmony_ci{ 8868c2ecf20Sopenharmony_ci static const u8 nss_delta[4] = { 0, 6, 9, 12 }; 8878c2ecf20Sopenharmony_ci u8 idx = nss - 1; 8888c2ecf20Sopenharmony_ci 8898c2ecf20Sopenharmony_ci return (idx < ARRAY_SIZE(nss_delta)) ? nss_delta[idx] : 0; 8908c2ecf20Sopenharmony_ci} 8918c2ecf20Sopenharmony_ci 8928c2ecf20Sopenharmony_cistatic inline bool mt76_testmode_enabled(struct mt76_dev *dev) 8938c2ecf20Sopenharmony_ci{ 8948c2ecf20Sopenharmony_ci#ifdef CONFIG_NL80211_TESTMODE 8958c2ecf20Sopenharmony_ci return dev->test.state != MT76_TM_STATE_OFF; 8968c2ecf20Sopenharmony_ci#else 8978c2ecf20Sopenharmony_ci return false; 8988c2ecf20Sopenharmony_ci#endif 8998c2ecf20Sopenharmony_ci} 9008c2ecf20Sopenharmony_ci 9018c2ecf20Sopenharmony_civoid mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 9028c2ecf20Sopenharmony_civoid mt76_tx(struct mt76_phy *dev, struct ieee80211_sta *sta, 9038c2ecf20Sopenharmony_ci struct mt76_wcid *wcid, struct sk_buff *skb); 9048c2ecf20Sopenharmony_civoid mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 9058c2ecf20Sopenharmony_civoid mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta, 9068c2ecf20Sopenharmony_ci bool send_bar); 9078c2ecf20Sopenharmony_civoid mt76_tx_check_agg_ssn(struct ieee80211_sta *sta, struct sk_buff *skb); 9088c2ecf20Sopenharmony_civoid mt76_txq_schedule(struct mt76_phy *phy, enum mt76_txq_id qid); 9098c2ecf20Sopenharmony_civoid mt76_txq_schedule_all(struct mt76_phy *phy); 9108c2ecf20Sopenharmony_civoid mt76_tx_worker(struct mt76_worker *w); 9118c2ecf20Sopenharmony_civoid mt76_release_buffered_frames(struct ieee80211_hw *hw, 9128c2ecf20Sopenharmony_ci struct ieee80211_sta *sta, 9138c2ecf20Sopenharmony_ci u16 tids, int nframes, 9148c2ecf20Sopenharmony_ci enum ieee80211_frame_release_type reason, 9158c2ecf20Sopenharmony_ci bool more_data); 9168c2ecf20Sopenharmony_cibool mt76_has_tx_pending(struct mt76_phy *phy); 9178c2ecf20Sopenharmony_civoid mt76_set_channel(struct mt76_phy *phy); 9188c2ecf20Sopenharmony_civoid mt76_update_survey(struct mt76_dev *dev); 9198c2ecf20Sopenharmony_civoid mt76_update_survey_active_time(struct mt76_phy *phy, ktime_t time); 9208c2ecf20Sopenharmony_ciint mt76_get_survey(struct ieee80211_hw *hw, int idx, 9218c2ecf20Sopenharmony_ci struct survey_info *survey); 9228c2ecf20Sopenharmony_civoid mt76_set_stream_caps(struct mt76_phy *phy, bool vht); 9238c2ecf20Sopenharmony_ci 9248c2ecf20Sopenharmony_ciint mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 9258c2ecf20Sopenharmony_ci u16 ssn, u16 size); 9268c2ecf20Sopenharmony_civoid mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 9278c2ecf20Sopenharmony_ci 9288c2ecf20Sopenharmony_civoid mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 9298c2ecf20Sopenharmony_ci struct ieee80211_key_conf *key); 9308c2ecf20Sopenharmony_ci 9318c2ecf20Sopenharmony_civoid mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 9328c2ecf20Sopenharmony_ci __acquires(&dev->status_list.lock); 9338c2ecf20Sopenharmony_civoid mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 9348c2ecf20Sopenharmony_ci __releases(&dev->status_list.lock); 9358c2ecf20Sopenharmony_ci 9368c2ecf20Sopenharmony_ciint mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 9378c2ecf20Sopenharmony_ci struct sk_buff *skb); 9388c2ecf20Sopenharmony_cistruct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev, 9398c2ecf20Sopenharmony_ci struct mt76_wcid *wcid, int pktid, 9408c2ecf20Sopenharmony_ci struct sk_buff_head *list); 9418c2ecf20Sopenharmony_civoid mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, 9428c2ecf20Sopenharmony_ci struct sk_buff_head *list); 9438c2ecf20Sopenharmony_civoid mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb); 9448c2ecf20Sopenharmony_civoid mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, 9458c2ecf20Sopenharmony_ci bool flush); 9468c2ecf20Sopenharmony_ciint mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 9478c2ecf20Sopenharmony_ci struct ieee80211_sta *sta, 9488c2ecf20Sopenharmony_ci enum ieee80211_sta_state old_state, 9498c2ecf20Sopenharmony_ci enum ieee80211_sta_state new_state); 9508c2ecf20Sopenharmony_civoid __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif, 9518c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 9528c2ecf20Sopenharmony_civoid mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 9538c2ecf20Sopenharmony_ci struct ieee80211_sta *sta); 9548c2ecf20Sopenharmony_ci 9558c2ecf20Sopenharmony_ciint mt76_get_min_avg_rssi(struct mt76_dev *dev, bool ext_phy); 9568c2ecf20Sopenharmony_ci 9578c2ecf20Sopenharmony_ciint mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 9588c2ecf20Sopenharmony_ci int *dbm); 9598c2ecf20Sopenharmony_ci 9608c2ecf20Sopenharmony_civoid mt76_csa_check(struct mt76_dev *dev); 9618c2ecf20Sopenharmony_civoid mt76_csa_finish(struct mt76_dev *dev); 9628c2ecf20Sopenharmony_ci 9638c2ecf20Sopenharmony_ciint mt76_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant); 9648c2ecf20Sopenharmony_ciint mt76_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set); 9658c2ecf20Sopenharmony_civoid mt76_insert_ccmp_hdr(struct sk_buff *skb, u8 key_id); 9668c2ecf20Sopenharmony_ciint mt76_get_rate(struct mt76_dev *dev, 9678c2ecf20Sopenharmony_ci struct ieee80211_supported_band *sband, 9688c2ecf20Sopenharmony_ci int idx, bool cck); 9698c2ecf20Sopenharmony_civoid mt76_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 9708c2ecf20Sopenharmony_ci const u8 *mac); 9718c2ecf20Sopenharmony_civoid mt76_sw_scan_complete(struct ieee80211_hw *hw, 9728c2ecf20Sopenharmony_ci struct ieee80211_vif *vif); 9738c2ecf20Sopenharmony_ciint mt76_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 9748c2ecf20Sopenharmony_ci void *data, int len); 9758c2ecf20Sopenharmony_ciint mt76_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *skb, 9768c2ecf20Sopenharmony_ci struct netlink_callback *cb, void *data, int len); 9778c2ecf20Sopenharmony_ciint mt76_testmode_set_state(struct mt76_dev *dev, enum mt76_testmode_state state); 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_cistatic inline void mt76_testmode_reset(struct mt76_dev *dev, bool disable) 9808c2ecf20Sopenharmony_ci{ 9818c2ecf20Sopenharmony_ci#ifdef CONFIG_NL80211_TESTMODE 9828c2ecf20Sopenharmony_ci enum mt76_testmode_state state = MT76_TM_STATE_IDLE; 9838c2ecf20Sopenharmony_ci 9848c2ecf20Sopenharmony_ci if (disable || dev->test.state == MT76_TM_STATE_OFF) 9858c2ecf20Sopenharmony_ci state = MT76_TM_STATE_OFF; 9868c2ecf20Sopenharmony_ci 9878c2ecf20Sopenharmony_ci mt76_testmode_set_state(dev, state); 9888c2ecf20Sopenharmony_ci#endif 9898c2ecf20Sopenharmony_ci} 9908c2ecf20Sopenharmony_ci 9918c2ecf20Sopenharmony_ci 9928c2ecf20Sopenharmony_ci/* internal */ 9938c2ecf20Sopenharmony_cistatic inline struct ieee80211_hw * 9948c2ecf20Sopenharmony_cimt76_tx_status_get_hw(struct mt76_dev *dev, struct sk_buff *skb) 9958c2ecf20Sopenharmony_ci{ 9968c2ecf20Sopenharmony_ci struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 9978c2ecf20Sopenharmony_ci struct ieee80211_hw *hw = dev->phy.hw; 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ci if ((info->hw_queue & MT_TX_HW_QUEUE_EXT_PHY) && dev->phy2) 10008c2ecf20Sopenharmony_ci hw = dev->phy2->hw; 10018c2ecf20Sopenharmony_ci 10028c2ecf20Sopenharmony_ci info->hw_queue &= ~MT_TX_HW_QUEUE_EXT_PHY; 10038c2ecf20Sopenharmony_ci 10048c2ecf20Sopenharmony_ci return hw; 10058c2ecf20Sopenharmony_ci} 10068c2ecf20Sopenharmony_ci 10078c2ecf20Sopenharmony_civoid mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 10088c2ecf20Sopenharmony_civoid mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 10098c2ecf20Sopenharmony_ci struct napi_struct *napi); 10108c2ecf20Sopenharmony_civoid mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 10118c2ecf20Sopenharmony_ci struct napi_struct *napi); 10128c2ecf20Sopenharmony_civoid mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 10138c2ecf20Sopenharmony_civoid mt76_testmode_tx_pending(struct mt76_dev *dev); 10148c2ecf20Sopenharmony_civoid mt76_queue_tx_complete(struct mt76_dev *dev, struct mt76_queue *q, 10158c2ecf20Sopenharmony_ci struct mt76_queue_entry *e); 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci/* usb */ 10188c2ecf20Sopenharmony_cistatic inline bool mt76u_urb_error(struct urb *urb) 10198c2ecf20Sopenharmony_ci{ 10208c2ecf20Sopenharmony_ci return urb->status && 10218c2ecf20Sopenharmony_ci urb->status != -ECONNRESET && 10228c2ecf20Sopenharmony_ci urb->status != -ESHUTDOWN && 10238c2ecf20Sopenharmony_ci urb->status != -ENOENT; 10248c2ecf20Sopenharmony_ci} 10258c2ecf20Sopenharmony_ci 10268c2ecf20Sopenharmony_ci/* Map hardware queues to usb endpoints */ 10278c2ecf20Sopenharmony_cistatic inline u8 q2ep(u8 qid) 10288c2ecf20Sopenharmony_ci{ 10298c2ecf20Sopenharmony_ci /* TODO: take management packets to queue 5 */ 10308c2ecf20Sopenharmony_ci return qid + 1; 10318c2ecf20Sopenharmony_ci} 10328c2ecf20Sopenharmony_ci 10338c2ecf20Sopenharmony_cistatic inline int 10348c2ecf20Sopenharmony_cimt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, 10358c2ecf20Sopenharmony_ci int timeout, int ep) 10368c2ecf20Sopenharmony_ci{ 10378c2ecf20Sopenharmony_ci struct usb_interface *uintf = to_usb_interface(dev->dev); 10388c2ecf20Sopenharmony_ci struct usb_device *udev = interface_to_usbdev(uintf); 10398c2ecf20Sopenharmony_ci struct mt76_usb *usb = &dev->usb; 10408c2ecf20Sopenharmony_ci unsigned int pipe; 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_ci if (actual_len) 10438c2ecf20Sopenharmony_ci pipe = usb_rcvbulkpipe(udev, usb->in_ep[ep]); 10448c2ecf20Sopenharmony_ci else 10458c2ecf20Sopenharmony_ci pipe = usb_sndbulkpipe(udev, usb->out_ep[ep]); 10468c2ecf20Sopenharmony_ci 10478c2ecf20Sopenharmony_ci return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 10488c2ecf20Sopenharmony_ci} 10498c2ecf20Sopenharmony_ci 10508c2ecf20Sopenharmony_ciint mt76_skb_adjust_pad(struct sk_buff *skb, int pad); 10518c2ecf20Sopenharmony_ciint mt76u_vendor_request(struct mt76_dev *dev, u8 req, 10528c2ecf20Sopenharmony_ci u8 req_type, u16 val, u16 offset, 10538c2ecf20Sopenharmony_ci void *buf, size_t len); 10548c2ecf20Sopenharmony_civoid mt76u_single_wr(struct mt76_dev *dev, const u8 req, 10558c2ecf20Sopenharmony_ci const u16 offset, const u32 val); 10568c2ecf20Sopenharmony_ciint mt76u_init(struct mt76_dev *dev, struct usb_interface *intf, 10578c2ecf20Sopenharmony_ci bool ext); 10588c2ecf20Sopenharmony_ciint mt76u_alloc_mcu_queue(struct mt76_dev *dev); 10598c2ecf20Sopenharmony_ciint mt76u_alloc_queues(struct mt76_dev *dev); 10608c2ecf20Sopenharmony_civoid mt76u_stop_tx(struct mt76_dev *dev); 10618c2ecf20Sopenharmony_civoid mt76u_stop_rx(struct mt76_dev *dev); 10628c2ecf20Sopenharmony_ciint mt76u_resume_rx(struct mt76_dev *dev); 10638c2ecf20Sopenharmony_civoid mt76u_queues_deinit(struct mt76_dev *dev); 10648c2ecf20Sopenharmony_ci 10658c2ecf20Sopenharmony_ciint mt76s_init(struct mt76_dev *dev, struct sdio_func *func, 10668c2ecf20Sopenharmony_ci const struct mt76_bus_ops *bus_ops); 10678c2ecf20Sopenharmony_ciint mt76s_alloc_queues(struct mt76_dev *dev); 10688c2ecf20Sopenharmony_civoid mt76s_stop_txrx(struct mt76_dev *dev); 10698c2ecf20Sopenharmony_civoid mt76s_deinit(struct mt76_dev *dev); 10708c2ecf20Sopenharmony_ci 10718c2ecf20Sopenharmony_cistruct sk_buff * 10728c2ecf20Sopenharmony_cimt76_mcu_msg_alloc(struct mt76_dev *dev, const void *data, 10738c2ecf20Sopenharmony_ci int data_len); 10748c2ecf20Sopenharmony_civoid mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb); 10758c2ecf20Sopenharmony_cistruct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 10768c2ecf20Sopenharmony_ci unsigned long expires); 10778c2ecf20Sopenharmony_ci 10788c2ecf20Sopenharmony_civoid mt76_set_irq_mask(struct mt76_dev *dev, u32 addr, u32 clear, u32 set); 10798c2ecf20Sopenharmony_ci 10808c2ecf20Sopenharmony_ci#endif 1081