1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __WL12XX_80211_H__ 3*4882a593Smuzhiyun #define __WL12XX_80211_H__ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/if_ether.h> /* ETH_ALEN */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* RATES */ 8*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_1MB 0x02 9*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_2MB 0x04 10*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_5MB 0x0B 11*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_11MB 0x16 12*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_6MB 0x0C 13*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_9MB 0x12 14*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_12MB 0x18 15*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_18MB 0x24 16*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_24MB 0x30 17*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_36MB 0x48 18*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_48MB 0x60 19*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_54MB 0x6C 20*4882a593Smuzhiyun #define IEEE80211_BASIC_RATE_MASK 0x80 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_1MB_MASK (1<<0) 23*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_2MB_MASK (1<<1) 24*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_5MB_MASK (1<<2) 25*4882a593Smuzhiyun #define IEEE80211_CCK_RATE_11MB_MASK (1<<3) 26*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) 27*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) 28*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) 29*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) 30*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) 31*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) 32*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) 33*4882a593Smuzhiyun #define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define IEEE80211_CCK_RATES_MASK 0x0000000F 36*4882a593Smuzhiyun #define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ 37*4882a593Smuzhiyun IEEE80211_CCK_RATE_2MB_MASK) 38*4882a593Smuzhiyun #define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ 39*4882a593Smuzhiyun IEEE80211_CCK_RATE_5MB_MASK | \ 40*4882a593Smuzhiyun IEEE80211_CCK_RATE_11MB_MASK) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define IEEE80211_OFDM_RATES_MASK 0x00000FF0 43*4882a593Smuzhiyun #define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ 44*4882a593Smuzhiyun IEEE80211_OFDM_RATE_12MB_MASK | \ 45*4882a593Smuzhiyun IEEE80211_OFDM_RATE_24MB_MASK) 46*4882a593Smuzhiyun #define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ 47*4882a593Smuzhiyun IEEE80211_OFDM_RATE_9MB_MASK | \ 48*4882a593Smuzhiyun IEEE80211_OFDM_RATE_18MB_MASK | \ 49*4882a593Smuzhiyun IEEE80211_OFDM_RATE_36MB_MASK | \ 50*4882a593Smuzhiyun IEEE80211_OFDM_RATE_48MB_MASK | \ 51*4882a593Smuzhiyun IEEE80211_OFDM_RATE_54MB_MASK) 52*4882a593Smuzhiyun #define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ 53*4882a593Smuzhiyun IEEE80211_CCK_DEFAULT_RATES_MASK) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* This really should be 8, but not for our firmware */ 57*4882a593Smuzhiyun #define MAX_SUPPORTED_RATES 32 58*4882a593Smuzhiyun #define MAX_COUNTRY_TRIPLETS 32 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Headers */ 61*4882a593Smuzhiyun struct ieee80211_header { 62*4882a593Smuzhiyun __le16 frame_ctl; 63*4882a593Smuzhiyun __le16 duration_id; 64*4882a593Smuzhiyun u8 da[ETH_ALEN]; 65*4882a593Smuzhiyun u8 sa[ETH_ALEN]; 66*4882a593Smuzhiyun u8 bssid[ETH_ALEN]; 67*4882a593Smuzhiyun __le16 seq_ctl; 68*4882a593Smuzhiyun u8 payload[]; 69*4882a593Smuzhiyun } __packed; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun struct wl12xx_ie_header { 72*4882a593Smuzhiyun u8 id; 73*4882a593Smuzhiyun u8 len; 74*4882a593Smuzhiyun } __packed; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* IEs */ 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct wl12xx_ie_ssid { 79*4882a593Smuzhiyun struct wl12xx_ie_header header; 80*4882a593Smuzhiyun char ssid[IEEE80211_MAX_SSID_LEN]; 81*4882a593Smuzhiyun } __packed; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct wl12xx_ie_rates { 84*4882a593Smuzhiyun struct wl12xx_ie_header header; 85*4882a593Smuzhiyun u8 rates[MAX_SUPPORTED_RATES]; 86*4882a593Smuzhiyun } __packed; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct wl12xx_ie_ds_params { 89*4882a593Smuzhiyun struct wl12xx_ie_header header; 90*4882a593Smuzhiyun u8 channel; 91*4882a593Smuzhiyun } __packed; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct country_triplet { 94*4882a593Smuzhiyun u8 channel; 95*4882a593Smuzhiyun u8 num_channels; 96*4882a593Smuzhiyun u8 max_tx_power; 97*4882a593Smuzhiyun } __packed; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun struct wl12xx_ie_country { 100*4882a593Smuzhiyun struct wl12xx_ie_header header; 101*4882a593Smuzhiyun u8 country_string[IEEE80211_COUNTRY_STRING_LEN]; 102*4882a593Smuzhiyun struct country_triplet triplets[MAX_COUNTRY_TRIPLETS]; 103*4882a593Smuzhiyun } __packed; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun /* Templates */ 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct wl12xx_beacon_template { 109*4882a593Smuzhiyun struct ieee80211_header header; 110*4882a593Smuzhiyun __le32 time_stamp[2]; 111*4882a593Smuzhiyun __le16 beacon_interval; 112*4882a593Smuzhiyun __le16 capability; 113*4882a593Smuzhiyun struct wl12xx_ie_ssid ssid; 114*4882a593Smuzhiyun struct wl12xx_ie_rates rates; 115*4882a593Smuzhiyun struct wl12xx_ie_rates ext_rates; 116*4882a593Smuzhiyun struct wl12xx_ie_ds_params ds_params; 117*4882a593Smuzhiyun struct wl12xx_ie_country country; 118*4882a593Smuzhiyun } __packed; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun struct wl12xx_null_data_template { 121*4882a593Smuzhiyun struct ieee80211_header header; 122*4882a593Smuzhiyun } __packed; 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun struct wl12xx_ps_poll_template { 125*4882a593Smuzhiyun __le16 fc; 126*4882a593Smuzhiyun __le16 aid; 127*4882a593Smuzhiyun u8 bssid[ETH_ALEN]; 128*4882a593Smuzhiyun u8 ta[ETH_ALEN]; 129*4882a593Smuzhiyun } __packed; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct wl12xx_qos_null_data_template { 132*4882a593Smuzhiyun struct ieee80211_header header; 133*4882a593Smuzhiyun __le16 qos_ctl; 134*4882a593Smuzhiyun } __packed; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun struct wl12xx_probe_req_template { 137*4882a593Smuzhiyun struct ieee80211_header header; 138*4882a593Smuzhiyun struct wl12xx_ie_ssid ssid; 139*4882a593Smuzhiyun struct wl12xx_ie_rates rates; 140*4882a593Smuzhiyun struct wl12xx_ie_rates ext_rates; 141*4882a593Smuzhiyun } __packed; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun struct wl12xx_probe_resp_template { 145*4882a593Smuzhiyun struct ieee80211_header header; 146*4882a593Smuzhiyun __le32 time_stamp[2]; 147*4882a593Smuzhiyun __le16 beacon_interval; 148*4882a593Smuzhiyun __le16 capability; 149*4882a593Smuzhiyun struct wl12xx_ie_ssid ssid; 150*4882a593Smuzhiyun struct wl12xx_ie_rates rates; 151*4882a593Smuzhiyun struct wl12xx_ie_rates ext_rates; 152*4882a593Smuzhiyun struct wl12xx_ie_ds_params ds_params; 153*4882a593Smuzhiyun struct wl12xx_ie_country country; 154*4882a593Smuzhiyun } __packed; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #endif 157