From 90a50c998c4d46914a14d2796fb00b2590c7672e Mon Sep 17 00:00:00 2001 From: Xun Luo Date: Tue, 18 Mar 2014 19:39:51 -0700 Subject: KW fix for CLD_TXRX/TXRX/ol_tx_desc.c pkt_type of 0xff indicate an unused tx_desc structure. Yet in function ol_tx_desc_frame_free_nonstd, the second to last branching case handles pkt_type up to OL_TXRX_MGMT_TYPE_BASE + 8, not to 0xff. Added the condi- tion checking that 0xff will not be handled in this branch. Change-Id: I0a45b7dd0dfad3cac609696cac08a5dc28e19f98 CRs-Fixed: 634058 --- CORE/CLD_TXRX/TXRX/ol_tx_desc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c index 2ca6b8bd5339..e1c0e1234780 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -314,7 +314,8 @@ void ol_tx_desc_frame_free_nonstd( /* free the netbuf */ adf_nbuf_set_next(tx_desc->netbuf, NULL); adf_nbuf_tx_free(tx_desc->netbuf, had_error); - } else if (tx_desc->pkt_type >= OL_TXRX_MGMT_TYPE_BASE) { + } else if ((tx_desc->pkt_type >= OL_TXRX_MGMT_TYPE_BASE) && + (tx_desc->pkt_type != 0xff)) { /* FIX THIS - * The FW currently has trouble using the host's fragments table * for management frames. Until this is fixed, rather than @@ -327,7 +328,6 @@ void ol_tx_desc_frame_free_nonstd( mgmt_type = tx_desc->pkt_type - OL_TXRX_MGMT_TYPE_BASE; /* - * KW# 6158 * we already checked the value when the mgmt frame was provided to the txrx layer. * no need to check it a 2nd time. */ -- cgit v1.2.3 From b5a5cc8576dba22ecddf69af3eb9791f7f0e82cc Mon Sep 17 00:00:00 2001 From: Amar Singhal Date: Tue, 18 Mar 2014 13:32:20 -0700 Subject: qcacld: Do not carry over Nl80211_RRF_NO_IBSS flag from init If the regulatory rules for the current country do not have NL80211_RRF_NO_IBSS set, then do not carry over the setting from initialization. Change-Id: I64cde8db79b0768cbc1e261dd82f0b7c6b8872e5 CRs-Fixed: 628716 --- CORE/VOSS/src/vos_nvitem.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CORE/VOSS/src/vos_nvitem.c b/CORE/VOSS/src/vos_nvitem.c index 2c1a02e0bae8..9dd2ad73425c 100644 --- a/CORE/VOSS/src/vos_nvitem.c +++ b/CORE/VOSS/src/vos_nvitem.c @@ -3243,6 +3243,14 @@ static int create_linux_regulatory_entry(struct wiphy *wiphy, __func__, wiphy->bands[i]->channels[j].center_freq); wiphy->bands[i]->channels[j].flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; } + + if (!(reg_rule->flags & NL80211_RRF_NO_IBSS)) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, + "%s: Remove no ibss restriction for %u", + __func__, wiphy->bands[i]->channels[j].center_freq); + wiphy->bands[i]->channels[j].flags &= ~IEEE80211_CHAN_NO_IBSS; + } } if (wiphy->bands[i]->channels[j].flags & IEEE80211_CHAN_DISABLED) -- cgit v1.2.3 From 8f82e89ded70bbe4ee617149cf350f9a3cb1155d Mon Sep 17 00:00:00 2001 From: Ganesh Babu Kumaravel Date: Wed, 19 Mar 2014 16:16:52 +0530 Subject: qcacld: fix for low rssi during connection Firmware resets the snr to 0 after recieving vdev up command i.e after connection. Firmware returns invalid snr till it sees beacon or data from the reference AP. This results in Host passing low rssi just after connection to userspace. So consider the last known rssi if firmware returns invalid snr. CRs-Fixed: 635058 Change-Id: Ie182b97d1c758919f0154bb60ed2a00a8c8d528f --- CORE/CLD_TXRX/TLSHIM/tl_shim.c | 23 ++++++++++++++++++++-- CORE/CLD_TXRX/TLSHIM/tl_shim.h | 1 + CORE/SERVICES/WMA/wma.c | 44 +++++++++++++++++++++++++++++++----------- CORE/SERVICES/WMA/wma.h | 5 ++++- 4 files changed, 59 insertions(+), 14 deletions(-) diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index 1c41e725f9a1..a337e39df84e 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -1365,6 +1365,9 @@ VOS_STATUS WLANTL_RegisterMgmtFrmClient(void *vos_ctx, VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pGetRssiReq) { tp_wma_handle wma_handle; + struct txrx_tl_shim_ctx *tl_shim; + struct tlshim_sta_info *sta_info; + v_S7_t first_rssi; ENTER(); @@ -1374,12 +1377,26 @@ VOS_STATUS WLANTL_GetRssi(void *vos_ctx, u_int8_t sta_id, v_S7_t *rssi, void *pG return VOS_STATUS_E_FAILURE; } + tl_shim = vos_get_context(VOS_MODULE_ID_TL, vos_ctx); + if (!tl_shim) { + TLSHIM_LOGE("tl_shim is NULL"); + return VOS_STATUS_E_FAULT; + } + + if (sta_id >= WLAN_MAX_STA_COUNT) { + TLSHIM_LOGE("Invalid sta id :%d", sta_id); + return VOS_STATUS_E_INVAL; + } + + sta_info = &tl_shim->sta_info[sta_id]; + first_rssi = sta_info->first_rssi; + if(VOS_STATUS_SUCCESS != - wma_send_snr_request(wma_handle, pGetRssiReq)) - { + wma_send_snr_request(wma_handle, pGetRssiReq, first_rssi)) { TLSHIM_LOGE("Failed to Trigger wma stats request"); return VOS_STATUS_E_FAILURE; } + /* dont send success, otherwise call back * will released with out values */ return VOS_STATUS_E_BUSY; @@ -1493,6 +1510,7 @@ VOS_STATUS WLANTL_ClearSTAClient(void *vos_ctx, u_int8_t sta_id) adf_os_spin_lock_bh(&tl_shim->sta_info[sta_id].stainfo_lock); tl_shim->sta_info[sta_id].registered = 0; tl_shim->sta_info[sta_id].data_rx = NULL; + tl_shim->sta_info[sta_id].first_rssi = 0; adf_os_spin_unlock_bh(&tl_shim->sta_info[sta_id].stainfo_lock); return VOS_STATUS_SUCCESS; @@ -1536,6 +1554,7 @@ VOS_STATUS WLANTL_RegisterSTAClient(void *vos_ctx, adf_os_spin_lock_bh(&sta_info->stainfo_lock); sta_info->data_rx = rxcb; sta_info->registered = true; + sta_info->first_rssi = rssi; adf_os_spin_unlock_bh(&sta_info->stainfo_lock); param.qos_capable = sta_desc->ucQosEnabled; diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.h b/CORE/CLD_TXRX/TLSHIM/tl_shim.h index 0530a8f61506..292b6f8875fd 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.h +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.h @@ -60,6 +60,7 @@ struct tlshim_sta_info { v_U8_t sessionId; void *adpaterCtxt; #endif /* QCA_LL_TX_FLOW_CT */ + v_S7_t first_rssi; }; struct txrx_tl_shim_ctx { diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 934f97ecd451..af3f6735fcc6 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -1062,21 +1062,40 @@ static void wma_update_vdev_stats(tp_wma_handle wma, if (pGetRssiReq && pGetRssiReq->sessionId == vdev_stats->vdev_id) { - if((vdev_stats->vdev_snr.dat_snr > 0) && - (vdev_stats->vdev_snr.bcn_snr > 0)) - rssi = (vdev_stats->vdev_snr.dat_snr + vdev_stats->vdev_snr.bcn_snr)/2; - else - rssi = vdev_stats->vdev_snr.bcn_snr; + if ((vdev_stats->vdev_snr.bcn_snr == WMA_TGT_INVALID_SNR) && + (vdev_stats->vdev_snr.dat_snr == WMA_TGT_INVALID_SNR)) { + /* + * Firmware sends invalid snr till it sees + * Beacon/Data after connection since after + * vdev up fw resets the snr to invalid. + * In this duartion Host will return the last know + * rssi during connection. + */ + rssi = wma->first_rssi; + } else { + if (((vdev_stats->vdev_snr.dat_snr > 0) && + (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR)) && + ((vdev_stats->vdev_snr.bcn_snr > 0) && + (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR))) { + rssi = (vdev_stats->vdev_snr.dat_snr + + vdev_stats->vdev_snr.bcn_snr)/2; + } else if (vdev_stats->vdev_snr.bcn_snr != WMA_TGT_INVALID_SNR) { + rssi = vdev_stats->vdev_snr.bcn_snr; + } else if (vdev_stats->vdev_snr.dat_snr != WMA_TGT_INVALID_SNR) { + rssi = vdev_stats->vdev_snr.dat_snr; + } + + /* + * Get the absolute rssi value from the current rssi value + * the sinr value is hardcoded into 0 in the core stack + */ + rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM; + } - /* Get the absolute rssi value from the current rssi value - * the sinr value is hardcoded into 0 in the core stack - */ WMA_LOGD("vdev id %d beancon snr %d data snr %d", vdev_stats->vdev_id, vdev_stats->vdev_snr.bcn_snr, vdev_stats->vdev_snr.dat_snr); - - rssi = rssi + WMA_TGT_NOISE_FLOOR_DBM; WMA_LOGD("Average Rssi = %d, vdev id= %d", rssi, pGetRssiReq->sessionId); @@ -4118,7 +4137,8 @@ error: } -VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq) +VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq, + v_S7_t first_rssi) { wmi_buf_t buf; wmi_request_stats_cmd_fixed_param *cmd; @@ -4129,6 +4149,8 @@ VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq) if(NULL != wma_handle->pGetRssiReq) return VOS_STATUS_SUCCESS; + wma_handle->first_rssi = first_rssi; + /* create a copy of csrRssiCallback to send rssi value * after wmi event */ diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index e20dac5c15da..0a1bc56861be 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -570,6 +570,7 @@ typedef struct { u_int8_t powersave_mode; v_BOOL_t ptrn_match_enable_all_vdev; void* pGetRssiReq; + v_S7_t first_rssi; t_thermal_mgmt thermal_mgmt_info; u_int32_t roam_offload_vdev_id; v_BOOL_t roam_offload_enabled; @@ -1240,7 +1241,8 @@ VOS_STATUS wma_trigger_uapsd_params(tp_wma_handle wma_handle, u_int32_t vdev_id, tp_wma_trigger_uapsd_params trigger_uapsd_params); /* added to get average snr for both data and beacon */ -VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq); +VOS_STATUS wma_send_snr_request(tp_wma_handle wma_handle, void *pGetRssiReq, + v_S7_t first_rssi); #ifdef FEATURE_WLAN_SCAN_PNO @@ -1496,4 +1498,5 @@ enum uapsd_up { UAPSD_UP_MAX }; +#define WMA_TGT_INVALID_SNR (-1) #endif -- cgit v1.2.3 From 948c13ef01704b49b4eeae1d131ae9982dd90725 Mon Sep 17 00:00:00 2001 From: vinothkumar Date: Sat, 15 Mar 2014 19:45:55 +0530 Subject: qcacld: Add ini variables to select TX or RX chain0/chain1. Add "gSetTxChainmask1x1" and "gSetRxChainmask1x1" ini variables to select tx and rx chain0/chain1 based on "gEnable2x2" ini value. If gEnable2x2 is disabled then gSetTxChainmask1x1 or gSetRxChainmask1x1 value is taken into account. If chainmask value exceeds the max number of chains supported by target then the max number of chains is used. The minimum number of chains used is one. gSetTxChainmask1x1=1 or gSetRxChainmask1x1=1 to select chain0. gSetTxChainmask1x1=2 or gSetRxChainmask1x1=2 to select chain1. By default chain0 will be selected for both tx and rx. Change-Id: Iad409f1e3f4335ed9a9871c9ef3c98028a85efed CRs-Fixed: 630874 --- CORE/HDD/inc/wlan_hdd_cfg.h | 12 ++++++++++++ CORE/HDD/src/wlan_hdd_cfg.c | 14 ++++++++++++++ CORE/HDD/src/wlan_hdd_main.c | 28 ++++++++++++++++++++++++++++ CORE/SERVICES/WMA/wma.c | 25 +++++++++++++++++++++++++ CORE/SERVICES/WMA/wma.h | 4 ++++ firmware_bin/WCNSS_qcom_cfg.ini | 8 ++++++++ 6 files changed, 91 insertions(+) diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 5f8f15056a33..7c148210b782 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -1445,6 +1445,16 @@ typedef enum #define CFG_VHT_ENABLE_GID_FEATURE_DEFAULT ( 0 ) #endif +#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK "gSetTxChainmask1x1" +#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MIN ( 1 ) +#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MAX ( 2 ) +#define CFG_VHT_ENABLE_1x1_TX_CHAINMASK_DEFAULT ( 1 ) + +#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK "gSetRxChainmask1x1" +#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MIN ( 1 ) +#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MAX ( 2 ) +#define CFG_VHT_ENABLE_1x1_RX_CHAINMASK_DEFAULT ( 1 ) + #define CFG_ENABLE_AMPDUPS_FEATURE "gEnableAMPDUPS" #define CFG_ENABLE_AMPDUPS_FEATURE_MIN ( 0 ) #define CFG_ENABLE_AMPDUPS_FEATURE_MAX ( 1 ) @@ -2616,6 +2626,8 @@ typedef struct v_U8_t vhtRxMCS2x2; v_U8_t vhtTxMCS2x2; v_BOOL_t enable2x2; + v_BOOL_t txchainmask1x1; + v_BOOL_t rxchainmask1x1; v_BOOL_t enableMuBformee; v_BOOL_t enableVhtpAid; v_BOOL_t enableVhtGid; diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 35508a2195c1..7a9a025d0c68 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -2501,6 +2501,20 @@ REG_VARIABLE( CFG_VHT_ENABLE_GID_FEATURE, WLAN_PARAM_Integer, CFG_VHT_ENABLE_GID_FEATURE_MAX ), #endif +REG_VARIABLE( CFG_VHT_ENABLE_1x1_TX_CHAINMASK, WLAN_PARAM_Integer, + hdd_config_t, txchainmask1x1, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_VHT_ENABLE_1x1_TX_CHAINMASK_DEFAULT, + CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MIN, + CFG_VHT_ENABLE_1x1_TX_CHAINMASK_MAX ), + +REG_VARIABLE( CFG_VHT_ENABLE_1x1_RX_CHAINMASK, WLAN_PARAM_Integer, + hdd_config_t, rxchainmask1x1, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_VHT_ENABLE_1x1_RX_CHAINMASK_DEFAULT, + CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MIN, + CFG_VHT_ENABLE_1x1_RX_CHAINMASK_MAX ), + REG_VARIABLE( CFG_ENABLE_AMPDUPS_FEATURE, WLAN_PARAM_Integer, hdd_config_t, enableAmpduPs, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 4f1866dea34d..2ff72334f493 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -7245,6 +7245,34 @@ hdd_adapter_t* hdd_open_adapter( hdd_context_t *pHddCtx, tANI_U8 session_type, pHddCtx->current_intf_count++; } + +#ifdef QCA_WIFI_2_0 + if (!pHddCtx->cfg_ini->enable2x2) + { + int ret; + ret = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_TX_CHAIN_MASK, + (int)pHddCtx->cfg_ini->txchainmask1x1, + PDEV_CMD); + if (ret != 0) + { + hddLog(VOS_TRACE_LEVEL_ERROR,"%s: WMI_PDEV_PARAM_TX_CHAIN_MASK set" + " failed %d", __func__, ret); + goto err_free_netdev; + } + ret = process_wma_set_command((int)pAdapter->sessionId, + (int)WMI_PDEV_PARAM_RX_CHAIN_MASK, + (int)pHddCtx->cfg_ini->rxchainmask1x1, + PDEV_CMD); + if (ret != 0) + { + hddLog(VOS_TRACE_LEVEL_ERROR,"%s: WMI_PDEV_PARAM_RX_CHAIN_MASK set" + " failed %d", __func__, ret); + goto err_free_netdev; + } + } +#endif + return pAdapter; err_free_netdev: diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index af3f6735fcc6..d6c5b9113f1a 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -7049,6 +7049,25 @@ wmi_unified_vdev_set_gtx_cfg_send(wmi_unified_t wmi_handle, u_int32_t if_id, return wmi_unified_cmd_send(wmi_handle, buf, len, WMI_VDEV_SET_GTX_PARAMS_CMDID); } +void wma_update_txrx_chainmask(int num_rf_chains, int *cmd_value) +{ + if (*cmd_value > WMA_MAX_RF_CHAINS(num_rf_chains)) { + WMA_LOGE("%s: Chainmask value exceeds the maximum" + " supported range setting it to" + " maximum value. Requested value %d" + " Updated value %d", __func__, *cmd_value, + WMA_MAX_RF_CHAINS(num_rf_chains)); + *cmd_value = WMA_MAX_RF_CHAINS(num_rf_chains); + } else if (*cmd_value < WMA_MIN_RF_CHAINS) { + WMA_LOGE("%s: Chainmask value is less than the minimum" + " supported range setting it to" + " minimum value. Requested value %d" + " Updated value %d", __func__, *cmd_value, + WMA_MIN_RF_CHAINS); + *cmd_value = WMA_MIN_RF_CHAINS; + } +} + static void wma_process_cli_set_cmd(tp_wma_handle wma, wda_cli_set_cmd_t *privcmd) { @@ -7092,6 +7111,11 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma, case PDEV_CMD: WMA_LOGD("pdev pid %d pval %d", privcmd->param_id, privcmd->param_value); + if ((privcmd->param_id == WMI_PDEV_PARAM_RX_CHAIN_MASK) || + (privcmd->param_id == WMI_PDEV_PARAM_TX_CHAIN_MASK)) { + wma_update_txrx_chainmask(wma->num_rf_chains, + &privcmd->param_value); + } ret = wmi_unified_pdev_set_param(wma->wmi_handle, privcmd->param_id, privcmd->param_value); @@ -17434,6 +17458,7 @@ v_VOID_t wma_rx_service_ready_event(WMA_HANDLE handle, void *cmd_param_info) wma_handle->phy_capability = ev->phy_capability; wma_handle->max_frag_entry = ev->max_frag_entry; + wma_handle->num_rf_chains = ev->num_rf_chains; vos_mem_copy(&wma_handle->reg_cap, param_buf->hal_reg_capabilities, sizeof(HAL_REG_CAPABILITIES)); wma_handle->ht_cap_info = ev->ht_cap_info; diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 0a1bc56861be..f1e7e74ba9a2 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -162,6 +162,10 @@ #define WMA_INVALID_KEY_IDX 0xff #define WMA_DFS_RADAR_FOUND 1 + +#define WMA_MAX_RF_CHAINS(x) ((1 << x) - 1) +#define WMA_MIN_RF_CHAINS (1) + typedef struct { HTC_ENDPOINT_ID endpoint_id; }t_cfg_nv_param; diff --git a/firmware_bin/WCNSS_qcom_cfg.ini b/firmware_bin/WCNSS_qcom_cfg.ini index 5d781979e49f..d620b70f93c2 100755 --- a/firmware_bin/WCNSS_qcom_cfg.ini +++ b/firmware_bin/WCNSS_qcom_cfg.ini @@ -384,6 +384,14 @@ gEnable2x2=1 gVhtRxMCS2x2=2 gVhtTxMCS2x2=2 +# Set txchainmask and rxchainmask +# These parameters are used only if gEnable2x2 is 0 +# Valid values are 1,2 +# Set gSetTxChainmask1x1=1 or gSetRxChainmask1x1=1 to select chain0. +# Set gSetTxChainmask1x1=2 or gSetRxChainmask1x1=2 to select chain1. +gSetTxChainmask1x1=1 +gSetRxChainmask1x1=1 + # Enable CRDA regulatory support by settings default country code #gCrdaDefaultCountryCode=TW -- cgit v1.2.3 From 9640fb6dfd1a0d4ede136d33a9efc353326991f8 Mon Sep 17 00:00:00 2001 From: Nirav Shah Date: Sun, 16 Mar 2014 13:36:02 +0530 Subject: P2P: proactive extension logic for RoC Driver will request for extended RoC and cancel it if no action packet is received and use extended RoC if negotiation is in progress. Change-Id: If3a5318979bfe4eb7441791bb09916f7f3d570b2 CRs-Fixed: 630569 --- CORE/HDD/inc/wlan_hdd_main.h | 11 +- CORE/HDD/inc/wlan_hdd_p2p.h | 1 + CORE/HDD/src/wlan_hdd_main.c | 38 +++++- CORE/HDD/src/wlan_hdd_p2p.c | 313 ++++++++++++++++++++++++++++--------------- 4 files changed, 253 insertions(+), 110 deletions(-) diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index ddc921d65974..2ff15b6f6449 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -579,6 +579,13 @@ typedef struct v_BOOL_t qBlocked; } hdd_thermal_mitigation_info_t; +typedef struct action_pkt_buffer +{ + tANI_U8* frame_ptr; + tANI_U32 frame_length; + tANI_U16 freq; +}action_pkt_buffer_t; + typedef struct hdd_remain_on_chan_ctx { struct net_device *dev; @@ -588,6 +595,8 @@ typedef struct hdd_remain_on_chan_ctx u64 cookie; rem_on_channel_request_type_t rem_on_chan_request; v_U32_t p2pRemOnChanTimeStamp; + vos_timer_t hdd_remain_on_chan_timer; + action_pkt_buffer_t action_pkt_buff; }hdd_remain_on_chan_ctx_t; typedef enum{ @@ -1036,7 +1045,6 @@ struct hdd_adapter_s v_U8_t psbChanged; /* UAPSD psb value configured through framework */ v_U8_t configuredPsb; - v_BOOL_t internalRoCinProgress; #ifdef IPA_OFFLOAD void *ipa_context; #endif @@ -1044,6 +1052,7 @@ struct hdd_adapter_s unsigned long prev_rx_packets; unsigned long prev_tx_packets; #endif + v_BOOL_t is_roc_inprogress; }; #define WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) (&(pAdapter)->sessionCtx.station) diff --git a/CORE/HDD/inc/wlan_hdd_p2p.h b/CORE/HDD/inc/wlan_hdd_p2p.h index 3337760d6627..f0cd804ac172 100644 --- a/CORE/HDD/inc/wlan_hdd_p2p.h +++ b/CORE/HDD/inc/wlan_hdd_p2p.h @@ -40,6 +40,7 @@ #define WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX 3000 #define READY_EVENT_PROPOGATE_TIME 2 #define ESTIMATED_ROC_DUR_REQD_FOR_ACTION_TX 20 +#define COMPLETE_EVENT_PROPOGATE_TIME 10 #define ACTION_FRAME_DEFAULT_WAIT 200 diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 2ff72334f493..286a82f01a0a 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -7422,6 +7422,7 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter ) eHalStatus halStatus = eHAL_STATUS_SUCCESS; hdd_wext_state_t *pWextState = WLAN_HDD_GET_WEXT_STATE_PTR(pAdapter); union iwreq_data wrqu; + v_U8_t retry = 0; ENTER(); @@ -7455,7 +7456,23 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter ) { hdd_abort_mac_scan(pHddCtx, pAdapter->sessionId); } - + if (pAdapter->device_mode != WLAN_HDD_INFRA_STATION) { + while (pAdapter->is_roc_inprogress) { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: ROC in progress for session %d!!!", + __func__, pAdapter->sessionId); + msleep(500); + if (retry++ > 3) { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: ROC completion is not received.!!!", __func__); + sme_CancelRemainOnChannel(WLAN_HDD_GET_HAL_CTX(pAdapter), + pAdapter->sessionId); + wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var, + msecs_to_jiffies(WAIT_CANCEL_REM_CHAN)); + break; + } + } + } if (test_bit(SME_SESSION_OPENED, &pAdapter->event_flags)) { INIT_COMPLETION(pAdapter->session_close_comp_var); @@ -7475,6 +7492,24 @@ VOS_STATUS hdd_stop_adapter( hdd_context_t *pHddCtx, hdd_adapter_t *pAdapter ) case WLAN_HDD_SOFTAP: case WLAN_HDD_P2P_GO: //Any softap specific cleanup here... + if (pAdapter->device_mode == WLAN_HDD_P2P_GO) { + while (pAdapter->is_roc_inprogress) { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: ROC in progress for session %d!!!", + __func__, pAdapter->sessionId); + msleep(500); + if (retry++ > 3) { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: ROC completion is not received.!!!", __func__); + WLANSAP_CancelRemainOnChannel( + (WLAN_HDD_GET_CTX(pAdapter))->pvosContext); + wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var, + msecs_to_jiffies(WAIT_CANCEL_REM_CHAN)); + break; + } + } + } + mutex_lock(&pHddCtx->sap_lock); if (test_bit(SOFTAP_BSS_STARTED, &pAdapter->event_flags)) { @@ -10352,7 +10387,6 @@ static int __init hdd_module_init ( void) } #endif /* #ifdef MODULE */ - /**--------------------------------------------------------------------------- \brief hdd_driver_exit() - Exit function diff --git a/CORE/HDD/src/wlan_hdd_p2p.c b/CORE/HDD/src/wlan_hdd_p2p.c index 533650fe433b..027d75db90ca 100644 --- a/CORE/HDD/src/wlan_hdd_p2p.c +++ b/CORE/HDD/src/wlan_hdd_p2p.c @@ -152,11 +152,12 @@ eHalStatus wlan_hdd_remain_on_channel_callback( tHalHandle hHal, void* pCtx, } hddLog( LOG1, "Received remain on channel rsp"); + vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer); + vos_timer_destroy(&pRemainChanCtx->hdd_remain_on_chan_timer); cfgState->remain_on_chan_ctx = NULL; - if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request && - (pAdapter->internalRoCinProgress == VOS_FALSE) ) + if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request) { if( cfgState->buf ) { @@ -202,8 +203,15 @@ eHalStatus wlan_hdd_remain_on_channel_callback( tHalHandle hHal, void* pCtx, NULL, 0 ); } + if(pRemainChanCtx->action_pkt_buff.frame_ptr != NULL + && pRemainChanCtx->action_pkt_buff.frame_length != 0 ) + { + vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr); + } vos_mem_free( pRemainChanCtx ); complete(&pAdapter->cancel_rem_on_chan_var); + pAdapter->is_roc_inprogress = FALSE; + hdd_allow_suspend(); return eHAL_STATUS_SUCCESS; } @@ -261,6 +269,7 @@ void wlan_hdd_cancel_existing_remain_on_channel(hdd_adapter_t *pAdapter) "%s: timeout waiting for cancel remain on channel ready indication", __func__); } + hdd_allow_suspend(); } } @@ -290,6 +299,49 @@ int wlan_hdd_check_remain_on_channel(hdd_adapter_t *pAdapter) return status; } +void wlan_hdd_remain_on_chan_timeout(void *data) +{ + hdd_adapter_t *pAdapter = (hdd_adapter_t *)data; + hdd_remain_on_chan_ctx_t *pRemainChanCtx; + hdd_cfg80211_state_t *cfgState; + + if(NULL == pAdapter) + { + hddLog( LOGE,"%s: pAdapter is NULL !!!", __func__); + return; + } + + cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter ); + pRemainChanCtx = cfgState->remain_on_chan_ctx; + + if(NULL == pRemainChanCtx) + { + hddLog( LOGE,"%s: No Remain on channel is pending", __func__); + return; + } + + hddLog( LOG1,"%s: Cancel Remain on Channel on timeout", __func__); + + if ( ( WLAN_HDD_INFRA_STATION == pAdapter->device_mode ) || + ( WLAN_HDD_P2P_CLIENT == pAdapter->device_mode ) || + ( WLAN_HDD_P2P_DEVICE == pAdapter->device_mode ) + ) + { + sme_CancelRemainOnChannel( WLAN_HDD_GET_HAL_CTX( pAdapter ), + pAdapter->sessionId ); + } + else if ( (WLAN_HDD_SOFTAP== pAdapter->device_mode) || + (WLAN_HDD_P2P_GO == pAdapter->device_mode) + ) + { + WLANSAP_CancelRemainOnChannel( + (WLAN_HDD_GET_CTX(pAdapter))->pvosContext); + } + + hdd_allow_suspend(); + +} + static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, struct net_device *dev, struct ieee80211_channel *chan, @@ -302,6 +354,13 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev); hdd_remain_on_chan_ctx_t *pRemainChanCtx; hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter ); + VOS_STATUS vos_status = VOS_STATUS_E_FAILURE; + hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX( pAdapter ); + hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL; + hdd_adapter_t *pAdapter_temp; + VOS_STATUS status; + v_BOOL_t isGoPresent = VOS_FALSE; + hddLog(VOS_TRACE_LEVEL_INFO, "%s: device_mode = %d", __func__,pAdapter->device_mode); @@ -359,6 +418,41 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, cfgState->remain_on_chan_ctx = pRemainChanCtx; cfgState->current_freq = chan->center_freq; + pRemainChanCtx->action_pkt_buff.freq = 0; + pRemainChanCtx->action_pkt_buff.frame_ptr = NULL; + pRemainChanCtx->action_pkt_buff.frame_length = 0; + + /* Initialize Remain on chan timer */ + vos_status = vos_timer_init(&pRemainChanCtx->hdd_remain_on_chan_timer, + VOS_TIMER_TYPE_SW, + wlan_hdd_remain_on_chan_timeout, + pAdapter); + if (vos_status != VOS_STATUS_SUCCESS) + { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: Not able to initalize remain_on_chan timer",__func__); + } + + status = hdd_get_front_adapter ( pHddCtx, &pAdapterNode ); + while ( NULL != pAdapterNode && VOS_STATUS_SUCCESS == status ) + { + pAdapter_temp = pAdapterNode->pAdapter; + if(pAdapter_temp->device_mode == WLAN_HDD_P2P_GO) + { + isGoPresent = VOS_TRUE; + } + status = hdd_get_next_adapter ( pHddCtx, pAdapterNode, &pNext ); + pAdapterNode = pNext; + } + + //Extending duration for proactive extension logic for RoC + if (isGoPresent == VOS_TRUE) + duration = 3 * duration; + else + duration = 5 * duration; + + + hdd_prevent_suspend(); INIT_COMPLETION(pAdapter->rem_on_chan_ready_event); //call sme API to start remain on channel. @@ -369,6 +463,7 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, { tANI_U8 sessionId = pAdapter->sessionId; //call sme API to start remain on channel. + sme_RemainOnChannel( WLAN_HDD_GET_HAL_CTX(pAdapter), sessionId, chan->hw_value, duration, @@ -398,6 +493,7 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, "%s: WLANSAP_RemainOnChannel returned fail", __func__); cfgState->remain_on_chan_ctx = NULL; vos_mem_free (pRemainChanCtx); + hdd_allow_suspend(); return -EINVAL; } @@ -411,10 +507,12 @@ static int wlan_hdd_request_remain_on_channel( struct wiphy *wiphy, "%s: WLANSAP_RegisterMgmtFrame returned fail", __func__); WLANSAP_CancelRemainOnChannel( (WLAN_HDD_GET_CTX(pAdapter))->pvosContext); + hdd_allow_suspend(); return -EINVAL; } } + pAdapter->is_roc_inprogress = TRUE; return 0; } @@ -447,6 +545,7 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter ) { hdd_cfg80211_state_t *cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter ); hdd_remain_on_chan_ctx_t* pRemainChanCtx = cfgState->remain_on_chan_ctx; + VOS_STATUS status; hddLog( LOG1, "Ready on chan ind"); @@ -457,8 +556,15 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter ) pRemainChanCtx->p2pRemOnChanTimeStamp = vos_timer_get_system_time() - READY_EVENT_PROPOGATE_TIME; - if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request - && (pAdapter->internalRoCinProgress == VOS_FALSE) ) + //start timer for actual duration + status = vos_timer_start(&pRemainChanCtx->hdd_remain_on_chan_timer, + (pRemainChanCtx->duration + COMPLETE_EVENT_PROPOGATE_TIME)); + if (status != VOS_STATUS_SUCCESS) + { + hddLog( LOGE, "Remain on Channel timer start failed"); + } + + if( REMAIN_ON_CHANNEL_REQUEST == pRemainChanCtx->rem_on_chan_request) { cfg80211_ready_on_channel( #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) @@ -474,12 +580,39 @@ void hdd_remainChanReadyHandler( hdd_adapter_t *pAdapter ) pRemainChanCtx->duration, GFP_KERNEL ); } #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,38)) - else if( OFF_CHANNEL_ACTION_TX == pRemainChanCtx->rem_on_chan_request - || (pAdapter->internalRoCinProgress == VOS_TRUE)) + else if( OFF_CHANNEL_ACTION_TX == pRemainChanCtx->rem_on_chan_request) { complete(&pAdapter->offchannel_tx_event); } #endif + + // Check for cached action frame + if(pRemainChanCtx->action_pkt_buff.frame_length != 0) + { + +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) + cfg80211_rx_mgmt( pAdapter->dev->ieee80211_ptr,pRemainChanCtx->action_pkt_buff.freq, 0, + pRemainChanCtx->action_pkt_buff.frame_ptr, + pRemainChanCtx->action_pkt_buff.frame_length, + GFP_ATOMIC ); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0)) + cfg80211_rx_mgmt( pAdapter->dev, pRemainChanCtx->action_pkt_buff.freq, 0, + pRemainChanCtx->action_pkt_buff.frame_ptr, + pRemainChanCtx->action_pkt_buff.frame_length, + GFP_ATOMIC ); +#else + cfg80211_rx_mgmt( pAdapter->dev, pRemainChanCtx->action_pkt_buff.freq, + pRemainChanCtx->action_pkt_buff.frame_ptr, + pRemainChanCtx->action_pkt_buff.frame_length, + GFP_ATOMIC ); +#endif //LINUX_VERSION_CODE + + hddLog( LOGE,"%s: Sent cached action frame to supplicant", __func__); + vos_mem_free(pRemainChanCtx->action_pkt_buff.frame_ptr); + pRemainChanCtx->action_pkt_buff.frame_length = 0; + pRemainChanCtx->action_pkt_buff.freq = 0; + pRemainChanCtx->action_pkt_buff.frame_ptr = NULL; + } complete(&pAdapter->rem_on_chan_ready_event); } else @@ -566,6 +699,7 @@ int wlan_hdd_cfg80211_cancel_remain_on_channel( struct wiphy *wiphy, } wait_for_completion_interruptible_timeout(&pAdapter->cancel_rem_on_chan_var, msecs_to_jiffies(WAIT_CANCEL_REM_CHAN)); + hdd_allow_suspend(); return 0; } @@ -746,60 +880,28 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev, if( offchan && wait) { int status; - hdd_remain_on_chan_ctx_t old_roc_ctx; rem_on_channel_request_type_t req_type = OFF_CHANNEL_ACTION_TX; // In case of P2P Client mode if we are already // on the same channel then send the frame directly - //For remain on channel we issue a passive scan to firmware - //but currently there is no provision for dynamically extending - //the dwell time therefore cancelling the ongoing remain on channel - //and requesting for new one. - //The below logic will be extended for request type action frames if - //needed in future. if ((type == SIR_MAC_MGMT_FRAME) && - (subType == SIR_MAC_MGMT_ACTION) && - hdd_p2p_is_action_type_rsp(&buf[WLAN_HDD_PUBLIC_ACTION_FRAME_BODY_OFFSET]) && - cfgState->remain_on_chan_ctx && - cfgState->current_freq == chan->center_freq ) { - - tANI_U32 current_time = vos_timer_get_system_time(); - - // In case of P2P Client mode if we are already - // on the same channel then send the frame directly only if - // there is enough remain on channel time left. - // If remain on channel time is about to expire in next 20ms - // then dont send frame without a fresh remain on channel as this - // may cause a race condition with lim remain_on_channel_timer - // which might expire by the time the action frame reaches lim - // layer. - // For Rome check remaining time of RoC only in case of GO NEG CNF. - // For other RSPs always extend - actionFrmType = buf[WLAN_HDD_PUBLIC_ACTION_FRAME_TYPE_OFFSET]; - - if ( -#if defined (QCA_WIFI_2_0) && !defined (QCA_WIFI_ISOC) - (actionFrmType != WLAN_HDD_GO_NEG_CNF) || -#endif - ((int)(cfgState->remain_on_chan_ctx->duration - - (current_time - - cfgState->remain_on_chan_ctx->p2pRemOnChanTimeStamp)) < - ESTIMATED_ROC_DUR_REQD_FOR_ACTION_TX)) - { - hddLog(LOG1,"action frame: Extending the RoC"); - pAdapter->internalRoCinProgress = VOS_TRUE; - // saved old RoC Context - vos_mem_copy(&old_roc_ctx,cfgState->remain_on_chan_ctx, - sizeof(hdd_remain_on_chan_ctx_t)); - status = wlan_hdd_check_remain_on_channel(pAdapter); - if ( status ) - { - VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, - "Failed to cancel the existing RoC"); - pAdapter->internalRoCinProgress = VOS_FALSE; - } - } - } + (subType == SIR_MAC_MGMT_ACTION) && + hdd_p2p_is_action_type_rsp(&buf[WLAN_HDD_PUBLIC_ACTION_FRAME_BODY_OFFSET]) && + cfgState->remain_on_chan_ctx && + cfgState->current_freq == chan->center_freq ) + { + if(wait) + { + vos_timer_stop(&cfgState->remain_on_chan_ctx->hdd_remain_on_chan_timer); + status = vos_timer_start(&cfgState->remain_on_chan_ctx->hdd_remain_on_chan_timer, + wait); + if(status != VOS_STATUS_SUCCESS) + { + hddLog( LOGE, "Remain on Channel timer start failed"); + } + } + goto send_frame; + } if((cfgState->remain_on_chan_ctx != NULL) && (cfgState->current_freq == chan->center_freq) @@ -811,9 +913,6 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev, } INIT_COMPLETION(pAdapter->offchannel_tx_event); - // Restore request type if it is internal RoC. - if(pAdapter->internalRoCinProgress == VOS_TRUE) - req_type = old_roc_ctx.rem_on_chan_request; status = wlan_hdd_request_remain_on_channel(wiphy, dev, chan, @@ -822,35 +921,8 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev, #endif wait, cookie, req_type); - - // Assign the preserved cookie value here to appear as - // same RoC to supplicant - if (cfgState->remain_on_chan_ctx && - (pAdapter->internalRoCinProgress == VOS_TRUE)) - cfgState->remain_on_chan_ctx->cookie = old_roc_ctx.cookie; - if(0 != status) { - // If new RoC request fails then indicate complete RoC - // to supplicant if internalRoCinProgress using old RoC Context - if(pAdapter->internalRoCinProgress == VOS_TRUE) - { - hddLog( LOGE, "Indicate Complete RoC to supplicant for" - "cookie %llu",old_roc_ctx.cookie); - cfg80211_remain_on_channel_expired( -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - old_roc_ctx.dev->ieee80211_ptr, -#else - old_roc_ctx.dev, -#endif - old_roc_ctx.cookie, - &old_roc_ctx.chan, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - old_roc_ctx.chan_type, -#endif - GFP_KERNEL); - pAdapter->internalRoCinProgress = VOS_FALSE; - } if( (-EBUSY == status) && (cfgState->current_freq == chan->center_freq) ) { @@ -869,32 +941,10 @@ int wlan_hdd_action( struct wiphy *wiphy, struct net_device *dev, msecs_to_jiffies(WAIT_CHANGE_CHANNEL_FOR_OFFCHANNEL_TX)); if(!status) { - // If Ready indication timeout occuers then indicate complete - // RoC to supplicant is internalRoCin Progress is set - if(cfgState->remain_on_chan_ctx && - (pAdapter->internalRoCinProgress == VOS_TRUE)) - { - hddLog( LOGE, "Indicate Complete RoC to supplicant for" - "cookie %llu Timeout",cfgState->remain_on_chan_ctx->cookie); - cfg80211_remain_on_channel_expired( -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,6,0)) - cfgState->remain_on_chan_ctx->dev->ieee80211_ptr, -#else - cfgState->remain_on_chan_ctx->dev, -#endif - cfgState->remain_on_chan_ctx->cookie, - &cfgState->remain_on_chan_ctx->chan, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3,8,0)) - cfgState->remain_on_chan_ctx->chan_type, -#endif - GFP_KERNEL); - pAdapter->internalRoCinProgress = VOS_FALSE; - } hddLog( LOGE, "Not able to complete remain on channel request" " within timeout period"); goto err_rem_channel; } - pAdapter->internalRoCinProgress = VOS_FALSE; } else if ( offchan ) { @@ -1531,10 +1581,13 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter, tANI_S8 rxRssi ) { tANI_U16 freq; + tANI_U16 extend_time; tANI_U8 type = 0; tANI_U8 subType = 0; tActionFrmType actionFrmType; hdd_cfg80211_state_t *cfgState = NULL; + VOS_STATUS status; + hdd_remain_on_chan_ctx_t* pRemainChanCtx = NULL; hddLog(VOS_TRACE_LEVEL_INFO, "%s: Frame Type = %d Frame Length = %d\n", __func__, frameType, nFrameLength); @@ -1622,6 +1675,7 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter, } cfgState = WLAN_HDD_GET_CFG_STATE_PTR( pAdapter ); + pRemainChanCtx = cfgState->remain_on_chan_ctx; if ((type == SIR_MAC_MGMT_FRAME) && (subType == SIR_MAC_MGMT_ACTION)) @@ -1668,6 +1722,51 @@ void hdd_indicateMgmtFrame( hdd_adapter_t *pAdapter, } } #endif + if (pRemainChanCtx != NULL) + { + if(actionFrmType == WLAN_HDD_GO_NEG_REQ || + actionFrmType == WLAN_HDD_GO_NEG_RESP || + actionFrmType == WLAN_HDD_INVITATION_REQ || + actionFrmType == WLAN_HDD_DEV_DIS_REQ || + actionFrmType == WLAN_HDD_PROV_DIS_REQ ) + { + hddLog( LOG1, "Extend RoC timer on reception of Action Frame"); + + if ((actionFrmType == WLAN_HDD_GO_NEG_REQ) + || (actionFrmType == WLAN_HDD_GO_NEG_RESP)) + extend_time = 2 * ACTION_FRAME_DEFAULT_WAIT; + else + extend_time = ACTION_FRAME_DEFAULT_WAIT; + + if(completion_done(&pAdapter->rem_on_chan_ready_event)) + { + vos_timer_stop(&pRemainChanCtx->hdd_remain_on_chan_timer); + status = vos_timer_start(&pRemainChanCtx->hdd_remain_on_chan_timer, + extend_time); + if (status != VOS_STATUS_SUCCESS) + { + hddLog( LOGE, "Remain on Channel timer start failed"); + } + } else { + // Buffer Packet + if(pRemainChanCtx->action_pkt_buff.frame_length == 0) + { + pRemainChanCtx->action_pkt_buff.frame_length = nFrameLength; + pRemainChanCtx->action_pkt_buff.freq = freq; + pRemainChanCtx->action_pkt_buff.frame_ptr + = vos_mem_malloc(nFrameLength); + vos_mem_copy(pRemainChanCtx->action_pkt_buff.frame_ptr, + pbFrames, nFrameLength); + hddLog( LOGE,"%s:" + "Action Pkt Cached successfully !!!", __func__); + } else { + hddLog( LOGE,"%s:" + "Frames are pending. dropping frame !!!", __func__); + } + return; + } + } + } if (((actionFrmType == WLAN_HDD_PROV_DIS_RESP) && (cfgState->actionFrmState == HDD_PD_REQ_ACK_PENDING)) || -- cgit v1.2.3 From 2a4110ef31ff21eea22cb5ac467c1d0e5c69cd8c Mon Sep 17 00:00:00 2001 From: Leo Chang Date: Wed, 19 Mar 2014 13:21:05 -0700 Subject: qca-cld: Add TX flow control feature STA mode Add TX flow control feature STA mode STA mode will do TX flow control. Flow control trigger threshold can be configured through new config item. Flow control threshold values are separated with STA mode and IBSS mode Flow control logic clean up also included Change-Id: Ibc128a99ece65e453072bde0ab72fe263ea95730 CRs-fixed: 632262 --- CORE/CLD_TXRX/TLSHIM/tl_shim.c | 24 +++++++++++--------- CORE/CLD_TXRX/TXRX/ol_tx_send.c | 40 ++++++++++++++++++++------------- CORE/CLD_TXRX/TXRX/ol_txrx.c | 19 +++++++++------- CORE/CLD_TXRX/TXRX/ol_txrx_internal.h | 7 ------ CORE/CLD_TXRX/TXRX/ol_txrx_types.h | 10 ++++----- CORE/HDD/inc/wlan_hdd_cfg.h | 27 ++++++++++++++++++++++ CORE/HDD/inc/wlan_hdd_tx_rx.h | 4 ++-- CORE/HDD/src/wlan_hdd_cfg.c | 30 +++++++++++++++++++++++++ CORE/HDD/src/wlan_hdd_tx_rx.c | 40 +++++++++++++++++++++++++-------- CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h | 10 ++++++++- CORE/SERVICES/COMMON/ol_txrx_osif_api.h | 14 ++++++------ CORE/TL/inc/wlan_qct_tl.h | 6 ++++- 12 files changed, 165 insertions(+), 66 deletions(-) diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c index a337e39df84e..d13287ebb76c 100644 --- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c +++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c @@ -1779,7 +1779,9 @@ void *tl_shim_get_vdev_by_sta_id(void *vos_context, uint8_t sta_id) v_BOOL_t WLANTL_GetTxResource ( void *vos_context, - uint8_t sta_id + uint8_t sta_id, + unsigned int low_watermark, + unsigned int high_watermark_offset ) { struct ol_txrx_peer_t *peer = NULL; @@ -1795,7 +1797,9 @@ v_BOOL_t WLANTL_GetTxResource return VOS_TRUE; } - return (v_BOOL_t)wdi_in_get_tx_resource(peer->vdev); + return (v_BOOL_t)wdi_in_get_tx_resource(peer->vdev, + low_watermark, + high_watermark_offset); } /*============================================================================= @@ -1821,29 +1825,27 @@ v_BOOL_t WLANTL_GetTxResource void WLANTL_TXFlowControlCb ( void *tlContext, + v_U8_t peer_idx, v_U8_t sessionId, v_BOOL_t resume_tx ) { struct txrx_tl_shim_ctx *tl_shim; - v_U8_t sta_loop; WLANTL_TxFlowControlCBType flow_control_cb = NULL; void *adpter_ctxt = NULL; tl_shim = (struct txrx_tl_shim_ctx *)tlContext; if (!tl_shim) { + TLSHIM_LOGE("%s, tl_shim is NULL", __func__); /* Invalid instace */ return; } - for (sta_loop = 0; sta_loop < WLAN_MAX_STA_COUNT; sta_loop++) { - if ((tl_shim->sta_info[sta_loop].sessionId == sessionId) && - (tl_shim->sta_info[sta_loop].flowControl)) - { - flow_control_cb = tl_shim->sta_info[sta_loop].flowControl; - adpter_ctxt = tl_shim->sta_info[sta_loop].adpaterCtxt; - break; - } + if ((peer_idx < WLAN_MAX_STA_COUNT) && + (tl_shim->sta_info[peer_idx].sessionId == sessionId) && + (tl_shim->sta_info[peer_idx].flowControl)) { + flow_control_cb = tl_shim->sta_info[peer_idx].flowControl; + adpter_ctxt = tl_shim->sta_info[peer_idx].adpaterCtxt; } if ((flow_control_cb) && (adpter_ctxt)) { diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c index 24337792928a..8825a83a5257 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -109,6 +109,28 @@ #define OL_TX_TARGET_CREDIT_INCR_INT(pdev, delta) /* no-op */ #endif +#ifdef QCA_LL_TX_FLOW_CT +#define OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev) \ +do { \ + struct ol_txrx_vdev_t *vdev; \ + TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { \ + if (adf_os_atomic_read(&vdev->os_q_paused)) { \ + adf_os_spin_lock(&pdev->tx_mutex); \ + if (pdev->tx_desc.num_free > vdev->tx_fl_hwm) { \ + vdev->osif_flow_control_cb(vdev->osif_dev, \ + vdev->last_real_peer->local_id, \ + vdev->vdev_id, A_TRUE); \ + adf_os_atomic_set(&vdev->os_q_paused, 0); \ + } \ + adf_os_spin_unlock(&pdev->tx_mutex); \ + } \ + } \ +} while(0) +#else +#define OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev) +#endif /* QCA_LL_TX_FLOW_CT */ + + static inline u_int16_t ol_tx_send_base( struct ol_txrx_pdev_t *pdev, @@ -456,7 +478,6 @@ ol_tx_completion_handler( u_int16_t tx_desc_id; struct ol_tx_desc_t *tx_desc; char *trace_str; - struct ol_txrx_vdev_t *vdev; uint32_t byte_cnt = 0; union ol_tx_desc_list_elem_t *td_array = pdev->tx_desc.array; @@ -518,19 +539,8 @@ ol_tx_completion_handler( OL_TX_TARGET_CREDIT_ADJUST(num_msdus, pdev, NULL); } -#ifdef QCA_LL_TX_FLOW_CT - adf_os_spin_lock(&pdev->tx_mutex); - TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) - { - if (vdev->os_q_paused && - (pdev->tx_desc.num_free > TXRX_LL_FLOW_CT_FREE_D_HWM)) { - vdev->osif_flow_control_cb(vdev->osif_dev, vdev->vdev_id, A_TRUE); - vdev->os_q_paused = A_FALSE; - } - } - adf_os_spin_unlock(&pdev->tx_mutex); -#endif /* QCA_LL_TX_FLOW_CT */ - + /* UNPAUSE OS Q */ + OL_TX_FLOW_CT_UNPAUSE_OS_Q(pdev); /* Do one shot statistics */ TXRX_STATS_UPDATE_TX_STATS(pdev, status, num_msdus, byte_cnt); } diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx.c b/CORE/CLD_TXRX/TXRX/ol_txrx.c index a5acafe26aa6..b104633cf8a9 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx.c +++ b/CORE/CLD_TXRX/TXRX/ol_txrx.c @@ -838,11 +838,11 @@ ol_txrx_vdev_attach( &vdev->ll_pause.timer, ol_tx_vdev_ll_pause_queue_send, vdev); - -#ifdef QCA_LL_TX_FLOW_CT - vdev->os_q_paused = A_FALSE; + adf_os_atomic_init(&vdev->os_q_paused); + adf_os_atomic_set(&vdev->os_q_paused, 0); + vdev->tx_fl_lwm = 0; + vdev->tx_fl_hwm = 0; vdev->osif_flow_control_cb = NULL; -#endif /* QCA_LL_TX_FLOW_CT */ /* add this vdev into the pdev's list */ TAILQ_INSERT_TAIL(&pdev->vdev_list, vdev, vdev_list_elem); @@ -1957,14 +1957,17 @@ ol_vdev_rx_set_intrabss_fwd( #ifdef QCA_LL_TX_FLOW_CT a_bool_t ol_txrx_get_tx_resource( - ol_txrx_vdev_handle vdev + ol_txrx_vdev_handle vdev, + unsigned int low_watermark, + unsigned int high_watermark_offset ) { adf_os_spin_lock_bh(&vdev->pdev->tx_mutex); - if ((vdev->pdev->tx_desc.num_free) < - TXRX_LL_FLOW_CT_FREE_D_LWM) { + if (vdev->pdev->tx_desc.num_free < (u_int16_t)low_watermark) { + vdev->tx_fl_lwm = (u_int16_t)low_watermark; + vdev->tx_fl_hwm = (u_int16_t)(low_watermark + high_watermark_offset); /* Not enough free resource, stop TX OS Q */ - vdev->os_q_paused = A_TRUE; + adf_os_atomic_set(&vdev->os_q_paused, 1); adf_os_spin_unlock_bh(&vdev->pdev->tx_mutex); return A_FALSE; } diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h b/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h index 43894a50fece..6b8a6f6b85fa 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h +++ b/CORE/CLD_TXRX/TXRX/ol_txrx_internal.h @@ -667,11 +667,4 @@ do { #define QCA_SUPPORT_TXRX_VDEV_LL_TXQ #endif -#ifdef QCA_LL_TX_FLOW_CT -#define TXRX_LL_FLOW_CT_FREE_Q_LWM 100 -#define TXRX_LL_FLOW_CT_FREE_Q_HWM 300 -#define TXRX_LL_FLOW_CT_FREE_D_LWM 500 -#define TXRX_LL_FLOW_CT_FREE_D_HWM 550 -#endif /* QCA_LL_TX_FLOW_CT */ - #endif /* _OL_TXRX_INTERNAL__H_ */ diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h index 66cf4a31576e..bee76236be29 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h +++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -754,10 +754,10 @@ struct ol_txrx_vdev_t { adf_os_timer_t timer; } ll_pause; a_bool_t disable_intrabss_fwd; -#ifdef QCA_LL_TX_FLOW_CT - a_bool_t os_q_paused; - ol_txrx_tx_fc_fp osif_flow_control_cb; -#endif /* QCA_LL_TX_FLOW_CT */ + adf_os_atomic_t os_q_paused; + u_int16_t tx_fl_lwm; + u_int16_t tx_fl_hwm; + ol_txrx_tx_flow_control_fp osif_flow_control_cb; }; struct ol_rx_reorder_array_elem_t { diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 7c148210b782..15b81987f7ea 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -2282,6 +2282,27 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */ #define CFG_SET_TXPOWER_LIMIT5G_MAX ( 30 ) #define CFG_SET_TXPOWER_LIMIT5G_DEFAULT ( 15 ) +#ifdef QCA_LL_TX_FLOW_CT +#define CFG_LL_TX_STA_FLOW_LWM "TxStaFlowLowWaterMark" +#define CFG_LL_TX_STA_FLOW_LWM_MIN ( 0 ) +#define CFG_LL_TX_STA_FLOW_LWM_MAX ( 1000 ) +#define CFG_LL_TX_STA_FLOW_LWM_DEFAULT ( 406 ) + +#define CFG_LL_TX_STA_FLOW_HWM_OFFSET "TxStaFlowHighWaterMarkOffset" +#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_MIN ( 0 ) +#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_MAX ( 300 ) +#define CFG_LL_TX_STA_FLOW_HWM_OFFSET_DEFAULT ( 50 ) + +#define CFG_LL_TX_IBSS_FLOW_LWM "TxIbssFlowLowWaterMark" +#define CFG_LL_TX_IBSS_FLOW_LWM_MIN ( 0 ) +#define CFG_LL_TX_IBSS_FLOW_LWM_MAX ( 1000 ) +#define CFG_LL_TX_IBSS_FLOW_LWM_DEFAULT ( 550 ) + +#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET "TxIbssFlowHighWaterMarkOffset" +#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MIN ( 0 ) +#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MAX ( 300 ) +#define CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_DEFAULT ( 50 ) +#endif /* QCA_LL_TX_FLOW_CT */ /*--------------------------------------------------------------------------- Type declarations -------------------------------------------------------------------------*/ @@ -2756,6 +2777,12 @@ typedef struct char acsAllowedChnls[CFG_MAX_STR_LEN]; v_BOOL_t fRegChangeDefCountry; v_U8_t acsScanBandPreference; +#ifdef QCA_LL_TX_FLOW_CT + v_U32_t TxStaFlowLowWaterMark; + v_U32_t TxStaFlowHighWaterMarkOffset; + v_U32_t TxIbssFlowLowWaterMark; + v_U32_t TxIbssFlowHighWaterMarkOffset; +#endif /* QCA_LL_TX_FLOW_CT */ } hdd_config_t; /*--------------------------------------------------------------------------- Function declarations and documenation diff --git a/CORE/HDD/inc/wlan_hdd_tx_rx.h b/CORE/HDD/inc/wlan_hdd_tx_rx.h index 96377948a27f..1a7674f9821a 100644 --- a/CORE/HDD/inc/wlan_hdd_tx_rx.h +++ b/CORE/HDD/inc/wlan_hdd_tx_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -321,6 +321,6 @@ void hdd_wmm_acquire_access_required(hdd_adapter_t *pAdapter, @return : NONE ===========================================================================*/ void hdd_tx_resume_cb(void *adapter_context, - v_U8_t tx_resume); + v_BOOL_t tx_resume); #endif /* QCA_LL_TX_FLOW_CT */ #endif // end #if !defined( WLAN_HDD_TX_RX_H ) diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index 7a9a025d0c68..5ae8a6dd790f 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -3207,6 +3207,36 @@ REG_VARIABLE( CFG_SAP_SCAN_BAND_PREFERENCE, WLAN_PARAM_Integer, CFG_SAP_SCAN_BAND_PREFERENCE_DEFAULT, CFG_SAP_SCAN_BAND_PREFERENCE_MIN, CFG_SAP_SCAN_BAND_PREFERENCE_MAX ), + +#ifdef QCA_LL_TX_FLOW_CT +REG_VARIABLE( CFG_LL_TX_STA_FLOW_LWM, WLAN_PARAM_Integer, + hdd_config_t, TxStaFlowLowWaterMark, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_LL_TX_STA_FLOW_LWM_DEFAULT, + CFG_LL_TX_STA_FLOW_LWM_MIN, + CFG_LL_TX_STA_FLOW_LWM_MAX ), + +REG_VARIABLE( CFG_LL_TX_STA_FLOW_HWM_OFFSET, WLAN_PARAM_Integer, + hdd_config_t, TxStaFlowHighWaterMarkOffset, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_LL_TX_STA_FLOW_HWM_OFFSET_DEFAULT, + CFG_LL_TX_STA_FLOW_HWM_OFFSET_MIN, + CFG_LL_TX_STA_FLOW_HWM_OFFSET_MAX ), + +REG_VARIABLE( CFG_LL_TX_IBSS_FLOW_LWM, WLAN_PARAM_Integer, + hdd_config_t, TxIbssFlowLowWaterMark, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_LL_TX_IBSS_FLOW_LWM_DEFAULT, + CFG_LL_TX_IBSS_FLOW_LWM_MIN, + CFG_LL_TX_IBSS_FLOW_LWM_MAX ), + +REG_VARIABLE( CFG_LL_TX_IBSS_FLOW_HWM_OFFSET, WLAN_PARAM_Integer, + hdd_config_t, TxIbssFlowHighWaterMarkOffset, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_DEFAULT, + CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MIN, + CFG_LL_TX_IBSS_FLOW_HWM_OFFSET_MAX ), +#endif /* QCA_LL_TX_FLOW_CT */ }; /* diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index 7633775a4cbc..fcc702c540a1 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -820,7 +820,7 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) @return : NONE ===========================================================================*/ void hdd_tx_resume_cb(void *adapter_context, - v_U8_t tx_resume) + v_BOOL_t tx_resume) { hdd_adapter_t *pAdapter = (hdd_adapter_t *)adapter_context; @@ -860,11 +860,19 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) v_U8_t STAId = WLAN_MAX_STA_COUNT; hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station; +#if defined(QCA_PKT_PROTO_TRACE) || defined (QCA_LL_TX_FLOW_CT) + hdd_context_t *hddCtxt = WLAN_HDD_GET_CTX(pAdapter); +#endif /* defined(QCA_PKT_PROTO_TRACE) || defined (QCA_LL_TX_FLOW_CT) */ + #ifdef QCA_PKT_PROTO_TRACE - hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx; v_U8_t proto_type = 0; #endif /* QCA_PKT_PROTO_TRACE */ +#ifdef QCA_LL_TX_FLOW_CT + unsigned int low_watermark; + unsigned int high_watermark_offset; +#endif /* QCA_LL_TX_FLOW_CT */ + #ifdef QCA_WIFI_FTM if (hdd_get_conparam() == VOS_FTM_MODE) { kfree_skb(skb); @@ -898,19 +906,33 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) return NETDEV_TX_OK; } #ifdef QCA_LL_TX_FLOW_CT - if(VOS_FALSE == WLANTL_GetTxResource((WLAN_HDD_GET_CTX(pAdapter))->pvosContext, - STAId)) - { - VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_DEBUG, - "%s: Out of TX resource, stop Q", __func__); - netif_tx_stop_all_queues(dev); - } + low_watermark = hddCtxt->cfg_ini->TxIbssFlowLowWaterMark; + high_watermark_offset = hddCtxt->cfg_ini->TxIbssFlowHighWaterMarkOffset; #endif /* QCA_LL_TX_FLOW_CT */ } else { STAId = pHddStaCtx->conn_info.staId[0]; +#ifdef QCA_LL_TX_FLOW_CT + low_watermark = hddCtxt->cfg_ini->TxStaFlowLowWaterMark; + high_watermark_offset = hddCtxt->cfg_ini->TxStaFlowHighWaterMarkOffset; +#endif /* QCA_LL_TX_FLOW_CT */ } + +#ifdef QCA_LL_TX_FLOW_CT + if (VOS_FALSE == WLANTL_GetTxResource((WLAN_HDD_GET_CTX(pAdapter))->pvosContext, + STAId, + low_watermark, + high_watermark_offset)) + { + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN, + "%s: Out of TX resource, stop Q, LWM %d, HWM %d, dev 0x%x", + __func__, low_watermark, + (low_watermark + high_watermark_offset), (unsigned int)dev); + netif_tx_stop_all_queues(dev); + } +#endif /* QCA_LL_TX_FLOW_CT */ + //Get TL AC corresponding to Qdisc queue index/AC. ac = hdd_QdiscAcToTlAC[skb->queue_mapping]; diff --git a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h index 22ada2a448b9..d3642544222f 100644 --- a/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h +++ b/CORE/SERVICES/COMMON/ol_txrx_ctrl_api.h @@ -1004,10 +1004,18 @@ void ol_vdev_rx_set_intrabss_fwd(ol_txrx_vdev_handle vdev, a_bool_t val); * OS IF will query TX resource status to decide back pressuring or not * * @param vdev - the virtual device + * @param low_watermark - low free descriptor count to pause os tx q + * @param high_watermark_offset - high free descriptor count to resume os tx q + * offset value from low watermark. + * high watermark = low watermark + high_watermark_offset + * @return boolean- true if tx data path has enough resource + false if tx data path does not have enough resource */ a_bool_t ol_txrx_get_tx_resource( - ol_txrx_vdev_handle vdev + ol_txrx_vdev_handle vdev, + unsigned int low_watermark, + unsigned int high_watermark_offset ); #endif /* QCA_LL_TX_FLOW_CT */ diff --git a/CORE/SERVICES/COMMON/ol_txrx_osif_api.h b/CORE/SERVICES/COMMON/ol_txrx_osif_api.h index 5e7c102cacee..e3c1b3d1f6d6 100644 --- a/CORE/SERVICES/COMMON/ol_txrx_osif_api.h +++ b/CORE/SERVICES/COMMON/ol_txrx_osif_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012 The Linux Foundation. All rights reserved. + * Copyright (c) 2012, 2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -93,10 +93,12 @@ typedef void (*ol_txrx_rx_fp)(void *osif_dev, adf_nbuf_t msdus); * @typedef ol_txrx_tx_fc_fp * @brief tx flow control notification function from txrx to OS shim * @param osif_dev - the virtual device's OS shim object + * @param peer_id - peer id belongs to virtual device * @param vdev_id - virtual device id * @param tx_resume - tx os q should be resumed or not */ -typedef void (*ol_txrx_tx_fc_fp)(void *osif_dev, u_int8_t vdev_id, a_bool_t tx_resume); +typedef void (*ol_txrx_tx_flow_control_fp)(void *osif_dev, u_int8_t peer_id, + u_int8_t vdev_id, a_bool_t tx_resume); /** * @typedef ol_txrx_rx_fp @@ -106,11 +108,9 @@ typedef void (*ol_txrx_tx_fc_fp)(void *osif_dev, u_int8_t vdev_id, a_bool_t tx_r struct ol_txrx_osif_ops { /* tx function pointers - specified by txrx, stored by OS shim */ struct { - ol_txrx_tx_fp std; - ol_txrx_tx_non_std_fp non_std; -#ifdef QCA_LL_TX_FLOW_CT - ol_txrx_tx_fc_fp flow_control_cb; -#endif /* QCA_LL_TX_FLOW_CT */ + ol_txrx_tx_fp std; + ol_txrx_tx_non_std_fp non_std; + ol_txrx_tx_flow_control_fp flow_control_cb; } tx; /* rx function pointers - specified by OS shim, stored by txrx */ diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h index a23ba91ca460..bb09685b8321 100644 --- a/CORE/TL/inc/wlan_qct_tl.h +++ b/CORE/TL/inc/wlan_qct_tl.h @@ -3045,7 +3045,9 @@ WLANTL_TLDebugMessage v_BOOL_t WLANTL_GetTxResource ( void *vos_context, - uint8_t sta_id + uint8_t sta_id, + unsigned int low_watermark, + unsigned int high_watermark_offset ); /*============================================================================= @@ -3059,6 +3061,7 @@ v_BOOL_t WLANTL_GetTxResource PARAMETERS IN tlContext : Pointer to TL SHIM context + peer_idx : peer index belongs to virtual device sessionId : STA/VDEV instance to query TX resource resume_tx : Resume OS TX Q or not @@ -3071,6 +3074,7 @@ v_BOOL_t WLANTL_GetTxResource void WLANTL_TXFlowControlCb ( void *tlContext, + v_U8_t peer_idx, v_U8_t sessionId, v_BOOL_t resume_tx ); -- cgit v1.2.3 From 6cb2f63c2dd7ae44f67c60f75b133c6289f5f7c7 Mon Sep 17 00:00:00 2001 From: Akash Patel Date: Wed, 19 Mar 2014 15:24:42 -0700 Subject: Cafstaging Release 1.0.0.66 Cafstaging Release 1.0.0.66 Change-Id: I7e93782f1a487000459dd66e103a6842ccb87902 --- CORE/MAC/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 9aa62855bdc2..f29bd28e066a 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 65 +#define QWLAN_VERSION_BUILD 66 -#define QWLAN_VERSIONSTR "1.0.0.65" +#define QWLAN_VERSIONSTR "1.0.0.66" #ifdef QCA_WIFI_2_0 -- cgit v1.2.3 From d3bec3f312d98b1c7f3da02446b4556ffedc617f Mon Sep 17 00:00:00 2001 From: Bala Shanmugam Kamatchi Date: Thu, 20 Mar 2014 06:27:02 +0530 Subject: qcacld: hdd: Do not downgrade if we have valid Tspec We are downgrading the traffic to BE when ADDTS request gets rejected even though we have a successful negotiation before. Allow access in that AC if we have a valid Tspec negotiated. Change-Id: Ic535d446ff4f90818ff16ab740d0fb5e98b6026b CRs-Fixed: 633696 --- CORE/HDD/src/wlan_hdd_wmm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_wmm.c b/CORE/HDD/src/wlan_hdd_wmm.c index 03bad2d8c540..d0d49e4c3d0c 100644 --- a/CORE/HDD/src/wlan_hdd_wmm.c +++ b/CORE/HDD/src/wlan_hdd_wmm.c @@ -1229,9 +1229,12 @@ static eHalStatus hdd_wmm_sme_callback (tHalHandle hHal, pAc->wmmAcAccessAllowed = VOS_FALSE; } - // if ACM bit is not set, allow access - if (!(pAc->wmmAcAccessRequired)) - pAc->wmmAcAccessAllowed = VOS_TRUE; + // if we have valid Tpsec or if ACM bit is not set, allow access + if ((pAc->wmmAcTspecValid && + (pAc->wmmAcTspecInfo.ts_info.direction != SME_QOS_WMM_TS_DIR_DOWNLINK)) || + !pAc->wmmAcAccessRequired) { + pAc->wmmAcAccessAllowed = VOS_TRUE; + } #endif VOS_TRACE(VOS_MODULE_ID_HDD, WMM_TRACE_LEVEL_INFO, -- cgit v1.2.3 From 3d7b2696983b6e440e6e73346e6e8478a5a812ec Mon Sep 17 00:00:00 2001 From: Yuanyuan Liu Date: Thu, 20 Mar 2014 09:58:09 -0700 Subject: cnss: Fix x86_64 compilation error Add MSM_PLATFORM flag to avoid "unused variable" error when compiling for x86_64 platform. Change-Id: Ic8b29dd8caee876547048ae292fd488d10dedb43 CRs-Fixed: 635909 --- CORE/HDD/src/wlan_hdd_assoc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index c86b6c4bda80..e1d066f171c3 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -603,7 +603,9 @@ static void hdd_SendAssociationEvent(struct net_device *dev,tCsrRoamInfo *pCsrRo int we_event; char *msg; int type = -1; +#ifdef MSM_PLATFORM unsigned long flags; +#endif #ifdef QCA_WIFI_2_0 v_MACADDR_t peerMacAddr; #endif -- cgit v1.2.3 From 11db288baafd10e051795df4a99b2a90bf6e6011 Mon Sep 17 00:00:00 2001 From: Srinivas Girigowda Date: Wed, 19 Mar 2014 22:33:32 -0700 Subject: qcacld: Fix for un-initialized pointer The value of index (i) may become a negative number. The fix is to make sure value of i is kept in range. Change-Id: Ica8c06d6e717779a2a0955e9af99e58ed2f2a774 CRs-Fixed: 635608 --- CORE/SYS/legacy/src/utils/src/macTrace.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CORE/SYS/legacy/src/utils/src/macTrace.c b/CORE/SYS/legacy/src/utils/src/macTrace.c index 0c1c01df25f5..dcf2eb52f39e 100644 --- a/CORE/SYS/legacy/src/utils/src/macTrace.c +++ b/CORE/SYS/legacy/src/utils/src/macTrace.c @@ -1134,8 +1134,15 @@ void macTraceDumpAll(tpAniSirGlobal pMac, tANI_U8 code, tANI_U8 session, tANI_U3 } } - if ((i >= 0 && i < MAX_TRACE_RECORDS)) - pRecord = &gTraceTbl[i]; + if (i < 0) + { + i = 0; + } + else if (i >= MAX_TRACE_RECORDS) + { + i = MAX_TRACE_RECORDS - 1; + } + pRecord = &gTraceTbl[i]; for (;;) { -- cgit v1.2.3 From 54f87141d6337aa9cb85b868ff758d979ce14d56 Mon Sep 17 00:00:00 2001 From: Kalikinkar dhara Date: Wed, 19 Mar 2014 16:24:26 -0700 Subject: qcacld : Division by zero in kernel 2nd argument of function "csrCalculateMCCBeaconInterval" should be non-zero value. If its zero then assign default beacon interval 100. Change-Id: Id3f77ebdaa0df497c7b4e986c285e3b30cf3ee8d CRs-fixed: 635421 --- CORE/MAC/src/pe/lim/limScanResultUtils.c | 10 ++++++++-- CORE/SME/src/csr/csrApiRoam.c | 5 ++++- CORE/SME/src/csr/csrApiScan.c | 7 +++++++ CORE/SME/src/csr/csrUtil.c | 12 +++++++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/CORE/MAC/src/pe/lim/limScanResultUtils.c b/CORE/MAC/src/pe/lim/limScanResultUtils.c index 0042fd505083..3d7cf39e3da6 100644 --- a/CORE/MAC/src/pe/lim/limScanResultUtils.c +++ b/CORE/MAC/src/pe/lim/limScanResultUtils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -193,7 +193,13 @@ limCollectBssDescription(tpAniSirGlobal pMac, pBssDescr->beaconInterval = pBPR->beaconInterval; pBssDescr->capabilityInfo = limGetU16((tANI_U8 *) &pBPR->capabilityInfo); - + if(!pBssDescr->beaconInterval ) + { + limLog(pMac, LOGW, + FL("Beacon Interval is ZERO, making it to default 100 " + MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pHdr->bssId)); + pBssDescr->beaconInterval= 100; + } /* * There is a narrow window after Channel Switch msg is sent to HAL and before the AGC is shut * down and beacons/Probe Rsps can trickle in and we may report the incorrect channel in 5Ghz diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 6ff643d94f22..49c2e9fb0e9e 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -7146,7 +7146,10 @@ eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionI pConnectProfile->modifyProfileFields.uapsd_mask = pProfile->uapsd_mask; pConnectProfile->operationChannel = pSirBssDesc->channelId; pConnectProfile->beaconInterval = pSirBssDesc->beaconInterval; - + if (!pConnectProfile->beaconInterval) + { + smsLog(pMac, LOGW, FL("ERROR: Beacon interval is ZERO")); + } vos_mem_copy(&pConnectProfile->Keys, &pProfile->Keys, sizeof(tCsrKeys)); /* saving the addional IE`s like Hot spot indication element and extended capabilities */ if(pProfile->nAddIEAssocLength) diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c index f6185de9e50d..51ae60eb9c12 100644 --- a/CORE/SME/src/csr/csrApiScan.c +++ b/CORE/SME/src/csr/csrApiScan.c @@ -8104,6 +8104,13 @@ eHalStatus csrScanSavePreferredNetworkFound(tpAniSirGlobal pMac, pBssDescr->sinr = 0; pBssDescr->rssi = -1 * pPrefNetworkFoundInd->rssi; pBssDescr->beaconInterval = pParsedFrame->beaconInterval; + if (!pBssDescr->beaconInterval) + { + smsLog(pMac, LOGW, + FL("Bcn Interval is Zero , default to 100" MAC_ADDRESS_STR), + MAC_ADDR_ARRAY(pBssDescr->bssId) ); + pBssDescr->beaconInterval = 100; + } pBssDescr->timeStamp[0] = pParsedFrame->timeStamp[0]; pBssDescr->timeStamp[1] = pParsedFrame->timeStamp[1]; pBssDescr->capabilityInfo = *((tANI_U16 *)&pParsedFrame->capabilityInfo); diff --git a/CORE/SME/src/csr/csrUtil.c b/CORE/SME/src/csr/csrUtil.c index 87c0f4cddcf5..6b6cf2d9c0fb 100644 --- a/CORE/SME/src/csr/csrUtil.c +++ b/CORE/SME/src/csr/csrUtil.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -2894,6 +2894,16 @@ tANI_U16 csrCalculateMCCBeaconInterval(tpAniSirGlobal pMac, tANI_U16 sta_bi, tAN else go_cbi = 100 + (go_gbi % 100); + if ( sta_bi == 0 ) + { + /* There is possibility to receive zero as value. + Which will cause divide by zero. Hence initialise with 100 + */ + sta_bi = 100; + smsLog(pMac, LOGW, + FL("sta_bi 2nd parameter is zero, initialise to %d"), sta_bi); + } + // check, if either one is multiple of another if (sta_bi > go_cbi) { -- cgit v1.2.3 From 8df0892f588e72319a4fb82f409ffccdf7072f77 Mon Sep 17 00:00:00 2001 From: Ganesh Babu Kumaravel Date: Thu, 20 Mar 2014 15:57:12 +0530 Subject: qcacld: Abort data transmission immediately upon disassociation Data frames are sent to the AP after sending Disassoc frame since aborting of transmission is happening very late as part of peer delete which results in burst of disassoc frame from AP. So abort the transmission immediately upon sending Disassoc frame. Change-Id: I88b6cd23d05cdd33ea4b258924dd293974f6b6a2 CRs-Fixed: 635080 --- CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c index 04bef5d98ac1..ba70ba4e1e21 100644 --- a/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessMlmReqMessages.c @@ -2931,6 +2931,12 @@ limProcessMlmDisassocReqNtf(tpAniSirGlobal pMac, eHalStatus suspendStatus, tANI_ pMlmDisassocReq->reasonCode, pMlmDisassocReq->peerMacAddr, psessionEntry, TRUE); + /* + * Abort Tx so that data frames won't be sent to the AP + * after sending Disassoc. + */ + if (eLIM_STA_ROLE == psessionEntry->limSystemRole) + WDA_TxAbort(psessionEntry->smeSessionId); } } else -- cgit v1.2.3 From e93a94d69431b7ae051d90bfc769261d47933738 Mon Sep 17 00:00:00 2001 From: Xun Luo Date: Wed, 19 Mar 2014 11:42:35 -0700 Subject: clear unsafe channel cache at every fw reporting change the behavior of host cacheing unsafe channels to as log as it receives a valid fw reporting, clears the current unsafe channel list cached in driver. Change-Id: I7b7df88472b57cd12918465d70d1818212d1eaf2 CRs-Fixed: 626151 --- CORE/HDD/src/wlan_hdd_main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 286a82f01a0a..501dca00ed5c 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -11104,6 +11104,10 @@ void hdd_ch_avoid_cb wlan_hdd_send_avoid_freq_event(hdd_ctxt, &hdd_avoid_freq_list); + /* clear existing unsafe channel cache */ + hdd_ctxt->unsafe_channel_count = 0; + vos_mem_zero(hdd_ctxt->unsafe_channel_list, sizeof(v_U16_t) * NUM_20MHZ_RF_CHANNELS); + if (0 == ch_avoid_indi->avoid_range_count) { hdd_ctxt->unsafe_channel_count = 0; } else { -- cgit v1.2.3 From c0794a0ac11e533fff628843d044c322c8f72e26 Mon Sep 17 00:00:00 2001 From: Rakesh Sunki Date: Mon, 17 Mar 2014 19:59:28 -0700 Subject: qcacld: Fix Sessionid mismatch in DFS commands Fix session ID mismatch between SME and PE during STA+AP single channel concurrency mode operating on DFS channel. BSSID is passed from SAP context as part of all DFS commands from SAP and the respective session entry in PE is identified using BSSID rather than using session ID. Change-Id: I280ca07fef8d21801262a6b96054971a7a78b0d3 CRs-Fixed: 624973 --- CORE/MAC/inc/sirApi.h | 6 ++-- CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c | 24 +++++++++------ CORE/SAP/src/sapModule.c | 11 ++++--- CORE/SME/inc/csrInternal.h | 6 ++-- CORE/SME/inc/sme_Api.h | 10 +++--- CORE/SME/src/csr/csrApiRoam.c | 42 ++++++-------------------- CORE/SME/src/sme_common/sme_Api.c | 23 +++++++------- 7 files changed, 52 insertions(+), 70 deletions(-) diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index 23c7453e453c..b917cdb161dd 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -4789,9 +4789,9 @@ typedef struct sSirChanChangeRequest { tANI_U16 messageType; tANI_U16 messageLen; - tANI_U8 sessionId; tANI_U8 targetChannel; tANI_U8 cbMode; + tANI_U8 bssid[WNI_CFG_BSSID_LEN]; }tSirChanChangeRequest, *tpSirChanChangeRequest; typedef struct sSirChanChangeResponse @@ -4806,8 +4806,8 @@ typedef struct sSirStartBeaconIndication { tANI_U16 messageType; tANI_U16 messageLen; - tANI_U8 sessionId; tANI_U8 beaconStartStatus; + tANI_U8 bssid[WNI_CFG_BSSID_LEN]; }tSirStartBeaconIndication, *tpSirStartBeaconIndication; /* Message format for requesting channel switch announcement to lower layers */ @@ -4815,9 +4815,9 @@ typedef struct sSirDfsCsaIeRequest { tANI_U16 msgType; tANI_U16 msgLen; - tANI_U8 sessionId; tANI_U8 targetChannel; tANI_U8 csaIeRequired; + tANI_U8 bssid[WNI_CFG_BSSID_LEN]; }tSirDfsCsaIeRequest, *tpSirDfsCsaIeRequest; /* Indication from lower layer indicating the completion of first beacon send diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index a5f7868dce02..7f543026be96 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -5799,12 +5799,14 @@ limProcessSmeStartBeaconReq(tpAniSirGlobal pMac, tANI_U32 * pMsg) } pBeaconStartInd = (tpSirStartBeaconIndication)pMsg; - sessionId = pBeaconStartInd->sessionId; - - if((psessionEntry = peFindSessionBySessionId(pMac, sessionId)) == NULL) + if((psessionEntry = + peFindSessionByBssid(pMac, pBeaconStartInd->bssid, &sessionId)) + == NULL) { - limLog(pMac, LOGW, "Session does not exist for given sessionId %d", - pBeaconStartInd->sessionId); + limPrintMacAddr(pMac, pBeaconStartInd->bssid, LOGE); + PELOGE(limLog(pMac, LOGE, + "%s[%d]: Session does not exist for given bssId", + __func__, __LINE__ );) return; } @@ -5845,12 +5847,15 @@ limProcessSmeChannelChangeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg) return; } pChannelChangeReq = (tpSirChanChangeRequest)pMsg; - sessionId = pChannelChangeReq->sessionId; - if((psessionEntry = peFindSessionBySessionId(pMac, sessionId)) == NULL) + if((psessionEntry = + peFindSessionByBssid(pMac, pChannelChangeReq->bssid, &sessionId)) + == NULL) { - limLog(pMac, LOGW, "Session does not exist for given sessionId %d", - pChannelChangeReq->sessionId); + limPrintMacAddr(pMac, pChannelChangeReq->bssid, LOGE); + PELOGE(limLog(pMac, LOGE, + "%s[%d]: Session does not exist for given bssId", + __func__, __LINE__ );) return; } @@ -5973,7 +5978,6 @@ limProcessSmeDfsCsaIeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg) { tpSirDfsCsaIeRequest pDfsCsaIeRequest = (tSirDfsCsaIeRequest *)pMsg; - //tANI_U8 sessionId = pDfsCsaIeRequest->sessionId; tpPESession psessionEntry = NULL; int i; diff --git a/CORE/SAP/src/sapModule.c b/CORE/SAP/src/sapModule.c index 440ec1485146..87ac5ac99663 100644 --- a/CORE/SAP/src/sapModule.c +++ b/CORE/SAP/src/sapModule.c @@ -2429,8 +2429,9 @@ WLANSAP_ChannelChangeRequest(v_PVOID_t pSapCtx, tANI_U8 tArgetChannel) return VOS_STATUS_E_FAULT; } - halStatus = sme_RoamChannelChangeReq( hHal, sapContext->sessionId, tArgetChannel, - sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode)); + halStatus = sme_RoamChannelChangeReq( hHal, sapContext->bssid, + tArgetChannel, + sapConvertSapPhyModeToCsrPhyMode(sapContext->csrRoamProfile.phyMode) ); if (halStatus == eHAL_STATUS_SUCCESS) { @@ -2495,7 +2496,7 @@ VOS_STATUS WLANSAP_StartBeaconReq(v_PVOID_t pSapCtx) /* CAC Wait done without any Radar Detection */ dfsCacWaitStatus = VOS_TRUE; halStatus = sme_RoamStartBeaconReq( hHal, - sapContext->sessionId, dfsCacWaitStatus); + sapContext->bssid, dfsCacWaitStatus); if (halStatus == eHAL_STATUS_SUCCESS) { return VOS_STATUS_SUCCESS; @@ -2549,9 +2550,11 @@ WLANSAP_DfsSendCSAIeRequest(v_PVOID_t pSapCtx) return VOS_STATUS_E_FAULT; } - halStatus = sme_RoamCsaIeRequest(hHal, sapContext->sessionId, + halStatus = sme_RoamCsaIeRequest(hHal, + sapContext->bssid, sapContext->SapDfsInfo.target_channel, sapContext->SapDfsInfo.csaIERequired); + if (halStatus == eHAL_STATUS_SUCCESS) { return VOS_STATUS_SUCCESS; diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index e15b1e3c34fe..33fa9ff11cca 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -1435,14 +1435,14 @@ tANI_BOOLEAN csrRoamIsStaMode(tpAniSirGlobal pMac, tANI_U32 sessionId); /* Post Channel Change Indication */ -eHalStatus csrRoamChannelChangeReq(tpAniSirGlobal pMac, tANI_U32 sessionId, +eHalStatus csrRoamChannelChangeReq(tpAniSirGlobal pMac, tCsrBssid bssid, tANI_U8 targetChannel, tANI_U8 cbMode); /* Post Beacon Tx Start Indication */ eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, - tANI_U32 sessionId, tANI_U8 dfsCacWaitStatus); + tCsrBssid bssid, tANI_U8 dfsCacWaitStatus); eHalStatus -csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId, +csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tCsrBssid bssid, tANI_U8 targetChannel, tANI_U8 csaIeReqd); #endif diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h index 8e89a79bed48..2c8e0bacc5f9 100644 --- a/CORE/SME/inc/sme_Api.h +++ b/CORE/SME/inc/sme_Api.h @@ -3450,20 +3450,20 @@ eHalStatus sme_AddChAvoidCallback ); #endif /* FEATURE_WLAN_CH_AVOID */ -eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tANI_U8 sessionId, - tANI_U8 targetChannel, eCsrPhyMode phyMode); +eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tCsrBssid bssid, + tANI_U8 targetChannel, eCsrPhyMode phyMode ); eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, - tANI_U8 sessionId, tANI_U8 dfsCacWaitStatus); + tCsrBssid bssid, tANI_U8 dfsCacWaitStatus); /* ------------------------------------------------------------------------- \fn sme_RoamCsaIeRequest \brief API to request CSA IE transmission from PE \param hHal - The handle returned by macOpen - \param sessionId - session ID \param pDfsCsaReq - CSA IE request + \param bssid - SAP bssid \return eHalStatus ---------------------------------------------------------------------------*/ -eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId, +eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tCsrBssid bssid, tANI_U8 targetChannel, tANI_U8 csaIeReqd); #ifndef QCA_WIFI_ISOC diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 49c2e9fb0e9e..5d3e757b3d7d 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -17385,19 +17385,11 @@ VOS_STATUS csrRoamReadTSF(tpAniSirGlobal pMac, tANI_U8 *pTimestamp) * Channel Change Req for SAP */ eHalStatus -csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId, - tANI_U8 targetChannel, tANI_U8 cbMode) +csrRoamChannelChangeReq( tpAniSirGlobal pMac, tCsrBssid bssid, + tANI_U8 targetChannel, tANI_U8 cbMode ) { eHalStatus status = eHAL_STATUS_SUCCESS; tSirChanChangeRequest *pMsg; - tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId ); - - if (NULL == pSession) - { - smsLog( pMac, LOGE, FL - ( " Session does not exist for session id %d" ), sessionId); - return eHAL_STATUS_FAILURE; - } pMsg = vos_mem_malloc( sizeof(tSirChanChangeRequest) ); if (!pMsg) @@ -17425,9 +17417,9 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId, pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_CHANNEL_CHANGE_REQ); pMsg->messageLen = sizeof(tSirChanChangeRequest); - pMsg->sessionId = pSession->sessionId; pMsg->targetChannel = targetChannel; pMsg->cbMode = cbMode; + vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN); status = palSendMBMessage(pMac->hHdd, pMsg); @@ -17439,19 +17431,11 @@ csrRoamChannelChangeReq( tpAniSirGlobal pMac, tANI_U32 sessionId, * immediately after SAP CAC WAIT is * completed without any RADAR indications. */ -eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId, - tANI_U8 dfsCacWaitStatus) +eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tCsrBssid bssid, + tANI_U8 dfsCacWaitStatus) { eHalStatus status = eHAL_STATUS_SUCCESS; tSirStartBeaconIndication *pMsg; - tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId ); - - if (NULL == pSession) - { - smsLog( pMac, LOGE, FL - ( " Session does not exist for session id %d" ), sessionId); - return eHAL_STATUS_FAILURE; - } pMsg = vos_mem_malloc(sizeof(tSirStartBeaconIndication)); @@ -17463,8 +17447,8 @@ eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId, vos_mem_set((void *)pMsg, sizeof( tSirStartBeaconIndication ), 0); pMsg->messageType = pal_cpu_to_be16((tANI_U16)eWNI_SME_START_BEACON_REQ); pMsg->messageLen = sizeof(tSirStartBeaconIndication); - pMsg->sessionId = pSession->sessionId; pMsg->beaconStartStatus = dfsCacWaitStatus; + vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN); status = palSendMBMessage(pMac->hHdd, pMsg); @@ -17481,19 +17465,11 @@ eHalStatus csrRoamStartBeaconReq( tpAniSirGlobal pMac, tANI_U32 sessionId, \- return Success or failure -----------------------------------------------------------------------------*/ eHalStatus -csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId, - tANI_U8 targetChannel, tANI_U8 csaIeReqd) +csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tCsrBssid bssid, + tANI_U8 targetChannel, tANI_U8 csaIeReqd) { eHalStatus status = eHAL_STATUS_SUCCESS; tSirDfsCsaIeRequest *pMsg; - tCsrRoamSession *pSession = CSR_GET_SESSION( pMac, sessionId ); - - if (NULL == pSession) - { - smsLog( pMac, LOGE, FL - ( " Session does not exist for session id %d" ), sessionId); - return eHAL_STATUS_FAILURE; - } pMsg = vos_mem_malloc(sizeof(tSirDfsCsaIeRequest)); if (!pMsg) @@ -17506,9 +17482,9 @@ csrRoamSendChanSwIERequest(tpAniSirGlobal pMac, tANI_U8 sessionId, pal_cpu_to_be16((tANI_U16)eWNI_SME_DFS_BEACON_CHAN_SW_IE_REQ); pMsg->msgLen = sizeof(tSirDfsCsaIeRequest); - pMsg->sessionId = pSession->sessionId; pMsg->targetChannel = targetChannel; pMsg->csaIeRequired = csaIeReqd; + vos_mem_copy(pMsg->bssid, bssid, WNI_CFG_BSSID_LEN); status = palSendMBMessage(pMac->hHdd, pMsg); diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 5326df0b36e8..a3ebea7919c9 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -11484,12 +11484,11 @@ eHalStatus sme_AddChAvoidCallback \fn sme_RoamChannelChangeReq \brief API to Indicate Channel change to new target channel \param hHal - The handle returned by macOpen - \param sessionId - session ID \param targetChannel - New Channel to move the SAP to. \return eHalStatus ---------------------------------------------------------------------------*/ -eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, - tANI_U8 sessionId, tANI_U8 targetChannel, eCsrPhyMode phyMode) +eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, tCsrBssid bssid, + tANI_U8 targetChannel, eCsrPhyMode phyMode ) { eHalStatus status = eHAL_STATUS_FAILURE; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); @@ -11498,8 +11497,8 @@ eHalStatus sme_RoamChannelChangeReq( tHalHandle hHal, { sme_SelectCBMode(hHal, phyMode, targetChannel); - status = csrRoamChannelChangeReq( pMac, sessionId, targetChannel, - pMac->roam.configParam.channelBondingMode5GHz); + status = csrRoamChannelChangeReq( pMac, bssid, targetChannel, + pMac->roam.configParam.channelBondingMode5GHz ); sme_ReleaseGlobalLock( &pMac->sme ); } @@ -11571,8 +11570,8 @@ eHalStatus sme_ProcessChannelChangeResp(tpAniSirGlobal pMac, \param dfsCacWaitStatus - CAC WAIT status flag \return eHalStatus ---------------------------------------------------------------------------*/ -eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId, - tANI_U8 dfsCacWaitStatus) +eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tCsrBssid bssid, + tANI_U8 dfsCacWaitStatus) { eHalStatus status = eHAL_STATUS_FAILURE; tpAniSirGlobal pMac = PMAC_STRUCT( hHal ); @@ -11580,7 +11579,7 @@ eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId, if ( HAL_STATUS_SUCCESS( status ) ) { - status = csrRoamStartBeaconReq( pMac, sessionId, dfsCacWaitStatus); + status = csrRoamStartBeaconReq( pMac, bssid, dfsCacWaitStatus); sme_ReleaseGlobalLock( &pMac->sme ); } return (status); @@ -11590,11 +11589,11 @@ eHalStatus sme_RoamStartBeaconReq( tHalHandle hHal, tANI_U8 sessionId, \fn sme_RoamCsaIeRequest \brief API to request CSA IE transmission from PE \param hHal - The handle returned by macOpen - \param sessionId - session ID \param pDfsCsaReq - CSA IE request + \param bssid - SAP bssid \return eHalStatus ---------------------------------------------------------------------------*/ -eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId, +eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tCsrBssid bssid, tANI_U8 targetChannel, tANI_U8 csaIeReqd) { eHalStatus status = eHAL_STATUS_FAILURE; @@ -11602,8 +11601,8 @@ eHalStatus sme_RoamCsaIeRequest(tHalHandle hHal, tANI_U8 sessionId, status = sme_AcquireGlobalLock( &pMac->sme ); if ( HAL_STATUS_SUCCESS( status ) ) { - status = csrRoamSendChanSwIERequest(pMac, sessionId, - targetChannel, csaIeReqd); + status = csrRoamSendChanSwIERequest(pMac, bssid, targetChannel, + csaIeReqd); sme_ReleaseGlobalLock( &pMac->sme ); } return (status); -- cgit v1.2.3 From 5c92b0930e65805eee0a1915e9eef893fb9c7769 Mon Sep 17 00:00:00 2001 From: Nirav Shah Date: Thu, 20 Mar 2014 09:29:22 +0530 Subject: LIM: Do not free pDelBss in limHandleDeleteBssRsp Do not free pDelBss in limHandleDeleteBssRsp function for invalid session id. Change-Id: I98c99a6c30d4e63cee9c61b479801b9240dc078e CRs-Fixed: 635591 --- CORE/MAC/src/pe/lim/limSendSmeRspMessages.c | 1 - 1 file changed, 1 deletion(-) diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c index 8df37ba099f1..3e7aa2ed1d45 100644 --- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c +++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c @@ -2783,7 +2783,6 @@ void limHandleDeleteBssRsp(tpAniSirGlobal pMac,tpSirMsgQ MsgQ) { limLog(pMac, LOGE,FL("Session Does not exist for given sessionID %d"), pDelBss->sessionId); - vos_mem_free(pDelBss); return; } if (psessionEntry->limSystemRole == eLIM_STA_IN_IBSS_ROLE) -- cgit v1.2.3 From 5df472389415bdbaa24ecda2a255d408af8be31d Mon Sep 17 00:00:00 2001 From: Pranav Desai Date: Mon, 17 Mar 2014 15:27:02 -0700 Subject: qcacld: Adding thermal throttle level set command for SAP SAP mode doesn't support setting thermal throttle level set command which is already supported for STA mode. This command is helpful in unit testing host side changes. Adding an IOCTL to support this command in SAP mode. Change-Id: I8225a6ae5c031b3a839c2f387d34e3ecdc85c46d CRs-fixed: 632303 --- CORE/HDD/inc/qc_sap_ioctl.h | 1 + CORE/HDD/src/wlan_hdd_hostapd.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h index 7c470ea1a8d4..8feb16b88c0c 100644 --- a/CORE/HDD/inc/qc_sap_ioctl.h +++ b/CORE/HDD/inc/qc_sap_ioctl.h @@ -299,6 +299,7 @@ typedef struct #ifdef QCA_PKT_PROTO_TRACE #define QCASAP_SET_DEBUG_LOG 68 #endif /* QCA_PKT_PROTO_TRACE */ +#define QCASAP_SET_TM_LEVEL 69 #endif /* QCA_WIFI_2_0 */ enum { diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c index 6461d8bb2be0..ec15c13e56b4 100644 --- a/CORE/HDD/src/wlan_hdd_hostapd.c +++ b/CORE/HDD/src/wlan_hdd_hostapd.c @@ -1757,6 +1757,18 @@ static iw_softap_setparam(struct net_device *dev, } #endif /* QCA_PKT_PROTO_TRACE */ + case QCASAP_SET_TM_LEVEL: + { + hddLog(VOS_TRACE_LEVEL_INFO, "Set Thermal Mitigation Level %d", + set_value); +#ifdef QCA_WIFI_ISOC + hddLog(VOS_TRACE_LEVEL_ERROR, " 'setTmLevel' Command Not supported for this mode"); +#else + (void)sme_SetThermalLevel(hHal, set_value); +#endif + break; + } + #endif /* QCA_WIFI_2_0 */ default: hddLog(LOGE, FL("Invalid setparam command %d value %d"), @@ -3973,6 +3985,11 @@ static const struct iw_priv_args hostapd_private_args[] = { "setDbgLvl" }, #endif /* QCA_PKT_PROTO_TRACE */ + { QCASAP_SET_TM_LEVEL, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "setTmLevel" }, + #endif /* QCA_WIFI_2_0 */ { QCSAP_IOCTL_GETPARAM, -- cgit v1.2.3 From a7070c324e9fbe97b8ac9833b8520e0531d3da3f Mon Sep 17 00:00:00 2001 From: Deepak Dhamdhere Date: Wed, 19 Mar 2014 14:52:37 -0700 Subject: qcacld: Reduce log levels of tspec operations in roaming Change LOGE to LOG1 and use VOS_TRACE_LEVEL_INFO_HIGH where messages are informational. Such messages can cause roaming delays. Additional messages in the same files are also cleaned up Change-Id: I0af81f5f43f40e9fe19e662cca9cc45cff6c45e5 CRs-Fixed: 635325 --- CORE/MAC/src/pe/lim/limUtils.c | 26 +++++++++++++------------- CORE/SME/src/QoS/sme_Qos.c | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/CORE/MAC/src/pe/lim/limUtils.c b/CORE/MAC/src/pe/lim/limUtils.c index cb75ece63303..fe6a944c0675 100644 --- a/CORE/MAC/src/pe/lim/limUtils.c +++ b/CORE/MAC/src/pe/lim/limUtils.c @@ -3948,7 +3948,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, if(overlap) { psessionEntry->gLimOlbcParams.protectionEnabled = true; - PELOGE(limLog(pMac, LOGE, FL("protection from olbc is enabled"));) + PELOGE(limLog(pMac, LOG1, FL("protection from olbc is enabled"));) if(true == psessionEntry->htCapability) { if((eSIR_HT_OP_MODE_OVERLAP_LEGACY != psessionEntry->htOperMode) && @@ -3967,7 +3967,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, else { psessionEntry->gLim11bParams.protectionEnabled = true; - PELOGE(limLog(pMac, LOGE, FL("protection from 11b is enabled"));) + PELOGE(limLog(pMac, LOG1, FL("protection from 11b is enabled"));) if(true == psessionEntry->htCapability) { if(eSIR_HT_OP_MODE_MIXED != psessionEntry->htOperMode) @@ -4056,7 +4056,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, { //Disable protection from 11B stations. psessionEntry->gLim11bParams.protectionEnabled = false; - PELOGE(limLog(pMac, LOGE, FL("===> 11B Protection Disabled"));) + PELOGE(limLog(pMac, LOG1, FL("===> 11B Protection Disabled"));) //Check if any other non-HT protection enabled. if(!psessionEntry->gLim11gParams.protectionEnabled) { @@ -4071,7 +4071,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, psessionEntry->gLimOverlapNonGfParams.protectionEnabled) { psessionEntry->htOperMode = eSIR_HT_OP_MODE_OVERLAP_LEGACY; - PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));) + PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));) limEnableHtRifsProtection(pMac, true, overlap, pBeaconParams,psessionEntry); } else if(psessionEntry->gLimHt20Params.protectionEnabled) @@ -4079,7 +4079,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, //Commenting because of CR 258588 WFA cert //psessionEntry->htOperMode = eSIR_HT_OP_MODE_NO_LEGACY_20MHZ_HT; psessionEntry->htOperMode = eSIR_HT_OP_MODE_PURE; - PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));) + PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));) limEnableHtRifsProtection(pMac, false, overlap, pBeaconParams,psessionEntry); } else @@ -4092,7 +4092,7 @@ limEnable11gProtection(tpAniSirGlobal pMac, tANI_U8 enable, if(!psessionEntry->gLimOlbcParams.protectionEnabled && !psessionEntry->gLim11bParams.protectionEnabled) { - PELOGE(limLog(pMac, LOGE, FL("===> 11G Protection Disabled"));) + PELOGE(limLog(pMac, LOG1, FL("===> 11G Protection Disabled"));) pBeaconParams->llbCoexist = psessionEntry->beaconParams.llbCoexist = false; pBeaconParams->paramChangeBitmap |= PARAM_llBCOEXIST_CHANGED; } @@ -5608,7 +5608,7 @@ limProcessAddBaInd(tpAniSirGlobal pMac, tpSirMsgQ limMsg) if((eBA_DISABLE == pSta->tcCfg[tid].fUseBATx) && (pBaCandidate->baInfo[tid].fBaEnable)) { - limLog(pMac, LOGE, FL("BA setup for staId = %d, TID: %d, SSN: %d"), + limLog(pMac, LOG1, FL("BA setup for staId = %d, TID: %d, SSN: %d"), pSta->staIndex, tid, pBaCandidate->baInfo[tid].startingSeqNum); limPostMlmAddBAReq(pMac, pSta, tid, pBaCandidate->baInfo[tid].startingSeqNum,psessionEntry); } @@ -6845,7 +6845,7 @@ limPrepareFor11hChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry) if(pMac->lim.gLimSmeState == eLIM_SME_LINK_EST_WT_SCAN_STATE || pMac->lim.gLimSmeState == eLIM_SME_CHANNEL_SCAN_STATE) { - PELOGE(limLog(pMac, LOGE, FL("Posting finish scan as we are in scan state"));) + PELOGE(limLog(pMac, LOG1, FL("Posting finish scan as we are in scan state"));) /* Stop ongoing scanning if any */ if (GET_LIM_PROCESS_DEFD_MESGS(pMac)) { @@ -6862,7 +6862,7 @@ limPrepareFor11hChannelSwitch(tpAniSirGlobal pMac, tpPESession psessionEntry) } else { - PELOGE(limLog(pMac, LOGE, FL("Not in scan state, start channel switch timer"));) + PELOGE(limLog(pMac, LOG1, FL("Not in scan state, start channel switch timer"));) /** We are safe to switch channel at this point */ limStopTxAndSwitchChannel(pMac, psessionEntry->peSessionId); } @@ -7011,8 +7011,8 @@ void limSetTspecUapsdMask(tpAniSirGlobal pMac, tSirMacTSInfo *pTsInfo, tANI_U32 } } - limLog(pMac, LOGE, FL("New pMac->lim.gUapsdPerAcTriggerEnableMask = 0x%x "), pMac->lim.gUapsdPerAcTriggerEnableMask ); - limLog(pMac, LOGE, FL("New pMac->lim.gUapsdPerAcDeliveryEnableMask = 0x%x "), pMac->lim.gUapsdPerAcDeliveryEnableMask ); + limLog(pMac, LOG1, FL("New pMac->lim.gUapsdPerAcTriggerEnableMask = 0x%x "), pMac->lim.gUapsdPerAcTriggerEnableMask ); + limLog(pMac, LOG1, FL("New pMac->lim.gUapsdPerAcDeliveryEnableMask = 0x%x "), pMac->lim.gUapsdPerAcDeliveryEnableMask ); return; } @@ -7060,10 +7060,10 @@ void limSetTspecUapsdMaskPerSession(tpAniSirGlobal pMac, } } - limLog(pMac, LOGE, + limLog(pMac, LOG1, FL("New psessionEntry->gUapsdPerAcTriggerEnableMask = 0x%x "), psessionEntry->gUapsdPerAcTriggerEnableMask ); - limLog(pMac, LOGE, + limLog(pMac, LOG1, FL("New psessionEntry->gUapsdPerAcDeliveryEnableMask = 0x%x "), psessionEntry->gUapsdPerAcDeliveryEnableMask ); diff --git a/CORE/SME/src/QoS/sme_Qos.c b/CORE/SME/src/QoS/sme_Qos.c index c89e3d9e58fd..82bf97aac2eb 100644 --- a/CORE/SME/src/QoS/sme_Qos.c +++ b/CORE/SME/src/QoS/sme_Qos.c @@ -5537,7 +5537,7 @@ eHalStatus sme_QosProcessAddTsSuccessRsp(tpAniSirGlobal pMac, pACInfo->curr_QoSInfo[tspec_pending - 1].medium_time = pRsp->tspec.mediumTime; - VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO_HIGH, "%s: %d: On session %d AddTspec Medium Time %d", __func__, __LINE__, sessionId, pRsp->tspec.mediumTime); -- cgit v1.2.3 From 6a925079e3b5990c0d7c7526c6a86de732aeefeb Mon Sep 17 00:00:00 2001 From: Ming-yi Lin Date: Wed, 19 Mar 2014 18:54:14 -0700 Subject: qcacld: utils: reduce debug print level for fwlog drop Too many dropped messages flooded useful info for fwlog. Reduce message level for "log buffers are dropped." Change-Id: I58d69cd82365d8b2afa63ba158b851d278030c01 CRs-fixed: 635487 --- CORE/UTILS/FWLOG/dbglog_host.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CORE/UTILS/FWLOG/dbglog_host.c b/CORE/UTILS/FWLOG/dbglog_host.c index 15d3fa13ab1c..01f970b856ca 100644 --- a/CORE/UTILS/FWLOG/dbglog_host.c +++ b/CORE/UTILS/FWLOG/dbglog_host.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -1634,7 +1634,7 @@ dbglog_parse_debug_logs(ol_scn_t scn, u_int8_t *data, u_int32_t datalen) dropped = *((A_UINT32 *)datap); if (dropped > 0) { - AR_DEBUG_PRINTF(ATH_DEBUG_INFO, ("%d log buffers are dropped \n", dropped)); + AR_DEBUG_PRINTF(ATH_DEBUG_TRC, ("%d log buffers are dropped \n", dropped)); } datap += sizeof(dropped); len -= sizeof(dropped); -- cgit v1.2.3 From 6f160d42a1772dd731da27100403001095806f7a Mon Sep 17 00:00:00 2001 From: Vasanthakumar Thiagarajan Date: Tue, 18 Mar 2014 19:20:52 +0530 Subject: qcacl/wma: Extend packet trace for management action frames To enable tracing Management action frames iwpriv wlan0 setDbgLvl 8 Run the following command to get the dump on the console kmesg log. iwpriv wlan0 setDbgLvl 9999 Change-Id: I8677b3083e889fa4e6d03cafbda40d83442a35d0 CRs-Fixed: 635081 --- CORE/CLD_TXRX/TXRX/ol_tx_desc.c | 3 +++ CORE/CLD_TXRX/TXRX/ol_tx_send.c | 2 ++ CORE/HDD/src/wlan_hdd_softap_tx_rx.c | 4 ++-- CORE/HDD/src/wlan_hdd_tx_rx.c | 4 ++-- CORE/SERVICES/COMMON/adf/adf_nbuf.c | 7 ++++++- CORE/SERVICES/COMMON/adf/adf_nbuf.h | 7 ++++--- CORE/SERVICES/WMA/wma.c | 18 ++++++++++++++++-- CORE/VOSS/inc/vos_packet.h | 7 +++++-- CORE/VOSS/src/vos_packet.c | 15 ++++++++++++++- 9 files changed, 54 insertions(+), 13 deletions(-) diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c index e1c0e1234780..0cfb13947df9 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c @@ -282,11 +282,14 @@ void ol_tx_desc_frame_free_nonstd( { int mgmt_type; ol_txrx_mgmt_tx_cb ota_ack_cb; + char *trace_str; adf_os_atomic_init(&tx_desc->ref_cnt); /* clear the ref cnt */ #ifdef QCA_SUPPORT_SW_TXRX_ENCAP OL_TX_RESTORE_HDR(tx_desc, (tx_desc->netbuf)); /* restore original hdr offset */ #endif + trace_str = (had_error) ? "OT:C:F:" : "OT:C:S:"; + adf_nbuf_trace_update(tx_desc->netbuf, trace_str); if (tx_desc->pkt_type == ol_tx_frm_no_free) { /* free the tx desc but don't unmap or free the frame */ if (pdev->tx_data_callback.func) { diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c index 8825a83a5257..5518a6313367 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -234,6 +234,8 @@ ol_tx_send_nonstd( failed = htt_tx_send_nonstd( pdev->htt_pdev, msdu, id, pkt_type); if (failed) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "Error: freeing tx frame after htt_tx failed"); OL_TX_TARGET_CREDIT_INCR_INT(pdev, msdu_credit_consumed); ol_tx_desc_frame_free_nonstd(pdev, tx_desc, 1 /* had error */); } diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c index e8190a30814e..22a56e2fe189 100644 --- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c @@ -567,7 +567,7 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) { /* Proto Trace enabled */ proto_type = vos_pkt_get_proto_type(skb, - hddCtxt->cfg_ini->gEnableDebugLog); + hddCtxt->cfg_ini->gEnableDebugLog, 0); if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type) { vos_pkt_trace_buf_update("HA:T:EPL"); @@ -1669,7 +1669,7 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext, (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) { proto_type = vos_pkt_get_proto_type(skb, - pHddCtx->cfg_ini->gEnableDebugLog); + pHddCtx->cfg_ini->gEnableDebugLog, 0); if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type) { vos_pkt_trace_buf_update("HA:R:EPL"); diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index fcc702c540a1..995b88c8de0d 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -1022,7 +1022,7 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) (hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) { proto_type = vos_pkt_get_proto_type(skb, - hddCtxt->cfg_ini->gEnableDebugLog); + hddCtxt->cfg_ini->gEnableDebugLog, 0); if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type) { vos_pkt_trace_buf_update("ST:T:EPL"); @@ -2115,7 +2115,7 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext, (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) { proto_type = vos_pkt_get_proto_type(skb, - pHddCtx->cfg_ini->gEnableDebugLog); + pHddCtx->cfg_ini->gEnableDebugLog, 0); if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type) { vos_pkt_trace_buf_update("ST:R:EPL"); diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index 5dae20e3ca4a..22adfd25d25b 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-14 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -421,6 +421,11 @@ __adf_nbuf_trace_update(struct sk_buff *buf, char *event_string) adf_os_mem_copy(string_buf + adf_os_str_len(event_string), "DHC", NBUF_PKT_TRAC_PROTO_STRING); + } else if (NBUF_PKT_TRAC_TYPE_MGMT_ACTION & + adf_nbuf_trace_get_proto_type(buf)) { + adf_os_mem_copy(string_buf + adf_os_str_len(event_string), + "MACT", + NBUF_PKT_TRAC_PROTO_STRING); } trace_update_cb(string_buf); diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index 8afc5b88e2e2..9abfc2c5b08f 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -50,8 +50,9 @@ #define NBUF_PKT_TRAC_TYPE_EAPOL 0x02 #define NBUF_PKT_TRAC_TYPE_DHCP 0x04 -#define NBUF_PKT_TRAC_MAX_STRING 11 -#define NBUF_PKT_TRAC_PROTO_STRING 3 +#define NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08 +#define NBUF_PKT_TRAC_MAX_STRING 12 +#define NBUF_PKT_TRAC_PROTO_STRING 4 /** * @brief Platform indepedent packet abstraction diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index d6c5b9113f1a..024240242e78 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -13514,8 +13514,10 @@ static void wma_data_tx_ack_work_handler(struct work_struct *ack_work) wma_handle = work->wma_handle; ack_cb = wma_handle->umac_data_ota_ack_cb; - WMA_LOGD("Data Tx Ack Cb Status %d", - work->status); + if (work->status) + WMA_LOGE("Data Tx Ack Cb Status %d", work->status); + else + WMA_LOGD("Data Tx Ack Cb Status %d", work->status); /* Call the Ack Cb registered by UMAC */ ack_cb((tpAniSirGlobal)(wma_handle->mac_context), @@ -17833,6 +17835,9 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, #endif /* WLAN_FEATURE_11W */ struct wma_txrx_node *iface; tpAniSirGlobal pMac; +#ifdef QCA_PKT_PROTO_TRACE + v_U8_t proto_type = 0; +#endif if (NULL == wma_handle) { @@ -18010,6 +18015,15 @@ VOS_STATUS WDA_TxPacket(void *wma_context, void *tx_frame, u_int16_t frmLen, wma_handle->umac_ota_ack_cb[pFc->subType] = tx_frm_ota_comp_cb; } +#ifdef QCA_PKT_PROTO_TRACE + if (pFc->subType == SIR_MAC_MGMT_ACTION) + proto_type = vos_pkt_get_proto_type(tx_frame, + pMac->fEnableDebugLog, + NBUF_PKT_TRAC_TYPE_MGMT_ACTION); + if (proto_type & NBUF_PKT_TRAC_TYPE_MGMT_ACTION) + vos_pkt_trace_buf_update("WM:T:MACT"); + adf_nbuf_trace_set_proto_type(tx_frame, proto_type); +#endif /* QCA_PKT_PROTO_TRACE */ } else { if(downld_comp_required) tx_frm_index = diff --git a/CORE/VOSS/inc/vos_packet.h b/CORE/VOSS/inc/vos_packet.h index 586479d43338..853282e8ce56 100644 --- a/CORE/VOSS/inc/vos_packet.h +++ b/CORE/VOSS/inc/vos_packet.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2012,2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -63,6 +63,7 @@ typedef struct vos_pkt_t vos_pkt_t; #define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL #define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP +#define VOS_PKT_TRAC_TYPE_MGMT_ACTION NBUF_PKT_TRAC_TYPE_MGMT_ACTION /* Managment action frame */ #define VOS_PKT_TRAC_DUMP_CMD 9999 @@ -73,12 +74,14 @@ typedef struct vos_pkt_t vos_pkt_t; * skb Packet Pointer * tracking_map packet type want to track + * dot11_type, frame type when the frame is in dot11 format ---------------------------------------------------------------------------*/ v_U8_t vos_pkt_get_proto_type ( struct sk_buff *skb, - v_U8_t tracking_map + v_U8_t tracking_map, + v_BOOL_t dot11_type ); /*--------------------------------------------------------------------------- diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c index 8bb6bfae99b6..283b8aec82ff 100644 --- a/CORE/VOSS/src/vos_packet.c +++ b/CORE/VOSS/src/vos_packet.c @@ -245,12 +245,14 @@ VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket, * skb Packet Pointer * tracking_map packet type want to track + * dot11_type, type of dot11 frame ---------------------------------------------------------------------------*/ v_U8_t vos_pkt_get_proto_type ( struct sk_buff *skb, - v_U8_t tracking_map + v_U8_t tracking_map, + v_U8_t dot11_type ) { v_U8_t pkt_proto_type = 0; @@ -258,6 +260,15 @@ v_U8_t vos_pkt_get_proto_type v_U16_t SPort; v_U16_t DPort; + if (dot11_type) + { + if (dot11_type == (VOS_PKT_TRAC_TYPE_MGMT_ACTION & tracking_map)) + pkt_proto_type |= VOS_PKT_TRAC_TYPE_MGMT_ACTION; + + /* Protocol type map */ + return pkt_proto_type; + } + /* EAPOL Tracking enabled */ if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map) { @@ -309,6 +320,8 @@ void vos_pkt_trace_buf_update slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF; trace_buffer[slot].order = trace_buffer_order; trace_buffer[slot].event_time = vos_timer_get_system_time(); + vos_mem_zero(trace_buffer[slot].event_string, + sizeof(trace_buffer[slot].event_string)); vos_mem_copy(trace_buffer[slot].event_string, event_string, (VOS_PKT_TRAC_MAX_STRING_LEN < strlen(event_string))? -- cgit v1.2.3 From 110f81610ef12645b4040222be59f71a008f81e0 Mon Sep 17 00:00:00 2001 From: Prashanth Bhatta Date: Tue, 18 Mar 2014 19:36:03 -0700 Subject: qcacld: hdd: Return proper value in PMKSA call back PMKSA call backs in HDD are returning HAL return value. HAL return values are positive numbers but upper layers and applications using NL80211 interface expects negative values for failure cases and 0 for success cases. PMKSA call back functions are modified to return proper negative values in case of failure. Change-Id: I7622a0771617ff6619e1e73c1700e2377f42fdd9 CRs-fixed: 634878 --- CORE/HDD/src/wlan_hdd_cfg80211.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c index 09ca767f67bc..d091b716c32a 100644 --- a/CORE/HDD/src/wlan_hdd_cfg80211.c +++ b/CORE/HDD/src/wlan_hdd_cfg80211.c @@ -8079,7 +8079,7 @@ static int wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *d tANI_U32 j=0; hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev); tHalHandle halHandle; - eHalStatus result; + eHalStatus result = eHAL_STATUS_SUCCESS; int status; tANI_U8 BSSIDMatched = 0; hdd_context_t *pHddCtx; @@ -8157,7 +8157,7 @@ static int wlan_hdd_cfg80211_set_pmksa(struct wiphy *wiphy, struct net_device *d result = sme_RoamSetPMKIDCache(halHandle,pAdapter->sessionId, PMKIDCache, PMKIDCacheIndex); - return 0; + return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL; } @@ -8171,7 +8171,7 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d int status; tANI_U8 BSSIDMatched = 0; hdd_context_t *pHddCtx; - int result = 0; + eHalStatus result = eHAL_STATUS_SUCCESS; hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: deleting PMKSA for " MAC_ADDRESS_STR, __func__, MAC_ADDR_ARRAY(pmksa->bssid)); @@ -8236,7 +8236,7 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d /*delete the last PMKID cache in CSR*/ result = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pmksa->bssid); - if (0 != result) + if (!HAL_STATUS_SUCCESS(result)) { hddLog(VOS_TRACE_LEVEL_ERROR,"%s: cannot delete PMKSA %d CONTENT.", __func__,PMKIDCacheIndex); @@ -8259,7 +8259,8 @@ static int wlan_hdd_cfg80211_del_pmksa(struct wiphy *wiphy, struct net_device *d dump_pmkid(halHandle, pmksa->pmkid); return -EINVAL; } - return result; + + return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL; } @@ -8272,6 +8273,7 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device hdd_context_t *pHddCtx; tANI_U8 *pBSSId; int status = -1; + eHalStatus result = eHAL_STATUS_SUCCESS; hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: flushing PMKSA ",__func__); @@ -8310,9 +8312,9 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device pBSSId =(tANI_U8 *)(PMKIDCache[j].BSSID); /*delete the PMKID in CSR*/ - status = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pBSSId); + result = sme_RoamDelPMKIDfromCache(halHandle, pAdapter->sessionId, pBSSId); - if (0 != status) + if (!HAL_STATUS_SUCCESS(result)) { hddLog(VOS_TRACE_LEVEL_ERROR ,"%s cannot flush PMKIDCache %d.", __func__,j); @@ -8323,7 +8325,8 @@ static int wlan_hdd_cfg80211_flush_pmksa(struct wiphy *wiphy, struct net_device } PMKIDCacheIndex = 0; - return status; + + return HAL_STATUS_SUCCESS(result) ? 0 : -EINVAL; } #endif -- cgit v1.2.3 From 0486d930ba42b8f0dd6447d17faa30f4d747507b Mon Sep 17 00:00:00 2001 From: Deepak Dhamdhere Date: Wed, 19 Mar 2014 23:54:43 -0700 Subject: qcacld: Allow PTK to be set prior to reassociation in 11r Supplicant provides PTK to driver prior to reassociation in case of 11r roaming. That functionality is now enabled for Rome by reverting https://review-android.quicinc.com/#/c/534840. Added support in WMA to remember the PTK that came with roaming ADD_BSS request and use it later after sending peer_assoc command. This optimization will improve roaming latency in 11r. Change-Id: I29211f727887ceb4da1e229adde1d7681ec4b4db CRs-Fixed: 634581 --- CORE/MAC/src/pe/lim/limFT.c | 2 ++ CORE/SERVICES/WMA/wma.c | 47 ++++++++++++++++++++++++++++++++++--- CORE/SERVICES/WMA/wma.h | 3 +++ CORE/SME/src/sme_common/sme_FTApi.c | 4 ---- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/CORE/MAC/src/pe/lim/limFT.c b/CORE/MAC/src/pe/lim/limFT.c index 9ba936035fda..791d6c213369 100644 --- a/CORE/MAC/src/pe/lim/limFT.c +++ b/CORE/MAC/src/pe/lim/limFT.c @@ -1430,6 +1430,8 @@ tANI_BOOLEAN limProcessFTUpdateKey(tpAniSirGlobal pMac, tANI_U32 *pMsgBuf ) PELOG1(limLog(pMac, LOG1, FL("BSSID = "MAC_ADDRESS_STR), MAC_ADDR_ARRAY(pKeyInfo->bssId));) + sirCopyMacAddr(pAddBssParams->extSetStaKeyParam.peerMacAddr, pKeyInfo->bssId); + if(pAddBssParams->extSetStaKeyParam.key[0].keyLength == 16) { PELOG1(limLog(pMac, LOG1, diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 024240242e78..d413ff62ab1b 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -227,6 +227,9 @@ void wma_set_dfs_regdomain(tp_wma_handle wma); static VOS_STATUS wma_set_thermal_mgmt(tp_wma_handle wma_handle, t_thermal_cmd_params thermal_info); +static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info, + v_BOOL_t sendResp); + static void *wma_find_vdev_by_addr(tp_wma_handle wma, u_int8_t *addr, u_int8_t *vdev_id) { @@ -3052,6 +3055,11 @@ void wma_vdev_detach_callback(void *ctx) } if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); + +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); param->status = VOS_STATUS_SUCCESS; @@ -3150,6 +3158,10 @@ static VOS_STATUS wma_vdev_detach(tp_wma_handle wma_handle, out: if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); pdel_sta_self_req_param->status = status; if (generateRsp) @@ -6068,6 +6080,10 @@ void wma_vdev_resp_timer(void *data) (void *)iface->del_staself_req, 0); if(iface->addBssStaContext) adf_os_mem_free(iface->addBssStaContext); +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) + adf_os_mem_free(iface->staKeyParams); +#endif vos_mem_zero(iface, sizeof(*iface)); } else if (tgt_req->msg_type == WDA_ADD_BSS_REQ) { tpAddBssParams params = (tpAddBssParams)tgt_req->user_data; @@ -8279,6 +8295,22 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) } adf_os_mem_copy(iface->addBssStaContext, &add_bss->staContext, sizeof(tAddStaParams)); + +#if defined WLAN_FEATURE_VOWIFI_11R + if (iface->staKeyParams) { + adf_os_mem_free(iface->staKeyParams); + iface->staKeyParams = NULL; + } + if (add_bss->extSetStaKeyParamValid) { + iface->staKeyParams = adf_os_mem_alloc(NULL, sizeof(tSetStaKeyParams)); + if (!iface->staKeyParams) { + WMA_LOGE("%s Failed to allocat memory", __func__); + goto send_fail_resp; + } + adf_os_mem_copy(iface->staKeyParams, &add_bss->extSetStaKeyParam, + sizeof(tSetStaKeyParams)); + } +#endif // Save parameters later needed by WDA_ADD_STA_REQ iface->rmfEnabled = add_bss->rmfEnabled; iface->beaconInterval = add_bss->beaconInterval; @@ -9004,6 +9036,14 @@ static void wma_add_sta_req_sta_mode(tp_wma_handle wma, tpAddStaParams params) } } #endif /* WLAN_FEATURE_11W */ +#if defined WLAN_FEATURE_VOWIFI_11R + /* + * Set the PTK in 11r mode because we already have it. + */ + if (iface->staKeyParams) { + wma_set_stakey(wma, (tpSetStaKeyParams) iface->staKeyParams, FALSE); + } +#endif } #if defined WLAN_FEATURE_VOWIFI maxTxPower = params->maxTxPower; @@ -9473,7 +9513,7 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle, tpSetBssKeyParams k } } -static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) +static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info, v_BOOL_t sendResp) { wmi_buf_t buf; int32_t status, i; @@ -9581,7 +9621,8 @@ static void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info) /* TODO: Should we wait till we get HTT_T2H_MSG_TYPE_SEC_IND? */ key_info->status = eHAL_STATUS_SUCCESS; out: - wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0); + if (sendResp) + wma_send_msg(wma_handle, WDA_SET_STAKEY_RSP, (void *) key_info, 0); } static void wma_delete_sta_req_ap_mode(tp_wma_handle wma, @@ -15282,7 +15323,7 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg) break; case WDA_SET_STAKEY_REQ: wma_set_stakey(wma_handle, - (tpSetStaKeyParams)msg->bodyptr); + (tpSetStaKeyParams)msg->bodyptr, TRUE); break; case WDA_DELETE_STA_REQ: wma_delete_sta(wma_handle, diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index f1e7e74ba9a2..7f7edd21d52e 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -460,6 +460,9 @@ struct wma_txrx_node { tPowerdBm tx_power; /* TX power in dBm */ tPowerdBm max_tx_power; /* max Tx power in dBm */ u_int32_t nwType; +#if defined WLAN_FEATURE_VOWIFI_11R + void *staKeyParams; +#endif }; #if defined(QCA_WIFI_FTM) && !defined(QCA_WIFI_ISOC) diff --git a/CORE/SME/src/sme_common/sme_FTApi.c b/CORE/SME/src/sme_common/sme_FTApi.c index 6501391ff91b..9f3d3526142c 100644 --- a/CORE/SME/src/sme_common/sme_FTApi.c +++ b/CORE/SME/src/sme_common/sme_FTApi.c @@ -374,7 +374,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo ) switch(pMac->ft.ftSmeContext.FTState) { case eFT_SET_KEY_WAIT: -#ifdef QCA_WIFI_ISOC if (sme_GetFTPreAuthState (hHal) == TRUE) { status = sme_FTSendUpdateKeyInd(pMac, pFTKeyInfo); @@ -393,9 +392,6 @@ eHalStatus sme_FTUpdateKey( tHalHandle hHal, tCsrRoamSetKey * pFTKeyInfo ) } sme_SetFTPreAuthState(hHal, FALSE); } -#else - status = eHAL_STATUS_FT_PREAUTH_KEY_FAILED; -#endif /* QCA_WIFI_ISOC */ pMac->ft.ftSmeContext.FTState = eFT_START_READY; #ifdef WLAN_FEATURE_VOWIFI_11R_DEBUG -- cgit v1.2.3 From f30f35fbbc09fb2ccc899129012f55a41b7c165c Mon Sep 17 00:00:00 2001 From: Akash Patel Date: Thu, 20 Mar 2014 16:58:32 -0700 Subject: Cafstaging Release 1.0.0.67 Cafstaging Release 1.0.0.67 Change-Id: Ieaf7b4b4e657c06443fcd091c49f20d28da1b83f --- CORE/MAC/inc/qwlan_version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index f29bd28e066a..9a0c3bdce988 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2013,2014 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 66 +#define QWLAN_VERSION_BUILD 67 -#define QWLAN_VERSIONSTR "1.0.0.66" +#define QWLAN_VERSIONSTR "1.0.0.67" #ifdef QCA_WIFI_2_0 -- cgit v1.2.3 From 94bbfab76308abdf77f81bc6332e0073b750a316 Mon Sep 17 00:00:00 2001 From: Srinivas Girigowda Date: Mon, 24 Feb 2014 17:37:09 -0800 Subject: qcacld: hdd: HS2.0 gratuitous ARP/unsolicited NA dropping This change at the HDD layer implements gratuitous ARP/unsolicited NA dropping Change-Id: Ibce71d0cd524b341d69b749ecfa3daa73d725bbb CRs-Fixed: 621569 --- CORE/HDD/inc/wlan_hdd_assoc.h | 2 ++ CORE/HDD/src/wlan_hdd_assoc.c | 3 +++ CORE/HDD/src/wlan_hdd_tx_rx.c | 13 ++++++++++++- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CORE/HDD/inc/wlan_hdd_assoc.h b/CORE/HDD/inc/wlan_hdd_assoc.h index 7ba62db11533..158ed3d184a7 100644 --- a/CORE/HDD/inc/wlan_hdd_assoc.h +++ b/CORE/HDD/inc/wlan_hdd_assoc.h @@ -117,6 +117,8 @@ typedef struct connection_info_s /** Dot11Mode */ tANI_U32 dot11Mode; + v_U8_t proxyARPService; + }connection_info_t; /*Forward declaration of Adapter*/ typedef struct hdd_adapter_s hdd_adapter_t; diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index e1d066f171c3..c0b45ef7678e 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -307,6 +307,8 @@ void hdd_connSaveConnectInfo( hdd_adapter_t *pAdapter, tCsrRoamInfo *pRoamInfo, // Save dot11mode in which STA associated to AP pHddStaCtx->conn_info.dot11Mode = pRoamInfo->u.pConnectedProfile->dot11Mode; + + pHddStaCtx->conn_info.proxyARPService = pRoamInfo->u.pConnectedProfile->proxyARPService; } } @@ -775,6 +777,7 @@ void hdd_connRemoveConnectInfo( hdd_station_ctx_t *pHddStaCtx ) // Set not-connected state pHddStaCtx->conn_info.connDot11DesiredBssType = eCSR_BSS_TYPE_ANY; hdd_connSetConnectionState( pHddStaCtx, eConnectionState_NotConnected ); + pHddStaCtx->conn_info.proxyARPService = 0; vos_mem_zero( &pHddStaCtx->conn_info.SSID, sizeof( tCsrSSIDInfo ) ); } diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c index 995b88c8de0d..efbc79a68d97 100644 --- a/CORE/HDD/src/wlan_hdd_tx_rx.c +++ b/CORE/HDD/src/wlan_hdd_tx_rx.c @@ -2045,6 +2045,7 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext, #ifdef QCA_PKT_PROTO_TRACE v_U8_t proto_type; #endif /* QCA_PKT_PROTO_TRACE */ + hdd_station_ctx_t *pHddStaCtx = NULL; //Sanity check on inputs if ((NULL == vosContext) || (NULL == rxBuf)) @@ -2077,12 +2078,22 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext, return eHAL_STATUS_FAILURE; } + pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); + if ((pHddStaCtx->conn_info.proxyARPService) && + cfg80211_is_gratuitous_arp_unsolicited_na(skb)) + { + ++pAdapter->hdd_stats.hddTxRxStats.rxDropped; + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, + "%s: Dropping HS 2.0 Gratuitous ARP or Unsolicited NA", __func__); + kfree_skb(skb); + return VOS_STATUS_SUCCESS; + } + #ifdef FEATURE_WLAN_TDLS #ifndef QCA_WIFI_2_0 if ((eTDLS_SUPPORT_ENABLED == pHddCtx->tdls_mode) && 0 != pHddCtx->connected_peer_count) { - hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station; u8 mac[6]; wlan_hdd_tdls_extract_sa(skb, mac); -- cgit v1.2.3 From b7087266e71f007285bc089333e6fa6ad20cdbf3 Mon Sep 17 00:00:00 2001 From: Debashis Dutt Date: Mon, 17 Mar 2014 01:26:13 -0700 Subject: qcacld: TxRx: Reduce CPU cycles for ol_tx_desc_ll() in Tx path. HTT/HTC Tx descriptor resides in un-cached memory. Current implementation of htt_tx_desc_init() causes memory to be accessed for every bit being set in the 0th & 1st words of the HTT/HTC descriptor. The current fix uses local variables (& hence cached writes) to initialize the bits of word0 & word1, before finally commiting this to memory. Use of cached writes reduces the overall CPU utilization of the calling function ol_tx_desc_ll() (as shown by "perf") by 2 to 5%. This fix is required to reduce the overall latency in the Tx path. Change-Id: Icfaa8f83b93eb890ef688302d2f6269daad72f1a --- CORE/SERVICES/COMMON/ol_htt_tx_api.h | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/CORE/SERVICES/COMMON/ol_htt_tx_api.h b/CORE/SERVICES/COMMON/ol_htt_tx_api.h index 916a010db672..03d816831094 100644 --- a/CORE/SERVICES/COMMON/ol_htt_tx_api.h +++ b/CORE/SERVICES/COMMON/ol_htt_tx_api.h @@ -385,10 +385,10 @@ htt_tx_desc_init( struct htt_msdu_info_t *msdu_info) { u_int32_t *word0, *word1, *word3; + u_int32_t local_word0, local_word1; struct htt_host_tx_desc_t *htt_host_tx_desc = (struct htt_host_tx_desc_t *) (((char *) htt_tx_desc) - HTT_TX_DESC_VADDR_OFFSET); - word0 = (u_int32_t *) htt_tx_desc; word1 = word0 + 1; /* @@ -397,18 +397,25 @@ htt_tx_desc_init( */ word3 = word0 + 3; // Dword 3 - *word0 = 0; + /* + * HTT Tx Desc is in uncached memory. Used cached writes per word, to + * reduce unnecessary memory access. + */ + + local_word0 = 0; + HTT_H2T_MSG_TYPE_SET(local_word0, HTT_H2T_MSG_TYPE_TX_FRM); + HTT_TX_DESC_PKT_TYPE_SET(local_word0, msdu_info->info.l2_hdr_type); + HTT_TX_DESC_VDEV_ID_SET(local_word0, msdu_info->info.vdev_id); + HTT_TX_DESC_EXT_TID_SET(local_word0, msdu_info->info.ext_tid); + HTT_TX_DESC_CKSUM_OFFLOAD_SET(local_word0, msdu_info->action.cksum_offload); + HTT_TX_DESC_NO_ENCRYPT_SET(local_word0, msdu_info->action.do_encrypt ? 0 : 1); + *word0 = local_word0; - HTT_H2T_MSG_TYPE_SET(*word0, HTT_H2T_MSG_TYPE_TX_FRM); - HTT_TX_DESC_PKT_TYPE_SET(*word0, msdu_info->info.l2_hdr_type); - HTT_TX_DESC_VDEV_ID_SET(*word0, msdu_info->info.vdev_id); - HTT_TX_DESC_EXT_TID_SET(*word0, msdu_info->info.ext_tid); - HTT_TX_DESC_CKSUM_OFFLOAD_SET(*word0, msdu_info->action.cksum_offload); - HTT_TX_DESC_NO_ENCRYPT_SET(*word0, msdu_info->action.do_encrypt ? 0 : 1); + local_word1 = 0; + HTT_TX_DESC_FRM_LEN_SET(local_word1, adf_nbuf_len(msdu)); + HTT_TX_DESC_FRM_ID_SET(local_word1, msdu_id); + *word1 = local_word1; - *word1 = 0; - HTT_TX_DESC_FRM_LEN_SET(*word1, adf_nbuf_len(msdu)); - HTT_TX_DESC_FRM_ID_SET(*word1, msdu_id); /* Initialize peer_id to INVALID_PEER bcoz this is NOT Reinjection path*/ *word3 = HTT_INVALID_PEER; -- cgit v1.2.3 From 6d3114ba2e7a9e02f68351e8d9d7c3ad8e146a78 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Mon, 23 Dec 2013 19:07:07 -0800 Subject: wlan: fix unsafe code after VOS_ASSERT The WLAN module extensively uses the VOS_ASSERT macro, which either does nothing or emits a warning (depending on conditional compilation) and continues, i.e. it does not abort. Use of VOS_ASSERT is unsafe in instances where the assert performs out-of-bounds or NULL pointer checks. Patch takes care to bailout where ever it is unsafe to continue. Change-Id: I351daf9a5b5955aa5f0d57026d77f90e5274fba1 CRs-Fixed: 556307 --- CORE/DXE/src/wlan_qct_dxe.c | 62 +++++++++++++++++++++----- CORE/HDD/src/wlan_hdd_ftm.c | 10 +++-- CORE/HDD/src/wlan_hdd_wext.c | 8 +++- CORE/SYS/common/src/wlan_qct_sys.c | 25 +++++++++-- CORE/SYS/legacy/src/platform/src/VossWrapper.c | 17 ++++++- CORE/TL/src/wlan_qct_tl.c | 41 +++++++++++++---- CORE/VOSS/src/vos_api.c | 24 ++++++++-- CORE/VOSS/src/vos_timer.c | 10 ++++- CORE/WDA/src/wlan_qct_wda.c | 17 +++++-- CORE/WDA/src/wlan_qct_wda_ds.c | 5 +-- CORE/WDI/WPAL/src/wlan_qct_pal_packet.c | 22 ++++++--- 11 files changed, 195 insertions(+), 46 deletions(-) diff --git a/CORE/DXE/src/wlan_qct_dxe.c b/CORE/DXE/src/wlan_qct_dxe.c index b2f71097c1e8..487143a2b88a 100644 --- a/CORE/DXE/src/wlan_qct_dxe.c +++ b/CORE/DXE/src/wlan_qct_dxe.c @@ -1955,13 +1955,17 @@ void dxeRXPacketAvailableCB dxeCtxt->freeRXPacket = freePacket; /* Serialize RX Packet Available message upon RX thread */ - HDXE_ASSERT(NULL != dxeCtxt->rxPktAvailMsg); - + if (NULL == dxeCtxt->rxPktAvailMsg) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, + "DXE NULL pkt"); + HDXE_ASSERT(0); + return; + } status = wpalPostRxMsg(WDI_GET_PAL_CTX(), dxeCtxt->rxPktAvailMsg); if(eWLAN_PAL_STATUS_SUCCESS != status) { - HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status); HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, "dxeRXPacketAvailableCB serialize fail"); } @@ -2068,8 +2072,13 @@ static wpt_status dxeRXFrameSingleBufferAlloc status = wpalAllocateShadowRxFrame(currentPalPacketBuffer, &physicalAddressPCIe, &virtualAddressPCIe); - HDXE_ASSERT(0 != physicalAddressPCIe); - HDXE_ASSERT(0 != virtualAddressPCIe); + if((0 == physicalAddressPCIe) || (0 = virtualAddressPCIe)) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, + "RX NULL Shadow Memory"); + HDXE_ASSERT(0); + return eWLAN_PAL_STATUS_E_FAULT; + } HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_INFO_MED, "RX Shadow Memory Va 0x%x, Pa 0x%x", virtualAddressPCIe, physicalAddressPCIe); @@ -3027,12 +3036,18 @@ static void dxeRXISR } /* Serialize RX Ready interrupt upon RX thread */ - HDXE_ASSERT(NULL != dxeCtxt->rxIsrMsg); + if(NULL == dxeCtxt->rxIsrMsg) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, + "dxeRXFrameReadyISR NULL message"); + HDXE_ASSERT(0); + return; + } + status = wpalPostRxMsg(WDI_GET_PAL_CTX(), dxeCtxt->rxIsrMsg); if(eWLAN_PAL_STATUS_SUCCESS != status) { - HDXE_ASSERT(eWLAN_PAL_STATUS_SUCCESS == status); HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, "dxeRXFrameReadyISR interrupt serialize fail"); } @@ -3141,8 +3156,21 @@ static wpt_status dxeTXPushFrame sourcePhysicalAddress = (void *)frameVector.frg[fragCount].pa; xferSize = frameVector.frg[fragCount].size; fragCount++; - HDXE_ASSERT(0 != xferSize); - HDXE_ASSERT(NULL != sourcePhysicalAddress); + if(0 == xferSize) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, + "dxeTXPushFrame invalid transfer size"); + + HDXE_ASSERT(0); + return eWLAN_PAL_STATUS_E_FAILURE; + } + if(NULL == sourcePhysicalAddress) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, + "dxeTXPushFrame invalid sourcePhysicalAddress"); + HDXE_ASSERT(0); + return eWLAN_PAL_STATUS_E_FAILURE; + } #else status = wpalIteratorNext(&iterator, palPacket, @@ -3507,7 +3535,13 @@ static wpt_status dxeTXCompFrame break; } - HDXE_ASSERT(currentCtrlBlk->xfrFrame != NULL); + if(currentCtrlBlk->xfrFrame == NULL) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_ERROR, + "Invalid transfer frame"); + HDXE_ASSERT(0); + break; + } channelEntry->numFreeDesc++; channelEntry->numRsvdDesc--; @@ -4195,7 +4229,13 @@ static void dxeTXISR dxeCtxt->ucTxMsgCnt = 1; /* Serialize TX complete interrupt upon TX thread */ - HDXE_ASSERT(NULL != dxeCtxt->txIsrMsg); + if(NULL == dxeCtxt->txIsrMsg) + { + HDXE_MSG(eWLAN_MODULE_DAL_DATA, eWLAN_PAL_TRACE_LEVEL_FATAL, + "Invalid message"); + HDXE_ASSERT(0); + return; + } status = wpalPostTxMsg(WDI_GET_PAL_CTX(), dxeCtxt->txIsrMsg); if(eWLAN_PAL_STATUS_SUCCESS != status) diff --git a/CORE/HDD/src/wlan_hdd_ftm.c b/CORE/HDD/src/wlan_hdd_ftm.c index f99f2bbc4436..421915046082 100644 --- a/CORE/HDD/src/wlan_hdd_ftm.c +++ b/CORE/HDD/src/wlan_hdd_ftm.c @@ -1134,9 +1134,13 @@ VOS_STATUS vos_ftm_preStart( v_CONTEXT_t vosContext ) VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, "vos prestart"); - - - VOS_ASSERT( NULL != pVosContext->pWDAContext); + if (NULL == pVosContext->pWDAContext) + { + VOS_ASSERT(0); + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "%s: WDA NULL context", __func__); + return VOS_STATUS_E_FAILURE; + } /* call macPreStart */ vStatus = macPreStart(pVosContext->pMACContext); diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 7d14d61dc148..648126e8733c 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -7682,8 +7682,14 @@ static int iw_qcom_set_wapi_assoc_info(struct net_device *dev, struct iw_request "%s:LOGP in Progress. Ignore!!!", __func__); return -EBUSY; } - VOS_ASSERT(pWapiAssocInfo); + if (NULL == pWapiAssocInfo) + { + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "%s: WDA NULL context", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_FAILURE; + } hddLog(LOG1, "%s: INPUT DATA:\nElement ID:0x%02x Length:0x%02x Version:0x%04x\n",__func__,pWapiAssocInfo->elementID,pWapiAssocInfo->length,pWapiAssocInfo->version); hddLog(LOG1,"%s: akm Suite Cnt:0x%04x",__func__,pWapiAssocInfo->akmSuiteCount); for(i =0 ; i < 16 ; i++) diff --git a/CORE/SYS/common/src/wlan_qct_sys.c b/CORE/SYS/common/src/wlan_qct_sys.c index 96cd5967a65a..521df3ef0227 100644 --- a/CORE/SYS/common/src/wlan_qct_sys.c +++ b/CORE/SYS/common/src/wlan_qct_sys.c @@ -317,7 +317,13 @@ VOS_STATUS sysMcProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg ) VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; v_VOID_t *hHal; - VOS_ASSERT( pMsg ); + if (NULL == pMsg) + { + VOS_ASSERT(0); + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer to vos_msg_t", __func__); + return VOS_STATUS_E_INVAL; + } // All 'new' SYS messages are identified by a cookie in the reserved // field of the message as well as the message type. This prevents @@ -436,8 +442,13 @@ VOS_STATUS sysTxProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; - VOS_ASSERT( pMsg ); - + if (NULL == pMsg) + { + VOS_ASSERT(0); + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer to vos_msg_t", __func__); + return VOS_STATUS_E_INVAL; + } // All 'new' SYS messages are identified by a cookie in the reserved // field of the message as well as the message type. This prevents // the possibility of overlap in the message types defined for new @@ -502,7 +513,13 @@ VOS_STATUS sysRxProcessMsg( v_CONTEXT_t pVosContext, vos_msg_t *pMsg ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; - VOS_ASSERT( pMsg ); + if (NULL == pMsg) + { + VOS_ASSERT(0); + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "%s: NULL pointer to vos_msg_t", __func__); + return VOS_STATUS_E_INVAL; + } // All 'new' SYS messages are identified by a cookie in the reserved // field of the message as well as the message type. This prevents diff --git a/CORE/SYS/legacy/src/platform/src/VossWrapper.c b/CORE/SYS/legacy/src/platform/src/VossWrapper.c index 57c01ab33cfc..56a5a72e6002 100644 --- a/CORE/SYS/legacy/src/platform/src/VossWrapper.c +++ b/CORE/SYS/legacy/src/platform/src/VossWrapper.c @@ -313,8 +313,22 @@ v_UINT_t tx_timer_create_intern_debug( v_PVOID_t pMacGlobal, TX_TIMER *timer_ptr { VOS_STATUS status; - VOS_ASSERT((NULL != expiration_function) && (NULL != name_ptr)); + if (NULL == expiration_function) + { + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "NULL timer expiration"); + VOS_ASSERT(0); + return TX_TIMER_ERROR; + } + if(NULL == name_ptr) + { + + VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_ERROR, + "NULL name pointer for timer"); + VOS_ASSERT(0); + return TX_TIMER_ERROR; + } if (!initScheduleTimeInTicks) return TX_TICK_ERROR; @@ -371,7 +385,6 @@ v_UINT_t tx_timer_create_intern( v_PVOID_t pMacGlobal, TX_TIMER *timer_ptr, { VOS_STATUS status; - VOS_ASSERT((NULL != expiration_function) && (NULL != name_ptr)); if((NULL == name_ptr) || (NULL == expiration_function)) return TX_TIMER_ERROR; diff --git a/CORE/TL/src/wlan_qct_tl.c b/CORE/TL/src/wlan_qct_tl.c index 14380bb1bce9..38247e51dde8 100644 --- a/CORE/TL/src/wlan_qct_tl.c +++ b/CORE/TL/src/wlan_qct_tl.c @@ -4082,7 +4082,11 @@ WLANTL_GetFrames WDA_TLI_PROCESS_FRAME_LEN( pTLCb->tlMgmtFrmClient.vosPendingDataBuff, usPktLen, uResLen, uTotalPktLen); - VOS_ASSERT(usPktLen <= WLANTL_MAX_ALLOWED_LEN); + if (usPktLen > WLANTL_MAX_ALLOWED_LEN) + { + usPktLen = WLANTL_MAX_ALLOWED_LEN; + VOS_ASSERT(0); + } if ( ( pTLCb->uResCount > uResLen ) && ( uRemaining > uTotalPktLen ) && @@ -4120,7 +4124,11 @@ WLANTL_GetFrames WDA_TLI_PROCESS_FRAME_LEN( pTLCb->tlBAPClient.vosPendingDataBuff, usPktLen, uResLen, uTotalPktLen); - VOS_ASSERT(usPktLen <= WLANTL_MAX_ALLOWED_LEN); + if (usPktLen > WLANTL_MAX_ALLOWED_LEN) + { + usPktLen = WLANTL_MAX_ALLOWED_LEN; + VOS_ASSERT(0); + } if ( ( pTLCb->uResCount > (uResLen + WDA_TLI_MIN_RES_MF ) ) && ( uRemaining > uTotalPktLen )) @@ -4220,7 +4228,11 @@ WLANTL_GetFrames { WDA_TLI_PROCESS_FRAME_LEN( vosTempBuf, usPktLen, uResLen, uTotalPktLen); - VOS_ASSERT( usPktLen <= WLANTL_MAX_ALLOWED_LEN); + if (usPktLen > WLANTL_MAX_ALLOWED_LEN) + { + usPktLen = WLANTL_MAX_ALLOWED_LEN; + VOS_ASSERT(0); + } TLLOG4(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, "WLAN TL:Resources needed by frame: %d", uResLen)); @@ -4368,8 +4380,11 @@ WLANTL_GetFrames { WDA_TLI_PROCESS_FRAME_LEN( vosTempBuf, usPktLen, uResLen, uTotalPktLen); - VOS_ASSERT( usPktLen <= WLANTL_MAX_ALLOWED_LEN); - + if (usPktLen > WLANTL_MAX_ALLOWED_LEN) + { + usPktLen = WLANTL_MAX_ALLOWED_LEN; + VOS_ASSERT(0); + } TLLOG4(VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_INFO_LOW, "WLAN TL:Resources needed by frame: %d", uResLen)); @@ -4462,8 +4477,14 @@ WLANTL_GetFrames vos_pkt_walk_packet_chain( vosRoot, &vosDataBuff, 1/*true*/ ); *pvosDataBuff = vosDataBuff; - VOS_ASSERT( pbUrgent ); - *pbUrgent = pTLCb->bUrgent; + if (pbUrgent) + { + *pbUrgent = pTLCb->bUrgent; + } + else + { + VOS_ASSERT( pbUrgent ); + } return ucResult; }/* WLANTL_GetFrames */ @@ -5142,7 +5163,6 @@ WLANTL_ProcessBAPFrame /* Send packet to BAP client*/ - VOS_ASSERT(pTLCb->tlBAPClient.pfnTlBAPRx != NULL); if ( VOS_STATUS_SUCCESS != WDA_DS_TrimRxPacketInfo( vosTempBuff ) ) { @@ -5173,7 +5193,10 @@ WLANTL_ProcessBAPFrame pTLCb->tlBAPClient.pfnTlBAPRx( vos_get_global_context(VOS_MODULE_ID_TL,pTLCb), vosTempBuff, (WLANTL_BAPFrameEnumType)usType ); - + else + { + VOS_ASSERT(0); + } return VOS_TRUE; } else diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index 9e8e5e138aa4..97cddeffc503 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -649,11 +649,29 @@ VOS_STATUS vos_preStart( v_CONTEXT_t vosContext ) VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_INFO, "vos prestart"); - VOS_ASSERT(gpVosContext == pVosContext); + if (gpVosContext != pVosContext) + { + VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: Context mismatch", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } - VOS_ASSERT( NULL != pVosContext->pMACContext); + if (pVosContext->pMACContext == NULL) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: MAC NULL context", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } - VOS_ASSERT( NULL != pVosContext->pWDAContext); + if (pVosContext->pWDAContext == NULL) + { + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: WDA NULL context", __func__); + VOS_ASSERT(0); + return VOS_STATUS_E_INVAL; + } #if defined(QCA_WIFI_2_0) && !defined(QCA_WIFI_ISOC) scn = vos_get_context(VOS_MODULE_ID_HIF, gpVosContext); diff --git a/CORE/VOSS/src/vos_timer.c b/CORE/VOSS/src/vos_timer.c index 79da562f7cc4..badb44c4899d 100644 --- a/CORE/VOSS/src/vos_timer.c +++ b/CORE/VOSS/src/vos_timer.c @@ -178,8 +178,14 @@ static void vos_linux_timer_callback (unsigned long data) tryAllowingSleep( type ); - VOS_ASSERT( callback ); - + if (callback == NULL) + { + VOS_ASSERT(0); + VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, + "%s: No TIMER callback, Could not enqueue timer to any queue", + __func__); + return; + } // If timer has expired then call vos_client specific callback if ( vos_sched_is_tx_thread( threadId ) ) { diff --git a/CORE/WDA/src/wlan_qct_wda.c b/CORE/WDA/src/wlan_qct_wda.c index 6fc2dbc33063..7f53abcd122b 100644 --- a/CORE/WDA/src/wlan_qct_wda.c +++ b/CORE/WDA/src/wlan_qct_wda.c @@ -10156,7 +10156,13 @@ void WDA_GTKOffloadRespCallback( WDI_GtkOffloadRspParams *pwdiGtkOffloadRsparam VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "<------ %s " ,__func__); - VOS_ASSERT(NULL != pWdaParams); + if(NULL == pWdaParams) + { + VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, + "%s: pWdaParams received NULL", __func__); + VOS_ASSERT(0); + return; + } vos_mem_free(pWdaParams->wdaMsgParam) ; vos_mem_free(pWdaParams->wdaWdiApiMsgParam); @@ -10288,8 +10294,13 @@ void WDA_GtkOffloadGetInfoRespCallback( WDI_GtkOffloadGetInfoRspParams *pwdiGtkO VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_INFO, "<------ %s " ,__func__); - VOS_ASSERT(NULL != pWdaParams); - + if(NULL == pWdaParams) + { + VOS_TRACE( VOS_MODULE_ID_WDA, VOS_TRACE_LEVEL_ERROR, + "%s: pWdaParams received NULL", __func__); + VOS_ASSERT(0); + return; + } pWDA = (tWDA_CbContext *)pWdaParams->pWdaContext ; pGtkOffloadGetInfoReq = (tpSirGtkOffloadGetInfoRspParams)pWdaParams->wdaMsgParam; diff --git a/CORE/WDA/src/wlan_qct_wda_ds.c b/CORE/WDA/src/wlan_qct_wda_ds.c index a271ebbb3021..c188f93d799a 100644 --- a/CORE/WDA/src/wlan_qct_wda_ds.c +++ b/CORE/WDA/src/wlan_qct_wda_ds.c @@ -498,7 +498,8 @@ WDA_DS_BuildTxPacketInfo WLANTL_MAC_ADDR_ALIGN( ucDisableFrmXtl ), (v_PVOID_t)pvDestMacAddr, &usMacAddrSize ); - if ( VOS_STATUS_SUCCESS != vosStatus ) + if ((VOS_STATUS_SUCCESS != vosStatus) || + (usMacAddrSize != VOS_MAC_ADDR_SIZE)) { VOS_TRACE( VOS_MODULE_ID_TL, VOS_TRACE_LEVEL_ERROR, "WDA:Failed while attempting to extract MAC Addr %d", @@ -507,8 +508,6 @@ WDA_DS_BuildTxPacketInfo return VOS_STATUS_E_FAULT; } - VOS_ASSERT(usMacAddrSize == VOS_MAC_ADDR_SIZE); - vos_copy_macaddr( (v_MACADDR_t*)pTxMetaInfo->fSTAMACAddress, pvDestMacAddr ); // ADDR2 diff --git a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c index 60f2ed948769..71c86420f590 100644 --- a/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c +++ b/CORE/WDI/WPAL/src/wlan_qct_pal_packet.c @@ -289,9 +289,14 @@ wpt_status wpalPacketRawTrimHead(wpt_packet *pPkt, wpt_uint32 size) return eWLAN_PAL_STATUS_E_INVAL; } - VOS_ASSERT( (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) || - (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) ); - + if (!((eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) || + (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)))) + { + WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, + "%s : neither 80211 managment packet nor RAW packet", __func__); + VOS_ASSERT(0); + return eWLAN_PAL_STATUS_E_INVAL; + } if( !VOS_IS_STATUS_SUCCESS(vos_pkt_trim_head(WPAL_TO_VOS_PKT(pPkt), (v_SIZE_t)size)) ) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s Invalid trim(%d)", @@ -322,8 +327,15 @@ wpt_status wpalPacketRawTrimTail(wpt_packet *pPkt, wpt_uint32 size) return eWLAN_PAL_STATUS_E_INVAL; } - VOS_ASSERT( (eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) || - (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)) ); + if (!((eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT == WPAL_PACKET_GET_TYPE(pPkt)) || + (eWLAN_PAL_PKT_TYPE_RX_RAW == WPAL_PACKET_GET_TYPE(pPkt)))) + { + WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, + "%s : neither 80211 managment packet nor RAW packet", __func__); + VOS_ASSERT(0); + return eWLAN_PAL_STATUS_E_INVAL; + } + if( !VOS_IS_STATUS_SUCCESS(vos_pkt_trim_tail(WPAL_TO_VOS_PKT(pPkt), (v_SIZE_t)size)) ) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s Invalid trim(%d)", -- cgit v1.2.3 From 1a03a75c1ef04bb27fa96c0381ed0d394f78b0d5 Mon Sep 17 00:00:00 2001 From: Pitani Venkata Rajesh Kumar Date: Fri, 21 Mar 2014 14:56:32 +0530 Subject: Cafstaging Release 1.0.0.68 Cafstaging Release 1.0.0.68 Change-Id: Icb129dba04d9a9eb0b417628b951ca1b6a1053f8 --- CORE/MAC/inc/qwlan_version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 9a0c3bdce988..6f6594213e0a 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 67 +#define QWLAN_VERSION_BUILD 68 -#define QWLAN_VERSIONSTR "1.0.0.67" +#define QWLAN_VERSIONSTR "1.0.0.68" #ifdef QCA_WIFI_2_0 -- cgit v1.2.3