From 2b6f6773577ccd2d84dc2665b5ce92c640837597 Mon Sep 17 00:00:00 2001 From: codeworkx Date: Sat, 20 Jul 2019 07:14:53 +0200 Subject: [PATCH] Update wifi stack from LA.UM.7.4.r1-05400-8x98.0 Change-Id: I7e46d6e7c3c73ead5c66d10ee2955c8a8f3f5292 --- drivers/staging/fw-api/fw/htc.h | 5 + drivers/staging/fw-api/fw/htt_ppdu_stats.h | 30 ++-- drivers/staging/fw-api/fw/htt_stats.h | 20 +++ drivers/staging/fw-api/fw/wmi_tlv_defs.h | 19 ++- drivers/staging/fw-api/fw/wmi_unified.h | 141 +++++++++++----- drivers/staging/fw-api/fw/wmi_version.h | 2 +- .../qcacld-3.0/core/cds/inc/cds_concurrency.h | 18 ++ .../qcacld-3.0/core/cds/inc/cds_sched.h | 1 + .../qcacld-3.0/core/cds/src/cds_concurrency.c | 88 +++++++++- .../staging/qcacld-3.0/core/dp/txrx/ol_txrx.c | 1 + .../qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h | 10 +- .../qcacld-3.0/core/hdd/src/wlan_hdd_apf.c | 12 +- .../qcacld-3.0/core/hdd/src/wlan_hdd_ioctl.c | 31 ++-- .../qcacld-3.0/core/hdd/src/wlan_hdd_main.c | 6 +- .../qcacld-3.0/core/hdd/src/wlan_hdd_nan.c | 18 +- .../qcacld-3.0/core/hdd/src/wlan_hdd_wext.c | 6 +- .../qcacld-3.0/core/mac/inc/qwlan_version.h | 4 +- .../core/mac/inc/sir_mac_prot_def.h | 72 +++++++- .../core/mac/src/pe/include/lim_global.h | 3 +- .../qcacld-3.0/core/mac/src/pe/lim/lim_p2p.c | 89 +++++++++- .../src/pe/lim/lim_process_assoc_req_frame.c | 31 +++- .../src/pe/lim/lim_process_message_queue.c | 5 +- .../mac/src/pe/lim/lim_scan_result_utils.c | 11 +- .../src/pe/lim/lim_send_management_frames.c | 20 ++- .../core/mac/src/pe/lim/lim_types.h | 14 +- .../core/mac/src/pe/lim/lim_utils.h | 5 + .../qcacld-3.0/core/sme/src/common/sme_api.c | 159 ++++++++++-------- .../core/sme/src/csr/csr_api_roam.c | 9 +- .../core/sme/src/csr/csr_api_scan.c | 26 +-- .../core/sme/src/csr/csr_inside_api.h | 11 +- .../core/sme/src/csr/csr_neighbor_roam.c | 6 + .../core/sme/src/csr/csr_roam_preauth.c | 3 +- .../qcacld-3.0/core/wma/inc/wma_types.h | 4 +- .../qcacld-3.0/core/wma/src/wma_data.c | 2 +- .../qcacld-3.0/core/wma/src/wma_dev_if.c | 1 + .../qcacld-3.0/core/wma/src/wma_features.c | 17 +- .../qcacld-3.0/core/wma/src/wma_mgmt.c | 85 +++++++++- .../qcacld-3.0/core/wma/src/wma_scan_roam.c | 26 ++- .../qcacld-3.0/core/wma/src/wma_utils.c | 23 +-- 39 files changed, 801 insertions(+), 233 deletions(-) diff --git a/drivers/staging/fw-api/fw/htc.h b/drivers/staging/fw-api/fw/htc.h index 92b3b680837a..348c719a7231 100644 --- a/drivers/staging/fw-api/fw/htc.h +++ b/drivers/staging/fw-api/fw/htc.h @@ -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 */ diff --git a/drivers/staging/fw-api/fw/htt_ppdu_stats.h b/drivers/staging/fw-api/fw/htt_ppdu_stats.h index a3594eec8652..7181561e5c2b 100644 --- a/drivers/staging/fw-api/fw/htt_ppdu_stats.h +++ b/drivers/staging/fw-api/fw/htt_ppdu_stats.h @@ -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; }; }; diff --git a/drivers/staging/fw-api/fw/htt_stats.h b/drivers/staging/fw-api/fw/htt_stats.h index c764ee5c8725..66075b8e7b85 100644 --- a/drivers/staging/fw-api/fw/htt_stats.h +++ b/drivers/staging/fw-api/fw/htt_stats.h @@ -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 diff --git a/drivers/staging/fw-api/fw/wmi_tlv_defs.h b/drivers/staging/fw-api/fw/wmi_tlv_defs.h index c2ede2040022..bf02afa71e12 100755 --- a/drivers/staging/fw-api/fw/wmi_tlv_defs.h +++ b/drivers/staging/fw-api/fw/wmi_tlv_defs.h @@ -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 */ diff --git a/drivers/staging/fw-api/fw/wmi_unified.h b/drivers/staging/fw-api/fw/wmi_unified.h index 0b69dd9c7757..07958740e544 100755 --- a/drivers/staging/fw-api/fw/wmi_unified.h +++ b/drivers/staging/fw-api/fw/wmi_unified.h @@ -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. diff --git a/drivers/staging/fw-api/fw/wmi_version.h b/drivers/staging/fw-api/fw/wmi_version.h index 14dce9c23f1d..4829b69bc694 100755 --- a/drivers/staging/fw-api/fw/wmi_version.h +++ b/drivers/staging/fw-api/fw/wmi_version.h @@ -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 diff --git a/drivers/staging/qcacld-3.0/core/cds/inc/cds_concurrency.h b/drivers/staging/qcacld-3.0/core/cds/inc/cds_concurrency.h index 87e5deee66bf..00b725b3fc70 100644 --- a/drivers/staging/qcacld-3.0/core/cds/inc/cds_concurrency.h +++ b/drivers/staging/qcacld-3.0/core/cds/inc/cds_concurrency.h @@ -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 diff --git a/drivers/staging/qcacld-3.0/core/cds/inc/cds_sched.h b/drivers/staging/qcacld-3.0/core/cds/inc/cds_sched.h index 24e3b624115f..835b5a04c082 100644 --- a/drivers/staging/qcacld-3.0/core/cds/inc/cds_sched.h +++ b/drivers/staging/qcacld-3.0/core/cds/inc/cds_sched.h @@ -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); diff --git a/drivers/staging/qcacld-3.0/core/cds/src/cds_concurrency.c b/drivers/staging/qcacld-3.0/core/cds/src/cds_concurrency.c index bbf7be5293c1..7d2420158ef0 100644 --- a/drivers/staging/qcacld-3.0/core/cds/src/cds_concurrency.c +++ b/drivers/staging/qcacld-3.0/core/cds/src/cds_concurrency.c @@ -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 diff --git a/drivers/staging/qcacld-3.0/core/dp/txrx/ol_txrx.c b/drivers/staging/qcacld-3.0/core/dp/txrx/ol_txrx.c index 53c9e12d0284..c2e099496da5 100644 --- a/drivers/staging/qcacld-3.0/core/dp/txrx/ol_txrx.c +++ b/drivers/staging/qcacld-3.0/core/dp/txrx/ol_txrx.c @@ -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 diff --git a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h index 49bfcedce5a0..edcd032402da 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h +++ b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h @@ -11368,8 +11368,8 @@ enum restart_beaconing_on_ch_avoid_rule { * * 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 { * */ #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" /* * diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_apf.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_apf.c index c2db21fa7b89..cefec834d167 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_apf.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_apf.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_ioctl.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_ioctl.c index 9e89e85a3aef..d4e019f5bb0d 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_ioctl.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_ioctl.c @@ -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); diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c index 8f472765401c..181b5f17799a 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c @@ -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(); diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_nan.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_nan.c index d3b99b579491..97d22aaee17f 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_nan.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_nan.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c index 2bbde1b7ca0f..0289f38ee015 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h b/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h index cc2a2e910913..98a535d9e7a7 100644 --- a/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h +++ b/drivers/staging/qcacld-3.0/core/mac/inc/qwlan_version.h @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/mac/inc/sir_mac_prot_def.h b/drivers/staging/qcacld-3.0/core/mac/inc/sir_mac_prot_def.h index 2ff3a26e87f8..07042919d9cd 100644 --- a/drivers/staging/qcacld-3.0/core/mac/inc/sir_mac_prot_def.h +++ b/drivers/staging/qcacld-3.0/core/mac/inc/sir_mac_prot_def.h @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/include/lim_global.h b/drivers/staging/qcacld-3.0/core/mac/src/pe/include/lim_global.h index 4bd7bdde5f5d..f455308936d4 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/include/lim_global.h +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/include/lim_global.h @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_p2p.c b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_p2p.c index 59a18feac556..1cb32030d462 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_p2p.c +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_p2p.c @@ -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; +} diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_assoc_req_frame.c index 003fd59983be..75952720f3b9 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_assoc_req_frame.c +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_assoc_req_frame.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_message_queue.c b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_message_queue.c index 09aba231e74e..c6c3e8b3bd88 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_process_message_queue.c @@ -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; } diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_scan_result_utils.c b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_scan_result_utils.c index d17eacea4cf1..e1dd42c3e83a 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_scan_result_utils.c +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_scan_result_utils.c @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_send_management_frames.c b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_send_management_frames.c index 392dc1d9dddf..2ff0358a1866 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_send_management_frames.c @@ -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 && diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_types.h b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_types.h index 688a10d5613f..8caf092c4af5 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_types.h +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_types.h @@ -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 */ diff --git a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_utils.h b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_utils.h index 46894381acd7..de9f49959c74 100644 --- a/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_utils.h +++ b/drivers/staging/qcacld-3.0/core/mac/src/pe/lim/lim_utils.h @@ -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); diff --git a/drivers/staging/qcacld-3.0/core/sme/src/common/sme_api.c b/drivers/staging/qcacld-3.0/core/sme/src/common/sme_api.c index 0757c8f5d6e9..f66c11a245b0 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/common/sme_api.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/common/sme_api.c @@ -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; } diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_roam.c b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_roam.c index ec312f0e09cf..db599bea7516 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_roam.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_roam.c @@ -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); diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_scan.c b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_scan.c index 7aa68046e552..04b6ba509142 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_scan.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_api_scan.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_inside_api.h b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_inside_api.h index aadf6ea5f2b9..6eb54de3cbe3 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_inside_api.h +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_inside_api.h @@ -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, diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c index 274c8c3f5494..5449d5d98115 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_neighbor_roam.c @@ -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; diff --git a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_roam_preauth.c b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_roam_preauth.c index 902ab2c3c6a1..e867e0426aae 100644 --- a/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_roam_preauth.c +++ b/drivers/staging/qcacld-3.0/core/sme/src/csr/csr_roam_preauth.c @@ -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; } diff --git a/drivers/staging/qcacld-3.0/core/wma/inc/wma_types.h b/drivers/staging/qcacld-3.0/core/wma/inc/wma_types.h index 745d1adafc08..7ee3cb71e67c 100644 --- a/drivers/staging/qcacld-3.0/core/wma/inc/wma_types.h +++ b/drivers/staging/qcacld-3.0/core/wma/inc/wma_types.h @@ -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, diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_data.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_data.c index ac33182578be..3d61436f7787 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_data.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_data.c @@ -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: diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_dev_if.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_dev_if.c index c4818c412a45..894d30692d1f 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_dev_if.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_dev_if.c @@ -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; } diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_features.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_features.c index cbbeff8eeb0c..5ca0ec66cb2e 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_features.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_features.c @@ -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 = diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_mgmt.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_mgmt.c index d09813fd949a..3ad0282ca1e7 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_mgmt.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_mgmt.c @@ -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); } diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_scan_roam.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_scan_roam.c index 2d03ba804e8f..a9a63f72d2d3 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_scan_roam.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_scan_roam.c @@ -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; } diff --git a/drivers/staging/qcacld-3.0/core/wma/src/wma_utils.c b/drivers/staging/qcacld-3.0/core/wma/src/wma_utils.c index 1a7833a51eb2..0cc36be3349b 100644 --- a/drivers/staging/qcacld-3.0/core/wma/src/wma_utils.c +++ b/drivers/staging/qcacld-3.0/core/wma/src/wma_utils.c @@ -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; }