diff options
| author | Service qcabuildsw <qcabuildsw@localhost> | 2016-07-21 16:28:46 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-07-21 16:28:46 -0700 |
| commit | 980d5423e6a2aed9d1f2b342a2b0f4d84398f464 (patch) | |
| tree | 9f50989ba86f959ad5ce066de1aa437e05fe36f4 | |
| parent | 489ce9fe435b204e43063212e90e535b1a935ca4 (diff) | |
| parent | 74da41bcc2cea822aa99a5406b74605389129224 (diff) | |
Merge changes I87f9c706,I11d15457,I4c8d9b28,I3996ce76,Idee37eb6,If3ba082b,I8263688a into wlan-cld3.driver.lnx.1.1-dev
* changes:
Release 5.1.0.22C
qcacld-3.0: Update correct authtype during connect
qcacld-3.0: Changes to support wmi tx bundle completion
qcacld-3.0: Enable LRO, NAPI, Fastpath
qcacld-3.0: Kbuild: Enable LRO
qcacld-3.0: Update handling of WOW packet buffer
qcacld-3.0: CL 1546701 - update fw common interface files
| -rw-r--r-- | Kbuild | 10 | ||||
| -rw-r--r-- | config/WCNSS_qcom_cfg.ini | 88 | ||||
| -rw-r--r-- | core/cds/inc/cds_api.h | 26 | ||||
| -rw-r--r-- | core/hdd/inc/wlan_hdd_assoc.h | 4 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 6 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.h | 3 | ||||
| -rw-r--r-- | core/mac/inc/qwlan_version.h | 4 | ||||
| -rw-r--r-- | core/wma/inc/wma.h | 2 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 288 | ||||
| -rw-r--r-- | core/wma/src/wma_main.c | 12 | ||||
| -rw-r--r-- | core/wma/src/wma_mgmt.c | 108 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 101 | ||||
| -rw-r--r-- | target/inc/wmi_tlv_defs.h | 5 | ||||
| -rw-r--r-- | target/inc/wmi_unified.h | 35 | ||||
| -rw-r--r-- | target/inc/wmi_version.h | 2 |
15 files changed, 408 insertions, 286 deletions
@@ -168,12 +168,10 @@ ifneq ($(CONFIG_ROME_IF),sdio) endif # Flag to enable LRO (Large Receive Offload) - ifeq ($(CONFIG_CNSS_EOS), y) - ifeq ($(CONFIG_INET_LRO), y) - CONFIG_WLAN_LRO := y - else - CONFIG_WLAN_LRO := n - endif + ifeq ($(CONFIG_INET_LRO), y) + CONFIG_WLAN_LRO := y + else + CONFIG_WLAN_LRO := n endif endif diff --git a/config/WCNSS_qcom_cfg.ini b/config/WCNSS_qcom_cfg.ini index e30773ce54e6..e3d506db0387 100644 --- a/config/WCNSS_qcom_cfg.ini +++ b/config/WCNSS_qcom_cfg.ini @@ -442,16 +442,6 @@ gEnablePowerSaveOffload=2 #Enable firmware uart print gEnablefwprint=0 -#IPA config -gIPAConfig=0 -gIPADescSize=800 -gIPAPreFilterEnable=1 -gIPARMEnable=1 -gIPAIPv6Enable=1 - -IpaUcOffloadEnabled=0 -gIpaUcStaOffload=0 - #P2P Listen offload gEnableP2pListenOffload=1 @@ -479,12 +469,6 @@ gEnableMCCAdaptiveScheduler=1 #Enable or Disable p2p device address administered isP2pDeviceAddrAdministrated=0 -#Enable Rx thread -gEnableRxThread=1 - -#Enable NAPI -gEnableNAPI=1 - # Set Thermal Power limit TxPower2g=10 TxPower5g=10 @@ -511,14 +495,6 @@ ssdp = 0 #Enable Memory Deep Sleep gEnableMemDeepSleep=1 -# Bus bandwidth threshold values in terms of number of packets -gBusBandwidthHighThreshold=2000 -gBusBandwidthMediumThreshold=500 -gBusBandwidthLowThreshold=150 - -# Bus bandwidth compute timeout value in ms -gBusBandwidthComputeInterval=100 - # Regulatory Setting; 0=STRICT; 1=CUSTOM gRegulatoryChangeCountry=1 # RA filtering rate limit param, the current value would not @@ -600,20 +576,70 @@ gEnableTDLSOffChannel=1 # 1=Enable, 0=Disable (default) gEnableMacAddrSpoof=0 +################ Datapath feature set Begin ################ +# Bus bandwidth threshold values in terms of number of packets +gBusBandwidthHighThreshold=2000 +gBusBandwidthMediumThreshold=500 +gBusBandwidthLowThreshold=150 + +# Bus bandwidth compute timeout value in ms +gBusBandwidthComputeInterval=100 + +# VHT Tx/Rx MCS values +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gVhtRxMCS=2 +gVhtTxMCS=2 + +# VHT Tx/Rx MCS values for 2x2 +# Valid values are 0,1,2. If commented out, the default value is 0. +# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9 +gEnable2x2=1 +gVhtRxMCS2x2=2 +gVhtTxMCS2x2=2 + +#IPA config +gIPAConfig=0 +gIPADescSize=800 +gIPAPreFilterEnable=1 +gIPARMEnable=1 +gIPAIPv6Enable=1 + +IpaUcOffloadEnabled=0 +gIpaUcStaOffload=0 + +# Enable/Disable RX full reorder offload +gReorderOffloadSupported=1 + +# Enable CE classification +# 1 - enable(default) 0 - disable +gCEClassifyEnable=1 + +#Enable Rx thread +# 1 - enable 0 - disable(default) +gEnableRxThread=0 + # Enable(Tx) fastpath for data traffic. -# 0 - disable -# 1 - enable +# 1 - enable(default) 0 - disable gEnableFastPath=1 +# This flag enables IP, TCP and UDP checksum offload +# 1 - enable(default) 0 - disable +gEnableIpTcpUdpChecksumOffload=1 + +# Enable NAPI +# 1 - enable(default) 0 - disable +gEnableNAPI=1 + # Enable TCP Segmentation Offload -# 0 - disable -# 1 - enable +# 1 - enable(default) 0 - disable TSOEnable=1 -# Enable Large Receive Offload -# 0 - disable -# 1 - enable +# Enable Large Recieve Offload +# 1 - enable(default) 0 - disable LROEnable=1 +################ Datapath feature set End ################ + END # Note: Configuration parser would not read anything past the END marker diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h index 8c3932be2109..9e9774fe99a1 100644 --- a/core/cds/inc/cds_api.h +++ b/core/cds/inc/cds_api.h @@ -91,32 +91,6 @@ void cds_clear_driver_state(enum cds_driver_state); enum cds_driver_state cds_get_driver_state(void); /** - * cds_get_u16()- get 16 bit data in little endian - * @ptr: buffer that holds data - * - * Return: uint16_t data in little endian format - */ -static inline uint16_t cds_get_u16(uint8_t *ptr) -{ - return ((uint16_t) (*(ptr+1) << 8)) | - ((uint16_t) (*ptr)); -} - -/** - * cds_get_u32()- get 32 bit data in little endian - * @ptr: buffer that holds data - * - * Return: uint32_t data in little endian format - */ -static inline uint32_t cds_get_u32(uint8_t *ptr) -{ - return (*(ptr+3) << 24) | - (*(ptr+2) << 16) | - (*(ptr+1) << 8) | - (*(ptr)); -} - -/** * cds_is_driver_loading() - Is driver load in progress * * Return: true if driver is loading and false otherwise. diff --git a/core/hdd/inc/wlan_hdd_assoc.h b/core/hdd/inc/wlan_hdd_assoc.h index 24b28711d78e..c71450f3e6e9 100644 --- a/core/hdd/inc/wlan_hdd_assoc.h +++ b/core/hdd/inc/wlan_hdd_assoc.h @@ -99,6 +99,8 @@ typedef enum { * @ht_present: ht element present or not * @vht_present: vht element present or not * @hs20_present: hs20 element present or not + * @ht_op_present: ht operation present or not + * @vht_op_present: vht operation present or not */ struct hdd_conn_flag { uint8_t ht_present:1; @@ -173,7 +175,7 @@ struct hdd_conn_flag { * @ht_caps: holds ht capabilities info * @vht_caps: holds vht capabilities info * @hs20vendor_ie: holds passpoint/hs20 info - * @hdd_conn_flag: flag conn info params is present or not + * @conn_flag: flag conn info params is present or not * @roam_count: roaming counter * @signal: holds rssi info * @assoc_status_code: holds assoc fail reason diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index af6bd9b9bc32..913c2359c1a7 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -3328,7 +3328,7 @@ fail: * * Return: Success(0) or reason code for failure */ -static int32_t +static int __hdd_cfg80211_get_station_cmd(struct wiphy *wiphy, struct wireless_dev *wdev, const void *data, @@ -9465,8 +9465,8 @@ int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter, } pRoamProfile = &pWextState->roamProfile; - qdf_mem_zero(&hdd_sta_ctx->conn_info, - sizeof(hdd_sta_ctx->conn_info)); + qdf_mem_zero(&hdd_sta_ctx->conn_info.conn_flag, + sizeof(hdd_sta_ctx->conn_info.conn_flag)); if (pRoamProfile) { hdd_station_ctx_t *pHddStaCtx; diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index d6e53b7118d2..81a968209364 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -406,8 +406,10 @@ enum qca_nl80211_vendor_subcmds { * latest cached information during the connected state , if queried * when in disconnected state. * + * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INVALID: Invalid attribute * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO: bss info * @QCA_WLAN_VENDOR_ATTR_GET_STATION_ASSOC_FAIL_REASON: assoc fail reason + * @QCA_WLAN_VENDOR_ATTR_GET_STATION_AFTER_LAST: After last */ enum qca_wlan_vendor_attr_get_station { QCA_WLAN_VENDOR_ATTR_GET_STATION_INVALID = 0, @@ -504,6 +506,7 @@ enum qca_wlan_auth_type { * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_ASSOC_FAIL_REASON: * Status Code Corresponding to the Association Failure. * Unsigned 32 bit value. + * @QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_AFTER_LAST: After last */ enum qca_wlan_vendor_attr_get_station_info { QCA_WLAN_VENDOR_ATTR_GET_STATION_INFO_INVALID = 0, diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index a1b8466626c9..05002a9595d6 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -41,9 +41,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 1 #define QWLAN_VERSION_PATCH 0 -#define QWLAN_VERSION_EXTRA "B" +#define QWLAN_VERSION_EXTRA "C" #define QWLAN_VERSION_BUILD 22 -#define QWLAN_VERSIONSTR "5.1.0.22B" +#define QWLAN_VERSIONSTR "5.1.0.22C" #endif /* QWLAN_VERSION_H */ diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 323b8a384da4..9c80a51de544 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -2077,6 +2077,8 @@ struct wmi_desc_t *wmi_desc_get(tp_wma_handle wma_handle); void wmi_desc_put(tp_wma_handle wma_handle, struct wmi_desc_t *wmi_desc); int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, uint32_t len); +int wma_mgmt_tx_bundle_completion_handler(void *handle, + uint8_t *cmpl_event_params, uint32_t len); void wma_set_dfs_region(tp_wma_handle wma, uint8_t dfs_region); uint32_t wma_get_vht_ch_width(void); QDF_STATUS diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 8b92c7826877..c0bb0ff209c9 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -2732,6 +2732,138 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data, return; } +#ifdef FEATURE_WLAN_EXTSCAN +/** + * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id + * @tag: WMI TLV tag + * + * Return: + * 0 if TLV tag is invalid + * else return corresponding WMI event id + */ +static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag) +{ + uint32_t event_id; + + switch (tag) { + case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param: + event_id = WMI_EXTSCAN_START_STOP_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param: + event_id = WMI_EXTSCAN_OPERATION_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param: + event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param: + event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param: + event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param: + event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param: + event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID; + break; + + case WMITLV_TAG_STRUC_wmi_extscan_hotlist_ssid_match_event_fixed_param: + event_id = WMI_EXTSCAN_HOTLIST_SSID_MATCH_EVENTID; + break; + + default: + event_id = 0; + WMA_LOGE("%s: Unknown tag: %d", __func__, tag); + break; + } + + WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id); + return event_id; +} +#else +static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag) +{ + return 0; +} +#endif + +/** + * wow_get_wmi_eventid() - map reason or tlv tag to corresponding event id + * @tag: WMI TLV tag + * @reason: WOW reason + * + * WOW reason type is primarily used to find the ID. If there could be + * multiple events that can be sent as a WOW event with same reason + * then tlv tag is used to identify the corresponding event. + * + * Return: + * 0 if TLV tag/reason is invalid + * else return corresponding WMI event id + */ +static int wow_get_wmi_eventid(int32_t reason, uint32_t tag) +{ + uint32_t event_id; + + switch (reason) { + case WOW_REASON_NLO_SCAN_COMPLETE: + event_id = WMI_NLO_SCAN_COMPLETE_EVENTID; + break; + case WOW_REASON_CSA_EVENT: + event_id = WMI_CSA_HANDLING_EVENTID; + break; + case WOW_REASON_LOW_RSSI: + event_id = WMI_ROAM_EVENTID; + break; + case WOW_REASON_CLIENT_KICKOUT_EVENT: + event_id = WMI_PEER_STA_KICKOUT_EVENTID; + break; + case WOW_REASON_EXTSCAN: + event_id = wma_extscan_get_eventid_from_tlvtag(tag); + break; + case WOW_REASON_RSSI_BREACH_EVENT: + event_id = WMI_RSSI_BREACH_EVENTID; + break; + case WOW_REASON_NAN_EVENT: + event_id = WMI_NAN_EVENTID; + break; + default: + WMA_LOGD(FL("Unexpected WOW reason : %s(%d)"), + wma_wow_wake_reason_str(reason), reason); + event_id = 0; + break; + } + + return event_id; +} + +/** + * tlv_check_required() - tells whether to check the wow packet buffer + * for proper TLV structure. + * @reason: WOW reason + * + * In most cases, wow wake up event carries the actual event buffer in + * wow_packet_buffer with some exceptions. This function is used to + * determine when to check for the TLVs in wow_packet_buffer. + * + * Return: true if check is required and false otherwise. + */ +static bool tlv_check_required(int32_t reason) +{ + switch (reason) { + case WOW_REASON_PATTERN_MATCH_FOUND: + return false; + default: + return true; + } +} + /** * wma_wow_wakeup_host_event() - wakeup host event handler * @handle: wma handle @@ -2753,7 +2885,9 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, struct wma_txrx_node *node; #endif /* FEATURE_WLAN_SCAN_PNO */ uint32_t wake_lock_duration = 0; - uint32_t wow_buf_pkt_len = 0; + void *wmi_cmd_struct_ptr = NULL; + uint32_t tlv_hdr, tag, wow_buf_pkt_len = 0, event_id = 0; + int tlv_ok_status; param_buf = (WMI_WOW_WAKEUP_HOST_EVENTID_param_tlvs *) event; if (!param_buf) { @@ -2769,6 +2903,35 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, qdf_event_set(&wma->wma_resume_event); + if (param_buf->wow_packet_buffer && + tlv_check_required(wake_info->wake_reason)) { + /* + * In case of wow_packet_buffer, first 4 bytes is the length. + * Following the length is the actual buffer. + */ + wow_buf_pkt_len = *(uint32_t *)param_buf->wow_packet_buffer; + tlv_hdr = WMITLV_GET_HDR( + (uint8_t *)param_buf->wow_packet_buffer + 4); + + tag = WMITLV_GET_TLVTAG(tlv_hdr); + event_id = wow_get_wmi_eventid(wake_info->wake_reason, tag); + if (!event_id) { + WMA_LOGE(FL("Unable to find matching ID")); + return -EINVAL; + } + + tlv_ok_status = wmitlv_check_and_pad_event_tlvs( + handle, param_buf->wow_packet_buffer + 4, + wow_buf_pkt_len, event_id, + &wmi_cmd_struct_ptr); + + if (tlv_ok_status != 0) { + WMA_LOGE(FL("Invalid TLVs, Length:%d event_id:%d status: %d"), + wow_buf_pkt_len, event_id, tlv_ok_status); + return -EINVAL; + } + } + switch (wake_info->wake_reason) { case WOW_REASON_AUTH_REQ_RECV: wake_lock_duration = WMA_AUTH_REQ_RECV_WAKE_LOCK_TIMEOUT; @@ -2819,34 +2982,19 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, break; case WOW_REASON_NLO_SCAN_COMPLETE: - { - WMI_NLO_SCAN_COMPLETE_EVENTID_param_tlvs param; - - WMA_LOGD("Host woken up due to pno scan complete reason"); - - /* First 4-bytes of wow_packet_buffer is the length */ - if (param_buf->wow_packet_buffer) { - param.fixed_param = (wmi_nlo_event *) - (param_buf->wow_packet_buffer + 4); - wma_nlo_scan_cmp_evt_handler(handle, - (u_int8_t *)¶m, sizeof(param)); - } else - WMA_LOGD("No wow_packet_buffer present"); - } + WMA_LOGD("Host woken up due to pno scan complete reason"); + if (param_buf->wow_packet_buffer) + wma_nlo_scan_cmp_evt_handler(handle, + wmi_cmd_struct_ptr, wow_buf_pkt_len); + else + WMA_LOGD("No wow_packet_buffer present"); break; #endif /* FEATURE_WLAN_SCAN_PNO */ case WOW_REASON_CSA_EVENT: - { - WMI_CSA_HANDLING_EVENTID_param_tlvs param; WMA_LOGD("Host woken up because of CSA IE"); - param.fixed_param = (wmi_csa_event_fixed_param *) - (((uint8_t *) wake_info) - + sizeof(WOW_EVENT_INFO_fixed_param) - + WOW_CSA_EVENT_OFFSET); - wma_csa_offload_handler(handle, (uint8_t *) ¶m, - sizeof(param)); - } + wma_csa_offload_handler(handle, wmi_cmd_struct_ptr, + wow_buf_pkt_len); break; #ifdef FEATURE_WLAN_LPHB @@ -2878,115 +3026,69 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, break; case WOW_REASON_LOW_RSSI: - { /* WOW_REASON_LOW_RSSI is used for all roaming events. * WMI_ROAM_REASON_BETTER_AP, WMI_ROAM_REASON_BMISS, * WMI_ROAM_REASON_SUITABLE_AP will be handled by * wma_roam_event_callback(). */ - WMI_ROAM_EVENTID_param_tlvs param; wma_wow_wake_up_stats(wma, NULL, 0, WOW_REASON_LOW_RSSI); + WMA_LOGD("Host woken up because of roam event"); if (param_buf->wow_packet_buffer) { /* Roam event is embedded in wow_packet_buffer */ - WMA_LOGD("Host woken up because of roam event"); - qdf_mem_copy((uint8_t *) &wow_buf_pkt_len, - param_buf->wow_packet_buffer, 4); WMA_LOGD("wow_packet_buffer dump"); qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, param_buf->wow_packet_buffer, wow_buf_pkt_len); - if (wow_buf_pkt_len >= sizeof(param)) { - param.fixed_param = - (wmi_roam_event_fixed_param *) - (param_buf->wow_packet_buffer + 4); - wma_roam_event_callback(handle, - (uint8_t *) & - param, - sizeof(param)); - } else { - WMA_LOGE("Wrong length for roam event = %d bytes", - wow_buf_pkt_len); - } + wma_roam_event_callback(handle, wmi_cmd_struct_ptr, + wow_buf_pkt_len); } else { - /* No wow_packet_buffer means a better AP beacon + /* + * No wow_packet_buffer means a better AP beacon * will follow in a later event. */ WMA_LOGD("Host woken up because of better AP beacon"); } break; - } case WOW_REASON_CLIENT_KICKOUT_EVENT: - { - WMI_PEER_STA_KICKOUT_EVENTID_param_tlvs param; + WMA_LOGD("Host woken up because of sta_kickout event"); if (param_buf->wow_packet_buffer) { - /* station kickout event embedded in wow_packet_buffer */ - WMA_LOGD("Host woken up because of sta_kickout event"); - qdf_mem_copy((u_int8_t *) &wow_buf_pkt_len, - param_buf->wow_packet_buffer, 4); - WMA_LOGD("wow_packet_buffer dump"); - qdf_trace_hex_dump(QDF_MODULE_ID_WMA, + WMA_LOGD("wow_packet_buffer dump"); + qdf_trace_hex_dump(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG, param_buf->wow_packet_buffer, wow_buf_pkt_len); - if (wow_buf_pkt_len >= sizeof(param)) { - param.fixed_param = (wmi_peer_sta_kickout_event_fixed_param *) - (param_buf->wow_packet_buffer + 4); wma_peer_sta_kickout_event_handler(handle, - (u_int8_t *)¶m, sizeof(param)); - } else { - WMA_LOGE("Wrong length for sta_kickout event = %d bytes", - wow_buf_pkt_len); - } + wmi_cmd_struct_ptr, wow_buf_pkt_len); } else { WMA_LOGD("No wow_packet_buffer present"); } break; - } #ifdef FEATURE_WLAN_EXTSCAN case WOW_REASON_EXTSCAN: WMA_LOGD("Host woken up because of extscan reason"); wma_wow_wake_up_stats(wma, NULL, 0, WOW_REASON_EXTSCAN); - if (param_buf->wow_packet_buffer) { - wow_buf_pkt_len = - *(uint32_t *)param_buf->wow_packet_buffer; + if (param_buf->wow_packet_buffer) wma_extscan_wow_event_callback(handle, - (u_int8_t *)(param_buf->wow_packet_buffer + 4), - wow_buf_pkt_len); - } else + wmi_cmd_struct_ptr, wow_buf_pkt_len); + else WMA_LOGE("wow_packet_buffer is empty"); break; #endif case WOW_REASON_RSSI_BREACH_EVENT: - { - WMI_RSSI_BREACH_EVENTID_param_tlvs param; - - wma_wow_wake_up_stats(wma, NULL, 0, + wma_wow_wake_up_stats(wma, NULL, 0, WOW_REASON_RSSI_BREACH_EVENT); - WMA_LOGD("Host woken up because of rssi breach reason"); - /* rssi breach event is embedded in wow_packet_buffer */ - if (param_buf->wow_packet_buffer) { - qdf_mem_copy((u_int8_t *) &wow_buf_pkt_len, - param_buf->wow_packet_buffer, 4); - if (wow_buf_pkt_len >= sizeof(param)) { - param.fixed_param = - (wmi_rssi_breach_event_fixed_param *) - (param_buf->wow_packet_buffer + 4); - wma_rssi_breached_event_handler(handle, - (u_int8_t *)¶m, - sizeof(param)); - } else { - WMA_LOGE("%s: Wrong length: %d bytes", - __func__, wow_buf_pkt_len); - } - } else - WMA_LOGD("No wow_packet_buffer present"); - } + WMA_LOGD("Host woken up because of rssi breach reason"); + /* rssi breach event is embedded in wow_packet_buffer */ + if (param_buf->wow_packet_buffer) + wma_rssi_breached_event_handler(handle, + wmi_cmd_struct_ptr, wow_buf_pkt_len); + else + WMA_LOGD("No wow_packet_buffer present"); break; case WOW_REASON_NAN_EVENT: WMA_LOGA("Host woken up due to NAN event reason"); wma_nan_rsp_event_handler(handle, - (uint8_t *)param_buf->wow_packet_buffer, - sizeof(WMI_NAN_EVENTID_param_tlvs)); + wmi_cmd_struct_ptr, wow_buf_pkt_len); break; case WOW_REASON_NAN_DATA: WMA_LOGD(FL("Host woken up for NAN data path event from FW")); @@ -3006,6 +3108,9 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, } break; default: + WMA_LOGE(FL("WOW reason %s(%d)- not handled"), + wma_wow_wake_reason_str(wake_info->wake_reason), + wake_info->wake_reason); break; } @@ -3016,6 +3121,7 @@ int wma_wow_wakeup_host_event(void *handle, uint8_t *event, WMA_LOGA("Holding %d msec wake_lock", wake_lock_duration); } + wmitlv_free_allocated_event_tlvs(event_id, &wmi_cmd_struct_ptr); return 0; } diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index b1811221c8fd..95d86df2c2af 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -238,6 +238,8 @@ static void wma_set_default_tgt_config(tp_wma_handle wma_handle) tgt_cfg.num_tids = (2 * (no_of_peers_supported + CFG_TGT_NUM_VDEV + 2)); tgt_cfg.scan_max_pending_req = wma_handle->max_scan; + WMI_RSRC_CFG_FLAG_MGMT_COMP_EVT_BUNDLE_SUPPORT_SET(tgt_cfg.flag1, 1); + WMITLV_SET_HDR(&tgt_cfg.tlv_header, WMITLV_TAG_STRUC_wmi_resource_config, WMITLV_GET_STRUCT_TLVLEN(wmi_resource_config)); @@ -4318,6 +4320,16 @@ int wma_rx_service_ready_event(void *handle, uint8_t *cmd_param_info, return -EINVAL; } + status = wmi_unified_register_event_handler( + wma_handle->wmi_handle, + WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID, + wma_mgmt_tx_bundle_completion_handler, + WMA_RX_SERIALIZER_CTX); + if (status) { + WMA_LOGE("Failed to register MGMT over WMI completion handler"); + return -EINVAL; + } + } else { WMA_LOGE("FW doesnot support WMI_SERVICE_MGMT_TX_WMI, Use HTT interface for Management Tx"); } diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 5d037b8b668e..a5cf5b8f88e1 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2452,46 +2452,28 @@ void wma_beacon_miss_handler(tp_wma_handle wma, uint32_t vdev_id) } /** - * wma_mgmt_tx_completion_handler() - wma mgmt Tx completion event handler - * @handle: wma handle - * @cmpl_event_params: completion event handler data - * @len: length of @cmpl_event_params + * wma_process_mgmt_tx_completion() - process mgmt completion + * @wma_handle: wma handle + * @desc_id: descriptor id + * @status: status * - * Return: 0 on success; error number otherwise + * Return: 0 for success or error code */ - -int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, - uint32_t len) +int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle, + uint32_t desc_id, uint32_t status) { - tp_wma_handle wma_handle = (tp_wma_handle)handle; - WMI_MGMT_TX_COMPLETION_EVENTID_param_tlvs *param_buf; - wmi_mgmt_tx_compl_event_fixed_param *cmpl_params; struct wmi_desc_t *wmi_desc; - ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); - if (!pdev) { - WMA_LOGE("%s: txrx pdev is NULL", __func__); - return -EINVAL; - } if (pdev == NULL) { WMA_LOGE("%s: NULL pdev pointer", __func__); return -EINVAL; } - param_buf = (WMI_MGMT_TX_COMPLETION_EVENTID_param_tlvs *) - cmpl_event_params; - if (!param_buf || !wma_handle) { - WMA_LOGE("%s: Invalid mgmt Tx completion event", __func__); - return -EINVAL; - } - cmpl_params = param_buf->fixed_param; - - WMA_LOGI("%s: status:%d wmi_desc_id:%d", __func__, cmpl_params->status, - cmpl_params->desc_id); + WMA_LOGI("%s: status:%d wmi_desc_id:%d", __func__, status, desc_id); wmi_desc = (struct wmi_desc_t *) - (&wma_handle->wmi_desc_pool.array[cmpl_params->desc_id]); + (&wma_handle->wmi_desc_pool.array[desc_id]); if (!wmi_desc) { WMA_LOGE("%s: Invalid wmi desc", __func__); @@ -2500,18 +2482,82 @@ int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, if (wmi_desc->nbuf) qdf_nbuf_unmap_single(pdev->osdev, wmi_desc->nbuf, - QDF_DMA_TO_DEVICE); + QDF_DMA_TO_DEVICE); if (wmi_desc->tx_cmpl_cb) wmi_desc->tx_cmpl_cb(wma_handle->mac_context, - wmi_desc->nbuf, 1); + wmi_desc->nbuf, 1); if (wmi_desc->ota_post_proc_cb) wmi_desc->ota_post_proc_cb((tpAniSirGlobal) - wma_handle->mac_context, - cmpl_params->status); + wma_handle->mac_context, + status); wmi_desc_put(wma_handle, wmi_desc); + return 0; +} + +/** + * wma_mgmt_tx_completion_handler() - wma mgmt Tx completion event handler + * @handle: wma handle + * @cmpl_event_params: completion event handler data + * @len: length of @cmpl_event_params + * + * Return: 0 on success; error number otherwise + */ + +int wma_mgmt_tx_completion_handler(void *handle, uint8_t *cmpl_event_params, + uint32_t len) +{ + tp_wma_handle wma_handle = (tp_wma_handle)handle; + WMI_MGMT_TX_COMPLETION_EVENTID_param_tlvs *param_buf; + wmi_mgmt_tx_compl_event_fixed_param *cmpl_params; + + param_buf = (WMI_MGMT_TX_COMPLETION_EVENTID_param_tlvs *) + cmpl_event_params; + if (!param_buf || !wma_handle) { + WMA_LOGE("%s: Invalid mgmt Tx completion event", __func__); + return -EINVAL; + } + cmpl_params = param_buf->fixed_param; + + wma_process_mgmt_tx_completion(wma_handle, + cmpl_params->desc_id, cmpl_params->status); + + return 0; +} + +/** + * wma_mgmt_tx_bundle_completion_handler() - mgmt bundle comp handler + * @handle: wma handle + * @buf: buffer + * @len: length + * + * Return: 0 for success or error code + */ +int wma_mgmt_tx_bundle_completion_handler(void *handle, uint8_t *buf, + uint32_t len) +{ + tp_wma_handle wma_handle = (tp_wma_handle)handle; + WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID_param_tlvs *param_buf; + wmi_mgmt_tx_compl_bundle_event_fixed_param *cmpl_params; + uint32_t num_reports; + uint32_t *desc_ids; + uint32_t *status; + int i; + + param_buf = (WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID_param_tlvs *)buf; + if (!param_buf && !wma_handle) { + WMA_LOGE("%s: Invalid mgmt Tx completion event", __func__); + return -EINVAL; + } + cmpl_params = param_buf->fixed_param; + num_reports = cmpl_params->num_reports; + desc_ids = (uint32_t *)(param_buf->desc_ids); + status = (uint32_t *)(param_buf->status); + for (i = 0; i < num_reports; i++) + wma_process_mgmt_tx_completion(wma_handle, + desc_ids[i], status[i]); return 0; } diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index f9ec557416a0..0bd344a38af6 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -3260,61 +3260,6 @@ void wma_scan_cache_updated_ind(tp_wma_handle wma, uint8_t sessionId) #ifdef FEATURE_WLAN_EXTSCAN /** - * wma_extscan_get_eventid_from_tlvtag() - map tlv tag to corresponding event id - * @tag: WMI TLV tag - * - * Return: - * 0 if TLV tag is invalid - * else return corresponding WMI event id - */ -static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag) -{ - uint32_t event_id; - - switch (tag) { - case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param: - event_id = WMI_EXTSCAN_START_STOP_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param: - event_id = WMI_EXTSCAN_OPERATION_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param: - event_id = WMI_EXTSCAN_TABLE_USAGE_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param: - event_id = WMI_EXTSCAN_CACHED_RESULTS_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param: - event_id = WMI_EXTSCAN_WLAN_CHANGE_RESULTS_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param: - event_id = WMI_EXTSCAN_HOTLIST_MATCH_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param: - event_id = WMI_EXTSCAN_CAPABILITIES_EVENTID; - break; - - case WMITLV_TAG_STRUC_wmi_extscan_hotlist_ssid_match_event_fixed_param: - event_id = WMI_EXTSCAN_HOTLIST_SSID_MATCH_EVENTID; - break; - - default: - event_id = 0; - WMA_LOGE("%s: Unknown tag: %d", __func__, tag); - break; - } - - WMA_LOGI("%s: For tag %d WMI event 0x%x", __func__, tag, event_id); - return event_id; -} - -/** * wma_extscan_wow_event_callback() - extscan wow event callback * @handle: WMA handle * @event: event buffer @@ -3326,77 +3271,53 @@ static int wma_extscan_get_eventid_from_tlvtag(uint32_t tag) * of event buffer is common tlv header, which is a combination * of tag (higher 2 bytes) and length (lower 2 bytes). The tag is used to * identify the event which triggered wow event. + * Payload is extracted and converted into generic tlv structure before + * being passed to this function. * * @Return: none */ void wma_extscan_wow_event_callback(void *handle, void *event, uint32_t len) { - uint32_t id; - int tlv_ok_status = 0; - void *wmi_cmd_struct_ptr = NULL; uint32_t tag = WMITLV_GET_TLVTAG(WMITLV_GET_HDR(event)); - id = wma_extscan_get_eventid_from_tlvtag(tag); - if (!id) { - WMA_LOGE("%s: Invalid Tag: %d", __func__, tag); - return; - } - - tlv_ok_status = wmitlv_check_and_pad_event_tlvs( - handle, event, len, id, - &wmi_cmd_struct_ptr); - if (tlv_ok_status != 0) { - WMA_LOGE("%s: Invalid Tag: %d could not check and pad tlvs", - __func__, tag); - return; - } - switch (tag) { case WMITLV_TAG_STRUC_wmi_extscan_start_stop_event_fixed_param: - wma_extscan_start_stop_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_start_stop_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_operation_event_fixed_param: - wma_extscan_operations_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_operations_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_table_usage_event_fixed_param: - wma_extscan_table_usage_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_table_usage_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_cached_results_event_fixed_param: - wma_extscan_cached_results_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_cached_results_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_wlan_change_results_event_fixed_param: - wma_extscan_change_results_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_change_results_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_hotlist_match_event_fixed_param: - wma_extscan_hotlist_match_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_hotlist_match_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_capabilities_event_fixed_param: - wma_extscan_capabilities_event_handler(handle, - wmi_cmd_struct_ptr, len); + wma_extscan_capabilities_event_handler(handle, event, len); break; case WMITLV_TAG_STRUC_wmi_extscan_hotlist_ssid_match_event_fixed_param: wma_extscan_hotlist_ssid_match_event_handler(handle, - wmi_cmd_struct_ptr, len); + event, len); break; default: - WMA_LOGE("%s: Unknown tag: %d", __func__, tag); + WMA_LOGE(FL("Unknown tag: %d"), tag); break; } - wmitlv_free_allocated_event_tlvs(id, &wmi_cmd_struct_ptr); return; } diff --git a/target/inc/wmi_tlv_defs.h b/target/inc/wmi_tlv_defs.h index 1ba64b490c97..2dbe1edd3a66 100644 --- a/target/inc/wmi_tlv_defs.h +++ b/target/inc/wmi_tlv_defs.h @@ -723,6 +723,7 @@ typedef enum { WMITLV_TAG_STRUC_wmi_pdev_set_reorder_timeout_val_cmd_fixed_param, WMITLV_TAG_STRUC_wmi_peer_set_rx_blocksize_cmd_fixed_param, WMITLV_TAG_STRUC_WMI_PDEV_SET_WAKEUP_CONFIG_CMDID_fixed_param, + WMITLV_TAG_STRUC_wmi_tlv_buf_len_param, } WMITLV_TAG_ID; /* @@ -1290,7 +1291,9 @@ WMITLV_CREATE_PARAM_STRUC(WMI_RMV_BCN_FILTER_CMDID); WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_offload_tlv_param, offload_param, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_11i_offload_tlv_param, offload_11i_param, WMITLV_SIZE_VAR) \ WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_11r_offload_tlv_param, offload_11r_param, WMITLV_SIZE_VAR) \ - WMITLV_ELEM(id,op,buf,len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_ese_offload_tlv_param, offload_ese_param, WMITLV_SIZE_VAR) + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_STRUC, wmi_roam_ese_offload_tlv_param, offload_ese_param, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_STRUC, wmi_tlv_buf_len_param, assoc_ie_len_param, WMITLV_SIZE_VAR) \ + WMITLV_ELEM(id, op, buf, len, WMITLV_TAG_ARRAY_BYTE, A_UINT8, assoc_ie_buf, WMITLV_SIZE_VAR) WMITLV_CREATE_PARAM_STRUC(WMI_ROAM_SCAN_MODE); diff --git a/target/inc/wmi_unified.h b/target/inc/wmi_unified.h index 4237f64097ec..ee856a6f66e1 100644 --- a/target/inc/wmi_unified.h +++ b/target/inc/wmi_unified.h @@ -539,7 +539,7 @@ typedef enum { /** configure thresholds for MAWC */ WMI_ROAM_CONFIGURE_MAWC_CMDID, /** configure MultiBand Operation(refer WFA MBO spec) parameter */ - WMI_ROAM_SET_MBO_PARAM_CMDID, + WMI_ROAM_SET_MBO_PARAM_CMDID, /* DEPRECATED */ /** offload scan specific commands */ /** set offload scan AP profile */ @@ -2489,6 +2489,24 @@ typedef struct { A_UINT32 ie_data[1]; } wmi_ie_data; +/** + * TLV used for length/buffer + */ +typedef struct { + /** + * TLV tag and len; tag equals + * WMITLV_TAG_STRUC_wmi_tlv_buf_len_param + */ + A_UINT32 tlv_header; + A_UINT32 buf_len; /** Length of buf */ + /** + * Following this structure is the TLV byte stream of buf + * of length buf_len: + * A_UINT8 buf[]; + * + */ +} wmi_tlv_buf_len_param; + typedef struct { /** Len of the SSID */ A_UINT32 ssid_len; @@ -14234,6 +14252,15 @@ typedef struct { A_UINT32 qtimer_high; } wmi_vdev_tsf_report_event_fixed_param; +/** + * ie_id values: + * 0 to 255 are used for individual IEEE802.11 Information Element types + */ +#define WMI_SET_VDEV_IE_ID_SCAN_SET_DEFAULT_IE 256 + +/* source values: */ +#define WMI_SET_VDEV_IE_SOURCE_HOST 0x0 + typedef struct { /** TLV tag and len; tag equals * WMITLV_TAG_STRUC_wmi_vdev_set_ie_cmd_fixed_param */ @@ -14244,6 +14271,8 @@ typedef struct { A_UINT32 ie_id; /* ie_len corresponds to num of bytes in ie_data[] */ A_UINT32 ie_len; + /** source of this command */ + A_UINT32 ie_source; /* see WMI_SET_VDEV_IE_SOURCE_ defs */ /* * Following this structure is the TLV byte stream of ie data of length * buf_len: @@ -14681,7 +14710,7 @@ typedef struct { * 1 - Allow to connect to MBO AP only * Bit 1-31 : reserved. */ -#define WMI_ROAM_MBO_FLAG_MBO_ONLY_MODE (1<<0) +#define WMI_ROAM_MBO_FLAG_MBO_ONLY_MODE (1<<0) /* DEPRECATED */ typedef struct { /* @@ -14695,7 +14724,7 @@ typedef struct { A_UINT32 enable; /** MBO flags, refer to definition of MBO flags*/ A_UINT32 flags; -} wmi_roam_set_mbo_fixed_param; +} wmi_roam_set_mbo_fixed_param; /* DEPRECATED */ typedef struct { /* diff --git a/target/inc/wmi_version.h b/target/inc/wmi_version.h index 1686b6f5dcf7..298387df02b3 100644 --- a/target/inc/wmi_version.h +++ b/target/inc/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_ 274 +#define __WMI_REVISION_ 275 /** The Version Namespace should not be normally changed. Only * host and firmware of the same WMI namespace will work |
