16c92544dSBjoern A. Zeeb /* SPDX-License-Identifier: ISC */ 26c92544dSBjoern A. Zeeb /* Copyright (C) 2020 MediaTek Inc. */ 36c92544dSBjoern A. Zeeb 46c92544dSBjoern A. Zeeb #ifndef __MT76_CONNAC_H 56c92544dSBjoern A. Zeeb #define __MT76_CONNAC_H 66c92544dSBjoern A. Zeeb 76c92544dSBjoern A. Zeeb #include "mt76.h" 86c92544dSBjoern A. Zeeb 9*cbb3ec25SBjoern A. Zeeb enum rx_pkt_type { 10*cbb3ec25SBjoern A. Zeeb PKT_TYPE_TXS, 11*cbb3ec25SBjoern A. Zeeb PKT_TYPE_TXRXV, 12*cbb3ec25SBjoern A. Zeeb PKT_TYPE_NORMAL, 13*cbb3ec25SBjoern A. Zeeb PKT_TYPE_RX_DUP_RFB, 14*cbb3ec25SBjoern A. Zeeb PKT_TYPE_RX_TMR, 15*cbb3ec25SBjoern A. Zeeb PKT_TYPE_RETRIEVE, 16*cbb3ec25SBjoern A. Zeeb PKT_TYPE_TXRX_NOTIFY, 17*cbb3ec25SBjoern A. Zeeb PKT_TYPE_RX_EVENT, 18*cbb3ec25SBjoern A. Zeeb PKT_TYPE_NORMAL_MCU, 19*cbb3ec25SBjoern A. Zeeb PKT_TYPE_RX_FW_MONITOR = 0x0c, 20*cbb3ec25SBjoern A. Zeeb PKT_TYPE_TXRX_NOTIFY_V0 = 0x18, 21*cbb3ec25SBjoern A. Zeeb }; 22*cbb3ec25SBjoern A. Zeeb 236c92544dSBjoern A. Zeeb #define MT76_CONNAC_SCAN_IE_LEN 600 246c92544dSBjoern A. Zeeb #define MT76_CONNAC_MAX_NUM_SCHED_SCAN_INTERVAL 10 256c92544dSBjoern A. Zeeb #define MT76_CONNAC_MAX_TIME_SCHED_SCAN_INTERVAL U16_MAX 266c92544dSBjoern A. Zeeb #define MT76_CONNAC_MAX_SCHED_SCAN_SSID 10 276c92544dSBjoern A. Zeeb #define MT76_CONNAC_MAX_SCAN_MATCH 16 286c92544dSBjoern A. Zeeb 296c92544dSBjoern A. Zeeb #define MT76_CONNAC_MAX_WMM_SETS 4 306c92544dSBjoern A. Zeeb 316c92544dSBjoern A. Zeeb #define MT76_CONNAC_COREDUMP_TIMEOUT (HZ / 20) 326c92544dSBjoern A. Zeeb #define MT76_CONNAC_COREDUMP_SZ (1300 * 1024) 336c92544dSBjoern A. Zeeb 346c92544dSBjoern A. Zeeb #define MT_TXD_SIZE (8 * 4) 356c92544dSBjoern A. Zeeb 366c92544dSBjoern A. Zeeb #define MT_USB_TXD_SIZE (MT_TXD_SIZE + 8 * 4) 376c92544dSBjoern A. Zeeb #define MT_USB_HDR_SIZE 4 386c92544dSBjoern A. Zeeb #define MT_USB_TAIL_SIZE 4 396c92544dSBjoern A. Zeeb 406c92544dSBjoern A. Zeeb #define MT_SDIO_TXD_SIZE (MT_TXD_SIZE + 8 * 4) 416c92544dSBjoern A. Zeeb #define MT_SDIO_TAIL_SIZE 8 426c92544dSBjoern A. Zeeb #define MT_SDIO_HDR_SIZE 4 436c92544dSBjoern A. Zeeb 446c92544dSBjoern A. Zeeb #define MT_MSDU_ID_VALID BIT(15) 456c92544dSBjoern A. Zeeb 466c92544dSBjoern A. Zeeb #define MT_TXD_LEN_LAST BIT(15) 476c92544dSBjoern A. Zeeb #define MT_TXD_LEN_MASK GENMASK(11, 0) 486c92544dSBjoern A. Zeeb #define MT_TXD_LEN_MSDU_LAST BIT(14) 496c92544dSBjoern A. Zeeb #define MT_TXD_LEN_AMSDU_LAST BIT(15) 506c92544dSBjoern A. Zeeb 516c92544dSBjoern A. Zeeb enum { 526c92544dSBjoern A. Zeeb CMD_CBW_20MHZ = IEEE80211_STA_RX_BW_20, 536c92544dSBjoern A. Zeeb CMD_CBW_40MHZ = IEEE80211_STA_RX_BW_40, 546c92544dSBjoern A. Zeeb CMD_CBW_80MHZ = IEEE80211_STA_RX_BW_80, 556c92544dSBjoern A. Zeeb CMD_CBW_160MHZ = IEEE80211_STA_RX_BW_160, 566c92544dSBjoern A. Zeeb CMD_CBW_10MHZ, 576c92544dSBjoern A. Zeeb CMD_CBW_5MHZ, 586c92544dSBjoern A. Zeeb CMD_CBW_8080MHZ, 59*cbb3ec25SBjoern A. Zeeb CMD_CBW_320MHZ, 606c92544dSBjoern A. Zeeb 616c92544dSBjoern A. Zeeb CMD_HE_MCS_BW80 = 0, 626c92544dSBjoern A. Zeeb CMD_HE_MCS_BW160, 636c92544dSBjoern A. Zeeb CMD_HE_MCS_BW8080, 646c92544dSBjoern A. Zeeb CMD_HE_MCS_BW_NUM 656c92544dSBjoern A. Zeeb }; 666c92544dSBjoern A. Zeeb 676c92544dSBjoern A. Zeeb enum { 686c92544dSBjoern A. Zeeb HW_BSSID_0 = 0x0, 696c92544dSBjoern A. Zeeb HW_BSSID_1, 706c92544dSBjoern A. Zeeb HW_BSSID_2, 716c92544dSBjoern A. Zeeb HW_BSSID_3, 726c92544dSBjoern A. Zeeb HW_BSSID_MAX = HW_BSSID_3, 736c92544dSBjoern A. Zeeb EXT_BSSID_START = 0x10, 746c92544dSBjoern A. Zeeb EXT_BSSID_1, 756c92544dSBjoern A. Zeeb EXT_BSSID_15 = 0x1f, 766c92544dSBjoern A. Zeeb EXT_BSSID_MAX = EXT_BSSID_15, 776c92544dSBjoern A. Zeeb REPEATER_BSSID_START = 0x20, 786c92544dSBjoern A. Zeeb REPEATER_BSSID_MAX = 0x3f, 796c92544dSBjoern A. Zeeb }; 806c92544dSBjoern A. Zeeb 816c92544dSBjoern A. Zeeb struct mt76_connac_reg_map { 826c92544dSBjoern A. Zeeb u32 phys; 836c92544dSBjoern A. Zeeb u32 maps; 846c92544dSBjoern A. Zeeb u32 size; 856c92544dSBjoern A. Zeeb }; 866c92544dSBjoern A. Zeeb 876c92544dSBjoern A. Zeeb struct mt76_connac_pm { 886c92544dSBjoern A. Zeeb bool enable:1; 896c92544dSBjoern A. Zeeb bool enable_user:1; 906c92544dSBjoern A. Zeeb bool ds_enable:1; 916c92544dSBjoern A. Zeeb bool ds_enable_user:1; 926c92544dSBjoern A. Zeeb bool suspended:1; 936c92544dSBjoern A. Zeeb 946c92544dSBjoern A. Zeeb spinlock_t txq_lock; 956c92544dSBjoern A. Zeeb struct { 966c92544dSBjoern A. Zeeb struct mt76_wcid *wcid; 976c92544dSBjoern A. Zeeb struct sk_buff *skb; 986c92544dSBjoern A. Zeeb } tx_q[IEEE80211_NUM_ACS]; 996c92544dSBjoern A. Zeeb 1006c92544dSBjoern A. Zeeb struct work_struct wake_work; 1016c92544dSBjoern A. Zeeb wait_queue_head_t wait; 1026c92544dSBjoern A. Zeeb 1036c92544dSBjoern A. Zeeb struct { 1046c92544dSBjoern A. Zeeb spinlock_t lock; 1056c92544dSBjoern A. Zeeb u32 count; 1066c92544dSBjoern A. Zeeb } wake; 1076c92544dSBjoern A. Zeeb struct mutex mutex; 1086c92544dSBjoern A. Zeeb 1096c92544dSBjoern A. Zeeb struct delayed_work ps_work; 1106c92544dSBjoern A. Zeeb unsigned long last_activity; 1116c92544dSBjoern A. Zeeb unsigned long idle_timeout; 1126c92544dSBjoern A. Zeeb 1136c92544dSBjoern A. Zeeb struct { 1146c92544dSBjoern A. Zeeb unsigned long last_wake_event; 1156c92544dSBjoern A. Zeeb unsigned long awake_time; 1166c92544dSBjoern A. Zeeb unsigned long last_doze_event; 1176c92544dSBjoern A. Zeeb unsigned long doze_time; 1186c92544dSBjoern A. Zeeb unsigned int lp_wake; 1196c92544dSBjoern A. Zeeb } stats; 1206c92544dSBjoern A. Zeeb }; 1216c92544dSBjoern A. Zeeb 1226c92544dSBjoern A. Zeeb struct mt76_connac_coredump { 1236c92544dSBjoern A. Zeeb struct sk_buff_head msg_list; 1246c92544dSBjoern A. Zeeb struct delayed_work work; 1256c92544dSBjoern A. Zeeb unsigned long last_activity; 1266c92544dSBjoern A. Zeeb }; 1276c92544dSBjoern A. Zeeb 1286c92544dSBjoern A. Zeeb struct mt76_connac_sta_key_conf { 1296c92544dSBjoern A. Zeeb s8 keyidx; 1306c92544dSBjoern A. Zeeb u8 key[16]; 1316c92544dSBjoern A. Zeeb }; 1326c92544dSBjoern A. Zeeb 1336c92544dSBjoern A. Zeeb #define MT_TXP_MAX_BUF_NUM 6 1346c92544dSBjoern A. Zeeb 1356c92544dSBjoern A. Zeeb struct mt76_connac_fw_txp { 1366c92544dSBjoern A. Zeeb __le16 flags; 1376c92544dSBjoern A. Zeeb __le16 token; 1386c92544dSBjoern A. Zeeb u8 bss_idx; 1396c92544dSBjoern A. Zeeb __le16 rept_wds_wcid; 1406c92544dSBjoern A. Zeeb u8 nbuf; 1416c92544dSBjoern A. Zeeb __le32 buf[MT_TXP_MAX_BUF_NUM]; 1426c92544dSBjoern A. Zeeb __le16 len[MT_TXP_MAX_BUF_NUM]; 1436c92544dSBjoern A. Zeeb } __packed __aligned(4); 1446c92544dSBjoern A. Zeeb 1456c92544dSBjoern A. Zeeb #define MT_HW_TXP_MAX_MSDU_NUM 4 1466c92544dSBjoern A. Zeeb #define MT_HW_TXP_MAX_BUF_NUM 4 1476c92544dSBjoern A. Zeeb 1486c92544dSBjoern A. Zeeb struct mt76_connac_txp_ptr { 1496c92544dSBjoern A. Zeeb __le32 buf0; 1506c92544dSBjoern A. Zeeb __le16 len0; 1516c92544dSBjoern A. Zeeb __le16 len1; 1526c92544dSBjoern A. Zeeb __le32 buf1; 1536c92544dSBjoern A. Zeeb } __packed __aligned(4); 1546c92544dSBjoern A. Zeeb 1556c92544dSBjoern A. Zeeb struct mt76_connac_hw_txp { 1566c92544dSBjoern A. Zeeb __le16 msdu_id[MT_HW_TXP_MAX_MSDU_NUM]; 1576c92544dSBjoern A. Zeeb struct mt76_connac_txp_ptr ptr[MT_HW_TXP_MAX_BUF_NUM / 2]; 1586c92544dSBjoern A. Zeeb } __packed __aligned(4); 1596c92544dSBjoern A. Zeeb 1606c92544dSBjoern A. Zeeb struct mt76_connac_txp_common { 1616c92544dSBjoern A. Zeeb union { 1626c92544dSBjoern A. Zeeb struct mt76_connac_fw_txp fw; 1636c92544dSBjoern A. Zeeb struct mt76_connac_hw_txp hw; 1646c92544dSBjoern A. Zeeb }; 1656c92544dSBjoern A. Zeeb }; 1666c92544dSBjoern A. Zeeb 1676c92544dSBjoern A. Zeeb struct mt76_connac_tx_free { 1686c92544dSBjoern A. Zeeb __le16 rx_byte_cnt; 1696c92544dSBjoern A. Zeeb __le16 ctrl; 1706c92544dSBjoern A. Zeeb __le32 txd; 1716c92544dSBjoern A. Zeeb } __packed __aligned(4); 1726c92544dSBjoern A. Zeeb 1736c92544dSBjoern A. Zeeb extern const struct wiphy_wowlan_support mt76_connac_wowlan_support; 1746c92544dSBjoern A. Zeeb 1756c92544dSBjoern A. Zeeb static inline bool is_mt7922(struct mt76_dev *dev) 1766c92544dSBjoern A. Zeeb { 1776c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7922; 1786c92544dSBjoern A. Zeeb } 1796c92544dSBjoern A. Zeeb 1806c92544dSBjoern A. Zeeb static inline bool is_mt7921(struct mt76_dev *dev) 1816c92544dSBjoern A. Zeeb { 1826c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7961 || is_mt7922(dev); 1836c92544dSBjoern A. Zeeb } 1846c92544dSBjoern A. Zeeb 1856c92544dSBjoern A. Zeeb static inline bool is_mt7663(struct mt76_dev *dev) 1866c92544dSBjoern A. Zeeb { 1876c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7663; 1886c92544dSBjoern A. Zeeb } 1896c92544dSBjoern A. Zeeb 1906c92544dSBjoern A. Zeeb static inline bool is_mt7915(struct mt76_dev *dev) 1916c92544dSBjoern A. Zeeb { 1926c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7915; 1936c92544dSBjoern A. Zeeb } 1946c92544dSBjoern A. Zeeb 1956c92544dSBjoern A. Zeeb static inline bool is_mt7916(struct mt76_dev *dev) 1966c92544dSBjoern A. Zeeb { 1976c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7906; 1986c92544dSBjoern A. Zeeb } 1996c92544dSBjoern A. Zeeb 200*cbb3ec25SBjoern A. Zeeb static inline bool is_mt7981(struct mt76_dev *dev) 201*cbb3ec25SBjoern A. Zeeb { 202*cbb3ec25SBjoern A. Zeeb return mt76_chip(dev) == 0x7981; 203*cbb3ec25SBjoern A. Zeeb } 204*cbb3ec25SBjoern A. Zeeb 2056c92544dSBjoern A. Zeeb static inline bool is_mt7986(struct mt76_dev *dev) 2066c92544dSBjoern A. Zeeb { 2076c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7986; 2086c92544dSBjoern A. Zeeb } 2096c92544dSBjoern A. Zeeb 210*cbb3ec25SBjoern A. Zeeb static inline bool is_mt798x(struct mt76_dev *dev) 211*cbb3ec25SBjoern A. Zeeb { 212*cbb3ec25SBjoern A. Zeeb return is_mt7981(dev) || is_mt7986(dev); 213*cbb3ec25SBjoern A. Zeeb } 214*cbb3ec25SBjoern A. Zeeb 215*cbb3ec25SBjoern A. Zeeb static inline bool is_mt7996(struct mt76_dev *dev) 216*cbb3ec25SBjoern A. Zeeb { 217*cbb3ec25SBjoern A. Zeeb return mt76_chip(dev) == 0x7990; 218*cbb3ec25SBjoern A. Zeeb } 219*cbb3ec25SBjoern A. Zeeb 2206c92544dSBjoern A. Zeeb static inline bool is_mt7622(struct mt76_dev *dev) 2216c92544dSBjoern A. Zeeb { 2226c92544dSBjoern A. Zeeb if (!IS_ENABLED(CONFIG_MT7622_WMAC)) 2236c92544dSBjoern A. Zeeb return false; 2246c92544dSBjoern A. Zeeb 2256c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7622; 2266c92544dSBjoern A. Zeeb } 2276c92544dSBjoern A. Zeeb 2286c92544dSBjoern A. Zeeb static inline bool is_mt7615(struct mt76_dev *dev) 2296c92544dSBjoern A. Zeeb { 2306c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7615 || mt76_chip(dev) == 0x7611; 2316c92544dSBjoern A. Zeeb } 2326c92544dSBjoern A. Zeeb 2336c92544dSBjoern A. Zeeb static inline bool is_mt7611(struct mt76_dev *dev) 2346c92544dSBjoern A. Zeeb { 2356c92544dSBjoern A. Zeeb return mt76_chip(dev) == 0x7611; 2366c92544dSBjoern A. Zeeb } 2376c92544dSBjoern A. Zeeb 2386c92544dSBjoern A. Zeeb static inline bool is_connac_v1(struct mt76_dev *dev) 2396c92544dSBjoern A. Zeeb { 2406c92544dSBjoern A. Zeeb return is_mt7615(dev) || is_mt7663(dev) || is_mt7622(dev); 2416c92544dSBjoern A. Zeeb } 2426c92544dSBjoern A. Zeeb 2436c92544dSBjoern A. Zeeb static inline bool is_mt76_fw_txp(struct mt76_dev *dev) 2446c92544dSBjoern A. Zeeb { 2456c92544dSBjoern A. Zeeb switch (mt76_chip(dev)) { 2466c92544dSBjoern A. Zeeb case 0x7961: 2476c92544dSBjoern A. Zeeb case 0x7922: 2486c92544dSBjoern A. Zeeb case 0x7663: 2496c92544dSBjoern A. Zeeb case 0x7622: 2506c92544dSBjoern A. Zeeb return false; 2516c92544dSBjoern A. Zeeb default: 2526c92544dSBjoern A. Zeeb return true; 2536c92544dSBjoern A. Zeeb } 2546c92544dSBjoern A. Zeeb } 2556c92544dSBjoern A. Zeeb 2566c92544dSBjoern A. Zeeb static inline u8 mt76_connac_chan_bw(struct cfg80211_chan_def *chandef) 2576c92544dSBjoern A. Zeeb { 2586c92544dSBjoern A. Zeeb static const u8 width_to_bw[] = { 2596c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_40] = CMD_CBW_40MHZ, 2606c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_80] = CMD_CBW_80MHZ, 2616c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_80P80] = CMD_CBW_8080MHZ, 2626c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_160] = CMD_CBW_160MHZ, 2636c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_5] = CMD_CBW_5MHZ, 2646c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_10] = CMD_CBW_10MHZ, 2656c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_20] = CMD_CBW_20MHZ, 2666c92544dSBjoern A. Zeeb [NL80211_CHAN_WIDTH_20_NOHT] = CMD_CBW_20MHZ, 267*cbb3ec25SBjoern A. Zeeb [NL80211_CHAN_WIDTH_320] = CMD_CBW_320MHZ, 2686c92544dSBjoern A. Zeeb }; 2696c92544dSBjoern A. Zeeb 2706c92544dSBjoern A. Zeeb if (chandef->width >= ARRAY_SIZE(width_to_bw)) 2716c92544dSBjoern A. Zeeb return 0; 2726c92544dSBjoern A. Zeeb 2736c92544dSBjoern A. Zeeb return width_to_bw[chandef->width]; 2746c92544dSBjoern A. Zeeb } 2756c92544dSBjoern A. Zeeb 2766c92544dSBjoern A. Zeeb static inline u8 mt76_connac_lmac_mapping(u8 ac) 2776c92544dSBjoern A. Zeeb { 2786c92544dSBjoern A. Zeeb /* LMAC uses the reverse order of mac80211 AC indexes */ 2796c92544dSBjoern A. Zeeb return 3 - ac; 2806c92544dSBjoern A. Zeeb } 2816c92544dSBjoern A. Zeeb 2826c92544dSBjoern A. Zeeb static inline void * 2836c92544dSBjoern A. Zeeb mt76_connac_txwi_to_txp(struct mt76_dev *dev, struct mt76_txwi_cache *t) 2846c92544dSBjoern A. Zeeb { 2856c92544dSBjoern A. Zeeb u8 *txwi; 2866c92544dSBjoern A. Zeeb 2876c92544dSBjoern A. Zeeb if (!t) 2886c92544dSBjoern A. Zeeb return NULL; 2896c92544dSBjoern A. Zeeb 2906c92544dSBjoern A. Zeeb txwi = mt76_get_txwi_ptr(dev, t); 2916c92544dSBjoern A. Zeeb 2926c92544dSBjoern A. Zeeb return (void *)(txwi + MT_TXD_SIZE); 2936c92544dSBjoern A. Zeeb } 2946c92544dSBjoern A. Zeeb 295*cbb3ec25SBjoern A. Zeeb static inline u8 mt76_connac_spe_idx(u8 antenna_mask) 296*cbb3ec25SBjoern A. Zeeb { 297*cbb3ec25SBjoern A. Zeeb static const u8 ant_to_spe[] = {0, 0, 1, 0, 3, 2, 4, 0, 298*cbb3ec25SBjoern A. Zeeb 9, 8, 6, 10, 16, 12, 18, 0}; 299*cbb3ec25SBjoern A. Zeeb 300*cbb3ec25SBjoern A. Zeeb if (antenna_mask >= sizeof(ant_to_spe)) 301*cbb3ec25SBjoern A. Zeeb return 0; 302*cbb3ec25SBjoern A. Zeeb 303*cbb3ec25SBjoern A. Zeeb return ant_to_spe[antenna_mask]; 304*cbb3ec25SBjoern A. Zeeb } 305*cbb3ec25SBjoern A. Zeeb 306*cbb3ec25SBjoern A. Zeeb static inline void mt76_connac_irq_enable(struct mt76_dev *dev, u32 mask) 307*cbb3ec25SBjoern A. Zeeb { 308*cbb3ec25SBjoern A. Zeeb mt76_set_irq_mask(dev, 0, 0, mask); 309*cbb3ec25SBjoern A. Zeeb tasklet_schedule(&dev->irq_tasklet); 310*cbb3ec25SBjoern A. Zeeb } 311*cbb3ec25SBjoern A. Zeeb 3126c92544dSBjoern A. Zeeb int mt76_connac_pm_wake(struct mt76_phy *phy, struct mt76_connac_pm *pm); 3136c92544dSBjoern A. Zeeb void mt76_connac_power_save_sched(struct mt76_phy *phy, 3146c92544dSBjoern A. Zeeb struct mt76_connac_pm *pm); 3156c92544dSBjoern A. Zeeb void mt76_connac_free_pending_tx_skbs(struct mt76_connac_pm *pm, 3166c92544dSBjoern A. Zeeb struct mt76_wcid *wcid); 3176c92544dSBjoern A. Zeeb 3186c92544dSBjoern A. Zeeb static inline void mt76_connac_tx_cleanup(struct mt76_dev *dev) 3196c92544dSBjoern A. Zeeb { 3206c92544dSBjoern A. Zeeb dev->queue_ops->tx_cleanup(dev, dev->q_mcu[MT_MCUQ_WM], false); 3216c92544dSBjoern A. Zeeb dev->queue_ops->tx_cleanup(dev, dev->q_mcu[MT_MCUQ_WA], false); 3226c92544dSBjoern A. Zeeb } 3236c92544dSBjoern A. Zeeb 3246c92544dSBjoern A. Zeeb static inline bool 3256c92544dSBjoern A. Zeeb mt76_connac_pm_ref(struct mt76_phy *phy, struct mt76_connac_pm *pm) 3266c92544dSBjoern A. Zeeb { 3276c92544dSBjoern A. Zeeb bool ret = false; 3286c92544dSBjoern A. Zeeb 3296c92544dSBjoern A. Zeeb spin_lock_bh(&pm->wake.lock); 3306c92544dSBjoern A. Zeeb if (test_bit(MT76_STATE_PM, &phy->state)) 3316c92544dSBjoern A. Zeeb goto out; 3326c92544dSBjoern A. Zeeb 3336c92544dSBjoern A. Zeeb pm->wake.count++; 3346c92544dSBjoern A. Zeeb ret = true; 3356c92544dSBjoern A. Zeeb out: 3366c92544dSBjoern A. Zeeb spin_unlock_bh(&pm->wake.lock); 3376c92544dSBjoern A. Zeeb 3386c92544dSBjoern A. Zeeb return ret; 3396c92544dSBjoern A. Zeeb } 3406c92544dSBjoern A. Zeeb 3416c92544dSBjoern A. Zeeb static inline void 3426c92544dSBjoern A. Zeeb mt76_connac_pm_unref(struct mt76_phy *phy, struct mt76_connac_pm *pm) 3436c92544dSBjoern A. Zeeb { 3446c92544dSBjoern A. Zeeb spin_lock_bh(&pm->wake.lock); 3456c92544dSBjoern A. Zeeb 3466c92544dSBjoern A. Zeeb pm->last_activity = jiffies; 3476c92544dSBjoern A. Zeeb if (--pm->wake.count == 0 && 3486c92544dSBjoern A. Zeeb test_bit(MT76_STATE_MCU_RUNNING, &phy->state)) 3496c92544dSBjoern A. Zeeb mt76_connac_power_save_sched(phy, pm); 3506c92544dSBjoern A. Zeeb 3516c92544dSBjoern A. Zeeb spin_unlock_bh(&pm->wake.lock); 3526c92544dSBjoern A. Zeeb } 3536c92544dSBjoern A. Zeeb 3546c92544dSBjoern A. Zeeb static inline bool 3556c92544dSBjoern A. Zeeb mt76_connac_skip_fw_pmctrl(struct mt76_phy *phy, struct mt76_connac_pm *pm) 3566c92544dSBjoern A. Zeeb { 3576c92544dSBjoern A. Zeeb struct mt76_dev *dev = phy->dev; 3586c92544dSBjoern A. Zeeb bool ret; 3596c92544dSBjoern A. Zeeb 3606c92544dSBjoern A. Zeeb if (dev->token_count) 3616c92544dSBjoern A. Zeeb return true; 3626c92544dSBjoern A. Zeeb 3636c92544dSBjoern A. Zeeb spin_lock_bh(&pm->wake.lock); 3646c92544dSBjoern A. Zeeb ret = pm->wake.count || test_and_set_bit(MT76_STATE_PM, &phy->state); 3656c92544dSBjoern A. Zeeb spin_unlock_bh(&pm->wake.lock); 3666c92544dSBjoern A. Zeeb 3676c92544dSBjoern A. Zeeb return ret; 3686c92544dSBjoern A. Zeeb } 3696c92544dSBjoern A. Zeeb 3706c92544dSBjoern A. Zeeb static inline void 3716c92544dSBjoern A. Zeeb mt76_connac_mutex_acquire(struct mt76_dev *dev, struct mt76_connac_pm *pm) 3726c92544dSBjoern A. Zeeb __acquires(&dev->mutex) 3736c92544dSBjoern A. Zeeb { 3746c92544dSBjoern A. Zeeb mutex_lock(&dev->mutex); 3756c92544dSBjoern A. Zeeb mt76_connac_pm_wake(&dev->phy, pm); 3766c92544dSBjoern A. Zeeb } 3776c92544dSBjoern A. Zeeb 3786c92544dSBjoern A. Zeeb static inline void 3796c92544dSBjoern A. Zeeb mt76_connac_mutex_release(struct mt76_dev *dev, struct mt76_connac_pm *pm) 3806c92544dSBjoern A. Zeeb __releases(&dev->mutex) 3816c92544dSBjoern A. Zeeb { 3826c92544dSBjoern A. Zeeb mt76_connac_power_save_sched(&dev->phy, pm); 3836c92544dSBjoern A. Zeeb mutex_unlock(&dev->mutex); 3846c92544dSBjoern A. Zeeb } 3856c92544dSBjoern A. Zeeb 386*cbb3ec25SBjoern A. Zeeb void mt76_connac_gen_ppe_thresh(u8 *he_ppet, int nss); 3876c92544dSBjoern A. Zeeb int mt76_connac_init_tx_queues(struct mt76_phy *phy, int idx, int n_desc, 3886c92544dSBjoern A. Zeeb int ring_base, u32 flags); 3896c92544dSBjoern A. Zeeb void mt76_connac_write_hw_txp(struct mt76_dev *dev, 3906c92544dSBjoern A. Zeeb struct mt76_tx_info *tx_info, 3916c92544dSBjoern A. Zeeb void *txp_ptr, u32 id); 3926c92544dSBjoern A. Zeeb void mt76_connac_txp_skb_unmap(struct mt76_dev *dev, 3936c92544dSBjoern A. Zeeb struct mt76_txwi_cache *txwi); 3946c92544dSBjoern A. Zeeb void mt76_connac_tx_complete_skb(struct mt76_dev *mdev, 3956c92544dSBjoern A. Zeeb struct mt76_queue_entry *e); 3966c92544dSBjoern A. Zeeb void mt76_connac_pm_queue_skb(struct ieee80211_hw *hw, 3976c92544dSBjoern A. Zeeb struct mt76_connac_pm *pm, 3986c92544dSBjoern A. Zeeb struct mt76_wcid *wcid, 3996c92544dSBjoern A. Zeeb struct sk_buff *skb); 4006c92544dSBjoern A. Zeeb void mt76_connac_pm_dequeue_skbs(struct mt76_phy *phy, 4016c92544dSBjoern A. Zeeb struct mt76_connac_pm *pm); 4026c92544dSBjoern A. Zeeb void mt76_connac2_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, 4036c92544dSBjoern A. Zeeb struct sk_buff *skb, struct mt76_wcid *wcid, 4046c92544dSBjoern A. Zeeb struct ieee80211_key_conf *key, int pid, 4056c92544dSBjoern A. Zeeb enum mt76_txq_id qid, u32 changed); 406*cbb3ec25SBjoern A. Zeeb u16 mt76_connac2_mac_tx_rate_val(struct mt76_phy *mphy, 407*cbb3ec25SBjoern A. Zeeb struct ieee80211_vif *vif, 408*cbb3ec25SBjoern A. Zeeb bool beacon, bool mcast); 4096c92544dSBjoern A. Zeeb bool mt76_connac2_mac_fill_txs(struct mt76_dev *dev, struct mt76_wcid *wcid, 4106c92544dSBjoern A. Zeeb __le32 *txs_data); 4116c92544dSBjoern A. Zeeb bool mt76_connac2_mac_add_txs_skb(struct mt76_dev *dev, struct mt76_wcid *wcid, 4126c92544dSBjoern A. Zeeb int pid, __le32 *txs_data); 4136c92544dSBjoern A. Zeeb void mt76_connac2_mac_decode_he_radiotap(struct mt76_dev *dev, 4146c92544dSBjoern A. Zeeb struct sk_buff *skb, 4156c92544dSBjoern A. Zeeb __le32 *rxv, u32 mode); 4166c92544dSBjoern A. Zeeb int mt76_connac2_reverse_frag0_hdr_trans(struct ieee80211_vif *vif, 4176c92544dSBjoern A. Zeeb struct sk_buff *skb, u16 hdr_offset); 4186c92544dSBjoern A. Zeeb int mt76_connac2_mac_fill_rx_rate(struct mt76_dev *dev, 4196c92544dSBjoern A. Zeeb struct mt76_rx_status *status, 4206c92544dSBjoern A. Zeeb struct ieee80211_supported_band *sband, 4216c92544dSBjoern A. Zeeb __le32 *rxv, u8 *mode); 422*cbb3ec25SBjoern A. Zeeb void mt76_connac2_tx_check_aggr(struct ieee80211_sta *sta, __le32 *txwi); 423*cbb3ec25SBjoern A. Zeeb void mt76_connac2_txwi_free(struct mt76_dev *dev, struct mt76_txwi_cache *t, 424*cbb3ec25SBjoern A. Zeeb struct ieee80211_sta *sta, 425*cbb3ec25SBjoern A. Zeeb struct list_head *free_list); 426*cbb3ec25SBjoern A. Zeeb void mt76_connac2_tx_token_put(struct mt76_dev *dev); 4276c92544dSBjoern A. Zeeb 428*cbb3ec25SBjoern A. Zeeb /* connac3 */ 429*cbb3ec25SBjoern A. Zeeb void mt76_connac3_mac_decode_he_radiotap(struct sk_buff *skb, __le32 *rxv, 430*cbb3ec25SBjoern A. Zeeb u8 mode); 4316c92544dSBjoern A. Zeeb #endif /* __MT76_CONNAC_H */ 432