Update wifi stack from LA.UM.7.4.r1-05400-8x98.0

Change-Id: I7e46d6e7c3c73ead5c66d10ee2955c8a8f3f5292
This commit is contained in:
codeworkx 2019-07-20 07:14:53 +02:00
parent a84f38de6b
commit 2b6f677357
39 changed files with 801 additions and 233 deletions

View file

@ -120,6 +120,11 @@ typedef PREPACK struct _HTC_FRAME_HDR{
#define HTC_FLAGS_SEND_BUNDLE (1 << 1) /* start or part of bundle */
#define HTC_FLAGS_SEQ_CHECK (1 << 2) /* seq check on rx side */
#define HTC_FLAGS_CRC_CHECK (1 << 3) /* CRC check on rx side */
/* HTC_FLAGS_PADDING_CHECK
* Set by the sender to inform the receiver that the HTC packet begins
* with continuation (block) alignment padding from the prior HTC packet.
*/
#define HTC_FLAGS_PADDING_CHECK (1 << 4)
/* receive direction */
#define HTC_FLAGS_RECV_1MORE_BLOCK (1 << 0) /* bit 0 bundle trailer present */
#define HTC_FLAGS_RECV_TRAILER (1 << 1) /* bit 1 trailer data present */

View file

@ -1233,23 +1233,27 @@ typedef struct {
* BIT [ 27: 24] :- gi - HTT_PPDU_STATS_GI
* BIT [ 28: 28] :- dcm
* BIT [ 29: 29] :- ldpc
* BIT [ 31: 30] :- reserved4
* BIT [ 30: 30] :- valid_skipped_rate_ctrl
* This flag indicates whether the skipped_rate_ctrl
* flag should be ignored, or if it holds valid data.
* BIT [ 31: 31] :- skipped_rate_ctrl
*/
union {
A_UINT32 rate_info;
struct {
A_UINT32 ltf_size: 2,
stbc: 1,
he_re: 1,
txbf: 4,
bw: 4,
nss: 4,
mcs: 4,
preamble: 4,
gi: 4,
dcm: 1,
ldpc: 1,
reserved4: 2;
A_UINT32 ltf_size: 2,
stbc: 1,
he_re: 1,
txbf: 4,
bw: 4,
nss: 4,
mcs: 4,
preamble: 4,
gi: 4,
dcm: 1,
ldpc: 1,
valid_skipped_rate_ctrl: 1,
skipped_rate_ctrl: 1;
};
};

View file

@ -771,6 +771,15 @@ typedef struct {
A_UINT32 phy_warm_reset_reason_num_cca_rx_frame_stuck;
A_UINT32 phy_warm_reset_reason_wal_rx_recovery_rst_rx_busy;
A_UINT32 phy_warm_reset_reason_wal_rx_recovery_rst_mac_hang;
A_UINT32 phy_warm_reset_reason_mac_reset_converted_phy_reset;
A_UINT32 wal_rx_recovery_rst_mac_hang_count;
A_UINT32 wal_rx_recovery_rst_known_sig_count;
A_UINT32 wal_rx_recovery_rst_no_rx_count;
A_UINT32 wal_rx_recovery_rst_no_rx_consecutive_count;
A_UINT32 wal_rx_recovery_rst_rx_busy_count;
A_UINT32 wal_rx_recovery_rst_phy_mac_hang_count;
A_UINT32 rx_flush_cnt; /* Num rx flush issued */
} htt_hw_stats_pdev_errs_tlv;
typedef struct {
@ -1222,6 +1231,11 @@ typedef struct _htt_rx_peer_rate_stats_tlv {
*/
A_UINT32 per_chain_rssi_pkt_type;
A_INT8 rx_per_chain_rssi_in_dbm[HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS][HTT_RX_PEER_STATS_NUM_BW_COUNTERS];
A_UINT32 rx_ulmumimo_non_data_ppdu; /* ppdu level */
A_UINT32 rx_ulmumimo_data_ppdu; /* ppdu level */
A_UINT32 rx_ulmumimo_mpdu_ok; /* mpdu level */
A_UINT32 rx_ulmumimo_mpdu_fail; /* mpdu level */
} htt_rx_peer_rate_stats_tlv;
typedef enum {
@ -2998,6 +3012,7 @@ typedef struct {
#define HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS 8
#define HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES HTT_STATS_PREAM_COUNT
#define HTT_RX_PDEV_MAX_OFDMA_NUM_USER 8
#define HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER 8
#define HTT_RX_PDEV_STATS_RXEVM_MAX_PILOTS_PER_NSS 16
#define HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS 6
@ -3095,6 +3110,11 @@ typedef struct {
A_UINT32 rx_br_poll;
A_UINT32 rx_11ax_dl_ofdma_mcs[HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS];
A_UINT32 rx_11ax_dl_ofdma_ru[HTT_RX_PDEV_STATS_NUM_RU_SIZE_COUNTERS];
A_UINT32 rx_ulmumimo_non_data_ppdu[HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER]; /* ppdu level */
A_UINT32 rx_ulmumimo_data_ppdu[HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER]; /* ppdu level */
A_UINT32 rx_ulmumimo_mpdu_ok[HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER]; /* mpdu level */
A_UINT32 rx_ulmumimo_mpdu_fail[HTT_RX_PDEV_MAX_ULMUMIMO_NUM_USER]; /* mpdu level */
} htt_rx_pdev_rate_stats_tlv;
/* STATS_TYPE : HTT_DBG_EXT_STATS_PDEV_RX_RATE

View file

@ -981,8 +981,8 @@ typedef enum {
WMITLV_TAG_STRUC_wmi_wlanfw_iface_cmb_ind_event_fixed_param,
WMITLV_TAG_STRUC_wmi_wlanfw_iface_combination_param,
WMITLV_TAG_STRUC_wmi_wlanfw_iface_limit_param,
WMITLV_TAG_STRUC_wmi_roam_dsm_filter_fixed_param,
WMITLV_TAG_STRUC_wmi_roam_bssid_disallow_list_config_param,
WMITLV_TAG_STRUC_wmi_pdev_dsm_filter_fixed_param,
WMITLV_TAG_STRUC_wmi_pdev_bssid_disallow_list_config_param,
WMITLV_TAG_STRUC_wmi_mgmt_hdr,
} WMITLV_TAG_ID;
@ -1382,7 +1382,7 @@ typedef enum {
OP(WMI_ROAM_DEAUTH_CONFIG_CMDID) \
OP(WMI_ROAM_IDLE_CONFIG_CMDID) \
OP(WMI_IDLE_TRIGGER_MONITOR_CMDID) \
OP(WMI_ROAM_DSM_FILTER_CMDID) \
OP(WMI_PDEV_DSM_FILTER_CMDID) \
/* add new CMD_LIST elements above this line */
@ -3055,11 +3055,11 @@ WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_IDLE_CONFIG_CMDID);
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_idle_trigger_monitor_cmd_fixed_param, wmi_idle_trigger_monitor_cmd_fixed_param, fixed_param, WMITLV_SIZE_FIX)
WMITLV_CREATE_PARAM_STRUC(WMI_IDLE_TRIGGER_MONITOR_CMDID);
/* DSM roam filter parameters */
#define WMITLV_TABLE_WMI_ROAM_DSM_FILTER_CMDID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_roam_dsm_filter_fixed_param, wmi_roam_dsm_filter_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_bssid_disallow_list_config_param, bssid_disallow_list, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_DSM_FILTER_CMDID);
/* DSM filter parameters */
#define WMITLV_TABLE_WMI_PDEV_DSM_FILTER_CMDID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_pdev_dsm_filter_fixed_param, wmi_pdev_dsm_filter_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_pdev_bssid_disallow_list_config_param, bssid_disallow_list, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_PDEV_DSM_FILTER_CMDID);
#define WMITLV_TABLE_WMI_ROAM_BLACKLIST_EVENTID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_roam_blacklist_event_fixed_param, wmi_roam_blacklist_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
@ -4228,7 +4228,8 @@ WMITLV_CREATE_PARAM_STRUC(WMI_AGGR_STATE_TRIG_EVENTID);
/* Roam Event */
#define WMITLV_TABLE_WMI_ROAM_EVENTID(id,op,buf,len) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_roam_event_fixed_param, wmi_roam_event_fixed_param, fixed_param, WMITLV_SIZE_FIX)
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_STRUC_wmi_roam_event_fixed_param, wmi_roam_event_fixed_param, fixed_param, WMITLV_SIZE_FIX) \
WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, deauth_disassoc_frame, WMITLV_SIZE_VAR)
WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_EVENTID);
/* Roam Synch Event */

View file

