diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h index fa048f1d72ea..f0061bf55ec4 100644 --- a/core/cds/inc/cds_api.h +++ b/core/cds/inc/cds_api.h @@ -292,4 +292,5 @@ bool cds_is_5_mhz_enabled(void); bool cds_is_10_mhz_enabled(void); bool cds_is_sub_20_mhz_enabled(void); bool cds_is_self_recovery_enabled(void); +void cds_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data); #endif /* if !defined __CDS_API_H */ diff --git a/core/cds/inc/cds_crypto.h b/core/cds/inc/cds_crypto.h index 0f6ff79468fd..c3da63bca211 100644 --- a/core/cds/inc/cds_crypto.h +++ b/core/cds/inc/cds_crypto.h @@ -34,28 +34,7 @@ * */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static inline struct crypto_ahash *cds_crypto_alloc_ahash(const char *alg_name, - u32 type, u32 mask) -{ - return crypto_alloc_ahash(alg_name, type, mask); -} +#include static inline struct crypto_cipher * cds_crypto_alloc_cipher(const char *alg_name, u32 type, u32 mask) @@ -68,36 +47,4 @@ static inline void cds_crypto_free_cipher(struct crypto_cipher *tfm) crypto_free_cipher(tfm); } -static inline void cds_crypto_free_ahash(struct crypto_ahash *tfm) -{ - crypto_free_ahash(tfm); -} - -static inline int cds_crypto_ahash_setkey(struct crypto_ahash *tfm, - const u8 *key, unsigned int keylen) -{ - return crypto_ahash_setkey(tfm, key, keylen); -} - -static inline int cds_crypto_ahash_digest(struct ahash_request *req) -{ - return crypto_ahash_digest(req); -} - -static inline struct crypto_ablkcipher * -cds_crypto_alloc_ablkcipher(const char *alg_name, u32 type, u32 mask) -{ - return crypto_alloc_ablkcipher(alg_name, type, mask); -} - -static inline void cds_ablkcipher_request_free(struct ablkcipher_request *req) -{ - ablkcipher_request_free(req); -} - -static inline void cds_crypto_free_ablkcipher(struct crypto_ablkcipher *tfm) -{ - crypto_free_ablkcipher(tfm); -} - #endif /* if !defined __CDS_CRYPTO_H */ diff --git a/core/cds/inc/cds_sched.h b/core/cds/inc/cds_sched.h index 61d8b3074ca5..9739ec4126ca 100644 --- a/core/cds/inc/cds_sched.h +++ b/core/cds/inc/cds_sched.h @@ -551,4 +551,33 @@ void cds_ssr_unprotect(const char *caller_func); bool cds_wait_for_external_threads_completion(const char *caller_func); int cds_get_gfp_flags(void); +/** + * cds_shutdown_notifier_register() - Register for shutdown notification + * @cb : Call back to be called + * @priv : Private pointer to be passed back to call back + * + * During driver remove or shutdown (recovery), external threads might be stuck + * waiting on some event from firmware at lower layers. Remove or shutdown can't + * proceed till the thread completes to avoid any race condition. Call backs can + * be registered here to get early notification of remove or shutdown so that + * waiting thread can be unblocked and hence remove or shutdown can proceed + * further as waiting there may not make sense when FW may already have been + * down. + * + * Return: CDS status + */ +QDF_STATUS cds_shutdown_notifier_register(void (*cb)(void *priv), void *priv); + +/** + * cds_shutdown_notifier_purge() - Purge all the notifiers + * + * Shutdown notifiers are added to provide the early notification of remove or + * shutdown being initiated. Adding this API to purge all the registered call + * backs as they are not useful any more while all the lower layers are being + * shutdown. + * + * Return: None + */ +void cds_shutdown_notifier_purge(void); + #endif /* #if !defined __CDS_SCHED_H */ diff --git a/core/cds/inc/cds_utils.h b/core/cds/inc/cds_utils.h index 0a0cef30f7eb..839ef3dcc6af 100644 --- a/core/cds/inc/cds_utils.h +++ b/core/cds/inc/cds_utils.h @@ -118,72 +118,6 @@ QDF_STATUS cds_crypto_deinit(uint32_t hCryptProv); QDF_STATUS cds_rand_get_bytes(uint32_t handle, uint8_t *pbBuf, uint32_t numBytes); -/** - * cds_sha1_hmac_str - * - * FUNCTION: - * Generate the HMAC-SHA1 of a string given a key. - * - * LOGIC: - * Standard HMAC processing from RFC 2104. The code is provided in the - * appendix of the RFC. - * - * ASSUMPTIONS: - * The RFC is correct. - * - * @param text text to be hashed - * @param textLen length of text - * @param key key to use for HMAC - * @param keyLen length of key - * @param digest holds resultant SHA1 HMAC (20B) - * - * @return QDF_STATUS_SUCCSS if the operation succeeds - * - */ -QDF_STATUS cds_sha1_hmac_str(uint32_t cryptHandle, /* Handle */ - uint8_t *text, /* pointer to data stream */ - uint32_t textLen, /* length of data stream */ - uint8_t *key, /* pointer to authentication key */ - uint32_t keyLen, /* length of authentication key */ - uint8_t digest[CDS_DIGEST_SHA1_SIZE]); /* caller digest to be filled in */ - -/** - * cds_md5_hmac_str - * - * FUNCTION: - * Generate the HMAC-MD5 of a string given a key. - * - * LOGIC: - * Standard HMAC processing from RFC 2104. The code is provided in the - * appendix of the RFC. - * - * ASSUMPTIONS: - * The RFC is correct. - * - * @param text text to be hashed - * @param textLen length of text - * @param key key to use for HMAC - * @param keyLen length of key - * @param digest holds resultant MD5 HMAC (16B) - * - * @return QDF_STATUS_SUCCSS if the operation succeeds - * - */ -QDF_STATUS cds_md5_hmac_str(uint32_t cryptHandle, /* Handle */ - uint8_t *text, /* pointer to data stream */ - uint32_t textLen, /* length of data stream */ - uint8_t *key, /* pointer to authentication key */ - uint32_t keyLen, /* length of authentication key */ - uint8_t digest[CDS_DIGEST_MD5_SIZE]); /* caller digest to be filled in */ - -QDF_STATUS cds_encrypt_aes(uint32_t cryptHandle, /* Handle */ - uint8_t *pText, /* pointer to data stream */ - uint8_t *Encrypted, uint8_t *pKey); /* pointer to authentication key */ - -QDF_STATUS cds_decrypt_aes(uint32_t cryptHandle, /* Handle */ - uint8_t *pText, /* pointer to data stream */ - uint8_t *pDecrypted, uint8_t *pKey); /* pointer to authentication key */ - uint32_t cds_chan_to_freq(uint8_t chan); uint8_t cds_freq_to_chan(uint32_t freq); enum cds_band_type cds_chan_to_band(uint32_t chan); diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c index 0914b0620f1b..07f956662cb5 100644 --- a/core/cds/src/cds_api.c +++ b/core/cds/src/cds_api.c @@ -824,6 +824,8 @@ QDF_STATUS cds_close(v_CONTEXT_t cds_context) QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status)); } + cds_shutdown_notifier_purge(); + cds_deinit_log_completion(); cds_deinit_ini_config(); qdf_timer_module_deinit(); @@ -836,7 +838,11 @@ void cds_flush_cache_rx_queue(void) { uint8_t sta_id; struct ol_txrx_peer_t *peer; - struct ol_txrx_pdev_t *pdev = cds_get_context(QDF_MODULE_ID_TXRX); + struct ol_txrx_pdev_t *pdev; + + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + if (!pdev) + return; for (sta_id = 0; sta_id < WLAN_MAX_STA_COUNT; sta_id++) { peer = ol_txrx_peer_find_by_local_id(pdev, sta_id); @@ -1130,9 +1136,6 @@ QDF_STATUS cds_alloc_context(void *p_cds_context, QDF_MODULE_ID moduleID, return QDF_STATUS_E_NOMEM; } - if (moduleID == QDF_MODULE_ID_TLSHIM) - qdf_mem_zero(*ppModuleContext, size); - *pGpModContext = *ppModuleContext; return QDF_STATUS_SUCCESS; @@ -2293,3 +2296,23 @@ void cds_svc_fw_shutdown_ind(struct device *dev) { hdd_svc_fw_shutdown_ind(dev); } + +/* + * cds_pkt_stats_to_logger_thread() - send pktstats to user + * @pl_hdr: Pointer to pl_hdr + * @pkt_dump: Pointer to pkt_dump data structure. + * @data: Pointer to data + * + * This function is used to send the pkt stats to SVC module. + * + * Return: None + */ +inline void cds_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, + void *data) +{ + if (cds_get_ring_log_level(RING_ID_PER_PACKET_STATS) != + WLAN_LOG_LEVEL_ACTIVE) + return; + + wlan_pkt_stats_to_logger_thread(pl_hdr, pkt_dump, data); +} diff --git a/core/cds/src/cds_concurrency.c b/core/cds/src/cds_concurrency.c index a23a56b51ef7..b297c09f5873 100644 --- a/core/cds/src/cds_concurrency.c +++ b/core/cds/src/cds_concurrency.c @@ -3344,7 +3344,6 @@ void cds_dump_concurrency_info(void) status = hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext); adapterNode = pNext; } - cds_dump_current_concurrency(); hdd_ctx->mcc_mode = cds_current_concurrency_is_mcc(); } @@ -3572,6 +3571,52 @@ static void cds_pdev_set_pcl(enum tQDF_ADAPTER_MODE mode) cds_info("Set PCL to FW for mode:%d", mode); } + +/** + * cds_set_pcl_for_existing_combo() - Set PCL for existing connection + * @mode: Connection mode of type 'cds_con_mode' + * + * Set the PCL for an existing connection + * + * Return: None + */ +static void cds_set_pcl_for_existing_combo(enum cds_con_mode mode) +{ + struct cds_conc_connection_info info; + enum tQDF_ADAPTER_MODE pcl_mode; + + switch (mode) { + case CDS_STA_MODE: + pcl_mode = QDF_STA_MODE; + break; + case CDS_SAP_MODE: + pcl_mode = QDF_SAP_MODE; + break; + case CDS_P2P_CLIENT_MODE: + pcl_mode = QDF_P2P_CLIENT_MODE; + break; + case CDS_P2P_GO_MODE: + pcl_mode = QDF_P2P_GO_MODE; + break; + case CDS_IBSS_MODE: + pcl_mode = QDF_IBSS_MODE; + break; + default: + cds_err("Invalid mode to set PCL"); + return; + }; + + if (cds_mode_specific_connection_count(mode, NULL) > 0) { + /* Check, store and temp delete the mode's parameter */ + cds_store_and_del_conn_info(mode, &info); + /* Set the PCL to the FW since connection got updated */ + cds_pdev_set_pcl(pcl_mode); + cds_info("Set PCL to FW for mode:%d", mode); + /* Restore the connection info */ + cds_restore_deleted_conn_info(&info); + } +} + /** * cds_incr_active_session() - increments the number of active sessions * @mode: Adapter mode @@ -3633,9 +3678,14 @@ void cds_incr_active_session(enum tQDF_ADAPTER_MODE mode, cds_info("Set PCL of STA to FW"); } cds_incr_connection_count(session_id); + if ((cds_mode_specific_connection_count(CDS_STA_MODE, NULL) > 0) && + (mode != QDF_STA_MODE)) { + cds_set_pcl_for_existing_combo(CDS_STA_MODE); + } /* set tdls connection tracker state */ cds_set_tdls_ct_mode(hdd_ctx); + cds_dump_current_concurrency(); qdf_mutex_release(&cds_ctx->qdf_conc_list_lock); } @@ -3709,52 +3759,6 @@ done: return upgrade; } - -/** - * cds_set_pcl_for_existing_combo() - Set PCL for existing connection - * @mode: Connection mode of type 'cds_con_mode' - * - * Set the PCL for an existing connection - * - * Return: None - */ -static void cds_set_pcl_for_existing_combo(enum cds_con_mode mode) -{ - struct cds_conc_connection_info info; - enum tQDF_ADAPTER_MODE pcl_mode; - - switch (mode) { - case CDS_STA_MODE: - pcl_mode = QDF_STA_MODE; - break; - case CDS_SAP_MODE: - pcl_mode = QDF_SAP_MODE; - break; - case CDS_P2P_CLIENT_MODE: - pcl_mode = QDF_P2P_CLIENT_MODE; - break; - case CDS_P2P_GO_MODE: - pcl_mode = QDF_P2P_GO_MODE; - break; - case CDS_IBSS_MODE: - pcl_mode = QDF_IBSS_MODE; - break; - default: - cds_err("Invalid mode to set PCL"); - return; - }; - - if (cds_mode_specific_connection_count(mode, NULL) > 0) { - /* Check, store and temp delete the mode's parameter */ - cds_store_and_del_conn_info(mode, &info); - /* Set the PCL to the FW since connection got updated */ - cds_pdev_set_pcl(pcl_mode); - cds_info("Set PCL to FW for mode:%d", mode); - /* Restore the connection info */ - cds_restore_deleted_conn_info(&info); - } -} - /** * cds_get_pcl_for_existing_conn() - Get PCL for existing connection * @mode: Connection mode of type 'cds_con_mode' @@ -3908,6 +3912,8 @@ void cds_decr_active_session(enum tQDF_ADAPTER_MODE mode, /* set tdls connection tracker state */ cds_set_tdls_ct_mode(hdd_ctx); + cds_dump_current_concurrency(); + qdf_mutex_release(&cds_ctx->qdf_conc_list_lock); } @@ -3963,8 +3969,7 @@ QDF_STATUS cds_deinit_policy_mgr(void) cds_ctx = cds_get_context(QDF_MODULE_ID_QDF); if (!cds_ctx) { cds_err("Invalid CDS Context"); - status = QDF_STATUS_E_FAILURE; - QDF_ASSERT(0); + return QDF_STATUS_E_FAILURE; } if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy @@ -5294,6 +5299,39 @@ static bool cds_vht160_conn_exist(void) return status; } +/** + * cds_is_5g_channel_allowed() - check if 5g channel is allowed + * @channel: channel number which needs to be validated + * @list: list of existing connections. + * @mode: mode against which channel needs to be validated + * + * This API takes the channel as input and compares with existing + * connection channels. If existing connection's channel is DFS channel + * and provided channel is 5G channel then don't allow concurrency to + * happen as MCC with DFS channel is not yet supported + * + * Return: true if 5G channel is allowed, false if not allowed + * + */ +static bool cds_is_5g_channel_allowed(uint8_t channel, uint32_t *list, + enum cds_con_mode mode) +{ + uint32_t index = 0, count = 0; + + count = cds_mode_specific_connection_count(mode, list); + while (index < count) { + if (CDS_IS_DFS_CH(conc_connection_list[list[index]].chan) && + CDS_IS_CHANNEL_5GHZ(channel) && + (channel != conc_connection_list[list[index]].chan)) { + cds_err("don't allow MCC if SAP/GO on DFS channel"); + return false; + } + index++; + } + return true; + +} + /** * cds_allow_concurrency() - Check for allowed concurrency * combination @@ -5357,59 +5395,24 @@ bool cds_allow_concurrency(enum cds_con_mode mode, if (channel) { /* don't allow 3rd home channel on same MAC */ - if (!cds_allow_new_home_channel(channel, - num_connections)) - goto done; - - /* - * If you already have STA connection then don't - * allow any other persona to make connection on DFS channel - * because STA might be on non-DFS right now but later on as - * part of roaming if STA connects to DFS channel which happens - * to be different than requested DFS channel then MCC DFS - * scenario will be encountered - */ - count = cds_mode_specific_connection_count(CDS_STA_MODE, - list); - if ((count > 0) && CDS_IS_DFS_CH(channel)) { - cds_err("STA active, don't allow DFS channel for 2nd connection"); + if (!cds_allow_new_home_channel(channel, num_connections)) goto done; - } /* - * don't allow MCC if SAP/GO on DFS channel or about to come up - * on DFS channel + * 1) DFS MCC is not yet supported + * 2) If you already have STA connection on 5G channel then + * don't allow any other persona to make connection on DFS + * channel because STA 5G + DFS MCC is not allowed. + * 3) If STA is on 2G channel and SAP is coming up on + * DFS channel then allow concurrency but make sure it is + * going to DBS and send PCL to firmware indicating that + * don't allow STA to roam to 5G channels. */ - count = cds_mode_specific_connection_count( - CDS_P2P_GO_MODE, list); - while (index < count) { - if ((CDS_IS_DFS_CH( - conc_connection_list[list[index]].chan)) && - (CDS_IS_CHANNEL_5GHZ(channel)) && - (channel != - conc_connection_list[list[index]].chan)) { - cds_err("don't allow MCC if SAP/GO on DFS channel"); - goto done; - } - index++; - } + if (!cds_is_5g_channel_allowed(channel, list, CDS_P2P_GO_MODE)) + goto done; + if (!cds_is_5g_channel_allowed(channel, list, CDS_SAP_MODE)) + goto done; - index = 0; - count = cds_mode_specific_connection_count( - CDS_SAP_MODE, list); - while (index < count) { - if ((CDS_IS_DFS_CH( - conc_connection_list[list[index]].chan)) && - (CDS_IS_CHANNEL_5GHZ(channel)) && - (channel != - conc_connection_list[list[index]].chan)) { - cds_err("don't allow MCC if SAP/GO on DFS channel"); - goto done; - } - index++; - } - - index = 0; if ((CDS_P2P_GO_MODE == mode) || (CDS_SAP_MODE == mode)) { if (CDS_IS_DFS_CH(channel)) match = cds_disallow_mcc(channel); @@ -6662,11 +6665,11 @@ static bool cds_sta_p2pgo_concur_handle(hdd_adapter_t *sta_adapter, if (p2pgo_channel_num <= 14) { freq = ieee80211_channel_to_frequency( p2pgo_channel_num, - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); } else { freq = ieee80211_channel_to_frequency( p2pgo_channel_num, - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); } qdf_mem_zero(&hdd_avoid_freq_list, sizeof(hdd_avoid_freq_list)); diff --git a/core/cds/src/cds_reg_service.c b/core/cds/src/cds_reg_service.c index 9b6b00d8d079..87706810b97b 100644 --- a/core/cds/src/cds_reg_service.c +++ b/core/cds/src/cds_reg_service.c @@ -469,8 +469,12 @@ static void cds_set_5g_channel_params(uint16_t oper_ch, const struct bonded_chan *bonded_chan_ptr = NULL; const struct bonded_chan *bonded_chan_ptr2 = NULL; - if (CH_WIDTH_MAX <= ch_params->ch_width) - ch_params->ch_width = CH_WIDTH_80P80MHZ; + if (CH_WIDTH_MAX <= ch_params->ch_width) { + if (0 != ch_params->center_freq_seg1) + ch_params->ch_width = CH_WIDTH_80P80MHZ; + else + ch_params->ch_width = CH_WIDTH_160MHZ; + } while (ch_params->ch_width != CH_WIDTH_INVALID) { bonded_chan_ptr = NULL; @@ -482,13 +486,14 @@ static void cds_set_5g_channel_params(uint16_t oper_ch, chan_state = cds_get_5g_bonded_channel_state(oper_ch, ch_params->ch_width); - if (CH_WIDTH_80P80MHZ == ch_params->ch_width) + if (CH_WIDTH_80P80MHZ == ch_params->ch_width) { chan_state2 = cds_get_5g_bonded_channel_state( ch_params->center_freq_seg1 - 2, CH_WIDTH_80MHZ); - chan_state = cds_combine_channel_states(chan_state, - chan_state2); + chan_state = cds_combine_channel_states(chan_state, + chan_state2); + } if ((CHANNEL_STATE_ENABLE == chan_state) || (CHANNEL_STATE_DFS == chan_state)) { diff --git a/core/cds/src/cds_sched.c b/core/cds/src/cds_sched.c index 46b76761bb94..d352a06e71ea 100644 --- a/core/cds/src/cds_sched.c +++ b/core/cds/src/cds_sched.c @@ -73,6 +73,20 @@ struct ssr_protect { static spinlock_t ssr_protect_lock; static struct ssr_protect ssr_protect_log[MAX_SSR_PROTECT_LOG]; +struct shutdown_notifier { + struct list_head list; + void (*cb)(void *priv); + void *priv; +}; + +struct list_head shutdown_notifier_head; + +enum notifier_state { + NOTIFIER_STATE_NONE, + NOTIFIER_STATE_NOTIFYING, +} notifier_state; + + static p_cds_sched_context gp_cds_sched_context; static int cds_mc_thread(void *Arg); @@ -880,7 +894,6 @@ static QDF_STATUS cds_alloc_ol_rx_pkt_freeq(p_cds_sched_context pSchedContext) __func__); goto free; } - memset(pkt, 0, sizeof(*pkt)); spin_lock_bh(&pSchedContext->cds_ol_rx_pkt_freeq_lock); list_add_tail(&pkt->list, &pSchedContext->cds_ol_rx_pkt_freeq); spin_unlock_bh(&pSchedContext->cds_ol_rx_pkt_freeq_lock); @@ -1374,6 +1387,8 @@ void cds_ssr_protect_init(void) ssr_protect_log[i].pid = 0; i++; } + + INIT_LIST_HEAD(&shutdown_notifier_head); } /** @@ -1393,8 +1408,9 @@ static void cds_print_external_threads(void) while (i < MAX_SSR_PROTECT_LOG) { if (!ssr_protect_log[i].free) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "PID %d is stuck at %s", ssr_protect_log[i].pid, - ssr_protect_log[i].func); + "PID %d is executing %s", + ssr_protect_log[i].pid, + ssr_protect_log[i].func); } i++; } @@ -1434,10 +1450,22 @@ void cds_ssr_protect(const char *caller_func) spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + /* + * Dump the protect log at intervals if count is consistently growing. + * Long running functions should tend to dominate the protect log, so + * hopefully, dumping at multiples of log size will prevent spamming the + * logs while telling us which calls are taking a long time to finish. + */ + if (count >= MAX_SSR_PROTECT_LOG && count % MAX_SSR_PROTECT_LOG == 0) { + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, + "Protect Log overflow; Dumping contents:"); + cds_print_external_threads(); + } + if (!status) QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "Could not track PID %d call %s: log is full", - current->pid, caller_func); + "%s can not be protected; PID:%d, entry_count:%d", + caller_func, current->pid, count); } /** @@ -1475,7 +1503,115 @@ void cds_ssr_unprotect(const char *caller_func) if (!status) QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "Untracked call %s", caller_func); + "%s was not protected; PID:%d, entry_count:%d", + caller_func, current->pid, count); +} + +/** + * cds_shutdown_notifier_register() - Register for shutdown notification + * @cb : Call back to be called + * @priv : Private pointer to be passed back to call back + * + * During driver remove or shutdown (recovery), external threads might be stuck + * waiting on some event from firmware at lower layers. Remove or shutdown can't + * proceed till the thread completes to avoid any race condition. Call backs can + * be registered here to get early notification of remove or shutdown so that + * waiting thread can be unblocked and hence remove or shutdown can proceed + * further as waiting there may not make sense when FW may already have been + * down. + * + * This is intended for early notification of remove() or shutdown() only so + * that lower layers can take care of stuffs like external waiting thread. + * + * Return: CDS status + */ +QDF_STATUS cds_shutdown_notifier_register(void (*cb)(void *priv), void *priv) +{ + struct shutdown_notifier *notifier; + unsigned long irq_flags; + + notifier = qdf_mem_malloc(sizeof(*notifier)); + + if (notifier == NULL) + return QDF_STATUS_E_NOMEM; + + /* + * This logic can be simpilfied if there is separate state maintained + * for shutdown and reinit. Right now there is only recovery in progress + * state and it doesn't help to check against it as during reinit some + * of the modules may need to register the call backs. + * For now this logic added to avoid notifier registration happen while + * this function is trying to call the call back with the notification. + */ + spin_lock_irqsave(&ssr_protect_lock, irq_flags); + if (notifier_state == NOTIFIER_STATE_NOTIFYING) { + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + qdf_mem_free(notifier); + return -EINVAL; + } + + notifier->cb = cb; + notifier->priv = priv; + + list_add_tail(¬ifier->list, &shutdown_notifier_head); + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + + return 0; +} + +/** + * cds_shutdown_notifier_purge() - Purge all the notifiers + * + * Shutdown notifiers are added to provide the early notification of remove or + * shutdown being initiated. Adding this API to purge all the registered call + * backs as they are not useful any more while all the lower layers are being + * shutdown. + * + * Return: None + */ +void cds_shutdown_notifier_purge(void) +{ + struct shutdown_notifier *notifier, *temp; + unsigned long irq_flags; + + spin_lock_irqsave(&ssr_protect_lock, irq_flags); + list_for_each_entry_safe(notifier, temp, + &shutdown_notifier_head, list) { + list_del(¬ifier->list); + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + + qdf_mem_free(notifier); + + spin_lock_irqsave(&ssr_protect_lock, irq_flags); + } + + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); +} + +/** + * cds_shutdown_notifier_call() - Call shutdown notifier call back + * + * Call registered shutdown notifier call back to indicate about remove or + * shutdown. + */ +static void cds_shutdown_notifier_call(void) +{ + struct shutdown_notifier *notifier; + unsigned long irq_flags; + + spin_lock_irqsave(&ssr_protect_lock, irq_flags); + notifier_state = NOTIFIER_STATE_NOTIFYING; + + list_for_each_entry(notifier, &shutdown_notifier_head, list) { + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); + + notifier->cb(notifier->priv); + + spin_lock_irqsave(&ssr_protect_lock, irq_flags); + } + + notifier_state = NOTIFIER_STATE_NONE; + spin_unlock_irqrestore(&ssr_protect_lock, irq_flags); } /** @@ -1489,21 +1625,29 @@ void cds_ssr_unprotect(const char *caller_func) bool cds_wait_for_external_threads_completion(const char *caller_func) { int count = MAX_SSR_WAIT_ITERATIONS; + int r; + + cds_shutdown_notifier_call(); while (count) { - if (!atomic_read(&ssr_protect_entry_count)) + r = atomic_read(&ssr_protect_entry_count); + + if (!r) break; if (--count) { QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s: Waiting for active entry points to exit", - __func__); + "%s: Waiting for %d active entry points to exit", + __func__, r); msleep(SSR_WAIT_SLEEP_TIME); } } + /* at least one external thread is executing */ if (!count) { + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, + "Timed-out waiting for active entry points:"); cds_print_external_threads(); return false; } diff --git a/core/cds/src/cds_utils.c b/core/cds/src/cds_utils.c index 5ae79e495d9e..8eaa2f501d4a 100644 --- a/core/cds/src/cds_utils.c +++ b/core/cds/src/cds_utils.c @@ -38,9 +38,6 @@ cds_crypto_init() - Initializes Crypto module cds_crypto_deinit() - De-initializes Crypto module cds_rand_get_bytes() - Generates random byte - cds_sha1_hmac_str() - Generate the HMAC-SHA1 of a string given a key - cds_encrypt_aes() - Generate AES Encrypted byte stream - cds_decrypt_aes() - Decrypts an AES Encrypted byte stream DEPENDENCIES: ============================================================================*/ @@ -426,7 +423,6 @@ cds_attach_mmie(uint8_t *igtk, uint8_t *ipn, uint16_t key_id, * Copy the AAD, Management frame body, and * MMIE with 8 bit MIC zeroed out */ - qdf_mem_zero(input, nBytes); qdf_mem_copy(input, aad, AAD_LEN); /* Copy Management Frame Body and MMIE without MIC */ qdf_mem_copy(input + AAD_LEN, @@ -533,7 +529,6 @@ cds_is_mmie_valid(uint8_t *igtk, uint8_t *ipn, uint8_t *frm, uint8_t *efrm) } /* Copy the AAD, MMIE with 8 bit MIC zeroed out */ - qdf_mem_zero(input, nBytes); qdf_mem_copy(input, aad, AAD_LEN); qdf_mem_copy(input + AAD_LEN, (uint8_t *) (wh + 1), nBytes - AAD_LEN - CMAC_TLEN); @@ -570,532 +565,6 @@ err_tfm: } #endif /* WLAN_FEATURE_11W */ -/** - * cds_sha1_hmac_str - * - * FUNCTION: - * Generate the HMAC-SHA1 of a string given a key. - * - * LOGIC: - * Standard HMAC processing from RFC 2104. The code is provided in the - * appendix of the RFC. - * - * ASSUMPTIONS: - * The RFC is correct. - * - * @param text text to be hashed - * @param textLen length of text - * @param key key to use for HMAC - * @param keyLen length of key - * @param digest holds resultant SHA1 HMAC (20B) - * - * @return QDF_STATUS_SUCCSS if the operation succeeds - * - */ - -struct hmac_sha1_result { - struct completion completion; - int err; -}; - -static void hmac_sha1_complete(struct crypto_async_request *req, int err) -{ - struct hmac_sha1_result *r = req->data; - if (err == -EINPROGRESS) - return; - r->err = err; - complete(&r->completion); -} - -static int -hmac_sha1(uint8_t *key, uint8_t ksize, char *plaintext, uint8_t psize, - uint8_t *output, uint8_t outlen) -{ - int ret = 0; - struct crypto_ahash *tfm; - struct scatterlist sg; - struct ahash_request *req; - struct hmac_sha1_result tresult; - void *hash_buff = NULL; - - unsigned char hash_result[64]; - int i; - - memset(output, 0, outlen); - - init_completion(&tresult.completion); - - tfm = cds_crypto_alloc_ahash("hmac(sha1)", CRYPTO_ALG_TYPE_AHASH, - CRYPTO_ALG_TYPE_AHASH_MASK); - if (IS_ERR(tfm)) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_alloc_ahash failed"); - ret = PTR_ERR(tfm); - goto err_tfm; - } - - req = ahash_request_alloc(tfm, GFP_KERNEL); - if (!req) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "failed to allocate request for hmac(sha1)"); - ret = -ENOMEM; - goto err_req; - } - - ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - hmac_sha1_complete, &tresult); - - hash_buff = kzalloc(psize, GFP_KERNEL); - if (!hash_buff) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "failed to kzalloc hash_buff"); - ret = -ENOMEM; - goto err_hash_buf; - } - - memset(hash_result, 0, 64); - memcpy(hash_buff, plaintext, psize); - sg_init_one(&sg, hash_buff, psize); - - if (ksize) { - crypto_ahash_clear_flags(tfm, ~0); - ret = cds_crypto_ahash_setkey(tfm, key, ksize); - if (ret) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_ahash_setkey failed"); - goto err_setkey; - } - } - - ahash_request_set_crypt(req, &sg, hash_result, psize); - ret = cds_crypto_ahash_digest(req); - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, "ret 0x%x", ret); - - switch (ret) { - case 0: - for (i = 0; i < outlen; i++) - output[i] = hash_result[i]; - break; - case -EINPROGRESS: - case -EBUSY: - ret = wait_for_completion_interruptible(&tresult.completion); - if (!ret && !tresult.err) { - for (i = 0; i < outlen; i++) - output[i] = hash_result[i]; - INIT_COMPLETION(tresult.completion); - break; - } else { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "wait_for_completion_interruptible failed"); - if (!ret) - ret = tresult.err; - goto out; - } - default: - goto out; - } - -out: -err_setkey: - kfree(hash_buff); -err_hash_buf: - ahash_request_free(req); -err_req: - cds_crypto_free_ahash(tfm); -err_tfm: - return ret; -} - -QDF_STATUS cds_sha1_hmac_str(uint32_t cryptHandle, /* Handle */ - uint8_t *pText, /* pointer to data stream */ - uint32_t textLen, /* length of data stream */ - uint8_t *pKey, /* pointer to authentication key */ - uint32_t keyLen, /* length of authentication key */ - uint8_t digest[CDS_DIGEST_SHA1_SIZE]) -{ /* caller digest to be filled in */ - int ret = 0; - - ret = hmac_sha1(pKey, /* uint8_t *key, */ - (uint8_t) keyLen, /* uint8_t ksize, */ - (char *)pText, /* char *plaintext, */ - (uint8_t) textLen, /* uint8_t psize, */ - digest, /* uint8_t *output, */ - CDS_DIGEST_SHA1_SIZE /* uint8_t outlen */ - ); - - if (ret != 0) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "hmac_sha1() call failed"); - return QDF_STATUS_E_FAULT; - } - - return QDF_STATUS_SUCCESS; -} - -/** - * cds_md5_hmac_str - * - * FUNCTION: - * Generate the HMAC-MD5 of a string given a key. - * - * LOGIC: - * Standard HMAC processing from RFC 2104. The code is provided in the - * appendix of the RFC. - * - * ASSUMPTIONS: - * The RFC is correct. - * - * @param text text to be hashed - * @param textLen length of text - * @param key key to use for HMAC - * @param keyLen length of key - * @param digest holds resultant MD5 HMAC (20B) - * - * @return QDF_STATUS_SUCCSS if the operation succeeds - * - */ -struct hmac_md5_result { - struct completion completion; - int err; -}; - -static void hmac_md5_complete(struct crypto_async_request *req, int err) -{ - struct hmac_md5_result *r = req->data; - if (err == -EINPROGRESS) - return; - r->err = err; - complete(&r->completion); -} - -static int -hmac_md5(uint8_t *key, uint8_t ksize, char *plaintext, uint8_t psize, - uint8_t *output, uint8_t outlen) -{ - int ret = 0; - struct crypto_ahash *tfm; - struct scatterlist sg; - struct ahash_request *req; - struct hmac_md5_result tresult = {.err = 0 }; - void *hash_buff = NULL; - - unsigned char hash_result[64]; - int i; - - memset(output, 0, outlen); - - init_completion(&tresult.completion); - - tfm = cds_crypto_alloc_ahash("hmac(md5)", CRYPTO_ALG_TYPE_AHASH, - CRYPTO_ALG_TYPE_AHASH_MASK); - if (IS_ERR(tfm)) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_alloc_ahash failed"); - ret = PTR_ERR(tfm); - goto err_tfm; - } - - req = ahash_request_alloc(tfm, GFP_KERNEL); - if (!req) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "failed to allocate request for hmac(md5)"); - ret = -ENOMEM; - goto err_req; - } - - ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - hmac_md5_complete, &tresult); - - hash_buff = kzalloc(psize, GFP_KERNEL); - if (!hash_buff) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "failed to kzalloc hash_buff"); - ret = -ENOMEM; - goto err_hash_buf; - } - - memset(hash_result, 0, 64); - memcpy(hash_buff, plaintext, psize); - sg_init_one(&sg, hash_buff, psize); - - if (ksize) { - crypto_ahash_clear_flags(tfm, ~0); - ret = cds_crypto_ahash_setkey(tfm, key, ksize); - if (ret) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_ahash_setkey failed"); - goto err_setkey; - } - } - - ahash_request_set_crypt(req, &sg, hash_result, psize); - ret = cds_crypto_ahash_digest(req); - - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, "ret 0x%x", ret); - - switch (ret) { - case 0: - for (i = 0; i < outlen; i++) - output[i] = hash_result[i]; - break; - case -EINPROGRESS: - case -EBUSY: - ret = wait_for_completion_interruptible(&tresult.completion); - if (!ret && !tresult.err) { - INIT_COMPLETION(tresult.completion); - break; - } else { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "wait_for_completion_interruptible failed"); - if (!ret) - ret = tresult.err; - goto out; - } - default: - goto out; - } - -out: -err_setkey: - kfree(hash_buff); -err_hash_buf: - ahash_request_free(req); -err_req: - cds_crypto_free_ahash(tfm); -err_tfm: - return ret; -} - -QDF_STATUS cds_md5_hmac_str(uint32_t cryptHandle, /* Handle */ - uint8_t *pText, /* pointer to data stream */ - uint32_t textLen, /* length of data stream */ - uint8_t *pKey, /* pointer to authentication key */ - uint32_t keyLen, /* length of authentication key */ - uint8_t digest[CDS_DIGEST_MD5_SIZE]) -{ /* caller digest to be filled in */ - int ret = 0; - - ret = hmac_md5(pKey, /* uint8_t *key, */ - (uint8_t) keyLen, /* uint8_t ksize, */ - (char *)pText, /* char *plaintext, */ - (uint8_t) textLen, /* uint8_t psize, */ - digest, /* uint8_t *output, */ - CDS_DIGEST_MD5_SIZE /* uint8_t outlen */ - ); - - if (ret != 0) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "hmac_md5() call failed"); - return QDF_STATUS_E_FAULT; - } - - return QDF_STATUS_SUCCESS; -} - -struct ecb_aes_result { - struct completion completion; - int err; -}; - -static void ecb_aes_complete(struct crypto_async_request *req, int err) -{ - struct ecb_aes_result *r = req->data; - if (err == -EINPROGRESS) - return; - r->err = err; - complete(&r->completion); -} - -/*-------------------------------------------------------------------------- - - \brief cds_encrypt_aes() - Generate AES Encrypted byte stream - - The cds_encrypt_aes() function generates the encrypted byte stream for given text. - - Buffer should be allocated before calling cds_rand_get_bytes(). - - Attempting to initialize an already initialized lock results in - a failure. - - \param lock - pointer to the opaque lock object to initialize - - \return QDF_STATUS_SUCCESS - Successfully generated random memory. - - QDF_STATUS_E_FAULT - pbBuf is an invalid pointer. - - QDF_STATUS_E_FAILURE - default return value if it fails due to - unknown reasons - - ***QDF_STATUS_E_RESOURCES - System resources (other than memory) - are unavailable - \sa - - ( *** return value not considered yet ) - --------------------------------------------------------------------------*/ - -QDF_STATUS cds_encrypt_aes(uint32_t cryptHandle, /* Handle */ - uint8_t *pPlainText, /* pointer to data stream */ - uint8_t *pCiphertext, uint8_t *pKey) -{ /* pointer to authentication key */ - struct ecb_aes_result result; - struct ablkcipher_request *req; - struct crypto_ablkcipher *tfm; - int ret = 0; - char iv[IV_SIZE_AES_128]; - struct scatterlist sg_in; - struct scatterlist sg_out; - - init_completion(&result.completion); - - tfm = cds_crypto_alloc_ablkcipher("cbc(aes)", 0, 0); - if (IS_ERR(tfm)) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_alloc_ablkcipher failed"); - ret = PTR_ERR(tfm); - goto err_tfm; - } - - req = ablkcipher_request_alloc(tfm, GFP_KERNEL); - if (!req) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "Failed to allocate request for cbc(aes)"); - ret = -ENOMEM; - goto err_req; - } - - ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - ecb_aes_complete, &result); - - crypto_ablkcipher_clear_flags(tfm, ~0); - - ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128); - if (ret) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_cipher_setkey failed"); - goto err_setkey; - } - - memset(iv, 0, IV_SIZE_AES_128); - - sg_init_one(&sg_in, pPlainText, AES_BLOCK_SIZE); - - sg_init_one(&sg_out, pCiphertext, AES_BLOCK_SIZE); - - ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv); - - crypto_ablkcipher_encrypt(req); - -/* ------------------------------------- */ -err_setkey: - cds_ablkcipher_request_free(req); -err_req: - cds_crypto_free_ablkcipher(tfm); -err_tfm: - /* return ret; */ - if (ret != 0) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s() call failed", __func__); - return QDF_STATUS_E_FAULT; - } - - return QDF_STATUS_SUCCESS; -} - -/*-------------------------------------------------------------------------- - - \brief cds_decrypt_aes() - Decrypts an AES Encrypted byte stream - - The cds_decrypt_aes() function decrypts the encrypted byte stream. - - Buffer should be allocated before calling cds_rand_get_bytes(). - - Attempting to initialize an already initialized lock results in - a failure. - - \param lock - pointer to the opaque lock object to initialize - - \return QDF_STATUS_SUCCESS - Successfully generated random memory. - - QDF_STATUS_E_FAULT - pbBuf is an invalid pointer. - - QDF_STATUS_E_FAILURE - default return value if it fails due to - unknown reasons - - ***QDF_STATUS_E_RESOURCES - System resources (other than memory) - are unavailable - \sa - - ( *** return value not considered yet ) - --------------------------------------------------------------------------*/ - -QDF_STATUS cds_decrypt_aes(uint32_t cryptHandle, /* Handle */ - uint8_t *pText, /* pointer to data stream */ - uint8_t *pDecrypted, uint8_t *pKey) -{ /* pointer to authentication key */ -/* QDF_STATUS uResult = QDF_STATUS_E_FAILURE; */ - struct ecb_aes_result result; - struct ablkcipher_request *req; - struct crypto_ablkcipher *tfm; - int ret = 0; - char iv[IV_SIZE_AES_128]; - struct scatterlist sg_in; - struct scatterlist sg_out; - - init_completion(&result.completion); - - tfm = cds_crypto_alloc_ablkcipher("cbc(aes)", 0, 0); - if (IS_ERR(tfm)) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_alloc_ablkcipher failed"); - ret = PTR_ERR(tfm); - goto err_tfm; - } - - req = ablkcipher_request_alloc(tfm, GFP_KERNEL); - if (!req) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "Failed to allocate request for cbc(aes)"); - ret = -ENOMEM; - goto err_req; - } - - ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, - ecb_aes_complete, &result); - - crypto_ablkcipher_clear_flags(tfm, ~0); - - ret = crypto_ablkcipher_setkey(tfm, pKey, AES_KEYSIZE_128); - if (ret) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "crypto_cipher_setkey failed"); - goto err_setkey; - } - - memset(iv, 0, IV_SIZE_AES_128); - - sg_init_one(&sg_in, pText, AES_BLOCK_SIZE); - - sg_init_one(&sg_out, pDecrypted, AES_BLOCK_SIZE); - - ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv); - - crypto_ablkcipher_decrypt(req); - -/* ------------------------------------- */ -err_setkey: - cds_ablkcipher_request_free(req); -err_req: - cds_crypto_free_ablkcipher(tfm); -err_tfm: - /* return ret; */ - if (ret != 0) { - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, - "%s() call failed", __func__); - return QDF_STATUS_E_FAULT; - } - - return QDF_STATUS_SUCCESS; -} uint32_t cds_chan_to_freq(uint8_t chan) { diff --git a/core/dp/htt/htt.c b/core/dp/htt/htt.c index 987eeecc7d38..80fb269b7dbb 100644 --- a/core/dp/htt/htt.c +++ b/core/dp/htt/htt.c @@ -294,7 +294,6 @@ htt_pdev_alloc(ol_txrx_pdev_handle txrx_pdev, pdev->txrx_pdev = txrx_pdev; pdev->htc_pdev = htc_pdev; - qdf_mem_set(&pdev->stats, sizeof(pdev->stats), 0); pdev->htt_htc_pkt_freelist = NULL; #ifdef ATH_11AC_TXCOMPACT pdev->htt_htc_pkt_misclist = NULL; diff --git a/core/dp/htt/htt_internal.h b/core/dp/htt/htt_internal.h index 69fe95e44cb5..b26b58a63d8e 100644 --- a/core/dp/htt/htt_internal.h +++ b/core/dp/htt/htt_internal.h @@ -135,8 +135,10 @@ struct htt_host_rx_desc_base { struct rx_buf_debug { qdf_dma_addr_t paddr; qdf_nbuf_t nbuf; - void *nbuf_data; - bool in_use; + void *nbuf_data; /* lsb of this field is used for "in_use" */ + /* bool in_use; */ + uint64_t ts; /* timestamp */ + }; #endif @@ -619,6 +621,8 @@ void htt_rx_dbg_rxbuf_init(struct htt_pdev_t *pdev) if (!pdev->rx_buff_list) { qdf_print("HTT: debug RX buffer allocation failed\n"); QDF_ASSERT(0); + } else { + qdf_spinlock_create(&(pdev->rx_buff_list_lock)); } } @@ -634,16 +638,24 @@ static inline void htt_rx_dbg_rxbuf_set(struct htt_pdev_t *pdev, qdf_dma_addr_t paddr, qdf_nbuf_t rx_netbuf) { + void *tmp; if (pdev->rx_buff_list) { + qdf_spin_lock_bh(&(pdev->rx_buff_list_lock)); pdev->rx_buff_list[pdev->rx_buff_index].paddr = paddr; - pdev->rx_buff_list[pdev->rx_buff_index].in_use = true; pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data = rx_netbuf->data; + /* pdev->rx_buff_list[pdev->rx_buff_index].in_use = true; */ + tmp = pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data; + tmp = (void *)((uint64_t) tmp | 0x01); + pdev->rx_buff_list[pdev->rx_buff_index].nbuf_data = tmp; pdev->rx_buff_list[pdev->rx_buff_index].nbuf = rx_netbuf; + pdev->rx_buff_list[pdev->rx_buff_index].ts = + qdf_get_log_timestamp(); NBUF_MAP_ID(rx_netbuf) = pdev->rx_buff_index; if (++pdev->rx_buff_index == HTT_RX_RING_BUFF_DBG_LIST) pdev->rx_buff_index = 0; + qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock)); } } @@ -658,12 +670,20 @@ void htt_rx_dbg_rxbuf_reset(struct htt_pdev_t *pdev, qdf_nbuf_t netbuf) { uint32_t index; + void *tmp; if (pdev->rx_buff_list) { + qdf_spin_lock_bh(&(pdev->rx_buff_list_lock)); index = NBUF_MAP_ID(netbuf); if (index < HTT_RX_RING_BUFF_DBG_LIST) { - pdev->rx_buff_list[index].in_use = false; + /* in_use = false */ + tmp = pdev->rx_buff_list[index].nbuf_data; + tmp = (void *)((uint64_t)tmp & 0xfffffffffffffffe); + pdev->rx_buff_list[index].nbuf_data = tmp; + pdev->rx_buff_list[index].ts = + qdf_get_log_timestamp(); } + qdf_spin_unlock_bh(&(pdev->rx_buff_list_lock)); } } /** diff --git a/core/dp/htt/htt_rx.c b/core/dp/htt/htt_rx.c index 62820e0e8720..b99d3b0f1cc8 100644 --- a/core/dp/htt/htt_rx.c +++ b/core/dp/htt/htt_rx.c @@ -60,6 +60,7 @@ #include #include #endif +#include #ifdef HTT_DEBUG_DATA #define HTT_PKT_DUMP(x) x @@ -1375,9 +1376,39 @@ htt_rx_offload_msdu_pop_hl(htt_pdev_handle pdev, qdf_nbuf_t *head_buf, qdf_nbuf_t *tail_buf) { - return 0; -} + adf_nbuf_t buf; + u_int32_t *msdu_hdr, msdu_len; + int ret = 0; + *head_buf = *tail_buf = buf = offload_deliver_msg; + msdu_hdr = (u_int32_t *)adf_nbuf_data(buf); + /* First dword */ + + /* Second dword */ + msdu_hdr++; + msdu_len = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_LEN_GET(*msdu_hdr); + *peer_id = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_PEER_ID_GET(*msdu_hdr); + + /* Third dword */ + msdu_hdr++; + *vdev_id = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_VDEV_ID_GET(*msdu_hdr); + *tid = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_TID_GET(*msdu_hdr); + *fw_desc = HTT_RX_OFFLOAD_DELIVER_IND_MSDU_DESC_GET(*msdu_hdr); + + adf_nbuf_pull_head(buf, HTT_RX_OFFLOAD_DELIVER_IND_MSDU_HDR_BYTES \ + + HTT_RX_OFFLOAD_DELIVER_IND_HDR_BYTES); + + if (msdu_len <= adf_nbuf_len(buf)) { + adf_nbuf_set_pktlen(buf, msdu_len); + } else { + adf_os_print("%s: drop frame with invalid msdu len %d %d\n", + __FUNCTION__, msdu_len, (int)adf_nbuf_len(buf)); + adf_nbuf_free(offload_deliver_msg); + ret = -1; + } + + return ret; +} #endif int @@ -1968,6 +1999,7 @@ htt_rx_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev, uint8_t offload_ind, frag_ind; struct htt_host_rx_desc_base *rx_desc; uint8_t peer_id; + enum rx_pkt_fate status = RX_PKT_FATE_SUCCESS; HTT_ASSERT1(htt_rx_in_order_ring_elems(pdev) != 0); @@ -2026,6 +2058,7 @@ htt_rx_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev, */ qdf_nbuf_pull_head(msdu, HTT_RX_STD_DESC_RESERVATION); + QDF_NBUF_CB_DP_TRACE_PRINT(msdu) = false; qdf_dp_trace_set_track(msdu, QDF_RX); QDF_NBUF_CB_TX_PACKET_TRACK(msdu) = QDF_NBUF_TX_PKT_DATA_TRACK; ol_rx_log_packet(pdev, peer_id, msdu); @@ -2053,6 +2086,15 @@ htt_rx_amsdu_rx_in_order_pop_ll(htt_pdev_handle pdev, msdu_count--; + /* calling callback function for packet logging */ + if (pdev->rx_pkt_dump_cb) { + if (qdf_unlikely((*((u_int8_t *) + &rx_desc->fw_desc.u.val)) & + FW_RX_DESC_ANY_ERR_M)) + status = RX_PKT_FATE_FW_DROP_INVALID; + pdev->rx_pkt_dump_cb(msdu, peer_id, status); + } + if (qdf_unlikely((*((u_int8_t *) &rx_desc->fw_desc.u.val)) & FW_RX_DESC_ANY_ERR_M)) { uint8_t tid = @@ -3506,3 +3548,51 @@ int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev) return 0; } #endif /* IPA_OFFLOAD */ + +/** + * htt_register_rx_pkt_dump_callback() - registers callback to + * get rx pkt status and call callback to do rx packet dump + * + * @pdev: htt pdev handle + * @callback: callback to get rx pkt status and + * call callback to do rx packet dump + * + * This function is used to register the callback to get + * rx pkt status and call callback to do rx packet dump + * + * Return: None + * + */ +void htt_register_rx_pkt_dump_callback(struct htt_pdev_t *pdev, + tp_rx_pkt_dump_cb callback) +{ + if (!pdev) { + qdf_print("%s: htt pdev is NULL, rx packet status callback register unsuccessful\n", + __func__); + return; + } + pdev->rx_pkt_dump_cb = callback; +} + +/** + * htt_deregister_rx_pkt_dump_callback() - deregisters callback to + * get rx pkt status and call callback to do rx packet dump + * + * @pdev: htt pdev handle + * + * This function is used to deregister the callback to get + * rx pkt status and call callback to do rx packet dump + * + * Return: None + * + */ +void htt_deregister_rx_pkt_dump_callback(struct htt_pdev_t *pdev) +{ + if (!pdev) { + qdf_print("%s: htt pdev is NULL, rx packet status callback deregister unsuccessful\n", + __func__); + return; + } + pdev->rx_pkt_dump_cb = NULL; +} + diff --git a/core/dp/htt/htt_t2h.c b/core/dp/htt/htt_t2h.c index c7863a618613..9d044f3e8c0b 100644 --- a/core/dp/htt/htt_t2h.c +++ b/core/dp/htt/htt_t2h.c @@ -213,7 +213,15 @@ void htt_t2h_lp_msg_handler(void *context, qdf_nbuf_t htt_t2h_msg, ol_rx_offload_deliver_ind_handler(pdev->txrx_pdev, htt_t2h_msg, msdu_cnt); - break; + if (pdev->cfg.is_high_latency) { + /* + * return here for HL to avoid double free on + * htt_t2h_msg + */ + return; + } else { + break; + } } case HTT_T2H_MSG_TYPE_RX_FRAG_IND: { diff --git a/core/dp/htt/htt_tx.c b/core/dp/htt/htt_tx.c index a3246eeaa3f5..b647ceca6d1f 100644 --- a/core/dp/htt/htt_tx.c +++ b/core/dp/htt/htt_tx.c @@ -1240,9 +1240,6 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev, return_code = -ENOBUFS; goto free_tx_comp_base; } - qdf_mem_zero(pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg, - uc_tx_buf_cnt * - sizeof(*pdev->ipa_uc_tx_rsc.tx_buf_pool_vaddr_strg)); pdev->ipa_uc_tx_rsc.paddr_strg = qdf_mem_malloc(uc_tx_buf_cnt * @@ -1252,9 +1249,6 @@ int htt_tx_ipa_uc_attach(struct htt_pdev_t *pdev, return_code = -ENOBUFS; goto free_tx_comp_base; } - qdf_mem_zero(pdev->ipa_uc_tx_rsc.paddr_strg, - uc_tx_buf_cnt * - sizeof(*pdev->ipa_uc_tx_rsc.paddr_strg)); pdev->ipa_uc_tx_rsc.alloc_tx_buf_cnt = htt_tx_ipa_uc_wdi_tx_buf_alloc( pdev, uc_tx_buf_sz, uc_tx_buf_cnt, uc_tx_partition_base); diff --git a/core/dp/htt/htt_types.h b/core/dp/htt/htt_types.h index 9c67355e74a1..cb4e885d5521 100644 --- a/core/dp/htt/htt_types.h +++ b/core/dp/htt/htt_types.h @@ -35,6 +35,7 @@ #include /* qdf_atomic_inc */ #include /* qdf_nbuf_t */ #include /* HTC_PACKET */ +#include #define DEBUG_DMA_DONE @@ -410,8 +411,13 @@ struct htt_pdev_t { #ifdef DEBUG_RX_RING_BUFFER struct rx_buf_debug *rx_buff_list; + qdf_spinlock_t rx_buff_list_lock; int rx_buff_index; #endif + + /* callback function for packetdump */ + tp_rx_pkt_dump_cb rx_pkt_dump_cb; + struct mon_channel mon_ch_info; }; diff --git a/core/dp/ol/inc/ol_htt_api.h b/core/dp/ol/inc/ol_htt_api.h index 21da2649125c..311de8896708 100644 --- a/core/dp/ol/inc/ol_htt_api.h +++ b/core/dp/ol/inc/ol_htt_api.h @@ -384,5 +384,11 @@ static inline void htt_clear_bundle_stats(struct htt_pdev_t *pdev) #endif void htt_mark_first_wakeup_packet(htt_pdev_handle pdev, uint8_t value); +typedef void (*tp_rx_pkt_dump_cb)(qdf_nbuf_t msdu, uint8_t peer_id, + uint8_t status); +void htt_register_rx_pkt_dump_callback(struct htt_pdev_t *pdev, + tp_rx_pkt_dump_cb ol_rx_pkt_dump_call); +void htt_deregister_rx_pkt_dump_callback(struct htt_pdev_t *pdev); +void ol_rx_pkt_dump_call(qdf_nbuf_t msdu, uint8_t peer_id, uint8_t status); #endif /* _OL_HTT_API__H_ */ diff --git a/core/dp/ol/inc/ol_txrx_api.h b/core/dp/ol/inc/ol_txrx_api.h index f350ecfa7d73..b0d56ee1df62 100644 --- a/core/dp/ol/inc/ol_txrx_api.h +++ b/core/dp/ol/inc/ol_txrx_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2014, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -60,4 +60,10 @@ enum ol_sec_type { ol_sec_type_types }; +typedef void (*tp_ol_packetdump_cb)(qdf_nbuf_t netbuf, + uint8_t status, uint8_t vdev_id, uint8_t type); +void ol_register_packetdump_callback(tp_ol_packetdump_cb ol_tx_packetdump_cb, + tp_ol_packetdump_cb ol_rx_packetdump_cb); +void ol_deregister_packetdump_callback(void); + #endif /* _OL_TXRX_API__H_ */ diff --git a/core/dp/txrx/ol_rx.c b/core/dp/txrx/ol_rx.c index 4d9dc4aac1a9..1897c95c929a 100644 --- a/core/dp/txrx/ol_rx.c +++ b/core/dp/txrx/ol_rx.c @@ -58,6 +58,7 @@ #include #include #include +#include "pktlog_ac_fmt.h" #include @@ -625,7 +626,7 @@ ol_rx_indication_handler(ol_txrx_pdev_handle pdev, if (status != htt_rx_status_ctrl_mgmt_null) { /* Pktlog */ ol_rx_send_pktlog_event(pdev, - peer, head_msdu, 1); + peer, msdu, 1); } #endif if (status == htt_rx_status_err_inv_peer) { @@ -851,21 +852,21 @@ ol_rx_offload_deliver_ind_handler(ol_txrx_pdev_handle pdev, htt_pdev_handle htt_pdev = pdev->htt_pdev; while (msdu_cnt) { - htt_rx_offload_msdu_pop(htt_pdev, msg, &vdev_id, &peer_id, - &tid, &fw_desc, &head_buf, &tail_buf); - - peer = ol_txrx_peer_find_by_id(pdev, peer_id); - if (peer) { - ol_rx_data_process(peer, head_buf); - } else { - buf = head_buf; - while (1) { - qdf_nbuf_t next; - next = qdf_nbuf_next(buf); - htt_rx_desc_frame_free(htt_pdev, buf); - if (buf == tail_buf) - break; - buf = next; + if (!htt_rx_offload_msdu_pop(htt_pdev, msg, &vdev_id, &peer_id, + &tid, &fw_desc, &head_buf, &tail_buf)) { + peer = ol_txrx_peer_find_by_id(pdev, peer_id); + if (peer) { + ol_rx_data_process(peer, head_buf); + } else { + buf = head_buf; + while (1) { + qdf_nbuf_t next; + next = qdf_nbuf_next(buf); + htt_rx_desc_frame_free(htt_pdev, buf); + if (buf == tail_buf) + break; + buf = next; + } } } msdu_cnt--; @@ -1400,6 +1401,51 @@ ol_rx_in_order_indication_handler(ol_txrx_pdev_handle pdev, peer->rx_opt_proc(vdev, peer, tid, head_msdu); } +/** + * ol_rx_pkt_dump_call() - updates status and + * calls packetdump callback to log rx packet + * + * @msdu: rx packet + * @peer_id: peer id + * @status: status of rx packet + * + * This function is used to update the status of rx packet + * and then calls packetdump callback to log that packet. + * + * Return: None + * + */ +void ol_rx_pkt_dump_call( + qdf_nbuf_t msdu, + uint8_t peer_id, + uint8_t status) +{ + v_CONTEXT_t vos_context; + ol_txrx_pdev_handle pdev; + struct ol_txrx_peer_t *peer = NULL; + + vos_context = cds_get_global_context(); + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + if (!pdev) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: pdev is NULL", __func__); + return; + } + + if (pdev->ol_rx_packetdump_cb) { + peer = ol_txrx_peer_find_by_id(pdev, peer_id); + if (!peer) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: peer with peer id %d is NULL", __func__, + peer_id); + return; + } + pdev->ol_rx_packetdump_cb(msdu, status, peer->vdev->vdev_id, + RX_DATA_PKT); + } +} + /* the msdu_list passed here must be NULL terminated */ void ol_rx_in_order_deliver(struct ol_txrx_vdev_t *vdev, @@ -1469,7 +1515,10 @@ ol_rx_offload_paddr_deliver_ind_handler(htt_pdev_handle htt_pdev, peer = ol_txrx_peer_find_by_id(htt_pdev->txrx_pdev, peer_id); if (peer) { + QDF_NBUF_CB_DP_TRACE_PRINT(head_buf) = false; qdf_dp_trace_set_track(head_buf, QDF_RX); + QDF_NBUF_CB_TX_PACKET_TRACK(head_buf) = + QDF_NBUF_TX_PKT_DATA_TRACK; qdf_dp_trace_log_pkt(peer->vdev->vdev_id, head_buf, QDF_RX); DPTRACE(qdf_dp_trace(head_buf, diff --git a/core/dp/txrx/ol_rx_reorder.c b/core/dp/txrx/ol_rx_reorder.c index 2572ccdc34d0..5116cf0c0a6f 100644 --- a/core/dp/txrx/ol_rx_reorder.c +++ b/core/dp/txrx/ol_rx_reorder.c @@ -492,7 +492,6 @@ ol_rx_addba_handler(ol_txrx_pdev_handle pdev, round_pwr2_win_sz * sizeof(struct ol_rx_reorder_array_elem_t); rx_reorder->array = qdf_mem_malloc(array_size); TXRX_ASSERT1(rx_reorder->array); - qdf_mem_set(rx_reorder->array, array_size, 0x0); rx_reorder->win_sz_mask = round_pwr2_win_sz - 1; rx_reorder->num_mpdus = 0; diff --git a/core/dp/txrx/ol_tx.c b/core/dp/txrx/ol_tx.c index da265080de5e..1f171c07e9e0 100644 --- a/core/dp/txrx/ol_tx.c +++ b/core/dp/txrx/ol_tx.c @@ -625,7 +625,8 @@ ol_tx_ll_fast(ol_txrx_vdev_handle vdev, qdf_nbuf_t msdu_list) * Free the descriptor, return the * packet to the caller. */ - ol_tx_desc_free(pdev, tx_desc); + ol_tx_desc_frame_free_nonstd(pdev, + tx_desc, 1); return msdu; } if (msdu_info.tso_info.curr_seg) { @@ -1353,7 +1354,7 @@ ol_txrx_mgmt_tx_desc_alloc( * address of the initial fragment. */ #if defined(HELIUMPLUS_PADDR64) - /* dump_frag_desc("ol_txrx_mgmt_send(): after ol_tx_desc_ll", + /* ol_txrx_dump_frag_desc("ol_txrx_mgmt_send(): after ol_tx_desc_ll", tx_desc); */ #endif /* defined(HELIUMPLUS_PADDR64) */ if (tx_desc) { @@ -1368,7 +1369,7 @@ ol_txrx_mgmt_tx_desc_alloc( qdf_nbuf_get_frag_paddr(tx_mgmt_frm, 1), 0, 0); #if defined(HELIUMPLUS_PADDR64) && defined(HELIUMPLUS_DEBUG) - dump_frag_desc( + ol_txrx_dump_frag_desc( "after htt_tx_desc_frags_table_set", tx_desc); #endif /* defined(HELIUMPLUS_PADDR64) */ @@ -1700,7 +1701,7 @@ ol_txrx_mgmt_tx_cb_set(ol_txrx_pdev_handle pdev, } #if defined(HELIUMPLUS_PADDR64) -void dump_frag_desc(char *msg, struct ol_tx_desc_t *tx_desc) +void ol_txrx_dump_frag_desc(char *msg, struct ol_tx_desc_t *tx_desc) { uint32_t *frag_ptr_i_p; int i; diff --git a/core/dp/txrx/ol_tx.h b/core/dp/txrx/ol_tx.h index 561900a71dcd..5cb97e825d13 100644 --- a/core/dp/txrx/ol_tx.h +++ b/core/dp/txrx/ol_tx.h @@ -121,4 +121,13 @@ static inline void ol_tso_seg_list_deinit(struct ol_txrx_pdev_t *pdev) } #endif +#if defined(HELIUMPLUS_PADDR64) +void ol_txrx_dump_frag_desc(char *msg, struct ol_tx_desc_t *tx_desc); +#else +static inline +void ol_txrx_dump_frag_desc(char *msg, struct ol_tx_desc_t *tx_desc) +{ +} +#endif + #endif /* _OL_TX__H_ */ diff --git a/core/dp/txrx/ol_tx_desc.c b/core/dp/txrx/ol_tx_desc.c index 5294c8a242fd..ee42722c6fa8 100644 --- a/core/dp/txrx/ol_tx_desc.c +++ b/core/dp/txrx/ol_tx_desc.c @@ -105,8 +105,6 @@ static inline void ol_tx_desc_reset_timestamp(struct ol_tx_desc_t *tx_desc) } #endif -#ifdef CONFIG_HL_SUPPORT - /** * ol_tx_desc_vdev_update() - vedv assign. * @tx_desc: tx descriptor pointer @@ -120,15 +118,6 @@ ol_tx_desc_vdev_update(struct ol_tx_desc_t *tx_desc, { tx_desc->vdev = vdev; } -#else - -static inline void -ol_tx_desc_vdev_update(struct ol_tx_desc_t *tx_desc, - struct ol_txrx_vdev_t *vdev) -{ - return; -} -#endif #ifdef CONFIG_PER_VDEV_TX_DESC_POOL @@ -182,6 +171,7 @@ struct ol_tx_desc_t *ol_tx_desc_alloc(struct ol_txrx_pdev_t *pdev, ol_tx_desc_vdev_update(tx_desc, vdev); ol_tx_desc_count_inc(vdev); + qdf_atomic_inc(&tx_desc->ref_cnt); return tx_desc; } @@ -235,6 +225,8 @@ struct ol_tx_desc_t *ol_tx_desc_alloc(struct ol_txrx_pdev_t *pdev, } ol_tx_desc_sanity_checks(pdev, tx_desc); ol_tx_desc_compute_delay(tx_desc); + ol_tx_desc_vdev_update(tx_desc, vdev); + qdf_atomic_inc(&tx_desc->ref_cnt); } else { pool->pkt_drop_no_desc++; qdf_spin_unlock_bh(&pool->flow_pool_lock); @@ -411,9 +403,6 @@ void ol_tx_desc_free(struct ol_txrx_pdev_t *pdev, struct ol_tx_desc_t *tx_desc) } #endif -extern void -dump_frag_desc(char *msg, struct ol_tx_desc_t *tx_desc); - void dump_pkt(qdf_nbuf_t nbuf, qdf_dma_addr_t nbuf_paddr, int len) { @@ -591,7 +580,7 @@ struct ol_tx_desc_t *ol_tx_desc_ll(struct ol_txrx_pdev_t *pdev, } #if defined(HELIUMPLUS_DEBUG) - dump_frag_desc("ol_tx_desc_ll()", tx_desc); + ol_txrx_dump_frag_desc("ol_tx_desc_ll()", tx_desc); #endif return tx_desc; } diff --git a/core/dp/txrx/ol_tx_queue.c b/core/dp/txrx/ol_tx_queue.c index 3044210dbbb8..5fa1b9982838 100644 --- a/core/dp/txrx/ol_tx_queue.c +++ b/core/dp/txrx/ol_tx_queue.c @@ -80,7 +80,27 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev) /* flush VDEV TX queues */ for (i = 0; i < OL_TX_VDEV_NUM_QUEUES; i++) { txq = &vdev->txqs[i]; - ol_tx_queue_free(pdev, txq, (i + OL_TX_NUM_TIDS), false); + /* + * currently txqs of MCAST_BCAST/DEFAULT_MGMT packet are using + * tid HTT_TX_EXT_TID_NON_QOS_MCAST_BCAST/HTT_TX_EXT_TID_MGMT + * when inserted into scheduler, so use same tid when we flush + * them + */ + if (i == OL_TX_VDEV_MCAST_BCAST) + ol_tx_queue_free(pdev, + txq, + HTT_TX_EXT_TID_NON_QOS_MCAST_BCAST, + false); + else if (i == OL_TX_VDEV_DEFAULT_MGMT) + ol_tx_queue_free(pdev, + txq, + HTT_TX_EXT_TID_MGMT, + false); + else + ol_tx_queue_free(pdev, + txq, + (i + OL_TX_NUM_TIDS), + false); } /* flush PEER TX queues */ do { diff --git a/core/dp/txrx/ol_tx_sched.c b/core/dp/txrx/ol_tx_sched.c index bafd83c661eb..11d0d6c1a45a 100644 --- a/core/dp/txrx/ol_tx_sched.c +++ b/core/dp/txrx/ol_tx_sched.c @@ -204,13 +204,13 @@ ol_tx_sched_select_batch_rr( struct ol_tx_sched_rr_t *scheduler = pdev->tx_sched.scheduler; struct ol_tx_active_queues_in_tid_t *txq_queue; struct ol_tx_frms_queue_t *next_tq; - u_int16_t frames, used_credits, tx_limit, tx_limit_flag = 0; + u_int16_t frames, used_credits = 0, tx_limit, tx_limit_flag = 0; int bytes; TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__); if (TAILQ_EMPTY(&scheduler->tx_active_tids_list)) - return; + return used_credits; txq_queue = TAILQ_FIRST(&scheduler->tx_active_tids_list); @@ -222,12 +222,12 @@ ol_tx_sched_select_batch_rr( credit = OL_A_MIN(credit, TX_SCH_MAX_CREDIT_FOR_THIS_TID(next_tq)); frames = next_tq->frms; /* download as many frames as credit allows */ - tx_limit = ol_tx_bad_peer_dequeue_check(txq, - category->specs.send_limit, + tx_limit = ol_tx_bad_peer_dequeue_check(next_tq, + frames, &tx_limit_flag); frames = ol_tx_dequeue( - pdev, txq, &sctx->head, tx_limit, &credit, &bytes); - ol_tx_bad_peer_update_tx_limit(pdev, txq, frames, tx_limit_flag); + pdev, next_tq, &sctx->head, tx_limit, &credit, &bytes); + ol_tx_bad_peer_update_tx_limit(pdev, next_tq, frames, tx_limit_flag); used_credits = credit; txq_queue->frms -= frames; @@ -445,6 +445,36 @@ ol_txrx_set_wmm_param(ol_txrx_pdev_handle data_pdev, "Dummy function when OL_TX_SCHED_RR is enabled\n"); } +/** + * ol_tx_sched_stats_display() - tx sched stats display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) +{ +} + +/** + * ol_tx_sched_cur_state_display() - tx sched cur stat display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) +{ +} + +/** + * ol_tx_sched_cur_state_display() - reset tx sched stats + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) +{ +} + #endif /* OL_TX_SCHED == OL_TX_SCHED_RR */ /*--- advanced scheduler ----------------------------------------------------*/ @@ -991,8 +1021,6 @@ ol_tx_sched_init_wrr_adv( if (scheduler == NULL) return scheduler; - qdf_mem_zero(scheduler, sizeof(*scheduler)); - OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(VO, scheduler); OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(VI, scheduler); OL_TX_SCHED_WRR_ADV_CAT_CFG_STORE(BE, scheduler); @@ -1090,6 +1118,39 @@ ol_txrx_set_wmm_param(ol_txrx_pdev_handle data_pdev, } } +/** + * ol_tx_sched_stats_display() - tx sched stats display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_STAT_DUMP(pdev->tx_sched.scheduler); +} + +/** + * ol_tx_sched_cur_state_display() - tx sched cur stat display + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_CUR_STATE_DUMP(pdev->tx_sched.scheduler); +} + +/** + * ol_tx_sched_cur_state_display() - reset tx sched stats + * @pdev: Pointer to the PDEV structure. + * + * Return: none. + */ +void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) +{ + OL_TX_SCHED_WRR_ADV_CAT_STAT_CLEAR(pdev->tx_sched.scheduler); +} + #endif /* OL_TX_SCHED == OL_TX_SCHED_WRR_ADV */ /*--- congestion control discard --------------------------------------------*/ @@ -1464,19 +1525,4 @@ ol_tx_sched_log(struct ol_txrx_pdev_t *pdev) #endif /* defined(DEBUG_HL_LOGGING) */ -void ol_tx_sched_stats_display(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_STAT_DUMP(pdev->tx_sched.scheduler); -} - -void ol_tx_sched_cur_state_display(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_CUR_STATE_DUMP(pdev->tx_sched.scheduler); -} - -void ol_tx_sched_stats_clear(struct ol_txrx_pdev_t *pdev) -{ - OL_TX_SCHED_WRR_ADV_CAT_STAT_CLEAR(pdev->tx_sched.scheduler); -} - #endif /* defined(CONFIG_HL_SUPPORT) */ diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c index 4d30adf3089a..a90bf86d4ff9 100644 --- a/core/dp/txrx/ol_tx_send.c +++ b/core/dp/txrx/ol_tx_send.c @@ -60,7 +60,7 @@ #endif #include #include - +#include #ifdef TX_CREDIT_RECLAIM_SUPPORT @@ -552,6 +552,11 @@ ol_tx_completion_handler(ol_txrx_pdev_handle pdev, tx_desc->status = status; netbuf = tx_desc->netbuf; QDF_NBUF_UPDATE_TX_PKT_COUNT(netbuf, QDF_NBUF_TX_PKT_FREE); + + if (pdev->ol_tx_packetdump_cb) + pdev->ol_tx_packetdump_cb(netbuf, status, + tx_desc->vdev->vdev_id, TX_DATA_PKT); + DPTRACE(qdf_dp_trace_ptr(netbuf, QDF_DP_TRACE_FREE_PACKET_PTR_RECORD, qdf_nbuf_data_addr(netbuf), @@ -766,6 +771,10 @@ ol_tx_single_completion_handler(ol_txrx_pdev_handle pdev, /* Do one shot statistics */ TXRX_STATS_UPDATE_TX_STATS(pdev, status, 1, qdf_nbuf_len(netbuf)); + if (pdev->ol_tx_packetdump_cb) + pdev->ol_tx_packetdump_cb(netbuf, status, + tx_desc->vdev->vdev_id, TX_MGMT_PKT); + if (OL_TX_DESC_NO_REFS(tx_desc)) { ol_tx_desc_frame_free_nonstd(pdev, tx_desc, status != htt_tx_status_ok); @@ -1168,3 +1177,57 @@ ol_tx_delay_compute(struct ol_txrx_pdev_t *pdev, } #endif /* QCA_COMPUTE_TX_DELAY */ + +/** + * ol_register_packetdump_callback() - registers + * tx data packet, tx mgmt. packet and rx data packet + * dump callback handler. + * + * @ol_tx_packetdump_cb: tx packetdump cb + * @ol_rx_packetdump_cb: rx packetdump cb + * + * This function is used to register tx data pkt, tx mgmt. + * pkt and rx data pkt dump callback + * + * Return: None + * + */ +void ol_register_packetdump_callback(tp_ol_packetdump_cb ol_tx_packetdump_cb, + tp_ol_packetdump_cb ol_rx_packetdump_cb) +{ + ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + if (!pdev) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: pdev is NULL", __func__); + return; + } + + pdev->ol_tx_packetdump_cb = ol_tx_packetdump_cb; + pdev->ol_rx_packetdump_cb = ol_rx_packetdump_cb; +} + +/** + * ol_deregister_packetdump_callback() - deregidters + * tx data packet, tx mgmt. packet and rx data packet + * dump callback handler + * + * This function is used to deregidter tx data pkt., + * tx mgmt. pkt and rx data pkt. dump callback + * + * Return: None + * + */ +void ol_deregister_packetdump_callback(void) +{ + ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX); + + if (!pdev) { + TXRX_PRINT(TXRX_PRINT_LEVEL_ERR, + "%s: pdev is NULL", __func__); + return; + } + + pdev->ol_tx_packetdump_cb = NULL; + pdev->ol_rx_packetdump_cb = NULL; +} diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 5ea86231b7e9..19f4f2958d89 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -975,7 +975,6 @@ ol_txrx_pdev_attach(ol_pdev_handle ctrl_pdev, pdev = qdf_mem_malloc(sizeof(*pdev)); if (!pdev) goto fail0; - qdf_mem_zero(pdev, sizeof(*pdev)); /* init LL/HL cfg here */ pdev->cfg.is_high_latency = ol_cfg_is_high_latency(ctrl_pdev); @@ -1014,6 +1013,8 @@ ol_txrx_pdev_attach(ol_pdev_handle ctrl_pdev, if (!pdev->htt_pdev) goto fail3; + htt_register_rx_pkt_dump_callback(pdev->htt_pdev, + ol_rx_pkt_dump_call); return pdev; fail3: @@ -1632,9 +1633,8 @@ void ol_txrx_pdev_detach(ol_txrx_pdev_handle pdev, int force) ol_txrx_peer_find_hash_erase(pdev); } - ol_tx_deregister_flow_control(pdev); - /* Stop the communication between HTT and target at first */ - htt_detach_target(pdev->htt_pdev); + /* to get flow pool status before freeing descs */ + ol_tx_dump_flow_pool_info(); for (i = 0; i < pdev->tx_desc.pool_size; i++) { void *htt_tx_desc; @@ -1658,6 +1658,11 @@ void ol_txrx_pdev_detach(ol_txrx_pdev_handle pdev, int force) htt_tx_desc_free(pdev->htt_pdev, htt_tx_desc); } + htt_deregister_rx_pkt_dump_callback(pdev->htt_pdev); + ol_tx_deregister_flow_control(pdev); + /* Stop the communication between HTT and target at first */ + htt_detach_target(pdev->htt_pdev); + qdf_mem_multi_pages_free(pdev->osdev, &pdev->tx_desc.desc_pages, 0, true); pdev->tx_desc.freelist = NULL; @@ -2134,7 +2139,6 @@ ol_txrx_peer_attach(ol_txrx_vdev_handle vdev, uint8_t *peer_mac_addr) peer = qdf_mem_malloc(sizeof(*peer)); if (!peer) return NULL; /* failure */ - qdf_mem_zero(peer, sizeof(*peer)); /* store provided params */ peer->vdev = vdev; diff --git a/core/dp/txrx/ol_txrx_peer_find.c b/core/dp/txrx/ol_txrx_peer_find.c index f43670155242..12638b04c858 100644 --- a/core/dp/txrx/ol_txrx_peer_find.c +++ b/core/dp/txrx/ol_txrx_peer_find.c @@ -310,15 +310,6 @@ static int ol_txrx_peer_find_map_attach(struct ol_txrx_pdev_t *pdev) if (!pdev->peer_id_to_obj_map) return 1; /* failure */ - /* - * The peer_id_to_obj_map doesn't really need to be initialized, - * since elements are only used after they have been individually - * initialized. - * However, it is convenient for debugging to have all elements - * that are not in use set to 0. - */ - qdf_mem_set(pdev->peer_id_to_obj_map, peer_map_size, 0); - return 0; /* success */ } diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index ee1bfb309a37..db2ccfd72eaf 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -187,9 +187,9 @@ struct ol_tx_desc_t { * This field is filled in with the ol_tx_frm_type enum. */ uint8_t pkt_type; -#if defined(CONFIG_HL_SUPPORT) + struct ol_txrx_vdev_t *vdev; -#endif + void *txq; #ifdef QCA_SUPPORT_SW_TXRX_ENCAP @@ -663,6 +663,10 @@ struct ol_txrx_pdev_t { } callbacks[OL_TXRX_MGMT_NUM_TYPES]; } tx_mgmt; + /* packetdump callback functions */ + tp_ol_packetdump_cb ol_tx_packetdump_cb; + tp_ol_packetdump_cb ol_rx_packetdump_cb; + struct { uint16_t pool_size; uint16_t num_free; diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 63b2b0f5c05a..9ad137ddbba2 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -582,7 +582,7 @@ typedef enum { #define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_NAME "gStaKeepAlivePeriod" #define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_MIN (0) #define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_MAX (65535) -#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_DEFAULT (0) +#define CFG_INFRA_STA_KEEP_ALIVE_PERIOD_DEFAULT (30) /* WMM configuration */ #define CFG_QOS_WMM_MODE_NAME "WmmIsEnabled" diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index ec6e5990dc08..92bb43634916 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1802,14 +1802,19 @@ static inline QDF_STATUS hdd_register_for_sap_restart_with_channel_switch(void) #endif #if !defined(REMOVE_PKT_LOG) -int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value); -int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, uint8_t); +int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value, + int set_value2); +int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, + uint8_t user_triggered, int size); + #else -int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, uint8_t) +static inline int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, + uint8_t user_triggered, int size) { return 0; } -int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value) +static inline int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, + uint32_t set_value, int set_value2) { return 0; } @@ -1936,11 +1941,25 @@ static inline void hdd_enable_fastpath(struct hdd_config *hdd_cfg, } #endif void hdd_wlan_update_target_info(hdd_context_t *hdd_ctx, void *context); - enum sap_acs_dfs_mode wlan_hdd_get_dfs_mode(enum dfs_mode mode); - void hdd_ch_avoid_cb(void *hdd_context, void *indi_param); void hdd_unsafe_channel_restart_sap(hdd_context_t *hdd_ctx); int hdd_enable_disable_ca_event(hdd_context_t *hddctx, uint8_t set_value); +void wlan_hdd_undo_acs(hdd_adapter_t *adapter); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)) +static inline int +hdd_wlan_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value) +{ + return nla_put_u64(skb, attrtype, value); +} +#else +static inline int +hdd_wlan_nla_put_u64(struct sk_buff *skb, int attrtype, u64 value) +{ + return nla_put_u64_64bit(skb, attrtype, value, NL80211_ATTR_PAD); +} +#endif + #endif /* end #if !defined(WLAN_HDD_MAIN_H) */ diff --git a/core/hdd/inc/wlan_hdd_power.h b/core/hdd/inc/wlan_hdd_power.h index abb69bd56e66..4623d9bb6b83 100644 --- a/core/hdd/inc/wlan_hdd_power.h +++ b/core/hdd/inc/wlan_hdd_power.h @@ -224,26 +224,30 @@ void wlan_hdd_inc_suspend_stats(hdd_context_t *hdd_ctx, #ifdef WLAN_SUSPEND_RESUME_TEST /** * hdd_wlan_fake_apps_resume() - Resume from unit-test triggered suspend - * @wiphy: wiphy struct from a validated hdd context + * @wiphy: the kernel wiphy struct for the device being resumed + * @dev: the kernel net_device struct for the device being resumed * * Return: Zero on success, calls QDF_BUG() on failure */ -int hdd_wlan_fake_apps_resume(struct wiphy *wiphy); +int hdd_wlan_fake_apps_resume(struct wiphy *wiphy, struct net_device *dev); /** * hdd_wlan_fake_apps_suspend() - Initiate a unit-test triggered suspend - * @wiphy: wiphy struct from a validated hdd context + * @wiphy: the kernel wiphy struct for the device being suspended + * @dev: the kernel net_device struct for the device being suspended * * Return: Zero on success, suspend related non-zero error code on failure */ -int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy); +int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev); #else -static inline int hdd_wlan_fake_apps_resume(struct wiphy *wiphy) +static inline int +hdd_wlan_fake_apps_resume(struct wiphy *wiphy, struct net_device *dev) { return 0; } -static inline int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy) +static inline int +hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev) { return 0; } diff --git a/core/hdd/inc/wlan_hdd_tx_rx.h b/core/hdd/inc/wlan_hdd_tx_rx.h index 6cf5cf852dc1..0352cdb8add1 100644 --- a/core/hdd/inc/wlan_hdd_tx_rx.h +++ b/core/hdd/inc/wlan_hdd_tx_rx.h @@ -130,4 +130,25 @@ void hdd_event_eapol_log(struct sk_buff *skb, enum qdf_proto_dir dir) {} #endif +/* + * As of the 4.7 kernel, net_device->trans_start is removed. Create shims to + * support compiling against older versions of the kernel. + */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)) +static inline void netif_trans_update(struct net_device *dev) +{ + dev->trans_start = jiffies; +} + +#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \ + module_id, QDF_TRACE_LEVEL_ERROR, \ + "%s: Transmission timeout occurred jiffies %lu trans_start %lu", \ + __func__, jiffies, dev->trans_start) +#else +#define TX_TIMEOUT_TRACE(dev, module_id) QDF_TRACE( \ + module_id, QDF_TRACE_LEVEL_ERROR, \ + "%s: Transmission timeout occurred jiffies %lu", \ + __func__, jiffies) +#endif + #endif /* end #if !defined(WLAN_HDD_TX_RX_H) */ diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 341ef18ea1ab..cd90e9f817cd 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -63,6 +63,7 @@ #include "cdp_txrx_flow_ctrl_legacy.h" #include "cdp_txrx_peer_ops.h" #include "wlan_hdd_napi.h" +#include /* These are needed to recognize WPA and RSN suite types */ #define HDD_WPA_OUI_SIZE 4 @@ -1537,6 +1538,8 @@ static QDF_STATUS hdd_dis_connect_handler(hdd_adapter_t *pAdapter, hdd_clear_roam_profile_ie(pAdapter); hdd_wmm_init(pAdapter); + hdd_info("Invoking packetdump deregistration API"); + wlan_deregister_txrx_packetdump(); /* indicate 'disconnect' status to wpa_supplicant... */ hdd_send_association_event(dev, pRoamInfo); @@ -2800,6 +2803,9 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter, MAC_ADDR_ARRAY(pWextState->req_bssId.bytes), roamResult, roamStatus); + hdd_err("Invoking packetdump deregistration API"); + wlan_deregister_txrx_packetdump(); + /* inform association failure event to nl80211 */ if (eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult) { @@ -2998,10 +3004,10 @@ static void hdd_roam_ibss_indication_handler(hdd_adapter_t *pAdapter, if (chan_no <= 14) freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); else freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); chan = ieee80211_get_channel(pAdapter->wdev.wiphy, freq); diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 584830a1d62d..b92c3c74e6a5 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -6876,7 +6876,6 @@ QDF_STATUS hdd_set_sme_config(hdd_context_t *pHddCtx) "%s: unable to allocate smeConfig", __func__); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(smeConfig, sizeof(*smeConfig)); QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO_HIGH, "%s bWmmIsEnabled=%d 802_11e_enabled=%d dot11Mode=%d", diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index ac58c814d1b3..c5e11a27ec3c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -118,7 +118,7 @@ #define IBSS_CFG_PROTECTION_ENABLE_MASK 0x8282 #define HDD2GHZCHAN(freq, chan, flag) { \ - .band = IEEE80211_BAND_2GHZ, \ + .band = NL80211_BAND_2GHZ, \ .center_freq = (freq), \ .hw_value = (chan), \ .flags = (flag), \ @@ -127,7 +127,7 @@ } #define HDD5GHZCHAN(freq, chan, flag) { \ - .band = IEEE80211_BAND_5GHZ, \ + .band = NL80211_BAND_5GHZ, \ .center_freq = (freq), \ .hw_value = (chan), \ .flags = (flag), \ @@ -265,7 +265,7 @@ static struct ieee80211_rate a_mode_rates[] = { static struct ieee80211_supported_band wlan_hdd_band_2_4_ghz = { .channels = NULL, .n_channels = ARRAY_SIZE(hdd_channels_2_4_ghz), - .band = IEEE80211_BAND_2GHZ, + .band = NL80211_BAND_2GHZ, .bitrates = g_mode_rates, .n_bitrates = g_mode_rates_size, .ht_cap.ht_supported = 1, @@ -284,7 +284,7 @@ static struct ieee80211_supported_band wlan_hdd_band_2_4_ghz = { static struct ieee80211_supported_band wlan_hdd_band_5_ghz = { .channels = NULL, .n_channels = ARRAY_SIZE(hdd_channels_5_ghz), - .band = IEEE80211_BAND_5GHZ, + .band = NL80211_BAND_5GHZ, .bitrates = a_mode_rates, .n_bitrates = a_mode_rates_size, .ht_cap.ht_supported = 1, @@ -1621,7 +1621,7 @@ out: if (temp_skbuff != NULL) return cfg80211_vendor_cmd_reply(temp_skbuff); } - + wlan_hdd_undo_acs(adapter); clear_bit(ACS_IN_PROGRESS, &hdd_ctx->g_event_flags); return status; @@ -1653,6 +1653,26 @@ static int wlan_hdd_cfg80211_do_acs(struct wiphy *wiphy, return ret; } +/** + * wlan_hdd_undo_acs : Do cleanup of DO_ACS + * @adapter: Pointer to adapter struct + * + * This function handle cleanup of what was done in DO_ACS, including free + * memory. + * + * Return: void + */ + +void wlan_hdd_undo_acs(hdd_adapter_t *adapter) +{ + if (adapter == NULL) + return; + if (adapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list) { + qdf_mem_free(adapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list); + adapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list = NULL; + } +} + /** * wlan_hdd_cfg80211_start_pending_acs : Start pending ACS procedure for SAP * @work: Linux workqueue struct pointer for ACS work @@ -3889,6 +3909,11 @@ wlan_hdd_wifi_config_policy[QCA_WLAN_VENDOR_ATTR_CONFIG_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_CONFIG_CHANNEL_AVOIDANCE_IND] = {.type = NLA_U8 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION] = {.type = NLA_U8 }, [QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY] = {.type = NLA_U8 }, + [QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY] = {.type = NLA_U8 }, }; /** @@ -3959,6 +3984,8 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, uint8_t *scan_ie; struct sir_set_tx_rx_aggregation_size request; QDF_STATUS qdf_status; + uint8_t retry, delay; + int param_id; ENTER_DEV(dev); @@ -4068,6 +4095,57 @@ __wlan_hdd_cfg80211_wifi_configuration_set(struct wiphy *wiphy, access_policy); } + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY]) { + retry = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY]); + retry = retry > CFG_NON_AGG_RETRY_MAX ? + CFG_NON_AGG_RETRY_MAX : retry; + param_id = WMI_PDEV_PARAM_NON_AGG_SW_RETRY_TH; + ret_val = wma_cli_set_command(adapter->sessionId, param_id, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY]) { + retry = nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY]); + retry = retry > CFG_AGG_RETRY_MAX ? + CFG_AGG_RETRY_MAX : retry; + + /* Value less than CFG_AGG_RETRY_MIN has side effect to t-put */ + retry = ((retry > 0) && (retry < CFG_AGG_RETRY_MIN)) ? + CFG_AGG_RETRY_MIN : retry; + param_id = WMI_PDEV_PARAM_AGG_SW_RETRY_TH; + ret_val = wma_cli_set_command(adapter->sessionId, param_id, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY]) { + retry = nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY]); + retry = retry > CFG_MGMT_RETRY_MAX ? + CFG_MGMT_RETRY_MAX : retry; + param_id = WMI_PDEV_PARAM_MGMT_RETRY_LIMIT; + ret_val = wma_cli_set_command(adapter->sessionId, param_id, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY]) { + retry = nla_get_u8(tb[QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY]); + retry = retry > CFG_CTRL_RETRY_MAX ? + CFG_CTRL_RETRY_MAX : retry; + param_id = WMI_PDEV_PARAM_CTRL_RETRY_LIMIT; + ret_val = wma_cli_set_command(adapter->sessionId, param_id, + retry, PDEV_CMD); + } + + if (tb[QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY]) { + delay = nla_get_u8(tb[ + QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY]); + delay = delay > CFG_PROPAGATION_DELAY_MAX ? + CFG_PROPAGATION_DELAY_MAX : delay; + param_id = WMI_PDEV_PARAM_PROPAGATION_DELAY; + ret_val = wma_cli_set_command(adapter->sessionId, param_id, + delay, PDEV_CMD); + } + if (vendor_ie_present && access_policy_present) { if (access_policy == QCA_ACCESS_POLICY_DENY_UNLESS_LISTED) { access_policy = @@ -4287,6 +4365,9 @@ static int __wlan_hdd_cfg80211_wifi_logger_start(struct wiphy *wiphy, tb[QCA_WLAN_VENDOR_ATTR_WIFI_LOGGER_FLAGS]); hdd_info("is_iwpriv_command =%d", start_log.is_iwpriv_command); + /* size is buff size which can be set using iwpriv command*/ + start_log.size = 0; + cds_set_ring_log_level(start_log.ring_id, start_log.verbose_level); if (start_log.ring_id == RING_ID_WAKELOCK) { @@ -5184,11 +5265,11 @@ static int __wlan_hdd_cfg80211_get_preferred_freq_list(struct wiphy *wiphy, if (pcl[i] <= ARRAY_SIZE(hdd_channels_2_4_ghz)) freq_list[i] = ieee80211_channel_to_frequency(pcl[i], - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); else freq_list[i] = ieee80211_channel_to_frequency(pcl[i], - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); } /* send the freq_list back to supplicant */ @@ -6404,7 +6485,6 @@ static int hdd_set_reset_bpf_offload(hdd_context_t *hdd_ctx, hdd_err("qdf_mem_malloc failed for bpf_set_offload"); return -ENOMEM; } - qdf_mem_zero(bpf_set_offload, sizeof(*bpf_set_offload)); /* Parse and fetch bpf packet size */ if (!tb[BPF_PACKET_SIZE]) { @@ -8545,7 +8625,7 @@ int wlan_hdd_cfg80211_update_band(struct wiphy *wiphy, eCsrBand eBand) ENTER(); - for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + for (i = 0; i < NUM_NL80211_BANDS; i++) { if (NULL == wiphy->bands[i]) continue; @@ -8557,7 +8637,7 @@ int wlan_hdd_cfg80211_update_band(struct wiphy *wiphy, eCsrBand eBand) cds_get_channel_state(band->channels[j]. hw_value); - if (IEEE80211_BAND_2GHZ == i && eCSR_BAND_5G == eBand) { + if (NL80211_BAND_2GHZ == i && eCSR_BAND_5G == eBand) { /* 5G only */ #ifdef WLAN_ENABLE_SOCIAL_CHANNELS_5G_ONLY /* Enable Social channels for P2P */ @@ -8572,7 +8652,7 @@ int wlan_hdd_cfg80211_update_band(struct wiphy *wiphy, eCsrBand eBand) band->channels[j].flags |= IEEE80211_CHAN_DISABLED; continue; - } else if (IEEE80211_BAND_5GHZ == i && + } else if (NL80211_BAND_5GHZ == i && eCSR_BAND_24 == eBand) { /* 2G only */ band->channels[j].flags |= @@ -8732,14 +8812,14 @@ int wlan_hdd_cfg80211_init(struct device *dev, * wiphy flags don't get reset because of static memory. * It's better not to store channel in static memory. */ - wiphy->bands[IEEE80211_BAND_2GHZ] = &wlan_hdd_band_2_4_ghz; - wiphy->bands[IEEE80211_BAND_2GHZ]->channels = + wiphy->bands[NL80211_BAND_2GHZ] = &wlan_hdd_band_2_4_ghz; + wiphy->bands[NL80211_BAND_2GHZ]->channels = qdf_mem_malloc(sizeof(hdd_channels_2_4_ghz)); - if (wiphy->bands[IEEE80211_BAND_2GHZ]->channels == NULL) { + if (wiphy->bands[NL80211_BAND_2GHZ]->channels == NULL) { hdd_err("Not enough memory to allocate channels"); return -ENOMEM; } - qdf_mem_copy(wiphy->bands[IEEE80211_BAND_2GHZ]->channels, + qdf_mem_copy(wiphy->bands[NL80211_BAND_2GHZ]->channels, &hdd_channels_2_4_ghz[0], sizeof(hdd_channels_2_4_ghz)); if ((hdd_is_5g_supported(pHddCtx)) && @@ -8747,22 +8827,22 @@ int wlan_hdd_cfg80211_init(struct device *dev, (eHDD_DOT11_MODE_11g != pCfg->dot11Mode) && (eHDD_DOT11_MODE_11b_ONLY != pCfg->dot11Mode) && (eHDD_DOT11_MODE_11g_ONLY != pCfg->dot11Mode))) { - wiphy->bands[IEEE80211_BAND_5GHZ] = &wlan_hdd_band_5_ghz; - wiphy->bands[IEEE80211_BAND_5GHZ]->channels = + wiphy->bands[NL80211_BAND_5GHZ] = &wlan_hdd_band_5_ghz; + wiphy->bands[NL80211_BAND_5GHZ]->channels = qdf_mem_malloc(sizeof(hdd_channels_5_ghz)); - if (wiphy->bands[IEEE80211_BAND_5GHZ]->channels == NULL) { + if (wiphy->bands[NL80211_BAND_5GHZ]->channels == NULL) { hdd_err("Not enough memory to allocate channels"); qdf_mem_free(wiphy-> - bands[IEEE80211_BAND_2GHZ]->channels); - wiphy->bands[IEEE80211_BAND_2GHZ]->channels = NULL; + bands[NL80211_BAND_2GHZ]->channels); + wiphy->bands[NL80211_BAND_2GHZ]->channels = NULL; return -ENOMEM; } - qdf_mem_copy(wiphy->bands[IEEE80211_BAND_5GHZ]->channels, + qdf_mem_copy(wiphy->bands[NL80211_BAND_5GHZ]->channels, &hdd_channels_5_ghz[0], sizeof(hdd_channels_5_ghz)); } - for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + for (i = 0; i < NUM_NL80211_BANDS; i++) { if (NULL == wiphy->bands[i]) continue; @@ -8770,7 +8850,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, for (j = 0; j < wiphy->bands[i]->n_channels; j++) { struct ieee80211_supported_band *band = wiphy->bands[i]; - if (IEEE80211_BAND_2GHZ == i && + if (NL80211_BAND_2GHZ == i && eCSR_BAND_5G == pCfg->nBandCapability) { /* 5G only */ #ifdef WLAN_ENABLE_SOCIAL_CHANNELS_5G_ONLY @@ -8784,7 +8864,7 @@ int wlan_hdd_cfg80211_init(struct device *dev, band->channels[j].flags |= IEEE80211_CHAN_DISABLED; continue; - } else if (IEEE80211_BAND_5GHZ == i && + } else if (NL80211_BAND_5GHZ == i && eCSR_BAND_24 == pCfg->nBandCapability) { /* 2G only */ band->channels[j].flags |= @@ -8841,7 +8921,7 @@ void wlan_hdd_cfg80211_deinit(struct wiphy *wiphy) { int i; - for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + for (i = 0; i < NUM_NL80211_BANDS; i++) { if (NULL != wiphy->bands[i] && (NULL != wiphy->bands[i]->channels)) { qdf_mem_free(wiphy->bands[i]->channels); @@ -9154,7 +9234,6 @@ static void wlan_hdd_set_dhcp_server_offload(hdd_adapter_t *pHostapdAdapter) hdd_err("could not allocate tDhcpSrvOffloadInfo!"); return; } - qdf_mem_zero(pDhcpSrvInfo, sizeof(*pDhcpSrvInfo)); pDhcpSrvInfo->vdev_id = pHostapdAdapter->sessionId; pDhcpSrvInfo->dhcpSrvOffloadEnabled = true; pDhcpSrvInfo->dhcpClientNum = pHddCtx->config->dhcpMaxNumClients; @@ -10613,15 +10692,15 @@ struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter, } if (chan_no <= ARRAY_SIZE(hdd_channels_2_4_ghz) && - (wiphy->bands[IEEE80211_BAND_2GHZ] != NULL)) { + (wiphy->bands[NL80211_BAND_2GHZ] != NULL)) { freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); } else if ((chan_no > ARRAY_SIZE(hdd_channels_2_4_ghz)) - && (wiphy->bands[IEEE80211_BAND_5GHZ] != NULL)) { + && (wiphy->bands[NL80211_BAND_5GHZ] != NULL)) { freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); } else { hdd_err("Invalid chan_no %d", chan_no); kfree(mgmt); @@ -11415,7 +11494,6 @@ static int wlan_hdd_cfg80211_connect_start(hdd_adapter_t *pAdapter, eConnectionState_NotConnected); return -ENOMEM; } - qdf_mem_zero(sme_config, sizeof(*sme_config)); sme_get_config_param(pHddCtx->hHal, sme_config); /* These values are not sessionized. So, any change in these SME * configs on an older or parallel interface will affect the diff --git a/core/hdd/src/wlan_hdd_cfg80211.h b/core/hdd/src/wlan_hdd_cfg80211.h index 2c9a81cfed79..5cdaad826294 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.h +++ b/core/hdd/src/wlan_hdd_cfg80211.h @@ -2325,6 +2325,13 @@ enum qca_wlan_vendor_acs_hw_mode { QCA_ACS_MODE_IEEE80211ANY, }; +#define CFG_NON_AGG_RETRY_MAX (31) +#define CFG_AGG_RETRY_MAX (31) +#define CFG_MGMT_RETRY_MAX (31) +#define CFG_CTRL_RETRY_MAX (31) +#define CFG_PROPAGATION_DELAY_MAX (63) +#define CFG_AGG_RETRY_MIN (5) + /** * enum qca_access_policy - access control policy * @@ -2370,6 +2377,13 @@ enum qca_ignore_assoc_disallowed { * Tx aggregation size (8-bit unsigned value) * @QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION: * Rx aggregation size (8-bit unsigned value) + * @QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY: + * Non aggregrate/11g sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY: aggregrate sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY: management frame sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY: control frame sw retry threshold + * @QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY: + * propagation delay for 2G/5G band (units in us) * @QCA_WLAN_VENDOR_ATTR_CONFIG_SCAN_DEFAULT_IES: Update the default scan IEs * @QCA_WLAN_VENDOR_ATTR_CONFIG_GENERIC_COMMAND: * Unsigned 32-bit value attribute for generic commands @@ -2406,6 +2420,22 @@ enum qca_wlan_vendor_config { QCA_WLAN_VENDOR_ATTR_CONFIG_TX_MPDU_AGGREGATION, QCA_WLAN_VENDOR_ATTR_CONFIG_RX_MPDU_AGGREGATION, + /* 8-bit unsigned value to configure the Non aggregrate/11g sw + * retry threshold (0 disable, 31 max). */ + QCA_WLAN_VENDOR_ATTR_CONFIG_NON_AGG_RETRY, + /* 8-bit unsigned value to configure the aggregrate sw + * retry threshold (0 disable, 31 max). */ + QCA_WLAN_VENDOR_ATTR_CONFIG_AGG_RETRY, + /* 8-bit unsigned value to configure the MGMT frame + * retry threshold (0 disable, 31 max). */ + QCA_WLAN_VENDOR_ATTR_CONFIG_MGMT_RETRY, + /* 8-bit unsigned value to configure the CTRL frame + * retry threshold (0 disable, 31 max). */ + QCA_WLAN_VENDOR_ATTR_CONFIG_CTRL_RETRY, + /* 8-bit unsigned value to configure the propagation delay for + * 2G/5G band (0~63, units in us) */ + QCA_WLAN_VENDOR_ATTR_CONFIG_PROPAGATION_DELAY, + /* Attribute used to set scan default IEs to the driver. * * These IEs can be used by scan operations that will be initiated by @@ -3194,4 +3224,13 @@ static inline void wlan_hdd_cfg80211_indicate_disconnect(struct net_device *dev, #endif struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter, tSirBssDescription *bss_desc); + +/* + * As of 4.7, ieee80211_band is removed; add shims so we can reference + * nl80211_band instead + */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 7, 0)) +#define NUM_NL80211_BANDS ((enum nl80211_band)IEEE80211_NUM_BANDS) +#endif + #endif diff --git a/core/hdd/src/wlan_hdd_driver_ops.c b/core/hdd/src/wlan_hdd_driver_ops.c index 7861b503b4c5..afee223dcd4d 100644 --- a/core/hdd/src/wlan_hdd_driver_ops.c +++ b/core/hdd/src/wlan_hdd_driver_ops.c @@ -650,8 +650,13 @@ static int __wlan_hdd_bus_resume(void) { hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); void *hif_ctx; - int status = wlan_hdd_validate_context(hdd_ctx); + int status; + QDF_STATUS qdf_status; + if (cds_is_driver_recovering()) + return 0; + + status = wlan_hdd_validate_context(hdd_ctx); if (status) return status; @@ -665,15 +670,28 @@ static int __wlan_hdd_bus_resume(void) return -EINVAL; status = hif_bus_resume(hif_ctx); - QDF_BUG(!status); + if (status) + goto out; status = wma_bus_resume(); - QDF_BUG(!status); + if (status) + goto out; - status = ol_txrx_bus_resume(); - QDF_BUG(!status); + qdf_status = ol_txrx_bus_resume(); + status = qdf_status_to_os_return(qdf_status); + if (status) + goto out; hdd_info("resume done"); + + return 0; + +out: + if (cds_is_driver_recovering()) + return 0; + + QDF_BUG(false); + return status; } @@ -701,8 +719,12 @@ static int __wlan_hdd_bus_resume_noirq(void) { hdd_context_t *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); void *hif_ctx; - int status = wlan_hdd_validate_context(hdd_ctx); + int status; + if (cds_is_driver_recovering()) + return 0; + + status = wlan_hdd_validate_context(hdd_ctx); if (status) { hdd_err("Invalid HDD context: %d", status); return status; diff --git a/core/hdd/src/wlan_hdd_ext_scan.c b/core/hdd/src/wlan_hdd_ext_scan.c index b81bab3665de..3c16d709596a 100644 --- a/core/hdd/src/wlan_hdd_ext_scan.c +++ b/core/hdd/src/wlan_hdd_ext_scan.c @@ -230,7 +230,7 @@ static int hdd_extscan_nl_fill_bss(struct sk_buff *skb, tSirWifiScanResult *ap, if (!nla_ap) return -EINVAL; - if (nla_put_u64(skb, PARAM_TIME_STAMP, ap->ts) || + if (hdd_wlan_nla_put_u64(skb, PARAM_TIME_STAMP, ap->ts) || nla_put(skb, PARAM_SSID, sizeof(ap->ssid), ap->ssid) || nla_put(skb, PARAM_BSSID, sizeof(ap->bssid), ap->bssid.bytes) || nla_put_u32(skb, PARAM_CHANNEL, ap->channel) || @@ -591,7 +591,7 @@ wlan_hdd_cfg80211_extscan_hotlist_match_ind(void *ctx, if (!ap) goto fail; - if (nla_put_u64(skb, + if (hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_TIME_STAMP, data->ap[i].ts) || nla_put(skb, @@ -837,7 +837,7 @@ wlan_hdd_cfg80211_extscan_full_scan_result_event(void *ctx, if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_REQUEST_ID, pData->requestId) || - nla_put_u64(skb, + hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_TIME_STAMP, pData->ap.ts) || nla_put(skb, @@ -1383,7 +1383,7 @@ wlan_hdd_cfg80211_extscan_hotlist_ssid_match_ind(void *ctx, goto fail; } - if (nla_put_u64(skb, + if (hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_EXTSCAN_RESULTS_SCAN_RESULT_TIME_STAMP, event->ap[i].ts) || nla_put(skb, @@ -2455,7 +2455,7 @@ static void hdd_remove_indoor_channels(struct wiphy *wiphy, uint32_t *chan_list, int i, j, k; for (i = 0; i < *num_channels; i++) - for (j = 0; j < IEEE80211_NUM_BANDS; j++) { + for (j = 0; j < NUM_NL80211_BANDS; j++) { if (wiphy->bands[j] == NULL) continue; for (k = 0; k < wiphy->bands[j]->n_channels; k++) { @@ -3894,7 +3894,6 @@ static int __wlan_hdd_cfg80211_set_epno_list(struct wiphy *wiphy, hdd_err("qdf_mem_malloc failed"); return -ENOMEM; } - qdf_mem_zero(req_msg, len); req_msg->num_networks = num_networks; /* Parse and fetch request Id */ diff --git a/core/hdd/src/wlan_hdd_green_ap.c b/core/hdd/src/wlan_hdd_green_ap.c index 1dccc70ae1c6..01afbd5a178a 100644 --- a/core/hdd/src/wlan_hdd_green_ap.c +++ b/core/hdd/src/wlan_hdd_green_ap.c @@ -315,7 +315,6 @@ static QDF_STATUS hdd_green_ap_attach(struct hdd_context_s *hdd_ctx) goto error; } - qdf_mem_zero(green_ap, sizeof(*green_ap)); green_ap->ps_state = GREEN_AP_PS_OFF_STATE; green_ap->ps_event = 0; green_ap->num_nodes = 0; diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 35e96c32627e..8884800e31f3 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -1049,11 +1049,15 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, pHostapdState->qdf_status = pSapEvent->sapevt.sapStartBssCompleteEvent.status; - qdf_status = qdf_event_set(&pHostapdState->qdf_event); - - if (!QDF_IS_STATUS_SUCCESS(qdf_status) - || pHostapdState->qdf_status) { + if (pHostapdState->qdf_status) { hdd_err("ERROR: startbss event failed!!"); + /* + * Make sure to set the event before proceeding + * for error handling otherwise caller thread will + * wait till 10 secs and no other connection will + * go through before that. + */ + qdf_event_set(&pHostapdState->qdf_event); goto stopbss; } else { sme_ch_avoid_update_req(pHddCtx->hHal); @@ -1084,6 +1088,13 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, pHostapdAdapter->dev->dev_addr); if (status) { hdd_err("WLAN_AP_CONNECT event failed!!"); + /* + * Make sure to set the event before proceeding + * for error handling otherwise caller thread + * will wait till 10 secs and no other + * connection will go through before that. + */ + qdf_event_set(&pHostapdState->qdf_event); goto stopbss; } } @@ -1209,6 +1220,17 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, hdd_info("set hw mode change not done"); cds_set_do_hw_mode_change_flag(false); } + /* + * set this event at the very end because once this events + * get set, caller thread is waiting to do further processing. + * so once this event gets set, current worker thread might get + * pre-empted by caller thread. + */ + qdf_status = qdf_event_set(&pHostapdState->qdf_event); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) { + hdd_err("ERROR: startbss event set failed!!"); + goto stopbss; + } break; /* Event will be sent after Switch-Case stmt */ case eSAP_STOP_BSS_EVENT: @@ -1532,7 +1554,6 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent, hdd_err("Failed to allocate station info"); return QDF_STATUS_E_FAILURE; } - memset(sta_info, 0, sizeof(*sta_info)); if (iesLen <= MAX_ASSOC_IND_IE_LEN) { sta_info->assoc_req_ies = (const u8 *)&pSapEvent->sapevt. @@ -3603,8 +3624,13 @@ static __iw_softap_set_pktlog(struct net_device *dev, if (NULL == value) return -ENOMEM; + if (wrqu->data.length < 1 || wrqu->data.length > 2) { + hdd_err("pktlog: either 1 or 2 parameters are required"); + return -EINVAL; + } + hdd_ctx = WLAN_HDD_GET_CTX(pHostapdAdapter); - return hdd_process_pktlog_command(hdd_ctx, value[0]); + return hdd_process_pktlog_command(hdd_ctx, value[0], value[1]); } int @@ -5488,7 +5514,7 @@ static const struct iw_priv_args hostapd_private_args[] = { , { QCSAP_IOCTL_SET_PKTLOG, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + IW_PRIV_TYPE_INT | MAX_VAR_ARGS, 0, "pktlog" } , @@ -5818,6 +5844,11 @@ hdd_adapter_t *hdd_wlan_create_ap_dev(hdd_context_t *pHddCtx, pWlanHostapdDev->mtu = HDD_DEFAULT_MTU; pWlanHostapdDev->tx_queue_len = HDD_NETDEV_TX_QUEUE_LEN; + if (pHddCtx->config->enable_ip_tcp_udp_checksum_offload) + pWlanHostapdDev->features |= + NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; + pWlanHostapdDev->features |= NETIF_F_RXCSUM; + qdf_mem_copy(pWlanHostapdDev->dev_addr, (void *)macAddr, sizeof(tSirMacAddr)); qdf_mem_copy(pHostapdAdapter->macAddressCurrent.bytes, @@ -7594,21 +7625,8 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, pHddCtx = WLAN_HDD_GET_CTX(pAdapter); ret = wlan_hdd_validate_context(pHddCtx); - if (0 != ret) { - if (cds_is_driver_unloading()) { - /* - * Unloading the driver so free the memory for ch_list, - * otherwise it will result in memory leak - */ - if (pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list) { - qdf_mem_free(pAdapter->sessionCtx.ap.sapConfig. - acs_cfg.ch_list); - pAdapter->sessionCtx.ap.sapConfig.acs_cfg. - ch_list = NULL; - } - } + if (0 != ret) return ret; - } status = hdd_get_front_adapter(pHddCtx, &pAdapterNode); while (NULL != pAdapterNode && QDF_STATUS_SUCCESS == status) { @@ -7654,8 +7672,7 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, qdf_spin_unlock(&pHddCtx->sap_update_info_lock); } pAdapter->sessionCtx.ap.sapConfig.acs_cfg.acs_mode = false; - if (pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list) - qdf_mem_free(pAdapter->sessionCtx.ap.sapConfig.acs_cfg.ch_list); + wlan_hdd_undo_acs(pAdapter); qdf_mem_zero(&pAdapter->sessionCtx.ap.sapConfig.acs_cfg, sizeof(struct sap_acs_cfg)); hdd_hostapd_stop(dev); @@ -7827,7 +7844,6 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, pHddCtx = WLAN_HDD_GET_CTX(pAdapter); status = wlan_hdd_validate_context(pHddCtx); - if (0 != status) return status; @@ -7835,6 +7851,12 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, hdd_device_mode_to_string(pAdapter->device_mode), pAdapter->device_mode); + + if (cds_is_connection_in_progress()) { + hdd_err("Can't start BSS: connection is in progress"); + return -EBUSY; + } + channel_width = wlan_hdd_get_channel_bw(params->chandef.width); channel = ieee80211_frequency_to_channel( params->chandef.chan->center_freq); @@ -7901,6 +7923,16 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, return -EINVAL; } } + if (pAdapter->device_mode == QDF_P2P_GO_MODE) { + hdd_adapter_t *p2p_adapter; + p2p_adapter = hdd_get_adapter(pHddCtx, QDF_P2P_DEVICE_MODE); + if (p2p_adapter) { + hdd_info("cancel active p2p device ROC before GO " + "starting"); + wlan_hdd_cancel_existing_remain_on_channel( + p2p_adapter); + } + } if ((pAdapter->device_mode == QDF_SAP_MODE) || (pAdapter->device_mode == QDF_P2P_GO_MODE) diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index e08879e1a6f8..b12f4cba749c 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -1162,7 +1162,6 @@ hdd_sendactionframe(hdd_adapter_t *adapter, const uint8_t *bssid, ret = -ENOMEM; goto exit; } - qdf_mem_zero(frame, frame_len); hdr = (struct ieee80211_hdr_3addr *)frame; hdr->frame_control = @@ -2819,7 +2818,6 @@ static int hdd_parse_get_cckm_ie(uint8_t *pValue, uint8_t **pCckmIe, hdd_err("qdf_mem_malloc failed"); return -ENOMEM; } - qdf_mem_zero(*pCckmIe, (*pCckmIeLen + 1) / 2); /* * the buffer received from the upper layer is character buffer, * we need to prepare the buffer taking 2 characters in to a U8 hex @@ -3530,7 +3528,7 @@ static int drv_cmd_get_roam_scan_channels(hdd_adapter_t *adapter, */ len = scnprintf(extra, sizeof(extra), "%s %d", command, numChannels); - for (j = 0; (j < numChannels); j++) + for (j = 0; (j < numChannels) && len <= sizeof(extra); j++) len += scnprintf(extra + len, sizeof(extra) - len, " %d", ChannelList[j]); @@ -4445,13 +4443,6 @@ static int drv_cmd_fast_reassoc(hdd_adapter_t *adapter, goto exit; } - /* Check channel number is a valid channel number */ - if (QDF_STATUS_SUCCESS != - wlan_hdd_validate_operation_channel(adapter, channel)) { - hdd_err("Invalid Channel [%d]", channel); - return -EINVAL; - } - /* * if the target bssid is same as currently associated AP, * issue reassoc to same AP @@ -4462,7 +4453,8 @@ static int drv_cmd_fast_reassoc(hdd_adapter_t *adapter, hdd_info("Reassoc BSSID is same as currently associated AP bssid"); if (roaming_offload_enabled(hdd_ctx)) { hdd_wma_send_fastreassoc_cmd((int)adapter->sessionId, - targetApBssid, (int)channel); + targetApBssid, + pHddStaCtx->conn_info.operationChannel); } else { sme_get_modify_profile_fields(hdd_ctx->hHal, adapter->sessionId, @@ -4473,6 +4465,13 @@ static int drv_cmd_fast_reassoc(hdd_adapter_t *adapter, return 0; } + /* Check channel number is a valid channel number */ + if (QDF_STATUS_SUCCESS != + wlan_hdd_validate_operation_channel(adapter, channel)) { + hdd_err("Invalid Channel [%d]", channel); + return -EINVAL; + } + if (roaming_offload_enabled(hdd_ctx)) { hdd_wma_send_fastreassoc_cmd((int)adapter->sessionId, targetApBssid, (int)channel); @@ -4854,7 +4853,6 @@ static int drv_cmd_set_ibss_beacon_oui_data(hdd_adapter_t *adapter, ret = -ENOMEM; goto exit; } - qdf_mem_zero(ibss_ie, command_len); ibss_ie_length = hdd_parse_set_ibss_oui_data_command(value, ibss_ie, &oui_length, diff --git a/core/hdd/src/wlan_hdd_ipa.c b/core/hdd/src/wlan_hdd_ipa.c index 8cdf2eb68eaf..6097b7c99350 100644 --- a/core/hdd/src/wlan_hdd_ipa.c +++ b/core/hdd/src/wlan_hdd_ipa.c @@ -987,7 +987,7 @@ void hdd_ipa_uc_stat_request(hdd_adapter_t *adapter, uint8_t reason) return; } - HDD_IPA_LOG(LOG1, "STAT REQ Reason %d", reason); + HDD_IPA_LOG(LOGOFF, "STAT REQ Reason %d", reason); qdf_mutex_acquire(&hdd_ipa->ipa_lock); if ((HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe) && (false == hdd_ipa->resource_loading)) { @@ -1603,20 +1603,12 @@ static void hdd_ipa_uc_offload_enable_disable(hdd_adapter_t *adapter, if (!iface_context || (enable == iface_context->offload_enabled)) { /* IPA offload status is already set as desired */ HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, - "offload_type=%d, vdev_id=%d, enable=%d", + "IPA offload status is already set: \ + (offload_type=%d, vdev_id=%d, enable=%d)", offload_type, adapter->sessionId, enable); - WARN_ON(1); return; } - /* Lower layer may send multiple START_BSS_EVENT in DFS mode or during - * channel change indication. Since these indications are sent by lower - * layer as SAP updates and IPA doesn't have to do anything for these - * updates so ignoring! - */ - if (QDF_SAP_MODE == adapter->device_mode && adapter->ipa_context) - return; - qdf_mem_zero(&ipa_offload_enable_disable, sizeof(ipa_offload_enable_disable)); ipa_offload_enable_disable.offload_type = offload_type; @@ -2290,10 +2282,10 @@ int hdd_ipa_set_perf_level(hdd_context_t *hdd_ctx, uint64_t tx_packets, else next_prod_bw = hdd_ctx->config->IpaLowBandwidthMbps; - HDD_IPA_LOG(LOG1, + HDD_IPA_LOG(LOGOFF, "CONS perf curr: %d, next: %d", hdd_ipa->curr_cons_bw, next_cons_bw); - HDD_IPA_LOG(LOG1, + HDD_IPA_LOG(LOGOFF, "PROD perf curr: %d, next: %d", hdd_ipa->curr_prod_bw, next_prod_bw); @@ -3793,55 +3785,52 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, meta.msg_type = type; switch (type) { case WLAN_STA_CONNECT: + qdf_mutex_acquire(&hdd_ipa->event_lock); + /* STA already connected and without disconnect, connect again * This is Roaming scenario */ if (hdd_ipa->sta_connected) hdd_ipa_cleanup_iface(adapter->ipa_context); - if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && - (hdd_ipa->sap_num_connected_sta > 0) && - !hdd_ipa->sta_connected) - hdd_ipa_uc_offload_enable_disable(adapter, - SIR_STA_RX_DATA_OFFLOAD, 1); - - qdf_mutex_acquire(&hdd_ipa->event_lock); - ret = hdd_ipa_setup_iface(hdd_ipa, adapter, sta_id); if (ret) { qdf_mutex_release(&hdd_ipa->event_lock); - if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && - (hdd_ipa->sap_num_connected_sta > 0) && - !hdd_ipa->sta_connected) - hdd_ipa_uc_offload_enable_disable(adapter, - SIR_STA_RX_DATA_OFFLOAD, 0); goto end; } + if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && + (hdd_ipa->sap_num_connected_sta > 0) && + !hdd_ipa->sta_connected) { + qdf_mutex_release(&hdd_ipa->event_lock); + hdd_ipa_uc_offload_enable_disable(adapter, + SIR_STA_RX_DATA_OFFLOAD, 1); + qdf_mutex_acquire(&hdd_ipa->event_lock); + } + vdev_to_iface[adapter->sessionId] = ((struct hdd_ipa_iface_context *) (adapter->ipa_context))->iface_id; - qdf_mutex_release(&hdd_ipa->event_lock); - hdd_ipa->sta_connected = 1; + + qdf_mutex_release(&hdd_ipa->event_lock); break; case WLAN_AP_CONNECT: + qdf_mutex_acquire(&hdd_ipa->event_lock); + /* For DFS channel we get two start_bss event (before and after * CAC). Also when ACS range includes both DFS and non DFS * channels, we could possibly change channel many times due to * RADAR detection and chosen channel may not be a DFS channels. * So dont return error here. Just discard the event. */ - if (adapter->ipa_context) + if (adapter->ipa_context) { + qdf_mutex_release(&hdd_ipa->event_lock); return 0; + } - if (hdd_ipa_uc_is_enabled(hdd_ipa->hdd_ctx)) - hdd_ipa_uc_offload_enable_disable(adapter, - SIR_AP_RX_DATA_OFFLOAD, 1); - - qdf_mutex_acquire(&hdd_ipa->event_lock); ret = hdd_ipa_setup_iface(hdd_ipa, adapter, sta_id); if (ret) { HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, @@ -3851,6 +3840,13 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, goto end; } + if (hdd_ipa_uc_is_enabled(hdd_ipa->hdd_ctx)) { + qdf_mutex_release(&hdd_ipa->event_lock); + hdd_ipa_uc_offload_enable_disable(adapter, + SIR_AP_RX_DATA_OFFLOAD, 1); + qdf_mutex_acquire(&hdd_ipa->event_lock); + } + vdev_to_iface[adapter->sessionId] = ((struct hdd_ipa_iface_context *) (adapter->ipa_context))->iface_id; @@ -3860,7 +3856,6 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, case WLAN_STA_DISCONNECT: qdf_mutex_acquire(&hdd_ipa->event_lock); - hdd_ipa_cleanup_iface(adapter->ipa_context); if (!hdd_ipa->sta_connected) { HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, @@ -3886,24 +3881,29 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && (hdd_ipa->sap_num_connected_sta > 0)) { + qdf_mutex_release(&hdd_ipa->event_lock); hdd_ipa_uc_offload_enable_disable(adapter, SIR_STA_RX_DATA_OFFLOAD, 0); - vdev_to_iface[adapter->sessionId] = HDD_IPA_MAX_IFACE; + qdf_mutex_acquire(&hdd_ipa->event_lock); + vdev_to_iface[adapter->sessionId] = CSR_ROAM_SESSION_MAX; } + hdd_ipa_cleanup_iface(adapter->ipa_context); + qdf_mutex_release(&hdd_ipa->event_lock); break; case WLAN_AP_DISCONNECT: + qdf_mutex_acquire(&hdd_ipa->event_lock); + if (!adapter->ipa_context) { HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, "%s: Evt: %d, SAP already disconnected", msg_ex->name, meta.msg_type); + qdf_mutex_release(&hdd_ipa->event_lock); return -EINVAL; } - qdf_mutex_acquire(&hdd_ipa->event_lock); - hdd_ipa_cleanup_iface(adapter->ipa_context); if ((!hdd_ipa->num_iface) && (HDD_IPA_UC_NUM_WDI_PIPE == hdd_ipa->activated_fw_pipe)) { @@ -3923,18 +3923,19 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, } if (hdd_ipa_uc_is_enabled(hdd_ipa->hdd_ctx)) { + qdf_mutex_release(&hdd_ipa->event_lock); hdd_ipa_uc_offload_enable_disable(adapter, SIR_AP_RX_DATA_OFFLOAD, 0); - vdev_to_iface[adapter->sessionId] = HDD_IPA_MAX_IFACE; + qdf_mutex_acquire(&hdd_ipa->event_lock); + vdev_to_iface[adapter->sessionId] = CSR_ROAM_SESSION_MAX; } + hdd_ipa_cleanup_iface(adapter->ipa_context); + qdf_mutex_release(&hdd_ipa->event_lock); break; case WLAN_CLIENT_CONNECT_EX: - HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, "%d %d", - adapter->dev->ifindex, sta_id); - if (!hdd_ipa_uc_is_enabled(hdd_ipa->hdd_ctx)) { HDD_IPA_LOG(QDF_TRACE_LEVEL_INFO, "%s: Evt: %d, IPA UC OFFLOAD NOT ENABLED", @@ -3945,37 +3946,43 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, qdf_mutex_acquire(&hdd_ipa->event_lock); if (hdd_ipa_uc_find_add_assoc_sta(hdd_ipa, true, sta_id)) { + qdf_mutex_release(&hdd_ipa->event_lock); HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, "%s: STA ID %d found, not valid", adapter->dev->name, sta_id); - qdf_mutex_release(&hdd_ipa->event_lock); return 0; } /* Enable IPA UC Data PIPEs when first STA connected */ if (0 == hdd_ipa->sap_num_connected_sta) { if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && - hdd_ipa->sta_connected) + hdd_ipa->sta_connected) { + qdf_mutex_release(&hdd_ipa->event_lock); hdd_ipa_uc_offload_enable_disable( hdd_get_adapter(hdd_ipa->hdd_ctx, QDF_STA_MODE), SIR_STA_RX_DATA_OFFLOAD, 1); + qdf_mutex_acquire(&hdd_ipa->event_lock); + } ret = hdd_ipa_uc_handle_first_con(hdd_ipa); if (ret) { - qdf_mutex_release(&hdd_ipa->event_lock); HDD_IPA_LOG(QDF_TRACE_LEVEL_ERROR, "%s: handle 1st con ret %d", adapter->dev->name, ret); if (hdd_ipa_uc_sta_is_enabled( hdd_ipa->hdd_ctx) && - hdd_ipa->sta_connected) + hdd_ipa->sta_connected) { + qdf_mutex_release(&hdd_ipa->event_lock); hdd_ipa_uc_offload_enable_disable( hdd_get_adapter( hdd_ipa->hdd_ctx, QDF_STA_MODE), SIR_STA_RX_DATA_OFFLOAD, 0); + } else { + qdf_mutex_release(&hdd_ipa->event_lock); + } return ret; } @@ -4045,13 +4052,15 @@ static int __hdd_ipa_wlan_evt(hdd_adapter_t *adapter, uint8_t sta_id, hdd_ipa_uc_handle_last_discon(hdd_ipa); if (hdd_ipa_uc_sta_is_enabled(hdd_ipa->hdd_ctx) && - hdd_ipa->sta_connected) + hdd_ipa->sta_connected) { + qdf_mutex_release(&hdd_ipa->event_lock); hdd_ipa_uc_offload_enable_disable( hdd_get_adapter(hdd_ipa->hdd_ctx, QDF_STA_MODE), SIR_STA_RX_DATA_OFFLOAD, 0); - - qdf_mutex_release(&hdd_ipa->event_lock); + } else { + qdf_mutex_release(&hdd_ipa->event_lock); + } break; default: @@ -4222,6 +4231,7 @@ QDF_STATUS hdd_ipa_init(hdd_context_t *hdd_ctx) iface_context->adapter = NULL; iface_context->offload_enabled = 0; qdf_spinlock_create(&iface_context->interface_lock); + vdev_to_iface[i] = CSR_ROAM_SESSION_MAX; } INIT_WORK(&hdd_ipa->pm_work, hdd_ipa_pm_flush); diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index af549d3ad93d..eaa8287ecccd 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -998,7 +998,7 @@ static void hdd_update_tgt_vht_cap(hdd_context_t *hdd_ctx, struct hdd_config *pconfig = hdd_ctx->config; struct wiphy *wiphy = hdd_ctx->wiphy; struct ieee80211_supported_band *band_5g = - wiphy->bands[IEEE80211_BAND_5GHZ]; + wiphy->bands[NL80211_BAND_5GHZ]; uint32_t temp = 0; if (!band_5g) { @@ -2916,6 +2916,7 @@ static void hdd_ap_adapter_deinit(hdd_context_t *hdd_ctx, hdd_wmm_adapter_close(adapter); clear_bit(WMM_INIT_DONE, &adapter->event_flags); } + wlan_hdd_undo_acs(adapter); hdd_cleanup_actionframe(hdd_ctx, adapter); @@ -3991,10 +3992,10 @@ void hdd_connect_result(struct net_device *dev, const u8 *bssid, if (chan_no <= 14) freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); else freq = ieee80211_channel_to_frequency(chan_no, - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); chan = ieee80211_get_channel(padapter->wdev.wiphy, freq); bss = hdd_cfg80211_get_bss(padapter->wdev.wiphy, chan, bssid, @@ -4873,7 +4874,6 @@ static void hdd_wlan_exit(hdd_context_t *hdd_ctx) hdd_stop_all_adapters(hdd_ctx); } - hdd_wlan_stop_modules(hdd_ctx); /* * Close the scheduler before calling cds_close to make sure no thread * is scheduled after the each module close is called i.e after all the @@ -4885,6 +4885,8 @@ static void hdd_wlan_exit(hdd_context_t *hdd_ctx) QDF_ASSERT(QDF_IS_STATUS_SUCCESS(qdf_status)); } + hdd_wlan_stop_modules(hdd_ctx); + qdf_spinlock_destroy(&hdd_ctx->hdd_adapter_lock); qdf_spinlock_destroy(&hdd_ctx->sta_update_info_lock); qdf_spinlock_destroy(&hdd_ctx->connection_status_lock); @@ -6023,6 +6025,14 @@ void hdd_unsafe_channel_restart_sap(hdd_context_t *hdd_ctxt) if (!restart_chan) { hdd_alert("fail to restart SAP"); } else { + /* SAP restart due to unsafe channel. While restarting + * the SAP, make sure to clear acs_channel, channel to + * reset to 0. Otherwise these settings will override + * the ACS while restart. + */ + hdd_ctxt->acs_policy.acs_channel = AUTO_CHANNEL_SELECT; + adapter_temp->sessionCtx.ap.sapConfig.channel = + AUTO_CHANNEL_SELECT; hdd_info("sending coex indication"); wlan_hdd_send_svc_nlink_msg(hdd_ctxt->radio_index, WLAN_SVC_LTE_COEX_IND, NULL, 0); @@ -6894,8 +6904,6 @@ static int hdd_update_cds_config(hdd_context_t *hdd_ctx) return -ENOMEM; } - qdf_mem_zero(cds_cfg, sizeof(*cds_cfg)); - /* UMA is supported in hardware for performing the * frame translation 802.11 <-> 802.3 */ @@ -7062,14 +7070,53 @@ static inline void hdd_release_rtnl_lock(void) { } #if !defined(REMOVE_PKT_LOG) +/* MAX iwpriv command support */ +#define PKTLOG_SET_BUFF_SIZE 3 +#define MAX_PKTLOG_SIZE 16 + +/** + * hdd_pktlog_set_buff_size() - set pktlog buffer size + * @hdd_ctx: hdd context + * @set_value2: pktlog buffer size value + * + * + * Return: 0 for success or error. + */ +static int hdd_pktlog_set_buff_size(hdd_context_t *hdd_ctx, int set_value2) +{ + struct sir_wifi_start_log start_log = { 0 }; + QDF_STATUS status; + + start_log.ring_id = RING_ID_PER_PACKET_STATS; + start_log.verbose_level = WLAN_LOG_LEVEL_OFF; + start_log.ini_triggered = cds_is_packet_log_enabled(); + start_log.user_triggered = 1; + start_log.size = set_value2; + + status = sme_wifi_start_logger(hdd_ctx->hHal, start_log); + if (!QDF_IS_STATUS_SUCCESS(status)) { + hdd_err("sme_wifi_start_logger failed(err=%d)", status); + EXIT(); + return -EINVAL; + } + + return 0; +} + /** * hdd_process_pktlog_command() - process pktlog command * @hdd_ctx: hdd context * @set_value: value set by user + * @set_value2: pktlog buffer size value + * + * This function process pktlog command. + * set_value2 only matters when set_value is 3 (set buff size) + * otherwise we ignore it. * * Return: 0 for success or error. */ -int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value) +int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value, + int set_value2) { int ret; bool enable; @@ -7079,13 +7126,24 @@ int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value) if (0 != ret) return ret; - hdd_info("set pktlog %d", set_value); + hdd_info("set pktlog %d, set size %d", set_value, set_value2); - if (set_value > 2) { + if (set_value > PKTLOG_SET_BUFF_SIZE) { hdd_err("invalid pktlog value %d", set_value); return -EINVAL; } + if (set_value == PKTLOG_SET_BUFF_SIZE) { + if (set_value2 <= 0) { + hdd_err("invalid pktlog size %d", set_value2); + return -EINVAL; + } else if (set_value2 > MAX_PKTLOG_SIZE) { + hdd_err("Pktlog buff size is too large. max value is 16MB.\n"); + return -EINVAL; + } + return hdd_pktlog_set_buff_size(hdd_ctx, set_value2); + } + /* * set_value = 0 then disable packetlog * set_value = 1 enable packetlog forcefully @@ -7100,17 +7158,19 @@ int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value) user_triggered = 1; } - return hdd_pktlog_enable_disable(hdd_ctx, enable, user_triggered); + return hdd_pktlog_enable_disable(hdd_ctx, enable, user_triggered, 0); } /** * hdd_pktlog_enable_disable() - Enable/Disable packet logging * @hdd_ctx: HDD context * @enable: Flag to enable/disable + * @user_triggered: triggered through iwpriv + * @size: buffer size to be used for packetlog * * Return: 0 on success; error number otherwise */ int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, - uint8_t user_triggered) + uint8_t user_triggered, int size) { struct sir_wifi_start_log start_log; QDF_STATUS status; @@ -7120,6 +7180,7 @@ int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, enable ? WLAN_LOG_LEVEL_ACTIVE : WLAN_LOG_LEVEL_OFF; start_log.ini_triggered = cds_is_packet_log_enabled(); start_log.user_triggered = user_triggered; + start_log.size = size; /* * Use "is_iwpriv_command" flag to distinguish iwpriv command from other * commands. Host uses this flag to decide whether to send pktlog @@ -8048,7 +8109,7 @@ int hdd_wlan_startup(struct device *dev) if (cds_is_packet_log_enabled()) - hdd_pktlog_enable_disable(hdd_ctx, true, 0); + hdd_pktlog_enable_disable(hdd_ctx, true, 0, 0); ret = hdd_register_notifiers(hdd_ctx); if (ret) diff --git a/core/hdd/src/wlan_hdd_ocb.c b/core/hdd/src/wlan_hdd_ocb.c index 9b435ce7dac3..64ac5a0ebb42 100644 --- a/core/hdd/src/wlan_hdd_ocb.c +++ b/core/hdd/src/wlan_hdd_ocb.c @@ -145,7 +145,7 @@ static int dot11p_validate_channel(struct wiphy *wiphy, struct ieee80211_supported_band *current_band; struct ieee80211_channel *current_channel; - for (band_idx = 0; band_idx < IEEE80211_NUM_BANDS; band_idx++) { + for (band_idx = 0; band_idx < NUM_NL80211_BANDS; band_idx++) { current_band = wiphy->bands[band_idx]; if (!current_band) continue; @@ -302,10 +302,11 @@ static int hdd_ocb_register_sta(hdd_adapter_t *adapter) * * Return: A pointer to the OCB configuration struct, NULL on failure. */ -static struct sir_ocb_config *hdd_ocb_config_new(int num_channels, - int num_schedule, - int ndl_chan_list_len, - int ndl_active_state_list_len) +static +struct sir_ocb_config *hdd_ocb_config_new(uint32_t num_channels, + uint32_t num_schedule, + uint32_t ndl_chan_list_len, + uint32_t ndl_active_state_list_len) { struct sir_ocb_config *ret = 0; uint32_t len; @@ -325,7 +326,6 @@ static struct sir_ocb_config *hdd_ocb_config_new(int num_channels, if (!cursor) goto fail; - qdf_mem_zero(cursor, len); ret = cursor; cursor += sizeof(*ret); @@ -792,7 +792,7 @@ static int __wlan_hdd_cfg80211_ocb_set_config(struct wiphy *wiphy, uint32_t ndl_active_state_list_len; uint32_t flags = 0; int i; - int channel_count, schedule_size; + uint32_t channel_count, schedule_size; struct sir_ocb_config *config; int rc = -EINVAL; uint8_t *mac_addr; @@ -1121,7 +1121,6 @@ __wlan_hdd_cfg80211_ocb_start_timing_advert(struct wiphy *wiphy, hdd_err("qdf_mem_malloc failed"); return -ENOMEM; } - qdf_mem_zero(timing_advert, sizeof(*timing_advert)); timing_advert->vdev_id = adapter->sessionId; /* Parse the netlink message */ @@ -1239,7 +1238,6 @@ __wlan_hdd_cfg80211_ocb_stop_timing_advert(struct wiphy *wiphy, hdd_err("qdf_mem_malloc failed"); return -ENOMEM; } - qdf_mem_zero(timing_advert, sizeof(sizeof(*timing_advert))); timing_advert->vdev_id = adapter->sessionId; /* Parse the netlink message */ diff --git a/core/hdd/src/wlan_hdd_p2p.c b/core/hdd/src/wlan_hdd_p2p.c index 729fcd676ade..da23bada2fe2 100644 --- a/core/hdd/src/wlan_hdd_p2p.c +++ b/core/hdd/src/wlan_hdd_p2p.c @@ -822,7 +822,6 @@ static int wlan_hdd_request_remain_on_channel(struct wiphy *wiphy, return -ENOMEM; } - qdf_mem_zero(pRemainChanCtx, sizeof(*pRemainChanCtx)); qdf_mem_copy(&pRemainChanCtx->chan, chan, sizeof(struct ieee80211_channel)); pRemainChanCtx->duration = duration; @@ -2308,10 +2307,10 @@ void __hdd_indicate_mgmt_frame(hdd_adapter_t *pAdapter, /* Indicate an action frame. */ if (rxChan <= MAX_NO_OF_2_4_CHANNELS) freq = ieee80211_channel_to_frequency(rxChan, - IEEE80211_BAND_2GHZ); + NL80211_BAND_2GHZ); else freq = ieee80211_channel_to_frequency(rxChan, - IEEE80211_BAND_5GHZ); + NL80211_BAND_5GHZ); cfgState = WLAN_HDD_GET_CFG_STATE_PTR(pAdapter); diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index 7e6e0bd5571f..bee6a6f01ba4 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -76,6 +76,7 @@ #include "cdp_txrx_flow_ctrl_v2.h" #include "pld_common.h" #include "wlan_hdd_driver_ops.h" +#include /* Preprocessor definitions and constants */ #define HDD_SSR_BRING_UP_TIME 30000 @@ -1057,7 +1058,6 @@ void wlan_hdd_set_mc_addr_list(hdd_adapter_t *pAdapter, uint8_t set) hdd_err("Could not allocate Memory"); return; } - qdf_mem_zero(pMulticastAddrs, sizeof(tSirRcvFltMcAddrList)); pMulticastAddrs->action = set; if (set) { @@ -1456,6 +1456,10 @@ QDF_STATUS hdd_wlan_shutdown(void) } cds_clear_concurrent_session_count(); + + hdd_info("Invoking packetdump deregistration API"); + wlan_deregister_txrx_packetdump(); + hdd_cleanup_scan_queue(pHddCtx); hdd_reset_all_adapters(pHddCtx); @@ -1586,7 +1590,7 @@ QDF_STATUS hdd_wlan_re_init(void) goto err_cds_disable; if (cds_is_packet_log_enabled()) - hdd_pktlog_enable_disable(pHddCtx, true, 0); + hdd_pktlog_enable_disable(pHddCtx, true, 0, 0); hdd_err("WLAN host driver reinitiation completed!"); goto success; @@ -1725,6 +1729,9 @@ static int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy) ENTER(); + if (cds_is_driver_recovering()) + return 0; + if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) { hdd_err("Command not allowed in FTM mode"); return -EINVAL; @@ -2423,6 +2430,7 @@ int hdd_set_qpower_config(hdd_context_t *hddctx, hdd_adapter_t *adapter, */ #define CE_IRQ_COUNT 12 #define CE_WAKE_IRQ 2 +static struct net_device *g_dev; static struct wiphy *g_wiphy; #define HDD_FA_SUSPENDED_BIT (0) @@ -2432,11 +2440,13 @@ static unsigned long fake_apps_state; * __hdd_wlan_fake_apps_resume() - The core logic for * hdd_wlan_fake_apps_resume() skipping the call to hif_fake_apps_resume(), * which is only need for non-irq resume - * @wiphy: wiphy struct from a validated hdd context + * @wiphy: the kernel wiphy struct for the device being resumed + * @dev: the kernel net_device struct for the device being resumed * - * Return: Zero on success, calls QDF_BUG() on failure + * Return: none, calls QDF_BUG() on failure */ -static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy) +static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy, + struct net_device *dev) { qdf_device_t qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); int i, resume_err; @@ -2462,6 +2472,8 @@ static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy) resume_err = wlan_hdd_cfg80211_resume_wlan(wiphy); QDF_BUG(resume_err == 0); + + dev->watchdog_timeo = HDD_TX_TIMEOUT; } /** @@ -2478,11 +2490,13 @@ static void hdd_wlan_fake_apps_resume_irq_callback(uint32_t val) hdd_info("Trigger unit-test resume WLAN; val: 0x%x", val); QDF_BUG(g_wiphy); - __hdd_wlan_fake_apps_resume(g_wiphy); + QDF_BUG(g_dev); + __hdd_wlan_fake_apps_resume(g_wiphy, g_dev); g_wiphy = NULL; + g_dev = NULL; } -int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy) +int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev) { qdf_device_t qdf_dev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE); struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF); @@ -2515,10 +2529,17 @@ int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy) /* re-enable wake irq */ pld_enable_irq(qdf_dev->dev, CE_WAKE_IRQ); - /* pass wiphy to callback via global variable */ + /* pass wiphy/dev to callback via global variables */ g_wiphy = wiphy; + g_dev = dev; hif_fake_apps_suspend(hif_ctx, hdd_wlan_fake_apps_resume_irq_callback); + /* + * Tell the kernel not to worry if TX queues aren't moving. This is + * expected since we are suspending the wifi hardware, but not APPS + */ + dev->watchdog_timeo = INT_MAX; + return 0; enable_irqs_and_bus_resume: @@ -2539,12 +2560,12 @@ resume_done: return suspend_err; } -int hdd_wlan_fake_apps_resume(struct wiphy *wiphy) +int hdd_wlan_fake_apps_resume(struct wiphy *wiphy, struct net_device *dev) { struct hif_opaque_softc *hif_ctx = cds_get_context(QDF_MODULE_ID_HIF); hif_fake_apps_resume(hif_ctx); - __hdd_wlan_fake_apps_resume(wiphy); + __hdd_wlan_fake_apps_resume(wiphy, dev); return 0; } diff --git a/core/hdd/src/wlan_hdd_regulatory.c b/core/hdd/src/wlan_hdd_regulatory.c index 4487d5dd2500..b64a4ac7c3b5 100644 --- a/core/hdd/src/wlan_hdd_regulatory.c +++ b/core/hdd/src/wlan_hdd_regulatory.c @@ -230,6 +230,8 @@ static void hdd_regulatory_wiphy_init(hdd_context_t *hdd_ctx, struct wiphy *wiphy) { const struct ieee80211_regdomain *reg_rules; + int chan_num; + struct ieee80211_channel chan; if (hdd_is_world_regdomain(reg->reg_domain)) { reg_rules = hdd_get_world_regrules(reg); @@ -248,6 +250,17 @@ static void hdd_regulatory_wiphy_init(hdd_context_t *hdd_ctx, hdd_ctx->reg.reg_flags = wiphy->regulatory_flags; wiphy_apply_custom_regulatory(wiphy, reg_rules); + /* + * disable 2.4 Ghz channels that dont have 20 mhz bw + */ + for (chan_num = 0; + chan_num < wiphy->bands[IEEE80211_BAND_2GHZ]->n_channels; + chan_num++) { + chan = wiphy->bands[IEEE80211_BAND_2GHZ]->channels[chan_num]; + if (chan.flags & IEEE80211_CHAN_NO_20MHZ) + chan.flags |= IEEE80211_CHAN_DISABLED; + } + /* * restore the driver regulatory flags since * wiphy_apply_custom_regulatory may have @@ -373,7 +386,7 @@ static void hdd_process_regulatory_data(hdd_context_t *hdd_ctx, band_capability = hdd_ctx->config->nBandCapability; hdd_ctx->isVHT80Allowed = 0; - for (band_num = 0; band_num < IEEE80211_NUM_BANDS; band_num++) { + for (band_num = 0; band_num < NUM_NL80211_BANDS; band_num++) { if (wiphy->bands[band_num] == NULL) continue; @@ -557,7 +570,7 @@ static void hdd_restore_custom_reg_settings(struct wiphy *wiphy, bool *reset) { struct ieee80211_supported_band *sband; - enum ieee80211_band band; + enum nl80211_band band; struct ieee80211_channel *chan; int i; @@ -565,7 +578,7 @@ static void hdd_restore_custom_reg_settings(struct wiphy *wiphy, (country_alpha2[1] == '0') && (wiphy->flags & WIPHY_FLAG_CUSTOM_REGULATORY)) { - for (band = 0; band < IEEE80211_NUM_BANDS; band++) { + for (band = 0; band < NUM_NL80211_BANDS; band++) { sband = wiphy->bands[band]; if (!sband) continue; diff --git a/core/hdd/src/wlan_hdd_scan.c b/core/hdd/src/wlan_hdd_scan.c index 441ba7ccc18f..d909dacc2baa 100644 --- a/core/hdd/src/wlan_hdd_scan.c +++ b/core/hdd/src/wlan_hdd_scan.c @@ -1085,7 +1085,7 @@ static void hdd_vendor_scan_callback(hdd_adapter_t *adapter, nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_SCAN_FLAGS, req->flags)) goto nla_put_failure; - if (nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, cookie)) + if (hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, cookie)) goto nla_put_failure; scan_status = (aborted == true) ? VENDOR_SCAN_STATUS_ABORTED : @@ -1103,7 +1103,29 @@ nla_put_failure: return; } -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)) +/** + * hdd_cfg80211_scan_done() - Scan completed callback to cfg80211 + * @adapter: Pointer to the adapter + * @req : Scan request + * @aborted : true scan aborted false scan success + * + * This function notifies scan done to cfg80211 + * + * Return: none + */ +static void hdd_cfg80211_scan_done(hdd_adapter_t *adapter, + struct cfg80211_scan_request *req, + bool aborted) +{ + struct cfg80211_scan_info info = { + .aborted = aborted + }; + + if (adapter->dev->flags & IFF_UP) + cfg80211_scan_done(req, &info); +} +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) /** * hdd_cfg80211_scan_done() - Scan completed callback to cfg80211 * @adapter: Pointer to the adapter @@ -1294,7 +1316,7 @@ static void wlan_hdd_cfg80211_scan_block_cb(struct work_struct *work) request->n_channels = 0; hdd_err("##In DFS Master mode. Scan aborted. Null result sent"); - cfg80211_scan_done(request, true); + hdd_cfg80211_scan_done(adapter, request, true); adapter->request = NULL; } } @@ -1798,7 +1820,7 @@ int wlan_hdd_cfg80211_scan(struct wiphy *wiphy, * Return: o for failure, rate bitmap for success */ static uint32_t wlan_hdd_get_rates(struct wiphy *wiphy, - enum ieee80211_band band, + enum nl80211_band band, const u8 *rates, unsigned int rate_count) { uint32_t j, count, rate_bitmap = 0; @@ -1842,7 +1864,8 @@ static int wlan_hdd_send_scan_start_event(struct wiphy *wiphy, return -ENOMEM; } - if (nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, cookie)) { + if (hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, + cookie)) { hdd_err("nla put fail"); kfree_skb(skb); return -EINVAL; @@ -1859,7 +1882,8 @@ static int wlan_hdd_send_scan_start_event(struct wiphy *wiphy, return -ENOMEM; } - if (nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, cookie)) { + if (hdd_wlan_nla_put_u64(skb, QCA_WLAN_VENDOR_ATTR_SCAN_COOKIE, + cookie)) { kfree_skb(skb); return -EINVAL; } @@ -1885,7 +1909,7 @@ static int __wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy, struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SCAN_MAX + 1]; struct cfg80211_scan_request *request = NULL; struct nlattr *attr; - enum ieee80211_band band; + enum nl80211_band band; uint8_t n_channels = 0, n_ssid = 0, ie_len = 0; uint32_t tmp, count, j; unsigned int len; @@ -1910,7 +1934,7 @@ static int __wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy, tb[QCA_WLAN_VENDOR_ATTR_SCAN_FREQUENCIES], tmp) n_channels++; } else { - for (band = 0; band < IEEE80211_NUM_BANDS; band++) + for (band = 0; band < NUM_NL80211_BANDS; band++) if (wiphy->bands[band]) n_channels += wiphy->bands[band]->n_channels; } @@ -1965,7 +1989,7 @@ static int __wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy, count++; } } else { - for (band = 0; band < IEEE80211_NUM_BANDS; band++) { + for (band = 0; band < NUM_NL80211_BANDS; band++) { if (!wiphy->bands[band]) continue; for (j = 0; j < wiphy->bands[band]->n_channels; @@ -2001,7 +2025,7 @@ static int __wlan_hdd_cfg80211_vendor_scan(struct wiphy *wiphy, request->ie_len); } - for (count = 0; count < IEEE80211_NUM_BANDS; count++) + for (count = 0; count < NUM_NL80211_BANDS; count++) if (wiphy->bands[count]) request->rates[count] = (1 << wiphy->bands[count]->n_bitrates) - 1; @@ -2263,7 +2287,6 @@ static int __wlan_hdd_cfg80211_sched_scan_start(struct wiphy *wiphy, return -ENOMEM; } - memset(pPnoRequest, 0, sizeof(tSirPNOScanReq)); pPnoRequest->enable = 1; /*Enable PNO */ pPnoRequest->ucNetworksCount = request->n_match_sets; @@ -2534,7 +2557,6 @@ static int __wlan_hdd_cfg80211_sched_scan_stop(struct wiphy *wiphy, return -ENOMEM; } - memset(pPnoRequest, 0, sizeof(tSirPNOScanReq)); pPnoRequest->enable = 0; /* Disable PNO */ pPnoRequest->ucNetworksCount = 0; @@ -2669,7 +2691,7 @@ void hdd_cleanup_scan_queue(hdd_context_t *hdd_ctx) hdd_err("HDD adapter magic is invalid"); } else { if (NL_SCAN == source) - cfg80211_scan_done(req, aborted); + hdd_cfg80211_scan_done(adapter, req, aborted); else hdd_vendor_scan_callback(adapter, req, aborted); hdd_info("removed Scan id: %d, req = %p", diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index ab6357535162..f5c670d1174f 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -351,7 +351,7 @@ static int __hdd_softap_hard_start_xmit(struct sk_buff *skb, ++pAdapter->hdd_stats.hddTxRxStats.txXmitDroppedAC[ac]; goto drop_pkt; } - dev->trans_start = jiffies; + netif_trans_update(dev); return NETDEV_TX_OK; @@ -425,9 +425,7 @@ static void __hdd_softap_tx_timeout(struct net_device *dev) return; } - QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_ERROR, - "%s: Transmission timeout occurred jiffies %lu trans_start %lu" - , __func__, jiffies, dev->trans_start); + TX_TIMEOUT_TRACE(dev, QDF_MODULE_ID_HDD_SAP_DATA); for (i = 0; i < NUM_TX_QUEUES; i++) { txq = netdev_get_tx_queue(dev, i); @@ -441,7 +439,6 @@ static void __hdd_softap_tx_timeout(struct net_device *dev) ol_tx_dump_flow_pool_info(); QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR, "carrier state: %d", netif_carrier_ok(dev)); - } /** diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c index 9061136c7940..e38f1db5f85a 100644 --- a/core/hdd/src/wlan_hdd_stats.c +++ b/core/hdd/src/wlan_hdd_stats.c @@ -473,7 +473,7 @@ static bool put_wifi_iface_stats(tpSirWifiIfaceStat pWifiIfaceStat, nla_put_u32(vendor_event, QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_LEAKY_AP_GUARD_TIME, pWifiIfaceStat->rx_leak_window) || - nla_put_u64(vendor_event, + hdd_wlan_nla_put_u64(vendor_event, QCA_WLAN_VENDOR_ATTR_LL_STATS_IFACE_AVERAGE_TSF_OFFSET, average_tsf_offset)) { hdd_err("QCA_WLAN_VENDOR_ATTR put fail"); @@ -2355,7 +2355,7 @@ static int __wlan_hdd_cfg80211_dump_survey(struct wiphy *wiphy, sme_get_operation_channel(halHandle, &channel, pAdapter->sessionId); hdd_wlan_get_freq(channel, &freq); - for (i = 0; i < IEEE80211_NUM_BANDS; i++) { + for (i = 0; i < NUM_NL80211_BANDS; i++) { if (NULL == wiphy->bands[i]) continue; diff --git a/core/hdd/src/wlan_hdd_tdls.c b/core/hdd/src/wlan_hdd_tdls.c index a433ab503abf..0227bd10d69e 100644 --- a/core/hdd/src/wlan_hdd_tdls.c +++ b/core/hdd/src/wlan_hdd_tdls.c @@ -741,8 +741,6 @@ int wlan_hdd_tdls_init(hdd_adapter_t *pAdapter) hdd_err("malloc failed!"); return -ENOMEM; } - /* initialize TDLS pAdater context */ - qdf_mem_zero(pHddTdlsCtx, sizeof(tdlsCtx_t)); /* Initialize connection tracker timer */ qdf_mc_timer_init(&pHddTdlsCtx->peer_update_timer, @@ -1023,7 +1021,6 @@ hddTdlsPeer_t *wlan_hdd_tdls_get_peer(hdd_adapter_t *pAdapter, const u8 *mac, key = wlan_hdd_tdls_hash_key(mac); head = &pHddTdlsCtx->peer_list[key]; - qdf_mem_zero(peer, sizeof(hddTdlsPeer_t)); qdf_mem_copy(peer->peerMac, mac, sizeof(peer->peerMac)); peer->pHddTdlsCtx = pHddTdlsCtx; peer->pref_off_chan_num = pHddCtx->config->fTDLSPrefOffChanNum; diff --git a/core/hdd/src/wlan_hdd_tsf.c b/core/hdd/src/wlan_hdd_tsf.c index 00ba66a82c59..7710527d9a65 100644 --- a/core/hdd/src/wlan_hdd_tsf.c +++ b/core/hdd/src/wlan_hdd_tsf.c @@ -342,12 +342,13 @@ static int __wlan_hdd_cfg80211_handle_tsf_cmd(struct wiphy *wiphy, status = -ENOMEM; goto end; } - if (nla_put_u64(reply_skb, QCA_WLAN_VENDOR_ATTR_TSF_TIMER_VALUE, + if (hdd_wlan_nla_put_u64(reply_skb, + QCA_WLAN_VENDOR_ATTR_TSF_TIMER_VALUE, ((uint64_t) adapter->tsf_high << 32 | adapter->tsf_low)) || - nla_put_u64(reply_skb, + hdd_wlan_nla_put_u64(reply_skb, QCA_WLAN_VENDOR_ATTR_TSF_SOC_TIMER_VALUE, - adapter->tsf_sync_soc_timer)){ + adapter->tsf_sync_soc_timer)) { hdd_err("nla put fail"); kfree_skb(reply_skb); status = -EINVAL; diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index 56056938c6d8..93283605640c 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -595,7 +595,7 @@ static int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) ++pAdapter->hdd_stats.hddTxRxStats.txXmitDroppedAC[ac]; goto drop_pkt; } - dev->trans_start = jiffies; + netif_trans_update(dev); return NETDEV_TX_OK; @@ -685,9 +685,7 @@ static void __hdd_tx_timeout(struct net_device *dev) struct netdev_queue *txq; int i = 0; - QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR, - "%s: Transmission timeout occurred jiffies %lu trans_start %lu", - __func__, jiffies, dev->trans_start); + TX_TIMEOUT_TRACE(dev, QDF_MODULE_ID_HDD_DATA); DPTRACE(qdf_dp_trace(NULL, QDF_DP_TRACE_HDD_TX_TIMEOUT, NULL, 0, QDF_TX)); diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index f4af8b1e7619..52d44b5668cb 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -5086,10 +5086,10 @@ int wlan_hdd_update_phymode(struct net_device *net, tHalHandle hal, return -EIO; } if (phddctx->config->nChannelBondingMode5GHz) - phddctx->wiphy->bands[IEEE80211_BAND_5GHZ]->ht_cap.cap + phddctx->wiphy->bands[NL80211_BAND_5GHZ]->ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; else - phddctx->wiphy->bands[IEEE80211_BAND_5GHZ]->ht_cap.cap + phddctx->wiphy->bands[NL80211_BAND_5GHZ]->ht_cap.cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; hdd_warn("New_Phymode= %d ch_bonding=%d band=%d VHT_ch_width=%u", @@ -5382,11 +5382,6 @@ static int __iw_setint_getnone(struct net_device *dev, break; } - case WE_SET_PKTLOG: - { - hdd_process_pktlog_command(hdd_ctx, set_value); - break; - } case WE_SET_HIGHER_DTIM_TRANSITION: { if (!((set_value == false) || (set_value == true))) { @@ -8236,6 +8231,22 @@ static int __iw_set_var_ints_getnone(struct net_device *dev, } break; #endif + case WE_SET_PKTLOG: + { + int ret; + + if (num_args < 1 || num_args > 2) { + hdd_err("pktlog: either 1 or 2 parameters are required"); + return -EINVAL; + } + + ret = hdd_process_pktlog_command(hdd_ctx, apps_args[0], + apps_args[1]); + if (ret) + return ret; + break; + } + case WE_MAC_PWR_DEBUG_CMD: { struct sir_mac_pwr_dbg_cmd mac_pwr_dbg_args; @@ -9872,10 +9883,10 @@ static int __iw_set_two_ints_getnone(struct net_device *dev, ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]); break; case WE_SET_WLAN_SUSPEND: - ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy); + ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev); break; case WE_SET_WLAN_RESUME: - ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy); + ret = hdd_wlan_fake_apps_resume(hdd_ctx->wiphy, dev); break; default: hdd_err("Invalid IOCTL command %d", sub_cmd); @@ -10065,7 +10076,7 @@ static const struct iw_priv_args we_private_args[] = { "setTxMaxPower5G"}, {WE_SET_PKTLOG, - IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + IW_PRIV_TYPE_INT | MAX_VAR_ARGS, 0, "pktlog"}, @@ -11049,8 +11060,8 @@ static const struct iw_priv_args we_private_args[] = { #ifdef WLAN_FEATURE_PACKET_FILTERING { WLAN_SET_PACKET_FILTER_PARAMS, - IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | - sizeof(struct pkt_filter_cfg), + IW_PRIV_TYPE_BYTE | + sizeof(struct pkt_filter_cfg), 0, "setPktFilter" } diff --git a/core/hdd/src/wlan_hdd_wmm.c b/core/hdd/src/wlan_hdd_wmm.c index 53e0086cca19..5af581e23274 100644 --- a/core/hdd/src/wlan_hdd_wmm.c +++ b/core/hdd/src/wlan_hdd_wmm.c @@ -2157,6 +2157,7 @@ hdd_wlan_wmm_status_e hdd_wmm_addts(hdd_adapter_t *pAdapter, pQosContext->pAdapter = pAdapter; pQosContext->qosFlowId = 0; pQosContext->magic = HDD_WMM_CTX_MAGIC; + pQosContext->is_inactivity_timer_running = false; hdd_notice("Setting up QoS, context %p", pQosContext); diff --git a/core/mac/inc/qwlan_version.h b/core/mac/inc/qwlan_version.h index 2482107417c5..88237f8aec48 100644 --- a/core/mac/inc/qwlan_version.h +++ b/core/mac/inc/qwlan_version.h @@ -41,9 +41,9 @@ #define QWLAN_VERSION_MAJOR 5 #define QWLAN_VERSION_MINOR 1 #define QWLAN_VERSION_PATCH 0 -#define QWLAN_VERSION_EXTRA "O" -#define QWLAN_VERSION_BUILD 32 +#define QWLAN_VERSION_EXTRA "A" +#define QWLAN_VERSION_BUILD 34 -#define QWLAN_VERSIONSTR "5.1.0.32O" +#define QWLAN_VERSIONSTR "5.1.0.34A" #endif /* QWLAN_VERSION_H */ diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index c673d402d074..3a8c353bde25 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -3226,6 +3226,7 @@ typedef struct { * @is_iwpriv_command: Set 1 for iwpriv command * @ini_triggered: triggered using ini * @user_triggered: triggered by user + * @size: pktlog buffer size */ struct sir_wifi_start_log { uint32_t ring_id; @@ -3233,6 +3234,7 @@ struct sir_wifi_start_log { uint32_t is_iwpriv_command; bool ini_triggered; uint8_t user_triggered; + int size; }; diff --git a/core/mac/src/pe/lim/lim_admit_control.c b/core/mac/src/pe/lim/lim_admit_control.c index 2ed47a0ab019..7c361f37ece2 100644 --- a/core/mac/src/pe/lim/lim_admit_control.c +++ b/core/mac/src/pe/lim/lim_admit_control.c @@ -933,7 +933,6 @@ lim_send_hal_msg_add_ts(tpAniSirGlobal pMac, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pAddTsParam, sizeof(tAddTsParams), 0); pAddTsParam->staIdx = staIdx; pAddTsParam->tspecIdx = tspecIdx; qdf_mem_copy(&pAddTsParam->tspec, &tspecIE, sizeof(tSirMacTspecIE)); @@ -997,7 +996,6 @@ lim_send_hal_msg_del_ts(tpAniSirGlobal pMac, msg.type = WMA_DEL_TS_REQ; msg.bodyptr = pDelTsParam; msg.bodyval = 0; - qdf_mem_set((uint8_t *) pDelTsParam, sizeof(tDelTsParams), 0); /* filling message parameters. */ pDelTsParam->staIdx = staIdx; diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index 52615df03b3c..9cdf5d054af7 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -779,9 +779,6 @@ tSirRetStatus pe_open(tpAniSirGlobal pMac, struct cds_config_info *cds_cfg) goto pe_open_psession_fail; } - qdf_mem_set(pMac->lim.gpSession, - sizeof(tPESession) * pMac->lim.maxBssId, 0); - pMac->lim.mgmtFrameSessionId = 0xff; pMac->lim.tdls_frm_session_id = NO_SESSION; pMac->lim.deferredMsgCnt = 0; @@ -2045,7 +2042,6 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx, mac_ctx->roam.pReassocResp = NULL; return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(roam_sync_ind_ptr->join_rsp, join_rsp_len); lim_log(mac_ctx, LOG1, FL("Session RicLength = %d"), ft_session_ptr->RICDataLen); diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index 8d914ee6e11c..b16c83e4e82b 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -585,6 +585,7 @@ lim_cleanup_rx_path(tpAniSirGlobal pMac, tpDphHashNode pStaDs, * Release our assigned AID back to the free pool */ if (LIM_IS_AP_ROLE(psessionEntry)) { + lim_del_sta(pMac, pStaDs, false, psessionEntry); lim_release_peer_idx(pMac, pStaDs->assocId, psessionEntry); } @@ -2148,7 +2149,6 @@ lim_add_sta(tpAniSirGlobal mac_ctx, FL("Unable to allocate memory during ADD_STA")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) add_sta_params, sizeof(tAddStaParams), 0); if (LIM_IS_AP_ROLE(session_entry) || LIM_IS_IBSS_ROLE(session_entry) || LIM_IS_NDI_ROLE(session_entry)) @@ -2558,8 +2558,6 @@ lim_del_sta(tpAniSirGlobal pMac, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pDelStaParams, sizeof(tDeleteStaParams), 0); - /* */ /* DPH contains the STA index only for "peer" STA entries. */ /* LIM global contains "self" STA index */ @@ -2703,7 +2701,6 @@ lim_add_sta_self(tpAniSirGlobal pMac, uint16_t staIdx, uint8_t updateSta, FL("Unable to allocate memory during ADD_STA")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pAddStaParams, sizeof(tAddStaParams), 0); /* / Add STA context at MAC HW (BMU, RHP & TFP) */ qdf_mem_copy((uint8_t *) pAddStaParams->staMac, @@ -3361,7 +3358,6 @@ lim_del_bss(tpAniSirGlobal pMac, tpDphHashNode pStaDs, uint16_t bssIdx, FL("Unable to allocate memory during ADD_BSS")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pDelBssParams, sizeof(tDeleteBssParams), 0); pDelBssParams->sessionId = psessionEntry->peSessionId; /* update PE session Id */ @@ -3559,9 +3555,7 @@ tSirRetStatus lim_sta_send_add_bss(tpAniSirGlobal pMac, tpSirAssocRsp pAssocRsp, FL("Unable to allocate memory during ADD_BSS")); retCode = eSIR_MEM_ALLOC_FAILED; goto returnFailure; - } else - qdf_mem_set((uint8_t *) pAddBssParams, sizeof(tAddBssParams), - 0); + } qdf_mem_copy(pAddBssParams->bssId, bssDescription->bssId, sizeof(tSirMacAddr)); @@ -4101,8 +4095,6 @@ tSirRetStatus lim_sta_send_add_bss_pre_assoc(tpAniSirGlobal pMac, uint8_t update goto returnFailure; } - qdf_mem_set((uint8_t *) pAddBssParams, sizeof(tAddBssParams), 0); - lim_extract_ap_capabilities(pMac, (uint8_t *) bssDescription->ieFields, lim_get_ielen_from_bss_description(bssDescription), pBeaconStruct); @@ -4804,7 +4796,6 @@ void lim_send_sme_unprotected_mgmt_frame_ind(tpAniSirGlobal pMac, uint8_t frameT ("AllocateMemory failed for tSirSmeUnprotectedMgmtFrameInd")); return; } - qdf_mem_set((void *)pSirSmeMgmtFrame, length, 0); pSirSmeMgmtFrame->sessionId = sessionId; pSirSmeMgmtFrame->frameType = frameType; @@ -4847,7 +4838,6 @@ void lim_send_sme_tsm_ie_ind(tpAniSirGlobal pMac, tpPESession psessionEntry, FL("AllocateMemory failed for tSirSmeTsmIEInd")); return; } - qdf_mem_set((void *)pSirSmeTsmIeInd, sizeof(tSirSmeTsmIEInd), 0); pSirSmeTsmIeInd->sessionId = psessionEntry->smeSessionId; pSirSmeTsmIeInd->tsmIe.tsid = tid; diff --git a/core/mac/src/pe/lim/lim_ft.c b/core/mac/src/pe/lim/lim_ft.c index d4e02035613d..80bfec84cfef 100644 --- a/core/mac/src/pe/lim/lim_ft.c +++ b/core/mac/src/pe/lim/lim_ft.c @@ -157,8 +157,6 @@ void lim_ft_prepare_add_bss_req(tpAniSirGlobal pMac, return; } - qdf_mem_set((uint8_t *) pAddBssParams, sizeof(tAddBssParams), 0); - lim_extract_ap_capabilities(pMac, (uint8_t *) bssDescription->ieFields, lim_get_ielen_from_bss_description(bssDescription), pBeaconStruct); @@ -862,7 +860,6 @@ lim_ft_send_aggr_qos_rsp(tpAniSirGlobal pMac, uint8_t rspReqd, FL("AllocateMemory failed for tSirAggrQosRsp")); return; } - qdf_mem_set((uint8_t *) rsp, sizeof(*rsp), 0); rsp->messageType = eWNI_SME_FT_AGGR_QOS_RSP; rsp->sessionId = smesessionId; rsp->length = sizeof(*rsp); @@ -991,7 +988,6 @@ tSirRetStatus lim_process_ft_aggr_qos_req(tpAniSirGlobal pMac, uint32_t *pMsgBuf return eSIR_FAILURE; } - qdf_mem_set((uint8_t *) pAggrAddTsParam, sizeof(tAggrAddTsParams), 0); pAggrAddTsParam->staIdx = psessionEntry->staId; /* Fill in the sessionId specific to PE */ pAggrAddTsParam->sessionId = sessionId; diff --git a/core/mac/src/pe/lim/lim_ft_preauth.c b/core/mac/src/pe/lim/lim_ft_preauth.c index 6195a041f3c0..cca7f81fa040 100644 --- a/core/mac/src/pe/lim/lim_ft_preauth.c +++ b/core/mac/src/pe/lim/lim_ft_preauth.c @@ -597,7 +597,6 @@ void lim_post_ft_pre_auth_rsp(tpAniSirGlobal mac_ctx, QDF_ASSERT(ft_pre_auth_rsp != NULL); return; } - qdf_mem_zero(ft_pre_auth_rsp, rsp_len); lim_log(mac_ctx, LOG1, FL("Auth Rsp = %p"), ft_pre_auth_rsp); if (session) { @@ -679,8 +678,6 @@ QDF_STATUS lim_send_preauth_scan_offload(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(scan_offload_req, sizeof(tSirScanOffloadReq)); - msg.type = WMA_START_SCAN_OFFLOAD_REQ; msg.bodyptr = scan_offload_req; msg.bodyval = 0; diff --git a/core/mac/src/pe/lim/lim_ibss_peer_mgmt.c b/core/mac/src/pe/lim/lim_ibss_peer_mgmt.c index fe04d3f6b952..4e5f6fe96c4a 100644 --- a/core/mac/src/pe/lim/lim_ibss_peer_mgmt.c +++ b/core/mac/src/pe/lim/lim_ibss_peer_mgmt.c @@ -1123,6 +1123,8 @@ __lim_ibss_search_and_delete_peer(tpAniSirGlobal mac_ptr, mac_ptr->lim.gLimIbssPeerList; } else prev_node->next = temp_node->next; + if (temp_node->beacon) + qdf_mem_free(temp_node->beacon); qdf_mem_free(temp_node); mac_ptr->lim.gLimNumIbssPeers--; @@ -1667,6 +1669,8 @@ void lim_ibss_heart_beat_handle(tpAniSirGlobal mac_ctx, tpPESession session) prevnode->next = tempnode->next; } + if (tempnode->beacon) + qdf_mem_free(tempnode->beacon); qdf_mem_free(tempnode); mac_ctx->lim.gLimNumIbssPeers--; diff --git a/core/mac/src/pe/lim/lim_p2p.c b/core/mac/src/pe/lim/lim_p2p.c index 096f78a16581..64a1a54997d4 100644 --- a/core/mac/src/pe/lim/lim_p2p.c +++ b/core/mac/src/pe/lim/lim_p2p.c @@ -90,8 +90,6 @@ static QDF_STATUS lim_send_hal_req_remain_on_chan_offload(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pScanOffloadReq, sizeof(tSirScanOffloadReq)); - msg.type = WMA_START_SCAN_OFFLOAD_REQ; msg.bodyptr = pScanOffloadReq; msg.bodyval = 0; @@ -390,7 +388,6 @@ void lim_send_sme_mgmt_frame_ind(tpAniSirGlobal pMac, uint8_t frameType, FL("AllocateMemory failed for eWNI_SME_LISTEN_RSP")); return; } - qdf_mem_set((void *)pSirSmeMgmtFrame, length, 0); pSirSmeMgmtFrame->frame_len = frameLen; pSirSmeMgmtFrame->sessionId = sessionId; @@ -410,10 +407,11 @@ void lim_send_sme_mgmt_frame_ind(tpAniSirGlobal pMac, uint8_t frameType, return; } -QDF_STATUS lim_p2p_action_cnf(tpAniSirGlobal pMac, uint32_t txCompleteSuccess) +QDF_STATUS lim_p2p_action_cnf(tpAniSirGlobal pMac, uint32_t tx_status) { QDF_STATUS status; uint32_t mgmt_frame_sessionId; + bool tx_complete_ack = (tx_status) ? false : true; status = pe_acquire_global_lock(&pMac->lim); if (QDF_IS_STATUS_SUCCESS(status)) { @@ -432,7 +430,7 @@ QDF_STATUS lim_p2p_action_cnf(tpAniSirGlobal pMac, uint32_t txCompleteSuccess) mgmt_frame_sessionId); if (pMac->p2p_ack_ind_cb) pMac->p2p_ack_ind_cb(mgmt_frame_sessionId, - txCompleteSuccess); + tx_complete_ack); } } @@ -754,7 +752,6 @@ tSirRetStatus __lim_process_sme_no_a_update(tpAniSirGlobal pMac, uint32_t *pMsgB return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pMsgNoA, sizeof(tP2pPsConfig), 0); pMsgNoA->opp_ps = pNoA->opp_ps; pMsgNoA->ctWindow = pNoA->ctWindow; pMsgNoA->duration = pNoA->duration; diff --git a/core/mac/src/pe/lim/lim_process_action_frame.c b/core/mac/src/pe/lim/lim_process_action_frame.c index df4b83cd9299..5a4609ec1b51 100644 --- a/core/mac/src/pe/lim/lim_process_action_frame.c +++ b/core/mac/src/pe/lim/lim_process_action_frame.c @@ -422,8 +422,6 @@ lim_process_ext_channel_switch_action_frame(tpAniSirGlobal mac_ctx, return; } - qdf_mem_zero(ext_cng_chan_ind, - sizeof(*ext_cng_chan_ind)); ext_cng_chan_ind->session_id = session_entry->smeSessionId; @@ -638,6 +636,11 @@ static void __lim_process_gid_management_action_frame(tpAniSirGlobal mac_ctx, } sta_ptr = dph_lookup_hash_entry(mac_ctx, mac_hdr->sa, &aid, &session->dph.dphHashTable); + if (!sta_ptr) { + lim_log(mac_ctx, LOGE, + FL("Failed to get STA entry from hash table")); + goto out; + } lim_log(mac_ctx, LOGE, FL("received Gid Management Action Frame , staIdx = %d"), sta_ptr->staIndex); @@ -1546,10 +1549,9 @@ static void __lim_process_sa_query_request_action_frame(tpAniSirGlobal pMac, return; /* 11w offload is enabled then firmware should not fwd this frame */ - if (pMac->pmf_offload) { + if (LIM_IS_STA_ROLE(psessionEntry) && pMac->pmf_offload) { lim_log(pMac, LOGE, - FL("11w offload is enabled, SA Query request is not expected ") - ); + FL("11w offload enabled, SA Query req isn't expected")); return; } diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c index c1d77bfb5f9c..69f2d9b41b05 100644 --- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c +++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c @@ -1775,6 +1775,15 @@ void lim_process_assoc_req_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, WMA_GET_RX_MPDU_DATA(rx_pkt_info), frame_len); return; } + if (session->limMlmState == eLIM_MLM_WT_DEL_BSS_RSP_STATE) { + lim_log(mac_ctx, LOGE, FL("drop ASSOC REQ on sessionid: %d " + "role=%d from: "MAC_ADDRESS_STR" in limMlmState %d"), + session->peSessionId, + GET_LIM_SYSTEM_ROLE(session), + MAC_ADDR_ARRAY(hdr->sa), + eLIM_MLM_WT_DEL_BSS_RSP_STATE); + return; + } /* * If a STA is already present in DPH and it is initiating a Assoc @@ -1863,7 +1872,6 @@ void lim_process_assoc_req_frame(tpAniSirGlobal mac_ctx, uint8_t *rx_pkt_info, FL("Allocate Memory failed in assoc_req")); return; } - qdf_mem_set((void *)assoc_req, sizeof(*assoc_req), 0); /* Parse Assoc Request frame */ if (false == lim_chk_assoc_req_parse_error(mac_ctx, hdr, session, @@ -2198,7 +2206,6 @@ void lim_send_mlm_assoc_ind(tpAniSirGlobal mac_ctx, FL("AllocateMemory failed for assoc_ind")); return; } - qdf_mem_set(assoc_ind, temp, 0); qdf_mem_copy((uint8_t *) assoc_ind->peerMacAddr, (uint8_t *) sta_ds->staAddr, sizeof(tSirMacAddr)); assoc_ind->aid = sta_ds->assocId; diff --git a/core/mac/src/pe/lim/lim_process_message_queue.c b/core/mac/src/pe/lim/lim_process_message_queue.c index 2229f7f9bae7..381e186d5bb8 100644 --- a/core/mac/src/pe/lim/lim_process_message_queue.c +++ b/core/mac/src/pe/lim/lim_process_message_queue.c @@ -521,7 +521,6 @@ __lim_pno_match_fwd_bcn_probepsp(tpAniSirGlobal pmac, uint8_t *rx_pkt_info, } hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); body = WMA_GET_RX_MPDU_DATA(rx_pkt_info); - qdf_mem_zero(result, sizeof(*result) + ie_len); /* Received frame does not have request id, hence set 0 */ result->request_id = 0; @@ -574,7 +573,6 @@ __lim_ext_scan_forward_bcn_probe_rsp(tpAniSirGlobal pmac, uint8_t *rx_pkt_info, } hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info); body = WMA_GET_RX_MPDU_DATA(rx_pkt_info); - qdf_mem_zero(result, sizeof(*result) + ie_len); /* Received frame does not have request id, hence set 0 */ result->requestId = 0; diff --git a/core/mac/src/pe/lim/lim_process_mlm_host_roam.c b/core/mac/src/pe/lim/lim_process_mlm_host_roam.c index cb16a1e43ca5..00e22ecef258 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_host_roam.c +++ b/core/mac/src/pe/lim/lim_process_mlm_host_roam.c @@ -425,9 +425,6 @@ void lim_process_sta_mlm_add_bss_rsp_ft(tpAniSirGlobal pMac, if (NULL == pMac->lim.pSessionEntry->pLimMlmReassocRetryReq) goto end; - qdf_mem_set(pMac->lim.pSessionEntry-> - pLimMlmReassocRetryReq, - sizeof(tLimMlmReassocReq), 0); qdf_mem_copy(pMac->lim.pSessionEntry-> pLimMlmReassocRetryReq, psessionEntry->pLimMlmReassocReq, @@ -472,7 +469,6 @@ void lim_process_sta_mlm_add_bss_rsp_ft(tpAniSirGlobal pMac, FL("Unable to allocate memory during ADD_STA")); goto end; } - qdf_mem_set((uint8_t *) pAddStaParams, sizeof(tAddStaParams), 0); /* / Add STA context at MAC HW (BMU, RHP & TFP) */ qdf_mem_copy((uint8_t *) pAddStaParams->staMac, diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c index 6819abd894a8..7cf6c5eef08e 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c @@ -491,7 +491,6 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(addbss_param, sizeof(tAddBssParams), 0); /* Fill in tAddBssParams members */ qdf_mem_copy(addbss_param->bssId, mlm_start_req->bssId, sizeof(tSirMacAddr)); diff --git a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c index 668b63696bb2..bd61bb43c4a0 100644 --- a/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c @@ -586,8 +586,6 @@ void lim_process_mlm_auth_cnf(tpAniSirGlobal mac_ctx, uint32_t *msg) FL("mlmAuthReq :Memory alloc failed ")); return; } - qdf_mem_set((uint8_t *) auth_req, - sizeof(tLimMlmAuthReq), 0); if (session_entry->limSmeState == eLIM_SME_WT_AUTH_STATE) { sir_copy_mac_addr(auth_req->peerMacAddr, @@ -3197,7 +3195,6 @@ void lim_send_beacon_ind(tpAniSirGlobal pMac, tpPESession psessionEntry) ) return; } - qdf_mem_set(pBeaconGenParams, sizeof(*pBeaconGenParams), 0); qdf_mem_copy((void *)pBeaconGenParams->bssId, (void *)psessionEntry->bssId, QDF_MAC_ADDR_SIZE); limMsg.bodyptr = pBeaconGenParams; diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 8528b912e356..9bf72ec16e1f 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -157,8 +157,6 @@ static QDF_STATUS lim_process_set_hw_mode(tpAniSirGlobal mac, uint32_t *msg) return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); - req_msg->hw_mode_index = buf->set_hw.hw_mode_index; req_msg->reason = buf->set_hw.reason; /* Other parameters are not needed for WMA */ @@ -230,8 +228,6 @@ static QDF_STATUS lim_process_set_dual_mac_cfg_req(tpAniSirGlobal mac, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); - req_msg->scan_config = buf->set_dual_mac.scan_config; req_msg->fw_mode_config = buf->set_dual_mac.fw_mode_config; /* Other parameters are not needed for WMA */ @@ -676,7 +672,6 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) goto end; } - qdf_mem_set((void *)sme_start_bss_req, size, 0); qdf_mem_copy(sme_start_bss_req, msg_buf, sizeof(tSirSmeStartBssReq)); if (!lim_is_sme_start_bss_req_valid(mac_ctx, @@ -880,9 +875,6 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) ret_code = eSIR_SME_RESOURCES_UNAVAILABLE; goto free; } - qdf_mem_set(session->parsedAssocReq, - (session->dph.dphHashTable.size * - sizeof(tpSirAssocReq)), 0); } if (!sme_start_bss_req->channelId && @@ -975,8 +967,6 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) goto free; } - qdf_mem_set((void *)mlm_start_req, sizeof(tLimMlmStartReq), 0); - /* Copy SSID to the MLM start structure */ qdf_mem_copy((uint8_t *) &mlm_start_req->ssId, (uint8_t *) &sme_start_bss_req->ssId, @@ -1288,8 +1278,6 @@ static QDF_STATUS lim_send_hal_start_scan_offload_req(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_set((uint8_t *) pScanOffloadReq, len, 0); - msg.type = WMA_START_SCAN_OFFLOAD_REQ; msg.bodyptr = pScanOffloadReq; msg.bodyval = 0; @@ -1584,7 +1572,6 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) ret_code = eSIR_SME_RESOURCES_UNAVAILABLE; goto end; } - (void)qdf_mem_set((void *)sme_join_req, n_size, 0); (void)qdf_mem_copy((void *)sme_join_req, (void *)msg_buf, n_size); @@ -1872,7 +1859,6 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) ret_code = eSIR_SME_RESOURCES_UNAVAILABLE; goto end; } - (void)qdf_mem_set((void *)mlm_join_req, val, 0); /* PE SessionId is stored as a part of JoinReq */ mlm_join_req->sessionId = session->peSessionId; @@ -2097,7 +2083,6 @@ static void __lim_process_sme_reassoc_req(tpAniSirGlobal mac_ctx, ret_code = eSIR_SME_RESOURCES_UNAVAILABLE; goto end; } - (void)qdf_mem_set((void *)reassoc_req, size, 0); (void)qdf_mem_copy((void *)reassoc_req, (void *)msg_buf, size); if (!lim_is_sme_join_req_valid(mac_ctx, @@ -4180,9 +4165,12 @@ static void __lim_process_roam_scan_offload_req(tpAniSirGlobal mac_ctx, if (local_ie_len && !lim_update_ext_cap_ie(mac_ctx, req_buffer->assoc_ie.addIEdata, local_ie_buf, &local_ie_len)) { - req_buffer->assoc_ie.length = local_ie_len; - qdf_mem_copy(req_buffer->assoc_ie.addIEdata, local_ie_buf, - local_ie_len); + if (local_ie_len <= + QDF_ARRAY_SIZE(req_buffer->assoc_ie.addIEdata)) { + req_buffer->assoc_ie.length = local_ie_len; + qdf_mem_copy(req_buffer->assoc_ie.addIEdata, + local_ie_buf, local_ie_len); + } } qdf_mem_free(local_ie_buf); @@ -4648,11 +4636,12 @@ skip_match: } if (match) { qdf_mutex_acquire(&mac_ctx->lim.lim_frame_register_lock); - qdf_list_remove_node( + if (QDF_STATUS_SUCCESS == + qdf_list_remove_node( &mac_ctx->lim.gLimMgmtFrameRegistratinQueue, - (qdf_list_node_t *)lim_mgmt_regn); + (qdf_list_node_t *)lim_mgmt_regn)) + qdf_mem_free(lim_mgmt_regn); qdf_mutex_release(&mac_ctx->lim.lim_frame_register_lock); - qdf_mem_free(lim_mgmt_regn); } if (sme_req->registerFrame) { @@ -4660,9 +4649,6 @@ skip_match: qdf_mem_malloc(sizeof(struct mgmt_frm_reg_info) + sme_req->matchLen); if (lim_mgmt_regn != NULL) { - qdf_mem_set((void *)lim_mgmt_regn, - sizeof(struct mgmt_frm_reg_info) + - sme_req->matchLen, 0); lim_mgmt_regn->frameType = sme_req->frameType; lim_mgmt_regn->matchLen = sme_req->matchLen; lim_mgmt_regn->sessionId = sme_req->sessionId; diff --git a/core/mac/src/pe/lim/lim_process_tdls.c b/core/mac/src/pe/lim/lim_process_tdls.c index 7b2e5cae97a3..6c16ae4b4dbb 100644 --- a/core/mac/src/pe/lim/lim_process_tdls.c +++ b/core/mac/src/pe/lim/lim_process_tdls.c @@ -3316,9 +3316,6 @@ tSirRetStatus lim_process_sme_tdls_link_establish_req(tpAniSirGlobal mac_ctx, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) tdls_req_params, - sizeof(tTdlsLinkEstablishParams), 0); - tdls_req_params->staIdx = stads->staIndex; tdls_req_params->isResponder = tdls_req->isResponder; tdls_req_params->uapsdQueues = tdls_req->uapsdQueues; diff --git a/core/mac/src/pe/lim/lim_prop_exts_utils.c b/core/mac/src/pe/lim/lim_prop_exts_utils.c index c263b366d36e..629f32b8a002 100644 --- a/core/mac/src/pe/lim/lim_prop_exts_utils.c +++ b/core/mac/src/pe/lim/lim_prop_exts_utils.c @@ -127,7 +127,6 @@ lim_extract_ap_capability(tpAniSirGlobal mac_ctx, uint8_t *p_ie, return; } - qdf_mem_set((uint8_t *) beacon_struct, sizeof(tSirProbeRespBeacon), 0); *qos_cap = 0; *prop_cap = 0; *uapsd = 0; diff --git a/core/mac/src/pe/lim/lim_scan_result_utils.c b/core/mac/src/pe/lim/lim_scan_result_utils.c index 58b43db3e6b6..ea2bb8d1d253 100644 --- a/core/mac/src/pe/lim/lim_scan_result_utils.c +++ b/core/mac/src/pe/lim/lim_scan_result_utils.c @@ -389,8 +389,6 @@ lim_check_and_add_bss_description(tpAniSirGlobal mac_ctx, return; } - qdf_mem_zero(bssdescr, frame_len); - /* In scan state, store scan result. */ lim_collect_bss_description(mac_ctx, bssdescr, bpr, rx_packet_info, scanning); diff --git a/core/mac/src/pe/lim/lim_security_utils.c b/core/mac/src/pe/lim/lim_security_utils.c index a76eea60c45c..c5938c2b923d 100644 --- a/core/mac/src/pe/lim/lim_security_utils.c +++ b/core/mac/src/pe/lim/lim_security_utils.c @@ -842,9 +842,7 @@ void lim_send_set_bss_key_req(tpAniSirGlobal pMac, /* Respond to SME with error code */ mlmSetKeysCnf.resultCode = eSIR_SME_RESOURCES_UNAVAILABLE; goto end; - } else - qdf_mem_set((void *)pSetBssKeyParams, - sizeof(tSetBssKeyParams), 0); + } /* Update the WMA_SET_BSSKEY_REQ parameters */ pSetBssKeyParams->bssIdx = psessionEntry->bssIdx; @@ -943,9 +941,7 @@ void lim_send_set_sta_key_req(tpAniSirGlobal pMac, lim_log(pMac, LOGP, FL("Unable to allocate memory during SET_BSSKEY")); return; - } else - qdf_mem_set((void *)pSetStaKeyParams, sizeof(tSetStaKeyParams), - 0); + } /* Update the WMA_SET_STAKEY_REQ parameters */ pSetStaKeyParams->staIdx = staIdx; diff --git a/core/mac/src/pe/lim/lim_send_frames_host_roam.c b/core/mac/src/pe/lim/lim_send_frames_host_roam.c index 50c86a6ff657..2039955c7e17 100644 --- a/core/mac/src/pe/lim/lim_send_frames_host_roam.c +++ b/core/mac/src/pe/lim/lim_send_frames_host_roam.c @@ -487,7 +487,6 @@ void lim_send_retry_reassoc_req_frame(tpAniSirGlobal pMac, pTmpMlmReassocReq = qdf_mem_malloc(sizeof(tLimMlmReassocReq)); if (NULL == pTmpMlmReassocReq) goto end; - qdf_mem_set(pTmpMlmReassocReq, sizeof(tLimMlmReassocReq), 0); qdf_mem_copy(pTmpMlmReassocReq, pMlmReassocReq, sizeof(tLimMlmReassocReq)); } diff --git a/core/mac/src/pe/lim/lim_send_management_frames.c b/core/mac/src/pe/lim/lim_send_management_frames.c index 94248e13a9c4..2cd0f854db31 100644 --- a/core/mac/src/pe/lim/lim_send_management_frames.c +++ b/core/mac/src/pe/lim/lim_send_management_frames.c @@ -579,8 +579,6 @@ lim_send_probe_rsp_mgmt_frame(tpAniSirGlobal mac_ctx, return; } - qdf_mem_zero(&extracted_ext_cap, sizeof(extracted_ext_cap)); - /* * Fill out 'frm', after which we'll just hand the struct off to * 'dot11f_pack_probe_response'. @@ -1659,8 +1657,6 @@ lim_send_assoc_req_mgmt_frame(tpAniSirGlobal mac_ctx, return; } - qdf_mem_set((uint8_t *) frm, sizeof(tDot11fAssocRequest), 0); - if (add_ie_len && pe_session->is_ext_caps_present) { qdf_mem_set((uint8_t *) &extr_ext_cap, sizeof(tDot11fIEExtCap), 0); @@ -4023,7 +4019,6 @@ lim_send_radio_measure_report_action_frame(tpAniSirGlobal pMac, qdf_mem_free(frm); return eSIR_FAILURE; } - qdf_mem_set((uint8_t *) frm, sizeof(*frm), 0); frm->Category.category = SIR_MAC_ACTION_RRM; frm->Action.action = SIR_MAC_RRM_RADIO_MEASURE_RPT; diff --git a/core/mac/src/pe/lim/lim_send_messages.c b/core/mac/src/pe/lim/lim_send_messages.c index 8233822f0284..3222cf08c613 100644 --- a/core/mac/src/pe/lim/lim_send_messages.c +++ b/core/mac/src/pe/lim/lim_send_messages.c @@ -103,7 +103,6 @@ tSirRetStatus lim_send_cf_params(tpAniSirGlobal pMac, uint8_t bssIdx, retCode = eSIR_MEM_ALLOC_FAILED; goto returnFailure; } - qdf_mem_set((uint8_t *) pCFParams, sizeof(tUpdateCFParams), 0); pCFParams->cfpCount = cfpCount; pCFParams->cfpPeriod = cfpPeriod; pCFParams->bssIdx = bssIdx; @@ -227,7 +226,6 @@ tSirRetStatus lim_send_switch_chnl_params(tpAniSirGlobal pMac, "Unable to allocate memory for Switch Ch Params")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pChnlParams, sizeof(tSwitchChannelParams), 0); pChnlParams->channelNumber = chnlNumber; pChnlParams->ch_center_freq_seg0 = ch_center_freq_seg0; pChnlParams->ch_center_freq_seg1 = ch_center_freq_seg1; @@ -491,7 +489,6 @@ tSirRetStatus lim_set_link_state(tpAniSirGlobal pMac, tSirLinkState state, retCode = eSIR_MEM_ALLOC_FAILED; return retCode; } - qdf_mem_set((uint8_t *) pLinkStateParams, sizeof(tLinkStateParams), 0); pLinkStateParams->state = state; pLinkStateParams->callback = callback; pLinkStateParams->callbackArg = callbackArg; @@ -534,7 +531,6 @@ extern tSirRetStatus lim_set_link_state_ft(tpAniSirGlobal pMac, tSirLinkState retCode = eSIR_MEM_ALLOC_FAILED; return retCode; } - qdf_mem_set((uint8_t *) pLinkStateParams, sizeof(tLinkStateParams), 0); pLinkStateParams->state = state; /* Copy Mac address */ sir_copy_mac_addr(pLinkStateParams->bssid, bssId); @@ -593,7 +589,6 @@ tSirRetStatus lim_send_beacon_filter_info(tpAniSirGlobal pMac, retCode = eSIR_MEM_ALLOC_FAILED; return retCode; } - qdf_mem_set((uint8_t *) pBeaconFilterMsg, msgSize, 0); /* Fill in capability Info and mask */ /* Don't send this message if no active Infra session is found. */ pBeaconFilterMsg->capabilityInfo = psessionEntry->limCurrentBssCaps; diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index 6b524cfbb080..4eae32115abf 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c @@ -462,7 +462,6 @@ lim_send_sme_join_reassoc_rsp(tpAniSirGlobal mac_ctx, uint16_t msg_type, return; } - qdf_mem_set((uint8_t *) sme_join_rsp, rsp_len, 0); sme_join_rsp->beaconLength = 0; sme_join_rsp->assocReqLength = 0; sme_join_rsp->assocRspLength = 0; @@ -480,7 +479,6 @@ lim_send_sme_join_reassoc_rsp(tpAniSirGlobal mac_ctx, uint16_t msg_type, FL("MemAlloc fail - JOIN/REASSOC_RSP")); return; } - qdf_mem_set((uint8_t *) sme_join_rsp, rsp_len, 0); if (result_code == eSIR_SME_SUCCESS) { sta_ds = dph_get_hash_entry(mac_ctx, DPH_STA_HASH_INDEX_PEER, @@ -592,8 +590,6 @@ lim_send_sme_start_bss_rsp(tpAniSirGlobal pMac, ("call to AllocateMemory failed for eWNI_SME_START_BSS_RSP")); return; } - qdf_mem_set((uint8_t *) pSirSmeRsp, size, 0); - } else { /* subtract size of beaconLength + Mac Hdr + Fixed Fields before SSID */ ieOffset = sizeof(tAniBeaconStruct) + SIR_MAC_B_PR_SSID_OFFSET; @@ -611,7 +607,6 @@ lim_send_sme_start_bss_rsp(tpAniSirGlobal pMac, return; } - qdf_mem_set((uint8_t *) pSirSmeRsp, size, 0); size = sizeof(tSirSmeStartBssRsp); if (resultCode == eSIR_SME_SUCCESS) { @@ -769,7 +764,6 @@ lim_post_sme_scan_rsp_message(tpAniSirGlobal pMac, FL("AllocateMemory failed for eWNI_SME_SCAN_RSP")); return; } - qdf_mem_set((void *)pSirSmeScanRsp, sizeof(tSirSmeScanRsp), 0); pSirSmeScanRsp->messageType = eWNI_SME_SCAN_RSP; pSirSmeScanRsp->statusCode = resultCode; @@ -1697,7 +1691,6 @@ lim_send_sme_addts_rsp(tpAniSirGlobal pMac, uint8_t rspReqd, uint32_t status, return; } - qdf_mem_set((uint8_t *) rsp, sizeof(*rsp), 0); rsp->messageType = eWNI_SME_ADDTS_RSP; rsp->rc = status; rsp->rsp.status = (enum eSirMacStatusCodes)status; @@ -1746,7 +1739,6 @@ lim_send_sme_delts_rsp(tpAniSirGlobal pMac, tpSirDeltsReq delts, uint32_t status lim_log(pMac, LOGP, FL("AllocateMemory failed for DELTS_RSP")); return; } - qdf_mem_set((uint8_t *) rsp, sizeof(*rsp), 0); if (psessionEntry != NULL) { @@ -1797,7 +1789,6 @@ lim_send_sme_delts_ind(tpAniSirGlobal pMac, tpSirDeltsReqInfo delts, uint16_t ai lim_log(pMac, LOGP, FL("AllocateMemory failed for DELTS_IND")); return; } - qdf_mem_set((uint8_t *) rsp, sizeof(*rsp), 0); rsp->messageType = eWNI_SME_DELTS_IND; rsp->rc = eSIR_SUCCESS; @@ -1949,9 +1940,6 @@ lim_send_sme_ibss_peer_ind(tpAniSirGlobal pMac, return; } - qdf_mem_set((void *)pNewPeerInd, (sizeof(tSmeIbssPeerInd) + beaconLen), - 0); - qdf_mem_copy((uint8_t *) pNewPeerInd->peer_addr.bytes, peerMacAddr, QDF_MAC_ADDR_SIZE); pNewPeerInd->staId = staIndex; @@ -1974,6 +1962,76 @@ lim_send_sme_ibss_peer_ind(tpAniSirGlobal pMac, } +/** + * lim_process_csa_wbw_ie() - Process CSA Wide BW IE + * @mac_ctx: pointer to global adapter context + * @csa_params: pointer to CSA parameters + * @chnl_switch_info:pointer to channel switch parameters + * @session_entry: session pointer + * + * Return: None + */ +static void lim_process_csa_wbw_ie(tpAniSirGlobal mac_ctx, + struct csa_offload_params *csa_params, + tLimWiderBWChannelSwitchInfo *chnl_switch_info, + tpPESession session_entry) +{ + struct ch_params_s ch_params = {0}; + uint8_t ap_new_ch_width; + bool new_ch_width_dfn = false; + uint8_t center_freq_diff; + + ap_new_ch_width = csa_params->new_ch_width + 1; + if ((ap_new_ch_width == CH_WIDTH_80MHZ) && + csa_params->new_ch_freq_seg2) { + new_ch_width_dfn = true; + if (csa_params->new_ch_freq_seg2 > + csa_params->new_ch_freq_seg1) + center_freq_diff = csa_params->new_ch_freq_seg2 - + csa_params->new_ch_freq_seg1; + else + center_freq_diff = csa_params->new_ch_freq_seg1 - + csa_params->new_ch_freq_seg2; + if (center_freq_diff == CENTER_FREQ_DIFF_160MHz) + ap_new_ch_width = CH_WIDTH_160MHZ; + else if (center_freq_diff > CENTER_FREQ_DIFF_80P80MHz) + ap_new_ch_width = CH_WIDTH_80P80MHZ; + else + ap_new_ch_width = CH_WIDTH_80MHZ; + } + session_entry->gLimChannelSwitch.state = + eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; + if ((ap_new_ch_width == CH_WIDTH_160MHZ) && + !new_ch_width_dfn) { + ch_params.ch_width = CH_WIDTH_160MHZ; + cds_set_channel_params(csa_params->channel, 0, + &ch_params); + ap_new_ch_width = ch_params.ch_width; + csa_params->new_ch_freq_seg1 = ch_params.center_freq_seg0; + csa_params->new_ch_freq_seg2 = ch_params.center_freq_seg1; + } + chnl_switch_info->newChanWidth = ap_new_ch_width; + chnl_switch_info->newCenterChanFreq0 = csa_params->new_ch_freq_seg1; + chnl_switch_info->newCenterChanFreq1 = csa_params->new_ch_freq_seg2; + + if (session_entry->ch_width == ap_new_ch_width) + goto prnt_log; + + if (session_entry->ch_width == CH_WIDTH_80MHZ) { + chnl_switch_info->newChanWidth = CH_WIDTH_80MHZ; + chnl_switch_info->newCenterChanFreq1 = 0; + } else { + session_entry->ch_width = ap_new_ch_width; + chnl_switch_info->newChanWidth = ap_new_ch_width; + } +prnt_log: + lim_log(mac_ctx, LOG1, + FL("new channel: %d new_ch_width:%d seg0:%d seg1:%d"), + csa_params->channel, + chnl_switch_info->newChanWidth, + chnl_switch_info->newCenterChanFreq0, + chnl_switch_info->newCenterChanFreq1); +} /** * lim_handle_csa_offload_msg() - Handle CSA offload message * @mac_ctx: pointer to global adapter context @@ -2023,182 +2081,181 @@ void lim_handle_csa_offload_msg(tpAniSirGlobal mac_ctx, tpSirMsgQ msg) goto err; } - if (LIM_IS_STA_ROLE(session_entry)) { - /* - * on receiving channel switch announcement from AP, delete all - * TDLS peers before leaving BSS and proceed for channel switch - */ - lim_delete_tdls_peers(mac_ctx, session_entry); + if (!LIM_IS_STA_ROLE(session_entry)) { + lim_log(mac_ctx, LOG1, FL("Invalid role to handle CSA")); + goto err; + } - lim_ch_switch = &session_entry->gLimChannelSwitch; - session_entry->gLimChannelSwitch.switchMode = - csa_params->switch_mode; - /* timer already started by firmware, switch immediately */ - session_entry->gLimChannelSwitch.switchCount = 0; - session_entry->gLimChannelSwitch.primaryChannel = - csa_params->channel; - session_entry->gLimChannelSwitch.state = - eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; - session_entry->gLimChannelSwitch.ch_width = CH_WIDTH_20MHZ; - lim_ch_switch->sec_ch_offset = - session_entry->htSecondaryChannelOffset; - session_entry->gLimChannelSwitch.ch_center_freq_seg0 = 0; - session_entry->gLimChannelSwitch.ch_center_freq_seg1 = 0; - chnl_switch_info = - &session_entry->gLimWiderBWChannelSwitch; + /* + * on receiving channel switch announcement from AP, delete all + * TDLS peers before leaving BSS and proceed for channel switch + */ + lim_delete_tdls_peers(mac_ctx, session_entry); - lim_log(mac_ctx, LOG1, - FL("vht:%d ht:%d flag:%x chan:%d seg1:%d seg2:%d width:%d country:%s class:%d"), + lim_ch_switch = &session_entry->gLimChannelSwitch; + session_entry->gLimChannelSwitch.switchMode = + csa_params->switch_mode; + /* timer already started by firmware, switch immediately */ + session_entry->gLimChannelSwitch.switchCount = 0; + session_entry->gLimChannelSwitch.primaryChannel = + csa_params->channel; + session_entry->gLimChannelSwitch.state = + eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; + session_entry->gLimChannelSwitch.ch_width = CH_WIDTH_20MHZ; + lim_ch_switch->sec_ch_offset = + session_entry->htSecondaryChannelOffset; + session_entry->gLimChannelSwitch.ch_center_freq_seg0 = 0; + session_entry->gLimChannelSwitch.ch_center_freq_seg1 = 0; + chnl_switch_info = + &session_entry->gLimWiderBWChannelSwitch; + + lim_log(mac_ctx, LOG1, + FL("vht:%d ht:%d flag:%x chan:%d"), session_entry->vhtCapability, session_entry->htSupportedChannelWidthSet, csa_params->ies_present_flag, - csa_params->channel, csa_params->new_ch_freq_seg1, + csa_params->channel); + lim_log(mac_ctx, LOG1, + FL("seg1:%d seg2:%d width:%d country:%s class:%d"), + csa_params->new_ch_freq_seg1, csa_params->new_ch_freq_seg2, csa_params->new_ch_width, mac_ctx->scan.countryCodeCurrent, csa_params->new_op_class); - if (session_entry->vhtCapability && - session_entry->htSupportedChannelWidthSet) { - if (csa_params->ies_present_flag & lim_wbw_ie_present) { + if (session_entry->vhtCapability && + session_entry->htSupportedChannelWidthSet) { + if (csa_params->ies_present_flag & lim_wbw_ie_present) { + lim_process_csa_wbw_ie(mac_ctx, csa_params, + chnl_switch_info, session_entry); + lim_ch_switch->sec_ch_offset = + csa_params->sec_chan_offset; + } else if (csa_params->ies_present_flag + & lim_xcsa_ie_present) { + chan_space = + cds_reg_dmn_get_chanwidth_from_opclass( + mac_ctx->scan.countryCodeCurrent, + csa_params->channel, + csa_params->new_op_class); + session_entry->gLimChannelSwitch.state = + eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; + + if (chan_space == 80) { chnl_switch_info->newChanWidth = - csa_params->new_ch_width; - chnl_switch_info->newCenterChanFreq0 = - csa_params->new_ch_freq_seg1; - chnl_switch_info->newCenterChanFreq1 = - csa_params->new_ch_freq_seg2; - session_entry->gLimChannelSwitch.state = - eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; - session_entry->gLimChannelSwitch.ch_width = - csa_params->new_ch_width + 1; - } else if (csa_params->ies_present_flag - & lim_xcsa_ie_present) { - chan_space = - cds_reg_dmn_get_chanwidth_from_opclass( - mac_ctx->scan.countryCodeCurrent, - csa_params->channel, - csa_params->new_op_class); - session_entry->gLimChannelSwitch.state = - eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; - - if (chan_space == 80) { - chnl_switch_info->newChanWidth = - CH_WIDTH_80MHZ; - } else if (chan_space == 40) { - chnl_switch_info->newChanWidth = - CH_WIDTH_40MHZ; - } else { - chnl_switch_info->newChanWidth = - CH_WIDTH_20MHZ; - lim_ch_switch->state = - eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; - } - - ch_params.ch_width = - chnl_switch_info->newChanWidth; - cds_set_channel_params(csa_params->channel, - 0, &ch_params); - chnl_switch_info->newCenterChanFreq0 = - ch_params.center_freq_seg0; - /* - * This is not applicable for 20/40/80 MHz. - * Only used when we support 80+80 MHz operation. - * In case of 80+80 MHz, this parameter indicates - * center channel frequency index of 80 MHz - * channel offrequency segment 1. - */ - chnl_switch_info->newCenterChanFreq1 = - ch_params.center_freq_seg1; - lim_ch_switch->sec_ch_offset = - ch_params.sec_ch_offset; - - } - session_entry->gLimChannelSwitch.ch_center_freq_seg0 = - chnl_switch_info->newCenterChanFreq0; - session_entry->gLimChannelSwitch.ch_center_freq_seg1 = - chnl_switch_info->newCenterChanFreq1; - session_entry->gLimChannelSwitch.ch_width = - chnl_switch_info->newChanWidth; - - } else if (session_entry->htSupportedChannelWidthSet) { - if (csa_params->ies_present_flag - & lim_xcsa_ie_present) { - chan_space = - cds_reg_dmn_get_chanwidth_from_opclass( - mac_ctx->scan.countryCodeCurrent, - csa_params->channel, - csa_params->new_op_class); - lim_ch_switch->state = - eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; - if (chan_space == 40) { - lim_ch_switch->ch_width = - CH_WIDTH_40MHZ; - chnl_switch_info->newChanWidth = - CH_WIDTH_40MHZ; - ch_params.ch_width = - chnl_switch_info->newChanWidth; - cds_set_channel_params( - csa_params->channel, - 0, &ch_params); - lim_ch_switch->ch_center_freq_seg0 = - ch_params.center_freq_seg0; - lim_ch_switch->sec_ch_offset = - ch_params.sec_ch_offset; - } else { - lim_ch_switch->ch_width = - CH_WIDTH_20MHZ; - chnl_switch_info->newChanWidth = - CH_WIDTH_40MHZ; - lim_ch_switch->state = - eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; - lim_ch_switch->sec_ch_offset = - PHY_SINGLE_CHANNEL_CENTERED; - } + CH_WIDTH_80MHZ; + } else if (chan_space == 40) { + chnl_switch_info->newChanWidth = + CH_WIDTH_40MHZ; } else { + chnl_switch_info->newChanWidth = + CH_WIDTH_20MHZ; + lim_ch_switch->state = + eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; + } + + ch_params.ch_width = + chnl_switch_info->newChanWidth; + cds_set_channel_params(csa_params->channel, + 0, &ch_params); + chnl_switch_info->newCenterChanFreq0 = + ch_params.center_freq_seg0; + /* + * This is not applicable for 20/40/80 MHz. + * Only used when we support 80+80 MHz operation. + * In case of 80+80 MHz, this parameter indicates + * center channel frequency index of 80 MHz + * channel offrequency segment 1. + */ + chnl_switch_info->newCenterChanFreq1 = + ch_params.center_freq_seg1; + lim_ch_switch->sec_ch_offset = + ch_params.sec_ch_offset; + + } + session_entry->gLimChannelSwitch.ch_center_freq_seg0 = + chnl_switch_info->newCenterChanFreq0; + session_entry->gLimChannelSwitch.ch_center_freq_seg1 = + chnl_switch_info->newCenterChanFreq1; + session_entry->gLimChannelSwitch.ch_width = + chnl_switch_info->newChanWidth; + + } else if (session_entry->htSupportedChannelWidthSet) { + if (csa_params->ies_present_flag + & lim_xcsa_ie_present) { + chan_space = + cds_reg_dmn_get_chanwidth_from_opclass( + mac_ctx->scan.countryCodeCurrent, + csa_params->channel, + csa_params->new_op_class); + lim_ch_switch->state = + eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; + if (chan_space == 40) { lim_ch_switch->ch_width = CH_WIDTH_40MHZ; - lim_ch_switch->state = - eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; - ch_params.ch_width = CH_WIDTH_40MHZ; - cds_set_channel_params(csa_params->channel, + chnl_switch_info->newChanWidth = + CH_WIDTH_40MHZ; + ch_params.ch_width = + chnl_switch_info->newChanWidth; + cds_set_channel_params( + csa_params->channel, 0, &ch_params); lim_ch_switch->ch_center_freq_seg0 = ch_params.center_freq_seg0; lim_ch_switch->sec_ch_offset = ch_params.sec_ch_offset; + } else { + lim_ch_switch->ch_width = + CH_WIDTH_20MHZ; + chnl_switch_info->newChanWidth = + CH_WIDTH_40MHZ; + lim_ch_switch->state = + eLIM_CHANNEL_SWITCH_PRIMARY_ONLY; + lim_ch_switch->sec_ch_offset = + PHY_SINGLE_CHANNEL_CENTERED; } - + } else { + lim_ch_switch->ch_width = + CH_WIDTH_40MHZ; + lim_ch_switch->state = + eLIM_CHANNEL_SWITCH_PRIMARY_AND_SECONDARY; + ch_params.ch_width = CH_WIDTH_40MHZ; + cds_set_channel_params(csa_params->channel, + 0, &ch_params); + lim_ch_switch->ch_center_freq_seg0 = + ch_params.center_freq_seg0; + lim_ch_switch->sec_ch_offset = + ch_params.sec_ch_offset; } - lim_log(mac_ctx, LOG1, FL("new ch width = %d space:%d"), + + } + lim_log(mac_ctx, LOG1, FL("new ch width = %d space:%d"), session_entry->gLimChannelSwitch.ch_width, chan_space); - lim_prepare_for11h_channel_switch(mac_ctx, session_entry); - csa_offload_ind = qdf_mem_malloc(sizeof(tSmeCsaOffloadInd)); - if (NULL == csa_offload_ind) { - lim_log(mac_ctx, LOGE, + lim_prepare_for11h_channel_switch(mac_ctx, session_entry); + csa_offload_ind = qdf_mem_malloc(sizeof(tSmeCsaOffloadInd)); + if (NULL == csa_offload_ind) { + lim_log(mac_ctx, LOGE, FL("memalloc fail eWNI_SME_CSA_OFFLOAD_EVENT")); - goto err; - } + goto err; + } - qdf_mem_set(csa_offload_ind, sizeof(tSmeCsaOffloadInd), 0); - csa_offload_ind->mesgType = eWNI_SME_CSA_OFFLOAD_EVENT; - csa_offload_ind->mesgLen = sizeof(tSmeCsaOffloadInd); - qdf_mem_copy(csa_offload_ind->bssid.bytes, session_entry->bssId, - QDF_MAC_ADDR_SIZE); - mmh_msg.type = eWNI_SME_CSA_OFFLOAD_EVENT; - mmh_msg.bodyptr = csa_offload_ind; - mmh_msg.bodyval = 0; - lim_log(mac_ctx, LOG1, + csa_offload_ind->mesgType = eWNI_SME_CSA_OFFLOAD_EVENT; + csa_offload_ind->mesgLen = sizeof(tSmeCsaOffloadInd); + qdf_mem_copy(csa_offload_ind->bssid.bytes, session_entry->bssId, + QDF_MAC_ADDR_SIZE); + mmh_msg.type = eWNI_SME_CSA_OFFLOAD_EVENT; + mmh_msg.bodyptr = csa_offload_ind; + mmh_msg.bodyval = 0; + lim_log(mac_ctx, LOG1, FL("Sending eWNI_SME_CSA_OFFLOAD_EVENT to SME.")); - MTRACE(mac_trace_msg_tx + MTRACE(mac_trace_msg_tx (mac_ctx, session_entry->peSessionId, mmh_msg.type)); #ifdef FEATURE_WLAN_DIAG_SUPPORT - lim_diag_event_report(mac_ctx, + lim_diag_event_report(mac_ctx, WLAN_PE_DIAG_SWITCH_CHL_IND_EVENT, session_entry, eSIR_SUCCESS, eSIR_SUCCESS); #endif - lim_sys_process_mmh_msg_api(mac_ctx, &mmh_msg, ePROT); - } + lim_sys_process_mmh_msg_api(mac_ctx, &mmh_msg, ePROT); err: qdf_mem_free(csa_params); @@ -2275,7 +2332,6 @@ void lim_send_sme_max_assoc_exceeded_ntf(tpAniSirGlobal pMac, tSirMacAddr peerMa PELOGE(lim_log(pMac, LOGE, FL("Failed to allocate memory"));) return; } - qdf_mem_set((void *)pSmeMaxAssocInd, sizeof(tSmeMaxAssocInd), 0); qdf_mem_copy((uint8_t *) pSmeMaxAssocInd->peer_mac.bytes, (uint8_t *) peerMacAddr, QDF_MAC_ADDR_SIZE); pSmeMaxAssocInd->mesgType = eWNI_SME_MAX_ASSOC_EXCEEDED; @@ -2378,9 +2434,6 @@ lim_send_sme_ap_channel_switch_resp(tpAniSirGlobal pMac, return; } - qdf_mem_set((void *)pSmeSwithChnlParams, - sizeof(tSwitchChannelParams), 0); - qdf_mem_copy(pSmeSwithChnlParams, pChnlParams, sizeof(tSwitchChannelParams)); @@ -2501,7 +2554,6 @@ lim_process_beacon_tx_success_ind(tpAniSirGlobal pMac, uint16_t msgType, void *e return; } - qdf_mem_set((void *)pChanSwTxResponse, length, 0); pChanSwTxResponse->sessionId = psessionEntry->smeSessionId; pChanSwTxResponse->chanSwIeTxStatus = @@ -2526,8 +2578,6 @@ lim_process_beacon_tx_success_ind(tpAniSirGlobal pMac, uint16_t msgType, void *e ("AllocateMemory failed for beacon_tx_comp_rsp_ptr")); return; } - qdf_mem_set((void *)beacon_tx_comp_rsp_ptr, - sizeof(*beacon_tx_comp_rsp_ptr), 0); beacon_tx_comp_rsp_ptr->session_id = psessionEntry->smeSessionId; beacon_tx_comp_rsp_ptr->tx_status = QDF_STATUS_SUCCESS; diff --git a/core/mac/src/pe/lim/lim_session.c b/core/mac/src/pe/lim/lim_session.c index 7498c075a6dd..1bd3a4025af7 100644 --- a/core/mac/src/pe/lim/lim_session.c +++ b/core/mac/src/pe/lim/lim_session.c @@ -314,9 +314,6 @@ pe_create_session(tpAniSirGlobal pMac, uint8_t *bssid, uint8_t *sessionId, session_ptr->dph.dphHashTable.pDphNodeArray = NULL; return NULL; } - qdf_mem_set(session_ptr->gpLimPeerIdxpool, - sizeof(*session_ptr->gpLimPeerIdxpool) * (numSta + 1), - 0); session_ptr->freePeerIdxHead = 0; session_ptr->freePeerIdxTail = 0; session_ptr->gLimNumOfCurrentSTAs = 0; diff --git a/core/mac/src/pe/lim/lim_timer_utils.c b/core/mac/src/pe/lim/lim_timer_utils.c index bf4ad5968be6..cb244dd65d96 100644 --- a/core/mac/src/pe/lim/lim_timer_utils.c +++ b/core/mac/src/pe/lim/lim_timer_utils.c @@ -310,8 +310,6 @@ uint32_t lim_create_timers(tpAniSirGlobal pMac) lim_log(pMac, LOGP, FL("AllocateMemory failed!")); goto err_timer; } - qdf_mem_zero(pMac->lim.gLimPreAuthTimerTable.pTable, - cfgValue * sizeof(tLimPreAuthNode *)); for (i = 0; i < cfgValue; i++) { pMac->lim.gLimPreAuthTimerTable.pTable[i] = diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index f76cf455e1fc..0518ae8fe92d 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/core/mac/src/pe/lim/lim_utils.c @@ -4961,8 +4961,6 @@ void lim_process_del_ts_ind(tpAniSirGlobal pMac, tpSirMsgQ limMsg) goto error1; } - qdf_mem_set((uint8_t *) pDelTsReq, sizeof(tSirDeltsReq), 0); - if (pSta->wmeEnabled) qdf_mem_copy(&(pDelTsReq->req.tspec), &(pTspecInfo->tspec), sizeof(tSirMacTspecIE)); @@ -4993,7 +4991,6 @@ void lim_process_del_ts_ind(tpAniSirGlobal pMac, tpSirMsgQ limMsg) PELOGE(lim_log(pMac, LOGE, FL("AllocateMemory() failed"));) goto error3; } - qdf_mem_set((uint8_t *) pDelTsReqInfo, sizeof(tSirDeltsReqInfo), 0); if (pSta->wmeEnabled) qdf_mem_copy(&(pDelTsReqInfo->tspec), &(pTspecInfo->tspec), @@ -5248,7 +5245,6 @@ void lim_frame_transmission_control(tpAniSirGlobal pMac, tLimQuietTxMode type, return; } - qdf_mem_set((void *)pTxCtrlMsg, (sizeof(*pTxCtrlMsg) + nBytes), 0); status = __lim_fill_tx_control_params(pMac, pTxCtrlMsg, type, mode); if (status != QDF_STATUS_SUCCESS) { qdf_mem_free(pTxCtrlMsg); diff --git a/core/mac/src/pe/lim/lim_utils.h b/core/mac/src/pe/lim/lim_utils.h index 80a37c3f8605..5ad6bd0921e4 100644 --- a/core/mac/src/pe/lim/lim_utils.h +++ b/core/mac/src/pe/lim/lim_utils.h @@ -64,6 +64,9 @@ typedef enum { #define VHT_MCS_3x3_MASK 0x30 #define VHT_MCS_2x2_MASK 0x0C +#define CENTER_FREQ_DIFF_160MHz 8 +#define CENTER_FREQ_DIFF_80P80MHz 16 + #define IS_VHT_NSS_1x1(__mcs_map) ((__mcs_map & 0xFFFC) == 0xFFFC) #ifdef WLAN_FEATURE_11W diff --git a/core/mac/src/pe/nan/nan_datapath.c b/core/mac/src/pe/nan/nan_datapath.c index 3bed714cdf2c..62ec69af98ec 100644 --- a/core/mac/src/pe/nan/nan_datapath.c +++ b/core/mac/src/pe/nan/nan_datapath.c @@ -286,7 +286,6 @@ static void lim_ndp_delete_peers(tpAniSirGlobal mac_ctx, return; } - qdf_mem_zero(deleted_peers, num_peers * sizeof(*deleted_peers)); for (i = 0; i < num_peers; i++) { lim_log(mac_ctx, LOG1, FL("ndp_map[%d]: MAC: " MAC_ADDRESS_STR " num_active %d"), diff --git a/core/mac/src/pe/rrm/rrm_api.c b/core/mac/src/pe/rrm/rrm_api.c index 51a2712141e9..c1a282e78946 100644 --- a/core/mac/src/pe/rrm/rrm_api.c +++ b/core/mac/src/pe/rrm/rrm_api.c @@ -386,7 +386,6 @@ rrm_process_neighbor_report_response(tpAniSirGlobal pMac, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(pSmeNeighborRpt, length, 0); /* Allocated memory for pSmeNeighborRpt...will be freed by other module */ @@ -641,8 +640,6 @@ rrm_process_beacon_report_req(tpAniSirGlobal pMac, } - qdf_mem_set(pSmeBcnReportReq, sizeof(tSirBeaconReportReqInd), 0); - /* Allocated memory for pSmeBcnReportReq....will be freed by other modulea */ qdf_mem_copy(pSmeBcnReportReq->bssId, pSessionEntry->bssId, sizeof(tSirMacAddr)); @@ -838,9 +835,6 @@ rrm_process_beacon_report_xmit(tpAniSirGlobal mac_ctx, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_zero(report, beacon_xmit_ind->numBssDesc * - sizeof(*report)); - for (bss_desc_count = 0; bss_desc_count < beacon_xmit_ind->numBssDesc; bss_desc_count++) { beacon_report = @@ -956,7 +950,6 @@ static void rrm_process_beacon_request_failure(tpAniSirGlobal pMac, ("Unable to allocate memory during RRM Req processing")); return; } - qdf_mem_set(pReport, sizeof(tSirMacRadioMeasureReport), 0); pReport->token = pCurrentReq->token; pReport->type = SIR_MAC_RRM_BEACON_TYPE; @@ -1023,8 +1016,6 @@ tSirRetStatus rrm_process_beacon_req(tpAniSirGlobal mac_ctx, tSirMacAddr peer, FL("Unable to allocate memory during RRM Req processing")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(report, sizeof(*report) * - (rrm_req->num_MeasurementRequest - index), 0); lim_log(mac_ctx, LOG3, FL("rrm beacon type refused of %d report in beacon table"), *num_report); @@ -1044,7 +1035,6 @@ tSirRetStatus rrm_process_beacon_req(tpAniSirGlobal mac_ctx, tSirMacAddr peer, return eSIR_MEM_ALLOC_FAILED; } lim_log(mac_ctx, LOG3, FL(" Processing Beacon Report request")); - qdf_mem_set(curr_req, sizeof(*curr_req), 0); curr_req->dialog_token = rrm_req->DialogToken.token; curr_req->token = rrm_req-> MeasurementRequest[index].measurement_token; @@ -1090,8 +1080,6 @@ tSirRetStatus update_rrm_report(tpAniSirGlobal mac_ctx, lim_log(mac_ctx, LOGP, FL("Unable to allocate memory during RRM Req processing")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(report, sizeof(*report) * - (rrm_req->num_MeasurementRequest - index), 0); lim_log(mac_ctx, LOG3, FL("rrm beacon type incapable of %d report "), *num_report); } @@ -1134,7 +1122,6 @@ rrm_process_radio_measurement_request(tpAniSirGlobal mac_ctx, lim_log(mac_ctx, LOGP, FL("Unable to allocate memory during RRM Req processing")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(report, sizeof(tSirMacRadioMeasureReport), 0); lim_log(mac_ctx, LOGE, FL("No requestIes in the measurement request, sending incapable report")); report->incapable = 1; num_report = 1; @@ -1157,7 +1144,6 @@ rrm_process_radio_measurement_request(tpAniSirGlobal mac_ctx, lim_log(mac_ctx, LOGP, FL("Unable to allocate memory during RRM Req processing")); return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set(report, sizeof(tSirMacRadioMeasureReport), 0); lim_log(mac_ctx, LOGE, FL("Allocated memory for report")); report->incapable = 1; report->type = rrm_req->MeasurementRequest[0].measurement_type; diff --git a/core/mac/src/pe/sch/sch_api.c b/core/mac/src/pe/sch/sch_api.c index 2eb27f8e73ec..1debe34dfa74 100644 --- a/core/mac/src/pe/sch/sch_api.c +++ b/core/mac/src/pe/sch/sch_api.c @@ -597,7 +597,6 @@ int sch_gen_timing_advert_frame(tpAniSirGlobal mac_ctx, tSirMacAddr self_addr, sch_log(mac_ctx, LOGE, FL("Cannot allocate memory")); return eSIR_FAILURE; } - qdf_mem_zero(*buf, buf_size); payload_size = 0; status = dot11f_pack_timing_advertisement_frame(mac_ctx, &frame, diff --git a/core/mac/src/pe/sch/sch_beacon_gen.c b/core/mac/src/pe/sch/sch_beacon_gen.c index 082834e5e71d..22c5738be6b4 100644 --- a/core/mac/src/pe/sch/sch_beacon_gen.c +++ b/core/mac/src/pe/sch/sch_beacon_gen.c @@ -219,9 +219,6 @@ sch_set_fixed_beacon_fields(tpAniSirGlobal mac_ctx, tpPESession session) mac->fc.fromDS = 0; mac->fc.toDS = 0; - /* Now set the beacon body */ - qdf_mem_set((uint8_t *) bcn_1, sizeof(tDot11fBeacon1), 0); - /* Skip over the timestamp (it'll be updated later). */ bcn_1->BeaconInterval.interval = session->beaconParams.beaconInterval; @@ -279,8 +276,6 @@ sch_set_fixed_beacon_fields(tpAniSirGlobal mac_ctx, tpPESession session) FL("Warnings while packing a tDot11fBeacon1(0x%08x.)."), n_status); } - /*changed to correct beacon corruption */ - qdf_mem_set((uint8_t *) bcn_2, sizeof(tDot11fBeacon2), 0); session->schBeaconOffsetBegin = offset + (uint16_t) n_bytes; sch_log(mac_ctx, LOG1, FL("Initialized beacon begin, offset %d"), offset); diff --git a/core/mac/src/sys/legacy/src/system/src/mac_init_api.c b/core/mac/src/sys/legacy/src/system/src/mac_init_api.c index 5e86c7e1f02e..8c0c432dae7e 100644 --- a/core/mac/src/sys/legacy/src/system/src/mac_init_api.c +++ b/core/mac/src/sys/legacy/src/system/src/mac_init_api.c @@ -124,9 +124,6 @@ tSirRetStatus mac_open(tHalHandle *pHalHandle, tHddHandle hHdd, if (NULL == p_mac) return eSIR_MEM_ALLOC_FAILED; - /* Initialize the p_mac structure */ - qdf_mem_set(p_mac, sizeof(tAniSirGlobal), 0); - /* * Set various global fields of p_mac here * (Could be platform dependant as some variables in p_mac are platform diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index eea1199143ba..3a2751528b0f 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c @@ -2327,8 +2327,6 @@ tSirRetStatus sir_convert_probe_frame2_struct(tpAniSirGlobal pMac, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pr, sizeof(tDot11fProbeResponse), 0); - /* delegate to the framesc-generated code, */ status = dot11f_unpack_probe_response(pMac, pFrame, nFrame, pr); if (DOT11F_FAILED(status)) { @@ -2624,7 +2622,6 @@ sir_convert_assoc_req_frame2_struct(tpAniSirGlobal pMac, } /* Zero-init our [out] parameter, */ qdf_mem_set((uint8_t *) pAssocReq, sizeof(tSirAssocReq), 0); - qdf_mem_set((uint8_t *) ar, sizeof(tDot11fAssocRequest), 0); /* delegate to the framesc-generated code, */ status = dot11f_unpack_assoc_request(pMac, pFrame, nFrame, ar); @@ -3829,8 +3826,6 @@ sir_convert_beacon_frame2_struct(tpAniSirGlobal pMac, return eSIR_MEM_ALLOC_FAILED; } - qdf_mem_set((uint8_t *) pBeacon, sizeof(tDot11fBeacon), 0); - /* get the MAC address out of the BD, */ qdf_mem_copy(pBeaconStruct->bssid, pHdr->sa, 6); diff --git a/core/sap/dfs/src/dfs_phyerr_tlv.c b/core/sap/dfs/src/dfs_phyerr_tlv.c index 82c890f55d16..e232efee541b 100644 --- a/core/sap/dfs/src/dfs_phyerr_tlv.c +++ b/core/sap/dfs/src/dfs_phyerr_tlv.c @@ -754,13 +754,15 @@ tlv_calc_event_freq_chirp(struct ath_dfs *dfs, struct rx_radar_status *rs, DFS_DPRINTK(dfs, ATH_DEBUG_DFS_PHYERR | ATH_DEBUG_DFS_PHYERR_SUM, "%s: delta_peak=%d, pulse_duration=%d, bin_resolution=%d.%dKHz, " - "radar_fft_long_period=%d, total_bw=%d.%ldKHz", + "radar_fft_long_period=%d, total_bw=%d.%dKHz", __func__, delta_peak, pulse_duration, bin_resolution / 1000, bin_resolution % 1000, - radar_fft_long_period, total_bw / 100, abs(total_bw % 100)); + radar_fft_long_period, + total_bw / 100, + (int)abs(total_bw % 100)); total_bw /= 100; /* back to KHz */ diff --git a/core/sap/src/sap_api_link_cntl.c b/core/sap/src/sap_api_link_cntl.c index 2447879bcab7..7b249cb746d5 100644 --- a/core/sap/src/sap_api_link_cntl.c +++ b/core/sap/src/sap_api_link_cntl.c @@ -1239,13 +1239,18 @@ wlansap_roam_callback(void *ctx, tCsrRoamInfo *csr_roam_info, uint32_t roamId, csr_roam_info, &qdf_ret_status); break; case eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE: - /* - * This is much more serious issue, we have to vacate the + /* This is much more serious issue, we have to vacate the * channel due to the presence of radar but our channel change * failed, stop the BSS operation completely and inform hostapd */ - sap_ctx->sapsMachine = eSAP_DISCONNECTED; - /* Inform cfg80211 and hostapd that BSS is not alive anymore */ + sap_event.event = eWNI_SME_CHANNEL_CHANGE_RSP; + sap_event.params = 0; + sap_event.u1 = eCSR_ROAM_INFRA_IND; + sap_event.u2 = eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE; + + qdf_status = sap_fsm(sap_ctx, &sap_event); + if (!QDF_IS_STATUS_SUCCESS(qdf_status)) + qdf_ret_status = QDF_STATUS_E_FAILURE; break; case eCSR_ROAM_EXT_CHG_CHNL_UPDATE_IND: qdf_status = sap_signal_hdd_event(sap_ctx, csr_roam_info, diff --git a/core/sap/src/sap_ch_select.c b/core/sap/src/sap_ch_select.c index fcf1b578b3b8..9c9683789d4d 100644 --- a/core/sap/src/sap_ch_select.c +++ b/core/sap/src/sap_ch_select.c @@ -574,9 +574,6 @@ static bool sap_chan_sel_init(tHalHandle halHandle, return eSAP_FALSE; } - qdf_mem_zero(pSpectCh, - (pSpectInfoParams->numSpectChans) * sizeof(*pSpectCh)); - /* Initialize the pointers in the DfsParams to the allocated memory */ pSpectInfoParams->pSpectCh = pSpectCh; @@ -1882,6 +1879,7 @@ static bool sap_filter_over_lap_ch(ptSapContext pSapCtx, uint16_t chNum) return eSAP_FALSE; } +#ifdef FEATURE_WLAN_CH_AVOID /** * sap_select_channel_no_scan_result() - select SAP channel when no scan results * are available. @@ -1890,26 +1888,17 @@ static bool sap_filter_over_lap_ch(ptSapContext pSapCtx, uint16_t chNum) * Returns: channel number if success, 0 otherwise */ static uint8_t sap_select_channel_no_scan_result(tHalHandle hal, - ptSapContext sap_ctx) + ptSapContext sap_ctx) { - uint32_t start_ch_num, end_ch_num; -#ifdef FEATURE_WLAN_CH_AVOID enum channel_state ch_type; uint8_t i, first_safe_ch_in_range = SAP_CHANNEL_NOT_SELECTED; -#endif uint32_t dfs_master_cap_enabled; - start_ch_num = sap_ctx->acs_cfg->start_ch; - end_ch_num = sap_ctx->acs_cfg->end_ch; + uint32_t start_ch_num = sap_ctx->acs_cfg->start_ch; + uint32_t end_ch_num = sap_ctx->acs_cfg->end_ch; QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, FL("start - end: %d - %d"), start_ch_num, end_ch_num); -#ifndef FEATURE_WLAN_CH_AVOID - sap_ctx->acs_cfg->pri_ch = start_ch_num; - sap_ctx->acs_cfg->ht_sec_ch = 0; - /* pick the first channel in configured range */ - return start_ch_num; -#else sme_cfg_get_int(hal, WNI_CFG_DFS_MASTER_ENABLED, &dfs_master_cap_enabled); @@ -1965,8 +1954,25 @@ static uint8_t sap_select_channel_no_scan_result(tHalHandle hal, /* if no channel selected return SAP_CHANNEL_NOT_SELECTED */ return first_safe_ch_in_range; -#endif /* !FEATURE_WLAN_CH_AVOID */ } +#else +static uint8_t sap_select_channel_no_scan_result(tHalHandle hal, + ptSapContext sap_ctx) +{ + uint32_t start_ch_num = sap_ctx->acs_cfg->start_ch; + + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, + FL("start - end: %d - %d"), + start_ch_num, + sap_ctx->acs_cfg->end_ch); + + sap_ctx->acs_cfg->pri_ch = start_ch_num; + sap_ctx->acs_cfg->ht_sec_ch = 0; + + /* pick the first channel in configured range */ + return start_ch_num; +} +#endif /* FEATURE_WLAN_CH_AVOID */ /** * sap_select_channel() - select SAP channel diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 25f2eb3886db..c7f263257bfa 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -298,6 +298,19 @@ tSapChanMatrixInfo ht80_chan[] = { {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN}, {144, SAP_TX_LEAKAGE_MIN} } }, + + {144, + {{36, SAP_TX_LEAKAGE_MAX}, {40, SAP_TX_LEAKAGE_MAX}, + {44, SAP_TX_LEAKAGE_MAX}, {48, SAP_TX_LEAKAGE_MAX}, + {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX}, + {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN}, + {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN}, + {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN}, + {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN}, + {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN}, + {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN}, + {144, SAP_TX_LEAKAGE_MIN} + } }, }; /* channel tx leakage table - ht40 */ @@ -512,6 +525,19 @@ tSapChanMatrixInfo ht40_chan[] = { {144, SAP_TX_LEAKAGE_MIN} } }, + {144, + {{36, 695}, {40, 695}, + {44, 684}, {48, 684}, + {52, 664}, {56, 664}, + {60, 658}, {64, 658}, + {100, 601}, {104, 601}, + {108, 545}, {112, 545}, + {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN}, + {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN}, + {132, 262}, {136, 262}, + {140, SAP_TX_LEAKAGE_MIN}, + {144, SAP_TX_LEAKAGE_MIN} + } }, }; /* channel tx leakage table - ht20 */ @@ -725,6 +751,20 @@ tSapChanMatrixInfo ht20_chan[] = { {140, SAP_TX_LEAKAGE_MIN}, {144, SAP_TX_LEAKAGE_MIN} } }, + + {144, + {{36, 679}, {40, 673}, + {44, 667}, {48, 656}, + {52, 634}, {56, 663}, + {60, 662}, {64, 660}, + {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX}, + {108, SAP_TX_LEAKAGE_MAX}, {112, 590}, + {116, 573}, {120, 553}, + {124, 533}, {128, 513}, + {132, 490}, {136, SAP_TX_LEAKAGE_MIN}, + {140, SAP_TX_LEAKAGE_MIN}, + {144, SAP_TX_LEAKAGE_MIN} + } }, }; #endif /* WLAN_ENABLE_CHNL_MATRIX_RESTRICTION */ @@ -1595,7 +1635,7 @@ static uint8_t sap_random_channel_sel(ptSapContext sap_ctx) /* ch list after invalidating channels leaking into NOL */ uint8_t *leakage_adjusted_lst; /* final list of channel from which random channel will be selected */ - uint8_t final_lst[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0}; + uint8_t final_lst[QDF_MAX_NUM_CHAN] = {0}; tAll5GChannelList *all_ch = &sap_ctx->SapAllChnlList; tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx); tpAniSirGlobal mac_ctx; @@ -2693,6 +2733,11 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, switch (sap_hddevent) { case eSAP_STA_ASSOC_IND: + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } /* TODO - Indicate the assoc request indication to OS */ sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_IND; assoc_ind = &sap_ap_event.sapevt.sapAssocIndication; @@ -2772,6 +2817,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, case eSAP_STA_ASSOC_EVENT: case eSAP_STA_REASSOC_EVENT: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } reassoc_complete = &sap_ap_event.sapevt.sapStationAssocReassocCompleteEvent; @@ -2828,6 +2879,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, break; case eSAP_STA_DISASSOC_EVENT: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } sap_ap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT; disassoc_comp = &sap_ap_event.sapevt.sapStationDisassocCompleteEvent; @@ -2845,6 +2902,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, break; case eSAP_STA_SET_KEY_EVENT: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } sap_ap_event.sapHddEventCode = eSAP_STA_SET_KEY_EVENT; key_complete = &sap_ap_event.sapevt.sapStationSetKeyCompleteEvent; @@ -2854,6 +2917,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, break; case eSAP_STA_MIC_FAILURE_EVENT: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } sap_ap_event.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT; mic_failure = &sap_ap_event.sapevt.sapStationMICFailureEvent; @@ -2879,6 +2948,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, break; case eSAP_WPS_PBC_PROBE_REQ_EVENT: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } sap_ap_event.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT; qdf_mem_copy(&sap_ap_event.sapevt.sapPBCProbeReqEvent. @@ -2912,6 +2987,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, break; case eSAP_MAX_ASSOC_EXCEEDED: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } sap_ap_event.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED; qdf_copy_macaddr(&sap_ap_event.sapevt. sapMaxAssocExceeded.macaddr, @@ -2960,6 +3041,12 @@ QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx, (&mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList[0]); break; case eSAP_ECSA_CHANGE_CHAN_IND: + + if (!csr_roaminfo) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, + FL("Invalid CSR Roam Info")); + return QDF_STATUS_E_INVAL; + } QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, "In %s, SAP event callback event = %s", __func__, "eSAP_ECSA_CHANGE_CHAN_IND"); @@ -3970,6 +4057,12 @@ static QDF_STATUS sap_fsm_state_disconnecting(ptSapContext sap_ctx, QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, FL("Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ")); + } else if (msg == eWNI_SME_CHANNEL_CHANGE_RSP) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, + FL("in state %s, event msg %d result %d"), + "eSAP_DISCONNECTING ", msg, sap_event->u2); + if (sap_event->u2 == eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE) + qdf_status = sap_goto_disconnecting(sap_ctx); } else { QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, FL("in state %s, invalid event msg %d"), @@ -4460,7 +4553,7 @@ static QDF_STATUS sap_get_channel_list(ptSapContext sap_ctx, uint8_t end_ch_num, band_end_ch; uint32_t en_lte_coex; tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx); -#if defined(FEATURE_WLAN_CH_AVOID) || defined(SOFTAP_CHANNEL_RANGE) +#ifdef FEATURE_WLAN_CH_AVOID uint8_t i; #endif tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); @@ -4640,10 +4733,15 @@ static QDF_STATUS sap_get_5ghz_channel_list(ptSapContext sapContext) " Memory Allocation failed sap_get_channel_list"); return QDF_STATUS_E_NOMEM; } - - status = cds_get_pcl_for_existing_conn(CDS_SAP_MODE, - pcl.pcl_list, &pcl.pcl_len, - pcl.weight_list, QDF_ARRAY_SIZE(pcl.weight_list)); + if (cds_mode_specific_connection_count(CDS_SAP_MODE, NULL) == 0) { + status = cds_get_pcl(CDS_SAP_MODE, + pcl.pcl_list, &pcl.pcl_len, pcl.weight_list, + QDF_ARRAY_SIZE(pcl.weight_list)); + } else { + status = cds_get_pcl_for_existing_conn(CDS_SAP_MODE, + pcl.pcl_list, &pcl.pcl_len, pcl.weight_list, + QDF_ARRAY_SIZE(pcl.weight_list)); + } if (status != QDF_STATUS_SUCCESS) { cds_err("Get PCL failed"); return status; diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index 1d619eb78221..4cf951f67506 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -1756,5 +1756,6 @@ static inline void csr_roam_fill_tdls_info(tpAniSirGlobal mac_ctx, tCsrRoamInfo tpSirSmeJoinRsp join_rsp) {} #endif +void csr_packetdump_timer_stop(void); #endif diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h index 89bf7b20a3e9..a9e1896c1641 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -1046,6 +1046,7 @@ typedef struct tagCsrRoamStruct { uint32_t deauthRspStatus; uint8_t *pReassocResp; /* reassociation response from new AP */ uint16_t reassocRespLen; /* length of reassociation response */ + qdf_mc_timer_t packetdump_timer; } tCsrRoamStruct; #define GET_NEXT_ROAM_ID(pRoamStruct) (((pRoamStruct)->nextRoamId + 1 == 0) ? \ diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index ce4bdac75066..3990ebab984b 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -1277,6 +1277,7 @@ QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id, QDF_STATUS sme_update_session_param(tHalHandle hal, uint8_t session_id, uint32_t param_type, uint32_t param_val); +#ifdef WLAN_FEATURE_DISA /** * sme_encrypt_decrypt_msg_register_callback() - Registers * encrypt/decrypt message callback @@ -1315,6 +1316,7 @@ QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal); */ QDF_STATUS sme_encrypt_decrypt_msg(tHalHandle hal, struct encrypt_decrypt_req_params *encrypt_decrypt_params); +#endif /** * sme_set_cts2self_for_p2p_go() - sme function to set ini parms to FW. diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 0c6cf0acc201..6ba4d8a89717 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -352,7 +352,6 @@ static QDF_STATUS init_sme_cmd_list(tpAniSirGlobal pMac) } status = QDF_STATUS_SUCCESS; - qdf_mem_set(pMac->sme.pSmeCmdBufAddr, sme_cmd_ptr_ary_sz, 0); for (cmd_idx = 0; cmd_idx < pMac->sme.totalSmeCmd; cmd_idx++) { /* * Since total size of all commands together can be huge chunk @@ -1018,6 +1017,15 @@ sme_process_cmd: pCommand->command); csr_ll_unlock(&pMac->sme.smeCmdActiveList); status = csr_tdls_process_cmd(pMac, pCommand); + if (!QDF_IS_STATUS_SUCCESS(status)) { + if (csr_ll_remove_entry(&pMac->sme.smeCmdActiveList, + &pCommand->Link, + LL_ACCESS_LOCK)) { + qdf_mem_zero(&pCommand->u.tdlsCmd, + sizeof(tTdlsCmd)); + csr_release_command(pMac, pCommand); + } + } break; #endif case e_sme_command_set_hw_mode: @@ -2249,7 +2257,6 @@ QDF_STATUS sme_set_ese_beacon_request(tHalHandle hHal, const uint8_t sessionId, pSmeRrmContext->eseBcnReqInProgress = true; sms_log(pMac, LOGE, "Sending Beacon Report Req to SME"); - qdf_mem_zero(pSmeBcnReportReq, sizeof(tSirBeaconReportReqInd)); pSmeBcnReportReq->messageType = eWNI_SME_BEACON_REPORT_REQ_IND; pSmeBcnReportReq->length = sizeof(tSirBeaconReportReqInd); @@ -3507,7 +3514,6 @@ QDF_STATUS sme_get_ap_channel_from_scan_cache(tHalHandle hal_handle, FL("scan_filter mem alloc failed")); return QDF_STATUS_E_FAILURE; } else { - qdf_mem_set(scan_filter, sizeof(tCsrScanResultFilter), 0); qdf_mem_set(&first_ap_profile, sizeof(tSirBssDescription), 0); if (NULL == profile) { @@ -6662,7 +6668,6 @@ QDF_STATUS sme_register_p2p_ack_ind_callback(tHalHandle hal, sme_release_global_lock(&mac_ctx->sme); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(msg, sizeof(*msg)); msg->message_type = eWNI_SME_REGISTER_P2P_ACK_CB; msg->length = sizeof(*msg); @@ -6704,7 +6709,6 @@ QDF_STATUS sme_register_mgmt_frame_ind_callback(tHalHandle hal, sme_release_global_lock(&mac_ctx->sme); return QDF_STATUS_E_NOMEM; } - qdf_mem_set(msg, sizeof(*msg), 0); msg->message_type = eWNI_SME_REGISTER_MGMT_FRAME_CB; msg->length = sizeof(*msg); @@ -6762,7 +6766,6 @@ QDF_STATUS sme_register_mgmt_frame(tHalHandle hHal, uint8_t sessionId, if (NULL == pMsg) status = QDF_STATUS_E_NOMEM; else { - qdf_mem_set(pMsg, len, 0); pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ; pMsg->length = len; pMsg->sessionId = sessionId; @@ -6824,7 +6827,6 @@ QDF_STATUS sme_deregister_mgmt_frame(tHalHandle hHal, uint8_t sessionId, if (NULL == pMsg) status = QDF_STATUS_E_NOMEM; else { - qdf_mem_set(pMsg, len, 0); pMsg->messageType = eWNI_SME_REGISTER_MGMT_FRAME_REQ; pMsg->length = len; pMsg->registerFrame = false; @@ -10407,7 +10409,6 @@ QDF_STATUS sme_update_tdls_peer_state(tHalHandle hHal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pTdlsPeerStateParams, sizeof(*pTdlsPeerStateParams)); qdf_mem_copy(&pTdlsPeerStateParams->peerMacAddr, &peerStateParams->peerMacAddr, sizeof(tSirMacAddr)); pTdlsPeerStateParams->vdevId = peerStateParams->vdevId; @@ -10551,7 +10552,6 @@ QDF_STATUS sme_send_tdls_chan_switch_req(tHalHandle hal, sme_release_global_lock(&mac->sme); return QDF_STATUS_E_FAILURE; } - qdf_mem_zero(chan_switch_params, sizeof(*chan_switch_params)); switch (ch_switch_params->tdls_off_ch_mode) { case ENABLE_CHANSWITCH: @@ -11623,7 +11623,6 @@ QDF_STATUS sme_dcc_clear_stats(tHalHandle hHal, uint32_t vdev_id, goto end; } - qdf_mem_zero(request, sizeof(*request)); request->vdev_id = vdev_id; request->dcc_stats_bitmap = dcc_stats_bitmap; @@ -12245,7 +12244,6 @@ QDF_STATUS sme_update_access_policy_vendor_ie(tHalHandle hal, return QDF_STATUS_E_FAILURE; } - qdf_mem_set(msg, msg_len, 0); msg->msg_type = (uint16_t)eWNI_SME_UPDATE_ACCESS_POLICY_VENDOR_IE; msg->length = (uint16_t)msg_len; @@ -12697,8 +12695,6 @@ QDF_STATUS sme_init_thermal_info(tHalHandle hHal, tSmeThermalParams thermalParam return QDF_STATUS_E_NOMEM; } - qdf_mem_zero((void *)pWmaParam, sizeof(t_thermal_mgmt)); - pWmaParam->thermalMgmtEnabled = thermalParam.smeThermalMgmtEnabled; pWmaParam->throttlePeriod = thermalParam.smeThrottlePeriod; @@ -12881,8 +12877,6 @@ QDF_STATUS sme_ap_disable_intra_bss_fwd(tHalHandle hHal, uint8_t sessionId, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pSapDisableIntraFwd, sizeof(tDisableIntraBssFwd)); - pSapDisableIntraFwd->sessionId = sessionId; pSapDisableIntraFwd->disableintrabssfwd = disablefwd; @@ -12967,8 +12961,6 @@ QDF_STATUS sme_stats_ext_request(uint8_t session_id, tpStatsExtRequestReq input) if (data == NULL) { return QDF_STATUS_E_NOMEM; } - - qdf_mem_zero(data, data_len); data->vdev_id = session_id; data->request_data_len = input->request_data_len; if (input->request_data_len) { @@ -13705,7 +13697,6 @@ QDF_STATUS sme_set_epno_list(tHalHandle hal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); req_msg->num_networks = input->num_networks; req_msg->request_id = input->request_id; req_msg->session_id = input->session_id; @@ -13785,7 +13776,6 @@ QDF_STATUS sme_set_passpoint_list(tHalHandle hal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); req_msg->num_networks = input->num_networks; req_msg->request_id = input->request_id; req_msg->session_id = input->session_id; @@ -13849,7 +13839,6 @@ QDF_STATUS sme_reset_passpoint_list(tHalHandle hal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, sizeof(*req_msg)); req_msg->request_id = input->request_id; req_msg->session_id = input->session_id; @@ -14699,7 +14688,6 @@ QDF_STATUS sme_configure_modulated_dtim(tHalHandle h_hal, uint8_t session_id, if (QDF_STATUS_SUCCESS == status) { - qdf_mem_zero((void *)iwcmd, sizeof(*iwcmd)); iwcmd->param_value = modulated_dtim; iwcmd->param_vdev_id = session_id; iwcmd->param_id = GEN_PARAM_MODULATED_DTIM; @@ -14753,13 +14741,12 @@ QDF_STATUS sme_wifi_start_logger(tHalHandle hal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); - req_msg->verbose_level = start_log.verbose_level; req_msg->is_iwpriv_command = start_log.is_iwpriv_command; req_msg->ring_id = start_log.ring_id; req_msg->ini_triggered = start_log.ini_triggered; req_msg->user_triggered = start_log.user_triggered; + req_msg->size = start_log.size; status = sme_acquire_global_lock(&mac->sme); if (status != QDF_STATUS_SUCCESS) { @@ -15261,8 +15248,6 @@ QDF_STATUS sme_pdev_set_pcl(tHalHandle hal, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(req_msg, len); - for (i = 0; i < msg.pcl_len; i++) { req_msg->pcl_list[i] = msg.pcl_list[i]; req_msg->weight_list[i] = msg.weight_list[i]; @@ -16061,7 +16046,6 @@ void sme_send_disassoc_req_frame(tHalHandle hal, uint8_t session_id, if (!QDF_IS_STATUS_SUCCESS(qdf_status)) return; - qdf_mem_set(msg, sizeof(struct sme_send_disassoc_frm_req), 0); msg->msg_type = (uint16_t) eWNI_SME_SEND_DISASSOC_FRAME; msg->length = (uint16_t) sizeof(struct sme_send_disassoc_frm_req); @@ -16669,6 +16653,7 @@ QDF_STATUS sme_set_default_scan_ie(tHalHandle hal, uint16_t session_id, return status; } +#ifdef WLAN_FEATURE_DISA /** * sme_encrypt_decrypt_msg() - handles encrypt/decrypt mesaage * @hal: HAL handle @@ -16799,6 +16784,7 @@ QDF_STATUS sme_encrypt_decrypt_msg_deregister_callback(tHalHandle h_hal) } return status; } +#endif QDF_STATUS sme_set_cts2self_for_p2p_go(tHalHandle hal_handle) { diff --git a/core/sme/src/common/sme_ft_api.c b/core/sme/src/common/sme_ft_api.c index adbb1aa273c6..0ab104f00ea5 100644 --- a/core/sme/src/common/sme_ft_api.c +++ b/core/sme/src/common/sme_ft_api.c @@ -284,7 +284,6 @@ QDF_STATUS sme_ft_send_update_key_ind(tHalHandle hal, uint32_t session_id, if (NULL == msg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(msg, msglen, 0); msg->messageType = eWNI_SME_FT_UPDATE_KEY; msg->length = msglen; diff --git a/core/sme/src/common/sme_power_save.c b/core/sme/src/common/sme_power_save.c index 48b298c653d6..915af516c2ea 100644 --- a/core/sme/src/common/sme_power_save.c +++ b/core/sme/src/common/sme_power_save.c @@ -313,7 +313,6 @@ static QDF_STATUS sme_ps_enter_wowl_req_params(tpAniSirGlobal mac_ctx, FL("Fail to allocate memory for Enter Wowl Request")); return QDF_STATUS_E_NOMEM; } - qdf_mem_set((uint8_t *) hal_wowl_params, sizeof(*hal_wowl_params), 0); /* fill in the message field */ hal_wowl_params->ucMagicPktEnable = sme_wowl_params->ucMagicPktEnable; @@ -421,8 +420,6 @@ static QDF_STATUS sme_ps_exit_wowl_req_params(tpAniSirGlobal mac_ctx, FL("Fail to allocate memory for WoWLAN Add Bcast Pattern ")); return QDF_STATUS_E_NOMEM; } - qdf_mem_set((uint8_t *) hal_wowl_msg, - sizeof(*hal_wowl_msg), 0); hal_wowl_msg->sessionId = session_id; if (QDF_STATUS_SUCCESS == sme_post_ps_msg_to_wma(WMA_WOWL_EXIT_REQ, diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 6c0f417ec805..d9bbd0bda24d 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -57,6 +57,7 @@ #include "cds_concurrency.h" #include "sme_nan_datapath.h" #include "pld_common.h" +#include #define MAX_PWR_FCC_CHAN_12 8 #define MAX_PWR_FCC_CHAN_13 2 @@ -85,6 +86,10 @@ #define MAX_CB_VALUE_IN_INI (2) #define MAX_SOCIAL_CHANNELS 3 + +/* packet dump timer duration of 60 secs */ +#define PKT_DUMP_TIMER_DURATION 60 + /* Choose the largest possible value that can be accomodates in 8 bit signed */ /* variable. */ #define SNR_HACK_BMPS (127) @@ -572,8 +577,6 @@ static void csr_roam_sort_channel_for_early_stop(tpAniSirGlobal mac_ctx, "Failed to allocate memory for tSirUpdateChanList"); return; } - qdf_mem_zero(chan_list_greedy, buf_size); - qdf_mem_zero(chan_list_non_greedy, buf_size); /* * fixed_greedy_chan_list is an evaluated channel list based on most of * the enterprise wifi deployments and the order of the channels @@ -693,7 +696,6 @@ QDF_STATUS csr_update_channel_list(tpAniSirGlobal pMac) "Failed to allocate memory for tSirUpdateChanList"); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pChanList, bufLen); for (i = 0; i < pScan->base_channels.numChannels; i++) { /* Scan is not performed on DSRC channels*/ @@ -963,6 +965,58 @@ void csr_set_global_cfgs(tpAniSirGlobal pMac) csr_set_default_dot11_mode(pMac); } +/** + * csr_packetdump_timer_handler() - packet dump timer + * handler + * @pv: user data + * + * This function is used to handle packet dump timer + * + * Return: None + * + */ +static void csr_packetdump_timer_handler(void *pv) +{ + QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, + "%s Invoking packetdump deregistration API", __func__); + wlan_deregister_txrx_packetdump(); +} + +/** + * csr_packetdump_timer_stop() - stops packet dump timer + * + * This function is used to stop packet dump timer + * + * Return: None + * + */ +void csr_packetdump_timer_stop(void) +{ + QDF_STATUS status; + tHalHandle hal; + tpAniSirGlobal mac; + v_CONTEXT_t vos_ctx_ptr; + + /* get the global voss context */ + vos_ctx_ptr = cds_get_global_context(); + if (vos_ctx_ptr == NULL) { + QDF_ASSERT(0); + return; + } + + hal = cds_get_context(QDF_MODULE_ID_SME); + if (hal == NULL) { + QDF_ASSERT(0); + return; + } + + mac = PMAC_STRUCT(hal); + status = qdf_mc_timer_stop(&mac->roam.packetdump_timer); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sms_log(mac, LOGE, FL("cannot stop packetdump timer")); + } +} + QDF_STATUS csr_roam_open(tpAniSirGlobal pMac) { QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -989,6 +1043,14 @@ QDF_STATUS csr_roam_open(tpAniSirGlobal pMac) ("cannot allocate memory for WaitForKey time out timer")); break; } + status = qdf_mc_timer_init(&pMac->roam.packetdump_timer, + QDF_TIMER_TYPE_SW, csr_packetdump_timer_handler, + pMac); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sms_log(pMac, LOGE, + FL("cannot allocate memory for packetdump timer")); + break; + } status = qdf_mc_timer_init(&pMac->roam.tlStatsReqInfo.hTlStatsTimer, QDF_TIMER_TYPE_SW, @@ -1013,6 +1075,8 @@ QDF_STATUS csr_roam_close(tpAniSirGlobal pMac) qdf_mc_timer_destroy(&pMac->roam.hTimerWaitForKey); qdf_mc_timer_stop(&pMac->roam.tlStatsReqInfo.hTlStatsTimer); qdf_mc_timer_destroy(&pMac->roam.tlStatsReqInfo.hTlStatsTimer); + qdf_mc_timer_stop(&pMac->roam.packetdump_timer); + qdf_mc_timer_destroy(&pMac->roam.packetdump_timer); return QDF_STATUS_SUCCESS; } @@ -3048,10 +3112,6 @@ static QDF_STATUS csr_init11d_info(tpAniSirGlobal pMac, tCsr11dinfo *ps11dinfo) qdf_mem_malloc(sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN); if (pChanInfo != NULL) { - qdf_mem_set(pChanInfo, - sizeof(tSirMacChanInfo) * - WNI_CFG_VALID_CHANNEL_LIST_LEN, 0); - pChanInfoStart = pChanInfo; for (index = 0; index < ps11dinfo->Channels.numChannels; index++) { @@ -3110,9 +3170,6 @@ QDF_STATUS csr_init_channel_power_list(tpAniSirGlobal pMac, tCsr11dinfo *ps11din qdf_mem_malloc(sizeof(tSirMacChanInfo) * WNI_CFG_VALID_CHANNEL_LIST_LEN); if (pChanInfo != NULL) { - qdf_mem_set(pChanInfo, - sizeof(tSirMacChanInfo) * - WNI_CFG_VALID_CHANNEL_LIST_LEN, 0); pChanInfoStart = pChanInfo; for (index = 0; index < ps11dinfo->Channels.numChannels; @@ -3681,7 +3738,6 @@ csr_send_mb_tkip_counter_measures_req_msg(tpAniSirGlobal pMac, status = QDF_STATUS_SUCCESS; if (!QDF_IS_STATUS_SUCCESS(status)) break; - qdf_mem_set(pMsg, sizeof(tSirSmeTkipCntrMeasReq), 0); pMsg->messageType = eWNI_SME_TKIP_CNTR_MEAS_REQ; pMsg->length = sizeof(tSirSmeTkipCntrMeasReq); pMsg->sessionId = sessionId; @@ -4805,7 +4861,6 @@ QDF_STATUS csr_roam_stop_network(tpAniSirGlobal pMac, uint32_t sessionId, if (NULL == pBssConfig) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pBssConfig, sizeof(tBssConfigParam), 0); status = csr_roam_prepare_bss_config(pMac, pProfile, pBssDesc, pBssConfig, pIes); if (QDF_IS_STATUS_SUCCESS(status)) { @@ -5705,8 +5760,6 @@ QDF_STATUS csr_roam_process_command(tpAniSirGlobal pMac, tSmeCmd *pCommand) pSession->pCurRoamProfile = qdf_mem_malloc(sizeof(tCsrRoamProfile)); if (NULL != pSession->pCurRoamProfile) { - qdf_mem_set(pSession->pCurRoamProfile, - sizeof(tCsrRoamProfile), 0); csr_roam_copy_profile(pMac, pSession->pCurRoamProfile, &pCommand->u.roamCmd.roamProfile); @@ -5872,8 +5925,6 @@ static QDF_STATUS csr_roam_save_params(tpAniSirGlobal mac_ctx, if (NULL == session_ptr->pWpaRsnRspIE) return QDF_STATUS_E_NOMEM; - qdf_mem_set(session_ptr->pWpaRsnRspIE, - nIeLen + 2, 0); session_ptr->pWpaRsnRspIE[0] = DOT11F_EID_RSN; session_ptr->pWpaRsnRspIE[1] = (uint8_t) nIeLen; /* copy upto akm_suites */ @@ -7653,8 +7704,7 @@ QDF_STATUS csr_roam_connect(tpAniSirGlobal pMac, uint32_t sessionId, pSession->dhcp_done = false; csr_roam_cancel_roaming(pMac, sessionId); csr_scan_remove_fresh_scan_command(pMac, sessionId); - /* Only abort the scan if its not used for other roam/connect purpose */ - csr_scan_abort_mac_scan(pMac, sessionId, eCSR_SCAN_ABORT_DEFAULT); + csr_scan_abort_all_scans(pMac, eCSR_SCAN_ABORT_DEFAULT); csr_roam_remove_duplicate_command(pMac, sessionId, NULL, eCsrHddIssued); /* Check whether ssid changes */ if (csr_is_conn_state_connected(pMac, sessionId) && @@ -7684,8 +7734,6 @@ QDF_STATUS csr_roam_connect(tpAniSirGlobal pMac, uint32_t sessionId, goto end; } - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), - 0); /* Try to connect to any BSS */ if (NULL == pProfile) { /* No encryption */ @@ -7921,7 +7969,6 @@ static QDF_STATUS csr_roam_join_last_profile(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; goto end; } - qdf_mem_set(pProfile, sizeof(tCsrRoamProfile), 0); status = csr_roam_copy_profile(pMac, pProfile, pSession->pCurRoamProfile); if (!QDF_IS_STATUS_SUCCESS(status)) @@ -7931,7 +7978,6 @@ static QDF_STATUS csr_roam_join_last_profile(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; goto end; } - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); status = csr_roam_prepare_filter_from_profile(pMac, pProfile, pScanFilter); if (!QDF_IS_STATUS_SUCCESS(status)) @@ -9051,6 +9097,7 @@ static void csr_roam_roaming_state_stop_bss_rsp_processor(tpAniSirGlobal pMac, tSirSmeRsp *pSmeRsp) { eCsrRoamCompleteResult result_code = eCsrNothingToJoin; + tCsrRoamProfile *profile; #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR { @@ -9069,16 +9116,16 @@ static void csr_roam_roaming_state_stop_bss_rsp_processor(tpAniSirGlobal pMac, pMac->roam.roamSession[pSmeRsp->sessionId].connectState = eCSR_ASSOC_STATE_TYPE_NOT_CONNECTED; if (CSR_IS_ROAM_SUBSTATE_STOP_BSS_REQ(pMac, pSmeRsp->sessionId)) { - if (CSR_IS_CONN_NDI(pMac->roam.roamSession[pSmeRsp->sessionId]. - pCurRoamProfile)) { + profile = + pMac->roam.roamSession[pSmeRsp->sessionId].pCurRoamProfile; + if (profile && CSR_IS_CONN_NDI(profile)) { result_code = eCsrStopBssSuccess; if (pSmeRsp->statusCode != eSIR_SME_SUCCESS) result_code = eCsrStopBssFailure; } csr_roam_complete(pMac, result_code, NULL); - } else - if (CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE - (pMac, pSmeRsp->sessionId)) { + } else if (CSR_IS_ROAM_SUBSTATE_DISCONNECT_CONTINUE(pMac, + pSmeRsp->sessionId)) { csr_roam_reissue_roam_command(pMac); } } @@ -9200,7 +9247,6 @@ csr_check_profile_in_scan_cache(tpAniSirGlobal mac_ctx, sms_log(mac_ctx, LOGE, FL("alloc for ScanFilter failed.")); return false; } - qdf_mem_set(*scan_filter, sizeof(tCsrScanResultFilter), 0); (*scan_filter)->scan_filter_for_roam = 1; status = csr_roam_prepare_filter_from_profile(mac_ctx, &neighbor_roam_info->csrNeighborRoamProfile, @@ -9308,8 +9354,6 @@ void csr_roam_roaming_state_disassoc_rsp_processor(tpAniSirGlobal pMac, sme_qos_csr_event_ind(pMac, sessionId, SME_QOS_CSR_HANDOFF_ASSOC_REQ, NULL); - qdf_mem_set(pCurRoamProfile, sizeof(tCsrRoamProfile), - 0); csr_roam_copy_profile(pMac, pCurRoamProfile, pSession->pCurRoamProfile); /* make sure to put it at the head of the cmd queue */ @@ -10325,7 +10369,6 @@ static QDF_STATUS csr_send_reset_ap_caps_changed(tpAniSirGlobal pMac, status = QDF_STATUS_SUCCESS; if (QDF_IS_STATUS_SUCCESS(status)) { - qdf_mem_set(pMsg, sizeof(tSirResetAPCapsChange), 0); pMsg->messageType = eWNI_SME_RESET_AP_CAPS_CHANGED; pMsg->length = len; qdf_copy_macaddr(&pMsg->bssId, bssId); @@ -10453,7 +10496,6 @@ csr_roam_chk_lnk_disassoc_ind(tpAniSirGlobal mac_ctx, tSirSmeRsp *msg_ptr) * the WmStatusChange requests is pushed and processed */ pDisassocInd = (tSirSmeDisassocInd *) msg_ptr; - qdf_mem_set(&roam_info, sizeof(roam_info), 0); status = csr_roam_get_session_id_from_bssid(mac_ctx, &pDisassocInd->bssid, &sessionId); if (!QDF_IS_STATUS_SUCCESS(status)) { @@ -12372,7 +12414,6 @@ bool csr_is_same_profile(tpAniSirGlobal pMac, if (NULL == pScanFilter) return fCheck; - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); status = csr_roam_prepare_filter_from_profile(pMac, pProfile2, pScanFilter); if (!(QDF_IS_STATUS_SUCCESS(status))) @@ -13085,7 +13126,6 @@ static QDF_STATUS csr_roam_start_ibss(tpAniSirGlobal pMac, uint32_t sessionId, else status = QDF_STATUS_SUCCESS; if (QDF_IS_STATUS_SUCCESS(status)) { - qdf_mem_set(pBssConfig, sizeof(tBssConfigParam), 0); /* there is no Bss description before we start an IBSS so we need to adopt */ /* all Bss configuration parameters from the Profile. */ status = @@ -13519,7 +13559,6 @@ csr_roam_remove_connected_bss_from_scan_cache(tpAniSirGlobal pMac, if (NULL == pScanFilter) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); pScanFilter->BSSIDs.bssid = qdf_mem_malloc(sizeof(struct qdf_mac_addr)); if (NULL == pScanFilter->BSSIDs.bssid) { qdf_mem_free(pScanFilter); @@ -13642,8 +13681,6 @@ static QDF_STATUS csr_roam_start_wds(tpAniSirGlobal pMac, uint32_t sessionId, pSession->pCurRoamProfile = qdf_mem_malloc(sizeof(tCsrRoamProfile)); if (pSession->pCurRoamProfile != NULL) { - qdf_mem_set(pSession->pCurRoamProfile, - sizeof(tCsrRoamProfile), 0); csr_roam_copy_profile(pMac, pSession->pCurRoamProfile, pProfile); @@ -13792,6 +13829,7 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, uint8_t ese_config = 0; tpCsrNeighborRoamControlInfo neigh_roam_info; uint32_t value = 0, value1 = 0; + QDF_STATUS packetdump_timer_status; if (!pSession) { sms_log(pMac, LOGE, FL(" session %d not found "), sessionId); @@ -13848,7 +13886,6 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, status = QDF_STATUS_SUCCESS; if (!QDF_IS_STATUS_SUCCESS(status)) break; - qdf_mem_set(csr_join_req, msgLen, 0); csr_join_req->messageType = messageType; csr_join_req->length = msgLen; csr_join_req->sessionId = (uint8_t) sessionId; @@ -14264,10 +14301,11 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, } /* * If RX LDPC has been disabled for 2.4GHz channels and enabled - * for 5Ghz for STA like persona here is how to handle those - * cases here (by now channel has been decided). + * for 5Ghz for STA like persona then here is how to handle + * those cases (by now channel has been decided). */ - if (eSIR_INFRASTRUCTURE_MODE == csr_join_req->bsstype) + if (eSIR_INFRASTRUCTURE_MODE == csr_join_req->bsstype || + !wma_is_dbs_enable()) csr_set_ldpc_exception(pMac, pSession, pBssDescription->channelId, pMac->roam.configParam.rxLdpcEnable); @@ -14444,6 +14482,25 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, csr_join_req = NULL; break; } else { + if (pProfile->csrPersona == QDF_STA_MODE) { + sms_log(pMac, LOG1, + FL(" Invoking packetdump register API")); + wlan_register_txrx_packetdump(); + packetdump_timer_status = + qdf_mc_timer_start( + &pMac->roam.packetdump_timer, + (PKT_DUMP_TIMER_DURATION * + QDF_MC_TIMER_TO_SEC_UNIT)/ + QDF_MC_TIMER_TO_MS_UNIT); + if (!QDF_IS_STATUS_SUCCESS( + packetdump_timer_status)) { + sms_log(pMac, LOGE, + FL("cannot start packetdump timer")); + sms_log(pMac, LOGE, + FL("packetdump_timer_status: %d"), + packetdump_timer_status); + } + } #ifndef WLAN_MDM_CODE_REDUCTION_OPT if (eWNI_SME_JOIN_REQ == messageType) { /* Notify QoS module that join happening */ @@ -14485,7 +14542,6 @@ QDF_STATUS csr_send_mb_disassoc_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirSmeDisassocReq), 0); pMsg->messageType = eWNI_SME_DISASSOC_REQ; pMsg->length = sizeof(tSirSmeDisassocReq); pMsg->sessionId = sessionId; @@ -14602,7 +14658,6 @@ QDF_STATUS csr_send_chng_mcc_beacon_interval(tpAniSirGlobal pMac, uint32_t sessi else status = QDF_STATUS_SUCCESS; if (QDF_IS_STATUS_SUCCESS(status)) { - qdf_mem_set(pMsg, sizeof(tSirChangeBIParams), 0); pMsg->messageType = eWNI_SME_CHNG_MCC_BEACON_INTERVAL; pMsg->length = len; @@ -14712,7 +14767,6 @@ QDF_STATUS csr_send_mb_disassoc_cnf_msg(tpAniSirGlobal pMac, status = QDF_STATUS_SUCCESS; if (!QDF_IS_STATUS_SUCCESS(status)) break; - qdf_mem_set(pMsg, sizeof(tSirSmeDisassocCnf), 0); pMsg->messageType = eWNI_SME_DISASSOC_CNF; pMsg->statusCode = eSIR_SME_SUCCESS; pMsg->length = sizeof(tSirSmeDisassocCnf); @@ -14749,7 +14803,6 @@ QDF_STATUS csr_send_mb_deauth_cnf_msg(tpAniSirGlobal pMac, status = QDF_STATUS_SUCCESS; if (!QDF_IS_STATUS_SUCCESS(status)) break; - qdf_mem_set(pMsg, sizeof(tSirSmeDeauthCnf), 0); pMsg->messageType = eWNI_SME_DEAUTH_CNF; pMsg->statusCode = eSIR_SME_SUCCESS; pMsg->length = sizeof(tSirSmeDeauthCnf); @@ -14784,7 +14837,6 @@ QDF_STATUS csr_send_assoc_cnf_msg(tpAniSirGlobal pMac, tpSirSmeAssocInd pAssocIn pMsg = qdf_mem_malloc(sizeof(tSirSmeAssocCnf)); if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirSmeAssocCnf), 0); pMsg->messageType = eWNI_SME_ASSOC_CNF; pMsg->length = sizeof(tSirSmeAssocCnf); if (QDF_IS_STATUS_SUCCESS(Halstatus)) @@ -14824,7 +14876,6 @@ QDF_STATUS csr_send_assoc_ind_to_upper_layer_cnf_msg(tpAniSirGlobal pMac, pMsg = qdf_mem_malloc(sizeof(tSirSmeAssocIndToUpperLayerCnf)); if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirSmeAssocIndToUpperLayerCnf), 0); pMsg->messageType = eWNI_SME_UPPER_LAYER_ASSOC_CNF; pMsg->length = sizeof(tSirSmeAssocIndToUpperLayerCnf); @@ -14920,7 +14971,6 @@ QDF_STATUS csr_send_mb_set_context_req_msg(tpAniSirGlobal pMac, pMsg = qdf_mem_malloc(msgLen); if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, msgLen, 0); pMsg->messageType = eWNI_SME_SETCONTEXT_REQ; pMsg->length = msgLen; pMsg->sessionId = (uint8_t) sessionId; @@ -14986,7 +15036,6 @@ QDF_STATUS csr_send_mb_start_bss_req_msg(tpAniSirGlobal pMac, uint32_t sessionId if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirSmeStartBssReq), 0); pMsg->messageType = eWNI_SME_START_BSS_REQ; pMsg->sessionId = sessionId; pMsg->length = sizeof(tSirSmeStartBssReq); @@ -15071,7 +15120,12 @@ QDF_STATUS csr_send_mb_start_bss_req_msg(tpAniSirGlobal pMac, uint32_t sessionId qdf_mem_copy(&pMsg->extendedRateSet, &pParam->extendedRateSet, sizeof(tSirMacRateSet)); - if (eSIR_IBSS_MODE == pMsg->bssType) + /* + * If RX LDPC has been disabled for 2.4GHz channels and enabled + * for 5Ghz for STA like persona then here is how to handle + * those cases (by now channel has been decided). + */ + if (eSIR_IBSS_MODE == pMsg->bssType || !wma_is_dbs_enable()) csr_set_ldpc_exception(pMac, pSession, pMsg->channelId, pMac->roam.configParam.rxLdpcEnable); @@ -15108,7 +15162,6 @@ QDF_STATUS csr_send_mb_stop_bss_req_msg(tpAniSirGlobal pMac, uint32_t sessionId) pMsg = qdf_mem_malloc(sizeof(tSirSmeStopBssReq)); if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirSmeStopBssReq), 0); pMsg->messageType = eWNI_SME_STOP_BSS_REQ; pMsg->sessionId = sessionId; pMsg->length = sizeof(tSirSmeStopBssReq); @@ -15194,7 +15247,6 @@ QDF_STATUS csr_process_add_sta_session_rsp(tpAniSirGlobal pMac, uint8_t *pMsg) return QDF_STATUS_E_NOMEM; } - qdf_mem_set(msg, sizeof(*msg), 0); msg->msg_type = eWNI_SME_SET_IE_REQ; msg->session_id = rsp->session_id; msg->length = sizeof(*msg); @@ -15749,6 +15801,9 @@ QDF_STATUS csr_roam_close_session(tpAniSirGlobal pMac, uint32_t sessionId, purge_sme_session_cmd_list(pMac, sessionId, &pMac->sme.smeScanCmdPendingList); + purge_sme_session_cmd_list(pMac, sessionId, + &pMac->sme.smeScanCmdActiveList); + purge_csr_session_cmd_list(pMac, sessionId); status = csr_issue_del_sta_for_session_req(pMac, sessionId, @@ -17215,7 +17270,6 @@ csr_create_roam_scan_offload_request(tpAniSirGlobal mac_ctx, FL("Mem alloc for roam scan offload req failed.")); return NULL; } - qdf_mem_zero(req_buf, sizeof(tSirRoamOffloadScanReq)); req_buf->Command = command; /* * If command is STOP, then pass down ScanOffloadEnabled as Zero. This @@ -17583,14 +17637,14 @@ static void csr_update_driver_assoc_ies(tpAniSirGlobal mac_ctx, = (uint8_t *) &mac_ctx->rrm.rrmPEContext.rrmEnabledCaps; uint8_t power_cap_ie_data[DOT11F_IE_POWERCAPS_MAX_LEN] = {MIN_TX_PWR_CAP, MAX_TX_PWR_CAP}; - uint8_t max_tx_pwr_cap - = csr_get_cfg_max_tx_power(mac_ctx, - session->pConnectBssDesc->channelId); - + uint8_t max_tx_pwr_cap = 0; uint8_t supp_chan_ie[DOT11F_IE_SUPPCHANNELS_MAX_LEN], supp_chan_ie_len; uint8_t ese_ie[DOT11F_IE_ESEVERSION_MAX_LEN] = { 0x0, 0x40, 0x96, 0x3, ESE_VERSION_SUPPORTED}; + if (session->pConnectBssDesc) + max_tx_pwr_cap = csr_get_cfg_max_tx_power(mac_ctx, + session->pConnectBssDesc->channelId); if (max_tx_pwr_cap) power_cap_ie_data[1] = max_tx_pwr_cap; @@ -17703,11 +17757,13 @@ csr_roam_offload_scan(tpAniSirGlobal mac_ctx, uint8_t session_id, /* * The Dynamic Config Items Update may happen even if the state is in * INIT. It is important to ensure that the command is passed down to - * the FW only if the Infra Station is in a connected state.A connected - * station could also be in a PREAUTH or REASSOC states.So, consider not - * sending the command down in INIT state. We also have to ensure that - * if there is a STOP command we always have to inform Riva, - * irrespective of whichever state we are in + * the FW only if the Infra Station is in a connected state. A connected + * station could also be in a PREAUTH or REASSOC states. + * 1) Block all CMDs that are not STOP in INIT State. For STOP always + * inform firmware irrespective of state. + * 2) Block update cfg CMD if its for REASON_ROAM_SET_BLACKLIST_BSSID, + * because we need to inform firmware of blacklisted AP for PNO in + * all states. */ if ((roam_info->neighborRoamState == @@ -18364,7 +18420,6 @@ QDF_STATUS csr_roam_update_wparsni_es(tpAniSirGlobal pMac, uint32_t sessionId, pMsg = qdf_mem_malloc(sizeof(tSirUpdateAPWPARSNIEsReq)); if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, sizeof(tSirUpdateAPWPARSNIEsReq), 0); pMsg->messageType = eWNI_SME_SET_APWPARSNIEs_REQ; pMsg->transactionId = 0; qdf_copy_macaddr(&pMsg->bssid, &pSession->selfMacAddr); @@ -18494,8 +18549,6 @@ QDF_STATUS csr_roam_channel_change_req(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_set((void *)pMsg, sizeof(tSirChanChangeRequest), 0); - pMsg->messageType = eWNI_SME_CHANNEL_CHANGE_REQ; pMsg->messageLen = sizeof(tSirChanChangeRequest); pMsg->targetChannel = profile->ChannelInfo.ChannelList[0]; @@ -18539,7 +18592,6 @@ QDF_STATUS csr_roam_start_beacon_req(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_set((void *)pMsg, sizeof(tSirStartBeaconIndication), 0); pMsg->messageType = eWNI_SME_START_BEACON_REQ; pMsg->messageLen = sizeof(tSirStartBeaconIndication); pMsg->beaconStartStatus = dfsCacWaitStatus; @@ -18651,8 +18703,6 @@ csr_roam_update_add_ies(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pUpdateAddIEs, sizeof(tSirUpdateIEsInd)); - pUpdateAddIEs->msgType = eWNI_SME_UPDATE_ADDITIONAL_IES; pUpdateAddIEs->msgLen = sizeof(tSirUpdateIEsInd); @@ -18697,7 +18747,6 @@ QDF_STATUS csr_send_ext_change_channel(tpAniSirGlobal mac_ctx, uint32_t channel, if (NULL == msg) return QDF_STATUS_E_NOMEM; - qdf_mem_zero(msg, sizeof(*msg)); msg->message_type = eWNI_SME_EXT_CHANGE_CHANNEL; msg->length = sizeof(*msg); msg->new_channel = channel; @@ -18733,7 +18782,6 @@ QDF_STATUS csr_roam_send_chan_sw_ie_request(tpAniSirGlobal mac_ctx, return QDF_STATUS_E_NOMEM; } - qdf_mem_set((void *)msg, sizeof(tSirDfsCsaIeRequest), 0); msg->msgType = eWNI_SME_DFS_BEACON_CHAN_SW_IE_REQ; msg->msgLen = sizeof(tSirDfsCsaIeRequest); @@ -19224,8 +19272,6 @@ void csr_process_set_hw_mode(tpAniSirGlobal mac, tSmeCmd *command) } } - qdf_mem_set(cmd, len, 0); - cmd->messageType = eWNI_SME_SET_HW_MODE_REQ; cmd->length = len; cmd->set_hw.hw_mode_index = command->u.set_hw_mode_cmd.hw_mode_index; @@ -19448,7 +19494,6 @@ void csr_process_nss_update_req(tpAniSirGlobal mac, tSmeCmd *command) goto fail; } - qdf_mem_set((void *)msg, sizeof(*msg), 0); msg->msgType = eWNI_SME_NSS_UPDATE_REQ; msg->msgLen = sizeof(*msg); @@ -19623,7 +19668,6 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx, } csr_scan_save_roam_offload_ap_to_scan_cache(mac_ctx, roam_synch_data, bss_desc); - qdf_mem_zero(roam_info, sizeof(tCsrRoamInfo)); roam_info->sessionId = session_id; csr_roam_call_callback(mac_ctx, roam_synch_data->roamedVdevId, roam_info, 0, eCSR_ROAM_TDLS_STATUS_UPDATE, @@ -19701,8 +19745,6 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx, sme_release_global_lock(&mac_ctx->sme); return; } - qdf_mem_zero(roam_info->pbFrames, roam_info->nBeaconLength + - roam_info->nAssocReqLength + roam_info->nAssocRspLength); qdf_mem_copy(roam_info->pbFrames, (uint8_t *)roam_synch_data + roam_synch_data->reassoc_req_offset + diff --git a/core/sme/src/csr/csr_api_scan.c b/core/sme/src/csr/csr_api_scan.c index 3edaca4b8e9f..fa72e875a92e 100644 --- a/core/sme/src/csr/csr_api_scan.c +++ b/core/sme/src/csr/csr_api_scan.c @@ -671,7 +671,6 @@ static QDF_STATUS csr_issue_roam_after_lostlink_scan(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; goto free_filter; } - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); if (NULL == pSession->pCurRoamProfile) { pScanFilter->EncryptionType.numEntries = 1; pScanFilter->EncryptionType.encryptionType[0] = @@ -686,7 +685,6 @@ static QDF_STATUS csr_issue_roam_after_lostlink_scan(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; goto free_filter; } - qdf_mem_set(pProfile, sizeof(tCsrRoamProfile), 0); status = csr_roam_copy_profile(pMac, pProfile, pSession->pCurRoamProfile); if (!QDF_IS_STATUS_SUCCESS(status)) @@ -838,7 +836,6 @@ csr_update_lost_link1_cmd(tpAniSirGlobal mac_ctx, tSmeCmd *cmd, if (NULL == scan_filter) return QDF_STATUS_E_NOMEM; - qdf_mem_set(scan_filter, sizeof(tCsrScanResultFilter), 0); status = csr_roam_prepare_filter_from_profile(mac_ctx, pSession->pCurRoamProfile, scan_filter); if (!QDF_IS_STATUS_SUCCESS(status)) @@ -1177,7 +1174,6 @@ QDF_STATUS csr_scan_handle_search_for_ssid(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; break; } - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); status = csr_roam_prepare_filter_from_profile(pMac, pProfile, pScanFilter); if (!QDF_IS_STATUS_SUCCESS(status)) @@ -1930,7 +1926,6 @@ csr_save_scan_entry(tpAniSirGlobal pMac, qdf_mem_free(pNewIes); return status; } - qdf_mem_set(pResult, allocLen, 0); pResult->capValue = pBssDesc->capValue; pResult->preferValue = pBssDesc->preferValue; pResult->ucEncryptionType = uc; @@ -2121,7 +2116,6 @@ QDF_STATUS csr_scan_get_result(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_set(pRetList, sizeof(tScanResultList), 0); csr_ll_open(pMac->hHdd, &pRetList->List); pRetList->pCurEntry = NULL; status = csr_parse_scan_results(pMac, pFilter, pRetList, &count); @@ -2380,7 +2374,6 @@ QDF_STATUS csr_scan_copy_result_list(tpAniSirGlobal pMac, tScanResultHandle hIn, if (NULL == pRetList) status = QDF_STATUS_E_NOMEM; else { - qdf_mem_set(pRetList, sizeof(tScanResultList), 0); csr_ll_open(pMac->hHdd, &pRetList->List); pRetList->pCurEntry = NULL; csr_ll_lock(&pMac->scan.scanResultList); @@ -3040,7 +3033,6 @@ static tCsrScanResult *csr_scan_save_bss_description(tpAniSirGlobal pMac, pCsrBssDescription = qdf_mem_malloc(cbAllocated); if (NULL != pCsrBssDescription) { - qdf_mem_set(pCsrBssDescription, cbAllocated, 0); pCsrBssDescription->AgingCount = (int32_t) pMac->roam.configParam.agingCount; sms_log(pMac, LOGW, @@ -3151,7 +3143,6 @@ QDF_STATUS csr_save_to_channel_power2_g_5_g(tpAniSirGlobal pMac, pChannelInfo++; continue; } - qdf_mem_set(pChannelSet, sizeof(tCsrChannelPowerInfo), 0); pChannelSet->firstChannel = pChannelInfo->firstChanNum; pChannelSet->numChannels = pChannelInfo->numChannels; /* @@ -3234,7 +3225,6 @@ static void csr_clear_dfs_channel_list(tpAniSirGlobal pMac) msgLen = (uint16_t) (sizeof(tSirMbMsg)); pMsg = qdf_mem_malloc(msgLen); if (NULL != pMsg) { - qdf_mem_set((void *)pMsg, msgLen, 0); pMsg->type = eWNI_SME_CLEAR_DFS_CHANNEL_LIST; pMsg->msgLen = msgLen; cds_send_mb_message_to_mac(pMsg); @@ -3623,8 +3613,6 @@ void csr_save_channel_power_for_band(tpAniSirGlobal pMac, bool fill_5f) if (NULL == chan_info) return; - qdf_mem_set(chan_info, sizeof(tSirMacChanInfo) * - WNI_CFG_VALID_CHANNEL_LIST_LEN, 0); ch_info_start = chan_info; for (idx = 0; idx < max_ch_idx; idx++) { ch = pMac->scan.defaultPowerTable[idx].chan_num; @@ -4360,7 +4348,6 @@ static tCsrScanResult *csr_scan_save_bss_description_to_interim_list( cbAllocated, cbBSSDesc); pCsrBssDescription = qdf_mem_malloc(cbAllocated); if (NULL != pCsrBssDescription) { - qdf_mem_set(pCsrBssDescription, cbAllocated, 0); qdf_mem_copy(&pCsrBssDescription->Result.BssDescriptor, pBSSDescription, cbBSSDesc); pCsrBssDescription->AgingCount = @@ -4998,7 +4985,6 @@ static QDF_STATUS csr_send_mb_scan_req(tpAniSirGlobal pMac, uint16_t sessionId, return QDF_STATUS_E_NOMEM; } - qdf_mem_set(pMsg, msgLen, 0); pMsg->messageType = eWNI_SME_SCAN_REQ; pMsg->length = msgLen; /* ToDO: Fill in session info when we need to do scan base on session */ @@ -5175,7 +5161,6 @@ QDF_STATUS csr_send_mb_scan_result_req(tpAniSirGlobal pMac, if (NULL == pMsg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pMsg, msgLen, 0); pMsg->messageType = eWNI_SME_SCAN_REQ; pMsg->length = msgLen; pMsg->sessionId = sessionId; @@ -6081,7 +6066,6 @@ QDF_STATUS csr_scan_get_pmkid_candidate_list(tpAniSirGlobal pMac, if (NULL == pScanFilter) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); /* Here is the profile we need to connect to */ status = csr_roam_prepare_filter_from_profile(pMac, pSession->pCurRoamProfile, pScanFilter); @@ -6152,7 +6136,6 @@ QDF_STATUS csr_scan_get_bkid_candidate_list(tpAniSirGlobal pMac, if (NULL == pScanFilter) return QDF_STATUS_E_NOMEM; - qdf_mem_set(pScanFilter, sizeof(tCsrScanResultFilter), 0); /* Here is the profile we need to connect to */ status = csr_roam_prepare_filter_from_profile(pMac, pSession->pCurRoamProfile, pScanFilter); @@ -6317,9 +6300,6 @@ QDF_STATUS csr_scan_for_ssid(tpAniSirGlobal mac_ctx, uint32_t session_id, else status = QDF_STATUS_SUCCESS; - qdf_mem_set(scan_req->pIEField, - profile->nAddIEScanLength, 0); - if (QDF_IS_STATUS_SUCCESS(status)) { qdf_mem_copy(scan_req->pIEField, profile->pAddIEScan, @@ -6473,7 +6453,6 @@ void csr_save_tx_power_to_cfg(tpAniSirGlobal pMac, tDblLinkList *pList, if (pBuf == NULL) return; - qdf_mem_set(pBuf, dataLen, 0); ch_pwr_set = (tSirMacChanInfo *) (pBuf); pEntry = csr_ll_peek_head(pList, LL_ACCESS_LOCK); /* @@ -6615,8 +6594,6 @@ void csr_set_cfg_scan_control_list(tpAniSirGlobal pMac, uint8_t *countryCode, pControlList = qdf_mem_malloc(WNI_CFG_SCAN_CONTROL_LIST_LEN); if (pControlList != NULL) { - qdf_mem_set((void *)pControlList, WNI_CFG_SCAN_CONTROL_LIST_LEN, - 0); if (IS_SIR_STATUS_SUCCESS(wlan_cfg_get_str(pMac, WNI_CFG_SCAN_CONTROL_LIST, pControlList, &len))) { @@ -6651,6 +6628,39 @@ void csr_set_cfg_scan_control_list(tpAniSirGlobal pMac, uint8_t *countryCode, } /* AllocateMemory */ } + +/** + * csr_scan_abort_all_scans() - Abort scan on all Sessions + * @mac_ctx: pointer to Global Mac structure + * @reason: reason for cancelling scan + * + * Abort scan on all Sessions + * + * Return: QDF_STATUS + */ +QDF_STATUS csr_scan_abort_all_scans(tpAniSirGlobal mac_ctx, + eCsrAbortReason reason) +{ + QDF_STATUS status = QDF_STATUS_SUCCESS; + uint8_t session_id; + + mac_ctx->scan.fDropScanCmd = true; + for (session_id = 0; session_id < CSR_ROAM_SESSION_MAX; session_id++) { + if (CSR_IS_SESSION_VALID(mac_ctx, session_id)) { + csr_remove_cmd_with_session_id_from_pending_list( + mac_ctx, + session_id, &mac_ctx->sme.smeScanCmdPendingList, + eSmeCommandScan); + csr_abort_scan_from_active_list(mac_ctx, + &mac_ctx->sme.smeScanCmdActiveList, + session_id, eSmeCommandScan, reason); + } + } + mac_ctx->scan.fDropScanCmd = false; + + return status; +} + QDF_STATUS csr_scan_abort_mac_scan(tpAniSirGlobal pMac, uint8_t sessionId, eCsrAbortReason reason) { @@ -6849,7 +6859,6 @@ static void csr_send_scan_abort(tpAniSirGlobal mac_ctx, FL("Failed to alloc memory for SmeScanAbortReq")); return; } - qdf_mem_zero((void *)msg, msg_len); msg->type = eWNI_SME_SCAN_ABORT_IND; msg->msgLen = msg_len; msg->sessionId = session_id; @@ -6998,7 +7007,6 @@ QDF_STATUS csr_scan_save_preferred_network_found(tpAniSirGlobal pMac, qdf_mem_free(parsed_frm); return QDF_STATUS_E_NOMEM; } - qdf_mem_set(pScanResult, sizeof(tCsrScanResult) + uLen, 0); pBssDescr = &pScanResult->Result.BssDescriptor; /* * Length of BSS desription is without length of length itself and @@ -7271,7 +7279,6 @@ QDF_STATUS csr_scan_save_roam_offload_ap_to_scan_cache(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(scan_res_ptr, sizeof(tCsrScanResult) + length); qdf_mem_copy(&scan_res_ptr->Result.BssDescriptor, bss_desc_ptr, (sizeof(tSirBssDescription) + length)); @@ -7384,7 +7391,6 @@ void csr_scan_active_list_timeout_handle(void *userData) FL("Failed to alloc memory for SmeScanAbortReq")); return; } - qdf_mem_zero((void *)msg, msg_len); msg->type = eWNI_SME_SCAN_ABORT_IND; msg->msgLen = msg_len; msg->sessionId = scan_cmd->sessionId; diff --git a/core/sme/src/csr/csr_host_scan_roam.c b/core/sme/src/csr/csr_host_scan_roam.c index fcbd0400ac49..def107552ff4 100644 --- a/core/sme/src/csr/csr_host_scan_roam.c +++ b/core/sme/src/csr/csr_host_scan_roam.c @@ -187,9 +187,9 @@ void csr_neighbor_roam_process_scan_results(tpAniSirGlobal mac_ctx, descr = &scan_result->BssDescriptor; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, FL("Scan result: BSSID " MAC_ADDRESS_STR - " (Rssi %ld, Ch:%d)"), + " (Rssi %d, Ch:%d)"), MAC_ADDR_ARRAY(descr->bssId), - abs(descr->rssi), descr->channelId); + (int)abs(descr->rssi), descr->channelId); if (!qdf_mem_cmp(descr->bssId, n_roam_info->currAPbssid.bytes, diff --git a/core/sme/src/csr/csr_inside_api.h b/core/sme/src/csr/csr_inside_api.h index 9c66909c0255..03338de19033 100644 --- a/core/sme/src/csr/csr_inside_api.h +++ b/core/sme/src/csr/csr_inside_api.h @@ -267,6 +267,8 @@ QDF_STATUS csr_scan_for_ssid(tpAniSirGlobal pMac, uint32_t sessionId, bool csr_scan_remove_fresh_scan_command(tpAniSirGlobal pMac, uint8_t sessionId); QDF_STATUS csr_scan_abort_mac_scan(tpAniSirGlobal pMac, uint8_t sessionId, eCsrAbortReason reason); +QDF_STATUS csr_scan_abort_all_scans(tpAniSirGlobal mac_ctx, + eCsrAbortReason reason); void csr_remove_cmd_from_pending_list(tpAniSirGlobal pMac, tDblLinkList *pList, eSmeCommandType commandType); void csr_remove_cmd_with_session_id_from_pending_list(tpAniSirGlobal pMac, diff --git a/core/sme/src/csr/csr_neighbor_roam.c b/core/sme/src/csr/csr_neighbor_roam.c index 78d1d8661f4f..97cfb05f7d7b 100644 --- a/core/sme/src/csr/csr_neighbor_roam.c +++ b/core/sme/src/csr/csr_neighbor_roam.c @@ -385,10 +385,6 @@ csr_neighbor_roam_prepare_scan_profile_filter(tpAniSirGlobal pMac, return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pScanFilter->BSSIDs.bssid, - sizeof(tSirMacAddr) * - pScanFilter->BSSIDs.numOfBSSIDs); - /* Populate the BSSID from handoff info received from HDD */ for (i = 0; i < pScanFilter->BSSIDs.numOfBSSIDs; i++) { qdf_copy_macaddr(&pScanFilter->BSSIDs.bssid[i], @@ -1516,7 +1512,6 @@ static QDF_STATUS csr_neighbor_roam_process_handoff_req( sms_log(mac_ctx, LOGE, FL("Memory alloc failed")); return QDF_STATUS_E_NOMEM; } - qdf_mem_set(profile, sizeof(tCsrRoamProfile), 0); status = csr_roam_copy_profile(mac_ctx, profile, session->pCurRoamProfile); @@ -1537,10 +1532,6 @@ static QDF_STATUS csr_neighbor_roam_process_handoff_req( } } - qdf_mem_zero(profile->BSSIDs.bssid, - sizeof(tSirMacAddr) * - profile->BSSIDs.numOfBSSIDs); - /* Populate the BSSID from handoff info received from HDD */ for (i = 0; i < profile->BSSIDs.numOfBSSIDs; i++) { qdf_copy_macaddr(&profile->BSSIDs.bssid[i], diff --git a/core/sme/src/csr/csr_roam_preauth.c b/core/sme/src/csr/csr_roam_preauth.c index 6b58af69afdc..9419514251a4 100644 --- a/core/sme/src/csr/csr_roam_preauth.c +++ b/core/sme/src/csr/csr_roam_preauth.c @@ -515,7 +515,6 @@ QDF_STATUS csr_roam_issue_ft_preauth_req(tHalHandle hal, uint32_t session_id, } /* Save the SME Session ID. We need it while processing preauth resp */ csr_session->ftSmeContext.smeSessionId = session_id; - qdf_mem_zero(preauth_req, auth_req_len); preauth_req->pbssDescription = (tpSirBssDescription) qdf_mem_malloc(sizeof(bss_desc->length) diff --git a/core/sme/src/csr/csr_util.c b/core/sme/src/csr/csr_util.c index b1766b31b769..42d8e07c6374 100644 --- a/core/sme/src/csr/csr_util.c +++ b/core/sme/src/csr/csr_util.c @@ -1289,8 +1289,6 @@ QDF_STATUS csr_get_parsed_bss_description_ies(tHalHandle hHal, if (pBssDesc && ppIEStruct) { *ppIEStruct = qdf_mem_malloc(sizeof(tDot11fBeaconIEs)); if ((*ppIEStruct) != NULL) { - qdf_mem_set((void *)*ppIEStruct, - sizeof(tDot11fBeaconIEs), 0); status = csr_parse_bss_description_ies(hHal, pBssDesc, *ppIEStruct); diff --git a/core/sme/src/nan/nan_api.c b/core/sme/src/nan/nan_api.c index 4e2ec69ab6e6..854975790758 100644 --- a/core/sme/src/nan/nan_api.c +++ b/core/sme/src/nan/nan_api.c @@ -108,8 +108,6 @@ QDF_STATUS sme_nan_request(tpNanRequestReq input) FL("Memory allocation failure")); return QDF_STATUS_E_NOMEM; } - - qdf_mem_zero(data, data_len); data->request_data_len = input->request_data_len; if (input->request_data_len) { qdf_mem_copy(data->request_data, diff --git a/core/sme/src/nan/nan_datapath_api.c b/core/sme/src/nan/nan_datapath_api.c index bae1285b4be3..0703283d082f 100644 --- a/core/sme/src/nan/nan_datapath_api.c +++ b/core/sme/src/nan/nan_datapath_api.c @@ -419,7 +419,6 @@ QDF_STATUS csr_process_ndp_initiator_request(tpAniSirGlobal mac_ctx, if (NULL == lim_msg) return QDF_STATUS_E_NOMEM; - qdf_mem_set(lim_msg, msg_len, 0); lim_msg->msg_type = eWNI_SME_NDP_INITIATOR_REQ; lim_msg->msg_len = msg_len; /* @@ -478,7 +477,6 @@ QDF_STATUS csr_process_ndp_responder_request(tpAniSirGlobal mac_ctx, goto free_config; } - qdf_mem_set(lim_msg, msg_len, 0); lim_msg->msg_type = eWNI_SME_NDP_RESPONDER_REQ; lim_msg->msg_len = msg_len; /* diff --git a/core/sme/src/p2p/p2p_api.c b/core/sme/src/p2p/p2p_api.c index 894f5cf31d47..60a7aff3d494 100644 --- a/core/sme/src/p2p/p2p_api.c +++ b/core/sme/src/p2p/p2p_api.c @@ -75,7 +75,6 @@ QDF_STATUS p2p_process_remain_on_channel_cmd(tpAniSirGlobal pMac, else { QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO, "%s call", __func__); - qdf_mem_set(pMsg, sizeof(tSirRemainOnChnReq), 0); pMsg->messageType = eWNI_SME_REMAIN_ON_CHANNEL_REQ; pMsg->length = (uint16_t) len; qdf_copy_macaddr(&pMsg->selfMacAddr, &pSession->selfMacAddr); @@ -301,7 +300,6 @@ QDF_STATUS p2p_send_action(tHalHandle hHal, uint8_t sessionId, if (NULL == pMsg) status = QDF_STATUS_E_NOMEM; else { - qdf_mem_set((void *)pMsg, msgLen, 0); pMsg->type = eWNI_SME_SEND_ACTION_FRAME_IND; pMsg->msgLen = msgLen; pMsg->sessionId = sessionId; @@ -350,7 +348,6 @@ QDF_STATUS p2p_set_ps(tHalHandle hHal, tP2pPsConfig *pNoA) if (NULL == pNoAParam) status = QDF_STATUS_E_NOMEM; else { - qdf_mem_set(pNoAParam, sizeof(tP2pPsConfig), 0); qdf_mem_copy(pNoAParam, pNoA, sizeof(tP2pPsConfig)); msg.type = eWNI_SME_UPDATE_NOA; msg.bodyval = 0; diff --git a/core/sme/src/qos/sme_qos.c b/core/sme/src/qos/sme_qos.c index 6a097f9cbe74..5f8a2f172fc1 100644 --- a/core/sme/src/qos/sme_qos.c +++ b/core/sme/src/qos/sme_qos.c @@ -3493,8 +3493,6 @@ QDF_STATUS sme_qos_ft_aggr_qos_req(tpAniSirGlobal mac_ctx, uint8_t session_id) return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(aggr_req, sizeof(tSirAggrQosReq)); - aggr_req->messageType = eWNI_SME_FT_AGGR_QOS_REQ; aggr_req->length = sizeof(tSirAggrQosReq); aggr_req->sessionId = session_id; @@ -3942,7 +3940,6 @@ QDF_STATUS sme_qos_add_ts_req(tpAniSirGlobal pMac, __func__, __LINE__); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pMsg, sizeof(tSirAddtsReq)); pMsg->messageType = eWNI_SME_ADDTS_REQ; pMsg->length = sizeof(tSirAddtsReq); pMsg->sessionId = sessionId; @@ -4059,7 +4056,6 @@ QDF_STATUS sme_qos_del_ts_req(tpAniSirGlobal pMac, __func__, __LINE__); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pMsg, sizeof(tSirDeltsReq)); /* get pointer to the TSPEC being deleted */ pSession = &sme_qos_cb.sessionInfo[sessionId]; pACInfo = &pSession->ac_info[ac]; diff --git a/core/sme/src/rrm/sme_rrm.c b/core/sme/src/rrm/sme_rrm.c index 9b86cf132557..b73c016176cc 100644 --- a/core/sme/src/rrm/sme_rrm.c +++ b/core/sme/src/rrm/sme_rrm.c @@ -195,7 +195,6 @@ sme_rrm_send_beacon_report_xmit_ind(tpAniSirGlobal mac_ctx, "Unable to allocate memory for beacon report"); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(beacon_rep, length); beacon_rep->messageType = eWNI_SME_BEACON_REPORT_RESP_XMIT_IND; beacon_rep->length = length; beacon_rep->uDialogToken = rrm_ctx->token; @@ -216,7 +215,6 @@ sme_rrm_send_beacon_report_xmit_ind(tpAniSirGlobal mac_ctx, if (NULL == beacon_rep->pBssDescription[i]) break; - qdf_mem_zero(beacon_rep->pBssDescription[i], tot_len); qdf_mem_copy(beacon_rep->pBssDescription[i], bss_desc, sizeof(tSirBssDescription)); qdf_mem_copy( @@ -446,7 +444,6 @@ static QDF_STATUS sme_rrm_send_scan_result(tpAniSirGlobal mac_ctx, sms_log(mac_ctx, LOGP, FL("qdf_mem_malloc failed")); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(filter.SSIDs.SSIDList, sizeof(tCsrSSIDInfo)); filter.SSIDs.SSIDList->SSID.length = rrm_ctx->ssId.length; @@ -535,7 +532,6 @@ static QDF_STATUS sme_rrm_send_scan_result(tpAniSirGlobal mac_ctx, sms_log(mac_ctx, LOG1, "Scan res timer:%lu, rrm scan timer:%lu", scan_results->timer, rrm_scan_timer); if (scan_results->timer >= rrm_scan_timer) { - qdf_mem_zero(roam_info, sizeof(*roam_info)); roam_info->pBssDesc = &scan_results->BssDescriptor; csr_roam_call_callback(mac_ctx, session_id, roam_info, 0, eCSR_ROAM_UPDATE_SCAN_RESULT, @@ -692,8 +688,6 @@ static QDF_STATUS sme_rrm_issue_scan_req(tpAniSirGlobal mac_ctx) FL("qdf_mem_malloc failed")); return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(scan_req.SSIDs.SSIDList, - sizeof(tCsrSSIDInfo)); scan_req.SSIDs.SSIDList->SSID.length = sme_rrm_ctx->ssId.length; qdf_mem_copy(scan_req.SSIDs.SSIDList->SSID.ssId, @@ -952,7 +946,6 @@ QDF_STATUS sme_rrm_neighbor_report_request(tpAniSirGlobal pMac, uint8_t sessionI return QDF_STATUS_E_NOMEM; } - qdf_mem_zero(pMsg, sizeof(tSirNeighborReportReqInd)); rrm_ll_purge_neighbor_cache(pMac, &pMac->rrm.rrmSmeContext.neighborReportCache); @@ -1183,8 +1176,6 @@ static QDF_STATUS sme_rrm_process_neighbor_report(tpAniSirGlobal pMac, } - qdf_mem_zero(pNeighborReportDesc, - sizeof(tRrmNeighborReportDesc)); pNeighborReportDesc->pNeighborBssDescription = qdf_mem_malloc(sizeof(tSirNeighborBssDescription)); if (NULL == pNeighborReportDesc->pNeighborBssDescription) { @@ -1194,8 +1185,6 @@ static QDF_STATUS sme_rrm_process_neighbor_report(tpAniSirGlobal pMac, status = QDF_STATUS_E_NOMEM; goto end; } - qdf_mem_zero(pNeighborReportDesc->pNeighborBssDescription, - sizeof(tSirNeighborBssDescription)); qdf_mem_copy(pNeighborReportDesc->pNeighborBssDescription, &pNeighborRpt->sNeighborBssDescription[i], sizeof(tSirNeighborBssDescription)); diff --git a/core/utils/epping/src/epping_helper.c b/core/utils/epping/src/epping_helper.c index 43575ea132a1..4e6b6257b126 100644 --- a/core/utils/epping/src/epping_helper.c +++ b/core/utils/epping/src/epping_helper.c @@ -68,9 +68,6 @@ int epping_cookie_init(epping_context_t *pEpping_ctx) i); goto error; } - qdf_mem_zero(pEpping_ctx->s_cookie_mem[i], - sizeof(struct epping_cookie) * - MAX_COOKIE_SLOT_SIZE); } qdf_spinlock_create(&pEpping_ctx->cookie_lock); diff --git a/core/utils/host_diag_log/src/host_diag_log.c b/core/utils/host_diag_log/src/host_diag_log.c index 2fd1b3566fc9..2e90f40a1dce 100644 --- a/core/utils/host_diag_log/src/host_diag_log.c +++ b/core/utils/host_diag_log/src/host_diag_log.c @@ -140,8 +140,6 @@ void host_diag_log_submit(void *plog_hdr_ptr) return; } - qdf_mem_zero((void *)pBuf, total_len); - wmsg = (tAniHdr *) pBuf; wmsg->type = PTT_MSG_DIAG_CMDS_TYPE; wmsg->length = total_len; diff --git a/core/utils/host_diag_log/src/i_host_diag_core_log.h b/core/utils/host_diag_log/src/i_host_diag_core_log.h index 829ae193034e..9417837b8a34 100644 --- a/core/utils/host_diag_log/src/i_host_diag_core_log.h +++ b/core/utils/host_diag_log/src/i_host_diag_core_log.h @@ -85,7 +85,6 @@ void host_diag_log_submit(void *plog_hdr_ptr); do { \ payload_ptr = (payload_type *)qdf_mem_malloc(sizeof(payload_type)); \ if (payload_ptr) { \ - qdf_mem_zero(payload_ptr, sizeof(payload_type)); \ host_diag_log_set_code(payload_ptr, log_code); \ host_diag_log_set_length(payload_ptr, sizeof(payload_type)); \ } \ diff --git a/core/utils/logging/inc/wlan_logging_sock_svc.h b/core/utils/logging/inc/wlan_logging_sock_svc.h index e2d0544f776a..af85ab694352 100644 --- a/core/utils/logging/inc/wlan_logging_sock_svc.h +++ b/core/utils/logging/inc/wlan_logging_sock_svc.h @@ -77,4 +77,10 @@ static inline void wlan_report_log_completion(uint32_t is_fatal, } #endif /* FEATURE_WLAN_DIAG_SUPPORT */ + +void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data); + +void wlan_deregister_txrx_packetdump(void); +void wlan_register_txrx_packetdump(void); + #endif /* WLAN_LOGGING_SOCK_SVC_H */ diff --git a/core/utils/logging/src/wlan_logging_sock_svc.c b/core/utils/logging/src/wlan_logging_sock_svc.c index 972a97867167..cbd8c8f36219 100644 --- a/core/utils/logging/src/wlan_logging_sock_svc.c +++ b/core/utils/logging/src/wlan_logging_sock_svc.c @@ -37,9 +37,39 @@ #include #include #include -#include "pktlog_ac.h" #include #include "cds_utils.h" +#include "host_diag_core_log.h" +#include "wma.h" +#include "ol_txrx_api.h" +#include "csr_api.h" +#include "wlan_hdd_main.h" +#include "pktlog_ac.h" + +#define MAX_NUM_PKT_LOG 32 + +/** + * struct tx_status - tx status + * @tx_status_ok: successfully sent + acked + * @tx_status_discard: discard - not sent (congestion control) + * @tx_status_no_ack: no_ack - sent, but no ack + * @tx_status_download_fail: download_fail - + * the host could not deliver the tx frame to the target + * @tx_status_peer_del: peer_del - tx completion for + * alreay deleted peer used for HL case + * + * This enum has tx status types + */ +enum tx_status { + tx_status_ok, + tx_status_discard, + tx_status_no_ack, + tx_status_download_fail, + tx_status_peer_del, +}; + +static uint8_t gtx_count; +static uint8_t grx_count; #define LOGGING_TRACE(level, args ...) \ QDF_TRACE(QDF_MODULE_ID_HDD, level, ## args) @@ -49,10 +79,14 @@ #define ANI_NL_MSG_LOG_TYPE 89 #define ANI_NL_MSG_READY_IND_TYPE 90 #define MAX_LOGMSG_LENGTH 4096 +#define MAX_PKTSTATS_LENGTH 2048 +#define MAX_PKTSTATS_BUFF 16 #define HOST_LOG_DRIVER_MSG 0x001 #define HOST_LOG_PER_PKT_STATS 0x002 #define HOST_LOG_FW_FLUSH_COMPLETE 0x003 +#define DIAG_TYPE_LOGS 1 +#define PTT_MSG_DIAG_CMDS_TYPE 0x5050 struct log_msg { struct list_head node; @@ -67,6 +101,32 @@ struct log_msg { char logbuf[MAX_LOGMSG_LENGTH]; }; +/** + * struct packet_dump - This data structure contains the + * Tx/Rx packet stats + * @status: Status + * @type: Type + * @driver_ts: driver timestamp + * @fw_ts: fw timestamp + */ +struct packet_dump { + unsigned char status; + unsigned char type; + uint32_t driver_ts; + uint16_t fw_ts; +} __attribute__((__packed__)); + +/** + * struct pkt_stats_msg - This data structure contains the + * pkt stats node for link list + * @node: LinkList node + * @node: Pointer to skb + */ +struct pkt_stats_msg { + struct list_head node; + struct sk_buff *skb; +}; + struct wlan_logging { /* Log Fatal and ERROR to console */ bool log_fe_to_console; @@ -96,10 +156,18 @@ struct wlan_logging { bool is_active; /* Flush completion check */ bool is_flush_complete; + /* paramaters for pkt stats */ + struct list_head pkt_stat_free_list; + struct list_head pkt_stat_filled_list; + struct pkt_stats_msg *pkt_stats_pcur_node; + unsigned int pkt_stat_drop_cnt; + spinlock_t pkt_stats_lock; + unsigned int pkt_stats_msg_idx; }; static struct wlan_logging gwlan_logging; static struct log_msg *gplog_msg; +static struct pkt_stats_msg *gpkt_stats_buffers; /* PID of the APP to log the message */ static int gapp_pid = INVALID_PID; @@ -411,6 +479,144 @@ int wlan_log_to_user(QDF_TRACE_LEVEL log_level, char *to_be_sent, int length) return 0; } +/** + * pkt_stats_fill_headers() - This function adds headers to skb + * @skb: skb to which headers need to be added + * + * Return: 0 on success or Errno on failure + */ +static int pkt_stats_fill_headers(struct sk_buff *skb) +{ + struct host_log_pktlog_info cds_pktlog; + int cds_pkt_size = sizeof(struct host_log_pktlog_info); + tAniNlHdr msg_header; + int extra_header_len, nl_payload_len; + static int nlmsg_seq; + int diag_type; + + qdf_mem_zero(&cds_pktlog, cds_pkt_size); + cds_pktlog.version = VERSION_LOG_WLAN_PKT_LOG_INFO_C; + cds_pktlog.buf_len = skb->len; + cds_pktlog.seq_no = gwlan_logging.pkt_stats_msg_idx++; + host_diag_log_set_code(&cds_pktlog, LOG_WLAN_PKT_LOG_INFO_C); + host_diag_log_set_length(&cds_pktlog.log_hdr, skb->len + + cds_pkt_size); + + if (unlikely(skb_headroom(skb) < cds_pkt_size)) { + pr_err("VPKT [%d]: Insufficient headroom, head[%p], data[%p], req[%zu]", + __LINE__, skb->head, skb->data, sizeof(msg_header)); + return -EIO; + } + + qdf_mem_copy(skb_push(skb, cds_pkt_size), + &cds_pktlog, cds_pkt_size); + + if (unlikely(skb_headroom(skb) < sizeof(int))) { + pr_err("VPKT [%d]: Insufficient headroom, head[%p], data[%p], req[%zu]", + __LINE__, skb->head, skb->data, sizeof(int)); + return -EIO; + } + + diag_type = DIAG_TYPE_LOGS; + qdf_mem_copy(skb_push(skb, sizeof(int)), &diag_type, sizeof(int)); + + extra_header_len = sizeof(msg_header.radio) + sizeof(tAniHdr) + + sizeof(struct nlmsghdr); + nl_payload_len = extra_header_len + skb->len; + + msg_header.nlh.nlmsg_type = ANI_NL_MSG_PUMAC; + msg_header.nlh.nlmsg_len = nl_payload_len; + msg_header.nlh.nlmsg_flags = NLM_F_REQUEST; + msg_header.nlh.nlmsg_pid = 0; + msg_header.nlh.nlmsg_seq = nlmsg_seq++; + msg_header.radio = 0; + msg_header.wmsg.type = PTT_MSG_DIAG_CMDS_TYPE; + msg_header.wmsg.length = cpu_to_be16(skb->len); + + if (unlikely(skb_headroom(skb) < sizeof(msg_header))) { + pr_err("VPKT [%d]: Insufficient headroom, head[%p], data[%p], req[%zu]", + __LINE__, skb->head, skb->data, sizeof(msg_header)); + return -EIO; + } + + qdf_mem_copy(skb_push(skb, sizeof(msg_header)), &msg_header, + sizeof(msg_header)); + + return 0; +} + +/** + * pktlog_send_per_pkt_stats_to_user() - This function is used to send the per + * packet statistics to the user + * + * This function is used to send the per packet statistics to the user + * + * Return: Success if the message is posted to user + */ +int pktlog_send_per_pkt_stats_to_user(void) +{ + int ret = -1; + struct pkt_stats_msg *pstats_msg; + unsigned long flags; + struct sk_buff *skb_new = NULL; + static int rate_limit; + bool free_old_skb = false; + + while (!list_empty(&gwlan_logging.pkt_stat_filled_list) + && !gwlan_logging.exit) { + skb_new = dev_alloc_skb(MAX_PKTSTATS_LENGTH); + if (skb_new == NULL) { + if (!rate_limit) { + pr_err("%s: dev_alloc_skb() failed for msg size[%d] drop count = %u\n", + __func__, MAX_LOGMSG_LENGTH, + gwlan_logging.drop_count); + } + rate_limit = 1; + ret = -ENOMEM; + break; + } + + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + + pstats_msg = (struct pkt_stats_msg *) + (gwlan_logging.pkt_stat_filled_list.next); + list_del_init(gwlan_logging.pkt_stat_filled_list.next); + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + + ret = pkt_stats_fill_headers(pstats_msg->skb); + if (ret < 0) { + pr_err("%s failed to fill headers %d\n", __func__, ret); + free_old_skb = true; + goto err; + } + ret = nl_srv_bcast(pstats_msg->skb); + if (ret < 0) { + pr_info("%s: Send Failed %d drop_count = %u\n", + __func__, ret, + ++gwlan_logging.pkt_stat_drop_cnt); + } else { + ret = 0; + } +err: + /* + * Free old skb in case or error before assigning new skb + * to the free list. + */ + if (free_old_skb) + dev_kfree_skb(pstats_msg->skb); + + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + pstats_msg->skb = skb_new; + list_add_tail(&pstats_msg->node, + &gwlan_logging.pkt_stat_free_list); + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + ret = 0; + } + + return ret; + +} + static int send_filled_buffers_to_user(void) { int ret = -1; @@ -691,7 +897,7 @@ static int wlan_logging_proc_sock_rx_msg(struct sk_buff *skb) int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) { - int i = 0; + int i = 0, j, pkt_stats_size; unsigned long irq_flag; gapp_pid = INVALID_PID; @@ -720,6 +926,45 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) list_del_init(gwlan_logging.free_list.next); spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); + /* Initialize the pktStats data structure here */ + pkt_stats_size = sizeof(struct pkt_stats_msg); + gpkt_stats_buffers = vmalloc(MAX_PKTSTATS_BUFF * pkt_stats_size); + if (!gpkt_stats_buffers) { + pr_err("%s: Could not allocate memory for Pkt stats\n", + __func__); + goto err1; + } + qdf_mem_zero(gpkt_stats_buffers, + MAX_PKTSTATS_BUFF * pkt_stats_size); + + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + gwlan_logging.pkt_stats_msg_idx = 0; + INIT_LIST_HEAD(&gwlan_logging.pkt_stat_free_list); + INIT_LIST_HEAD(&gwlan_logging.pkt_stat_filled_list); + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + + + for (i = 0; i < MAX_PKTSTATS_BUFF; i++) { + gpkt_stats_buffers[i].skb = dev_alloc_skb(MAX_PKTSTATS_LENGTH); + if (gpkt_stats_buffers[i].skb == NULL) { + pr_err("%s: Memory alloc failed for skb", __func__); + /* free previously allocated skb and return */ + for (j = 0; j < i ; j++) + dev_kfree_skb(gpkt_stats_buffers[j].skb); + goto err2; + } + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + list_add(&gpkt_stats_buffers[i].node, + &gwlan_logging.pkt_stat_free_list); + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + } + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + gwlan_logging.pkt_stats_pcur_node = (struct pkt_stats_msg *) + (gwlan_logging.pkt_stat_free_list.next); + list_del_init(gwlan_logging.pkt_stat_free_list.next); + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + /* Pkt Stats intialization done */ + init_waitqueue_head(&gwlan_logging.wait_queue); gwlan_logging.exit = false; clear_bit(HOST_LOG_DRIVER_MSG, &gwlan_logging.eventFlag); @@ -731,12 +976,7 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) if (IS_ERR(gwlan_logging.thread)) { pr_err("%s: Could not Create LogMsg Thread Controller", __func__); - spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag); - gwlan_logging.pcur_node = NULL; - spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); - vfree(gplog_msg); - gplog_msg = NULL; - return -ENOMEM; + goto err3; } wake_up_process(gwlan_logging.thread); gwlan_logging.is_active = true; @@ -745,11 +985,31 @@ int wlan_logging_sock_activate_svc(int log_fe_to_console, int num_buf) nl_srv_register(ANI_NL_MSG_LOG, wlan_logging_proc_sock_rx_msg); return 0; + +err3: + for (i = 0; i < MAX_PKTSTATS_BUFF; i++) { + if (gpkt_stats_buffers[i].skb) + dev_kfree_skb(gpkt_stats_buffers[i].skb); + } +err2: + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + gwlan_logging.pkt_stats_pcur_node = NULL; + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + vfree(gpkt_stats_buffers); + gpkt_stats_buffers = NULL; +err1: + spin_lock_irqsave(&gwlan_logging.spin_lock, irq_flag); + gwlan_logging.pcur_node = NULL; + spin_unlock_irqrestore(&gwlan_logging.spin_lock, irq_flag); + vfree(gplog_msg); + gplog_msg = NULL; + return -ENOMEM; } int wlan_logging_sock_deactivate_svc(void) { unsigned long irq_flag; + int i = 0; if (!gplog_msg) return 0; @@ -775,14 +1035,29 @@ int wlan_logging_sock_deactivate_svc(void) vfree(gplog_msg); gplog_msg = NULL; + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, irq_flag); + gwlan_logging.pkt_stats_pcur_node = NULL; + gwlan_logging.pkt_stats_msg_idx = 0; + gwlan_logging.pkt_stat_drop_cnt = 0; + for (i = 0; i < MAX_PKTSTATS_BUFF; i++) { + if (gpkt_stats_buffers[i].skb) + dev_kfree_skb(gpkt_stats_buffers[i].skb); + } + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, irq_flag); + + vfree(gpkt_stats_buffers); + gpkt_stats_buffers = NULL; + return 0; } int wlan_logging_sock_init_svc(void) { spin_lock_init(&gwlan_logging.spin_lock); + spin_lock_init(&gwlan_logging.pkt_stats_lock); gapp_pid = INVALID_PID; gwlan_logging.pcur_node = NULL; + gwlan_logging.pkt_stats_pcur_node = NULL; return 0; } @@ -790,6 +1065,7 @@ int wlan_logging_sock_init_svc(void) int wlan_logging_sock_deinit_svc(void) { gwlan_logging.pcur_node = NULL; + gwlan_logging.pkt_stats_pcur_node = NULL; gapp_pid = INVALID_PID; return 0; @@ -867,4 +1143,363 @@ void wlan_flush_host_logs_for_fatal(void) } } +/** + * wlan_get_pkt_stats_free_node() - Get the free node for pkt stats + * + * This function is used to get the free node for pkt stats from + * free list/filles list + * + * Return: int + * + */ +static int wlan_get_pkt_stats_free_node(void) +{ + int ret = 0; + + list_add_tail(&gwlan_logging.pkt_stats_pcur_node->node, + &gwlan_logging.pkt_stat_filled_list); + + if (!list_empty(&gwlan_logging.pkt_stat_free_list)) { + /* Get buffer from free list */ + gwlan_logging.pkt_stats_pcur_node = + (struct pkt_stats_msg *)(gwlan_logging.pkt_stat_free_list.next); + list_del_init(gwlan_logging.pkt_stat_free_list.next); + } else if (!list_empty(&gwlan_logging.pkt_stat_filled_list)) { + /* Get buffer from filled list. This condition will drop the + * packet from being indicated to app + */ + gwlan_logging.pkt_stats_pcur_node = + (struct pkt_stats_msg *) + (gwlan_logging.pkt_stat_filled_list.next); + ++gwlan_logging.pkt_stat_drop_cnt; + /* print every 64th drop count */ + if (cds_is_multicast_logging() && + (!(gwlan_logging.pkt_stat_drop_cnt % 0x40))) { + pr_err("%s: drop_count = %u\n", + __func__, gwlan_logging.pkt_stat_drop_cnt); + } + list_del_init(gwlan_logging.pkt_stat_filled_list.next); + ret = 1; + } + + /* Reset the skb values, essential if dequeued from filled list */ + skb_trim(gwlan_logging.pkt_stats_pcur_node->skb, 0); + return ret; +} + +/** + * wlan_pkt_stats_to_logger_thread() - Add the pkt stats to SKB + * @pl_hdr: Pointer to pl_hdr + * @pkt_dump: Pointer to pkt_dump + * @data: Pointer to data + * + * This function adds the pktstats hdr and data to current + * skb node of free list. + * + * Return: None + */ +void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) +{ + struct ath_pktlog_hdr *pktlog_hdr; + struct packet_dump *pkt_stats_dump; + int total_stats_len = 0; + bool wake_up_thread = false; + unsigned long flags; + struct sk_buff *ptr; + int hdr_size; + + pktlog_hdr = (struct ath_pktlog_hdr *)pl_hdr; + + if (pktlog_hdr == NULL) { + pr_err("%s : Invalid pkt_stats_header\n", __func__); + return; + } + + pkt_stats_dump = (struct packet_dump *)pkt_dump; + total_stats_len = sizeof(struct ath_pktlog_hdr) + + pktlog_hdr->size; + + spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); + + if (!gwlan_logging.pkt_stats_pcur_node) { + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + return; + } + + /* Check if we can accommodate more log into current node/buffer */ + hdr_size = sizeof(struct host_log_pktlog_info) + + sizeof(tAniNlHdr); + if ((total_stats_len + hdr_size) >= + skb_tailroom(gwlan_logging.pkt_stats_pcur_node->skb)) { + wake_up_thread = true; + wlan_get_pkt_stats_free_node(); + } + + ptr = gwlan_logging.pkt_stats_pcur_node->skb; + qdf_mem_copy(skb_put(ptr, + sizeof(struct ath_pktlog_hdr)), + pktlog_hdr, + sizeof(struct ath_pktlog_hdr)); + + if (pkt_stats_dump) { + qdf_mem_copy(skb_put(ptr, + sizeof(struct packet_dump)), + pkt_stats_dump, + sizeof(struct packet_dump)); + pktlog_hdr->size -= sizeof(struct packet_dump); + } + + if (data) + qdf_mem_copy(skb_put(ptr, + pktlog_hdr->size), + data, pktlog_hdr->size); + + if (pkt_stats_dump->type == STOP_MONITOR) { + wake_up_thread = true; + wlan_get_pkt_stats_free_node(); + } + + spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); + + /* Wakeup logger thread */ + if (true == wake_up_thread) { + set_bit(HOST_LOG_PER_PKT_STATS, &gwlan_logging.eventFlag); + wake_up_interruptible(&gwlan_logging.wait_queue); + } +} + +/** + * driver_hal_status_map() - maps driver to hal + * status + * @status: status to be mapped + * + * This function is used to map driver to hal status + * + * Return: None + * + */ +static void driver_hal_status_map(uint8_t *status) +{ + switch (*status) { + case tx_status_ok: + *status = TX_PKT_FATE_ACKED; + break; + case tx_status_discard: + *status = TX_PKT_FATE_DRV_DROP_OTHER; + break; + case tx_status_no_ack: + *status = TX_PKT_FATE_SENT; + break; + case tx_status_download_fail: + *status = TX_PKT_FATE_FW_QUEUED; + break; + default: + *status = TX_PKT_FATE_DRV_DROP_OTHER; + break; + } +} + + +/* + * send_packetdump() - send packet dump + * @netbuf: netbuf + * @status: status of tx packet + * @vdev_id: virtual device id + * @type: type of packet + * + * This function is used to send packet dump to HAL layer + * using wlan_pkt_stats_to_logger_thread + * + * Return: None + * + */ +static void send_packetdump(qdf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + struct ath_pktlog_hdr pktlog_hdr = {0}; + struct packet_dump pd_hdr = {0}; + hdd_context_t *hdd_ctx; + hdd_adapter_t *adapter; + v_CONTEXT_t vos_ctx; + + vos_ctx = cds_get_global_context(); + if (!vos_ctx) + return; + + hdd_ctx = (hdd_context_t *)cds_get_context(QDF_MODULE_ID_HDD); + if (!hdd_ctx) + return; + + adapter = hdd_get_adapter_by_vdev(hdd_ctx, vdev_id); + + /* Send packet dump only for STA interface */ + if (adapter->device_mode != QDF_STA_MODE) + return; + + pktlog_hdr.log_type = PKTLOG_TYPE_PKT_DUMP; + pktlog_hdr.size = sizeof(pd_hdr) + netbuf->len; + + pd_hdr.status = status; + pd_hdr.type = type; + pd_hdr.driver_ts = qdf_get_monotonic_boottime(); + + if ((type == TX_MGMT_PKT) || (type == TX_DATA_PKT)) + gtx_count++; + else if ((type == RX_MGMT_PKT) || (type == RX_DATA_PKT)) + grx_count++; + + wlan_pkt_stats_to_logger_thread(&pktlog_hdr, &pd_hdr, netbuf->data); +} + + +/* + * send_packetdump_monitor() - sends start/stop packet dump indication + * @type: type of packet + * + * This function is used to indicate HAL layer to start/stop monitoring + * of packets + * + * Return: None + * + */ +static void send_packetdump_monitor(uint8_t type) +{ + struct ath_pktlog_hdr pktlog_hdr = {0}; + struct packet_dump pd_hdr = {0}; + + pktlog_hdr.log_type = PKTLOG_TYPE_PKT_DUMP; + pktlog_hdr.size = sizeof(pd_hdr); + + pd_hdr.type = type; + + LOGGING_TRACE(QDF_TRACE_LEVEL_INFO, + "fate Tx-Rx %s: type: %d", __func__, type); + + wlan_pkt_stats_to_logger_thread(&pktlog_hdr, &pd_hdr, NULL); +} + +/** + * wlan_deregister_txrx_packetdump() - tx/rx packet dump + * deregistration + * + * This function is used to deregister tx/rx packet dump callbacks + * with ol, pe and htt layers + * + * Return: None + * + */ +void wlan_deregister_txrx_packetdump(void) +{ + if (gtx_count || grx_count) { + ol_deregister_packetdump_callback(); + wma_deregister_packetdump_callback(); + send_packetdump_monitor(STOP_MONITOR); + csr_packetdump_timer_stop(); + + gtx_count = 0; + grx_count = 0; + } else + LOGGING_TRACE(QDF_TRACE_LEVEL_INFO, + "%s: deregistered packetdump already", __func__); +} + +/* + * check_txrx_packetdump_count() - function to check + * tx/rx packet dump global counts + * + * This function is used to check global counts of tx/rx + * packet dump functionality. + * + * Return: 1 if either gtx_count or grx_count reached 32 + * 0 otherwise + * + */ +static bool check_txrx_packetdump_count(void) +{ + if (gtx_count == MAX_NUM_PKT_LOG || + grx_count == MAX_NUM_PKT_LOG) { + LOGGING_TRACE(QDF_TRACE_LEVEL_INFO, + "%s gtx_count: %d grx_count: %d deregister packetdump", + __func__, gtx_count, grx_count); + wlan_deregister_txrx_packetdump(); + return 1; + } + return 0; +} + +/* + * tx_packetdump_cb() - tx packet dump callback + * @netbuf: netbuf + * @status: status of tx packet + * @vdev_id: virtual device id + * @type: packet type + * + * This function is used to send tx packet dump to HAL layer + * and deregister packet dump callbacks + * + * Return: None + * + */ +static void tx_packetdump_cb(qdf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + bool temp; + + temp = check_txrx_packetdump_count(); + if (temp) + return; + + driver_hal_status_map(&status); + send_packetdump(netbuf, status, vdev_id, type); +} + + +/* + * rx_packetdump_cb() - rx packet dump callback + * @netbuf: netbuf + * @status: status of rx packet + * @vdev_id: virtual device id + * @type: packet type + * + * This function is used to send rx packet dump to HAL layer + * and deregister packet dump callbacks + * + * Return: None + * + */ +static void rx_packetdump_cb(qdf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + bool temp; + + temp = check_txrx_packetdump_count(); + if (temp) + return; + + send_packetdump(netbuf, status, vdev_id, type); +} + + +/** + * wlan_register_txrx_packetdump() - tx/rx packet dump + * registration + * + * This function is used to register tx/rx packet dump callbacks + * with ol, pe and htt layers + * + * Return: None + * + */ +void wlan_register_txrx_packetdump(void) +{ + ol_register_packetdump_callback(tx_packetdump_cb, + rx_packetdump_cb); + wma_register_packetdump_callback(tx_packetdump_cb, + rx_packetdump_cb); + send_packetdump_monitor(START_MONITOR); + + gtx_count = 0; + grx_count = 0; +} + #endif /* WLAN_LOGGING_SOCK_SVC_ENABLE */ diff --git a/core/utils/pktlog/linux_ac.c b/core/utils/pktlog/linux_ac.c index f885d6672038..37c8c87dc691 100644 --- a/core/utils/pktlog/linux_ac.c +++ b/core/utils/pktlog/linux_ac.c @@ -543,139 +543,6 @@ static int pktlog_release(struct inode *i, struct file *f) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #endif -/** - * pktlog_send_per_pkt_stats_to_user() - This function is used to send the per - * packet statistics to the user - * - * This function is used to send the per packet statistics to the user - * - * Return: Success if the message is posted to user - * - */ -int pktlog_send_per_pkt_stats_to_user(void) -{ - ssize_t ret_val; - struct host_log_pktlog_info *pktlog = NULL; - ol_txrx_pdev_handle txrx_pdev = - cds_get_context(QDF_MODULE_ID_TXRX); - struct ath_pktlog_info *pl_info; - bool read_complete; - uint32_t num_bytes_read = 0; - - /* - * We do not want to do this packet stats related processing when - * packet log tool is run. i.e., we want this processing to be - * done only when start logging command of packet stats is initiated. - */ - if ((cds_get_ring_log_level(RING_ID_PER_PACKET_STATS) < - WLAN_LOG_LEVEL_ACTIVE)) { - printk(PKTLOG_TAG " %s: Shouldnt happen. Logging not started\n", - __func__); - return -EINVAL; - } - - if (!txrx_pdev) { - printk(PKTLOG_TAG " %s: Invalid TxRx handle\n", __func__); - return -EINVAL; - } - - pl_info = txrx_pdev->pl_dev->pl_info; - - if (!pl_info || !pl_info->buf) { - printk(PKTLOG_TAG " %s: Shouldnt happen. pl_info is invalid\n", - __func__); - return -EINVAL; - } - - if (pl_info->buf->rd_offset == -1) { - printk(PKTLOG_TAG " %s: Shouldnt happen. No write yet!\n", - __func__); - return -EINVAL; - } - - do { - pktlog = (struct host_log_pktlog_info *) - qdf_mem_malloc(sizeof(struct host_log_pktlog_info) + - VOS_LOG_PKT_LOG_SIZE); - if (!pktlog) { - printk(PKTLOG_TAG " %s: Memory allocation failed\n", - __func__); - return -ENOMEM; - } - - qdf_mem_zero(pktlog, VOS_LOG_PKT_LOG_SIZE); - host_diag_log_set_code(pktlog, LOG_WLAN_PKT_LOG_INFO_C); - - pktlog->buf_len = 0; - pktlog->version = VERSION_LOG_WLAN_PKT_LOG_INFO_C; - - /* - * @ret_val: ret_val gives the actual data read from the buffer. - * When there is no more data to read, this value will be zero - * @offset: offset in the ring buffer. Initially it is zero and - * is incremented during every read based on number of bytes - * read - */ - ret_val = pktlog_read_proc_entry(pktlog->buf, - VOS_LOG_PKT_LOG_SIZE, - &pl_info->buf->offset, - pl_info, &read_complete); - if (ret_val) { - int index = 0; - struct ath_pktlog_hdr *temp; - while (1) { - if ((ret_val - index) < - sizeof(struct ath_pktlog_hdr)) { - /* Partial header */ - pl_info->buf->offset -= - (ret_val - index); - ret_val = index; - break; - } - temp = (struct ath_pktlog_hdr *) - (pktlog->buf + index); - if ((ret_val - index) < (temp->size + - sizeof(struct ath_pktlog_hdr))) { - /* Partial record payload */ - pl_info->buf->offset -= - (ret_val - index); - ret_val = index; - break; - } - index += temp->size + - sizeof(struct ath_pktlog_hdr); - } - } - - /* Data will include message index/seq number and buf length */ - pktlog->buf_len = ret_val; - if (ret_val) { - host_diag_log_set_length(pktlog, ret_val + - sizeof(struct host_log_pktlog_info)); - pktlog->seq_no = pl_info->buf->msg_index++; - WLAN_HOST_DIAG_LOG_REPORT(pktlog); - } else { - qdf_mem_free(pktlog); - } - num_bytes_read += ret_val; - - /* - * If the logger thread is scheduled late and the proc entry - * is having too much data to be read, we might start to starve - * the other threads if we continuously keep reading the proc - * entry. So, having a threshold to break this read from proc - * entry. - */ - if (num_bytes_read > HOST_LOG_PKT_LOG_THRESHOLD) { - read_complete = true; - printk(PKTLOG_TAG " %s: Break read to prevent starve\n", - __func__); - } - } while (read_complete == false); - - return 0; -} - /** * pktlog_read_proc_entry() - This function is used to read data from the * proc entry into the readers buffer @@ -985,8 +852,9 @@ int pktlog_fault(struct vm_area_struct *vma, struct vm_fault *vmf) get_page(virt_to_page((void *)address)); vmf->page = virt_to_page((void *)address); - return VM_FAULT_MINOR; + return 0; } + static struct vm_operations_struct pktlog_vmops = { open: pktlog_vopen, close:pktlog_vclose, diff --git a/core/utils/pktlog/pktlog_ac.c b/core/utils/pktlog/pktlog_ac.c index dc7d0927fcb6..a4479ddef70d 100644 --- a/core/utils/pktlog/pktlog_ac.c +++ b/core/utils/pktlog/pktlog_ac.c @@ -484,12 +484,15 @@ int pktlog_setsize(struct hif_opaque_softc *scn, int32_t size) if (size < 0) return -EINVAL; - if (size == pl_info->buf_size) + if (size == pl_info->buf_size) { + qdf_print("%s: Pktlog Buff Size is already of same size.", + __func__); return 0; + } if (pl_info->log_state) { - printk - ("Logging should be disabled before changing bufer size\n"); + qdf_print("%s: Logging should be disabled before changing" + "buffer size.", __func__); return -EINVAL; } @@ -505,8 +508,10 @@ int pktlog_setsize(struct hif_opaque_softc *scn, int32_t size) pl_dev->tgt_pktlog_alloced = false; } - if (size != 0) + if (size != 0) { + qdf_print("%s: New Pktlog Buff Size is %d\n", __func__, size); pl_info->buf_size = size; + } return 0; } diff --git a/core/utils/pktlog/pktlog_internal.c b/core/utils/pktlog/pktlog_internal.c index 27549c7cfb05..0e58acf4c802 100644 --- a/core/utils/pktlog/pktlog_internal.c +++ b/core/utils/pktlog/pktlog_internal.c @@ -206,15 +206,6 @@ char *pktlog_getbuf(struct ol_pktlog_dev_t *pl_dev, PKTLOG_UNLOCK(pl_info); } - /* - * We do not want to do this packet stats related processing when - * packet log tool is run. i.e., we want this processing to be - * done only when start logging command of packet stats is initiated. - */ - if (cds_get_ring_log_level(RING_ID_PER_PACKET_STATS) == - WLAN_LOG_LEVEL_ACTIVE) - pktlog_check_threshold(pl_info, log_size); - return plarg.buf; } @@ -426,6 +417,9 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) ((void *)data + sizeof(struct ath_pktlog_hdr)), pl_hdr.size); + pl_hdr.size = log_size; + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + txdesc_hdr_ctl); } if (pl_hdr.log_type == PKTLOG_TYPE_TX_STAT) { @@ -439,6 +433,8 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) qdf_mem_copy(txstat_log.ds_status, ((void *)data + sizeof(struct ath_pktlog_hdr)), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + txstat_log.ds_status); } return A_OK; } @@ -544,6 +540,9 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) qdf_assert(txctl_log.txdesc_hdr_ctl); qdf_mem_copy(txctl_log.txdesc_hdr_ctl, &txctl_log.priv, sizeof(txctl_log.priv)); + pl_hdr.size = log_size; + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + txctl_log.txdesc_hdr_ctl); /* Add Protocol information and HT specific information */ } @@ -557,6 +556,8 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) qdf_mem_copy(txstat_log.ds_status, ((void *)data + sizeof(struct ath_pktlog_hdr)), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + txstat_log.ds_status); } if (pl_hdr.log_type == PKTLOG_TYPE_TX_MSDU_ID) { @@ -576,6 +577,8 @@ A_STATUS process_tx_info(struct ol_txrx_pdev_t *txrx_pdev, void *data) sizeof(pl_msdu_info.priv.msdu_id_info)); qdf_mem_copy(pl_msdu_info.ath_msdu_info, &pl_msdu_info.priv, sizeof(pl_msdu_info.priv)); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + pl_msdu_info.ath_msdu_info); } return A_OK; } @@ -635,6 +638,8 @@ A_STATUS process_rx_info_remote(void *pdev, void *data) log_size, &pl_hdr); qdf_mem_copy(rxstat_log.rx_desc, (void *)rx_desc + sizeof(struct htt_host_fw_desc_base), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, + rxstat_log.rx_desc); msdu = qdf_nbuf_next(msdu); } return A_OK; @@ -684,6 +689,7 @@ A_STATUS process_rx_info(void *pdev, void *data) qdf_mem_copy(rxstat_log.rx_desc, (void *)data + sizeof(struct ath_pktlog_hdr), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rxstat_log.rx_desc); return A_OK; } @@ -748,6 +754,7 @@ A_STATUS process_rate_find(void *pdev, void *data) qdf_mem_copy(rcf_log.rcFind, ((char *)data + sizeof(struct ath_pktlog_hdr)), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcf_log.rcFind); return A_OK; } @@ -880,6 +887,7 @@ A_STATUS process_rate_update(void *pdev, void *data) qdf_mem_copy(rcu_log.txRateCtrl, ((char *)data + sizeof(struct ath_pktlog_hdr)), pl_hdr.size); + cds_pkt_stats_to_logger_thread(&pl_hdr, NULL, rcu_log.txRateCtrl); return A_OK; } #endif /*REMOVE_PKT_LOG */ diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index b8468bb672e5..bda463e010c6 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -511,6 +511,9 @@ typedef void (*encrypt_decrypt_cb)(struct sir_encrypt_decrypt_rsp_params *encrypt_decrypt_rsp_params); +typedef void (*tp_wma_packetdump_cb)(qdf_nbuf_t netbuf, + uint8_t status, uint8_t vdev_id, uint8_t type); + /** * enum t_wma_drv_type - wma driver type * @WMA_DRIVER_TYPE_PRODUCTION: production driver type @@ -1191,6 +1194,7 @@ struct wmi_desc_t { pWMAAckFnTxComp ota_post_proc_cb; qdf_nbuf_t nbuf; uint32_t desc_id; + uint8_t vdev_id; }; /** @@ -1602,6 +1606,9 @@ typedef struct { QDF_STATUS (*pe_ndp_event_handler)(tpAniSirGlobal mac_ctx, cds_msg_t *msg); bool sub_20_support; + + tp_wma_packetdump_cb wma_mgmt_tx_packetdump_cb; + tp_wma_packetdump_cb wma_mgmt_rx_packetdump_cb; } t_wma_handle, *tp_wma_handle; /** @@ -2324,3 +2331,7 @@ QDF_STATUS wma_start_oem_data_req(tp_wma_handle wma_handle, QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma_handle, uint8_t val); +void wma_register_packetdump_callback( + tp_wma_packetdump_cb wma_mgmt_tx_packetdump_cb, + tp_wma_packetdump_cb wma_mgmt_rx_packetdump_cb); +void wma_deregister_packetdump_callback(void); diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 58d34ec38724..e321cd1af6d2 100644 --- a/core/wma/inc/wma_api.h +++ b/core/wma/inc/wma_api.h @@ -299,8 +299,17 @@ void wma_process_pdev_hw_mode_trans_ind(void *wma, wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param, wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry, struct sir_hw_mode_trans_ind *hw_mode_trans_ind); + +#ifdef WLAN_FEATURE_DISA QDF_STATUS wma_encrypt_decrypt_msg(WMA_HANDLE wma, struct encrypt_decrypt_req_params *encrypt_decrypt_params); +#else +static inline QDF_STATUS wma_encrypt_decrypt_msg(WMA_HANDLE wma, + struct encrypt_decrypt_req_params *encrypt_decrypt_params) +{ + return 0; +} +#endif /** * wma_set_cts2self_for_p2p_go() - set CTS2SELF command for P2P GO. diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index f35044e57d4a..a35254ae321b 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -1214,7 +1214,15 @@ QDF_STATUS wma_process_hal_pwr_dbg_cmd(WMA_HANDLE handle, struct sir_mac_pwr_dbg_cmd * sir_pwr_dbg_params); +#ifdef WLAN_FEATURE_DISA int wma_encrypt_decrypt_msg_handler(void *handle, uint8_t *data, uint32_t data_len); +#else +static inline int wma_encrypt_decrypt_msg_handler(void *handle, uint8_t *data, + uint32_t data_len) +{ + return 0; +} +#endif #endif diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index abdf3633bef8..84674c38f268 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -1556,11 +1556,6 @@ QDF_STATUS wma_tx_detach(tp_wma_handle wma_handle) NULL, txrx_pdev); } } - /* Destroy Tx Frame Complete event */ - qdf_event_destroy(&wma_handle->tx_frm_download_comp_event); - - /* Tx queue empty check event (dummy event) */ - qdf_event_destroy(&wma_handle->tx_queue_empty_event); /* Reset Tx Frm Callbacks */ wma_handle->tx_frm_download_comp_cb = NULL; @@ -2836,6 +2831,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, status = QDF_STATUS_E_FAILURE; } else { mgmt_param.desc_id = wmi_desc->desc_id; + wmi_desc->vdev_id = vdev_id; status = wmi_mgmt_unified_cmd_send( wma_handle->wmi_handle, &mgmt_param); @@ -2974,7 +2970,6 @@ void ol_rx_err(ol_pdev_handle pdev, uint8_t vdev_id, __func__); return; } - qdf_mem_set((void *)mic_err_ind, sizeof(*mic_err_ind), 0); mic_err_ind->messageType = eWNI_SME_MIC_FAILURE_IND; mic_err_ind->length = sizeof(*mic_err_ind); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 49a7a0993cfa..55e33bb22839 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -696,7 +696,6 @@ static void wma_vdev_start_rsp(tp_wma_handle wma, add_bss->status = QDF_STATUS_E_NOMEM; goto send_fail_resp; } - qdf_mem_zero(bcn, sizeof(*bcn)); bcn->buf = qdf_nbuf_alloc(NULL, WMA_BCN_BUF_MAX_SIZE, 0, sizeof(uint32_t), 0); if (!bcn->buf) { @@ -3413,6 +3412,20 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta) WMA_LOGE("%s: Peer already exists, Deleted peer with peer_addr %pM", __func__, add_sta->staMac); } + /* The code above only checks the peer existence on its own vdev. + * Need to check whether the peer exists on other vDevs because firmware + * can't create the peer if the peer with same MAC address already + * exists on the pDev. As this peer belongs to other vDevs, just return + * here. + */ + peer = ol_txrx_find_peer_by_addr(pdev, add_sta->staMac, &peer_id); + if (peer) { + WMA_LOGE("%s: My vdev:%d, but Peer exists on other vdev with " + "peer_addr %pM and peer_id %d", + __func__, vdev->vdev_id, add_sta->staMac, peer_id); + add_sta->status = QDF_STATUS_E_FAILURE; + goto send_rsp; + } status = wma_create_peer(wma, pdev, vdev, add_sta->staMac, WMI_PEER_TYPE_DEFAULT, add_sta->smesessionId, @@ -3641,7 +3654,6 @@ static void wma_add_tdls_sta(tp_wma_handle wma, tpAddStaParams add_sta) goto send_rsp; } - qdf_mem_zero(peerStateParams, sizeof(*peerStateParams)); peerStateParams->peerState = WMI_TDLS_PEER_STATE_PEERING; peerStateParams->vdevId = add_sta->smesessionId; qdf_mem_copy(&peerStateParams->peerMacAddr, @@ -4050,7 +4062,6 @@ static void wma_del_tdls_sta(tp_wma_handle wma, tpDeleteStaParams del_sta) goto send_del_rsp; } - qdf_mem_zero(peerStateParams, sizeof(*peerStateParams)); peerStateParams->peerState = WMA_TDLS_PEER_STATE_TEARDOWN; peerStateParams->vdevId = del_sta->smesessionId; qdf_mem_copy(&peerStateParams->peerMacAddr, diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 05777be24c10..a2cef423385b 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -175,7 +175,6 @@ QDF_STATUS wma_send_snr_request(tp_wma_handle wma_handle, wma_handle->pGetRssiReq = NULL; return QDF_STATUS_E_NOMEM; } - qdf_mem_set(pRssiBkUp, sizeof(tAniGetRssiReq), 0); pRssiBkUp->sessionId = ((tAniGetRssiReq *) pGetRssiReq)->sessionId; pRssiBkUp->rssiCallback = @@ -2746,22 +2745,20 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, uint16_t ether_type = (uint16_t)(*(uint16_t *)(data + QDF_NBUF_TRAC_ETH_TYPE_OFFSET)); - WMA_LOGE("Ether Type: 0x%04x", + WMA_LOGD("Ether Type: 0x%04x", ani_cpu_to_be16(ether_type)); if (QDF_NBUF_TRAC_EAPOL_ETH_TYPE == ani_cpu_to_be16(ether_type)) { if (len >= WMA_EAPOL_SUBTYPE_GET_MIN_LEN) return qdf_nbuf_data_get_eapol_subtype(data); - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "EAPOL Packet"); + WMA_LOGD("EAPOL Packet"); return QDF_PROTO_INVALID; } else if (QDF_NBUF_TRAC_ARP_ETH_TYPE == ani_cpu_to_be16(ether_type)) { if (len >= WMA_ARP_SUBTYPE_GET_MIN_LEN) return qdf_nbuf_data_get_arp_subtype(data); - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "ARP Packet"); + WMA_LOGD("ARP Packet"); return QDF_PROTO_INVALID; } else if (QDF_NBUF_TRAC_IPV4_ETH_TYPE == ani_cpu_to_be16(ether_type)) { @@ -2769,13 +2766,12 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, uint8_t proto_type; proto_type = qdf_nbuf_data_get_ipv4_proto(data); - WMA_LOGE("IPV4_proto_type: %u", proto_type); + WMA_LOGD("IPV4_proto_type: %u", proto_type); if (proto_type == QDF_NBUF_TRAC_ICMP_TYPE) { if (len >= WMA_ICMP_SUBTYPE_GET_MIN_LEN) return qdf_nbuf_data_get_icmp_subtype( data); - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "ICMP Packet"); + WMA_LOGD("ICMP Packet"); return QDF_PROTO_INVALID; } else if (proto_type == QDF_NBUF_TRAC_UDP_TYPE) { if (len >= WMA_IS_DHCP_GET_MIN_LEN) { @@ -2783,9 +2779,7 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, if (len >= WMA_DHCP_SUBTYPE_GET_MIN_LEN) return qdf_nbuf_data_get_dhcp_subtype(data); - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, - "DHCP Packet"); + WMA_LOGD("DHCP Packet"); return QDF_PROTO_INVALID; } } @@ -2794,8 +2788,7 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, return QDF_PROTO_IPV4_TCP; } } - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "IPV4 Packet"); + WMA_LOGD("IPV4 Packet"); return QDF_PROTO_INVALID; } else if (QDF_NBUF_TRAC_IPV6_ETH_TYPE == ani_cpu_to_be16(ether_type)) { @@ -2803,13 +2796,12 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, uint8_t proto_type; proto_type = qdf_nbuf_data_get_ipv6_proto(data); - WMA_LOGE("IPV6_proto_type: %u", proto_type); + WMA_LOGD("IPV6_proto_type: %u", proto_type); if (proto_type == QDF_NBUF_TRAC_ICMPV6_TYPE) { if (len >= WMA_ICMPV6_SUBTYPE_GET_MIN_LEN) return qdf_nbuf_data_get_icmpv6_subtype( data); - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "ICMPV6 Packet"); + WMA_LOGD("ICMPV6 Packet"); return QDF_PROTO_INVALID; } else if (proto_type == QDF_NBUF_TRAC_UDP_TYPE) { return QDF_PROTO_IPV6_UDP; @@ -2817,8 +2809,7 @@ wma_wow_get_pkt_proto_subtype(uint8_t *data, return QDF_PROTO_IPV6_TCP; } } - QDF_TRACE(QDF_MODULE_ID_WMA, - QDF_TRACE_LEVEL_ERROR, "IPV6 Packet"); + WMA_LOGD("IPV6 Packet"); return QDF_PROTO_INVALID; } @@ -2847,7 +2838,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, WMA_LOGD("wow_buf_pkt_len: %u", buf_len); if (buf_len >= QDF_NBUF_TRAC_IPV4_OFFSET) - WMA_LOGE("Src_mac: " MAC_ADDRESS_STR " Dst_mac: " MAC_ADDRESS_STR, + WMA_LOGD("Src_mac: " MAC_ADDRESS_STR " Dst_mac: " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(data + QDF_NBUF_SRC_MAC_OFFSET), MAC_ADDR_ARRAY(data + QDF_NBUF_DEST_MAC_OFFSET)); else @@ -2859,14 +2850,14 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_EAPOL_M2: case QDF_PROTO_EAPOL_M3: case QDF_PROTO_EAPOL_M4: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_EAPOL_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET)); key_len = (uint16_t)(*(uint16_t *)(data + EAPOL_KEY_LEN_OFFSET)); - WMA_LOGE("Pkt_len: %u, Key_len: %u", + WMA_LOGD("Pkt_len: %u, Key_len: %u", ani_cpu_to_be16(pkt_len), ani_cpu_to_be16(key_len)); } @@ -2880,14 +2871,14 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_DHCP_RELEASE: case QDF_PROTO_DHCP_INFORM: case QDF_PROTO_DHCP_DECLINE: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_DHCP_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + DHCP_PKT_LEN_OFFSET)); transaction_id = (uint32_t)(*(uint32_t *)(data + DHCP_TRANSACTION_ID_OFFSET)); - WMA_LOGE("Pkt_len: %u, Transaction_id: %u", + WMA_LOGD("Pkt_len: %u, Transaction_id: %u", ani_cpu_to_be16(pkt_len), ani_cpu_to_be16(transaction_id)); } @@ -2895,20 +2886,20 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_ARP_REQ: case QDF_PROTO_ARP_RES: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); break; case QDF_PROTO_ICMP_REQ: case QDF_PROTO_ICMP_RES: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_IPV4_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV4_PKT_LEN_OFFSET)); seq_num = (uint16_t)(*(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET)); - WMA_LOGE("Pkt_len: %u, Seq_num: %u", + WMA_LOGD("Pkt_len: %u, Seq_num: %u", ani_cpu_to_be16(pkt_len), ani_cpu_to_be16(seq_num)); } @@ -2916,14 +2907,14 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_ICMPV6_REQ: case QDF_PROTO_ICMPV6_RES: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_IPV6_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV6_PKT_LEN_OFFSET)); seq_num = (uint16_t)(*(uint16_t *)(data + ICMPV6_SEQ_NUM_OFFSET)); - WMA_LOGE("Pkt_len: %u, Seq_num: %u", + WMA_LOGD("Pkt_len: %u, Seq_num: %u", ani_cpu_to_be16(pkt_len), ani_cpu_to_be16(seq_num)); } @@ -2931,7 +2922,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_IPV4_UDP: case QDF_PROTO_IPV4_TCP: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_IPV4_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + @@ -2940,15 +2931,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, IPV4_SRC_PORT_OFFSET)); dst_port = (uint16_t)(*(uint16_t *)(data + IPV4_DST_PORT_OFFSET)); - WMA_LOGE("Pkt_len: %u", + WMA_LOGD("Pkt_len: %u", ani_cpu_to_be16(pkt_len)); - WMA_LOGE("src_port: %u, dst_port: %u", + WMA_LOGD("src_port: %u, dst_port: %u", ani_cpu_to_be16(src_port), ani_cpu_to_be16(dst_port)); if (proto_subtype == QDF_PROTO_IPV4_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET)); - WMA_LOGE("TCP_seq_num: %u", + WMA_LOGD("TCP_seq_num: %u", ani_cpu_to_be16(tcp_seq_num)); } } @@ -2956,7 +2947,7 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, case QDF_PROTO_IPV6_UDP: case QDF_PROTO_IPV6_TCP: - WMA_LOGE("WOW Wakeup: %s rcvd", + WMA_LOGD("WOW Wakeup: %s rcvd", wma_pkt_proto_subtype_to_string(proto_subtype)); if (buf_len >= WMA_IPV6_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + @@ -2965,15 +2956,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, IPV6_SRC_PORT_OFFSET)); dst_port = (uint16_t)(*(uint16_t *)(data + IPV6_DST_PORT_OFFSET)); - WMA_LOGE("Pkt_len: %u", + WMA_LOGD("Pkt_len: %u", ani_cpu_to_be16(pkt_len)); - WMA_LOGE("src_port: %u, dst_port: %u", + WMA_LOGD("src_port: %u, dst_port: %u", ani_cpu_to_be16(src_port), ani_cpu_to_be16(dst_port)); if (proto_subtype == QDF_PROTO_IPV6_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET)); - WMA_LOGE("TCP_seq_num: %u", + WMA_LOGD("TCP_seq_num: %u", ani_cpu_to_be16(tcp_seq_num)); } } @@ -7555,6 +7546,7 @@ int wma_dfs_indicate_radar(struct ieee80211com *ic, qdf_mem_malloc(sizeof(struct wma_dfs_radar_indication)); if (radar_event == NULL) { WMA_LOGE(FL("Failed to allocate memory for radar_event")); + qdf_spin_unlock_bh(&ic->chan_lock); return -ENOMEM; } wma->dfs_ic->last_radar_found_chan = ichan->ic_ieee; @@ -8288,6 +8280,7 @@ QDF_STATUS wma_enable_disable_caevent_ind(tp_wma_handle wma, uint8_t val) return QDF_STATUS_SUCCESS; } +#ifdef WLAN_FEATURE_DISA /** * wma_encrypt_decrypt_msg() - * @encrypt_decrypt_params: encryption/decryption params @@ -8392,3 +8385,4 @@ int wma_encrypt_decrypt_msg_handler(void *handle, uint8_t *data, return 0; } +#endif diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index fa9198feb700..98eadc66cbb8 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -1672,6 +1672,25 @@ static void wma_init_max_no_of_peers(tp_wma_handle wma_handle, cfg->max_no_of_peers = max_peers; } +/** + * wma_shutdown_notifier_cb - Shutdown notifer call back + * @priv : WMA handle + * + * During recovery, WMA may wait for resume to complete if the crash happens + * while in suspend. This may cause delays in completing the recovery. This call + * back would be called during recovery and the event is completed so that if + * the resume is waiting on FW to respond then it can get out of the wait so + * that recovery thread can start bringing down all the modules. + * + * Return: None + */ +static void wma_shutdown_notifier_cb(void *priv) +{ + tp_wma_handle wma_handle = priv; + + qdf_event_set(&wma_handle->wma_resume_event); +} + struct wma_version_info g_wmi_version_info; /** @@ -2097,6 +2116,14 @@ QDF_STATUS wma_open(void *cds_context, goto err_event_init; } + qdf_status = cds_shutdown_notifier_register(wma_shutdown_notifier_cb, + wma_handle); + if (qdf_status != QDF_STATUS_SUCCESS) { + WMA_LOGP("%s: Shutdown notifier register failed: %d", + __func__, qdf_status); + goto err_event_init; + } + qdf_status = qdf_event_create(&wma_handle->runtime_suspend); if (qdf_status != QDF_STATUS_SUCCESS) { WMA_LOGP("%s: runtime_suspend event initialization failed", @@ -3475,6 +3502,8 @@ QDF_STATUS wma_close(void *cds_ctx) qdf_event_destroy(&wma_handle->wma_resume_event); qdf_event_destroy(&wma_handle->runtime_suspend); qdf_event_destroy(&wma_handle->recovery_event); + qdf_event_destroy(&wma_handle->tx_frm_download_comp_event); + qdf_event_destroy(&wma_handle->tx_queue_empty_event); wma_cleanup_vdev_resp(wma_handle); wma_cleanup_hold_req(wma_handle); qdf_wake_lock_destroy(&wma_handle->wmi_cmd_rsp_wake_lock); @@ -5778,6 +5807,8 @@ void wma_enable_specific_fw_logs(tp_wma_handle wma_handle, } #if !defined(REMOVE_PKT_LOG) + +#define MEGABYTE (1024 * 1024) /** * wma_set_wifi_start_packet_stats() - Start/stop packet stats * @wma_handle: WMA handle @@ -5821,6 +5852,11 @@ void wma_set_wifi_start_packet_stats(void *wma_handle, ATH_PKTLOG_RX | ATH_PKTLOG_TX | ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT; + if (start_log->size != 0) { + pktlog_setsize(scn, start_log->size * MEGABYTE); + return; + } + if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) { pktlog_enable(scn, log_state, start_log->ini_triggered, start_log->user_triggered, diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index a3223b2f6814..d5aef6cedc37 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2496,6 +2496,11 @@ int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle, if (wmi_desc->nbuf) qdf_nbuf_unmap_single(pdev->osdev, wmi_desc->nbuf, QDF_DMA_TO_DEVICE); + + if (wma_handle->wma_mgmt_tx_packetdump_cb) + wma_handle->wma_mgmt_tx_packetdump_cb(wmi_desc->nbuf, + QDF_STATUS_SUCCESS, wmi_desc->vdev_id, TX_MGMT_PKT); + if (wmi_desc->tx_cmpl_cb) wmi_desc->tx_cmpl_cb(wma_handle->mac_context, wmi_desc->nbuf, 1); @@ -2559,7 +2564,7 @@ int wma_mgmt_tx_bundle_completion_handler(void *handle, uint8_t *buf, int i; param_buf = (WMI_MGMT_TX_BUNDLE_COMPLETION_EVENTID_param_tlvs *)buf; - if (!param_buf && !wma_handle) { + if (!param_buf || !wma_handle) { WMA_LOGE("%s: Invalid mgmt Tx completion event", __func__); return -EINVAL; } @@ -3298,6 +3303,13 @@ static int wma_mgmt_rx_process(void *handle, uint8_t *data, return -EINVAL; } + if ((mgt_type == IEEE80211_FC0_TYPE_MGT && + mgt_subtype != IEEE80211_FC0_SUBTYPE_BEACON) && + wma_handle->wma_mgmt_rx_packetdump_cb) + wma_handle->wma_mgmt_rx_packetdump_cb(rx_pkt->pkt_buf, + QDF_STATUS_SUCCESS, rx_pkt->pkt_meta.sessionId, + RX_MGMT_PKT); + wma_handle->mgmt_rx(wma_handle, rx_pkt); return 0; } @@ -3395,3 +3407,51 @@ QDF_STATUS wma_register_mgmt_frm_client( return QDF_STATUS_SUCCESS; } + +/** + * wma_register_packetdump_callback() - stores tx and rx mgmt packet dump + * callback handler + * @wma_mgmt_tx_packetdump_cb: tx mgmt packetdump cb + * @wma_mgmt_rx_packetdump_cb: rx mgmt packetdump cb + * + * This function is used to store tx and rx mgmt. packet dump callback + * + * Return: None + * + */ +void wma_register_packetdump_callback( + tp_wma_packetdump_cb wma_mgmt_tx_packetdump_cb, + tp_wma_packetdump_cb wma_mgmt_rx_packetdump_cb) +{ + tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA); + + if (!wma_handle) { + WMA_LOGE("wma handle is NULL"); + return; + } + + wma_handle->wma_mgmt_tx_packetdump_cb = wma_mgmt_tx_packetdump_cb; + wma_handle->wma_mgmt_rx_packetdump_cb = wma_mgmt_rx_packetdump_cb; +} + +/** + * wma_deregister_packetdump_callback() - removes tx and rx mgmt packet dump + * callback handler + * + * This function is used to remove tx and rx mgmt. packet dump callback + * + * Return: None + * + */ +void wma_deregister_packetdump_callback(void) +{ + tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA); + + if (!wma_handle) { + WMA_LOGE("wma handle is NULL"); + return; + } + + wma_handle->wma_mgmt_tx_packetdump_cb = NULL; + wma_handle->wma_mgmt_tx_packetdump_cb = NULL; +} diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 09ad59a89e40..8d28d4806bca 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -755,14 +755,17 @@ QDF_STATUS wma_roam_scan_offload_mode(tp_wma_handle wma_handle, struct roam_offload_scan_params *params = qdf_mem_malloc(sizeof(*params)); + if (!params) { + WMA_LOGE("%s: Failed to allocate scan params", __func__); + return QDF_STATUS_E_NOMEM; + } #ifdef WLAN_FEATURE_ROAM_OFFLOAD - int auth_mode = WMI_AUTH_NONE; + params->auth_mode = WMI_AUTH_NONE; if (roam_req) - auth_mode = e_csr_auth_type_to_rsn_authmode + params->auth_mode = e_csr_auth_type_to_rsn_authmode (roam_req->ConnectedNetwork.authentication, roam_req->ConnectedNetwork.encryption); - WMA_LOGD("%s : auth mode = %d", __func__, auth_mode); - params->auth_mode = auth_mode; + WMA_LOGD("%s : auth mode = %d", __func__, params->auth_mode); #endif /* WLAN_FEATURE_ROAM_OFFLOAD */ params->is_roam_req_valid = 0; @@ -2273,6 +2276,9 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, return status; } + DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD, + synch_event->vdev_id, QDF_PROTO_TYPE_EVENT, QDF_ROAM_SYNCH)); + if (wma_is_roam_synch_in_progress(wma, synch_event->vdev_id)) { WMA_LOGE("%s: Ignoring RSI since one is already in progress", __func__); @@ -2679,6 +2685,10 @@ void wma_process_roam_synch_complete(WMA_HANDLE handle, uint8_t vdev_id) vdev_id)) { return; } + + DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD, + vdev_id, QDF_PROTO_TYPE_EVENT, QDF_ROAM_COMPLETE)); + WMA_LOGE("LFR3: Posting WMA_ROAM_OFFLOAD_SYNCH_CNF"); return; } @@ -5778,6 +5788,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, __func__, wmi_event->reason, wmi_event->notif, wmi_event->vdev_id, wmi_event->rssi); + DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD, + wmi_event->vdev_id, QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID)); + switch (wmi_event->reason) { case WMI_ROAM_REASON_BMISS: WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id); diff --git a/uapi/linux/pktlog_ac_fmt.h b/uapi/linux/pktlog_ac_fmt.h index c8782fd03f82..46dc10a8a582 100644 --- a/uapi/linux/pktlog_ac_fmt.h +++ b/uapi/linux/pktlog_ac_fmt.h @@ -70,6 +70,26 @@ struct ath_pktlog_hdr { #endif } __ATTRIB_PACK; +/** + * enum pkt_type - packet type + * @START_MONITOR: indicates parser to start packetdump parsing + * @STOP_MONITOR: indicates parser to stop packetdump parsing + * @TX_MGMT_PKT: TX management Packet + * @TX_DATA_PKT: TX data Packet + * @RX_MGMT_PKT: RX management Packet + * @RX_DATA_PKT: RX data Packet + * + * This enum has packet types + */ +enum pkt_type { + START_MONITOR = 1, + STOP_MONITOR, + TX_MGMT_PKT, + TX_DATA_PKT, + RX_MGMT_PKT, + RX_DATA_PKT, +}; + #define ATH_PKTLOG_HDR_FLAGS_MASK 0xffff #define ATH_PKTLOG_HDR_FLAGS_SHIFT 0 #define ATH_PKTLOG_HDR_FLAGS_OFFSET 0 @@ -127,17 +147,18 @@ enum { /* Types of packet log events */ -#define PKTLOG_TYPE_TX_CTRL 1 -#define PKTLOG_TYPE_TX_STAT 2 -#define PKTLOG_TYPE_TX_MSDU_ID 3 -#define PKTLOG_TYPE_TX_FRM_HDR 4 -#define PKTLOG_TYPE_RX_STAT 5 -#define PKTLOG_TYPE_RC_FIND 6 -#define PKTLOG_TYPE_RC_UPDATE 7 +#define PKTLOG_TYPE_TX_CTRL 1 +#define PKTLOG_TYPE_TX_STAT 2 +#define PKTLOG_TYPE_TX_MSDU_ID 3 +#define PKTLOG_TYPE_TX_FRM_HDR 4 +#define PKTLOG_TYPE_RX_STAT 5 +#define PKTLOG_TYPE_RC_FIND 6 +#define PKTLOG_TYPE_RC_UPDATE 7 #define PKTLOG_TYPE_TX_VIRT_ADDR 8 #define PKTLOG_TYPE_SMART_ANTENNA 9 #define PKTLOG_TYPE_SW_EVENT 10 -#define PKTLOG_TYPE_MAX 11 +#define PKTLOG_TYPE_PKT_DUMP 11 +#define PKTLOG_TYPE_MAX 12 #define PKTLOG_MAX_TXCTL_WORDS 57 /* +2 words for bitmap */ #define PKTLOG_MAX_TXSTATUS_WORDS 32 @@ -287,5 +308,82 @@ struct ath_pktlog_buf { sizeof(struct ath_pktlog_hdr)) ? _rd_offset : 0; \ } while(0) +/** + * enum tx_pkt_fate - tx packet fate + * @TX_PKT_FATE_ACKED: Sent over air and ACKed + * @TX_PKT_FATE_SENT: Sent over air but not ACKed. + * @TX_PKT_FATE_FW_QUEUED: Queued within firmware, + * but not yet sent over air + * @TX_PKT_FATE_FW_DROP_INVALID: Dropped by firmware as invalid. + * E.g. bad source address, bad checksum, or invalid for current state. + * @TX_PKT_FATE_FW_DROP_NOBUFS: Dropped by firmware due + * to lack of buffer space + * @TX_PKT_FATE_FW_DROP_OTHER: Dropped by firmware for any other + * reason. Includes frames that were sent by driver to firmware, but + * unaccounted for by firmware. + * @TX_PKT_FATE_DRV_QUEUED: Queued within driver, not yet sent to firmware. + * @TX_PKT_FATE_DRV_DROP_INVALID: Dropped by driver as invalid. + * E.g. bad source address, or invalid for current state. + * @TX_PKT_FATE_DRV_DROP_NOBUFS: Dropped by driver due to lack of buffer space + * @TX_PKT_FATE_DRV_DROP_OTHER: Dropped by driver for any other reason. + * E.g. out of buffers. + * + * This enum has packet fate types + */ + +enum tx_pkt_fate { + TX_PKT_FATE_ACKED, + TX_PKT_FATE_SENT, + TX_PKT_FATE_FW_QUEUED, + TX_PKT_FATE_FW_DROP_INVALID, + TX_PKT_FATE_FW_DROP_NOBUFS, + TX_PKT_FATE_FW_DROP_OTHER, + TX_PKT_FATE_DRV_QUEUED, + TX_PKT_FATE_DRV_DROP_INVALID, + TX_PKT_FATE_DRV_DROP_NOBUFS, + TX_PKT_FATE_DRV_DROP_OTHER, +}; + +/** + * enum rx_pkt_fate - rx packet fate + * @RX_PKT_FATE_SUCCESS: Valid and delivered to + * network stack (e.g., netif_rx()). + * @RX_PKT_FATE_FW_QUEUED: Queued within firmware, + * but not yet sent to driver. + * @RX_PKT_FATE_FW_DROP_FILTER: Dropped by firmware + * due to host-programmable filters. + * @RX_PKT_FATE_FW_DROP_INVALID: Dropped by firmware + * as invalid. E.g. bad checksum, decrypt failed, or invalid for current state. + * @RX_PKT_FATE_FW_DROP_NOBUFS: Dropped by firmware + * due to lack of buffer space. + * @RX_PKT_FATE_FW_DROP_OTHER: Dropped by firmware + * for any other reason. + * @RX_PKT_FATE_DRV_QUEUED: Queued within driver, + * not yet delivered to network stack. + * @RX_PKT_FATE_DRV_DROP_FILTER: Dropped by driver + * due to filter rules. + * @RX_PKT_FATE_DRV_DROP_INVALID: Dropped by driver as invalid. + * E.g. not permitted in current state. + * @RX_PKT_FATE_DRV_DROP_NOBUFS: Dropped by driver + * due to lack of buffer space. + * @RX_PKT_FATE_DRV_DROP_OTHER: Dropped by driver for any other reason. + * + * This enum has packet fate types + */ + +enum rx_pkt_fate { + RX_PKT_FATE_SUCCESS, + RX_PKT_FATE_FW_QUEUED, + RX_PKT_FATE_FW_DROP_FILTER, + RX_PKT_FATE_FW_DROP_INVALID, + RX_PKT_FATE_FW_DROP_NOBUFS, + RX_PKT_FATE_FW_DROP_OTHER, + RX_PKT_FATE_DRV_QUEUED, + RX_PKT_FATE_DRV_DROP_FILTER, + RX_PKT_FATE_DRV_DROP_INVALID, + RX_PKT_FATE_DRV_DROP_NOBUFS, + RX_PKT_FATE_DRV_DROP_OTHER, +}; + #endif /* _PKTLOG_FMT_H_ */ #endif /* REMOVE_PKT_LOG */