334 lines · c
1/* SPDX-License-Identifier: ISC */2/* Copyright (C) 2020 MediaTek Inc. */3 4#ifndef __MT7921_H5#define __MT7921_H6 7#include "../mt792x.h"8#include "regs.h"9 10#define MT7921_TX_RING_SIZE 204811#define MT7921_TX_MCU_RING_SIZE 25612#define MT7921_TX_FWDL_RING_SIZE 12813 14#define MT7921_RX_RING_SIZE 153615#define MT7921_RX_MCU_RING_SIZE 816#define MT7921_RX_MCU_WA_RING_SIZE 51217 18#define MT7921_EEPROM_SIZE 358419#define MT7921_TOKEN_SIZE 819220 21#define MT7921_EEPROM_BLOCK_SIZE 1622 23#define MT7921_SKU_RATE_NUM 16124#define MT7921_SKU_MAX_DELTA_IDX MT7921_SKU_RATE_NUM25#define MT7921_SKU_TABLE_SIZE (MT7921_SKU_RATE_NUM + 1)26 27#define MCU_UNI_EVENT_ROC 0x2728#define MCU_UNI_EVENT_CLC 0x8029 30#define EXT_CMD_RADIO_LED_CTRL_ENABLE 0x131#define EXT_CMD_RADIO_ON_LED 0x232#define EXT_CMD_RADIO_OFF_LED 0x333 34enum {35 UNI_ROC_ACQUIRE,36 UNI_ROC_ABORT,37 UNI_ROC_NUM38};39 40enum mt7921_roc_req {41 MT7921_ROC_REQ_JOIN,42 MT7921_ROC_REQ_ROC,43 MT7921_ROC_REQ_NUM44};45 46enum {47 UNI_EVENT_ROC_GRANT = 0,48 UNI_EVENT_ROC_TAG_NUM49};50 51struct mt7921_realease_info {52 __le16 len;53 u8 pad_len;54 u8 tag;55} __packed;56 57struct mt7921_fw_features {58 u8 segment;59 u8 data;60 u8 rsv[14];61} __packed;62 63struct mt7921_roc_grant_tlv {64 __le16 tag;65 __le16 len;66 u8 bss_idx;67 u8 tokenid;68 u8 status;69 u8 primarychannel;70 u8 rfsco;71 u8 rfband;72 u8 channelwidth;73 u8 centerfreqseg1;74 u8 centerfreqseg2;75 u8 reqtype;76 u8 dbdcband;77 u8 rsv[1];78 __le32 max_interval;79} __packed;80 81enum mt7921_sdio_pkt_type {82 MT7921_SDIO_TXD,83 MT7921_SDIO_DATA,84 MT7921_SDIO_CMD,85 MT7921_SDIO_FWDL,86};87 88struct mt7921_sdio_intr {89 u32 isr;90 struct {91 u32 wtqcr[16];92 } tx;93 struct {94 u16 num[2];95 u16 len0[16];96 u16 len1[128];97 } rx;98 u32 rec_mb[2];99} __packed;100 101#define to_rssi(field, rxv) ((FIELD_GET(field, rxv) - 220) / 2)102#define to_rcpi(rssi) (2 * (rssi) + 220)103 104enum mt7921_txq_id {105 MT7921_TXQ_BAND0,106 MT7921_TXQ_BAND1,107 MT7921_TXQ_FWDL = 16,108 MT7921_TXQ_MCU_WM,109};110 111enum mt7921_rxq_id {112 MT7921_RXQ_BAND0 = 0,113 MT7921_RXQ_BAND1,114 MT7921_RXQ_MCU_WM = 0,115};116 117enum {118 MT7921_CLC_POWER,119 MT7921_CLC_CHAN,120 MT7921_CLC_MAX_NUM,121};122 123struct mt7921_clc_rule {124 u8 alpha2[2];125 u8 type[2];126 __le16 len;127 u8 data[];128} __packed;129 130struct mt7921_clc {131 __le32 len;132 u8 idx;133 u8 ver;134 u8 nr_country;135 u8 type;136 u8 rsv[8];137 u8 data[];138} __packed;139 140enum mt7921_eeprom_field {141 MT_EE_CHIP_ID = 0x000,142 MT_EE_VERSION = 0x002,143 MT_EE_MAC_ADDR = 0x004,144 MT_EE_WIFI_CONF = 0x07c,145 MT_EE_HW_TYPE = 0x55b,146 __MT_EE_MAX = 0x9ff147};148 149#define MT_EE_HW_TYPE_ENCAP BIT(0)150 151enum {152 TXPWR_USER,153 TXPWR_EEPROM,154 TXPWR_MAC,155 TXPWR_MAX_NUM,156};157 158struct mt7921_txpwr {159 u8 ch;160 u8 rsv[3];161 struct {162 u8 ch;163 u8 cck[4];164 u8 ofdm[8];165 u8 ht20[8];166 u8 ht40[9];167 u8 vht20[12];168 u8 vht40[12];169 u8 vht80[12];170 u8 vht160[12];171 u8 he26[12];172 u8 he52[12];173 u8 he106[12];174 u8 he242[12];175 u8 he484[12];176 u8 he996[12];177 u8 he996x2[12];178 } data[TXPWR_MAX_NUM];179};180 181extern const struct ieee80211_ops mt7921_ops;182 183u32 mt7921_reg_map(struct mt792x_dev *dev, u32 addr);184 185int __mt7921_start(struct mt792x_phy *phy);186int mt7921_register_device(struct mt792x_dev *dev);187void mt7921_unregister_device(struct mt792x_dev *dev);188int mt7921_run_firmware(struct mt792x_dev *dev);189int mt7921_set_channel(struct mt76_phy *mphy);190int mt7921_mcu_set_bss_pm(struct mt792x_dev *dev, struct ieee80211_vif *vif,191 bool enable);192int mt7921_mcu_sta_update(struct mt792x_dev *dev, struct ieee80211_sta *sta,193 struct ieee80211_vif *vif, bool enable,194 enum mt76_sta_info_state state);195int mt7921_mcu_set_chan_info(struct mt792x_phy *phy, int cmd);196int mt7921_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_vif *vif);197int mt7921_mcu_set_eeprom(struct mt792x_dev *dev);198int mt7921_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif,199 struct ieee80211_sta *sta, struct rate_info *rate);200int mt7921_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl);201void mt7921_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb);202int mt7921_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif,203 u8 bit_op, u32 bit_map);204int mt7921_mcu_radio_led_ctrl(struct mt792x_dev *dev, u8 value);205 206static inline u32207mt7921_reg_map_l1(struct mt792x_dev *dev, u32 addr)208{209 u32 offset = FIELD_GET(MT_HIF_REMAP_L1_OFFSET, addr);210 u32 base = FIELD_GET(MT_HIF_REMAP_L1_BASE, addr);211 212 mt76_rmw_field(dev, MT_HIF_REMAP_L1, MT_HIF_REMAP_L1_MASK, base);213 /* use read to push write */214 mt76_rr(dev, MT_HIF_REMAP_L1);215 216 return MT_HIF_REMAP_BASE_L1 + offset;217}218 219static inline u32220mt7921_l1_rr(struct mt792x_dev *dev, u32 addr)221{222 return mt76_rr(dev, mt7921_reg_map_l1(dev, addr));223}224 225static inline void226mt7921_l1_wr(struct mt792x_dev *dev, u32 addr, u32 val)227{228 mt76_wr(dev, mt7921_reg_map_l1(dev, addr), val);229}230 231static inline u32232mt7921_l1_rmw(struct mt792x_dev *dev, u32 addr, u32 mask, u32 val)233{234 val |= mt7921_l1_rr(dev, addr) & ~mask;235 mt7921_l1_wr(dev, addr, val);236 237 return val;238}239 240#define mt7921_l1_set(dev, addr, val) mt7921_l1_rmw(dev, addr, 0, val)241#define mt7921_l1_clear(dev, addr, val) mt7921_l1_rmw(dev, addr, val, 0)242 243void mt7921_regd_update(struct mt792x_dev *dev);244int mt7921_mac_init(struct mt792x_dev *dev);245bool mt7921_mac_wtbl_update(struct mt792x_dev *dev, int idx, u32 mask);246int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,247 struct ieee80211_sta *sta);248int mt7921_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif,249 struct ieee80211_sta *sta, enum mt76_sta_event ev);250void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,251 struct ieee80211_sta *sta);252void mt7921_mac_reset_work(struct work_struct *work);253int mt7921e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,254 enum mt76_txq_id qid, struct mt76_wcid *wcid,255 struct ieee80211_sta *sta,256 struct mt76_tx_info *tx_info);257 258bool mt7921_rx_check(struct mt76_dev *mdev, void *data, int len);259void mt7921_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,260 struct sk_buff *skb, u32 *info);261void mt7921_stats_work(struct work_struct *work);262void mt7921_set_stream_he_caps(struct mt792x_phy *phy);263int mt7921_init_debugfs(struct mt792x_dev *dev);264 265int mt7921_mcu_set_beacon_filter(struct mt792x_dev *dev,266 struct ieee80211_vif *vif,267 bool enable);268int mt7921_mcu_uni_tx_ba(struct mt792x_dev *dev,269 struct ieee80211_ampdu_params *params,270 bool enable);271int mt7921_mcu_uni_rx_ba(struct mt792x_dev *dev,272 struct ieee80211_ampdu_params *params,273 bool enable);274void mt7921_scan_work(struct work_struct *work);275void mt7921_roc_work(struct work_struct *work);276int mt7921_mcu_uni_bss_ps(struct mt792x_dev *dev, struct ieee80211_vif *vif);277void mt7921_coredump_work(struct work_struct *work);278int mt7921_get_txpwr_info(struct mt792x_dev *dev, struct mt7921_txpwr *txpwr);279int mt7921_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,280 void *data, int len);281int mt7921_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg,282 struct netlink_callback *cb, void *data, int len);283int mt7921_mcu_parse_response(struct mt76_dev *mdev, int cmd,284 struct sk_buff *skb, int seq);285 286int mt7921e_driver_own(struct mt792x_dev *dev);287int mt7921e_mac_reset(struct mt792x_dev *dev);288int mt7921e_mcu_init(struct mt792x_dev *dev);289int mt7921s_wfsys_reset(struct mt792x_dev *dev);290int mt7921s_mac_reset(struct mt792x_dev *dev);291int mt7921s_init_reset(struct mt792x_dev *dev);292 293int mt7921s_mcu_init(struct mt792x_dev *dev);294int mt7921s_mcu_drv_pmctrl(struct mt792x_dev *dev);295int mt7921s_mcu_fw_pmctrl(struct mt792x_dev *dev);296void mt7921_mac_add_txs(struct mt792x_dev *dev, void *data);297void mt7921_set_runtime_pm(struct mt792x_dev *dev);298void mt7921_mcu_set_suspend_iter(void *priv, u8 *mac,299 struct ieee80211_vif *vif);300void mt7921_set_ipv6_ns_work(struct work_struct *work);301 302int mt7921_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif,303 bool enable);304int mt7921_mcu_config_sniffer(struct mt792x_vif *vif,305 struct ieee80211_chanctx_conf *ctx);306int mt7921_mcu_get_temperature(struct mt792x_phy *phy);307 308int mt7921_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,309 enum mt76_txq_id qid, struct mt76_wcid *wcid,310 struct ieee80211_sta *sta,311 struct mt76_tx_info *tx_info);312void mt7921_usb_sdio_tx_complete_skb(struct mt76_dev *mdev,313 struct mt76_queue_entry *e);314bool mt7921_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update);315 316/* usb */317int mt7921_mcu_uni_add_beacon_offload(struct mt792x_dev *dev,318 struct ieee80211_hw *hw,319 struct ieee80211_vif *vif,320 bool enable);321int mt7921_set_tx_sar_pwr(struct ieee80211_hw *hw,322 const struct cfg80211_sar_specs *sar);323 324int mt7921_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2,325 enum environment_cap env_cap);326int mt7921_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,327 struct ieee80211_channel *chan, int duration,328 enum mt7921_roc_req type, u8 token_id);329int mt7921_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_vif *vif,330 u8 token_id);331void mt7921_roc_abort_sync(struct mt792x_dev *dev);332int mt7921_mcu_set_rssimonitor(struct mt792x_dev *dev, struct ieee80211_vif *vif);333#endif334