@ -407,6 +407,8 @@ typedef enum {
WMI_PDEV_PKTLOG_FILTER_CMDID,
/** wmi command for setting rogue ap configuration */
WMI_PDEV_SET_RAP_CONFIG_CMDID,
/** Specify DSM filters along with disallow bssid filters */
WMI_PDEV_DSM_FILTER_CMDID,
/* VDEV (virtual device) specific commands */
/** vdev create */
@ -697,8 +699,11 @@ typedef enum {
WMI_ROAM_DEAUTH_CONFIG_CMDID,
/** Configure idle roam trigger parameters */
WMI_ROAM_IDLE_CONFIG_CMDID,
/** roaming filter cmd with DSM filters along with existing roam filters */
WMI_ROAM_DSM_FILTER_CMDID,
/**
* WMI_ROAM_DSM_FILTER_CMDID is deprecated and should be unused,
* but leave it reserved just to be safe.
*/
DEPRECATED__WMI_ROAM_DSM_FILTER_CMDID,
/** offload scan specific commands */
/** set offload scan AP profile */
@ -2063,6 +2068,8 @@ typedef enum {
#define WMI_HE_CAP_1X_LTF_400NS_GI_SUPPORT 0x00000001
#define WMI_HE_CAP_2X_LTF_400NS_GI_SUPPORT 0x00000002
#define WMI_HE_CAP_2X_LTF_160_80_80_SUPPORT 0x00000004
#define WMI_HE_CAP_RX_DL_OFDMA_SUPPORT 0x00000018
#define WMI_HE_CAP_RX_DL_MUMIMO_SUPPORT 0x00000030
#define WMI_HE_CAP_1X_LTF_400NS_GI_SUPPORT_GET(he_cap_info_dword1) \
WMI_GET_BITS(he_cap_info_dword1, 0, 1)
@ -2079,6 +2086,16 @@ typedef enum {
#define WMI_HE_CAP_2X_LTF_160_80_80_SUPPORT_SET(he_cap_info_dword1, value) \
WMI_SET_BITS(he_cap_info_dword1, 2, 1, value)
#define WMI_HE_CAP_RX_DL_OFDMA_SUPPORT_GET(he_cap_info_dword1) \
WMI_GET_BITS(he_cap_info_dword1, 3, 2)
#define WMI_HE_CAP_RX_DL_OFDMA_SUPPORT_SET(he_cap_info_dword1, value) \
WMI_SET_BITS(he_cap_info_dword1, 3, 2, value)
#define WMI_HE_CAP_RX_DL_MUMIMO_SUPPORT_GET(he_cap_info_dword1) \
WMI_GET_BITS(he_cap_info_dword1, 5, 2)
#define WMI_HE_CAP_RX_DL_MUMIMO_SUPPORT_SET(he_cap_info_dword1, value) \
WMI_SET_BITS(he_cap_info_dword1, 5, 2, value)
/* Interested readers refer to Rx/Tx MCS Map definition as defined in 802.11ax
*/
#define WMI_HE_MAX_MCS_4_SS_MASK(r,ss) ((3 & (r)) << (((ss) - 1) << 1))
@ -2091,6 +2108,20 @@ enum {
WMI_HE_FRAG_SUPPORT_LEVEL3, /* support for multiple fragments per MSDU within an A-MPDU */
};
enum {
WMI_HE_RX_DL_OFDMA_SUPPORT_DEFAULT, /* Default */
WMI_HE_RX_DL_OFDMA_SUPPORT_DISABLE, /* RX DL OFDMA Support Disabled */
WMI_HE_RX_DL_OFDMA_SUPPORT_ENABLE, /* RX DL OFDMA Support Enabled */
WMI_HE_RX_DL_OFDMA_SUPPORT_INVALID, /* INVALID */
};
enum {
WMI_HE_RX_DL_MUMIMO_SUPPORT_DEFAULT, /* Default */
WMI_HE_RX_DL_MUMIMO_SUPPORT_DISABLE, /* RX DL MU-MIMO Support Disabled */
WMI_HE_RX_DL_MUMIMO_SUPPORT_ENABLE, /* RX DL MU-MIMO Support Enabled */
WMI_HE_RX_DL_MUMIMO_SUPPORT_INVALID, /* INVALID */
};
/** NOTE: This defs cannot be changed in the future without breaking WMI compatibility */
#define WMI_MAX_NUM_SS MAX_HE_NSS
#define WMI_MAX_NUM_RU MAX_HE_RU
@ -5841,19 +5872,26 @@ typedef enum {
/* Parameter used to configure OBSS Packet Detect threshold
* for Spatial Reuse feature.
* The accepted values are in between 62 and 95, inclusive.
* The accepted values are in between 0x00 and 0xFF, inclusive.
* The parameter value is programmed into the spatial reuse register,
* to specify how low the background signal strength from neighboring
* BSS cells must be, for this AP to employ spatial reuse.
* The value of the parameter is multiplied by -1 to get the
* OBSS RSSI threshold, in dBm, below which spatial reuse will
* be allowed.
* For example, if the parameter value is 62, the target will
*
* The value of the parameter is compared against the OBSS RSSI in dB.
* It is a 8-bit value whose
* range is -128 to 127 (after two's complement operation).
* For example, if the parameter value is 0xF5, the target will
* allow spatial reuse if the RSSI detected from other BSS
* is below -62 dBm.
* Similarly, if the parameter value is 80, the target will
* is below -10 dB.
* Similarly, if the parameter value is 0x0A, the target will
* allow spatial reuse only if the RSSI detected from neighboring
* BSS cells is no more than -80 dBm.
* BSS cells is no more than 10 dB.
*
* bit | purpose
* -------------
* 0 - 7 | Param Value
* 8 - 30 | reserved
* 31 | Enable/Disable. If set to 0, ignore bits 0-7.
*/
WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD,
@ -10087,6 +10125,7 @@ typedef struct {
#define WMI_VDEV_START_RESPONSE_INVALID_VDEVID 0x1 /** requested VDEV not found */
#define WMI_VDEV_START_RESPONSE_NOT_SUPPORTED 0x2 /** unsupported VDEV combination */
#define WMI_VDEV_START_RESPONSE_DFS_VIOLATION 0x3 /** DFS_VIOLATION since channel in the NOL is selected */
#define WMI_VDEV_START_RESPONSE_INVALID_REGDOMAIN 0x4 /** Invalid regulatory domain in VDEV start */
/** Beacon processing related command and event structures */
typedef struct {
@ -11523,7 +11562,11 @@ typedef struct {
* bit 0 : Indicated support for RX 1xLTF + 0.4us
* bit 1 : Indicates support for RX 2xLTF + 0.4us
* bit 2 : Indicates support for 2xLTF in 160/80+80 MHz HE PPDU
* bit[31:3] : Reserved
* bit[4:3] : Indicates support for DL OFDMA
* Refer to enum WMI_HE_RX_DL_OFDMA_SUPPORT_x
* bit[6:5] : Indicates support for DL MU-MIMO
* Refer to enum WMI_HE_RX_DL_MUMIMO_SUPPORT_x
* bit[31:7] : Reserved
* Refer to WMI_HE_CAP_xx_LTF_xxx_SUPPORT_GET/SET macros
*/
A_UINT32 peer_he_cap_info_internal;
@ -12691,6 +12734,10 @@ typedef struct {
* Refer to WMI_ROAM_NOTIF_ defs to interpret the notif_params value.
*/
A_UINT32 notif_params;
/** roam notification param1
* Refer to WMI_ROAM_NOTIF_ defs to interpret the notif_params1 value.
*/
A_UINT32 notif_params1;
} wmi_roam_event_fixed_param;
@ -12763,8 +12810,8 @@ typedef enum
#define WMI_ROAM_NOTIF_DISCONNECT 0x6 /** indicate that roaming not allowed due BTM req */
#define WMI_ROAM_NOTIF_SUBNET_CHANGED 0x7 /** indicate that subnet has changed */
#define WMI_ROAM_NOTIF_SCAN_START 0x8 /** indicate roam scan start, notif_params to be sent as WMI_ROAM_TRIGGER_REASON_ID */
#define WMI_ROAM_NOTIF_DEAUTH_RECV 0x9 /** indicate deauth received, notif_params to be sent as reason code */
#define WMI_ROAM_NOTIF_DISASSOC_RECV 0xa /** indicate disassoc received, notif_params to be sent as reason code */
#define WMI_ROAM_NOTIF_DEAUTH_RECV 0x9 /** indicate deauth received, notif_params to be sent as reason code, notif_params1 to be sent as frame length */
#define WMI_ROAM_NOTIF_DISASSOC_RECV 0xa /** indicate disassoc received, notif_params to be sent as reason code, notif_params1 to be sent as frame length */
/**whenever RIC request information change, host driver should pass all ric related information to firmware (now only support tsepc)
* Once, 11r roaming happens, firmware can generate RIC request in reassoc request based on these informations
@ -12825,6 +12872,7 @@ typedef struct{
#define WMI_ROAM_INVOKE_SCAN_MODE_CACHE_LIST 1 /* scan cached channel list */
#define WMI_ROAM_INVOKE_SCAN_MODE_FULL_CH 2 /* scan full channel */
#define WMI_ROAM_INVOKE_SCAN_MODE_SKIP 3 /* no scan is performed. use beacon/probe resp given by the host */
#define WMI_ROAM_INVOKE_SCAN_MODE_CACHE_MAP 4 /* scan cached channel map */
#define WMI_ROAM_INVOKE_AP_SEL_FIXED_BSSID 0 /* roam to given BSSID only */
#define WMI_ROAM_INVOKE_AP_SEL_ANY_BSSID 1 /* roam to any BSSID */
@ -23993,7 +24041,7 @@ static INLINE A_UINT8 *wmi_id_to_name(A_UINT32 wmi_command)
WMI_RETURN_STRING(WMI_ROAM_DEAUTH_CONFIG_CMDID);
WMI_RETURN_STRING(WMI_ROAM_IDLE_CONFIG_CMDID);
WMI_RETURN_STRING(WMI_IDLE_TRIGGER_MONITOR_CMDID);
WMI_RETURN_STRING(WMI_ROAM_DSM_FILTER_CMDID);
WMI_RETURN_STRING(WMI_PDEV_DSM_FILTER_CMDID);
}
return "Invalid WMI cmd";
@ -24498,11 +24546,11 @@ typedef enum {
/*
* Lay out of flags in wmi_wlm_config_cmd_fixed_param
*
* |31 17|16 14| 13 | 12 | 11 | 10 |9 8|7 6|5 4|3 2| 1 | 0 |
* +------+-----+----+----+------+------+------+------+------+------+-----+-----+
* | RSVD | NSS |EDCA| TRY| SSLP | CSLP | RSVD | Roam | RSVD | DWLT | DFS | SUP |
* +----------------------+-------------+-------------+-------------------------+
* | WAL | PS | Roam | Scan |
* |31 19| 18 | 17|16 14| 13 | 12| 11 | 10 | 9 | 8 |7 6|5 4|3 2| 1 | 0 |
* +-----+-----+---+-----+----+---+----+----+-----+----+----+----+----+---+---+
* | RSVD|SRATE|RTS| NSS |EDCA|TRY|SSLP|CSLP|DBMPS|RSVD|Roam|RSVD|DWLT|DFS|SUP|
* +------------------------------+---------------+---------+-----------------+
* | WAL | PS | Roam | Scan |
*
* Flag values:
* TRY: (1) enable short limit for retrying unacked tx, where the limit is
@ -24513,6 +24561,10 @@ typedef enum {
* NSS: (0) no Nss limits, other than those negotiatied during association
* (1) during 2-chain operation, tx only a single spatial stream
* (2) - (7) reserved / invalid
* RTS: (0) default protection
* (1) always enable RTS/CTS protection
* SRATE: (0) default secondary rate policy
* (1) disable secondary rate
*/
/* bit 0-3 of flags is used for scan operation */
/* bit 0: WLM_FLAGS_SCAN_SUPPRESS, suppress all scan and other bits would be ignored if bit is set */
@ -24589,6 +24641,10 @@ typedef enum {
#define WLM_FLAGS_WAL_ADJUST_EDCA_SET(flag, val) WMI_SET_BITS(flag, 13, 1, val)
#define WLM_FLAGS_WAL_1NSS_ENABLED(flag) (WMI_GET_BITS(flag, 14, 3) & 0x1)
#define WLM_FLAGS_WAL_NSS_SET(flag, val) WMI_SET_BITS(flag, 14, 3, val)
#define WLM_FLAGS_WAL_ALWAYS_RTS_PROTECTION(flag) WMI_GET_BITS(flag, 17, 1)
#define WLM_FLAGS_WAL_RTS_PROTECTION_SET(flag, val) WMI_SET_BITS(flag, 17, 1, val)
#define WLM_FLAGS_WAL_DISABLE_SECONDARY_RATE(flag) WMI_GET_BITS(flag, 18, 1)
#define WLM_FLAGS_WAL_SECONDARY_RATE_SET(flag, val) WMI_SET_BITS(flag, 18, 1, val)
typedef struct {
/** TLV tag and len; tag equals
@ -24881,15 +24937,17 @@ typedef struct {
/**
* [7:0] : channel metric - 0 = unusable, 1 = worst, 100 = best
* [11:8] : channel BW -
* 0 = 20MHz
* 1 = 40MHz
* 2 = 80MHz
* 3 = 160MHz
* (4-10 unused)
* 11 = 5MHz
* 12 = 10MHz
* (13-15 unused)
* [11:8] : channel BW - This bit-field uses values compatible with
* enum definitions used internally within the target's
* halphy code. These values are specified below.
* BW_20MHZ = 0,
* BW_40MHZ = 1,
* BW_80MHZ = 2,
* BW_160MHZ = 3,
* BW_80P80MHZ = 4,
* BW_5MHZ = 5,
* BW_10MHZ = 6,
* BW_165MHZ = 7,
* [15:12]: Reserved
* [31:16]: Frequency - Center frequency of the channel for which
* the RF characterisation info applies (MHz)
@ -25227,21 +25285,20 @@ typedef enum {
} WMI_SCREEN_STATUS_NOTIFY_ID;
typedef struct {
/** TLV tag and len; tag equals wmi_roam_dsm_filter_fixed_param */
/** TLV tag and len; tag equals wmi_pdev_dsm_filter_fixed_param */
A_UINT32 tlv_header;
/** Unique id identifying the VDEV on which new roaming filter(data stall AP mitigation) is adopted */
A_UINT32 vdev_id;
/**
* TLV (tag length value) parameter's following roam_dsm_filter_cmd are,
* TLV (tag length value) parameter's following pdev_dsm_filter_cmd are,
*
* wmi_roam_bssid_disallow_list_config_param bssid_disallow_list[]; i.e array containing
* all roam filter lists including the new DSM lists(avoidlist/driver_blacklist) and
* existing roam lists(supplicant_blacklist/rssi_rejectlist etc.)
* wmi_pdev_bssid_disallow_list_config_param bssid_disallow_list[];
* i.e array containing all disallow AP filter lists including
* the new DSM lists (avoidlist / driver_blacklist) and existing
* lists (supplicant_blacklist / rssi_rejectlist etc.)
*/
} wmi_roam_dsm_filter_fixed_param;
} wmi_pdev_dsm_filter_fixed_param;
typedef struct {
/** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_roam_bssid_disallow_list_config_param */
/** TLV tag and len; tag equals WMITLV_TAG_STRUC_wmi_pdev_bssid_disallow_list_config_param */
A_UINT32 tlv_header;
/** bssid type i.e whether bssid falls in avoid list or driver_blacklist etc.
see WMI_BSSID_DISALLOW_LIST_TYPE **/
@ -25252,13 +25309,13 @@ typedef struct {
A_UINT32 remaining_disallow_duration;
/** AP will be allowed for candidate, when AP RSSI better than expected RSSI units in dBm */
A_INT32 expected_rssi;
} wmi_roam_bssid_disallow_list_config_param;
} wmi_pdev_bssid_disallow_list_config_param;
typedef enum {
/* USER_SPACE_BLACK_LIST
* Black Listed AP's by host's user space
*/
WMI_BSSID_DISALLOW_USER_SPACE_BLACK_LIST = 0,
WMI_BSSID_DISALLOW_USER_SPACE_BLACK_LIST = 1,
/* DRIVER_BLACK_LIST
* Black Listed AP's by host driver
* used for data stall migitation
@ -25280,6 +25337,12 @@ typedef enum {
WMI_BSSID_DISALLOW_RSSI_REJECT_LIST,
} WMI_BSSID_DISALLOW_LIST_TYPE;
/* WLAN_PDEV_MAX_NUM_BSSID_DISALLOW_LIST:
* Maximum number of BSSID disallow entries which host is allowed to send
* to firmware within the WMI_PDEV_DSM_FILTER_CMDID message.
*/
#define WLAN_PDEV_MAX_NUM_BSSID_DISALLOW_LIST 28
typedef struct {
/*
* The timestamp is in units of ticks of a 19.2MHz clock.

View file

@ -36,7 +36,7 @@
#define __WMI_VER_MINOR_ 0
/** WMI revision number has to be incremented when there is a
* change that may or may not break compatibility. */
#define __WMI_REVISION_ 664
#define __WMI_REVISION_ 671
/** The Version Namespace should not be normally changed. Only
* host and firmware of the same WMI namespace will work

View file

@ -936,6 +936,24 @@ QDF_STATUS cds_set_hw_mode_on_channel_switch(uint8_t session_id);
void cds_set_do_hw_mode_change_flag(bool flag);
bool cds_is_hw_mode_change_after_vdev_up(void);
void cds_checkn_update_hw_mode_single_mac_mode(uint8_t channel);
/**
* cds_check_and_stop_opportunistic_timer() - Stop dbs opportunistic timer
*
* Stop dbs opportunistic timer and depending on the current connections change
* hw_mode to single mac mode.
*
* Return: None
*/
void cds_check_and_stop_opportunistic_timer(void);
/**
* cds_set_opportunistic_update() - Set opportunistic update event
*
* Return: QDF_STATUS
*/
QDF_STATUS cds_set_opportunistic_update(void);
void cds_dump_connection_status_info(void);
/**
* cds_mode_specific_vdev_id() - provides the

View file

@ -376,6 +376,7 @@ typedef struct _cds_context_type {
qdf_event_t connection_update_done_evt;
qdf_mutex_t qdf_conc_list_lock;
qdf_mc_timer_t dbs_opportunistic_timer;
qdf_event_t opportunistic_update_done_evt;
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
void (*sap_restart_chan_switch_cb)(struct hdd_adapter_s *,
uint32_t, uint32_t);

View file

@ -2683,19 +2683,19 @@ static void cds_pdev_set_hw_mode_cb(uint32_t status,
cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
if (!cds_ctx) {
cds_err("Invalid CDS Context");
return;
goto set_done_event;
}
cds_set_hw_mode_change_in_progress(CDS_HW_MODE_NOT_IN_PROGRESS);
if (status != SET_HW_MODE_STATUS_OK) {
cds_err("Set HW mode failed with status %d", status);
return;
goto set_done_event;
}
if (!vdev_mac_map) {
cds_err("vdev_mac_map is NULL");
return;
goto set_done_event;
}
cds_debug("cfgd_hw_mode_index=%d", cfgd_hw_mode_index);
@ -2708,7 +2708,7 @@ static void cds_pdev_set_hw_mode_cb(uint32_t status,
ret = wma_get_hw_mode_from_idx(cfgd_hw_mode_index, &hw_mode);
if (ret != QDF_STATUS_SUCCESS) {
cds_err("Get HW mode failed: %d", ret);
return;
goto set_done_event;
}
cds_debug("MAC0: TxSS:%d, RxSS:%d, Bw:%d",
@ -2736,7 +2736,10 @@ static void cds_pdev_set_hw_mode_cb(uint32_t status,
if (cds_ctx->mode_change_cb)
cds_ctx->mode_change_cb();
return;
set_done_event:
ret = cds_set_opportunistic_update();
if (!QDF_IS_STATUS_SUCCESS(ret))
cds_err("ERROR: set opportunistic_update event failed");
}
/**
@ -4403,6 +4406,14 @@ QDF_STATUS cds_deinit_policy_mgr(void)
return QDF_STATUS_E_FAILURE;
}
/* Destroy opportunistic_update_done_evt */
status = qdf_event_destroy(&cds_ctx->opportunistic_update_done_evt);
if (!QDF_IS_STATUS_SUCCESS(status)) {
cds_err("Failed to destroy opportunistic_update_done_evt");
status = QDF_STATUS_E_FAILURE;
QDF_ASSERT(0);
}
if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy
(&cds_ctx->connection_update_done_evt))) {
cds_err("Failed to destroy connection_update_done_evt");
@ -4507,6 +4518,12 @@ QDF_STATUS cds_init_policy_mgr(struct cds_sme_cbacks *sme_cbacks)
return QDF_STATUS_E_FAILURE;
}
status = qdf_event_create(&cds_ctx->opportunistic_update_done_evt);
if (!QDF_IS_STATUS_SUCCESS(status)) {
cds_err("opportunistic_update_done_evt init failed");
return status;
}
return QDF_STATUS_SUCCESS;
}
@ -11096,6 +11113,67 @@ void cds_checkn_update_hw_mode_single_mac_mode(uint8_t channel)
cds_dbs_opportunistic_timer_handler((void *)cds_ctx);
}
QDF_STATUS cds_set_opportunistic_update(void)
{
QDF_STATUS status;
cds_context_type *cds_ctx;
cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
if (!cds_ctx) {
cds_err("Invalid CDS Context");
return QDF_STATUS_E_FAILURE;
}
status = qdf_event_set(&cds_ctx->opportunistic_update_done_evt);
if (!QDF_IS_STATUS_SUCCESS(status)) {
cds_err("set event failed");
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
void cds_check_and_stop_opportunistic_timer(void)
{
cds_context_type *cds_ctx;
enum cds_conc_next_action action = CDS_NOP;
QDF_STATUS status = QDF_STATUS_E_FAILURE;
cds_ctx = cds_get_context(QDF_MODULE_ID_QDF);
if (!cds_ctx) {
cds_err("Invalid CDS Context");
return;
}
if (cds_ctx->dbs_opportunistic_timer.state != QDF_TIMER_STATE_RUNNING)
return;
qdf_mc_timer_stop(&cds_ctx->dbs_opportunistic_timer);
action = cds_need_opportunistic_upgrade();
if (!action)
return;
qdf_event_reset(&cds_ctx->opportunistic_update_done_evt);
/*
* lets call for action, session id is being used only
* in hidden ssid case for now. So, session id 0 is ok here.
*/
status = cds_next_actions(0, action, SIR_UPDATE_REASON_OPPORTUNISTIC);
if (!QDF_IS_STATUS_SUCCESS(status)) {
cds_err("Failed in cds_next_actions");
return;
}
status = qdf_wait_single_event(&cds_ctx->opportunistic_update_done_evt,
CONNECTION_UPDATE_TIMEOUT);
if (!QDF_IS_STATUS_SUCCESS(status)) {
cds_err("wait on opportunistic_update_done_evt is failed");
return;
}
}
/**
* cds_set_do_hw_mode_change_flag() - Set flag to indicate hw mode change
* @flag: Indicate if hw mode change is required or not

View file

@ -6163,6 +6163,7 @@ ol_txrx_mon_rx_data_cb(void *ppdev, void *nbuf_list, uint8_t vdev_id,
/* clear IEEE80211_RADIOTAP_F_FCS flag*/
rx_status.rtap_flags &= ~(BIT(4));
rx_status.rtap_flags &= ~(BIT(2));
/*
* convert 802.3 header format into 802.11 format

View file

@ -11368,8 +11368,8 @@ enum restart_beaconing_on_ch_avoid_rule {
* <ini>
* gAutoBmpsTimerValue - Set Auto BMPS Timer value
* @Min: 0
* @Max: 120
* @Default: 90
* @Max: 1000
* @Default: 600
*
* This ini is used to set Auto BMPS Timer value in seconds
*
@ -11383,8 +11383,8 @@ enum restart_beaconing_on_ch_avoid_rule {
*/
#define CFG_AUTO_PS_ENABLE_TIMER_NAME "gAutoBmpsTimerValue"
#define CFG_AUTO_PS_ENABLE_TIMER_MIN (0)
#define CFG_AUTO_PS_ENABLE_TIMER_MAX (120)
#define CFG_AUTO_PS_ENABLE_TIMER_DEFAULT (90)
#define CFG_AUTO_PS_ENABLE_TIMER_MAX (1000)
#define CFG_AUTO_PS_ENABLE_TIMER_DEFAULT (600)
#ifdef WLAN_ICMP_DISABLE_PS
/*
@ -12675,7 +12675,7 @@ enum hw_filter_mode {
* </ini>
*/
#define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_NAME "gActionOUISwitchTo11nMode"
#define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT "00904C 03 0418BF E0 21 40"
#define CFG_ACTION_OUI_SWITCH_TO_11N_MODE_DEFAULT "00904C 05 0418BF0CB2 F8 21 40"
/*
* <ini>

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -506,6 +506,11 @@ static int hdd_apf_read_memory(hdd_adapter_t *adapter, struct nlattr **tb)
ENTER();
if (context->apf_enabled) {
hdd_err("Cannot get/set while interpreter is enabled");
return -EINVAL;
}
read_mem_params.vdev_id = adapter->sessionId;
/* Read APF work memory offset */
@ -531,11 +536,6 @@ static int hdd_apf_read_memory(hdd_adapter_t *adapter, struct nlattr **tb)
return -ENOMEM;
}
if (context->apf_enabled) {
hdd_err("Cannot get/set while interpreter is enabled");
return -EINVAL;
}
qdf_event_reset(&context->qdf_apf_event);
context->offset = read_mem_params.addr_offset;

View file

@ -2323,9 +2323,10 @@ static int hdd_set_dwell_time(hdd_adapter_t *adapter, uint8_t *command)
sme_get_config_param(hHal, sme_config);
if (strncmp(command, "SETDWELLTIME ACTIVE MAX", 23) == 0) {
if (drv_cmd_validate(command, 23))
return -EINVAL;
if (drv_cmd_validate(command, 23)) {
retval = -EINVAL;
goto free;
}
value = value + 24;
temp = kstrtou32(value, 10, &val);
if (temp != 0 || val < CFG_ACTIVE_MAX_CHANNEL_TIME_MIN ||
@ -2338,8 +2339,10 @@ static int hdd_set_dwell_time(hdd_adapter_t *adapter, uint8_t *command)
sme_config->csrConfig.nActiveMaxChnTime = val;
sme_update_config(hHal, sme_config);
} else if (strncmp(command, "SETDWELLTIME ACTIVE MIN", 23) == 0) {
if (drv_cmd_validate(command, 23))
return -EINVAL;
if (drv_cmd_validate(command, 23)) {
retval = -EINVAL;
goto free;
}
value = value + 24;
temp = kstrtou32(value, 10, &val);
@ -2353,8 +2356,10 @@ static int hdd_set_dwell_time(hdd_adapter_t *adapter, uint8_t *command)
sme_config->csrConfig.nActiveMinChnTime = val;
sme_update_config(hHal, sme_config);
} else if (strncmp(command, "SETDWELLTIME PASSIVE MAX", 24) == 0) {
if (drv_cmd_validate(command, 24))
return -EINVAL;
if (drv_cmd_validate(command, 24)) {
retval = -EINVAL;
goto free;
}
value = value + 25;
temp = kstrtou32(value, 10, &val);
@ -2368,8 +2373,10 @@ static int hdd_set_dwell_time(hdd_adapter_t *adapter, uint8_t *command)
sme_config->csrConfig.nPassiveMaxChnTime = val;
sme_update_config(hHal, sme_config);
} else if (strncmp(command, "SETDWELLTIME PASSIVE MIN", 24) == 0) {
if (drv_cmd_validate(command, 24))
return -EINVAL;
if (drv_cmd_validate(command, 24)) {
retval = -EINVAL;
goto free;
}
value = value + 25;
temp = kstrtou32(value, 10, &val);
@ -2383,8 +2390,10 @@ static int hdd_set_dwell_time(hdd_adapter_t *adapter, uint8_t *command)
sme_config->csrConfig.nPassiveMinChnTime = val;
sme_update_config(hHal, sme_config);
} else if (strncmp(command, "SETDWELLTIME", 12) == 0) {
if (drv_cmd_validate(command, 12))
return -EINVAL;
if (drv_cmd_validate(command, 12)) {
retval = -EINVAL;
goto free;
}
value = value + 13;
temp = kstrtou32(value, 10, &val);

View file

@ -2420,9 +2420,11 @@ int hdd_wlan_start_modules(hdd_context_t *hdd_ctx, hdd_adapter_t *adapter,
}
ret = hdd_ipa_init(hdd_ctx);
if (ret)
status = hdd_ipa_init(hdd_ctx);
if (status) {
ret = qdf_status_to_os_return(status);
goto err_post_disable;
}
hdd_sysfs_create_version_interface();

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -31,6 +31,7 @@
#include "nan_api.h"
#include "wlan_hdd_main.h"
#include "wlan_hdd_nan.h"
#include "cds_concurrency.h"
/**
* __wlan_hdd_cfg80211_nan_request() - cfg80211 NAN request handler
@ -72,6 +73,21 @@ static int __wlan_hdd_cfg80211_nan_request(struct wiphy *wiphy,
return -EPERM;
}
/*
* Note: NAN commands in DBS hw_mode are not supported.
*
* When STA + SAP is operating in DBS mode and if the SAP is stopped,
* then after 10 seconds dbs opportunistic timer handler is invoked
* to move hw_mode to single mac.
*
* Meanwhile in this 10 seconds window, if there is NAN enable request,
* then firmware rejects it, since hw_mode is in DBS.
*
* Therefore, when NAN request is issued try to change hw_mode to
* single MAC.
*/
cds_check_and_stop_opportunistic_timer();
nan_req.request_data_len = data_len;
nan_req.request_data = data;

View file

@ -8977,7 +8977,8 @@ static int __iw_setnone_getint(struct net_device *dev,
if (QDF_STATUS_SUCCESS !=
sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
&txpow2g)) {
return -EIO;
ret = -EIO;
break;
}
hdd_debug("2G tx_power %d", txpow2g);
break;
@ -8995,7 +8996,8 @@ static int __iw_setnone_getint(struct net_device *dev,
if (QDF_STATUS_SUCCESS !=
sme_cfg_get_int(hHal, WNI_CFG_CURRENT_TX_POWER_LEVEL,
&txpow5g)) {
return -EIO;
ret = -EIO;
break;
}
hdd_debug("5G tx_power %d", txpow5g);
break;

View file

@ -32,9 +32,9 @@
#define QWLAN_VERSION_MAJOR 5
#define QWLAN_VERSION_MINOR 1
#define QWLAN_VERSION_PATCH 1
#define QWLAN_VERSION_EXTRA "E"
#define QWLAN_VERSION_EXTRA "Q"
#define QWLAN_VERSION_BUILD 73
#define QWLAN_VERSIONSTR "5.1.1.73E"
#define QWLAN_VERSIONSTR "5.1.1.73Q"
#endif /* QWLAN_VERSION_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -455,6 +455,13 @@
#define SIR_MAX_NOA_ATTR_LEN 31
#define SIR_MAX_NOA_DESCR 2
#define SIR_P2P_IE_HEADER_LEN 6
#define HEADER_LEN_P2P_IE 6
#define OUI_SIZE_P2P 4
#define P2P_1X1_WAR_OUI "\x00\x50\xf2\x04"
#define P2P_1X1_OUI_LEN 4
#define MAX_CONFIG_METHODS_LEN 2
#define DEVICE_CATEGORY_MAX_LEN 1
#define SIR_MAC_CISCO_OUI "\x00\x40\x96"
#define SIR_MAC_CISCO_OUI_SIZE 3
@ -2261,4 +2268,67 @@ typedef struct sSirMacRadioMeasureReport {
#define SIR_MAC_TXSTBC 1
#define SIR_MAC_RXSTBC 1
/**
* enum p2p_attr_id - enum for P2P attributes ID in P2P IE
* @P2P_ATTR_STATUS - Attribute Status none
* @P2P_ATTR_MINOR_REASON_CODE: Minor reason code attribute
* @P2P_ATTR_CAPABILITY: Capability attribute
* @P2P_ATTR_DEVICE_ID: device ID attribute
* @P2P_ATTR_GROUP_OWNER_INTENT: Group owner intent attribute
* @P2P_ATTR_CONFIGURATION_TIMEOUT: Config timeout attribute
* @P2P_ATTR_LISTEN_CHANNEL: listen channel attribute
* @P2P_ATTR_GROUP_BSSID: Group BSSID attribute
* @P2P_ATTR_EXT_LISTEN_TIMING: Listen timing attribute
* @P2P_ATTR_INTENDED_INTERFACE_ADDR: Intended interface address attribute
* @P2P_ATTR_MANAGEABILITY: Manageability attribute
* @P2P_ATTR_CHANNEL_LIST: Channel list attribute
* @P2P_ATTR_NOTICE_OF_ABSENCE: Notice of Absence attribute
* @P2P_ATTR_DEVICE_INFO: Device Info attribute
* @P2P_ATTR_GROUP_INFO: Group Info attribute
* @P2P_ATTR_GROUP_ID: Group ID attribute
* @P2P_ATTR_INTERFACE: Interface attribute
* @P2P_ATTR_OPERATING_CHANNEL: Operating channel attribute
* @P2P_ATTR_INVITATION_FLAGS: Invitation flags attribute
* @P2P_ATTR_OOB_GO_NEG_CHANNEL: GO neg channel attribute
* @P2P_ATTR_SERVICE_HASH: Service HASH attribute
* @P2P_ATTR_SESSION_INFORMATION_DATA: Session Info data attribute
* @P2P_ATTR_CONNECTION_CAPABILITY = Connection capability attribute
* @P2P_ATTR_ADVERTISEMENT_ID = Advertisement ID attribute
* @P2P_ATTR_ADVERTISED_SERVICE = Advertised Service attribute
* @P2P_ATTR_SESSION_ID = Session ID attribute
* @P2P_ATTR_FEATURE_CAPABILITY = Feature capability attribute
* @P2P_ATTR_PERSISTENT_GROUP -Persistent group attribute
* @P2P_ATTR_VENDOR_SPECIFIC - Vendor specific attribute
*/
enum p2p_attr_id {
P2P_ATTR_STATUS = 0,
P2P_ATTR_MINOR_REASON_CODE = 1,
P2P_ATTR_CAPABILITY = 2,
P2P_ATTR_DEVICE_ID = 3,
P2P_ATTR_GROUP_OWNER_INTENT = 4,
P2P_ATTR_CONFIGURATION_TIMEOUT = 5,
P2P_ATTR_LISTEN_CHANNEL = 6,
P2P_ATTR_GROUP_BSSID = 7,
P2P_ATTR_EXT_LISTEN_TIMING = 8,
P2P_ATTR_INTENDED_INTERFACE_ADDR = 9,
P2P_ATTR_MANAGEABILITY = 10,
P2P_ATTR_CHANNEL_LIST = 11,
P2P_ATTR_NOTICE_OF_ABSENCE = 12,
P2P_ATTR_DEVICE_INFO = 13,
P2P_ATTR_GROUP_INFO = 14,
P2P_ATTR_GROUP_ID = 15,
P2P_ATTR_INTERFACE = 16,
P2P_ATTR_OPERATING_CHANNEL = 17,
P2P_ATTR_INVITATION_FLAGS = 18,
P2P_ATTR_OOB_GO_NEG_CHANNEL = 19,
P2P_ATTR_SERVICE_HASH = 21,
P2P_ATTR_SESSION_INFORMATION_DATA = 22,
P2P_ATTR_CONNECTION_CAPABILITY = 23,
P2P_ATTR_ADVERTISEMENT_ID = 24,
P2P_ATTR_ADVERTISED_SERVICE = 25,
P2P_ATTR_SESSION_ID = 26,
P2P_ATTR_FEATURE_CAPABILITY = 27,
P2P_ATTR_PERSISTENT_GROUP = 28,
P2P_ATTR_VENDOR_SPECIFIC = 221
};
#endif /* __MAC_PROT_DEFS_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -340,6 +340,7 @@ typedef struct sLimMlmStaContext {
/* 802.11n HT Capability in Station: Enabled 1 or DIsabled 0 */
uint8_t htCapability:1;
uint8_t vhtCapability:1;
bool force_1x1;
} tLimMlmStaContext, *tpLimMlmStaContext;
/* Structure definition to hold deferred messages queue parameters */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -774,3 +774,90 @@ tSirRetStatus __lim_process_sme_no_a_update(tpAniSirGlobal pMac, uint32_t *pMsgB
return eSIR_SUCCESS;
} /*** end __limProcessSmeGoNegReq() ***/
bool lim_p2p_check_oui_and_force_1x1(tpAniSirGlobal mac_ctx,
uint8_t *assoc_ie, uint32_t assoc_ie_len)
{
const uint8_t *vendor_ie, *p2p_ie, *pos;
uint8_t rem_len, attr;
uint16_t attr_len;
if (!assoc_ie || !assoc_ie_len)
return false;
vendor_ie = (uint8_t *)limGetP2pIEPtr(mac_ctx, assoc_ie, assoc_ie_len);
if (!vendor_ie) {
pe_debug("P2P IE not found");
return false;
}
rem_len = vendor_ie[1];
if (rem_len < (2 + SIR_MAC_P2P_OUI_SIZE) ||
rem_len > SIR_MAC_MAX_IE_LENGTH) {
pe_err("Invalid IE len %d", rem_len);
return false;
}
p2p_ie = vendor_ie + HEADER_LEN_P2P_IE;
rem_len -= SIR_MAC_P2P_OUI_SIZE;
while (rem_len) {
attr = p2p_ie[0];
attr_len = LE_READ_2(&p2p_ie[1]);
if (attr_len > rem_len) {
pe_err("Invalid len %d for elem:%d", attr_len, attr);
return false;
}
switch (attr) {
case P2P_ATTR_CAPABILITY:
case P2P_ATTR_DEVICE_ID:
case P2P_ATTR_GROUP_OWNER_INTENT:
case P2P_ATTR_STATUS:
case P2P_ATTR_LISTEN_CHANNEL:
case P2P_ATTR_OPERATING_CHANNEL:
case P2P_ATTR_GROUP_INFO:
case P2P_ATTR_MANAGEABILITY:
case P2P_ATTR_CHANNEL_LIST:
break;
case P2P_ATTR_DEVICE_INFO:
if (attr_len < (QDF_MAC_ADDR_SIZE +
MAX_CONFIG_METHODS_LEN + 8 +
DEVICE_CATEGORY_MAX_LEN)) {
pe_err("Invalid Device info attr len %d",
attr_len);
return false;
}
/* move by attr id and 2 bytes of attr len */
pos = p2p_ie + 3;
/*
* the P2P Device info is of format:
* attr_id - 1 byte
* attr_len - 2 bytes
* device mac addr - 6 bytes
* config methods - 2 bytes
* primary device type - 8bytes
* -primary device type category - 1 byte
* -primary device type oui - 4bytes
* number of secondary device type - 2 bytes
*/
pos += ETH_ALEN + MAX_CONFIG_METHODS_LEN +
DEVICE_CATEGORY_MAX_LEN;
if (!qdf_mem_cmp(pos, P2P_1X1_WAR_OUI,
P2P_1X1_OUI_LEN))
return true;
break;
default:
pe_err("Invalid P2P attribute");
break;
}
p2p_ie += (3 + attr_len);
rem_len -= (3 + attr_len);
}
return false;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -1209,6 +1209,8 @@ static bool lim_chk_wmm(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
* @peer_idx: peer index
* @qos_mode: qos mode
* @pmf_connection: flag indicating pmf connection
* @force_1x1: Flag to check if the HT capable STA needs to be downgraded to 1x1
* nss.
*
* Updates ds dph entry
*
@ -1219,7 +1221,8 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
uint8_t sub_type, tpDphHashNode sta_ds,
tAniAuthType auth_type,
bool *assoc_req_copied, uint16_t peer_idx,
tHalBitVal qos_mode, bool pmf_connection)
tHalBitVal qos_mode, bool pmf_connection,
bool force_1x1)
{
tHalBitVal wme_mode, wsm_mode;
uint8_t *ht_cap_ie = NULL;
@ -1283,6 +1286,7 @@ static bool lim_update_sta_ds(tpAniSirGlobal mac_ctx, tpSirMacMgmtHdr hdr,
sta_ds->valid = 0;
sta_ds->mlmStaContext.authType = auth_type;
sta_ds->staType = STA_ENTRY_PEER;
sta_ds->mlmStaContext.force_1x1 = force_1x1;
/*
* TODO: If listen interval is more than certain limit, reject the
@ -1754,7 +1758,7 @@ void lim_process_assoc_req_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info,
tSirMacCapabilityInfo local_cap;
tpDphHashNode sta_ds = NULL;
tpSirAssocReq assoc_req;
bool dup_entry = false;
bool dup_entry = false, force_1x1 = false;
lim_get_phy_mode(mac_ctx, &phy_mode, session);
@ -1984,6 +1988,25 @@ void lim_process_assoc_req_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info,
(LIM_ASSOC == sub_type) ? "Assoc" : "ReAssoc",
MAC_ADDR_ARRAY(hdr->sa));
if (session->pePersona == QDF_P2P_GO_MODE) {
/*
* WAR: In P2P GO mode, if the P2P client device
* is only HT capable and not VHT capable, but the P2P
* GO device is VHT capable and advertises 2x2 NSS with
* HT capablity client device, which results in IOT
* issues.
* When GO is operating in DBS mode, GO beacons
* advertise 2x2 capability but include OMN IE to
* indicate current operating mode of 1x1. But here
* peer device is only HT capable and will not
* understand OMN IE.
*/
force_1x1 = lim_p2p_check_oui_and_force_1x1(
mac_ctx,
frm_body + LIM_ASSOC_REQ_IE_OFFSET,
frame_len - LIM_ASSOC_REQ_IE_OFFSET);
}
/*
* AID for this association will be same as the peer Index used in DPH
* table. Assign unused/least recently used peer Index from perStaDs.
@ -2027,7 +2050,7 @@ sendIndToSme:
if (false == lim_update_sta_ds(mac_ctx, hdr, session, assoc_req,
sub_type, sta_ds, auth_type,
&assoc_req_copied, peer_idx, qos_mode,
pmf_connection))
pmf_connection, force_1x1))
goto error;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -620,7 +620,8 @@ __lim_ext_scan_forward_bcn_probe_rsp(tpAniSirGlobal pmac, uint8_t *rx_pkt_info,
frame_len = sizeof(*bssdescr) + ie_len - sizeof(bssdescr->ieFields[1]);
bssdescr = (tSirBssDescription *) qdf_mem_malloc(frame_len);
if (NULL == bssdescr) {
if (!bssdescr) {
qdf_mem_free(result);
pe_err("qdf_mem_malloc(length=%d) failed", frame_len);
return;
}

View file

@ -203,8 +203,15 @@ lim_collect_bss_description(tpAniSirGlobal pMac,
/* HT capability */
if (pBPR->HTCaps.present) {
pBssDescr->ht_caps_present = 1;
if (pBPR->HTCaps.supportedChannelWidthSet)
pBssDescr->chan_width = eHT_CHANNEL_WIDTH_40MHZ;
if (pBPR->HTCaps.supportedChannelWidthSet) {
if (!pBPR->HTInfo.present) {
pBssDescr->chan_width =
eHT_CHANNEL_WIDTH_40MHZ;
} else if (pBPR->HTInfo.recommendedTxWidthSet) {
pBssDescr->chan_width =
eHT_CHANNEL_WIDTH_40MHZ;
}
}
}
/* VHT Parameters */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -1204,7 +1204,7 @@ lim_send_assoc_rsp_mgmt_frame(tpAniSirGlobal mac_ctx,
frm.HTCaps.shortGI40MHz = 0;
populate_dot11f_ht_info(mac_ctx, &frm.HTInfo,
pe_session);
pe_session);
}
pe_debug("SupportedChnlWidth: %d, mimoPS: %d, GF: %d, short GI20:%d, shortGI40: %d, dsssCck: %d, AMPDU Param: %x",
frm.HTCaps.supportedChannelWidthSet,
@ -1222,6 +1222,22 @@ lim_send_assoc_rsp_mgmt_frame(tpAniSirGlobal mac_ctx,
populate_dot11f_vht_operation(mac_ctx, pe_session,
&frm.VHTOperation);
is_vht = true;
} else if (sta->mlmStaContext.force_1x1 &&
frm.HTCaps.present) {
/*
* WAR: In P2P GO mode, if the P2P client device
* is only HT capable and not VHT capable, but the P2P
* GO device is VHT capable and advertises 2x2 NSS with
* HT capablity client device, which results in IOT
* issues.
* When GO is operating in DBS mode, GO beacons
* advertise 2x2 capability but include OMN IE to
* indicate current operating mode of 1x1. But here
* peer device is only HT capable and will not
* understand OMN IE.
*/
frm.HTInfo.basicMCSSet[1] = 0;
frm.HTCaps.supportedMCSSet[1] = 0;
}
if (pe_session->vhtCapability &&

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -1028,4 +1028,16 @@ void lim_process_assoc_failure_timeout(tpAniSirGlobal mac_ctx,
void lim_send_mgmt_frame_tx(tpAniSirGlobal mac_ctx,
uint32_t *msg_buf);
/**
* lim_p2p_check_oui_and_force_1x1() - Function to get P2P client device
* attributes from assoc request frame IE passed in.
* @mac_ctx: Pointer to mac_context
* @assoc_ie: Pointer to IE in association request
* @assoc_ie_len: Total association IE length
*
* Return: True if OUI is found. Else return false
*
*/
bool lim_p2p_check_oui_and_force_1x1(tpAniSirGlobal mac_ctx,
uint8_t *assoc_ie, uint32_t assoc_ie_len);
#endif /* __LIM_TYPES_H */

View file

@ -460,6 +460,11 @@ void lim_handle_heart_beat_failure_timeout(tpAniSirGlobal pMac);
cfg_get_vendor_ie_ptr_from_oui(pMac, SIR_MAC_P2P_OUI, \
SIR_MAC_P2P_OUI_SIZE, ie, ie_len)
#define LE_READ_2(p) \
((uint16_t)\
((((const uint8_t *)(p))[0]) |\
(((const uint8_t *)(p))[1] << 8)))
uint8_t lim_get_noa_attr_stream_in_mult_p2p_ies(tpAniSirGlobal pMac,
uint8_t *noaStream, uint8_t noaLen,
uint8_t overFlowLen);

View file

@ -6107,6 +6107,7 @@ QDF_STATUS sme_oem_data_req(tHalHandle hal, struct oem_data_req *hdd_oem_req)
oem_data_req->data_len = hdd_oem_req->data_len;
oem_data_req->data = qdf_mem_malloc(oem_data_req->data_len);
if (!oem_data_req->data) {
qdf_mem_free(oem_data_req);
sme_err("mem alloc failed");
return QDF_STATUS_E_NOMEM;
}
@ -12623,6 +12624,7 @@ QDF_STATUS sme_notify_ht2040_mode(tHalHandle hHal, uint16_t staId,
break;
default:
qdf_mem_free(pHtOpMode);
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Invalid OP mode", __func__);
return QDF_STATUS_E_FAILURE;
@ -12816,7 +12818,7 @@ QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
{
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
QDF_STATUS status;
cds_msg_t msg;
cds_msg_t msg = {0};
tSirRateUpdateInd *rate_upd = qdf_mem_malloc(sizeof(tSirRateUpdateInd));
if (rate_upd == NULL) {
@ -12835,26 +12837,27 @@ QDF_STATUS sme_send_rate_update_ind(tHalHandle hHal,
eHAL_TX_RATE_HT20 | eHAL_TX_RATE_SGI;
status = sme_acquire_global_lock(&pMac->sme);
if (QDF_STATUS_SUCCESS == status) {
msg.type = WMA_RATE_UPDATE_IND;
msg.bodyptr = rate_upd;
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
NO_SESSION, msg.type));
if (!QDF_IS_STATUS_SUCCESS
(cds_mq_post_message(QDF_MODULE_ID_WMA, &msg))) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Not able to post WMA_SET_RMC_RATE_IND to WMA!",
__func__);
sme_release_global_lock(&pMac->sme);
qdf_mem_free(rate_upd);
return QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&pMac->sme);
return QDF_STATUS_SUCCESS;
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(rate_upd);
return status;
}
msg.type = WMA_RATE_UPDATE_IND;
msg.bodyptr = rate_upd;
MTRACE(qdf_trace(QDF_MODULE_ID_SME, TRACE_CODE_SME_TX_WMA_MSG,
NO_SESSION, msg.type));
status = cds_mq_post_message(QDF_MODULE_ID_WMA, &msg);
if (QDF_IS_STATUS_ERROR(status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Not able to post WMA_SET_RMC_RATE_IND to WMA!",
__func__);
qdf_mem_free(rate_upd);
status = QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&pMac->sme);
return status;
}
@ -13027,8 +13030,9 @@ QDF_STATUS sme_update_sta_inactivity_timeout(tHalHandle hal_handle,
inactivity_time->sta_inactivity_timeout =
sta_inactivity_timer->sta_inactivity_timeout;
wma_update_sta_inactivity_timeout(wma_handle,
inactivity_time);
wma_update_sta_inactivity_timeout(wma_handle, inactivity_time);
qdf_mem_free(inactivity_time);
return QDF_STATUS_SUCCESS;
}
@ -13249,10 +13253,14 @@ QDF_STATUS sme_set_miracast(tHalHandle hal, uint8_t filter_type)
uint32_t *val;
tpAniSirGlobal mac_ptr = PMAC_STRUCT(hal);
if (!mac_ptr) {
sme_err("Invalid pointer");
return QDF_STATUS_E_NOMEM;
}
val = qdf_mem_malloc(sizeof(*val));
if (NULL == val || NULL == mac_ptr) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: Invalid pointer", __func__);
if (!val) {
sme_err("Mem allocation failed");
return QDF_STATUS_E_NOMEM;
}
@ -13583,9 +13591,8 @@ QDF_STATUS sme_set_thermal_level(tHalHandle hal, uint8_t level)
*/
QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
cds_msg_t cds_message;
QDF_STATUS status;
cds_msg_t cds_message = {0};
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
tSirTxPowerLimit *tx_power_limit;
@ -13600,21 +13607,25 @@ QDF_STATUS sme_txpower_limit(tHalHandle hHal, tSirTxPowerLimit *psmetx)
*tx_power_limit = *psmetx;
status = sme_acquire_global_lock(&pMac->sme);
if (QDF_IS_STATUS_SUCCESS(status)) {
cds_message.type = WMA_TX_POWER_LIMIT;
cds_message.reserved = 0;
cds_message.bodyptr = tx_power_limit;
qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: not able to post WMA_TX_POWER_LIMIT",
__func__);
status = QDF_STATUS_E_FAILURE;
qdf_mem_free(tx_power_limit);
}
sme_release_global_lock(&pMac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(tx_power_limit);
return status;
}
cds_message.type = WMA_TX_POWER_LIMIT;
cds_message.bodyptr = tx_power_limit;
status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (QDF_IS_STATUS_ERROR(status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
"%s: not able to post WMA_TX_POWER_LIMIT",
__func__);
status = QDF_STATUS_E_FAILURE;
qdf_mem_free(tx_power_limit);
}
sme_release_global_lock(&pMac->sme);
return status;
}
@ -13657,17 +13668,21 @@ QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId,
pSapDisableIntraFwd->disableintrabssfwd = disablefwd;
status = sme_acquire_global_lock(&pMac->sme);
if (QDF_IS_STATUS_SUCCESS(status)) {
/* serialize the req through MC thread */
cds_message.bodyptr = pSapDisableIntraFwd;
cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
status = QDF_STATUS_E_FAILURE;
qdf_mem_free(pSapDisableIntraFwd);
}
sme_release_global_lock(&pMac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(pSapDisableIntraFwd);
return QDF_STATUS_E_FAILURE;
}
/* serialize the req through MC thread */
cds_message.bodyptr = pSapDisableIntraFwd;
cds_message.type = WMA_SET_SAP_INTRABSS_DIS;
qdf_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (QDF_IS_STATUS_ERROR(status)) {
status = QDF_STATUS_E_FAILURE;
qdf_mem_free(pSapDisableIntraFwd);
}
sme_release_global_lock(&pMac->sme);
return status;
}
@ -14313,12 +14328,17 @@ QDF_STATUS sme_set_wisa_params(tHalHandle hal,
*cds_msg_wisa_params = *wisa_params;
status = sme_acquire_global_lock(&mac->sme);
if (QDF_IS_STATUS_SUCCESS(status)) {
cds_message.bodyptr = cds_msg_wisa_params;
cds_message.type = WMA_SET_WISA_PARAMS;
status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
sme_release_global_lock(&mac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(cds_msg_wisa_params);
return QDF_STATUS_E_FAILURE;
}
cds_message.bodyptr = cds_msg_wisa_params;
cds_message.type = WMA_SET_WISA_PARAMS;
status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (QDF_IS_STATUS_ERROR(status))
qdf_mem_free(cds_msg_wisa_params);
sme_release_global_lock(&mac->sme);
return status;
}
@ -18689,19 +18709,24 @@ QDF_STATUS sme_get_chain_rssi(tHalHandle phal,
*req_msg = *input;
status = sme_acquire_global_lock(&pmac->sme);
if (QDF_STATUS_SUCCESS == status) {
/* serialize the req through MC thread */
cds_message.bodyptr = req_msg;
cds_message.type = SIR_HAL_GET_CHAIN_RSSI_REQ;
cds_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (!QDF_IS_STATUS_SUCCESS(cds_status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
FL("Post Get Chain Rssi msg fail"));
status = QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&pmac->sme);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(req_msg);
return QDF_STATUS_E_FAILURE;
}
/* serialize the req through MC thread */
cds_message.bodyptr = req_msg;
cds_message.type = SIR_HAL_GET_CHAIN_RSSI_REQ;
cds_status = cds_mq_post_message(QDF_MODULE_ID_WMA, &cds_message);
if (QDF_IS_STATUS_ERROR(status)) {
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
FL("Post Get Chain Rssi msg fail"));
qdf_mem_free(req_msg);
status = QDF_STATUS_E_FAILURE;
}
sme_release_global_lock(&pmac->sme);
return status;
}

View file

@ -810,7 +810,7 @@ static void csr_roam_sort_channel_for_early_stop(tpAniSirGlobal mac_ctx,
if (!chan_list_greedy || !chan_list_non_greedy) {
QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
"Failed to allocate memory for tSirUpdateChanList");
return;
goto scan_list_sort_error;
}
/*
* fixed_greedy_chan_list is an evaluated channel list based on most of
@ -7207,7 +7207,6 @@ static void csr_roam_process_start_bss_success(tpAniSirGlobal mac_ctx,
tSirBssDescription *bss_desc = NULL;
tCsrRoamInfo roam_info;
tSirSmeStartBssRsp *start_bss_rsp = NULL;
struct tag_csrscan_result *scan_res = NULL;
eRoamCmdStatus roam_status;
eCsrRoamResult roam_result;
tDot11fBeaconIEs *ies_ptr = NULL;
@ -7274,10 +7273,8 @@ static void csr_roam_process_start_bss_success(tpAniSirGlobal mac_ctx,
}
}
if (!CSR_IS_INFRA_AP(profile) && !CSR_IS_NDI(profile)) {
scan_res =
csr_scan_append_bss_description(mac_ctx,
bss_desc, ies_ptr,
session_id);
csr_scan_append_bss_description(mac_ctx, bss_desc, ies_ptr,
session_id);
}
csr_roam_save_connected_bss_desc(mac_ctx, session_id, bss_desc);
csr_roam_free_connect_profile(&session->connectedProfile);

View file

@ -3889,11 +3889,9 @@ static struct tag_csrscan_result *csr_scan_save_bss_description(tpAniSirGlobal
}
/* Append a Bss Description... */
struct tag_csrscan_result *csr_scan_append_bss_description(tpAniSirGlobal pMac,
tSirBssDescription *
pSirBssDescription,
tDot11fBeaconIEs *pIes,
uint8_t sessionId)
bool csr_scan_append_bss_description(tpAniSirGlobal pMac,
tSirBssDescription *pSirBssDescription,
tDot11fBeaconIEs *pIes, uint8_t sessionId)
{
struct tag_csrscan_result *pCsrBssDescription = NULL;
tAniSSID tmpSsid;
@ -3901,12 +3899,15 @@ struct tag_csrscan_result *csr_scan_append_bss_description(tpAniSirGlobal pMac,
int result;
tmpSsid.length = 0;
result = csr_remove_dup_bss_description(pMac, pSirBssDescription,
&tmpSsid, &timer);
pCsrBssDescription = csr_scan_save_bss_description(pMac,
pSirBssDescription, pIes, sessionId);
if (result && (pCsrBssDescription != NULL)) {
if (!pCsrBssDescription)
return false;
result = csr_remove_dup_bss_description(pMac, pSirBssDescription,
&tmpSsid, &timer);
if (result) {
/*
* Check if the new one has SSID it it, if not, use the older
* SSID if it exists.
@ -3930,8 +3931,8 @@ struct tag_csrscan_result *csr_scan_append_bss_description(tpAniSirGlobal pMac,
}
}
}
return pCsrBssDescription;
csr_free_scan_result_entry(pMac, pCsrBssDescription);
return true;
}
static void csr_purge_channel_power(tpAniSirGlobal pMac, tDblLinkList
@ -7149,7 +7150,7 @@ QDF_STATUS csr_scan_for_ssid(tpAniSirGlobal mac_ctx, uint32_t session_id,
tpCsrNeighborRoamControlInfo neighbor_roaminfo =
&mac_ctx->roam.neighborRoamInfo[session_id];
tCsrSSIDs *ssids = NULL;
struct csr_scan_for_ssid_context *context;
struct csr_scan_for_ssid_context *context = NULL;
if (!(mac_ctx->scan.fScanEnable) && (num_ssid != 1)) {
sme_err(
@ -7322,6 +7323,7 @@ error:
csr_roam_call_callback(mac_ctx, session_id, NULL,
roam_id, eCSR_ROAM_FAILED,
eCSR_ROAM_RESULT_FAILURE);
qdf_mem_free(context);
}
return status;
}
@ -8152,7 +8154,7 @@ QDF_STATUS csr_scan_create_entry_in_scan_cache(tpAniSirGlobal pMac,
qdf_mem_copy(pNewBssDescriptor->bssId, bssid.bytes,
sizeof(tSirMacAddr));
pNewBssDescriptor->channelId = channel;
if (NULL == csr_scan_append_bss_description(pMac, pNewBssDescriptor,
if (!csr_scan_append_bss_description(pMac, pNewBssDescriptor,
pNewIes, sessionId)) {
sme_err("csr_scan_append_bss_description failed");
status = QDF_STATUS_E_FAILURE;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -327,11 +327,10 @@ QDF_STATUS csr_scan_handle_failed_lostlink2(tpAniSirGlobal pMac,
uint32_t sessionId);
QDF_STATUS csr_scan_handle_failed_lostlink3(tpAniSirGlobal pMac,
uint32_t sessionId);
struct tag_csrscan_result *csr_scan_append_bss_description(tpAniSirGlobal pMac,
tSirBssDescription *
pSirBssDescription,
tDot11fBeaconIEs *pIes,
uint8_t sessionId);
bool csr_scan_append_bss_description(tpAniSirGlobal pMac,
tSirBssDescription *pSirBssDescription,
tDot11fBeaconIEs *pIes,
uint8_t sessionId);
void csr_scan_call_callback(tpAniSirGlobal pMac, tSmeCmd *pCommand,
eCsrScanStatus scanStatus);
QDF_STATUS csr_scan_copy_request(tpAniSirGlobal pMac, tCsrScanRequest *pDstReq,

View file

@ -397,6 +397,8 @@ csr_neighbor_roam_prepare_scan_profile_filter(tpAniSirGlobal pMac,
pScanFilter->SSIDs.numOfSSIDs);
if (NULL == pScanFilter->SSIDs.SSIDList) {
sme_err("Scan Filter SSID mem alloc failed");
qdf_mem_free(pScanFilter->BSSIDs.bssid);
pScanFilter->BSSIDs.bssid = NULL;
return QDF_STATUS_E_NOMEM;
}
for (i = 0; i < roam_params->num_ssid_allowed_list; i++) {
@ -416,6 +418,8 @@ csr_neighbor_roam_prepare_scan_profile_filter(tpAniSirGlobal pMac,
qdf_mem_malloc(sizeof(tCsrSSIDInfo));
if (NULL == pScanFilter->SSIDs.SSIDList) {
sme_err("Scan Filter SSID mem alloc failed");
qdf_mem_free(pScanFilter->BSSIDs.bssid);
pScanFilter->BSSIDs.bssid = NULL;
return QDF_STATUS_E_NOMEM;
}
pScanFilter->SSIDs.SSIDList->handoffPermitted = 1;
@ -456,6 +460,8 @@ csr_neighbor_roam_prepare_scan_profile_filter(tpAniSirGlobal pMac,
qdf_mem_malloc(num_ch * sizeof(uint8_t));
if (NULL == pScanFilter->ChannelInfo.ChannelList) {
sme_err("Scan Filter Ch list mem alloc failed");
qdf_mem_free(pScanFilter->BSSIDs.bssid);
pScanFilter->BSSIDs.bssid = NULL;
qdf_mem_free(pScanFilter->SSIDs.SSIDList);
pScanFilter->SSIDs.SSIDList = NULL;
return QDF_STATUS_E_NOMEM;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -575,6 +575,7 @@ QDF_STATUS csr_roam_issue_ft_preauth_req(tHalHandle hal, uint32_t session_id,
+ bss_desc->length);
if (NULL == preauth_req->pbssDescription) {
sme_err("Memory allocation for FT Preauth request failed");
qdf_mem_free(preauth_req);
return QDF_STATUS_E_NOMEM;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -739,6 +739,8 @@ wma_ds_peek_rx_packet_info
void wma_tx_abort(uint8_t vdev_id);
bool wma_is_rmf_mgmt_action_frame(uint8_t action_category);
QDF_STATUS wma_tx_packet(void *pWMA,
void *pFrmBuf,
uint16_t frmLen,

View file

@ -2579,7 +2579,7 @@ static void wma_update_tx_send_params(struct tx_send_params *tx_param,
*
* Return: true - if category is robust mgmt type
*/
static bool wma_is_rmf_mgmt_action_frame(uint8_t action_category)
bool wma_is_rmf_mgmt_action_frame(uint8_t action_category)
{
switch (action_category) {
case SIR_MAC_ACTION_SPECTRUM_MGMT:

View file

@ -5056,6 +5056,7 @@ static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta)
if (wma_is_roam_synch_in_progress(wma, del_sta->smesessionId)) {
WMA_LOGE("%s: roaming in progress, reject del sta!", __func__);
del_sta->status = QDF_STATUS_E_PERM;
qdf_mem_free(peerStateParams);
goto send_del_rsp;
}

View file

@ -7805,15 +7805,6 @@ QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
return QDF_STATUS_E_INVAL;
}
params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
if (!params_ptr) {
WMA_LOGE(
"%s: unable to allocate memory for periodic_tx_pattern",
__func__);
return QDF_STATUS_E_NOMEM;
}
if (!wma_find_vdev_by_addr(wma_handle,
pAddPeriodicTxPtrnParams->mac_address.bytes,
&vdev_id)) {
@ -7822,6 +7813,14 @@ QDF_STATUS wma_process_add_periodic_tx_ptrn_ind(WMA_HANDLE handle,
return QDF_STATUS_E_INVAL;
}
params_ptr = qdf_mem_malloc(sizeof(*params_ptr));
if (!params_ptr) {
WMA_LOGE(
"%s: unable to allocate memory for periodic_tx_pattern",
__func__);
return QDF_STATUS_E_NOMEM;
}
params_ptr->ucPtrnId = pAddPeriodicTxPtrnParams->ucPtrnId;
params_ptr->ucPtrnSize = pAddPeriodicTxPtrnParams->ucPtrnSize;
params_ptr->usPtrnIntervalMs =

View file

@ -1328,7 +1328,9 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma,
if (cmd->peer_nss > WMA_MAX_NSS)
cmd->peer_nss = WMA_MAX_NSS;
intr->nss = cmd->peer_nss;
if (!wma_is_vdev_in_ap_mode(wma, params->smesessionId))
intr->nss = cmd->peer_nss;
cmd->peer_phymode = phymode;
WMA_LOGI("%s: vdev_id %d associd %d peer_flags %x nss %d phymode %d ht_caps %x",
__func__, cmd->vdev_id, cmd->peer_associd, cmd->peer_flags,
@ -2792,6 +2794,21 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
ol_txrx_mon_callback_fp data_rx = NULL;
struct mon_rx_status txrx_status = {0};
uint16_t channel_flags = 0;
tpSirMacFrameCtl pFc = (tpSirMacFrameCtl) (qdf_nbuf_data(nbuf));
struct ieee80211_frame *wh;
uint8_t action_category = 0;
bool deauth_disassoc = false;
uint8_t mgt_type;
tp_wma_handle wma_handle;
struct wma_txrx_node *iface = NULL;
uint8_t vdev_id = WMA_INVALID_VDEV_ID;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (!wma_handle) {
WMA_LOGE(FL("Failed to get WMA handle"));
return false;
}
pdev_ctx = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev_ctx) {
@ -2803,6 +2820,56 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
if (!data_rx)
return false;
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
mgt_type = (wh)->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
if (mgt_type == IEEE80211_FC0_TYPE_MGT &&
(pFc->subType == SIR_MAC_MGMT_DISASSOC ||
pFc->subType == SIR_MAC_MGMT_DEAUTH ||
pFc->subType == SIR_MAC_MGMT_ACTION)) {
uint8_t *orig_hdr;
uint8_t mic_len, hdr_len;
if (pFc->subType == SIR_MAC_MGMT_ACTION)
action_category =
*((uint8_t *)(qdf_nbuf_data(nbuf)) +
sizeof(struct ieee80211_frame));
else
deauth_disassoc = true;
if (wma_find_vdev_by_bssid(wma_handle, wh->i_addr3, &vdev_id))
iface = &wma_handle->interfaces[vdev_id];
if (iface && iface->rmfEnabled &&
!IEEE80211_IS_BROADCAST(wh->i_addr1) &&
!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
if (pFc->wep) {
orig_hdr = (uint8_t *)qdf_nbuf_data(nbuf);
if (iface->ucast_key_cipher ==
WMI_CIPHER_AES_GCM) {
hdr_len = WLAN_IEEE80211_GCMP_HEADERLEN;
mic_len = WLAN_IEEE80211_GCMP_MICLEN;
} else {
hdr_len = IEEE80211_CCMP_HEADERLEN;
mic_len = IEEE80211_CCMP_MICLEN;
}
/* Strip privacy headers (and trailer)
* for a received frame
*/
qdf_mem_move(orig_hdr +
hdr_len, wh,
sizeof(*wh));
qdf_nbuf_pull_head(nbuf,
hdr_len);
qdf_nbuf_trim_tail(nbuf, mic_len);
}
} else if (iface && iface->rmfEnabled && (deauth_disassoc ||
wma_is_rmf_mgmt_action_frame(action_category))) {
qdf_nbuf_trim_tail(nbuf, IEEE80211_MMIE_LEN);
}
}
txrx_status.tsft = (u_int64_t)hdr->tsf_l32;
txrx_status.chan_num = cds_freq_to_chan(hdr->chan_freq);
txrx_status.chan_freq = hdr->chan_freq;
@ -2827,6 +2894,9 @@ wma_process_mon_mgmt_tx_data(wmi_mgmt_hdr *hdr,
txrx_status.chan_flags = channel_flags;
txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02);
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
return ol_txrx_mon_mgmt_process(&txrx_status, nbuf, status);
}
@ -3652,6 +3722,7 @@ wma_process_mon_mgmt_rx_data(wmi_mgmt_rx_hdr *hdr,
ol_txrx_mon_callback_fp data_rx = NULL;
struct mon_rx_status txrx_status = {0};
uint16_t channel_flags = 0;
struct ieee80211_frame *wh;
pdev_ctx = cds_get_context(QDF_MODULE_ID_TXRX);
if (!pdev_ctx) {
@ -3681,6 +3752,9 @@ wma_process_mon_mgmt_rx_data(wmi_mgmt_rx_hdr *hdr,
txrx_status.chan_flags = channel_flags;
txrx_status.rate = ((txrx_status.rate == 6 /* Mbps */) ? 0x0c : 0x02);
wh = (struct ieee80211_frame *)qdf_nbuf_data(nbuf);
wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
return ol_txrx_mon_mgmt_process(&txrx_status, nbuf, 0);
}
@ -4165,14 +4239,17 @@ static int wma_mgmt_rx_process(void *handle, uint8_t *data,
(ol_cfg_pktcapture_mode(pdev->ctrl_pdev) &
PKT_CAPTURE_MODE_MGMT_ONLY)) {
if (pdev->mon_cb) {
int buf_len;
buf_len = qdf_nbuf_len(wbuf);
nbuf = qdf_nbuf_alloc(NULL, roundup(
hdr->buf_len + RESERVE_BYTES, 4),
buf_len + RESERVE_BYTES, 4),
RESERVE_BYTES, 4, false);
if (nbuf) {
qdf_nbuf_put_tail(nbuf, hdr->buf_len);
qdf_nbuf_put_tail(nbuf, buf_len);
qdf_mem_copy(qdf_nbuf_data(nbuf),
qdf_nbuf_data(wbuf),
hdr->buf_len);
buf_len);
if (!wma_process_mon_mgmt_rx_data(hdr, nbuf))
qdf_nbuf_free(nbuf);
}

View file

@ -2927,14 +2927,29 @@ static void wma_roam_update_vdev(tp_wma_handle wma,
vdev_id = roam_synch_ind_ptr->roamedVdevId;
wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss;
del_bss_params = qdf_mem_malloc(sizeof(*del_bss_params));
if (!del_bss_params)
return;
del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params));
set_link_params = qdf_mem_malloc(sizeof(*set_link_params));
add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
if (!del_bss_params || !del_sta_params ||
!set_link_params || !add_sta_params) {
WMA_LOGE("%s: failed to allocate memory", __func__);
if (!del_sta_params) {
qdf_mem_free(del_bss_params);
return;
}
set_link_params = qdf_mem_malloc(sizeof(*set_link_params));
if (!set_link_params) {
qdf_mem_free(del_bss_params);
qdf_mem_free(del_sta_params);
return;
}
add_sta_params = qdf_mem_malloc(sizeof(*add_sta_params));
if (!add_sta_params) {
qdf_mem_free(del_bss_params);
qdf_mem_free(del_sta_params);
qdf_mem_free(set_link_params);
return;
}
qdf_mem_zero(del_bss_params, sizeof(*del_bss_params));
qdf_mem_zero(del_sta_params, sizeof(*del_sta_params));
qdf_mem_zero(set_link_params, sizeof(*set_link_params));
@ -4784,6 +4799,7 @@ int wma_extscan_operations_event_handler(void *handle,
WMA_LOGE("FW mesg num_buk %d more than TLV hdr %d",
oprn_event->num_buckets,
param_buf->num_bucket_id);
qdf_mem_free(oprn_ind);
return -EINVAL;
}

View file

@ -3658,8 +3658,7 @@ QDF_STATUS wma_send_link_speed(uint32_t link_speed)
{
QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
tpAniSirGlobal mac_ctx;
tSirLinkSpeedInfo *ls_ind =
(tSirLinkSpeedInfo *) qdf_mem_malloc(sizeof(tSirLinkSpeedInfo));
tSirLinkSpeedInfo *ls_ind;
mac_ctx = cds_get_context(QDF_MODULE_ID_PE);
if (!mac_ctx) {
@ -3667,19 +3666,21 @@ QDF_STATUS wma_send_link_speed(uint32_t link_speed)
return QDF_STATUS_E_INVAL;
}
ls_ind = (tSirLinkSpeedInfo *)qdf_mem_malloc(sizeof(tSirLinkSpeedInfo));
if (!ls_ind) {
WMA_LOGE("%s: Memory allocation failed.", __func__);
qdf_status = QDF_STATUS_E_NOMEM;
} else {
ls_ind->estLinkSpeed = link_speed;
if (mac_ctx->sme.pLinkSpeedIndCb)
mac_ctx->sme.pLinkSpeedIndCb(ls_ind,
mac_ctx->sme.pLinkSpeedCbContext);
else
WMA_LOGD("%s: pLinkSpeedIndCb is null", __func__);
qdf_mem_free(ls_ind);
return QDF_STATUS_E_NOMEM;
}
ls_ind->estLinkSpeed = link_speed;
if (mac_ctx->sme.pLinkSpeedIndCb)
mac_ctx->sme.pLinkSpeedIndCb(ls_ind,
mac_ctx->sme.pLinkSpeedCbContext);
else
WMA_LOGD("%s: pLinkSpeedIndCb is null", __func__);
qdf_mem_free(ls_ind);
return qdf_status;
}