117f1de56SFelix Fietkau /* 217f1de56SFelix Fietkau * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name> 317f1de56SFelix Fietkau * 417f1de56SFelix Fietkau * Permission to use, copy, modify, and/or distribute this software for any 517f1de56SFelix Fietkau * purpose with or without fee is hereby granted, provided that the above 617f1de56SFelix Fietkau * copyright notice and this permission notice appear in all copies. 717f1de56SFelix Fietkau * 817f1de56SFelix Fietkau * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 917f1de56SFelix Fietkau * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1017f1de56SFelix Fietkau * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1117f1de56SFelix Fietkau * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1217f1de56SFelix Fietkau * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1317f1de56SFelix Fietkau * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1417f1de56SFelix Fietkau * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1517f1de56SFelix Fietkau */ 1617f1de56SFelix Fietkau 1717f1de56SFelix Fietkau #ifndef __MT76_H 1817f1de56SFelix Fietkau #define __MT76_H 1917f1de56SFelix Fietkau 2017f1de56SFelix Fietkau #include <linux/kernel.h> 2117f1de56SFelix Fietkau #include <linux/io.h> 2217f1de56SFelix Fietkau #include <linux/spinlock.h> 2317f1de56SFelix Fietkau #include <linux/skbuff.h> 2417f1de56SFelix Fietkau #include <linux/leds.h> 25b40b15e1SLorenzo Bianconi #include <linux/usb.h> 26ef13edc0SFelix Fietkau #include <linux/average.h> 2717f1de56SFelix Fietkau #include <net/mac80211.h> 2817f1de56SFelix Fietkau #include "util.h" 2917f1de56SFelix Fietkau 3017f1de56SFelix Fietkau #define MT_TX_RING_SIZE 256 3117f1de56SFelix Fietkau #define MT_MCU_RING_SIZE 32 3217f1de56SFelix Fietkau #define MT_RX_BUF_SIZE 2048 3317f1de56SFelix Fietkau 3417f1de56SFelix Fietkau struct mt76_dev; 35469d4818SLorenzo Bianconi struct mt76_wcid; 3617f1de56SFelix Fietkau 376da5a291SStanislaw Gruszka struct mt76_reg_pair { 386da5a291SStanislaw Gruszka u32 reg; 396da5a291SStanislaw Gruszka u32 value; 406da5a291SStanislaw Gruszka }; 416da5a291SStanislaw Gruszka 42c50479faSStanislaw Gruszka enum mt76_bus_type { 43c50479faSStanislaw Gruszka MT76_BUS_MMIO, 44c50479faSStanislaw Gruszka MT76_BUS_USB, 45c50479faSStanislaw Gruszka }; 46c50479faSStanislaw Gruszka 4717f1de56SFelix Fietkau struct mt76_bus_ops { 4817f1de56SFelix Fietkau u32 (*rr)(struct mt76_dev *dev, u32 offset); 4917f1de56SFelix Fietkau void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); 5017f1de56SFelix Fietkau u32 (*rmw)(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 5117f1de56SFelix Fietkau void (*copy)(struct mt76_dev *dev, u32 offset, const void *data, 5217f1de56SFelix Fietkau int len); 536da5a291SStanislaw Gruszka int (*wr_rp)(struct mt76_dev *dev, u32 base, 546da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 556da5a291SStanislaw Gruszka int (*rd_rp)(struct mt76_dev *dev, u32 base, 566da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 57c50479faSStanislaw Gruszka enum mt76_bus_type type; 5817f1de56SFelix Fietkau }; 5917f1de56SFelix Fietkau 60c50479faSStanislaw Gruszka #define mt76_is_usb(dev) ((dev)->mt76.bus->type == MT76_BUS_USB) 61c50479faSStanislaw Gruszka #define mt76_is_mmio(dev) ((dev)->mt76.bus->type == MT76_BUS_MMIO) 62c50479faSStanislaw Gruszka 6317f1de56SFelix Fietkau enum mt76_txq_id { 6417f1de56SFelix Fietkau MT_TXQ_VO = IEEE80211_AC_VO, 6517f1de56SFelix Fietkau MT_TXQ_VI = IEEE80211_AC_VI, 6617f1de56SFelix Fietkau MT_TXQ_BE = IEEE80211_AC_BE, 6717f1de56SFelix Fietkau MT_TXQ_BK = IEEE80211_AC_BK, 6817f1de56SFelix Fietkau MT_TXQ_PSD, 6917f1de56SFelix Fietkau MT_TXQ_MCU, 7017f1de56SFelix Fietkau MT_TXQ_BEACON, 7117f1de56SFelix Fietkau MT_TXQ_CAB, 7217f1de56SFelix Fietkau __MT_TXQ_MAX 7317f1de56SFelix Fietkau }; 7417f1de56SFelix Fietkau 7517f1de56SFelix Fietkau enum mt76_rxq_id { 7617f1de56SFelix Fietkau MT_RXQ_MAIN, 7717f1de56SFelix Fietkau MT_RXQ_MCU, 7817f1de56SFelix Fietkau __MT_RXQ_MAX 7917f1de56SFelix Fietkau }; 8017f1de56SFelix Fietkau 8117f1de56SFelix Fietkau struct mt76_queue_buf { 8217f1de56SFelix Fietkau dma_addr_t addr; 8317f1de56SFelix Fietkau int len; 8417f1de56SFelix Fietkau }; 8517f1de56SFelix Fietkau 86b40b15e1SLorenzo Bianconi struct mt76u_buf { 87b40b15e1SLorenzo Bianconi struct mt76_dev *dev; 88b40b15e1SLorenzo Bianconi struct urb *urb; 89b40b15e1SLorenzo Bianconi size_t len; 90d704d16fSLorenzo Bianconi void *buf; 91b40b15e1SLorenzo Bianconi bool done; 92b40b15e1SLorenzo Bianconi }; 93b40b15e1SLorenzo Bianconi 9417f1de56SFelix Fietkau struct mt76_queue_entry { 9517f1de56SFelix Fietkau union { 9617f1de56SFelix Fietkau void *buf; 9717f1de56SFelix Fietkau struct sk_buff *skb; 9817f1de56SFelix Fietkau }; 99b40b15e1SLorenzo Bianconi union { 10017f1de56SFelix Fietkau struct mt76_txwi_cache *txwi; 101b40b15e1SLorenzo Bianconi struct mt76u_buf ubuf; 102b40b15e1SLorenzo Bianconi }; 10317f1de56SFelix Fietkau bool schedule; 10417f1de56SFelix Fietkau }; 10517f1de56SFelix Fietkau 10617f1de56SFelix Fietkau struct mt76_queue_regs { 10717f1de56SFelix Fietkau u32 desc_base; 10817f1de56SFelix Fietkau u32 ring_size; 10917f1de56SFelix Fietkau u32 cpu_idx; 11017f1de56SFelix Fietkau u32 dma_idx; 11117f1de56SFelix Fietkau } __packed __aligned(4); 11217f1de56SFelix Fietkau 11317f1de56SFelix Fietkau struct mt76_queue { 11417f1de56SFelix Fietkau struct mt76_queue_regs __iomem *regs; 11517f1de56SFelix Fietkau 11617f1de56SFelix Fietkau spinlock_t lock; 11717f1de56SFelix Fietkau struct mt76_queue_entry *entry; 11817f1de56SFelix Fietkau struct mt76_desc *desc; 11917f1de56SFelix Fietkau 12017f1de56SFelix Fietkau struct list_head swq; 12117f1de56SFelix Fietkau int swq_queued; 12217f1de56SFelix Fietkau 123b40b15e1SLorenzo Bianconi u16 first; 12417f1de56SFelix Fietkau u16 head; 12517f1de56SFelix Fietkau u16 tail; 12617f1de56SFelix Fietkau int ndesc; 12717f1de56SFelix Fietkau int queued; 12817f1de56SFelix Fietkau int buf_size; 129*cd44bc40SLorenzo Bianconi bool stopped; 13017f1de56SFelix Fietkau 13117f1de56SFelix Fietkau u8 buf_offset; 13217f1de56SFelix Fietkau u8 hw_idx; 13317f1de56SFelix Fietkau 13417f1de56SFelix Fietkau dma_addr_t desc_dma; 13517f1de56SFelix Fietkau struct sk_buff *rx_head; 136c12128ceSFelix Fietkau struct page_frag_cache rx_page; 137481bb043SLorenzo Bianconi spinlock_t rx_page_lock; 13817f1de56SFelix Fietkau }; 13917f1de56SFelix Fietkau 140db0f04f3SLorenzo Bianconi struct mt76_mcu_ops { 141a74d6336SStanislaw Gruszka int (*mcu_send_msg)(struct mt76_dev *dev, int cmd, const void *data, 142a74d6336SStanislaw Gruszka int len, bool wait_resp); 1436da5a291SStanislaw Gruszka int (*mcu_wr_rp)(struct mt76_dev *dev, u32 base, 1446da5a291SStanislaw Gruszka const struct mt76_reg_pair *rp, int len); 1456da5a291SStanislaw Gruszka int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base, 1466da5a291SStanislaw Gruszka struct mt76_reg_pair *rp, int len); 147db0f04f3SLorenzo Bianconi }; 148db0f04f3SLorenzo Bianconi 14917f1de56SFelix Fietkau struct mt76_queue_ops { 15017f1de56SFelix Fietkau int (*init)(struct mt76_dev *dev); 15117f1de56SFelix Fietkau 15217f1de56SFelix Fietkau int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q); 15317f1de56SFelix Fietkau 15417f1de56SFelix Fietkau int (*add_buf)(struct mt76_dev *dev, struct mt76_queue *q, 15517f1de56SFelix Fietkau struct mt76_queue_buf *buf, int nbufs, u32 info, 15617f1de56SFelix Fietkau struct sk_buff *skb, void *txwi); 15717f1de56SFelix Fietkau 158469d4818SLorenzo Bianconi int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q, 159469d4818SLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid, 160469d4818SLorenzo Bianconi struct ieee80211_sta *sta); 161469d4818SLorenzo Bianconi 1625ed31128SLorenzo Bianconi int (*tx_queue_skb_raw)(struct mt76_dev *dev, enum mt76_txq_id qid, 1635ed31128SLorenzo Bianconi struct sk_buff *skb, u32 tx_info); 1645ed31128SLorenzo Bianconi 16517f1de56SFelix Fietkau void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 16617f1de56SFelix Fietkau int *len, u32 *info, bool *more); 16717f1de56SFelix Fietkau 16817f1de56SFelix Fietkau void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 16917f1de56SFelix Fietkau 17017f1de56SFelix Fietkau void (*tx_cleanup)(struct mt76_dev *dev, enum mt76_txq_id qid, 17117f1de56SFelix Fietkau bool flush); 17217f1de56SFelix Fietkau 17317f1de56SFelix Fietkau void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 17417f1de56SFelix Fietkau }; 17517f1de56SFelix Fietkau 176d71ef286SFelix Fietkau enum mt76_wcid_flags { 177d71ef286SFelix Fietkau MT_WCID_FLAG_CHECK_PS, 178d71ef286SFelix Fietkau MT_WCID_FLAG_PS, 179d71ef286SFelix Fietkau }; 180d71ef286SFelix Fietkau 18136404c06SStanislaw Gruszka #define MT76_N_WCIDS 128 18236404c06SStanislaw Gruszka 183ef13edc0SFelix Fietkau DECLARE_EWMA(signal, 10, 8); 184ef13edc0SFelix Fietkau 18517f1de56SFelix Fietkau struct mt76_wcid { 186aee5b8cfSFelix Fietkau struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 187aee5b8cfSFelix Fietkau 188aee5b8cfSFelix Fietkau struct work_struct aggr_work; 189aee5b8cfSFelix Fietkau 190d71ef286SFelix Fietkau unsigned long flags; 191d71ef286SFelix Fietkau 192ef13edc0SFelix Fietkau struct ewma_signal rssi; 193ef13edc0SFelix Fietkau int inactive_count; 194ef13edc0SFelix Fietkau 19517f1de56SFelix Fietkau u8 idx; 19617f1de56SFelix Fietkau u8 hw_key_idx; 19717f1de56SFelix Fietkau 1989c68a57bSFelix Fietkau u8 sta:1; 1999c68a57bSFelix Fietkau 20030ce7f44SFelix Fietkau u8 rx_check_pn; 20130ce7f44SFelix Fietkau u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 20230ce7f44SFelix Fietkau 20317f1de56SFelix Fietkau __le16 tx_rate; 20417f1de56SFelix Fietkau bool tx_rate_set; 20517f1de56SFelix Fietkau u8 tx_rate_nss; 20617f1de56SFelix Fietkau s8 max_txpwr_adj; 20723405236SFelix Fietkau bool sw_iv; 20888046b2cSFelix Fietkau 20988046b2cSFelix Fietkau u8 packet_id; 21017f1de56SFelix Fietkau }; 21117f1de56SFelix Fietkau 21217f1de56SFelix Fietkau struct mt76_txq { 21317f1de56SFelix Fietkau struct list_head list; 21417f1de56SFelix Fietkau struct mt76_queue *hwq; 21517f1de56SFelix Fietkau struct mt76_wcid *wcid; 21617f1de56SFelix Fietkau 21717f1de56SFelix Fietkau struct sk_buff_head retry_q; 21817f1de56SFelix Fietkau 21917f1de56SFelix Fietkau u16 agg_ssn; 22017f1de56SFelix Fietkau bool send_bar; 22117f1de56SFelix Fietkau bool aggr; 22217f1de56SFelix Fietkau }; 22317f1de56SFelix Fietkau 22417f1de56SFelix Fietkau struct mt76_txwi_cache { 22517f1de56SFelix Fietkau u32 txwi[8]; 22617f1de56SFelix Fietkau dma_addr_t dma_addr; 22717f1de56SFelix Fietkau struct list_head list; 22817f1de56SFelix Fietkau }; 22917f1de56SFelix Fietkau 230aee5b8cfSFelix Fietkau 231aee5b8cfSFelix Fietkau struct mt76_rx_tid { 232aee5b8cfSFelix Fietkau struct rcu_head rcu_head; 233aee5b8cfSFelix Fietkau 234aee5b8cfSFelix Fietkau struct mt76_dev *dev; 235aee5b8cfSFelix Fietkau 236aee5b8cfSFelix Fietkau spinlock_t lock; 237aee5b8cfSFelix Fietkau struct delayed_work reorder_work; 238aee5b8cfSFelix Fietkau 239aee5b8cfSFelix Fietkau u16 head; 240aee5b8cfSFelix Fietkau u8 size; 241aee5b8cfSFelix Fietkau u8 nframes; 242aee5b8cfSFelix Fietkau 243aee5b8cfSFelix Fietkau u8 started:1, stopped:1, timer_pending:1; 244aee5b8cfSFelix Fietkau 245aee5b8cfSFelix Fietkau struct sk_buff *reorder_buf[]; 246aee5b8cfSFelix Fietkau }; 247aee5b8cfSFelix Fietkau 24888046b2cSFelix Fietkau #define MT_TX_CB_DMA_DONE BIT(0) 24988046b2cSFelix Fietkau #define MT_TX_CB_TXS_DONE BIT(1) 25088046b2cSFelix Fietkau #define MT_TX_CB_TXS_FAILED BIT(2) 25188046b2cSFelix Fietkau 25288046b2cSFelix Fietkau #define MT_PACKET_ID_MASK GENMASK(7, 0) 253013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_ACK 0 254013b2dffSFelix Fietkau #define MT_PACKET_ID_NO_SKB 1 255013b2dffSFelix Fietkau #define MT_PACKET_ID_FIRST 2 25688046b2cSFelix Fietkau 25788046b2cSFelix Fietkau #define MT_TX_STATUS_SKB_TIMEOUT HZ 25888046b2cSFelix Fietkau 25988046b2cSFelix Fietkau struct mt76_tx_cb { 26088046b2cSFelix Fietkau unsigned long jiffies; 26188046b2cSFelix Fietkau u8 wcid; 26288046b2cSFelix Fietkau u8 pktid; 26388046b2cSFelix Fietkau u8 flags; 26488046b2cSFelix Fietkau }; 26588046b2cSFelix Fietkau 26617f1de56SFelix Fietkau enum { 26717f1de56SFelix Fietkau MT76_STATE_INITIALIZED, 26817f1de56SFelix Fietkau MT76_STATE_RUNNING, 26987e022deSStanislaw Gruszka MT76_STATE_MCU_RUNNING, 27017f1de56SFelix Fietkau MT76_SCANNING, 27117f1de56SFelix Fietkau MT76_RESET, 27289bc67e3SFelix Fietkau MT76_OFFCHANNEL, 273b40b15e1SLorenzo Bianconi MT76_REMOVED, 274b40b15e1SLorenzo Bianconi MT76_READING_STATS, 27517f1de56SFelix Fietkau }; 27617f1de56SFelix Fietkau 27717f1de56SFelix Fietkau struct mt76_hw_cap { 27817f1de56SFelix Fietkau bool has_2ghz; 27917f1de56SFelix Fietkau bool has_5ghz; 28017f1de56SFelix Fietkau }; 28117f1de56SFelix Fietkau 28217f1de56SFelix Fietkau struct mt76_driver_ops { 28317f1de56SFelix Fietkau u16 txwi_size; 28417f1de56SFelix Fietkau 28517f1de56SFelix Fietkau void (*update_survey)(struct mt76_dev *dev); 28617f1de56SFelix Fietkau 28717f1de56SFelix Fietkau int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 28817f1de56SFelix Fietkau struct sk_buff *skb, struct mt76_queue *q, 28917f1de56SFelix Fietkau struct mt76_wcid *wcid, 29017f1de56SFelix Fietkau struct ieee80211_sta *sta, u32 *tx_info); 29117f1de56SFelix Fietkau 29217f1de56SFelix Fietkau void (*tx_complete_skb)(struct mt76_dev *dev, struct mt76_queue *q, 29317f1de56SFelix Fietkau struct mt76_queue_entry *e, bool flush); 29417f1de56SFelix Fietkau 295b40b15e1SLorenzo Bianconi bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 296b40b15e1SLorenzo Bianconi 29717f1de56SFelix Fietkau void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 29817f1de56SFelix Fietkau struct sk_buff *skb); 29917f1de56SFelix Fietkau 30017f1de56SFelix Fietkau void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 301d71ef286SFelix Fietkau 302d71ef286SFelix Fietkau void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 303d71ef286SFelix Fietkau bool ps); 304e28487eaSFelix Fietkau 305e28487eaSFelix Fietkau int (*sta_add)(struct mt76_dev *dev, struct ieee80211_vif *vif, 306e28487eaSFelix Fietkau struct ieee80211_sta *sta); 307e28487eaSFelix Fietkau 3089c193de5SFelix Fietkau void (*sta_assoc)(struct mt76_dev *dev, struct ieee80211_vif *vif, 3099c193de5SFelix Fietkau struct ieee80211_sta *sta); 3109c193de5SFelix Fietkau 311e28487eaSFelix Fietkau void (*sta_remove)(struct mt76_dev *dev, struct ieee80211_vif *vif, 312e28487eaSFelix Fietkau struct ieee80211_sta *sta); 31317f1de56SFelix Fietkau }; 31417f1de56SFelix Fietkau 31517f1de56SFelix Fietkau struct mt76_channel_state { 31617f1de56SFelix Fietkau u64 cc_active; 31717f1de56SFelix Fietkau u64 cc_busy; 31817f1de56SFelix Fietkau }; 31917f1de56SFelix Fietkau 32017f1de56SFelix Fietkau struct mt76_sband { 32117f1de56SFelix Fietkau struct ieee80211_supported_band sband; 32217f1de56SFelix Fietkau struct mt76_channel_state *chan; 32317f1de56SFelix Fietkau }; 32417f1de56SFelix Fietkau 325b6862effSLorenzo Bianconi struct mt76_rate_power { 326b6862effSLorenzo Bianconi union { 327b6862effSLorenzo Bianconi struct { 328b6862effSLorenzo Bianconi s8 cck[4]; 329b6862effSLorenzo Bianconi s8 ofdm[8]; 330b6862effSLorenzo Bianconi s8 stbc[10]; 331b6862effSLorenzo Bianconi s8 ht[16]; 332b6862effSLorenzo Bianconi s8 vht[10]; 333b6862effSLorenzo Bianconi }; 334b6862effSLorenzo Bianconi s8 all[48]; 335b6862effSLorenzo Bianconi }; 336b6862effSLorenzo Bianconi }; 337b6862effSLorenzo Bianconi 338b40b15e1SLorenzo Bianconi /* addr req mask */ 339b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_EEPROM BIT(31) 340b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_CFG BIT(30) 341b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 342b40b15e1SLorenzo Bianconi 343b40b15e1SLorenzo Bianconi #define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 344b40b15e1SLorenzo Bianconi enum mt_vendor_req { 345b40b15e1SLorenzo Bianconi MT_VEND_DEV_MODE = 0x1, 346b40b15e1SLorenzo Bianconi MT_VEND_WRITE = 0x2, 347b40b15e1SLorenzo Bianconi MT_VEND_MULTI_WRITE = 0x6, 348b40b15e1SLorenzo Bianconi MT_VEND_MULTI_READ = 0x7, 349b40b15e1SLorenzo Bianconi MT_VEND_READ_EEPROM = 0x9, 350b40b15e1SLorenzo Bianconi MT_VEND_WRITE_FCE = 0x42, 351b40b15e1SLorenzo Bianconi MT_VEND_WRITE_CFG = 0x46, 352b40b15e1SLorenzo Bianconi MT_VEND_READ_CFG = 0x47, 353b40b15e1SLorenzo Bianconi }; 354b40b15e1SLorenzo Bianconi 355b40b15e1SLorenzo Bianconi enum mt76u_in_ep { 356b40b15e1SLorenzo Bianconi MT_EP_IN_PKT_RX, 357b40b15e1SLorenzo Bianconi MT_EP_IN_CMD_RESP, 358b40b15e1SLorenzo Bianconi __MT_EP_IN_MAX, 359b40b15e1SLorenzo Bianconi }; 360b40b15e1SLorenzo Bianconi 361b40b15e1SLorenzo Bianconi enum mt76u_out_ep { 362b40b15e1SLorenzo Bianconi MT_EP_OUT_INBAND_CMD, 363b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BK, 364b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BE, 365b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VI, 366b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VO, 367b40b15e1SLorenzo Bianconi MT_EP_OUT_HCCA, 368b40b15e1SLorenzo Bianconi __MT_EP_OUT_MAX, 369b40b15e1SLorenzo Bianconi }; 370b40b15e1SLorenzo Bianconi 371b40b15e1SLorenzo Bianconi #define MT_SG_MAX_SIZE 8 372b40b15e1SLorenzo Bianconi #define MT_NUM_TX_ENTRIES 256 373b40b15e1SLorenzo Bianconi #define MT_NUM_RX_ENTRIES 128 374b40b15e1SLorenzo Bianconi #define MCU_RESP_URB_SIZE 1024 375b40b15e1SLorenzo Bianconi struct mt76_usb { 376b40b15e1SLorenzo Bianconi struct mutex usb_ctrl_mtx; 377b40b15e1SLorenzo Bianconi u8 data[32]; 378b40b15e1SLorenzo Bianconi 379b40b15e1SLorenzo Bianconi struct tasklet_struct rx_tasklet; 380b40b15e1SLorenzo Bianconi struct tasklet_struct tx_tasklet; 381b40b15e1SLorenzo Bianconi struct delayed_work stat_work; 382b40b15e1SLorenzo Bianconi 383b40b15e1SLorenzo Bianconi u8 out_ep[__MT_EP_OUT_MAX]; 384b40b15e1SLorenzo Bianconi u16 out_max_packet; 385b40b15e1SLorenzo Bianconi u8 in_ep[__MT_EP_IN_MAX]; 386b40b15e1SLorenzo Bianconi u16 in_max_packet; 38763a7de5dSLorenzo Bianconi bool sg_en; 388b40b15e1SLorenzo Bianconi 389b40b15e1SLorenzo Bianconi struct mt76u_mcu { 390b40b15e1SLorenzo Bianconi struct mutex mutex; 391a18a494fSStanislaw Gruszka u8 *data; 392b40b15e1SLorenzo Bianconi u32 msg_seq; 393851ab66eSLorenzo Bianconi 394851ab66eSLorenzo Bianconi /* multiple reads */ 395851ab66eSLorenzo Bianconi struct mt76_reg_pair *rp; 396851ab66eSLorenzo Bianconi int rp_len; 397851ab66eSLorenzo Bianconi u32 base; 398851ab66eSLorenzo Bianconi bool burst; 399b40b15e1SLorenzo Bianconi } mcu; 400b40b15e1SLorenzo Bianconi }; 401b40b15e1SLorenzo Bianconi 402f7bbb80fSLorenzo Bianconi struct mt76_mmio { 403f7bbb80fSLorenzo Bianconi struct mt76e_mcu { 404f7bbb80fSLorenzo Bianconi struct mutex mutex; 405f7bbb80fSLorenzo Bianconi 406f7bbb80fSLorenzo Bianconi wait_queue_head_t wait; 407f7bbb80fSLorenzo Bianconi struct sk_buff_head res_q; 408f7bbb80fSLorenzo Bianconi 409f7bbb80fSLorenzo Bianconi u32 msg_seq; 410f7bbb80fSLorenzo Bianconi } mcu; 41127db1ad1SLorenzo Bianconi void __iomem *regs; 412957068c2SLorenzo Bianconi spinlock_t irq_lock; 413957068c2SLorenzo Bianconi u32 irqmask; 414f7bbb80fSLorenzo Bianconi }; 415f7bbb80fSLorenzo Bianconi 41617f1de56SFelix Fietkau struct mt76_dev { 41717f1de56SFelix Fietkau struct ieee80211_hw *hw; 41817f1de56SFelix Fietkau struct cfg80211_chan_def chandef; 41917f1de56SFelix Fietkau struct ieee80211_channel *main_chan; 42017f1de56SFelix Fietkau 42117f1de56SFelix Fietkau spinlock_t lock; 42217f1de56SFelix Fietkau spinlock_t cc_lock; 423108a4861SStanislaw Gruszka 424108a4861SStanislaw Gruszka struct mutex mutex; 425108a4861SStanislaw Gruszka 42617f1de56SFelix Fietkau const struct mt76_bus_ops *bus; 42717f1de56SFelix Fietkau const struct mt76_driver_ops *drv; 428db0f04f3SLorenzo Bianconi const struct mt76_mcu_ops *mcu_ops; 42917f1de56SFelix Fietkau struct device *dev; 43017f1de56SFelix Fietkau 43117f1de56SFelix Fietkau struct net_device napi_dev; 432c3d7c82aSFelix Fietkau spinlock_t rx_lock; 43317f1de56SFelix Fietkau struct napi_struct napi[__MT_RXQ_MAX]; 43417f1de56SFelix Fietkau struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 43517f1de56SFelix Fietkau 43617f1de56SFelix Fietkau struct list_head txwi_cache; 43717f1de56SFelix Fietkau struct mt76_queue q_tx[__MT_TXQ_MAX]; 43817f1de56SFelix Fietkau struct mt76_queue q_rx[__MT_RXQ_MAX]; 43917f1de56SFelix Fietkau const struct mt76_queue_ops *queue_ops; 440c1e0d2beSLorenzo Bianconi int tx_dma_idx[4]; 44117f1de56SFelix Fietkau 44226e40d4cSFelix Fietkau wait_queue_head_t tx_wait; 44388046b2cSFelix Fietkau struct sk_buff_head status_list; 44426e40d4cSFelix Fietkau 44536404c06SStanislaw Gruszka unsigned long wcid_mask[MT76_N_WCIDS / BITS_PER_LONG]; 44636404c06SStanislaw Gruszka 44736404c06SStanislaw Gruszka struct mt76_wcid global_wcid; 44836404c06SStanislaw Gruszka struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 44936404c06SStanislaw Gruszka 45017f1de56SFelix Fietkau u8 macaddr[ETH_ALEN]; 45117f1de56SFelix Fietkau u32 rev; 45217f1de56SFelix Fietkau unsigned long state; 45317f1de56SFelix Fietkau 45424114a5fSLorenzo Bianconi u8 antenna_mask; 4556034b2b0SLorenzo Bianconi u16 chainmask; 45624114a5fSLorenzo Bianconi 45717f1de56SFelix Fietkau struct mt76_sband sband_2g; 45817f1de56SFelix Fietkau struct mt76_sband sband_5g; 45917f1de56SFelix Fietkau struct debugfs_blob_wrapper eeprom; 46017f1de56SFelix Fietkau struct debugfs_blob_wrapper otp; 46117f1de56SFelix Fietkau struct mt76_hw_cap cap; 46217f1de56SFelix Fietkau 463b6862effSLorenzo Bianconi struct mt76_rate_power rate_power; 464b6862effSLorenzo Bianconi int txpower_conf; 465b6862effSLorenzo Bianconi int txpower_cur; 466b6862effSLorenzo Bianconi 46717f1de56SFelix Fietkau u32 debugfs_reg; 46817f1de56SFelix Fietkau 46917f1de56SFelix Fietkau struct led_classdev led_cdev; 47017f1de56SFelix Fietkau char led_name[32]; 47117f1de56SFelix Fietkau bool led_al; 47217f1de56SFelix Fietkau u8 led_pin; 473b40b15e1SLorenzo Bianconi 474e7173858SFelix Fietkau u8 csa_complete; 475e7173858SFelix Fietkau 476108a4861SStanislaw Gruszka u32 rxfilter; 477108a4861SStanislaw Gruszka 478f7bbb80fSLorenzo Bianconi union { 479f7bbb80fSLorenzo Bianconi struct mt76_mmio mmio; 480b40b15e1SLorenzo Bianconi struct mt76_usb usb; 48117f1de56SFelix Fietkau }; 482f7bbb80fSLorenzo Bianconi }; 48317f1de56SFelix Fietkau 48417f1de56SFelix Fietkau enum mt76_phy_type { 48517f1de56SFelix Fietkau MT_PHY_TYPE_CCK, 48617f1de56SFelix Fietkau MT_PHY_TYPE_OFDM, 48717f1de56SFelix Fietkau MT_PHY_TYPE_HT, 48817f1de56SFelix Fietkau MT_PHY_TYPE_HT_GF, 48917f1de56SFelix Fietkau MT_PHY_TYPE_VHT, 49017f1de56SFelix Fietkau }; 49117f1de56SFelix Fietkau 4924e34249eSFelix Fietkau struct mt76_rx_status { 4939c68a57bSFelix Fietkau struct mt76_wcid *wcid; 494aee5b8cfSFelix Fietkau 495aee5b8cfSFelix Fietkau unsigned long reorder_time; 496aee5b8cfSFelix Fietkau 49730ce7f44SFelix Fietkau u8 iv[6]; 49830ce7f44SFelix Fietkau 49930ce7f44SFelix Fietkau u8 aggr:1; 500aee5b8cfSFelix Fietkau u8 tid; 501aee5b8cfSFelix Fietkau u16 seqno; 502aee5b8cfSFelix Fietkau 5034e34249eSFelix Fietkau u16 freq; 50430ce7f44SFelix Fietkau u32 flag; 5054e34249eSFelix Fietkau u8 enc_flags; 5064e34249eSFelix Fietkau u8 encoding:2, bw:3; 5074e34249eSFelix Fietkau u8 rate_idx; 5084e34249eSFelix Fietkau u8 nss; 5094e34249eSFelix Fietkau u8 band; 5109cf67ec7SFelix Fietkau s8 signal; 5114e34249eSFelix Fietkau u8 chains; 5124e34249eSFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 5134e34249eSFelix Fietkau }; 5144e34249eSFelix Fietkau 515d4131273SStanislaw Gruszka #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 516d4131273SStanislaw Gruszka #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 517d4131273SStanislaw Gruszka #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 518d4131273SStanislaw Gruszka #define __mt76_wr_copy(dev, ...) (dev)->bus->copy((dev), __VA_ARGS__) 519d4131273SStanislaw Gruszka 52022c575c4SStanislaw Gruszka #define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 52122c575c4SStanislaw Gruszka #define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 52222c575c4SStanislaw Gruszka 52317f1de56SFelix Fietkau #define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 52417f1de56SFelix Fietkau #define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 52517f1de56SFelix Fietkau #define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 52617f1de56SFelix Fietkau #define mt76_wr_copy(dev, ...) (dev)->mt76.bus->copy(&((dev)->mt76), __VA_ARGS__) 5276da5a291SStanislaw Gruszka #define mt76_wr_rp(dev, ...) (dev)->mt76.bus->wr_rp(&((dev)->mt76), __VA_ARGS__) 5286da5a291SStanislaw Gruszka #define mt76_rd_rp(dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__) 52917f1de56SFelix Fietkau 530db0f04f3SLorenzo Bianconi #define mt76_mcu_send_msg(dev, ...) (dev)->mt76.mcu_ops->mcu_send_msg(&((dev)->mt76), __VA_ARGS__) 531db0f04f3SLorenzo Bianconi 53217f1de56SFelix Fietkau #define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 53317f1de56SFelix Fietkau #define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 53417f1de56SFelix Fietkau 53517f1de56SFelix Fietkau #define mt76_get_field(_dev, _reg, _field) \ 53617f1de56SFelix Fietkau FIELD_GET(_field, mt76_rr(dev, _reg)) 53717f1de56SFelix Fietkau 53817f1de56SFelix Fietkau #define mt76_rmw_field(_dev, _reg, _field, _val) \ 53917f1de56SFelix Fietkau mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 54017f1de56SFelix Fietkau 54146436b5eSStanislaw Gruszka #define __mt76_rmw_field(_dev, _reg, _field, _val) \ 54246436b5eSStanislaw Gruszka __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 54346436b5eSStanislaw Gruszka 54417f1de56SFelix Fietkau #define mt76_hw(dev) (dev)->mt76.hw 54517f1de56SFelix Fietkau 54617f1de56SFelix Fietkau bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 54717f1de56SFelix Fietkau int timeout); 54817f1de56SFelix Fietkau 54917f1de56SFelix Fietkau #define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 55017f1de56SFelix Fietkau 55117f1de56SFelix Fietkau bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 55217f1de56SFelix Fietkau int timeout); 55317f1de56SFelix Fietkau 55417f1de56SFelix Fietkau #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 55517f1de56SFelix Fietkau 55617f1de56SFelix Fietkau void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 55717f1de56SFelix Fietkau 55817f1de56SFelix Fietkau static inline u16 mt76_chip(struct mt76_dev *dev) 55917f1de56SFelix Fietkau { 56017f1de56SFelix Fietkau return dev->rev >> 16; 56117f1de56SFelix Fietkau } 56217f1de56SFelix Fietkau 56317f1de56SFelix Fietkau static inline u16 mt76_rev(struct mt76_dev *dev) 56417f1de56SFelix Fietkau { 56517f1de56SFelix Fietkau return dev->rev & 0xffff; 56617f1de56SFelix Fietkau } 56717f1de56SFelix Fietkau 56817f1de56SFelix Fietkau #define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 56917f1de56SFelix Fietkau #define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 57017f1de56SFelix Fietkau 571a23fde09SLorenzo Bianconi #define mt76_init_queues(dev) (dev)->mt76.queue_ops->init(&((dev)->mt76)) 572a23fde09SLorenzo Bianconi #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 5735ed31128SLorenzo Bianconi #define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__) 57417f1de56SFelix Fietkau #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 57517f1de56SFelix Fietkau #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 57617f1de56SFelix Fietkau #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 57717f1de56SFelix Fietkau 57817f1de56SFelix Fietkau static inline struct mt76_channel_state * 57917f1de56SFelix Fietkau mt76_channel_state(struct mt76_dev *dev, struct ieee80211_channel *c) 58017f1de56SFelix Fietkau { 58117f1de56SFelix Fietkau struct mt76_sband *msband; 58217f1de56SFelix Fietkau int idx; 58317f1de56SFelix Fietkau 58417f1de56SFelix Fietkau if (c->band == NL80211_BAND_2GHZ) 58517f1de56SFelix Fietkau msband = &dev->sband_2g; 58617f1de56SFelix Fietkau else 58717f1de56SFelix Fietkau msband = &dev->sband_5g; 58817f1de56SFelix Fietkau 58917f1de56SFelix Fietkau idx = c - &msband->sband.channels[0]; 59017f1de56SFelix Fietkau return &msband->chan[idx]; 59117f1de56SFelix Fietkau } 59217f1de56SFelix Fietkau 593c0f7b25aSLorenzo Bianconi struct mt76_dev *mt76_alloc_device(struct device *pdev, unsigned int size, 594c0f7b25aSLorenzo Bianconi const struct ieee80211_ops *ops, 595c0f7b25aSLorenzo Bianconi const struct mt76_driver_ops *drv_ops); 59617f1de56SFelix Fietkau int mt76_register_device(struct mt76_dev *dev, bool vht, 59717f1de56SFelix Fietkau struct ieee80211_rate *rates, int n_rates); 59817f1de56SFelix Fietkau void mt76_unregister_device(struct mt76_dev *dev); 59917f1de56SFelix Fietkau 60017f1de56SFelix Fietkau struct dentry *mt76_register_debugfs(struct mt76_dev *dev); 6018f410a8bSLorenzo Bianconi void mt76_seq_puts_array(struct seq_file *file, const char *str, 6028f410a8bSLorenzo Bianconi s8 *val, int len); 60317f1de56SFelix Fietkau 60417f1de56SFelix Fietkau int mt76_eeprom_init(struct mt76_dev *dev, int len); 60517f1de56SFelix Fietkau void mt76_eeprom_override(struct mt76_dev *dev); 60617f1de56SFelix Fietkau 607ee8aa945SLorenzo Bianconi /* increment with wrap-around */ 608ee8aa945SLorenzo Bianconi static inline int mt76_incr(int val, int size) 609ee8aa945SLorenzo Bianconi { 610ee8aa945SLorenzo Bianconi return (val + 1) & (size - 1); 611ee8aa945SLorenzo Bianconi } 612ee8aa945SLorenzo Bianconi 613ee8aa945SLorenzo Bianconi /* decrement with wrap-around */ 614ee8aa945SLorenzo Bianconi static inline int mt76_decr(int val, int size) 615ee8aa945SLorenzo Bianconi { 616ee8aa945SLorenzo Bianconi return (val - 1) & (size - 1); 617ee8aa945SLorenzo Bianconi } 618ee8aa945SLorenzo Bianconi 6191d0496c6SStanislaw Gruszka u8 mt76_ac_to_hwq(u8 ac); 620b40b15e1SLorenzo Bianconi 62117f1de56SFelix Fietkau static inline struct ieee80211_txq * 62217f1de56SFelix Fietkau mtxq_to_txq(struct mt76_txq *mtxq) 62317f1de56SFelix Fietkau { 62417f1de56SFelix Fietkau void *ptr = mtxq; 62517f1de56SFelix Fietkau 62617f1de56SFelix Fietkau return container_of(ptr, struct ieee80211_txq, drv_priv); 62717f1de56SFelix Fietkau } 62817f1de56SFelix Fietkau 6299c68a57bSFelix Fietkau static inline struct ieee80211_sta * 6309c68a57bSFelix Fietkau wcid_to_sta(struct mt76_wcid *wcid) 6319c68a57bSFelix Fietkau { 6329c68a57bSFelix Fietkau void *ptr = wcid; 6339c68a57bSFelix Fietkau 6349c68a57bSFelix Fietkau if (!wcid || !wcid->sta) 6359c68a57bSFelix Fietkau return NULL; 6369c68a57bSFelix Fietkau 6379c68a57bSFelix Fietkau return container_of(ptr, struct ieee80211_sta, drv_priv); 6389c68a57bSFelix Fietkau } 6399c68a57bSFelix Fietkau 64088046b2cSFelix Fietkau static inline struct mt76_tx_cb *mt76_tx_skb_cb(struct sk_buff *skb) 64188046b2cSFelix Fietkau { 64288046b2cSFelix Fietkau BUILD_BUG_ON(sizeof(struct mt76_tx_cb) > 64388046b2cSFelix Fietkau sizeof(IEEE80211_SKB_CB(skb)->status.status_driver_data)); 64488046b2cSFelix Fietkau return ((void *) IEEE80211_SKB_CB(skb)->status.status_driver_data); 64588046b2cSFelix Fietkau } 64688046b2cSFelix Fietkau 647fcdd99ceSLorenzo Bianconi int mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, 64817f1de56SFelix Fietkau struct sk_buff *skb, struct mt76_wcid *wcid, 64917f1de56SFelix Fietkau struct ieee80211_sta *sta); 65017f1de56SFelix Fietkau 65117f1de56SFelix Fietkau void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 65217f1de56SFelix Fietkau void mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, 65317f1de56SFelix Fietkau struct mt76_wcid *wcid, struct sk_buff *skb); 65417f1de56SFelix Fietkau void mt76_txq_init(struct mt76_dev *dev, struct ieee80211_txq *txq); 65517f1de56SFelix Fietkau void mt76_txq_remove(struct mt76_dev *dev, struct ieee80211_txq *txq); 65617f1de56SFelix Fietkau void mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 65717f1de56SFelix Fietkau void mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta, 65817f1de56SFelix Fietkau bool send_bar); 65917f1de56SFelix Fietkau void mt76_txq_schedule(struct mt76_dev *dev, struct mt76_queue *hwq); 66017f1de56SFelix Fietkau void mt76_txq_schedule_all(struct mt76_dev *dev); 66117f1de56SFelix Fietkau void mt76_release_buffered_frames(struct ieee80211_hw *hw, 66217f1de56SFelix Fietkau struct ieee80211_sta *sta, 66317f1de56SFelix Fietkau u16 tids, int nframes, 66417f1de56SFelix Fietkau enum ieee80211_frame_release_type reason, 66517f1de56SFelix Fietkau bool more_data); 66617f1de56SFelix Fietkau void mt76_set_channel(struct mt76_dev *dev); 66717f1de56SFelix Fietkau int mt76_get_survey(struct ieee80211_hw *hw, int idx, 66817f1de56SFelix Fietkau struct survey_info *survey); 6695ebdc3e0SLorenzo Bianconi void mt76_set_stream_caps(struct mt76_dev *dev, bool vht); 67017f1de56SFelix Fietkau 671aee5b8cfSFelix Fietkau int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 672aee5b8cfSFelix Fietkau u16 ssn, u8 size); 673aee5b8cfSFelix Fietkau void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 674aee5b8cfSFelix Fietkau 67530ce7f44SFelix Fietkau void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 67630ce7f44SFelix Fietkau struct ieee80211_key_conf *key); 67779d1c94cSFelix Fietkau 67879d1c94cSFelix Fietkau void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) 67979d1c94cSFelix Fietkau __acquires(&dev->status_list.lock); 68079d1c94cSFelix Fietkau void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) 68179d1c94cSFelix Fietkau __releases(&dev->status_list.lock); 68279d1c94cSFelix Fietkau 68388046b2cSFelix Fietkau int mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, 68488046b2cSFelix Fietkau struct sk_buff *skb); 68588046b2cSFelix Fietkau struct sk_buff *mt76_tx_status_skb_get(struct mt76_dev *dev, 68679d1c94cSFelix Fietkau struct mt76_wcid *wcid, int pktid, 68779d1c94cSFelix Fietkau struct sk_buff_head *list); 68879d1c94cSFelix Fietkau void mt76_tx_status_skb_done(struct mt76_dev *dev, struct sk_buff *skb, 68979d1c94cSFelix Fietkau struct sk_buff_head *list); 69088046b2cSFelix Fietkau void mt76_tx_complete_skb(struct mt76_dev *dev, struct sk_buff *skb); 69179d1c94cSFelix Fietkau void mt76_tx_status_check(struct mt76_dev *dev, struct mt76_wcid *wcid, 69279d1c94cSFelix Fietkau bool flush); 693e28487eaSFelix Fietkau int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 694e28487eaSFelix Fietkau struct ieee80211_sta *sta, 695e28487eaSFelix Fietkau enum ieee80211_sta_state old_state, 696e28487eaSFelix Fietkau enum ieee80211_sta_state new_state); 69730ce7f44SFelix Fietkau 69882e1dd0fSStanislaw Gruszka struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb); 69982e1dd0fSStanislaw Gruszka 700ef13edc0SFelix Fietkau int mt76_get_min_avg_rssi(struct mt76_dev *dev); 701ef13edc0SFelix Fietkau 7029313faacSFelix Fietkau int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 7039313faacSFelix Fietkau int *dbm); 7049313faacSFelix Fietkau 705e7173858SFelix Fietkau void mt76_csa_check(struct mt76_dev *dev); 706e7173858SFelix Fietkau void mt76_csa_finish(struct mt76_dev *dev); 707e7173858SFelix Fietkau 70817f1de56SFelix Fietkau /* internal */ 70917f1de56SFelix Fietkau void mt76_tx_free(struct mt76_dev *dev); 710fcdd99ceSLorenzo Bianconi struct mt76_txwi_cache *mt76_get_txwi(struct mt76_dev *dev); 71117f1de56SFelix Fietkau void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 7129d9d738bSFelix Fietkau void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 71381e850efSLorenzo Bianconi struct napi_struct *napi); 71481e850efSLorenzo Bianconi void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 71581e850efSLorenzo Bianconi struct napi_struct *napi); 716aee5b8cfSFelix Fietkau void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 71717f1de56SFelix Fietkau 718b40b15e1SLorenzo Bianconi /* usb */ 719b40b15e1SLorenzo Bianconi static inline bool mt76u_urb_error(struct urb *urb) 720b40b15e1SLorenzo Bianconi { 721b40b15e1SLorenzo Bianconi return urb->status && 722b40b15e1SLorenzo Bianconi urb->status != -ECONNRESET && 723b40b15e1SLorenzo Bianconi urb->status != -ESHUTDOWN && 724b40b15e1SLorenzo Bianconi urb->status != -ENOENT; 725b40b15e1SLorenzo Bianconi } 726b40b15e1SLorenzo Bianconi 727b40b15e1SLorenzo Bianconi /* Map hardware queues to usb endpoints */ 728b40b15e1SLorenzo Bianconi static inline u8 q2ep(u8 qid) 729b40b15e1SLorenzo Bianconi { 730b40b15e1SLorenzo Bianconi /* TODO: take management packets to queue 5 */ 731b40b15e1SLorenzo Bianconi return qid + 1; 732b40b15e1SLorenzo Bianconi } 733b40b15e1SLorenzo Bianconi 7345de4db8fSStanislaw Gruszka static inline int 735b63aa031SStanislaw Gruszka mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, 736b63aa031SStanislaw Gruszka int timeout) 7375de4db8fSStanislaw Gruszka { 7385de4db8fSStanislaw Gruszka struct usb_interface *intf = to_usb_interface(dev->dev); 7395de4db8fSStanislaw Gruszka struct usb_device *udev = interface_to_usbdev(intf); 7405de4db8fSStanislaw Gruszka struct mt76_usb *usb = &dev->usb; 7415de4db8fSStanislaw Gruszka unsigned int pipe; 7425de4db8fSStanislaw Gruszka 743b63aa031SStanislaw Gruszka if (actual_len) 744b63aa031SStanislaw Gruszka pipe = usb_rcvbulkpipe(udev, usb->in_ep[MT_EP_IN_CMD_RESP]); 745b63aa031SStanislaw Gruszka else 7465de4db8fSStanislaw Gruszka pipe = usb_sndbulkpipe(udev, usb->out_ep[MT_EP_OUT_INBAND_CMD]); 747b63aa031SStanislaw Gruszka 748b63aa031SStanislaw Gruszka return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout); 7495de4db8fSStanislaw Gruszka } 7505de4db8fSStanislaw Gruszka 751b40b15e1SLorenzo Bianconi int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 752b40b15e1SLorenzo Bianconi u8 req_type, u16 val, u16 offset, 753b40b15e1SLorenzo Bianconi void *buf, size_t len); 754b40b15e1SLorenzo Bianconi void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 755b40b15e1SLorenzo Bianconi const u16 offset, const u32 val); 756b40b15e1SLorenzo Bianconi int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf); 757b40b15e1SLorenzo Bianconi int mt76u_submit_rx_buffers(struct mt76_dev *dev); 758b40b15e1SLorenzo Bianconi int mt76u_alloc_queues(struct mt76_dev *dev); 759b40b15e1SLorenzo Bianconi void mt76u_stop_queues(struct mt76_dev *dev); 760b40b15e1SLorenzo Bianconi void mt76u_stop_stat_wk(struct mt76_dev *dev); 761b40b15e1SLorenzo Bianconi void mt76u_queues_deinit(struct mt76_dev *dev); 762b40b15e1SLorenzo Bianconi 7639df0fab9SLorenzo Bianconi struct sk_buff * 7649df0fab9SLorenzo Bianconi mt76_mcu_msg_alloc(const void *data, int head_len, 7659df0fab9SLorenzo Bianconi int data_len, int tail_len); 766c07a49d4SLorenzo Bianconi void mt76_mcu_rx_event(struct mt76_dev *dev, struct sk_buff *skb); 767680abb25SLorenzo Bianconi struct sk_buff *mt76_mcu_get_response(struct mt76_dev *dev, 768680abb25SLorenzo Bianconi unsigned long expires); 7699df0fab9SLorenzo Bianconi 77017f1de56SFelix Fietkau #endif 771