use alloc::vec::Vec;
#[repr(C)]
#[derive(Clone, Debug)]
pub struct LmacMsg {
pub id: u16,
pub dest_id: u16,
pub src_id: u16,
pub param_len: u16,
pub pattern: u32,
}
impl LmacMsg {
pub const SIZE: usize = 12;
pub fn from_le_bytes(data: &[u8]) -> Self {
Self {
id: u16::from_le_bytes([data[0], data[1]]),
dest_id: u16::from_le_bytes([data[2], data[3]]),
src_id: u16::from_le_bytes([data[4], data[5]]),
param_len: u16::from_le_bytes([data[6], data[7]]),
pattern: u32::from_le_bytes([data[8], data[9], data[10], data[11]]),
}
}
}
pub const fn lmac_first_msg(task: u16) -> u16 {
task << 10
}
pub const fn msg_index(msg_id: u16) -> u16 {
msg_id & ((1 << 10) - 1)
}
pub use crate::common::{DRV_TASK_ID, TASK_DBG};
pub const TASK_MM: u16 = 0;
pub const TASK_SCAN: u16 = 2;
pub const TASK_TDLS: u16 = 3;
pub const TASK_SCANU: u16 = 4;
pub const TASK_ME: u16 = 5;
pub const TASK_SM: u16 = 6;
pub const TASK_APM: u16 = 7;
pub const TASK_BAM: u16 = 8;
pub const TASK_MESH: u16 = 9;
pub const TASK_RXU: u16 = 10;
pub const TASK_RM: u16 = 11;
pub const TASK_TWT: u16 = 12;
pub const TASK_API: u16 = 13;
pub const MM_SET_STACK_START_REQ: u16 = 0x007B; pub const MM_SET_STACK_START_CFM: u16 = 0x007C;
pub const MM_RESET_REQ: u16 = 0x0000;
pub const MM_RESET_CFM: u16 = 0x0001;
pub const MM_START_REQ: u16 = 0x0002;
pub const MM_START_CFM: u16 = 0x0003;
pub const MM_VERSION_REQ: u16 = 0x0004;
pub const MM_VERSION_CFM: u16 = 0x0005;
pub const MM_ADD_IF_REQ: u16 = 0x0006;
pub const MM_ADD_IF_CFM: u16 = 0x0007;
pub const MM_REMOVE_IF_REQ: u16 = 0x0008;
pub const MM_REMOVE_IF_CFM: u16 = 0x0009;
pub const MM_STA_ADD_REQ: u16 = 0x000A;
pub const MM_STA_ADD_CFM: u16 = 0x000B;
pub const MM_STA_DEL_REQ: u16 = 0x000C;
pub const MM_STA_DEL_CFM: u16 = 0x000D;
pub const MM_SET_FILTER_REQ: u16 = 0x000E;
pub const MM_SET_FILTER_CFM: u16 = 0x000F;
pub const MM_SET_CHANNEL_REQ: u16 = 0x0010;
pub const MM_SET_CHANNEL_CFM: u16 = 0x0011;
pub const MM_SET_IDLE_REQ: u16 = 0x0022;
pub const MM_SET_IDLE_CFM: u16 = 0x0023;
pub const MM_KEY_ADD_REQ: u16 = 0x0024;
pub const MM_KEY_ADD_CFM: u16 = 0x0025;
pub const MM_KEY_DEL_REQ: u16 = 0x0026;
pub const MM_KEY_DEL_CFM: u16 = 0x0027;
pub const MM_CHANNEL_SURVEY_IND: u16 = 0x004F;
pub const MM_SET_RF_CONFIG_REQ: u16 = 0x0067; pub const MM_SET_RF_CONFIG_CFM: u16 = 0x0068; pub const MM_SET_RF_CALIB_REQ: u16 = 0x0069; pub const MM_SET_RF_CALIB_CFM: u16 = 0x006A;
pub const MM_SET_RF_CALIB_REQ_SIZE: usize = 22;
pub const AIC8801_RF_CAL_CFG_24G: u32 = 0xbf;
pub const AIC8801_RF_CAL_CFG_5G: u32 = 0x3f;
pub const AIC8801_RF_PARAM_ALPHA: u32 = 0x0c34c008;
pub const AIC8801_RF_BT_CALIB_PARAM: u32 = 0x264203;
pub const MAC_HT_CAPABILITY_SIZE: usize = 26;
pub const MAC_VHT_CAPABILITY_SIZE: usize = 12;
pub const MAC_HE_CAPABILITY_SIZE: usize = 54;
pub const ME_CONFIG_REQ_SIZE: usize =
MAC_HT_CAPABILITY_SIZE + MAC_VHT_CAPABILITY_SIZE + MAC_HE_CAPABILITY_SIZE + 10; pub const HT_CAPA_INFO_LDPC: u16 = 0x0001;
pub const HT_AMPDU_FACTOR_MAX: u8 = 3;
pub const HT_AMPDU_DENSITY_MAX: u8 = 7;
pub const HT_MCS_RATE_1SS: u8 = 0xFF;
pub const ME_CONFIG_TAIL_TX_LFT_OFF: usize = 0; pub const ME_CONFIG_TAIL_PHY_BW_OFF: usize = 2; pub const ME_CONFIG_TAIL_HT_SUPP_OFF: usize = 3;
pub const MM_START_REQ_SIZE: usize = 70;
pub const MM_START_PHY_CFG_SIZE: usize = 64;
pub const MM_START_UAPSD_TIMEOUT_MS: u32 = 300;
pub const MM_START_LP_CLK_ACCURACY_PPM: u16 = 20;
pub const MM_ADD_IF_REQ_SIZE: usize = 10;
pub const MM_GET_MAC_ADDR_REQ_GET: u32 = 1;
pub const ME_CHAN_MAX_2G4: usize = 14;
pub const ME_CHAN_MAX_5G: usize = 28;
pub const ME_CHAN_TX_POWER_DEFAULT: i8 = 30;
pub const MM_GET_MAC_ADDR_REQ: u16 = 0x0073; pub const MM_GET_MAC_ADDR_CFM: u16 = 0x0074;
pub const MM_SET_TXPWR_IDX_LVL_REQ: u16 = 0x0077; pub const MM_SET_TXPWR_IDX_LVL_CFM: u16 = 0x0078; pub const MM_SET_TXPWR_OFST_REQ: u16 = 0x0079; pub const MM_SET_TXPWR_OFST_CFM: u16 = 0x007A;
pub const ME_CONFIG_REQ: u16 = 0x1400;
pub const ME_CONFIG_CFM: u16 = 0x1401;
pub const ME_CHAN_CONFIG_REQ: u16 = 0x1402;
pub const ME_CHAN_CONFIG_CFM: u16 = 0x1403;
pub const ME_SET_CONTROL_PORT_REQ: u16 = 0x1404;
pub const ME_SET_CONTROL_PORT_CFM: u16 = 0x1405;
pub const ME_STA_ADD_REQ: u16 = 0x1407;
pub const ME_STA_ADD_CFM: u16 = 0x1408;
pub const ME_STA_ADD_REQ_SIZE: usize = 136;
pub const STA_QOS_CAPA: u32 = 1 << 0;
pub const ME_SET_PS_MODE_REQ: u16 = 0x1413;
pub const ME_SET_PS_MODE_CFM: u16 = 0x1414;
pub const MM_PS_MODE_OFF: u8 = 0;
pub const MM_PS_MODE_ON: u8 = 1;
pub const MM_PS_MODE_ON_DYN: u8 = 2;
pub const MM_STA: u8 = 0;
pub const MM_IBSS: u8 = 1;
pub const MM_AP: u8 = 2;
pub const PHY_CHNL_BW_20: u8 = 0;
pub const PHY_CHNL_BW_40: u8 = 1;
pub const PHY_CHNL_BW_80: u8 = 2;
pub const CMD_TIMEOUT_MS: u64 = 6000;
pub const CMD_TX_TIMEOUT_DEFAULT_MS: u64 = 5000;
#[derive(Debug)]
pub enum CmdError {
Timeout,
BusDown,
SdioError,
InvalidResponse,
MismatchedCfm { expected: u16, got: u16 },
FirmwareError,
}
pub const CHAN_2G4_FREQS: [u16; 14] = [
2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484,
];
pub const SCANU_START_REQ: u16 = lmac_first_msg(TASK_SCANU); pub const SCANU_START_CFM: u16 = lmac_first_msg(TASK_SCANU) + 1; pub const SCANU_JOIN_REQ: u16 = lmac_first_msg(TASK_SCANU) + 2; pub const SCANU_JOIN_CFM: u16 = lmac_first_msg(TASK_SCANU) + 3; pub const SCANU_RESULT_IND: u16 = lmac_first_msg(TASK_SCANU) + 4; pub const SCANU_FAST_REQ: u16 = lmac_first_msg(TASK_SCANU) + 5; pub const SCANU_FAST_CFM: u16 = lmac_first_msg(TASK_SCANU) + 6; pub const SCANU_VENDOR_IE_REQ: u16 = lmac_first_msg(TASK_SCANU) + 7; pub const SCANU_VENDOR_IE_CFM: u16 = lmac_first_msg(TASK_SCANU) + 8; pub const SCANU_START_CFM_ADDTIONAL: u16 = lmac_first_msg(TASK_SCANU) + 9; pub const SCANU_CANCEL_REQ: u16 = lmac_first_msg(TASK_SCANU) + 10; pub const SCANU_CANCEL_CFM: u16 = lmac_first_msg(TASK_SCANU) + 11;
pub const SCAN_SSID_MAX: usize = 3;
pub const SCAN_CHANNEL_MAX: usize = 42;
pub const MAC_SSID_LEN: usize = 32;
pub const MAC_ADDR_LEN: usize = 6;
pub const fn msg_task(id: u16) -> u16 {
id >> 10
}
pub const MAC_CHAN_DEF_SIZE: usize = 6;
pub const MAC_SSID_SIZE: usize = 33;
pub const MAC_ADDR_SIZE: usize = 6;
pub const SCANU_START_REQ_SIZE: usize = 376;
#[derive(Clone, Debug)]
pub struct ScanResult {
pub ssid: [u8; MAC_SSID_LEN],
pub ssid_len: u8,
pub bssid: [u8; 6],
pub center_freq: u16,
pub rssi: i8,
pub capability: u16,
pub beacon_interval: u16,
pub raw_payload: Vec<u8>,
pub rsn_ie: Vec<u8>,
}
pub const APM_START_REQ: u16 = lmac_first_msg(TASK_APM); pub const APM_START_CFM: u16 = lmac_first_msg(TASK_APM) + 1; pub const APM_STOP_REQ: u16 = lmac_first_msg(TASK_APM) + 2; pub const APM_STOP_CFM: u16 = lmac_first_msg(TASK_APM) + 3; pub const APM_START_CAC_REQ: u16 = lmac_first_msg(TASK_APM) + 4; pub const APM_START_CAC_CFM: u16 = lmac_first_msg(TASK_APM) + 5; pub const APM_STOP_CAC_REQ: u16 = lmac_first_msg(TASK_APM) + 6; pub const APM_STOP_CAC_CFM: u16 = lmac_first_msg(TASK_APM) + 7; pub const APM_SET_BEACON_IE_REQ: u16 = lmac_first_msg(TASK_APM) + 8; pub const APM_SET_BEACON_IE_CFM: u16 = lmac_first_msg(TASK_APM) + 9;
pub const SM_CONNECT_REQ: u16 = lmac_first_msg(TASK_SM); pub const SM_CONNECT_CFM: u16 = lmac_first_msg(TASK_SM) + 1; pub const SM_CONNECT_IND: u16 = lmac_first_msg(TASK_SM) + 2; pub const SM_DISCONNECT_REQ: u16 = lmac_first_msg(TASK_SM) + 3; pub const SM_DISCONNECT_CFM: u16 = lmac_first_msg(TASK_SM) + 4; pub const SM_DISCONNECT_IND: u16 = lmac_first_msg(TASK_SM) + 5; pub const SM_EXTERNAL_AUTH_REQUIRED_IND: u16 = lmac_first_msg(TASK_SM) + 6; pub const SM_EXTERNAL_AUTH_REQUIRED_RSP: u16 = lmac_first_msg(TASK_SM) + 7; pub const SM_FT_AUTH_IND: u16 = lmac_first_msg(TASK_SM) + 8; pub const SM_FT_AUTH_RSP: u16 = lmac_first_msg(TASK_SM) + 9; pub const SM_RSP_TIMEOUT_IND: u16 = lmac_first_msg(TASK_SM) + 10; pub const SM_COEX_TS_TIMEOUT_IND: u16 = lmac_first_msg(TASK_SM) + 11; pub const SM_EXTERNAL_AUTH_REQUIRED_RSP_CFM: u16 = lmac_first_msg(TASK_SM) + 12;
pub const CONTROL_PORT_HOST: u32 = 1 << 0;
pub const CONTROL_PORT_NO_ENC: u32 = 1 << 1;
pub const DISABLE_HT: u32 = 1 << 2;
pub const WPA_WPA2_IN_USE: u32 = 1 << 3;
pub const MFP_IN_USE: u32 = 1 << 4;
pub const REASSOCIATION: u32 = 1 << 5;
pub const WLAN_AUTH_OPEN: u8 = 0;
pub const WLAN_AUTH_SHARED_KEY: u8 = 1;
pub const WLAN_AUTH_FT: u8 = 2;
pub const WLAN_AUTH_SAE: u8 = 3;
pub const MAC_CIPHER_WEP40: u8 = 0;
pub const MAC_CIPHER_TKIP: u8 = 1;
pub const MAC_CIPHER_CCMP: u8 = 2;
pub const MAC_CIPHER_WEP104: u8 = 3;
pub const MAC_SEC_KEY_LEN: usize = 32;
pub const WLAN_EID_SSID: u8 = 0;
pub const WLAN_EID_RSN: u8 = 48;
pub const SM_CONNECT_REQ_BASE_SIZE: usize = MAC_SSID_SIZE + MAC_ADDR_SIZE + MAC_CHAN_DEF_SIZE + 4 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + 256;
pub const SM_DISCONNECT_REQ_SIZE: usize = 3;
pub const MM_KEY_ADD_REQ_SIZE: usize = 44;
pub const MM_KEY_DEL_REQ_SIZE: usize = 1;
pub const ME_SET_CONTROL_PORT_REQ_SIZE: usize = 2;
pub const SM_ASSOC_IE_LEN: usize = 800;
pub const SM_DISCONNECT_IND_SIZE: usize = 5;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WifiState {
Disconnected,
Scanning,
Connecting,
Connected,
Authenticated,
}
#[derive(Clone, Debug)]
pub struct ConnectResult {
pub status_code: u16,
pub bssid: [u8; 6],
pub ap_idx: u8,
pub ch_idx: u8,
pub vif_idx: u8,
pub qos: bool,
pub aid: u16,
pub assoc_req_ies: Vec<u8>,
}
#[derive(Clone, Debug)]
pub struct DisconnectInfo {
pub reason_code: u16,
pub vif_idx: u8,
}