1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 290921014SLuciano Coelho #ifndef __WL12XX_80211_H__ 390921014SLuciano Coelho #define __WL12XX_80211_H__ 490921014SLuciano Coelho 590921014SLuciano Coelho #include <linux/if_ether.h> /* ETH_ALEN */ 690921014SLuciano Coelho 790921014SLuciano Coelho /* RATES */ 890921014SLuciano Coelho #define IEEE80211_CCK_RATE_1MB 0x02 990921014SLuciano Coelho #define IEEE80211_CCK_RATE_2MB 0x04 1090921014SLuciano Coelho #define IEEE80211_CCK_RATE_5MB 0x0B 1190921014SLuciano Coelho #define IEEE80211_CCK_RATE_11MB 0x16 1290921014SLuciano Coelho #define IEEE80211_OFDM_RATE_6MB 0x0C 1390921014SLuciano Coelho #define IEEE80211_OFDM_RATE_9MB 0x12 1490921014SLuciano Coelho #define IEEE80211_OFDM_RATE_12MB 0x18 1590921014SLuciano Coelho #define IEEE80211_OFDM_RATE_18MB 0x24 1690921014SLuciano Coelho #define IEEE80211_OFDM_RATE_24MB 0x30 1790921014SLuciano Coelho #define IEEE80211_OFDM_RATE_36MB 0x48 1890921014SLuciano Coelho #define IEEE80211_OFDM_RATE_48MB 0x60 1990921014SLuciano Coelho #define IEEE80211_OFDM_RATE_54MB 0x6C 2090921014SLuciano Coelho #define IEEE80211_BASIC_RATE_MASK 0x80 2190921014SLuciano Coelho 2290921014SLuciano Coelho #define IEEE80211_CCK_RATE_1MB_MASK (1<<0) 2390921014SLuciano Coelho #define IEEE80211_CCK_RATE_2MB_MASK (1<<1) 2490921014SLuciano Coelho #define IEEE80211_CCK_RATE_5MB_MASK (1<<2) 2590921014SLuciano Coelho #define IEEE80211_CCK_RATE_11MB_MASK (1<<3) 2690921014SLuciano Coelho #define IEEE80211_OFDM_RATE_6MB_MASK (1<<4) 2790921014SLuciano Coelho #define IEEE80211_OFDM_RATE_9MB_MASK (1<<5) 2890921014SLuciano Coelho #define IEEE80211_OFDM_RATE_12MB_MASK (1<<6) 2990921014SLuciano Coelho #define IEEE80211_OFDM_RATE_18MB_MASK (1<<7) 3090921014SLuciano Coelho #define IEEE80211_OFDM_RATE_24MB_MASK (1<<8) 3190921014SLuciano Coelho #define IEEE80211_OFDM_RATE_36MB_MASK (1<<9) 3290921014SLuciano Coelho #define IEEE80211_OFDM_RATE_48MB_MASK (1<<10) 3390921014SLuciano Coelho #define IEEE80211_OFDM_RATE_54MB_MASK (1<<11) 3490921014SLuciano Coelho 3590921014SLuciano Coelho #define IEEE80211_CCK_RATES_MASK 0x0000000F 3690921014SLuciano Coelho #define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \ 3790921014SLuciano Coelho IEEE80211_CCK_RATE_2MB_MASK) 3890921014SLuciano Coelho #define IEEE80211_CCK_DEFAULT_RATES_MASK (IEEE80211_CCK_BASIC_RATES_MASK | \ 3990921014SLuciano Coelho IEEE80211_CCK_RATE_5MB_MASK | \ 4090921014SLuciano Coelho IEEE80211_CCK_RATE_11MB_MASK) 4190921014SLuciano Coelho 4290921014SLuciano Coelho #define IEEE80211_OFDM_RATES_MASK 0x00000FF0 4390921014SLuciano Coelho #define IEEE80211_OFDM_BASIC_RATES_MASK (IEEE80211_OFDM_RATE_6MB_MASK | \ 4490921014SLuciano Coelho IEEE80211_OFDM_RATE_12MB_MASK | \ 4590921014SLuciano Coelho IEEE80211_OFDM_RATE_24MB_MASK) 4690921014SLuciano Coelho #define IEEE80211_OFDM_DEFAULT_RATES_MASK (IEEE80211_OFDM_BASIC_RATES_MASK | \ 4790921014SLuciano Coelho IEEE80211_OFDM_RATE_9MB_MASK | \ 4890921014SLuciano Coelho IEEE80211_OFDM_RATE_18MB_MASK | \ 4990921014SLuciano Coelho IEEE80211_OFDM_RATE_36MB_MASK | \ 5090921014SLuciano Coelho IEEE80211_OFDM_RATE_48MB_MASK | \ 5190921014SLuciano Coelho IEEE80211_OFDM_RATE_54MB_MASK) 5290921014SLuciano Coelho #define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \ 5390921014SLuciano Coelho IEEE80211_CCK_DEFAULT_RATES_MASK) 5490921014SLuciano Coelho 5590921014SLuciano Coelho 5690921014SLuciano Coelho /* This really should be 8, but not for our firmware */ 5790921014SLuciano Coelho #define MAX_SUPPORTED_RATES 32 5890921014SLuciano Coelho #define MAX_COUNTRY_TRIPLETS 32 5990921014SLuciano Coelho 6090921014SLuciano Coelho /* Headers */ 6190921014SLuciano Coelho struct ieee80211_header { 6290921014SLuciano Coelho __le16 frame_ctl; 6390921014SLuciano Coelho __le16 duration_id; 6490921014SLuciano Coelho u8 da[ETH_ALEN]; 6590921014SLuciano Coelho u8 sa[ETH_ALEN]; 6690921014SLuciano Coelho u8 bssid[ETH_ALEN]; 6790921014SLuciano Coelho __le16 seq_ctl; 68*398978f7SGustavo A. R. Silva u8 payload[]; 6990921014SLuciano Coelho } __packed; 7090921014SLuciano Coelho 7190921014SLuciano Coelho struct wl12xx_ie_header { 7290921014SLuciano Coelho u8 id; 7390921014SLuciano Coelho u8 len; 7490921014SLuciano Coelho } __packed; 7590921014SLuciano Coelho 7690921014SLuciano Coelho /* IEs */ 7790921014SLuciano Coelho 7890921014SLuciano Coelho struct wl12xx_ie_ssid { 7990921014SLuciano Coelho struct wl12xx_ie_header header; 8090921014SLuciano Coelho char ssid[IEEE80211_MAX_SSID_LEN]; 8190921014SLuciano Coelho } __packed; 8290921014SLuciano Coelho 8390921014SLuciano Coelho struct wl12xx_ie_rates { 8490921014SLuciano Coelho struct wl12xx_ie_header header; 8590921014SLuciano Coelho u8 rates[MAX_SUPPORTED_RATES]; 8690921014SLuciano Coelho } __packed; 8790921014SLuciano Coelho 8890921014SLuciano Coelho struct wl12xx_ie_ds_params { 8990921014SLuciano Coelho struct wl12xx_ie_header header; 9090921014SLuciano Coelho u8 channel; 9190921014SLuciano Coelho } __packed; 9290921014SLuciano Coelho 9390921014SLuciano Coelho struct country_triplet { 9490921014SLuciano Coelho u8 channel; 9590921014SLuciano Coelho u8 num_channels; 9690921014SLuciano Coelho u8 max_tx_power; 9790921014SLuciano Coelho } __packed; 9890921014SLuciano Coelho 9990921014SLuciano Coelho struct wl12xx_ie_country { 10090921014SLuciano Coelho struct wl12xx_ie_header header; 10190921014SLuciano Coelho u8 country_string[IEEE80211_COUNTRY_STRING_LEN]; 10290921014SLuciano Coelho struct country_triplet triplets[MAX_COUNTRY_TRIPLETS]; 10390921014SLuciano Coelho } __packed; 10490921014SLuciano Coelho 10590921014SLuciano Coelho 10690921014SLuciano Coelho /* Templates */ 10790921014SLuciano Coelho 10890921014SLuciano Coelho struct wl12xx_beacon_template { 10990921014SLuciano Coelho struct ieee80211_header header; 11090921014SLuciano Coelho __le32 time_stamp[2]; 11190921014SLuciano Coelho __le16 beacon_interval; 11290921014SLuciano Coelho __le16 capability; 11390921014SLuciano Coelho struct wl12xx_ie_ssid ssid; 11490921014SLuciano Coelho struct wl12xx_ie_rates rates; 11590921014SLuciano Coelho struct wl12xx_ie_rates ext_rates; 11690921014SLuciano Coelho struct wl12xx_ie_ds_params ds_params; 11790921014SLuciano Coelho struct wl12xx_ie_country country; 11890921014SLuciano Coelho } __packed; 11990921014SLuciano Coelho 12090921014SLuciano Coelho struct wl12xx_null_data_template { 12190921014SLuciano Coelho struct ieee80211_header header; 12290921014SLuciano Coelho } __packed; 12390921014SLuciano Coelho 12490921014SLuciano Coelho struct wl12xx_ps_poll_template { 12590921014SLuciano Coelho __le16 fc; 12690921014SLuciano Coelho __le16 aid; 12790921014SLuciano Coelho u8 bssid[ETH_ALEN]; 12890921014SLuciano Coelho u8 ta[ETH_ALEN]; 12990921014SLuciano Coelho } __packed; 13090921014SLuciano Coelho 13190921014SLuciano Coelho struct wl12xx_qos_null_data_template { 13290921014SLuciano Coelho struct ieee80211_header header; 13390921014SLuciano Coelho __le16 qos_ctl; 13490921014SLuciano Coelho } __packed; 13590921014SLuciano Coelho 13690921014SLuciano Coelho struct wl12xx_probe_req_template { 13790921014SLuciano Coelho struct ieee80211_header header; 13890921014SLuciano Coelho struct wl12xx_ie_ssid ssid; 13990921014SLuciano Coelho struct wl12xx_ie_rates rates; 14090921014SLuciano Coelho struct wl12xx_ie_rates ext_rates; 14190921014SLuciano Coelho } __packed; 14290921014SLuciano Coelho 14390921014SLuciano Coelho 14490921014SLuciano Coelho struct wl12xx_probe_resp_template { 14590921014SLuciano Coelho struct ieee80211_header header; 14690921014SLuciano Coelho __le32 time_stamp[2]; 14790921014SLuciano Coelho __le16 beacon_interval; 14890921014SLuciano Coelho __le16 capability; 14990921014SLuciano Coelho struct wl12xx_ie_ssid ssid; 15090921014SLuciano Coelho struct wl12xx_ie_rates rates; 15190921014SLuciano Coelho struct wl12xx_ie_rates ext_rates; 15290921014SLuciano Coelho struct wl12xx_ie_ds_params ds_params; 15390921014SLuciano Coelho struct wl12xx_ie_country country; 15490921014SLuciano Coelho } __packed; 15590921014SLuciano Coelho 15690921014SLuciano Coelho #endif 157