blob: 1fdf5cfb956489e08a0d3ea0b61e19bcbf42b797 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GARNET_DRIVERS_WLAN_MEDIATEK_RALINK_RALINK_H_
#define GARNET_DRIVERS_WLAN_MEDIATEK_RALINK_RALINK_H_
#include "register.h"
namespace ralink {
enum UsbVendorRequest : uint8_t {
kDeviceMode = 1,
kSingleWrite = 2,
kSingleRead = 3,
kMultiWrite = 6,
kMultiRead = 7,
kEepromWrite = 8,
kEepromRead = 9,
kLedControl = 10,
kRxControl = 12,
};
enum UsbModeOffset : uint8_t {
kReset = 1,
kUnplug = 2,
kFunction = 3,
kTest = 4,
kFirmware = 8,
kAutorun = 17,
};
constexpr uint16_t RT5390 = 0x5390;
constexpr uint16_t REV_RT5390F = 0x0502;
constexpr uint16_t REV_RT5390R = 0x1502;
constexpr uint16_t RT5592 = 0x5592;
constexpr uint16_t REV_RT5592C = 0x221;
struct RxWcidEntry {
uint8_t mac[6];
uint8_t ba_sess_mask[2];
} __PACKED;
constexpr uint16_t RX_WCID_BASE = 0x1800;
constexpr uint16_t FW_IMAGE_BASE = 0x3000;
constexpr uint16_t PAIRWISE_KEY_BASE = 0x4000;
constexpr uint16_t BEACON_BASE = 0x4000;
constexpr uint16_t IV_EIV_BASE = 0x6000;
constexpr uint16_t WCID_ATTR_BASE = 0x6800;
constexpr uint16_t SHARED_KEY_BASE = 0x6c00;
constexpr uint16_t SHARED_KEY_MODE_BASE = 0x7000;
// B/G min/max TX power
constexpr int8_t kMinTxPower_BG = 0; // Seemingly dBm unit, assuming 1 Tx chain
constexpr int8_t kMaxTxPower_BG = 31; //
constexpr int8_t kMinTxPower_A = -7; // Seemingly dBm unit, assuming 2 Tx chain
constexpr int8_t kMaxTxPower_A = 15; //
// EIRP max power
constexpr uint16_t kEirpMaxPower = 0x50; // Seemingly 0.5 dBm unit, making 40 dBm
// TX compensation max power
constexpr uint16_t kTxCompMaxPower = 0x0c; // Unit uncertain.
// Device supports multiple rotating group keys for each BSS.
constexpr int8_t kGroupKeysPerBss = 4;
// A shared key mode allows configuring key mode for all the keys of two BSS.
constexpr int8_t kKeyModesPerSharedKeyMode = kGroupKeysPerBss * 2;
constexpr int8_t kMaxSharedKeys = 31;
constexpr int8_t kNoProtectionKeyLen = 0;
// Beacon offset's value is a multiple of 64 bytes.
constexpr uint8_t kBeaconOffsetFactorByte = 64;
constexpr size_t kMaxBeaconSizeByte = 512;
// Entry for pairwise and shared key table.
struct KeyEntry {
uint8_t key[16];
uint8_t txMic[8];
uint8_t rxMic[8];
} __PACKED;
struct IvEivEntry {
uint8_t iv[4];
uint8_t eiv[4];
} __PACKED;
// KeyMode cipher definitions differ from IEEE's cipher suite types.
// Compare to: IEEE Std 802.11-2016, 9.4.2.25.2, Table 9-131
// See also garnet/lib/wlan/common/include/wlan/common/cipher.h
enum KeyMode : uint8_t {
kNone = 0,
kWep42 = 1,
kWep104 = 2,
kTkip = 3,
kAes = 4,
kCkip42 = 5,
kCkip104 = 6,
kCkip128 = 7,
kWapi = 8,
kUnsupported = 9,
} __PACKED;
enum KeyType : uint8_t {
kSharedKey = 0,
kPairwiseKey = 1,
};
class WcidAttrEntry : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(keyType, 0, 1);
WLAN_BIT_FIELD(keyMode, 1, 3);
WLAN_BIT_FIELD(bssIdx, 4, 3);
WLAN_BIT_FIELD(rxUsrDef, 7, 3);
WLAN_BIT_FIELD(keyModeExt, 10, 1);
WLAN_BIT_FIELD(bssIdxExt, 11, 1);
WLAN_BIT_FIELD(rsv, 12, 3);
WLAN_BIT_FIELD(wapiMcbc, 15, 1);
WLAN_BIT_FIELD(wapiRsv, 16, 8);
WLAN_BIT_FIELD(wapiKeyIdx, 24, 8);
};
// Each SharedKeyMode entry allows to set the key mode for 8 shared keys.
class SharedKeyModeEntry {
public:
uint32_t value;
zx_status_t set(uint8_t skey_idx, KeyMode mode) {
if (skey_idx >= kKeyModesPerSharedKeyMode) { return ZX_ERR_INVALID_ARGS; }
uint8_t offset = skey_idx * 4;
uint32_t cleared = value & ~(15 << offset);
value = cleared | ((mode & 15) << offset);
return ZX_OK;
}
};
// Registers
// TODO(tkilbourn): differentiate between read-only and read/write registers
class IntStatus : public Register<0x0200> {
public:
WLAN_BIT_FIELD(rx_dly_int, 0, 1);
WLAN_BIT_FIELD(tx_dly_int, 1, 1);
WLAN_BIT_FIELD(rx_done_int, 2, 1);
WLAN_BIT_FIELD(tx_done_int0, 3, 1);
WLAN_BIT_FIELD(tx_done_int1, 4, 2);
WLAN_BIT_FIELD(tx_done_int2, 5, 1);
WLAN_BIT_FIELD(tx_done_int3, 6, 1);
WLAN_BIT_FIELD(tx_done_int4, 7, 1);
WLAN_BIT_FIELD(tx_done_int5, 8, 1);
WLAN_BIT_FIELD(mcu_cmd_int, 9, 1);
WLAN_BIT_FIELD(tx_rx_coherent, 10, 1);
WLAN_BIT_FIELD(mac_int_0, 11, 1);
WLAN_BIT_FIELD(mac_int_1, 12, 1);
WLAN_BIT_FIELD(mac_int_2, 13, 1);
WLAN_BIT_FIELD(mac_int_3, 14, 1);
WLAN_BIT_FIELD(mac_int_4, 15, 1);
WLAN_BIT_FIELD(rx_coherent, 16, 1);
WLAN_BIT_FIELD(tx_coherent, 17, 1);
};
class WpdmaGloCfg : public Register<0x0208> {
public:
WLAN_BIT_FIELD(tx_dma_en, 0, 1);
WLAN_BIT_FIELD(tx_dma_busy, 1, 1);
WLAN_BIT_FIELD(rx_dma_en, 2, 1);
WLAN_BIT_FIELD(rx_dma_busy, 3, 1);
WLAN_BIT_FIELD(wpdma_bt_size, 4, 2);
WLAN_BIT_FIELD(tx_wb_ddone, 6, 1);
WLAN_BIT_FIELD(big_endian, 7, 1);
WLAN_BIT_FIELD(hdr_seg_len, 8, 8);
};
class GpioCtrl : public Register<0x0228> {
public:
WLAN_BIT_FIELD(gpio0_data, 0, 1);
WLAN_BIT_FIELD(gpio1_data, 1, 1);
WLAN_BIT_FIELD(gpio2_data, 2, 1);
WLAN_BIT_FIELD(gpio3_data, 3, 1);
WLAN_BIT_FIELD(gpio4_data, 4, 1);
WLAN_BIT_FIELD(gpio5_data, 5, 1);
WLAN_BIT_FIELD(gpio6_data, 6, 1);
WLAN_BIT_FIELD(gpio7_data, 7, 1);
WLAN_BIT_FIELD(gpio0_dir, 8, 1);
WLAN_BIT_FIELD(gpio1_dir, 9, 1);
WLAN_BIT_FIELD(gpio2_dir, 10, 1);
WLAN_BIT_FIELD(gpio3_dir, 11, 1);
WLAN_BIT_FIELD(gpio4_dir, 12, 1);
WLAN_BIT_FIELD(gpio5_dir, 13, 1);
WLAN_BIT_FIELD(gpio6_dir, 14, 1);
WLAN_BIT_FIELD(gpio7_dir, 15, 1);
WLAN_BIT_FIELD(gpio8_data, 16, 1);
WLAN_BIT_FIELD(gpio9_data, 17, 1);
WLAN_BIT_FIELD(gpio10_data, 18, 1);
WLAN_BIT_FIELD(gpio11_data, 19, 1);
WLAN_BIT_FIELD(gpio8_dir, 24, 1);
WLAN_BIT_FIELD(gpio9_dir, 25, 1);
WLAN_BIT_FIELD(gpio10_dir, 26, 1);
WLAN_BIT_FIELD(gpio11_dir, 27, 1);
};
class UsbDmaCfg : public Register<0x02a0> {
public:
WLAN_BIT_FIELD(rx_agg_to, 0, 8);
WLAN_BIT_FIELD(rx_agg_limit, 8, 8);
WLAN_BIT_FIELD(phy_wd_en, 16, 1);
WLAN_BIT_FIELD(tx_clear, 19, 1);
WLAN_BIT_FIELD(txop_hald, 20, 1);
WLAN_BIT_FIELD(rx_agg_en, 21, 1);
WLAN_BIT_FIELD(udma_rx_en, 22, 1);
WLAN_BIT_FIELD(udma_tx_en, 23, 1);
WLAN_BIT_FIELD(epout_vld, 24, 5);
WLAN_BIT_FIELD(rx_busy, 30, 1);
WLAN_BIT_FIELD(tx_busy, 31, 1);
};
class UsCycCnt : public Register<0x02a4> {
public:
WLAN_BIT_FIELD(us_cyc_count, 0, 8);
WLAN_BIT_FIELD(bt_mode_en, 8, 1);
WLAN_BIT_FIELD(test_sel, 16, 8);
WLAN_BIT_FIELD(test_en, 24, 1);
WLAN_BIT_FIELD(edt_bypass, 28, 1);
};
class SysCtrl : public Register<0x0400> {
public:
WLAN_BIT_FIELD(mcu_ready, 7, 1);
WLAN_BIT_FIELD(pme_oen, 13, 1);
};
class HostCmd : public Register<0x0404> {
public:
WLAN_BIT_FIELD(command, 0, 32);
};
class MaxPcnt : public Register<0x040c> {
public:
WLAN_BIT_FIELD(max_rx0q_pcnt, 0, 8);
WLAN_BIT_FIELD(max_tx2q_pcnt, 8, 8);
WLAN_BIT_FIELD(max_tx1q_pcnt, 16, 8);
WLAN_BIT_FIELD(max_tx0q_pcnt, 24, 8);
};
class PbfCfg : public Register<0x0408> {
public:
// bit 0 unknown
WLAN_BIT_FIELD(rx0q_en, 1, 1);
WLAN_BIT_FIELD(tx2q_en, 2, 1);
WLAN_BIT_FIELD(tx1q_en, 3, 1);
WLAN_BIT_FIELD(tx0q_en, 4, 1);
// bit 5-7 unknown
WLAN_BIT_FIELD(hcca_mode, 8, 1);
WLAN_BIT_FIELD(rx0q_mode, 9, 1);
WLAN_BIT_FIELD(tx2q_mode, 10, 1);
WLAN_BIT_FIELD(tx1q_mode, 11, 1);
WLAN_BIT_FIELD(tx0q_mode, 12, 1);
WLAN_BIT_FIELD(rx_drop_mode, 13, 1);
WLAN_BIT_FIELD(null1_mode, 14, 1);
WLAN_BIT_FIELD(null0_mode, 15, 1);
WLAN_BIT_FIELD(tx2q_num, 16, 5);
WLAN_BIT_FIELD(tx1q_num, 21, 3);
WLAN_BIT_FIELD(null2_sel, 24, 3);
};
class BcnOffset0 : public Register<0x042C> {
public:
WLAN_BIT_FIELD(bcn0_offset, 0, 8);
WLAN_BIT_FIELD(bcn1_offset, 8, 8);
WLAN_BIT_FIELD(bcn2_offset, 16, 8);
WLAN_BIT_FIELD(bcn3_offset, 24, 8);
};
class BcnOffset1 : public Register<0x0430> {
public:
WLAN_BIT_FIELD(bcn4_offset, 0, 8);
WLAN_BIT_FIELD(bcn5_offset, 8, 8);
WLAN_BIT_FIELD(bcn6_offset, 16, 8);
WLAN_BIT_FIELD(bcn7_offset, 24, 8);
};
// CSR: Control / Status Register
class RfCsrCfg : public Register<0x0500> {
public:
WLAN_BIT_FIELD(rf_csr_data, 0, 8);
WLAN_BIT_FIELD(rf_csr_addr, 8, 6);
WLAN_BIT_FIELD(rf_csr_rw, 16, 1);
WLAN_BIT_FIELD(rf_csr_kick, 17, 1);
};
class EfuseCtrl : public Register<0x0580> {
public:
WLAN_BIT_FIELD(sel_efuse, 31, 1);
WLAN_BIT_FIELD(efsrom_kick, 30, 1);
WLAN_BIT_FIELD(efsrom_ain, 16, 10);
WLAN_BIT_FIELD(efsrom_mode, 6, 2);
};
class RfuseData0 : public Register<0x059c> {};
class RfuseData1 : public Register<0x0598> {};
class RfuseData2 : public Register<0x0594> {};
class RfuseData3 : public Register<0x0590> {};
class LdoCfg0 : public Register<0x05d4> {
public:
WLAN_BIT_FIELD(delay3, 0, 8);
WLAN_BIT_FIELD(delay2, 8, 8);
WLAN_BIT_FIELD(delay1, 16, 8);
WLAN_BIT_FIELD(bgsel, 24, 2);
WLAN_BIT_FIELD(ldo_core_vlevel, 26, 3);
WLAN_BIT_FIELD(ldo25_level, 29, 2);
WLAN_BIT_FIELD(ldo25_largea, 31, 1);
};
class DebugIndex : public Register<0x05e8> {
public:
WLAN_BIT_FIELD(testcsr_dbg_idx, 0, 8);
WLAN_BIT_FIELD(reserved_xtal, 31, 1);
};
class AsicVerId : public Register<0x1000> {
public:
WLAN_BIT_FIELD(rev_id, 0, 16);
WLAN_BIT_FIELD(ver_id, 16, 16);
};
class MacSysCtrl : public Register<0x1004> {
public:
WLAN_BIT_FIELD(mac_srst, 0, 1);
WLAN_BIT_FIELD(bbp_hrst, 1, 1);
WLAN_BIT_FIELD(mac_tx_en, 2, 1);
WLAN_BIT_FIELD(mac_rx_en, 3, 1);
};
class MacAddrDw0 : public Register<0x1008> {
public:
WLAN_BIT_FIELD(mac_addr_0, 0, 8);
WLAN_BIT_FIELD(mac_addr_1, 8, 8);
WLAN_BIT_FIELD(mac_addr_2, 16, 8);
WLAN_BIT_FIELD(mac_addr_3, 24, 8);
};
class MacAddrDw1 : public Register<0x100c> {
public:
WLAN_BIT_FIELD(mac_addr_4, 0, 8);
WLAN_BIT_FIELD(mac_addr_5, 8, 8);
WLAN_BIT_FIELD(unicast_to_me_mask, 16, 8);
};
enum MultiBssIdMode : uint8_t {
k1BssIdMode = 0,
k2BssIdMode = 1,
k4BssIdMode = 2,
k8BssIdMode = 3,
};
class MacBssidDw0 : public Register<0x1010> {
public:
WLAN_BIT_FIELD(mac_addr_0, 0, 8);
WLAN_BIT_FIELD(mac_addr_1, 8, 8);
WLAN_BIT_FIELD(mac_addr_2, 16, 8);
WLAN_BIT_FIELD(mac_addr_3, 24, 8);
};
class MacBssidDw1 : public Register<0x1014> {
public:
WLAN_BIT_FIELD(mac_addr_4, 0, 8);
WLAN_BIT_FIELD(mac_addr_5, 8, 8);
WLAN_BIT_FIELD(multi_bss_mode, 16, 2);
WLAN_BIT_FIELD(multi_bcn_num, 18, 3);
WLAN_BIT_FIELD(new_multi_bssid_mode, 21, 1);
WLAN_BIT_FIELD(multi_bssid_mode_bit4, 22, 1);
WLAN_BIT_FIELD(multi_bssid_mode_bit3, 23, 1);
};
class MaxLenCfg : public Register<0x1018> {
public:
WLAN_BIT_FIELD(max_mpdu_len, 0, 12);
WLAN_BIT_FIELD(max_psdu_len, 12, 2);
WLAN_BIT_FIELD(min_psdu_len, 14, 2); // From Linux kernel source
WLAN_BIT_FIELD(min_mpdu_len, 16, 4);
};
class BbpCsrCfg : public Register<0x101c> {
public:
WLAN_BIT_FIELD(bbp_data, 0, 8);
WLAN_BIT_FIELD(bbp_addr, 8, 8);
WLAN_BIT_FIELD(bbp_csr_rw, 16, 1);
WLAN_BIT_FIELD(bbp_csr_kick, 17, 1);
WLAN_BIT_FIELD(bbp_par_dur, 18, 1);
WLAN_BIT_FIELD(bbp_rw_mode, 19, 1);
};
class LedCfg : public Register<0x102c> {
public:
WLAN_BIT_FIELD(led_on_time, 0, 8);
WLAN_BIT_FIELD(led_off_time, 8, 8);
WLAN_BIT_FIELD(slow_blk_time, 16, 6);
WLAN_BIT_FIELD(r_led_mode, 24, 2);
WLAN_BIT_FIELD(g_led_mode, 26, 2);
WLAN_BIT_FIELD(y_led_mode, 28, 2);
WLAN_BIT_FIELD(led_pol, 30, 1);
};
class ForceBaWinsize : public Register<0x1040> {
public:
WLAN_BIT_FIELD(force_ba_winsize, 0, 6);
WLAN_BIT_FIELD(force_ba_winsize_en, 6, 1);
};
class XifsTimeCfg : public Register<0x1100> {
public:
WLAN_BIT_FIELD(cck_sifs_time, 0, 8);
WLAN_BIT_FIELD(ofdm_sifs_time, 8, 8);
WLAN_BIT_FIELD(ofdm_xifs_time, 16, 4);
WLAN_BIT_FIELD(eifs_time, 20, 9);
WLAN_BIT_FIELD(bb_rxend_en, 29, 1);
};
class BkoffSlotCfg : public Register<0x1104> {
public:
WLAN_BIT_FIELD(slot_time, 0, 8);
WLAN_BIT_FIELD(cc_delay_time, 8, 4);
};
class ChTimeCfg : public Register<0x110c> {
public:
WLAN_BIT_FIELD(ch_sta_timer_en, 0, 1);
WLAN_BIT_FIELD(tx_as_ch_busy, 1, 1);
WLAN_BIT_FIELD(rx_as_ch_busy, 2, 1);
WLAN_BIT_FIELD(nav_as_ch_busy, 3, 1);
WLAN_BIT_FIELD(eifs_as_ch_busy, 4, 1);
};
class BcnTimeCfg : public Register<0x1114> {
public:
WLAN_BIT_FIELD(bcn_intval, 0, 16);
WLAN_BIT_FIELD(tsf_timer_en, 16, 1);
WLAN_BIT_FIELD(tsf_sync_mode, 17, 2);
WLAN_BIT_FIELD(tbtt_timer_en, 19, 1);
WLAN_BIT_FIELD(bcn_tx_en, 20, 1);
WLAN_BIT_FIELD(tsf_ins_comp, 24, 8);
};
class TbttSyncCfg : public Register<0x1118> {
public:
WLAN_BIT_FIELD(tbtt_adjust, 0, 8);
WLAN_BIT_FIELD(bcn_exp_win, 8, 8);
WLAN_BIT_FIELD(bcn_aifsn, 16, 4);
WLAN_BIT_FIELD(bcn_cwmin, 20, 4);
};
class TbttTimer : public Register<0x01124> {
public:
WLAN_BIT_FIELD(tbtt_timer, 0, 16);
};
class IntTimerCfg : public Register<0x1128> {
public:
WLAN_BIT_FIELD(pre_tbtt_timer, 0, 16);
WLAN_BIT_FIELD(gp_timer, 16, 16);
};
class IntTimerEn : public Register<0x112C> {
public:
WLAN_BIT_FIELD(pre_tbtt_int_en, 0, 1);
WLAN_BIT_FIELD(gp_timer_en, 1, 1);
};
class ChIdleSta : public Register<0x1130> {
public:
WLAN_BIT_FIELD(ch_idle_time, 0, 32);
};
class ChBusySta : public Register<0x1134> {
public:
WLAN_BIT_FIELD(ch_busy_time, 0, 32);
};
class ExtChBusySta : public Register<0x1138> {
public:
WLAN_BIT_FIELD(ext_ch_busy_time, 0, 32);
};
class MacStatusReg : public Register<0x1200> {
public:
WLAN_BIT_FIELD(tx_status, 0, 1);
WLAN_BIT_FIELD(rx_status, 1, 1);
};
class PwrPinCfg : public Register<0x1204> {
public:
WLAN_BIT_FIELD(io_rf_pe, 0, 1);
WLAN_BIT_FIELD(io_ra_pe, 1, 1);
WLAN_BIT_FIELD(io_pll_pd, 2, 1);
WLAN_BIT_FIELD(io_adda_pd, 3, 1);
};
class AutoWakeupCfg : public Register<0x1208> {
public:
WLAN_BIT_FIELD(wakeup_lead_time, 0, 8);
WLAN_BIT_FIELD(sleep_tbtt_num, 8, 7);
WLAN_BIT_FIELD(auto_wakeup_en, 15, 1);
};
class TxPwrCfg0 : public Register<0x1314> {
public:
WLAN_BIT_FIELD(tx_pwr_cck_1, 0, 8);
WLAN_BIT_FIELD(tx_pwr_cck_5, 8, 8);
WLAN_BIT_FIELD(tx_pwr_ofdm_6, 16, 8);
WLAN_BIT_FIELD(tx_pwr_ofdm_12, 24, 8);
};
// TODO(porce): Implement TxPwrCfg0Ext. Study which chipset needs this.
class TxPwrCfg1 : public Register<0x1318> {
public:
WLAN_BIT_FIELD(tx_pwr_ofdm_24, 0, 8);
WLAN_BIT_FIELD(tx_pwr_ofdm_48, 8, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_0, 16, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_2, 24, 8);
};
class TxPwrCfg2 : public Register<0x131c> {
public:
WLAN_BIT_FIELD(tx_pwr_mcs_4, 0, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_6, 8, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_8, 16, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_10, 24, 8);
};
class TxPwrCfg3 : public Register<0x1320> {
public:
WLAN_BIT_FIELD(tx_pwr_mcs_12, 0, 8);
WLAN_BIT_FIELD(tx_pwr_mcs_14, 8, 8);
WLAN_BIT_FIELD(tx_pwr_stbc_0, 16, 8);
WLAN_BIT_FIELD(tx_pwr_stbc_2, 24, 8);
};
class TxPwrCfg4 : public Register<0x1324> {
public:
WLAN_BIT_FIELD(tx_pwr_stbc_4, 0, 8);
WLAN_BIT_FIELD(tx_pwr_stbc_6, 8, 8);
};
class TxPinCfg : public Register<0x1328> {
public:
WLAN_BIT_FIELD(pa_pe_a0_en, 0, 1);
WLAN_BIT_FIELD(pa_pe_g0_en, 1, 1);
WLAN_BIT_FIELD(pa_pe_a1_en, 2, 1);
WLAN_BIT_FIELD(pa_pe_g1_en, 3, 1);
WLAN_BIT_FIELD(pa_pe_a0_pol, 4, 1);
WLAN_BIT_FIELD(pa_pe_g0_pol, 5, 1);
WLAN_BIT_FIELD(pa_pe_a1_pol, 6, 1);
WLAN_BIT_FIELD(pa_pe_g1_pol, 7, 1);
WLAN_BIT_FIELD(lna_pe_a0_en, 8, 1);
WLAN_BIT_FIELD(lna_pe_g0_en, 9, 1);
WLAN_BIT_FIELD(lna_pe_a1_en, 10, 1);
WLAN_BIT_FIELD(lna_pe_g1_en, 11, 1);
WLAN_BIT_FIELD(lna_pe_a0_pol, 12, 1);
WLAN_BIT_FIELD(lna_pe_g0_pol, 13, 1);
WLAN_BIT_FIELD(lna_pe_a1_pol, 14, 1);
WLAN_BIT_FIELD(lna_pe_g1_pol, 15, 1);
WLAN_BIT_FIELD(rftr_en, 16, 1);
WLAN_BIT_FIELD(rftr_pol, 17, 1);
WLAN_BIT_FIELD(trsw_en, 18, 1);
WLAN_BIT_FIELD(trsw_pol, 19, 1);
WLAN_BIT_FIELD(rfrx_en, 20, 1);
WLAN_BIT_FIELD(pa_pe_a2_en, 24, 1);
WLAN_BIT_FIELD(pa_pe_g2_en, 25, 1);
WLAN_BIT_FIELD(pa_pe_a2_pol, 26, 1);
WLAN_BIT_FIELD(pa_pe_g2_pol, 27, 1);
WLAN_BIT_FIELD(lna_pe_a2_en, 28, 1);
WLAN_BIT_FIELD(lna_pe_g2_en, 29, 1);
WLAN_BIT_FIELD(lna_pe_a2_pol, 30, 1);
WLAN_BIT_FIELD(lna_pe_g2_pol, 31, 1);
};
class TxBandCfg : public Register<0x132c> {
public:
// For CBW40
// 0x0: Use lower 20MHz (or "use lower 40MHz band in 20MHz tx")
// 0x1: Use upper 20MHz (or "use upper 40MHz band in 20MHz tx")
WLAN_BIT_FIELD(tx_band_sel, 0, 1);
WLAN_BIT_FIELD(a, 1, 1); // or denoted as 5g_band_sel_p
WLAN_BIT_FIELD(bg, 2, 1); // or denoted as 5g_band_sel_n
};
class TxSwCfg0 : public Register<0x1330> {
public:
WLAN_BIT_FIELD(dly_txpe_en, 0, 8);
WLAN_BIT_FIELD(dly_pape_en, 8, 8);
WLAN_BIT_FIELD(dly_trsw_en, 16, 8);
WLAN_BIT_FIELD(dly_rftr_en, 24, 8);
};
class TxSwCfg1 : public Register<0x1334> {
public:
WLAN_BIT_FIELD(dly_pape_dis, 0, 8);
WLAN_BIT_FIELD(dly_trsw_dis, 8, 8);
WLAN_BIT_FIELD(dly_rftr_dis, 16, 8);
};
class TxSwCfg2 : public Register<0x1338> {
public:
WLAN_BIT_FIELD(dly_dac_dis, 0, 8);
WLAN_BIT_FIELD(dly_dac_en, 8, 8);
WLAN_BIT_FIELD(dly_lna_dis, 16, 8);
WLAN_BIT_FIELD(dly_lna_en, 24, 8);
};
class TxopCtrlCfg : public Register<0x1340> {
public:
WLAN_BIT_FIELD(txop_trun_en, 0, 6);
WLAN_BIT_FIELD(lsig_txop_en, 6, 1);
// These control the behavior of secondary 20MHz channel's CCA
// and an option to fall back to 20MHz transmission from 40MHz one
WLAN_BIT_FIELD(ext_cca_en, 7, 1);
WLAN_BIT_FIELD(ext_cca_dly, 8, 8);
WLAN_BIT_FIELD(ext_cw_min, 16, 4);
WLAN_BIT_FIELD(ed_cca_en, 20, 1);
};
class TxRtsCfg : public Register<0x1344> {
public:
WLAN_BIT_FIELD(rts_rty_limit, 0, 8);
WLAN_BIT_FIELD(rts_thres, 8, 16);
WLAN_BIT_FIELD(rts_fbk_en, 24, 1);
};
class TxTimeoutCfg : public Register<0x1348> {
public:
WLAN_BIT_FIELD(mpdu_life_time, 4, 4);
WLAN_BIT_FIELD(rx_ack_timeout, 8, 8);
WLAN_BIT_FIELD(txop_timeout, 16, 8);
WLAN_BIT_FIELD(ackto_end_txop, 24, 1);
};
class TxRtyCfg : public Register<0x134c> {
public:
WLAN_BIT_FIELD(short_rty_limit, 0, 8);
WLAN_BIT_FIELD(long_rty_limit, 8, 8);
WLAN_BIT_FIELD(long_rty_thres, 16, 12);
WLAN_BIT_FIELD(nag_rty_mode, 28, 1);
WLAN_BIT_FIELD(agg_rty_mode, 29, 1);
WLAN_BIT_FIELD(tx_autofb_en, 30, 1);
};
class TxLinkCfg : public Register<0x1350> {
public:
WLAN_BIT_FIELD(remote_mfb_lifetime, 0, 8);
WLAN_BIT_FIELD(tx_mfb_en, 8, 1);
WLAN_BIT_FIELD(remote_umfs_en, 9, 1);
WLAN_BIT_FIELD(tx_mrq_en, 10, 1);
WLAN_BIT_FIELD(tx_rdg_en, 11, 1);
WLAN_BIT_FIELD(tx_cfack_en, 12, 1);
WLAN_BIT_FIELD(remote_mfb, 16, 8);
WLAN_BIT_FIELD(remote_mfs, 24, 8);
};
class HtFbkCfg0 : public Register<0x1354> {
public:
WLAN_BIT_FIELD(ht_mcs0_fbk, 0, 4);
WLAN_BIT_FIELD(ht_mcs1_fbk, 4, 4);
WLAN_BIT_FIELD(ht_mcs2_fbk, 8, 4);
WLAN_BIT_FIELD(ht_mcs3_fbk, 12, 4);
WLAN_BIT_FIELD(ht_mcs4_fbk, 16, 4);
WLAN_BIT_FIELD(ht_mcs5_fbk, 20, 4);
WLAN_BIT_FIELD(ht_mcs6_fbk, 24, 4);
WLAN_BIT_FIELD(ht_mcs7_fbk, 28, 4);
};
class HtFbkCfg1 : public Register<0x1358> {
public:
WLAN_BIT_FIELD(ht_mcs8_fbk, 0, 4);
WLAN_BIT_FIELD(ht_mcs9_fbk, 4, 4);
WLAN_BIT_FIELD(ht_mcs10_fbk, 8, 4);
WLAN_BIT_FIELD(ht_mcs11_fbk, 12, 4);
WLAN_BIT_FIELD(ht_mcs12_fbk, 16, 4);
WLAN_BIT_FIELD(ht_mcs13_fbk, 20, 4);
WLAN_BIT_FIELD(ht_mcs14_fbk, 24, 4);
WLAN_BIT_FIELD(ht_mcs15_fbk, 28, 4);
};
class LgFbkCfg0 : public Register<0x135c> {
public:
WLAN_BIT_FIELD(ofdm0_fbk, 0, 4);
WLAN_BIT_FIELD(ofdm1_fbk, 4, 4);
WLAN_BIT_FIELD(ofdm2_fbk, 8, 4);
WLAN_BIT_FIELD(ofdm3_fbk, 12, 4);
WLAN_BIT_FIELD(ofdm4_fbk, 16, 4);
WLAN_BIT_FIELD(ofdm5_fbk, 20, 4);
WLAN_BIT_FIELD(ofdm6_fbk, 24, 4);
WLAN_BIT_FIELD(ofdm7_fbk, 28, 4);
};
class LgFbkCfg1 : public Register<0x1360> {
public:
WLAN_BIT_FIELD(cck0_fbk, 0, 4);
WLAN_BIT_FIELD(cck1_fbk, 4, 4);
WLAN_BIT_FIELD(cck2_fbk, 8, 4);
WLAN_BIT_FIELD(cck3_fbk, 12, 4);
};
template <uint16_t A> class ProtCfg : public Register<A> {
public:
WLAN_BIT_FIELD(prot_rate, 0, 16);
WLAN_BIT_FIELD(prot_ctrl, 16, 2);
WLAN_BIT_FIELD(prot_nav, 18, 2);
WLAN_BIT_FIELD(txop_allow_cck_tx, 20, 1);
WLAN_BIT_FIELD(txop_allow_ofdm_tx, 21, 1);
WLAN_BIT_FIELD(txop_allow_mm20_tx, 22, 1);
WLAN_BIT_FIELD(txop_allow_mm40_tx, 23, 1);
WLAN_BIT_FIELD(txop_allow_gf20_tx, 24, 1);
WLAN_BIT_FIELD(txop_allow_gf40_tx, 25, 1);
WLAN_BIT_FIELD(rtsth_en, 26, 1);
};
class CckProtCfg : public ProtCfg<0x1364> {};
class OfdmProtCfg : public ProtCfg<0x1368> {};
class Mm20ProtCfg : public ProtCfg<0x136c> {};
class Mm40ProtCfg : public ProtCfg<0x1370> {};
class Gf20ProtCfg : public ProtCfg<0x1374> {};
class Gf40ProtCfg : public ProtCfg<0x1378> {};
class ExpAckTime : public Register<0x1380> {
public:
WLAN_BIT_FIELD(exp_cck_ack_time, 0, 15);
WLAN_BIT_FIELD(exp_ofdm_ack_time, 16, 15);
};
class RxFiltrCfg : public Register<0x1400> {
public:
WLAN_BIT_FIELD(drop_crc_err, 0, 1);
WLAN_BIT_FIELD(drop_phy_err, 1, 1);
WLAN_BIT_FIELD(drop_uc_nome, 2, 1);
WLAN_BIT_FIELD(drop_not_mybss, 3, 1);
WLAN_BIT_FIELD(drop_ver_err, 4, 1);
WLAN_BIT_FIELD(drop_mc, 5, 1);
WLAN_BIT_FIELD(drop_bc, 6, 1);
WLAN_BIT_FIELD(drop_dupl, 7, 1);
WLAN_BIT_FIELD(drop_cfack, 8, 1);
WLAN_BIT_FIELD(drop_cfend, 9, 1);
WLAN_BIT_FIELD(drop_ack, 10, 1);
WLAN_BIT_FIELD(drop_cts, 11, 1);
WLAN_BIT_FIELD(drop_rts, 12, 1);
WLAN_BIT_FIELD(drop_pspoll, 13, 1);
WLAN_BIT_FIELD(drop_ba, 14, 1);
WLAN_BIT_FIELD(drop_bar, 15, 1);
WLAN_BIT_FIELD(drop_ctrl_rsv, 16, 1);
};
class AutoRspCfg : public Register<0x1404> {
public:
WLAN_BIT_FIELD(auto_rsp_en, 0, 1);
WLAN_BIT_FIELD(bac_ackpolicy_en, 1, 1);
// CBW40 CTS behavior control
WLAN_BIT_FIELD(cts_40m_mode, 2, 1);
WLAN_BIT_FIELD(cts_40m_ref, 3, 1);
WLAN_BIT_FIELD(cck_short_en, 4, 1);
WLAN_BIT_FIELD(ctrl_wrap_en, 5, 1);
WLAN_BIT_FIELD(bac_ack_policy, 6, 1);
WLAN_BIT_FIELD(ctrl_pwr_bit, 7, 1);
};
class LegacyBasicRate : public Register<0x1408> {
public:
WLAN_BIT_FIELD(rate_1mbps, 0, 1);
WLAN_BIT_FIELD(rate_2mbps, 1, 1);
WLAN_BIT_FIELD(rate_5_5mbps, 2, 1);
WLAN_BIT_FIELD(rate_11mbps, 3, 1);
WLAN_BIT_FIELD(rate_6mbps, 4, 1);
WLAN_BIT_FIELD(rate_9mbps, 5, 1);
WLAN_BIT_FIELD(rate_12mbps, 6, 1);
WLAN_BIT_FIELD(rate_18mbps, 7, 1);
WLAN_BIT_FIELD(rate_24mbps, 8, 1);
WLAN_BIT_FIELD(rate_36mbps, 9, 1);
WLAN_BIT_FIELD(rate_48mbps, 10, 1);
WLAN_BIT_FIELD(rate_54mbps, 11, 1);
};
class HtBasicRate : public Register<0x140c> {
// TODO: figure out what these bits are
};
class TxopHldrEt : public Register<0x1608> {
public:
WLAN_BIT_FIELD(per_rx_rst_en, 0, 1);
WLAN_BIT_FIELD(tx40m_blk_en, 1, 1); // CBW40
WLAN_BIT_FIELD(tx_bcn_hipri_dis, 2, 1);
WLAN_BIT_FIELD(pape_map1s_en, 3, 1);
WLAN_BIT_FIELD(pape_map, 4, 1);
WLAN_BIT_FIELD(reserved_unk, 5, 11);
WLAN_BIT_FIELD(tx_fbk_thres, 16, 2);
WLAN_BIT_FIELD(tx_fbk_thres_en, 18, 1);
WLAN_BIT_FIELD(tx_dma_timeout, 19, 5);
WLAN_BIT_FIELD(ampdu_acc_en, 24, 1);
};
class RxStaCnt0 : public Register<0x1700> {
public:
WLAN_BIT_FIELD(crc_errcnt, 0, 16);
WLAN_BIT_FIELD(phy_errcnt, 16, 16);
};
class RxStaCnt1 : public Register<0x1704> {
public:
WLAN_BIT_FIELD(cca_errcnt, 0, 16);
WLAN_BIT_FIELD(plpc_errcnt, 16, 16);
};
class RxStaCnt2 : public Register<0x1708> {
public:
WLAN_BIT_FIELD(rx_dupl_cnt, 0, 16);
WLAN_BIT_FIELD(rx_ovfl_cnt, 16, 16);
};
class TxStaCnt0 : public Register<0x170c> {
public:
WLAN_BIT_FIELD(tx_fail_cnt, 0, 16);
WLAN_BIT_FIELD(tx_bcn_cnt, 16, 16);
};
class TxStaCnt1 : public Register<0x1710> {
public:
WLAN_BIT_FIELD(tx_succ_cnt, 0, 16);
WLAN_BIT_FIELD(tx_rty_cnt, 16, 16);
};
class TxStaCnt2 : public Register<0x1714> {
public:
WLAN_BIT_FIELD(tx_zero_cnt, 0, 16);
WLAN_BIT_FIELD(tx_udfl_cnt, 16, 16);
};
class TxStatFifo : public Register<0x1718> {
public:
WLAN_BIT_FIELD(txq_vld, 0, 1);
WLAN_BIT_FIELD(txq_pid, 1, 4);
WLAN_BIT_FIELD(txq_ok, 5, 1);
WLAN_BIT_FIELD(txq_agg, 6, 1);
WLAN_BIT_FIELD(txq_ackreq, 7, 1);
WLAN_BIT_FIELD(txq_wcid, 8, 8);
WLAN_BIT_FIELD(txq_mcs, 16, 7);
WLAN_BIT_FIELD(txq_bw, 23, 1);
WLAN_BIT_FIELD(txq_sgi, 24, 1);
// bit 25-29 reserved
WLAN_BIT_FIELD(txq_phy, 30, 2);
};
class TxStatFifoExt : public Register<0x1798> {
public:
WLAN_BIT_FIELD(txq_rty_cnt, 0, 8);
};
// EEPROM word offsets
constexpr uint16_t EEPROM_CHIP_ID = 0x0000;
constexpr uint16_t EEPROM_VERSION = 0x0001;
constexpr uint16_t EEPROM_MAC_ADDR_0 = 0x0002;
constexpr uint16_t EEPROM_MAC_ADDR_1 = 0x0003;
constexpr uint16_t EEPROM_MAC_ADDR_2 = 0x0004;
constexpr uint16_t EEPROM_NIC_CONF2 = 0x0021;
constexpr uint16_t EEPROM_RSSI_A = 0x0025;
constexpr uint16_t EEPROM_RSSI_A2 = 0x0026;
constexpr uint16_t EEPROM_TXPOWER_BG1 = 0x0029; // Seemingly 0.5 dBm unit
constexpr uint16_t EEPROM_TXPOWER_BG2 = 0x0030;
constexpr uint16_t EEPROM_TXPOWER_A1 = 0x003c;
constexpr uint16_t EEPROM_TXPOWER_A2 = 0x0053;
constexpr uint16_t EEPROM_TXPOWER_BYRATE = 0x006f; // Unit uncertain
constexpr uint16_t EEPROM_BBP_START = 0x0078;
constexpr size_t EEPROM_TXPOWER_BYRATE_SIZE = 9;
constexpr size_t EEPROM_BBP_SIZE = 16;
// EEPROM byte offsets
constexpr size_t EEPROM_GAIN_CAL_TX0_CH0_14 = 0x130;
constexpr size_t EEPROM_GAIN_CAL_TX0_CH36_64 = 0x144;
constexpr size_t EEPROM_GAIN_CAL_TX0_CH100_138 = 0x146;
constexpr size_t EEPROM_GAIN_CAL_TX0_CH140_165 = 0x148;
constexpr size_t EEPROM_PHASE_CAL_TX0_CH0_14 = 0x131;
constexpr size_t EEPROM_PHASE_CAL_TX0_CH36_64 = 0x145;
constexpr size_t EEPROM_PHASE_CAL_TX0_CH100_138 = 0x147;
constexpr size_t EEPROM_PHASE_CAL_TX0_CH140_165 = 0x149;
constexpr size_t EEPROM_GAIN_CAL_TX1_CH0_14 = 0x133;
constexpr size_t EEPROM_GAIN_CAL_TX1_CH36_64 = 0x14a;
constexpr size_t EEPROM_GAIN_CAL_TX1_CH100_138 = 0x14c;
constexpr size_t EEPROM_GAIN_CAL_TX1_CH140_165 = 0x14e;
constexpr size_t EEPROM_PHASE_CAL_TX1_CH0_14 = 0x134;
constexpr size_t EEPROM_PHASE_CAL_TX1_CH36_64 = 0x14b;
constexpr size_t EEPROM_PHASE_CAL_TX1_CH100_138 = 0x14d;
constexpr size_t EEPROM_PHASE_CAL_TX1_CH140_165 = 0x14f;
constexpr size_t EEPROM_COMP_CTL = 0x13c;
constexpr size_t EEPROM_IMB_COMP_CTL = 0x13d;
class EepromNicConf0 : public EepromField<0x001a> {
public:
WLAN_BIT_FIELD(rxpath, 0, 4);
WLAN_BIT_FIELD(txpath, 4, 4);
WLAN_BIT_FIELD(rf_type, 8, 4);
};
class EepromNicConf1 : public EepromField<0x001b> {
public:
WLAN_BIT_FIELD(hw_radio, 0, 1);
WLAN_BIT_FIELD(external_tx_alc, 1, 1);
WLAN_BIT_FIELD(external_lna_2g, 2, 1);
WLAN_BIT_FIELD(external_lna_5g, 3, 1);
WLAN_BIT_FIELD(cardbus_accel, 4, 1);
WLAN_BIT_FIELD(bw40m_sb_2g, 5, 1); // CBW40
WLAN_BIT_FIELD(bw40m_sb_5g, 6, 1); // CBW40
WLAN_BIT_FIELD(wps_pbc, 7, 1);
WLAN_BIT_FIELD(bw40m_2g, 8, 1); // CBW40
WLAN_BIT_FIELD(bw40m_5g, 9, 1); // CBW40
WLAN_BIT_FIELD(broadband_ext_lna, 10, 1);
WLAN_BIT_FIELD(ant_diversity, 11, 2);
WLAN_BIT_FIELD(internal_tx_alc, 13, 1);
WLAN_BIT_FIELD(bt_coexist, 14, 1);
WLAN_BIT_FIELD(dac_test, 15, 1);
};
class EepromFreq : public EepromField<0x001d> {
public:
WLAN_BIT_FIELD(offset, 0, 8);
};
class EepromLna : public EepromField<0x0022> {
public:
WLAN_BIT_FIELD(bg, 0, 8);
WLAN_BIT_FIELD(a0, 8, 8);
};
class EepromRssiBg : public EepromField<0x0023> {
public:
WLAN_BIT_FIELD(offset0, 0, 8);
WLAN_BIT_FIELD(offset1, 8, 8);
};
class EepromRssiBg2 : public EepromField<0x0024> {
public:
WLAN_BIT_FIELD(offset2, 0, 8);
WLAN_BIT_FIELD(lna_a1, 8, 8);
};
class EepromEirpMaxTxPower : public EepromField<0x0027> {
public:
WLAN_BIT_FIELD(power_2g, 0, 8);
WLAN_BIT_FIELD(power_5g, 8, 8);
};
class EepromTxPowerDelta : public EepromField<0x0028> {
public:
WLAN_BIT_FIELD(value_2g, 0, 6);
WLAN_BIT_FIELD(type_2g, 6, 1);
WLAN_BIT_FIELD(enable_2g, 7, 1);
WLAN_BIT_FIELD(value_5g, 8, 6);
WLAN_BIT_FIELD(type_5g, 14, 1);
WLAN_BIT_FIELD(enable_5g, 15, 1);
};
// Host to MCU communication
class H2mMailboxCsr : public Register<0x7010> {
public:
WLAN_BIT_FIELD(arg0, 0, 8);
WLAN_BIT_FIELD(arg1, 8, 8);
WLAN_BIT_FIELD(cmd_token, 16, 8);
WLAN_BIT_FIELD(owner, 24, 8);
};
class H2mMailboxCid : public Register<0x7014> {
public:
WLAN_BIT_FIELD(cmd0, 0, 8);
WLAN_BIT_FIELD(cmd1, 8, 8);
WLAN_BIT_FIELD(cmd2, 16, 8);
WLAN_BIT_FIELD(cmd3, 24, 8);
};
class H2mMailboxStatus : public Register<0x701c> {};
class H2mBbpAgent : public Register<0x7028> {};
class H2mIntSrc : public Register<0x7024> {};
// MCU commands
constexpr uint8_t MCU_BOOT_SIGNAL = 0x72;
constexpr uint8_t MCU_WAKEUP = 0x31;
constexpr uint8_t MCU_FREQ_OFFSET = 0x74;
// BBP registers
class Bbp1 : public BbpRegister<1> {
public:
// 2, 1, 0, 3 corresponds to -12, -6, 0, 6 dBm
WLAN_BIT_FIELD(tx_power_ctrl, 0, 2);
WLAN_BIT_FIELD(tx_antenna, 3, 2);
};
class Bbp3 : public BbpRegister<3> {
public:
WLAN_BIT_FIELD(rx_adc, 0, 2);
WLAN_BIT_FIELD(rx_antenna, 3, 2);
WLAN_BIT_FIELD(ht40_minus, 5, 1); // CBW40BELOW
WLAN_BIT_FIELD(adc_mode_switch, 6, 1);
WLAN_BIT_FIELD(adc_init_mode, 7, 1);
};
class Bbp4 : public BbpRegister<4> {
public:
WLAN_BIT_FIELD(tx_bf, 0, 1);
// 0x0: CBW20
// 0x2: CBW40ABOVE, CBW40BELOW
WLAN_BIT_FIELD(bandwidth, 3, 2);
WLAN_BIT_FIELD(mac_if_ctrl, 6, 1);
};
class Bbp27 : public BbpRegister<27> {
public:
WLAN_BIT_FIELD(rx_chain_sel, 5, 2);
};
class Bbp105 : public BbpRegister<105> {
public:
WLAN_BIT_FIELD(sig_on_pri, 0, 1);
WLAN_BIT_FIELD(feq, 1, 1);
WLAN_BIT_FIELD(mld, 2, 1);
WLAN_BIT_FIELD(chan_update_from_remod, 3, 1);
};
class Bbp138 : public BbpRegister<138> {
public:
WLAN_BIT_FIELD(rx_adc1, 1, 1);
WLAN_BIT_FIELD(rx_adc2, 2, 1);
WLAN_BIT_FIELD(tx_dac1, 5, 1);
WLAN_BIT_FIELD(tx_dac2, 6, 1);
};
class Bbp152 : public BbpRegister<152> {
public:
WLAN_BIT_FIELD(rx_default_ant, 7, 1);
};
class Bbp254 : public BbpRegister<254> {
public:
WLAN_BIT_FIELD(unk_bit7, 7, 1);
};
// RFCSR registers
class Rfcsr1 : public RfcsrRegister<1> {
public:
WLAN_BIT_FIELD(rf_block_en, 0, 1);
WLAN_BIT_FIELD(pll_pd, 1, 1);
WLAN_BIT_FIELD(rx0_pd, 2, 1);
WLAN_BIT_FIELD(tx0_pd, 3, 1);
WLAN_BIT_FIELD(rx1_pd, 4, 1);
WLAN_BIT_FIELD(tx1_pd, 5, 1);
WLAN_BIT_FIELD(rx2_pd, 6, 1);
WLAN_BIT_FIELD(tx2_pd, 7, 1);
};
class Rfcsr2 : public RfcsrRegister<2> {
public:
WLAN_BIT_FIELD(rescal_en, 7, 1);
};
class Rfcsr3 : public RfcsrRegister<3> {
public:
WLAN_BIT_FIELD(vcocal_en, 7, 1);
};
class Rfcsr8 : public RfcsrRegister<8> {
public:
WLAN_BIT_FIELD(n, 0, 8);
};
class Rfcsr9 : public RfcsrRegister<9> {
public:
WLAN_BIT_FIELD(k, 0, 4);
WLAN_BIT_FIELD(n, 4, 1);
WLAN_BIT_FIELD(mod, 7, 1);
};
class Rfcsr11 : public RfcsrRegister<11> {
public:
WLAN_BIT_FIELD(r, 0, 2);
WLAN_BIT_FIELD(mod, 6, 2);
};
class Rfcsr17 : public RfcsrRegister<17> {
public:
WLAN_BIT_FIELD(freq_offset, 0, 7);
WLAN_BIT_FIELD(high_bit, 7, 1);
};
class Rfcsr30 : public RfcsrRegister<30> {
public:
WLAN_BIT_FIELD(tx_h20m, 1, 1); // 0x1 for CBW40*?
WLAN_BIT_FIELD(rx_h20m, 2, 1); // 0x1 for CBW40*?
WLAN_BIT_FIELD(rx_vcm, 3, 2);
WLAN_BIT_FIELD(rf_calibration, 7, 1);
};
class Rfcsr38 : public RfcsrRegister<38> {
public:
WLAN_BIT_FIELD(rx_lo1_en, 5, 1);
};
class Rfcsr39 : public RfcsrRegister<39> {
public:
WLAN_BIT_FIELD(rx_div, 6, 1);
WLAN_BIT_FIELD(rx_lo2_en, 7, 1);
};
class Rfcsr49 : public RfcsrRegister<49> {
public:
WLAN_BIT_FIELD(tx, 0, 6);
WLAN_BIT_FIELD(ep, 6, 2);
};
class Rfcsr50 : public RfcsrRegister<50> {
public:
WLAN_BIT_FIELD(tx, 0, 6);
WLAN_BIT_FIELD(ep, 6, 2);
};
class RxInfo : public AddressableBitField<uint16_t, uint32_t, 0> {
public:
constexpr explicit RxInfo(uint32_t val) : AddressableBitField(val) {}
WLAN_BIT_FIELD(usb_dma_rx_pkt_len, 0, 16);
};
class RxDesc : public BitField<uint32_t> {
public:
constexpr explicit RxDesc(uint32_t val) : BitField<uint32_t>(val) {}
WLAN_BIT_FIELD(ba, 0, 1);
WLAN_BIT_FIELD(data, 1, 1);
WLAN_BIT_FIELD(nulldata, 2, 1);
WLAN_BIT_FIELD(frag, 3, 1);
WLAN_BIT_FIELD(unicast_to_me, 4, 1);
WLAN_BIT_FIELD(multicast, 5, 1);
WLAN_BIT_FIELD(broadcast, 6, 1);
WLAN_BIT_FIELD(my_bss, 7, 1);
WLAN_BIT_FIELD(crc_error, 8, 1);
WLAN_BIT_FIELD(cipher_error, 9, 2);
WLAN_BIT_FIELD(amsdu, 11, 1);
WLAN_BIT_FIELD(htc, 12, 1);
WLAN_BIT_FIELD(rssi, 13, 1);
WLAN_BIT_FIELD(l2pad, 14, 1);
WLAN_BIT_FIELD(ampdu, 15, 1);
WLAN_BIT_FIELD(decrypted, 16, 1);
WLAN_BIT_FIELD(plcp_rssi, 17, 1);
WLAN_BIT_FIELD(cipher_alg, 18, 1);
WLAN_BIT_FIELD(last_amsdu, 19, 1);
WLAN_BIT_FIELD(plcp_signal, 20, 12);
};
class Rxwi0 : public AddressableBitField<uint16_t, uint32_t, 1> {
public:
constexpr explicit Rxwi0(uint32_t val) : AddressableBitField(val) {}
WLAN_BIT_FIELD(wcid, 0, 8);
WLAN_BIT_FIELD(key_idx, 8, 2);
WLAN_BIT_FIELD(bss_idx, 10, 3);
WLAN_BIT_FIELD(udf, 13, 3);
WLAN_BIT_FIELD(mpdu_total_byte_count, 16, 12);
WLAN_BIT_FIELD(tid, 28, 4);
};
class Rxwi1 : public AddressableBitField<uint16_t, uint32_t, 2> {
public:
constexpr explicit Rxwi1(uint32_t val) : AddressableBitField(val) {}
WLAN_BIT_FIELD(frag, 0, 4);
WLAN_BIT_FIELD(seq, 4, 12);
WLAN_BIT_FIELD(mcs, 16, 7);
WLAN_BIT_FIELD(bw, 23, 1);
WLAN_BIT_FIELD(sgi, 24, 1);
WLAN_BIT_FIELD(stbc, 25, 2);
// Reserved 3 bits.
WLAN_BIT_FIELD(phy_mode, 30, 2);
};
enum Bandwidth : uint8_t {
k20MHz = 0x00,
k40MHz = 0x01,
};
enum PhyMode : uint8_t {
kLegacyCck = 0,
kLegacyOfdm = 1,
kHtMixMode = 2,
kHtGreenfield = 3,
kUnknown = 255,
};
enum LegacyCckMcs : uint8_t {
kLongPreamble1Mbps = 0,
kLongPreamble2Mbps = 1,
kLongPreamble5_5Mbps = 2,
kLongPreamble11Mbps = 3,
// 4-7 reserved
kShortPreamble1Mbps = 8,
kShortPreamble2Mbps = 9,
kShortPreamble5_5Mbps = 10,
kShortPreamble11Mbps = 11,
// All other values reserved
};
constexpr uint8_t kMaxOfdmMcs = 7;
constexpr uint8_t kMaxHtMcs = 7; // excluding "duplicate 6Mbps" mcs
constexpr uint8_t kHtDuplicateMcs = 32;
class Rxwi2 : public AddressableBitField<uint16_t, uint32_t, 3> {
public:
constexpr explicit Rxwi2(uint32_t val) : AddressableBitField(val) {}
WLAN_BIT_FIELD(rssi0, 0, 8);
WLAN_BIT_FIELD(rssi1, 8, 8);
WLAN_BIT_FIELD(rssi2, 16, 8);
};
class Rxwi3 : public AddressableBitField<uint16_t, uint32_t, 4> {
public:
constexpr explicit Rxwi3(uint32_t val) : AddressableBitField(val) {}
WLAN_BIT_FIELD(snr0, 0, 8);
WLAN_BIT_FIELD(snr1, 8, 8);
};
class TxInfo : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(aggr_payload_len, 0, 16); // Bulk-out Aggregation format payload length
// Reserved 8 bits.
WLAN_BIT_FIELD(wiv, 24, 1);
WLAN_BIT_FIELD(qsel, 25, 2);
// Reserved 3 bits.
WLAN_BIT_FIELD(next_vld, 30, 1);
WLAN_BIT_FIELD(tx_burst, 31, 1);
enum QSEL_PRIORITY {
kHigh = 0x00, // For Management function
kMedium = 0x01, // For HCCA function
kLow = 0x02, // For EDCA function
kNa = 0x03, // Nah..
};
};
class Txwi0 : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(frag, 0, 1);
WLAN_BIT_FIELD(mmps, 1, 1);
WLAN_BIT_FIELD(cfack, 2, 1);
WLAN_BIT_FIELD(ts, 3, 1);
WLAN_BIT_FIELD(ampdu, 4, 1);
WLAN_BIT_FIELD(mpdu_density, 5, 3);
WLAN_BIT_FIELD(txop, 8, 2);
WLAN_BIT_FIELD(mcs, 16, 7);
WLAN_BIT_FIELD(bw, 23, 1);
WLAN_BIT_FIELD(sgi, 24, 1);
WLAN_BIT_FIELD(stbc, 25, 2);
// Reserved 3 bits.
// Definition based on Rxwi's format.
WLAN_BIT_FIELD(phy_mode, 30, 2);
// Alternative definition based on Txwi's format.
// WLAN_BIT_FIELD(ofdm, 30, 1);
// WLAN_BIT_FIELD(mimo, 31, 1);
// Also defined in //garnet/drivers/wlan/wlan/element.h
enum MinMPDUStartSpacing { // for mpdu_density
kNoRestrict = 0,
kQuarterUsec = 1,
kHalfUsec = 2,
kOneUsec = 3,
kTwoUsec = 4,
kFourUsec = 5,
kEightUsec = 6,
kSixteenUsec = 7,
};
enum TXOP {
kHtTxop = 0x00,
kPifsTx = 0x01,
kSifsTx = 0x02,
kBackOff = 0x03,
};
};
class Txwi1 : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(ack, 0, 1);
WLAN_BIT_FIELD(nseq, 1, 1);
WLAN_BIT_FIELD(ba_win_size, 2, 6);
WLAN_BIT_FIELD(wcid, 8, 8);
WLAN_BIT_FIELD(mpdu_total_byte_count, 16, 12);
WLAN_BIT_FIELD(tx_packet_id, 28, 4);
};
class Txwi2 : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(iv, 0, 32);
};
class Txwi3 : public BitField<uint32_t> {
public:
WLAN_BIT_FIELD(eiv, 0, 32);
};
struct BulkoutAggregation {
// Aggregation Header
// TODO(porce): Investigate if Aggregation Header and TxInfo are identical.
TxInfo tx_info;
// Structure of BulkoutAggregation's payload
// TXWI : 16 or 20 bytes // (a).
// MPDU header : (b) bytes // (b).
// L2PAD : 0~3 bytes // (c).
// MSDU : (d) bytes // (d). (b) + (d) is mpdu_len
// Bulkout Agg Pad : 0~3 bytes // (e).
Txwi0 txwi0;
Txwi1 txwi1;
Txwi2 txwi2;
Txwi3 txwi3;
// Txwi4 txwi4 for RT5592
uint8_t* payload(uint16_t rt_type) { // TODO(porce): better naming
// Return where MPDU is to be stored.
// Precisely, this will consist of MPDU header + (L2PAD) + MSDU + (AggregatePAD)
size_t txwi_len = (rt_type == RT5592) ? 20 : 16;
return reinterpret_cast<uint8_t*>(this) + sizeof(TxInfo) + txwi_len;
}
// BulkoutAggregation Tail padding (4 bytes of zeros)
} __PACKED;
} // namespace ralink
#endif // GARNET_DRIVERS_WLAN_MEDIATEK_RALINK_RALINK_H_