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> 2617f1de56SFelix Fietkau #include <net/mac80211.h> 2717f1de56SFelix Fietkau #include "util.h" 2817f1de56SFelix Fietkau 2917f1de56SFelix Fietkau #define MT_TX_RING_SIZE 256 3017f1de56SFelix Fietkau #define MT_MCU_RING_SIZE 32 3117f1de56SFelix Fietkau #define MT_RX_BUF_SIZE 2048 3217f1de56SFelix Fietkau 3317f1de56SFelix Fietkau struct mt76_dev; 34469d4818SLorenzo Bianconi struct mt76_wcid; 3517f1de56SFelix Fietkau 3617f1de56SFelix Fietkau struct mt76_bus_ops { 3717f1de56SFelix Fietkau u32 (*rr)(struct mt76_dev *dev, u32 offset); 3817f1de56SFelix Fietkau void (*wr)(struct mt76_dev *dev, u32 offset, u32 val); 3917f1de56SFelix Fietkau u32 (*rmw)(struct mt76_dev *dev, u32 offset, u32 mask, u32 val); 4017f1de56SFelix Fietkau void (*copy)(struct mt76_dev *dev, u32 offset, const void *data, 4117f1de56SFelix Fietkau int len); 4217f1de56SFelix Fietkau }; 4317f1de56SFelix Fietkau 4417f1de56SFelix Fietkau enum mt76_txq_id { 4517f1de56SFelix Fietkau MT_TXQ_VO = IEEE80211_AC_VO, 4617f1de56SFelix Fietkau MT_TXQ_VI = IEEE80211_AC_VI, 4717f1de56SFelix Fietkau MT_TXQ_BE = IEEE80211_AC_BE, 4817f1de56SFelix Fietkau MT_TXQ_BK = IEEE80211_AC_BK, 4917f1de56SFelix Fietkau MT_TXQ_PSD, 5017f1de56SFelix Fietkau MT_TXQ_MCU, 5117f1de56SFelix Fietkau MT_TXQ_BEACON, 5217f1de56SFelix Fietkau MT_TXQ_CAB, 5317f1de56SFelix Fietkau __MT_TXQ_MAX 5417f1de56SFelix Fietkau }; 5517f1de56SFelix Fietkau 565090efa4SLorenzo Bianconi struct mt76_reg_pair { 575090efa4SLorenzo Bianconi u32 reg; 585090efa4SLorenzo Bianconi u32 value; 595090efa4SLorenzo Bianconi }; 605090efa4SLorenzo Bianconi 6117f1de56SFelix Fietkau enum mt76_rxq_id { 6217f1de56SFelix Fietkau MT_RXQ_MAIN, 6317f1de56SFelix Fietkau MT_RXQ_MCU, 6417f1de56SFelix Fietkau __MT_RXQ_MAX 6517f1de56SFelix Fietkau }; 6617f1de56SFelix Fietkau 6717f1de56SFelix Fietkau struct mt76_queue_buf { 6817f1de56SFelix Fietkau dma_addr_t addr; 6917f1de56SFelix Fietkau int len; 7017f1de56SFelix Fietkau }; 7117f1de56SFelix Fietkau 72b40b15e1SLorenzo Bianconi struct mt76u_buf { 73b40b15e1SLorenzo Bianconi struct mt76_dev *dev; 74b40b15e1SLorenzo Bianconi struct urb *urb; 75b40b15e1SLorenzo Bianconi size_t len; 76b40b15e1SLorenzo Bianconi bool done; 77b40b15e1SLorenzo Bianconi }; 78b40b15e1SLorenzo Bianconi 7917f1de56SFelix Fietkau struct mt76_queue_entry { 8017f1de56SFelix Fietkau union { 8117f1de56SFelix Fietkau void *buf; 8217f1de56SFelix Fietkau struct sk_buff *skb; 8317f1de56SFelix Fietkau }; 84b40b15e1SLorenzo Bianconi union { 8517f1de56SFelix Fietkau struct mt76_txwi_cache *txwi; 86b40b15e1SLorenzo Bianconi struct mt76u_buf ubuf; 87b40b15e1SLorenzo Bianconi }; 8817f1de56SFelix Fietkau bool schedule; 8917f1de56SFelix Fietkau }; 9017f1de56SFelix Fietkau 9117f1de56SFelix Fietkau struct mt76_queue_regs { 9217f1de56SFelix Fietkau u32 desc_base; 9317f1de56SFelix Fietkau u32 ring_size; 9417f1de56SFelix Fietkau u32 cpu_idx; 9517f1de56SFelix Fietkau u32 dma_idx; 9617f1de56SFelix Fietkau } __packed __aligned(4); 9717f1de56SFelix Fietkau 9817f1de56SFelix Fietkau struct mt76_queue { 9917f1de56SFelix Fietkau struct mt76_queue_regs __iomem *regs; 10017f1de56SFelix Fietkau 10117f1de56SFelix Fietkau spinlock_t lock; 10217f1de56SFelix Fietkau struct mt76_queue_entry *entry; 10317f1de56SFelix Fietkau struct mt76_desc *desc; 10417f1de56SFelix Fietkau 10517f1de56SFelix Fietkau struct list_head swq; 10617f1de56SFelix Fietkau int swq_queued; 10717f1de56SFelix Fietkau 108b40b15e1SLorenzo Bianconi u16 first; 10917f1de56SFelix Fietkau u16 head; 11017f1de56SFelix Fietkau u16 tail; 11117f1de56SFelix Fietkau int ndesc; 11217f1de56SFelix Fietkau int queued; 11317f1de56SFelix Fietkau int buf_size; 11417f1de56SFelix Fietkau 11517f1de56SFelix Fietkau u8 buf_offset; 11617f1de56SFelix Fietkau u8 hw_idx; 11717f1de56SFelix Fietkau 11817f1de56SFelix Fietkau dma_addr_t desc_dma; 11917f1de56SFelix Fietkau struct sk_buff *rx_head; 12017f1de56SFelix Fietkau }; 12117f1de56SFelix Fietkau 12217f1de56SFelix Fietkau struct mt76_queue_ops { 12317f1de56SFelix Fietkau int (*init)(struct mt76_dev *dev); 12417f1de56SFelix Fietkau 12517f1de56SFelix Fietkau int (*alloc)(struct mt76_dev *dev, struct mt76_queue *q); 12617f1de56SFelix Fietkau 12717f1de56SFelix Fietkau int (*add_buf)(struct mt76_dev *dev, struct mt76_queue *q, 12817f1de56SFelix Fietkau struct mt76_queue_buf *buf, int nbufs, u32 info, 12917f1de56SFelix Fietkau struct sk_buff *skb, void *txwi); 13017f1de56SFelix Fietkau 131469d4818SLorenzo Bianconi int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q, 132469d4818SLorenzo Bianconi struct sk_buff *skb, struct mt76_wcid *wcid, 133469d4818SLorenzo Bianconi struct ieee80211_sta *sta); 134469d4818SLorenzo Bianconi 13517f1de56SFelix Fietkau void *(*dequeue)(struct mt76_dev *dev, struct mt76_queue *q, bool flush, 13617f1de56SFelix Fietkau int *len, u32 *info, bool *more); 13717f1de56SFelix Fietkau 13817f1de56SFelix Fietkau void (*rx_reset)(struct mt76_dev *dev, enum mt76_rxq_id qid); 13917f1de56SFelix Fietkau 14017f1de56SFelix Fietkau void (*tx_cleanup)(struct mt76_dev *dev, enum mt76_txq_id qid, 14117f1de56SFelix Fietkau bool flush); 14217f1de56SFelix Fietkau 14317f1de56SFelix Fietkau void (*kick)(struct mt76_dev *dev, struct mt76_queue *q); 14417f1de56SFelix Fietkau }; 14517f1de56SFelix Fietkau 146d71ef286SFelix Fietkau enum mt76_wcid_flags { 147d71ef286SFelix Fietkau MT_WCID_FLAG_CHECK_PS, 148d71ef286SFelix Fietkau MT_WCID_FLAG_PS, 149d71ef286SFelix Fietkau }; 150d71ef286SFelix Fietkau 15136404c06SStanislaw Gruszka #define MT76_N_WCIDS 128 15236404c06SStanislaw Gruszka 15317f1de56SFelix Fietkau struct mt76_wcid { 154aee5b8cfSFelix Fietkau struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; 155aee5b8cfSFelix Fietkau 156aee5b8cfSFelix Fietkau struct work_struct aggr_work; 157aee5b8cfSFelix Fietkau 158d71ef286SFelix Fietkau unsigned long flags; 159d71ef286SFelix Fietkau 16017f1de56SFelix Fietkau u8 idx; 16117f1de56SFelix Fietkau u8 hw_key_idx; 16217f1de56SFelix Fietkau 1639c68a57bSFelix Fietkau u8 sta:1; 1649c68a57bSFelix Fietkau 16530ce7f44SFelix Fietkau u8 rx_check_pn; 16630ce7f44SFelix Fietkau u8 rx_key_pn[IEEE80211_NUM_TIDS][6]; 16730ce7f44SFelix Fietkau 16817f1de56SFelix Fietkau __le16 tx_rate; 16917f1de56SFelix Fietkau bool tx_rate_set; 17017f1de56SFelix Fietkau u8 tx_rate_nss; 17117f1de56SFelix Fietkau s8 max_txpwr_adj; 17223405236SFelix Fietkau bool sw_iv; 17317f1de56SFelix Fietkau }; 17417f1de56SFelix Fietkau 17517f1de56SFelix Fietkau struct mt76_txq { 17617f1de56SFelix Fietkau struct list_head list; 17717f1de56SFelix Fietkau struct mt76_queue *hwq; 17817f1de56SFelix Fietkau struct mt76_wcid *wcid; 17917f1de56SFelix Fietkau 18017f1de56SFelix Fietkau struct sk_buff_head retry_q; 18117f1de56SFelix Fietkau 18217f1de56SFelix Fietkau u16 agg_ssn; 18317f1de56SFelix Fietkau bool send_bar; 18417f1de56SFelix Fietkau bool aggr; 18517f1de56SFelix Fietkau }; 18617f1de56SFelix Fietkau 18717f1de56SFelix Fietkau struct mt76_txwi_cache { 18817f1de56SFelix Fietkau u32 txwi[8]; 18917f1de56SFelix Fietkau dma_addr_t dma_addr; 19017f1de56SFelix Fietkau struct list_head list; 19117f1de56SFelix Fietkau }; 19217f1de56SFelix Fietkau 193aee5b8cfSFelix Fietkau 194aee5b8cfSFelix Fietkau struct mt76_rx_tid { 195aee5b8cfSFelix Fietkau struct rcu_head rcu_head; 196aee5b8cfSFelix Fietkau 197aee5b8cfSFelix Fietkau struct mt76_dev *dev; 198aee5b8cfSFelix Fietkau 199aee5b8cfSFelix Fietkau spinlock_t lock; 200aee5b8cfSFelix Fietkau struct delayed_work reorder_work; 201aee5b8cfSFelix Fietkau 202aee5b8cfSFelix Fietkau u16 head; 203aee5b8cfSFelix Fietkau u8 size; 204aee5b8cfSFelix Fietkau u8 nframes; 205aee5b8cfSFelix Fietkau 206aee5b8cfSFelix Fietkau u8 started:1, stopped:1, timer_pending:1; 207aee5b8cfSFelix Fietkau 208aee5b8cfSFelix Fietkau struct sk_buff *reorder_buf[]; 209aee5b8cfSFelix Fietkau }; 210aee5b8cfSFelix Fietkau 21117f1de56SFelix Fietkau enum { 21217f1de56SFelix Fietkau MT76_STATE_INITIALIZED, 21317f1de56SFelix Fietkau MT76_STATE_RUNNING, 21487e022deSStanislaw Gruszka MT76_STATE_MCU_RUNNING, 21517f1de56SFelix Fietkau MT76_SCANNING, 21617f1de56SFelix Fietkau MT76_RESET, 21789bc67e3SFelix Fietkau MT76_OFFCHANNEL, 218b40b15e1SLorenzo Bianconi MT76_REMOVED, 219b40b15e1SLorenzo Bianconi MT76_READING_STATS, 22087e022deSStanislaw Gruszka MT76_MORE_STATS, 22117f1de56SFelix Fietkau }; 22217f1de56SFelix Fietkau 22317f1de56SFelix Fietkau struct mt76_hw_cap { 22417f1de56SFelix Fietkau bool has_2ghz; 22517f1de56SFelix Fietkau bool has_5ghz; 22617f1de56SFelix Fietkau }; 22717f1de56SFelix Fietkau 22817f1de56SFelix Fietkau struct mt76_driver_ops { 22917f1de56SFelix Fietkau u16 txwi_size; 23017f1de56SFelix Fietkau 23117f1de56SFelix Fietkau void (*update_survey)(struct mt76_dev *dev); 23217f1de56SFelix Fietkau 23317f1de56SFelix Fietkau int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr, 23417f1de56SFelix Fietkau struct sk_buff *skb, struct mt76_queue *q, 23517f1de56SFelix Fietkau struct mt76_wcid *wcid, 23617f1de56SFelix Fietkau struct ieee80211_sta *sta, u32 *tx_info); 23717f1de56SFelix Fietkau 23817f1de56SFelix Fietkau void (*tx_complete_skb)(struct mt76_dev *dev, struct mt76_queue *q, 23917f1de56SFelix Fietkau struct mt76_queue_entry *e, bool flush); 24017f1de56SFelix Fietkau 241b40b15e1SLorenzo Bianconi bool (*tx_status_data)(struct mt76_dev *dev, u8 *update); 242b40b15e1SLorenzo Bianconi 24317f1de56SFelix Fietkau void (*rx_skb)(struct mt76_dev *dev, enum mt76_rxq_id q, 24417f1de56SFelix Fietkau struct sk_buff *skb); 24517f1de56SFelix Fietkau 24617f1de56SFelix Fietkau void (*rx_poll_complete)(struct mt76_dev *dev, enum mt76_rxq_id q); 247d71ef286SFelix Fietkau 248d71ef286SFelix Fietkau void (*sta_ps)(struct mt76_dev *dev, struct ieee80211_sta *sta, 249d71ef286SFelix Fietkau bool ps); 25017f1de56SFelix Fietkau }; 25117f1de56SFelix Fietkau 25217f1de56SFelix Fietkau struct mt76_channel_state { 25317f1de56SFelix Fietkau u64 cc_active; 25417f1de56SFelix Fietkau u64 cc_busy; 25517f1de56SFelix Fietkau }; 25617f1de56SFelix Fietkau 25717f1de56SFelix Fietkau struct mt76_sband { 25817f1de56SFelix Fietkau struct ieee80211_supported_band sband; 25917f1de56SFelix Fietkau struct mt76_channel_state *chan; 26017f1de56SFelix Fietkau }; 26117f1de56SFelix Fietkau 262b40b15e1SLorenzo Bianconi /* addr req mask */ 263b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_EEPROM BIT(31) 264b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_CFG BIT(30) 265b40b15e1SLorenzo Bianconi #define MT_VEND_TYPE_MASK (MT_VEND_TYPE_EEPROM | MT_VEND_TYPE_CFG) 266b40b15e1SLorenzo Bianconi 267b40b15e1SLorenzo Bianconi #define MT_VEND_ADDR(type, n) (MT_VEND_TYPE_##type | (n)) 268b40b15e1SLorenzo Bianconi enum mt_vendor_req { 269b40b15e1SLorenzo Bianconi MT_VEND_DEV_MODE = 0x1, 270b40b15e1SLorenzo Bianconi MT_VEND_WRITE = 0x2, 271b40b15e1SLorenzo Bianconi MT_VEND_MULTI_WRITE = 0x6, 272b40b15e1SLorenzo Bianconi MT_VEND_MULTI_READ = 0x7, 273b40b15e1SLorenzo Bianconi MT_VEND_READ_EEPROM = 0x9, 274b40b15e1SLorenzo Bianconi MT_VEND_WRITE_FCE = 0x42, 275b40b15e1SLorenzo Bianconi MT_VEND_WRITE_CFG = 0x46, 276b40b15e1SLorenzo Bianconi MT_VEND_READ_CFG = 0x47, 277b40b15e1SLorenzo Bianconi }; 278b40b15e1SLorenzo Bianconi 279b40b15e1SLorenzo Bianconi enum mt76u_in_ep { 280b40b15e1SLorenzo Bianconi MT_EP_IN_PKT_RX, 281b40b15e1SLorenzo Bianconi MT_EP_IN_CMD_RESP, 282b40b15e1SLorenzo Bianconi __MT_EP_IN_MAX, 283b40b15e1SLorenzo Bianconi }; 284b40b15e1SLorenzo Bianconi 285b40b15e1SLorenzo Bianconi enum mt76u_out_ep { 286b40b15e1SLorenzo Bianconi MT_EP_OUT_INBAND_CMD, 287b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BK, 288b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_BE, 289b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VI, 290b40b15e1SLorenzo Bianconi MT_EP_OUT_AC_VO, 291b40b15e1SLorenzo Bianconi MT_EP_OUT_HCCA, 292b40b15e1SLorenzo Bianconi __MT_EP_OUT_MAX, 293b40b15e1SLorenzo Bianconi }; 294b40b15e1SLorenzo Bianconi 295b40b15e1SLorenzo Bianconi #define MT_SG_MAX_SIZE 8 296b40b15e1SLorenzo Bianconi #define MT_NUM_TX_ENTRIES 256 297b40b15e1SLorenzo Bianconi #define MT_NUM_RX_ENTRIES 128 298b40b15e1SLorenzo Bianconi #define MCU_RESP_URB_SIZE 1024 299b40b15e1SLorenzo Bianconi struct mt76_usb { 300b40b15e1SLorenzo Bianconi struct mutex usb_ctrl_mtx; 301b40b15e1SLorenzo Bianconi u8 data[32]; 302b40b15e1SLorenzo Bianconi 303b40b15e1SLorenzo Bianconi struct tasklet_struct rx_tasklet; 304b40b15e1SLorenzo Bianconi struct tasklet_struct tx_tasklet; 305b40b15e1SLorenzo Bianconi struct delayed_work stat_work; 306b40b15e1SLorenzo Bianconi 307b40b15e1SLorenzo Bianconi u8 out_ep[__MT_EP_OUT_MAX]; 308b40b15e1SLorenzo Bianconi u16 out_max_packet; 309b40b15e1SLorenzo Bianconi u8 in_ep[__MT_EP_IN_MAX]; 310b40b15e1SLorenzo Bianconi u16 in_max_packet; 311b40b15e1SLorenzo Bianconi 312b40b15e1SLorenzo Bianconi struct mt76u_mcu { 313b40b15e1SLorenzo Bianconi struct mutex mutex; 314b40b15e1SLorenzo Bianconi struct completion cmpl; 315b40b15e1SLorenzo Bianconi struct mt76u_buf res; 316b40b15e1SLorenzo Bianconi u32 msg_seq; 317851ab66eSLorenzo Bianconi 318851ab66eSLorenzo Bianconi /* multiple reads */ 319851ab66eSLorenzo Bianconi struct mt76_reg_pair *rp; 320851ab66eSLorenzo Bianconi int rp_len; 321851ab66eSLorenzo Bianconi u32 base; 322851ab66eSLorenzo Bianconi bool burst; 323b40b15e1SLorenzo Bianconi } mcu; 324b40b15e1SLorenzo Bianconi }; 325b40b15e1SLorenzo Bianconi 32617f1de56SFelix Fietkau struct mt76_dev { 32717f1de56SFelix Fietkau struct ieee80211_hw *hw; 32817f1de56SFelix Fietkau struct cfg80211_chan_def chandef; 32917f1de56SFelix Fietkau struct ieee80211_channel *main_chan; 33017f1de56SFelix Fietkau 33117f1de56SFelix Fietkau spinlock_t lock; 33217f1de56SFelix Fietkau spinlock_t cc_lock; 333108a4861SStanislaw Gruszka 334108a4861SStanislaw Gruszka struct mutex mutex; 335108a4861SStanislaw Gruszka 33617f1de56SFelix Fietkau const struct mt76_bus_ops *bus; 33717f1de56SFelix Fietkau const struct mt76_driver_ops *drv; 33817f1de56SFelix Fietkau void __iomem *regs; 33917f1de56SFelix Fietkau struct device *dev; 34017f1de56SFelix Fietkau 34117f1de56SFelix Fietkau struct net_device napi_dev; 342c3d7c82aSFelix Fietkau spinlock_t rx_lock; 34317f1de56SFelix Fietkau struct napi_struct napi[__MT_RXQ_MAX]; 34417f1de56SFelix Fietkau struct sk_buff_head rx_skb[__MT_RXQ_MAX]; 34517f1de56SFelix Fietkau 34617f1de56SFelix Fietkau struct list_head txwi_cache; 34717f1de56SFelix Fietkau struct mt76_queue q_tx[__MT_TXQ_MAX]; 34817f1de56SFelix Fietkau struct mt76_queue q_rx[__MT_RXQ_MAX]; 34917f1de56SFelix Fietkau const struct mt76_queue_ops *queue_ops; 35017f1de56SFelix Fietkau 35126e40d4cSFelix Fietkau wait_queue_head_t tx_wait; 35226e40d4cSFelix Fietkau 35336404c06SStanislaw Gruszka unsigned long wcid_mask[MT76_N_WCIDS / BITS_PER_LONG]; 35436404c06SStanislaw Gruszka 35536404c06SStanislaw Gruszka struct mt76_wcid global_wcid; 35636404c06SStanislaw Gruszka struct mt76_wcid __rcu *wcid[MT76_N_WCIDS]; 35736404c06SStanislaw Gruszka 35817f1de56SFelix Fietkau u8 macaddr[ETH_ALEN]; 35917f1de56SFelix Fietkau u32 rev; 36017f1de56SFelix Fietkau unsigned long state; 36117f1de56SFelix Fietkau 36224114a5fSLorenzo Bianconi u8 antenna_mask; 36324114a5fSLorenzo Bianconi 36417f1de56SFelix Fietkau struct mt76_sband sband_2g; 36517f1de56SFelix Fietkau struct mt76_sband sband_5g; 36617f1de56SFelix Fietkau struct debugfs_blob_wrapper eeprom; 36717f1de56SFelix Fietkau struct debugfs_blob_wrapper otp; 36817f1de56SFelix Fietkau struct mt76_hw_cap cap; 36917f1de56SFelix Fietkau 37017f1de56SFelix Fietkau u32 debugfs_reg; 37117f1de56SFelix Fietkau 37217f1de56SFelix Fietkau struct led_classdev led_cdev; 37317f1de56SFelix Fietkau char led_name[32]; 37417f1de56SFelix Fietkau bool led_al; 37517f1de56SFelix Fietkau u8 led_pin; 376b40b15e1SLorenzo Bianconi 377108a4861SStanislaw Gruszka u32 rxfilter; 378108a4861SStanislaw Gruszka 379b40b15e1SLorenzo Bianconi struct mt76_usb usb; 38017f1de56SFelix Fietkau }; 38117f1de56SFelix Fietkau 38217f1de56SFelix Fietkau enum mt76_phy_type { 38317f1de56SFelix Fietkau MT_PHY_TYPE_CCK, 38417f1de56SFelix Fietkau MT_PHY_TYPE_OFDM, 38517f1de56SFelix Fietkau MT_PHY_TYPE_HT, 38617f1de56SFelix Fietkau MT_PHY_TYPE_HT_GF, 38717f1de56SFelix Fietkau MT_PHY_TYPE_VHT, 38817f1de56SFelix Fietkau }; 38917f1de56SFelix Fietkau 39017f1de56SFelix Fietkau struct mt76_rate_power { 39117f1de56SFelix Fietkau union { 39217f1de56SFelix Fietkau struct { 39317f1de56SFelix Fietkau s8 cck[4]; 39417f1de56SFelix Fietkau s8 ofdm[8]; 39517f1de56SFelix Fietkau s8 ht[16]; 39617f1de56SFelix Fietkau s8 vht[10]; 39717f1de56SFelix Fietkau }; 39817f1de56SFelix Fietkau s8 all[38]; 39917f1de56SFelix Fietkau }; 40017f1de56SFelix Fietkau }; 40117f1de56SFelix Fietkau 4024e34249eSFelix Fietkau struct mt76_rx_status { 4039c68a57bSFelix Fietkau struct mt76_wcid *wcid; 404aee5b8cfSFelix Fietkau 405aee5b8cfSFelix Fietkau unsigned long reorder_time; 406aee5b8cfSFelix Fietkau 40730ce7f44SFelix Fietkau u8 iv[6]; 40830ce7f44SFelix Fietkau 40930ce7f44SFelix Fietkau u8 aggr:1; 410aee5b8cfSFelix Fietkau u8 tid; 411aee5b8cfSFelix Fietkau u16 seqno; 412aee5b8cfSFelix Fietkau 4134e34249eSFelix Fietkau u16 freq; 41430ce7f44SFelix Fietkau u32 flag; 4154e34249eSFelix Fietkau u8 enc_flags; 4164e34249eSFelix Fietkau u8 encoding:2, bw:3; 4174e34249eSFelix Fietkau u8 rate_idx; 4184e34249eSFelix Fietkau u8 nss; 4194e34249eSFelix Fietkau u8 band; 4204e34249eSFelix Fietkau u8 signal; 4214e34249eSFelix Fietkau u8 chains; 4224e34249eSFelix Fietkau s8 chain_signal[IEEE80211_MAX_CHAINS]; 4234e34249eSFelix Fietkau }; 4244e34249eSFelix Fietkau 425d4131273SStanislaw Gruszka #define __mt76_rr(dev, ...) (dev)->bus->rr((dev), __VA_ARGS__) 426d4131273SStanislaw Gruszka #define __mt76_wr(dev, ...) (dev)->bus->wr((dev), __VA_ARGS__) 427d4131273SStanislaw Gruszka #define __mt76_rmw(dev, ...) (dev)->bus->rmw((dev), __VA_ARGS__) 428d4131273SStanislaw Gruszka #define __mt76_wr_copy(dev, ...) (dev)->bus->copy((dev), __VA_ARGS__) 429d4131273SStanislaw Gruszka 430*22c575c4SStanislaw Gruszka #define __mt76_set(dev, offset, val) __mt76_rmw(dev, offset, 0, val) 431*22c575c4SStanislaw Gruszka #define __mt76_clear(dev, offset, val) __mt76_rmw(dev, offset, val, 0) 432*22c575c4SStanislaw Gruszka 43317f1de56SFelix Fietkau #define mt76_rr(dev, ...) (dev)->mt76.bus->rr(&((dev)->mt76), __VA_ARGS__) 43417f1de56SFelix Fietkau #define mt76_wr(dev, ...) (dev)->mt76.bus->wr(&((dev)->mt76), __VA_ARGS__) 43517f1de56SFelix Fietkau #define mt76_rmw(dev, ...) (dev)->mt76.bus->rmw(&((dev)->mt76), __VA_ARGS__) 43617f1de56SFelix Fietkau #define mt76_wr_copy(dev, ...) (dev)->mt76.bus->copy(&((dev)->mt76), __VA_ARGS__) 43717f1de56SFelix Fietkau 43817f1de56SFelix Fietkau #define mt76_set(dev, offset, val) mt76_rmw(dev, offset, 0, val) 43917f1de56SFelix Fietkau #define mt76_clear(dev, offset, val) mt76_rmw(dev, offset, val, 0) 44017f1de56SFelix Fietkau 44117f1de56SFelix Fietkau #define mt76_get_field(_dev, _reg, _field) \ 44217f1de56SFelix Fietkau FIELD_GET(_field, mt76_rr(dev, _reg)) 44317f1de56SFelix Fietkau 44417f1de56SFelix Fietkau #define mt76_rmw_field(_dev, _reg, _field, _val) \ 44517f1de56SFelix Fietkau mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 44617f1de56SFelix Fietkau 44746436b5eSStanislaw Gruszka #define __mt76_rmw_field(_dev, _reg, _field, _val) \ 44846436b5eSStanislaw Gruszka __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val)) 44946436b5eSStanislaw Gruszka 45017f1de56SFelix Fietkau #define mt76_hw(dev) (dev)->mt76.hw 45117f1de56SFelix Fietkau 45217f1de56SFelix Fietkau bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 45317f1de56SFelix Fietkau int timeout); 45417f1de56SFelix Fietkau 45517f1de56SFelix Fietkau #define mt76_poll(dev, ...) __mt76_poll(&((dev)->mt76), __VA_ARGS__) 45617f1de56SFelix Fietkau 45717f1de56SFelix Fietkau bool __mt76_poll_msec(struct mt76_dev *dev, u32 offset, u32 mask, u32 val, 45817f1de56SFelix Fietkau int timeout); 45917f1de56SFelix Fietkau 46017f1de56SFelix Fietkau #define mt76_poll_msec(dev, ...) __mt76_poll_msec(&((dev)->mt76), __VA_ARGS__) 46117f1de56SFelix Fietkau 46217f1de56SFelix Fietkau void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs); 46317f1de56SFelix Fietkau 46417f1de56SFelix Fietkau static inline u16 mt76_chip(struct mt76_dev *dev) 46517f1de56SFelix Fietkau { 46617f1de56SFelix Fietkau return dev->rev >> 16; 46717f1de56SFelix Fietkau } 46817f1de56SFelix Fietkau 46917f1de56SFelix Fietkau static inline u16 mt76_rev(struct mt76_dev *dev) 47017f1de56SFelix Fietkau { 47117f1de56SFelix Fietkau return dev->rev & 0xffff; 47217f1de56SFelix Fietkau } 47317f1de56SFelix Fietkau 47417f1de56SFelix Fietkau #define mt76xx_chip(dev) mt76_chip(&((dev)->mt76)) 47517f1de56SFelix Fietkau #define mt76xx_rev(dev) mt76_rev(&((dev)->mt76)) 47617f1de56SFelix Fietkau 47717f1de56SFelix Fietkau #define mt76_init_queues(dev) (dev)->mt76.queue_ops->init(&((dev)->mt76)) 47817f1de56SFelix Fietkau #define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__) 47917f1de56SFelix Fietkau #define mt76_queue_add_buf(dev, ...) (dev)->mt76.queue_ops->add_buf(&((dev)->mt76), __VA_ARGS__) 48017f1de56SFelix Fietkau #define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__) 48117f1de56SFelix Fietkau #define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__) 48217f1de56SFelix Fietkau #define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__) 48317f1de56SFelix Fietkau 48417f1de56SFelix Fietkau static inline struct mt76_channel_state * 48517f1de56SFelix Fietkau mt76_channel_state(struct mt76_dev *dev, struct ieee80211_channel *c) 48617f1de56SFelix Fietkau { 48717f1de56SFelix Fietkau struct mt76_sband *msband; 48817f1de56SFelix Fietkau int idx; 48917f1de56SFelix Fietkau 49017f1de56SFelix Fietkau if (c->band == NL80211_BAND_2GHZ) 49117f1de56SFelix Fietkau msband = &dev->sband_2g; 49217f1de56SFelix Fietkau else 49317f1de56SFelix Fietkau msband = &dev->sband_5g; 49417f1de56SFelix Fietkau 49517f1de56SFelix Fietkau idx = c - &msband->sband.channels[0]; 49617f1de56SFelix Fietkau return &msband->chan[idx]; 49717f1de56SFelix Fietkau } 49817f1de56SFelix Fietkau 499a85b590cSFelix Fietkau struct mt76_dev *mt76_alloc_device(unsigned int size, 500a85b590cSFelix Fietkau const struct ieee80211_ops *ops); 50117f1de56SFelix Fietkau int mt76_register_device(struct mt76_dev *dev, bool vht, 50217f1de56SFelix Fietkau struct ieee80211_rate *rates, int n_rates); 50317f1de56SFelix Fietkau void mt76_unregister_device(struct mt76_dev *dev); 50417f1de56SFelix Fietkau 50517f1de56SFelix Fietkau struct dentry *mt76_register_debugfs(struct mt76_dev *dev); 50617f1de56SFelix Fietkau 50717f1de56SFelix Fietkau int mt76_eeprom_init(struct mt76_dev *dev, int len); 50817f1de56SFelix Fietkau void mt76_eeprom_override(struct mt76_dev *dev); 50917f1de56SFelix Fietkau 510ee8aa945SLorenzo Bianconi /* increment with wrap-around */ 511ee8aa945SLorenzo Bianconi static inline int mt76_incr(int val, int size) 512ee8aa945SLorenzo Bianconi { 513ee8aa945SLorenzo Bianconi return (val + 1) & (size - 1); 514ee8aa945SLorenzo Bianconi } 515ee8aa945SLorenzo Bianconi 516ee8aa945SLorenzo Bianconi /* decrement with wrap-around */ 517ee8aa945SLorenzo Bianconi static inline int mt76_decr(int val, int size) 518ee8aa945SLorenzo Bianconi { 519ee8aa945SLorenzo Bianconi return (val - 1) & (size - 1); 520ee8aa945SLorenzo Bianconi } 521ee8aa945SLorenzo Bianconi 522b40b15e1SLorenzo Bianconi /* Hardware uses mirrored order of queues with Q3 523b40b15e1SLorenzo Bianconi * having the highest priority 524b40b15e1SLorenzo Bianconi */ 525b40b15e1SLorenzo Bianconi static inline u8 q2hwq(u8 q) 526b40b15e1SLorenzo Bianconi { 527b40b15e1SLorenzo Bianconi return q ^ 0x3; 528b40b15e1SLorenzo Bianconi } 529b40b15e1SLorenzo Bianconi 53017f1de56SFelix Fietkau static inline struct ieee80211_txq * 53117f1de56SFelix Fietkau mtxq_to_txq(struct mt76_txq *mtxq) 53217f1de56SFelix Fietkau { 53317f1de56SFelix Fietkau void *ptr = mtxq; 53417f1de56SFelix Fietkau 53517f1de56SFelix Fietkau return container_of(ptr, struct ieee80211_txq, drv_priv); 53617f1de56SFelix Fietkau } 53717f1de56SFelix Fietkau 5389c68a57bSFelix Fietkau static inline struct ieee80211_sta * 5399c68a57bSFelix Fietkau wcid_to_sta(struct mt76_wcid *wcid) 5409c68a57bSFelix Fietkau { 5419c68a57bSFelix Fietkau void *ptr = wcid; 5429c68a57bSFelix Fietkau 5439c68a57bSFelix Fietkau if (!wcid || !wcid->sta) 5449c68a57bSFelix Fietkau return NULL; 5459c68a57bSFelix Fietkau 5469c68a57bSFelix Fietkau return container_of(ptr, struct ieee80211_sta, drv_priv); 5479c68a57bSFelix Fietkau } 5489c68a57bSFelix Fietkau 549fcdd99ceSLorenzo Bianconi int mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q, 55017f1de56SFelix Fietkau struct sk_buff *skb, struct mt76_wcid *wcid, 55117f1de56SFelix Fietkau struct ieee80211_sta *sta); 55217f1de56SFelix Fietkau 55317f1de56SFelix Fietkau void mt76_rx(struct mt76_dev *dev, enum mt76_rxq_id q, struct sk_buff *skb); 55417f1de56SFelix Fietkau void mt76_tx(struct mt76_dev *dev, struct ieee80211_sta *sta, 55517f1de56SFelix Fietkau struct mt76_wcid *wcid, struct sk_buff *skb); 55617f1de56SFelix Fietkau void mt76_txq_init(struct mt76_dev *dev, struct ieee80211_txq *txq); 55717f1de56SFelix Fietkau void mt76_txq_remove(struct mt76_dev *dev, struct ieee80211_txq *txq); 55817f1de56SFelix Fietkau void mt76_wake_tx_queue(struct ieee80211_hw *hw, struct ieee80211_txq *txq); 55917f1de56SFelix Fietkau void mt76_stop_tx_queues(struct mt76_dev *dev, struct ieee80211_sta *sta, 56017f1de56SFelix Fietkau bool send_bar); 56117f1de56SFelix Fietkau void mt76_txq_schedule(struct mt76_dev *dev, struct mt76_queue *hwq); 56217f1de56SFelix Fietkau void mt76_txq_schedule_all(struct mt76_dev *dev); 56317f1de56SFelix Fietkau void mt76_release_buffered_frames(struct ieee80211_hw *hw, 56417f1de56SFelix Fietkau struct ieee80211_sta *sta, 56517f1de56SFelix Fietkau u16 tids, int nframes, 56617f1de56SFelix Fietkau enum ieee80211_frame_release_type reason, 56717f1de56SFelix Fietkau bool more_data); 56817f1de56SFelix Fietkau void mt76_set_channel(struct mt76_dev *dev); 56917f1de56SFelix Fietkau int mt76_get_survey(struct ieee80211_hw *hw, int idx, 57017f1de56SFelix Fietkau struct survey_info *survey); 5715ebdc3e0SLorenzo Bianconi void mt76_set_stream_caps(struct mt76_dev *dev, bool vht); 57217f1de56SFelix Fietkau 573aee5b8cfSFelix Fietkau int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, 574aee5b8cfSFelix Fietkau u16 ssn, u8 size); 575aee5b8cfSFelix Fietkau void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); 576aee5b8cfSFelix Fietkau 57730ce7f44SFelix Fietkau void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, 57830ce7f44SFelix Fietkau struct ieee80211_key_conf *key); 57930ce7f44SFelix Fietkau 58017f1de56SFelix Fietkau /* internal */ 58117f1de56SFelix Fietkau void mt76_tx_free(struct mt76_dev *dev); 582fcdd99ceSLorenzo Bianconi struct mt76_txwi_cache *mt76_get_txwi(struct mt76_dev *dev); 58317f1de56SFelix Fietkau void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); 5849d9d738bSFelix Fietkau void mt76_rx_complete(struct mt76_dev *dev, struct sk_buff_head *frames, 58581e850efSLorenzo Bianconi struct napi_struct *napi); 58681e850efSLorenzo Bianconi void mt76_rx_poll_complete(struct mt76_dev *dev, enum mt76_rxq_id q, 58781e850efSLorenzo Bianconi struct napi_struct *napi); 588aee5b8cfSFelix Fietkau void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); 58917f1de56SFelix Fietkau 590b40b15e1SLorenzo Bianconi /* usb */ 591b40b15e1SLorenzo Bianconi static inline bool mt76u_urb_error(struct urb *urb) 592b40b15e1SLorenzo Bianconi { 593b40b15e1SLorenzo Bianconi return urb->status && 594b40b15e1SLorenzo Bianconi urb->status != -ECONNRESET && 595b40b15e1SLorenzo Bianconi urb->status != -ESHUTDOWN && 596b40b15e1SLorenzo Bianconi urb->status != -ENOENT; 597b40b15e1SLorenzo Bianconi } 598b40b15e1SLorenzo Bianconi 599b40b15e1SLorenzo Bianconi /* Map hardware queues to usb endpoints */ 600b40b15e1SLorenzo Bianconi static inline u8 q2ep(u8 qid) 601b40b15e1SLorenzo Bianconi { 602b40b15e1SLorenzo Bianconi /* TODO: take management packets to queue 5 */ 603b40b15e1SLorenzo Bianconi return qid + 1; 604b40b15e1SLorenzo Bianconi } 605b40b15e1SLorenzo Bianconi 606b40b15e1SLorenzo Bianconi static inline bool mt76u_check_sg(struct mt76_dev *dev) 607b40b15e1SLorenzo Bianconi { 608b40b15e1SLorenzo Bianconi struct usb_interface *intf = to_usb_interface(dev->dev); 609b40b15e1SLorenzo Bianconi struct usb_device *udev = interface_to_usbdev(intf); 610b40b15e1SLorenzo Bianconi 611b40b15e1SLorenzo Bianconi return (udev->bus->sg_tablesize > 0 && 612b40b15e1SLorenzo Bianconi (udev->bus->no_sg_constraint || 613b40b15e1SLorenzo Bianconi udev->speed == USB_SPEED_WIRELESS)); 614b40b15e1SLorenzo Bianconi } 615b40b15e1SLorenzo Bianconi 616b40b15e1SLorenzo Bianconi int mt76u_vendor_request(struct mt76_dev *dev, u8 req, 617b40b15e1SLorenzo Bianconi u8 req_type, u16 val, u16 offset, 618b40b15e1SLorenzo Bianconi void *buf, size_t len); 619b40b15e1SLorenzo Bianconi void mt76u_single_wr(struct mt76_dev *dev, const u8 req, 620b40b15e1SLorenzo Bianconi const u16 offset, const u32 val); 621b40b15e1SLorenzo Bianconi u32 mt76u_rr(struct mt76_dev *dev, u32 addr); 622b40b15e1SLorenzo Bianconi void mt76u_wr(struct mt76_dev *dev, u32 addr, u32 val); 623b40b15e1SLorenzo Bianconi int mt76u_init(struct mt76_dev *dev, struct usb_interface *intf); 624b40b15e1SLorenzo Bianconi void mt76u_deinit(struct mt76_dev *dev); 625b40b15e1SLorenzo Bianconi int mt76u_buf_alloc(struct mt76_dev *dev, struct mt76u_buf *buf, 626b40b15e1SLorenzo Bianconi int nsgs, int len, int sglen, gfp_t gfp); 627b40b15e1SLorenzo Bianconi void mt76u_buf_free(struct mt76u_buf *buf); 628b40b15e1SLorenzo Bianconi int mt76u_submit_buf(struct mt76_dev *dev, int dir, int index, 629b40b15e1SLorenzo Bianconi struct mt76u_buf *buf, gfp_t gfp, 630b40b15e1SLorenzo Bianconi usb_complete_t complete_fn, void *context); 631b40b15e1SLorenzo Bianconi int mt76u_submit_rx_buffers(struct mt76_dev *dev); 632b40b15e1SLorenzo Bianconi int mt76u_alloc_queues(struct mt76_dev *dev); 633b40b15e1SLorenzo Bianconi void mt76u_stop_queues(struct mt76_dev *dev); 634b40b15e1SLorenzo Bianconi void mt76u_stop_stat_wk(struct mt76_dev *dev); 635b40b15e1SLorenzo Bianconi void mt76u_queues_deinit(struct mt76_dev *dev); 636b40b15e1SLorenzo Bianconi int mt76u_skb_dma_info(struct sk_buff *skb, int port, u32 flags); 637b40b15e1SLorenzo Bianconi 638b40b15e1SLorenzo Bianconi int mt76u_mcu_fw_send_data(struct mt76_dev *dev, const void *data, 639b40b15e1SLorenzo Bianconi int data_len, u32 max_payload, u32 offset); 640b40b15e1SLorenzo Bianconi void mt76u_mcu_complete_urb(struct urb *urb); 641b40b15e1SLorenzo Bianconi struct sk_buff *mt76u_mcu_msg_alloc(const void *data, int len); 6424c89ff2cSLorenzo Bianconi int __mt76u_mcu_send_msg(struct mt76_dev *dev, struct sk_buff *skb, 6434c89ff2cSLorenzo Bianconi int cmd, bool wait_resp); 644b40b15e1SLorenzo Bianconi int mt76u_mcu_send_msg(struct mt76_dev *dev, struct sk_buff *skb, 645b40b15e1SLorenzo Bianconi int cmd, bool wait_resp); 646b40b15e1SLorenzo Bianconi void mt76u_mcu_fw_reset(struct mt76_dev *dev); 647b40b15e1SLorenzo Bianconi int mt76u_mcu_init_rx(struct mt76_dev *dev); 648288d600aSLorenzo Bianconi void mt76u_mcu_deinit(struct mt76_dev *dev); 649b40b15e1SLorenzo Bianconi 65017f1de56SFelix Fietkau #endif 651