1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c)2019 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef _PHL_WOW_DEF_H_ 16*4882a593Smuzhiyun #define _PHL_WOW_DEF_H_ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun enum rtw_wow_op_mode { 19*4882a593Smuzhiyun RTW_WOW_OP_NONE = 0, 20*4882a593Smuzhiyun RTW_WOW_OP_PWR_DOWN, 21*4882a593Smuzhiyun RTW_WOW_OP_DISCONNECT_STBY, 22*4882a593Smuzhiyun RTW_WOW_OP_CONNECT_STBY, 23*4882a593Smuzhiyun RTW_WOW_OP_MAX = 0xF 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun enum rtw_wow_wake_reason { 27*4882a593Smuzhiyun RTW_WOW_RSN_UNKNOWN = 0, 28*4882a593Smuzhiyun RTW_WOW_RSN_RX_PAIRWISEKEY, 29*4882a593Smuzhiyun RTW_WOW_RSN_RX_GTK, 30*4882a593Smuzhiyun RTW_WOW_RSN_RX_FOURWAY_HANDSHAKE, 31*4882a593Smuzhiyun RTW_WOW_RSN_RX_DISASSOC, 32*4882a593Smuzhiyun RTW_WOW_RSN_RX_DEAUTH, /* 5 */ 33*4882a593Smuzhiyun RTW_WOW_RSN_RX_ARP_REQUEST, 34*4882a593Smuzhiyun RTW_WOW_RSN_RX_NS, 35*4882a593Smuzhiyun RTW_WOW_RSN_RX_EAPREQ_IDENTIFY, 36*4882a593Smuzhiyun RTW_WOW_RSN_FW_DECISION_DISCONNECT, 37*4882a593Smuzhiyun RTW_WOW_RSN_RX_MAGIC_PKT, /* 10 */ 38*4882a593Smuzhiyun RTW_WOW_RSN_RX_UNICAST_PKT, 39*4882a593Smuzhiyun RTW_WOW_RSN_RX_PATTERN_PKT, 40*4882a593Smuzhiyun RTW_WOW_RSN_RTD3_SSID_MATCH, 41*4882a593Smuzhiyun RTW_WOW_RSN_RX_DATA_PKT, 42*4882a593Smuzhiyun RTW_WOW_RSN_RX_SSDP_MATCH, /* 15 */ 43*4882a593Smuzhiyun RTW_WOW_RSN_RX_WSD_MATCH, 44*4882a593Smuzhiyun RTW_WOW_RSN_RX_SLP_MATCH, 45*4882a593Smuzhiyun RTW_WOW_RSN_RX_LLTD_MATCH, 46*4882a593Smuzhiyun RTW_WOW_RSN_RX_MDNS_MATCH, 47*4882a593Smuzhiyun RTW_WOW_RSN_RX_REALWOW_V2_WAKEUP_PKT, /* 20 */ 48*4882a593Smuzhiyun RTW_WOW_RSN_RX_REALWOW_V2_ACK_LOST, 49*4882a593Smuzhiyun RTW_WOW_RSN_RX_REALWOW_V2_TX_KAPKT, 50*4882a593Smuzhiyun RTW_WOW_RSN_ENABLE_FAIL_DMA_IDLE, 51*4882a593Smuzhiyun RTW_WOW_RSN_ENABLE_FAIL_DMA_PAUSE, 52*4882a593Smuzhiyun RTW_WOW_RSN_RTIME_FAIL_DMA_IDLE, /* 25 */ 53*4882a593Smuzhiyun RTW_WOW_RSN_RTIME_FAIL_DMA_PAUSE, 54*4882a593Smuzhiyun RTW_WOW_RSN_RX_SNMP_MISMATCHED_PKT, 55*4882a593Smuzhiyun RTW_WOW_RSN_RX_DESIGNATED_MAC_PKT, 56*4882a593Smuzhiyun RTW_WOW_RSN_NLO_SSID_MACH, 57*4882a593Smuzhiyun RTW_WOW_RSN_AP_OFFLOAD_WAKEUP, /* 30 */ 58*4882a593Smuzhiyun RTW_WOW_RSN_DMAC_ERROR_OCCURRED, 59*4882a593Smuzhiyun RTW_WOW_RSN_EXCEPTION_OCCURRED, 60*4882a593Smuzhiyun RTW_WOW_RSN_L0_TO_L1_ERROR_OCCURRED, 61*4882a593Smuzhiyun RTW_WOW_RSN_ASSERT_OCCURRED, 62*4882a593Smuzhiyun RTW_WOW_RSN_L2_ERROR_OCCURRED, /* 35 */ 63*4882a593Smuzhiyun RTW_WOW_RSN_WDT_TIMEOUT_WAKE, 64*4882a593Smuzhiyun RTW_WOW_RSN_RX_ACTION, 65*4882a593Smuzhiyun RTW_WOW_RSN_CLK_32K_UNLOCK, 66*4882a593Smuzhiyun RTW_WOW_RSN_CLK_32K_LOCK, 67*4882a593Smuzhiyun RTW_WOW_RSN_MAX = 0xFF 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct rtw_keep_alive_info { 72*4882a593Smuzhiyun /* core */ 73*4882a593Smuzhiyun u8 keep_alive_en; 74*4882a593Smuzhiyun u8 keep_alive_period; 75*4882a593Smuzhiyun /* phl/hal */ 76*4882a593Smuzhiyun u8 null_pkt_id; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct rtw_disc_det_info { 80*4882a593Smuzhiyun /* core */ 81*4882a593Smuzhiyun u8 disc_det_en; 82*4882a593Smuzhiyun u8 disc_wake_en; 83*4882a593Smuzhiyun u8 try_pkt_count; 84*4882a593Smuzhiyun u8 check_period; 85*4882a593Smuzhiyun u8 cnt_bcn_lost_en; 86*4882a593Smuzhiyun u8 cnt_bcn_lost_limit; 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define MAX_NLO_NUM 10 90*4882a593Smuzhiyun #define MAX_SSID_LEN 32 91*4882a593Smuzhiyun #define MAX_NLO_CHANNEL 40 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct rtw_nlo_info { 94*4882a593Smuzhiyun u8 nlo_en; 95*4882a593Smuzhiyun u8 num_of_networks; 96*4882a593Smuzhiyun u8 num_of_hidden_ap; 97*4882a593Smuzhiyun u8 ssid[MAX_NLO_NUM][MAX_SSID_LEN]; 98*4882a593Smuzhiyun u8 ssidlen[MAX_NLO_NUM]; 99*4882a593Smuzhiyun u8 chipertype[MAX_NLO_NUM]; 100*4882a593Smuzhiyun u8 probe_req_id; 101*4882a593Smuzhiyun struct scan_ofld_ch_info channel_list[MAX_NLO_CHANNEL]; 102*4882a593Smuzhiyun u8 channel_num; 103*4882a593Smuzhiyun u32 delay; /* ms */ 104*4882a593Smuzhiyun u32 period; /* ms */ 105*4882a593Smuzhiyun u8 cycle; 106*4882a593Smuzhiyun u32 slow_period; /* ms */ 107*4882a593Smuzhiyun void (* construct_pbreq)(void *priv, u8 *pkt_buf, u16 *len); 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun struct rtw_arp_ofld_content { 111*4882a593Smuzhiyun u8 arp_en; 112*4882a593Smuzhiyun u8 remote_ipv4_addr[IPV4_ADDRESS_LENGTH]; 113*4882a593Smuzhiyun u8 host_ipv4_addr[IPV4_ADDRESS_LENGTH]; 114*4882a593Smuzhiyun u8 mac_addr[MAC_ADDRESS_LENGTH]; 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun struct rtw_arp_ofld_info { 118*4882a593Smuzhiyun u8 arp_en; 119*4882a593Smuzhiyun u8 arp_action; /* 0 = send arp response, 1 = wake up host */ 120*4882a593Smuzhiyun u8 arp_rsp_id; 121*4882a593Smuzhiyun struct rtw_arp_ofld_content arp_ofld_content; 122*4882a593Smuzhiyun }; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct rtw_ndp_ofld_content { 125*4882a593Smuzhiyun u8 ndp_en; 126*4882a593Smuzhiyun u8 chk_remote_ip; 127*4882a593Smuzhiyun u8 num_target_ip; 128*4882a593Smuzhiyun u8 mac_addr[MAC_ADDRESS_LENGTH]; 129*4882a593Smuzhiyun u8 remote_ipv6_addr[IPV6_ADDRESS_LENGTH]; 130*4882a593Smuzhiyun u8 target_ipv6_addr[2][IPV6_ADDRESS_LENGTH]; 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct rtw_ndp_ofld_info { 134*4882a593Smuzhiyun u8 ndp_en; 135*4882a593Smuzhiyun u8 ndp_id; 136*4882a593Smuzhiyun struct rtw_ndp_ofld_content ndp_ofld_content[2]; 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun struct rtw_gtk_ofld_content { 140*4882a593Smuzhiyun u8 kck[32]; 141*4882a593Smuzhiyun u32 kck_len; 142*4882a593Smuzhiyun u8 kek[32]; 143*4882a593Smuzhiyun u32 kek_len; 144*4882a593Smuzhiyun u8 tk1[16]; 145*4882a593Smuzhiyun u8 txmickey[8]; 146*4882a593Smuzhiyun u8 rxmickey[8]; 147*4882a593Smuzhiyun u8 replay_cnt[8]; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun u8 igtk_keyid[4]; 150*4882a593Smuzhiyun u8 ipn[8]; 151*4882a593Smuzhiyun u8 igtk[2][32]; 152*4882a593Smuzhiyun u8 igtk_len; 153*4882a593Smuzhiyun u8 psk[32]; 154*4882a593Smuzhiyun u8 psk_len; 155*4882a593Smuzhiyun }; 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun struct rtw_gtk_ofld_info { 158*4882a593Smuzhiyun /* core */ 159*4882a593Smuzhiyun u8 gtk_en; 160*4882a593Smuzhiyun u8 tkip_en; 161*4882a593Smuzhiyun u8 ieee80211w_en; 162*4882a593Smuzhiyun u8 pairwise_wakeup; 163*4882a593Smuzhiyun u8 bip_sec_algo; 164*4882a593Smuzhiyun u8 akmtype_byte3; 165*4882a593Smuzhiyun struct rtw_gtk_ofld_content gtk_ofld_content; 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* phl */ 168*4882a593Smuzhiyun u8 hw_11w_en; /* keep 1 for BIP-CMAC-128 so far */ 169*4882a593Smuzhiyun u8 gtk_rsp_id; /* eapol pkt id */ 170*4882a593Smuzhiyun u8 sa_query_id; 171*4882a593Smuzhiyun }; 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun #define MAX_WOW_PATTERN_SIZE_BIT 128 174*4882a593Smuzhiyun #define MAX_WOW_PATTERN_SIZE_BYTE 16 175*4882a593Smuzhiyun #define MAX_WOW_PATTERN_SIZE_DWORD 4 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun struct rtw_wowcam_upd_info { 178*4882a593Smuzhiyun u8 rw; 179*4882a593Smuzhiyun u8 wow_cam_idx; 180*4882a593Smuzhiyun u32 wake_mask[4]; 181*4882a593Smuzhiyun u16 match_crc; 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun u8 is_negative_pattern_match; 184*4882a593Smuzhiyun u8 skip_mac_hdr; 185*4882a593Smuzhiyun u8 uc; 186*4882a593Smuzhiyun u8 mc; 187*4882a593Smuzhiyun u8 bc; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun u8 valid; 190*4882a593Smuzhiyun u8 ptrn[MAX_WOW_PATTERN_SIZE_BIT]; 191*4882a593Smuzhiyun u32 ptrn_len; 192*4882a593Smuzhiyun u8 mask[MAX_WOW_PATTERN_SIZE_BYTE]; 193*4882a593Smuzhiyun }; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define MAX_WOW_CAM_NUM 18 196*4882a593Smuzhiyun struct rtw_pattern_match_info{ 197*4882a593Smuzhiyun struct rtw_wowcam_upd_info wowcam_info[MAX_WOW_CAM_NUM]; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun #define MAX_REALWOW_KCP_SIZE 124 /* (100 + 24) */ 201*4882a593Smuzhiyun #define MAX_REALWOW_PAYLOAD 64 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun struct rtw_realwow_ofld_content { 204*4882a593Smuzhiyun u16 interval; /* unit : 1 ms */ 205*4882a593Smuzhiyun u16 keep_alive_pkt_size; 206*4882a593Smuzhiyun u16 ack_lost_limit; 207*4882a593Smuzhiyun u16 ack_ptrn_size; 208*4882a593Smuzhiyun u16 wakeup_ptrn_size; 209*4882a593Smuzhiyun u16 keep_alive_pkt_ptrn[MAX_REALWOW_KCP_SIZE]; 210*4882a593Smuzhiyun u8 ack_ptrn[MAX_REALWOW_PAYLOAD]; 211*4882a593Smuzhiyun u8 wakeup_ptrn[MAX_REALWOW_PAYLOAD]; 212*4882a593Smuzhiyun u32 wakeup_sec_num; 213*4882a593Smuzhiyun }; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun struct rtw_realwow_info { 216*4882a593Smuzhiyun u8 realwow_en; 217*4882a593Smuzhiyun u8 auto_wakeup; 218*4882a593Smuzhiyun u8 keepalive_id; 219*4882a593Smuzhiyun u8 wakeup_pattern_id; 220*4882a593Smuzhiyun u8 ack_pattern_id; 221*4882a593Smuzhiyun struct rtw_realwow_ofld_content realwow_ofld_content; 222*4882a593Smuzhiyun }; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun struct rtw_wow_gpio_info { 225*4882a593Smuzhiyun u8 dev2hst_gpio_en; 226*4882a593Smuzhiyun u8 disable_inband; 227*4882a593Smuzhiyun u8 gpio_output_input; 228*4882a593Smuzhiyun u8 gpio_active; 229*4882a593Smuzhiyun u8 toggle_pulse; 230*4882a593Smuzhiyun u8 data_pin_wakeup; 231*4882a593Smuzhiyun u8 gpio_pulse_nonstop; 232*4882a593Smuzhiyun u8 gpio_time_unit; 233*4882a593Smuzhiyun u8 gpio_num; 234*4882a593Smuzhiyun u8 gpio_pulse_dura; 235*4882a593Smuzhiyun u8 gpio_pulse_period; 236*4882a593Smuzhiyun u8 gpio_pulse_count; 237*4882a593Smuzhiyun u8 customer_id; 238*4882a593Smuzhiyun u8 gpio_pulse_en_a; 239*4882a593Smuzhiyun u8 gpio_duration_unit_a; 240*4882a593Smuzhiyun u8 gpio_pulse_nonstop_a; 241*4882a593Smuzhiyun u8 special_reason_a; 242*4882a593Smuzhiyun u8 gpio_duration_a; 243*4882a593Smuzhiyun u8 gpio_pulse_count_a; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun enum rtw_gpio_mode dev2hst_gpio_mode; 246*4882a593Smuzhiyun u8 dev2hst_gpio; 247*4882a593Smuzhiyun u8 dev2hst_high; 248*4882a593Smuzhiyun }; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun struct rtw_remote_wake_ctrl_info { 251*4882a593Smuzhiyun /* core */ 252*4882a593Smuzhiyun u8 ptk_tx_iv[IV_LENGTH]; 253*4882a593Smuzhiyun u8 valid_check; 254*4882a593Smuzhiyun u8 symbol_check_en; 255*4882a593Smuzhiyun u8 gtk_key_idx; 256*4882a593Smuzhiyun u8 ptk_rx_iv[IV_LENGTH]; 257*4882a593Smuzhiyun u8 gtk_rx_iv_idx0[IV_LENGTH]; 258*4882a593Smuzhiyun u8 gtk_rx_iv_idx1[IV_LENGTH]; 259*4882a593Smuzhiyun u8 gtk_rx_iv_idx2[IV_LENGTH]; 260*4882a593Smuzhiyun u8 gtk_rx_iv_idx3[IV_LENGTH]; 261*4882a593Smuzhiyun }; 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun struct rtw_wow_wake_info { 264*4882a593Smuzhiyun /* core */ 265*4882a593Smuzhiyun u8 wow_en; 266*4882a593Smuzhiyun u8 drop_all_pkt; 267*4882a593Smuzhiyun u8 rx_parse_after_wake; 268*4882a593Smuzhiyun u8 pairwise_sec_algo; 269*4882a593Smuzhiyun u8 group_sec_algo; 270*4882a593Smuzhiyun u8 bip_sec_algo; 271*4882a593Smuzhiyun u8 pattern_match_en; 272*4882a593Smuzhiyun u8 magic_pkt_en; 273*4882a593Smuzhiyun u8 hw_unicast_en; 274*4882a593Smuzhiyun u8 fw_unicast_en; 275*4882a593Smuzhiyun u8 deauth_wakeup; 276*4882a593Smuzhiyun u8 rekey_wakeup; 277*4882a593Smuzhiyun u8 eap_wakeup; 278*4882a593Smuzhiyun u8 all_data_wakeup; 279*4882a593Smuzhiyun struct rtw_remote_wake_ctrl_info remote_wake_ctrl_info; 280*4882a593Smuzhiyun }; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun struct rtw_aoac_report { 283*4882a593Smuzhiyun /* status check */ 284*4882a593Smuzhiyun u8 rpt_fail; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun /* report from fw */ 287*4882a593Smuzhiyun u8 rpt_ver; 288*4882a593Smuzhiyun u8 sec_type; 289*4882a593Smuzhiyun u8 key_idx; 290*4882a593Smuzhiyun u8 pattern_idx; 291*4882a593Smuzhiyun u8 rekey_ok; 292*4882a593Smuzhiyun u8 ptk_tx_iv[IV_LENGTH]; 293*4882a593Smuzhiyun u8 eapol_key_replay_count[8]; 294*4882a593Smuzhiyun u8 gtk[32]; 295*4882a593Smuzhiyun u8 ptk_rx_iv[IV_LENGTH]; 296*4882a593Smuzhiyun u8 gtk_rx_iv[4][IV_LENGTH]; 297*4882a593Smuzhiyun u8 igtk_key_id[8]; 298*4882a593Smuzhiyun u8 igtk_ipn[8]; 299*4882a593Smuzhiyun u8 igtk[32]; 300*4882a593Smuzhiyun }; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun #ifdef CONFIG_WOWLAN 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun /* Exported APIs to core */ 305*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_keep_alive_info(void *phl, struct rtw_keep_alive_info *info); 306*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_disc_det_info(void *phl, struct rtw_disc_det_info *info); 307*4882a593Smuzhiyun void rtw_phl_cfg_nlo_info(void *phl, struct rtw_nlo_info *info); 308*4882a593Smuzhiyun void rtw_phl_cfg_arp_ofld_info(void *phl, struct rtw_arp_ofld_info *info); 309*4882a593Smuzhiyun void rtw_phl_cfg_ndp_ofld_info(void *phl, struct rtw_ndp_ofld_info *info); 310*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_remove_wow_ptrn_info(void *phl, u8 phl_ptrn_id); 311*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_add_wow_ptrn_info(void *phl, struct rtw_wowcam_upd_info *info, u8 *phl_ptrn_id); 312*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_gtk_ofld_info(void *phl, struct rtw_gtk_ofld_info *info); 313*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_realwow_info(void *phl, struct rtw_realwow_info *info); 314*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_wow_wake(void *phl, struct rtw_wow_wake_info *info); 315*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_gpio_wake_pulse(void *phl, struct rtw_wow_gpio_info *info); 316*4882a593Smuzhiyun const char *rtw_phl_get_wow_rsn_str(void *phl, enum rtw_wow_wake_reason wake_rsn); 317*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_wow_set_sw_gpio_mode(void *phl, struct rtw_wow_gpio_info *info); 318*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_cfg_wow_sw_gpio_ctrl(void *phl, struct rtw_wow_gpio_info *info); 319*4882a593Smuzhiyun #endif /* CONFIG_WOWLAN */ 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun #endif /* _PHL_WOW_DEF_H_ */ 322*4882a593Smuzhiyun 323