From d0fc0ea3643a4792e63f9e8fa1ad501453088196 Mon Sep 17 00:00:00 2001 From: Manjunathappa Prakash Date: Wed, 22 Aug 2018 15:59:09 -0700 Subject: [PATCH 1/4] qcacmn: Add more debug_ids and reduce the dump log level Add more debug IDs to narrow down further funciton who is holding peer reference. Reduce the peer debug dump log level to avoid side effects of console logging. Change-Id: I9820c72bcde8a0c2b0e779cf322e1133ef8a43e6 CRs-Fixed: 2303069 --- dp/inc/cdp_txrx_mob_def.h | 26 +++++++++++++++++------- utils/logging/inc/wlan_roam_debug.h | 3 +++ utils/logging/src/wlan_roam_debug.c | 31 ++++++++++------------------- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/dp/inc/cdp_txrx_mob_def.h b/dp/inc/cdp_txrx_mob_def.h index fdd4e37732dc..7af60f8a01a2 100644 --- a/dp/inc/cdp_txrx_mob_def.h +++ b/dp/inc/cdp_txrx_mob_def.h @@ -198,16 +198,28 @@ enum ol_tx_spec { * @PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP: debug id for send ADDBA response * @PEER_DEBUG_ID_OL_RX_THREAD: debug id for rx thread * @PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK: debug id for CCMP replay + * @PEER_DEBUG_ID_WMA_DEL_BSS:debug id for remove BSS + * @PEER_DEBUG_ID_WMA_VDEV_STOP_RESP:debug id for vdev stop response handler + * @PEER_DEBUG_ID_OL_PEER_MAP:debug id for peer map/unmap + * @PEER_DEBUG_ID_OL_PEER_ATTACH: debug id for peer attach/detach + * @PEER_DEBUG_ID_OL_TXQ_VDEV_FL: debug id for vdev flush + * @PEER_DEBUG_ID_OL_HASH_ERS:debug id for peer find hash erase * @PEER_DEBUG_ID_MAX: debug id MAX */ enum peer_debug_id_type { - PEER_DEBUG_ID_OL_INTERNAL = 0, - PEER_DEBUG_ID_WMA_PKT_DROP = 1, - PEER_DEBUG_ID_WMA_ADDBA_REQ = 2, - PEER_DEBUG_ID_WMA_DELBA_REQ = 3, - PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP = 4, - PEER_DEBUG_ID_OL_RX_THREAD = 5, - PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK = 6, + PEER_DEBUG_ID_OL_INTERNAL, + PEER_DEBUG_ID_WMA_PKT_DROP, + PEER_DEBUG_ID_WMA_ADDBA_REQ, + PEER_DEBUG_ID_WMA_DELBA_REQ, + PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP, + PEER_DEBUG_ID_OL_RX_THREAD, + PEER_DEBUG_ID_WMA_CCMP_REPLAY_ATTACK, + PEER_DEBUG_ID_WMA_DEL_BSS, + PEER_DEBUG_ID_WMA_VDEV_STOP_RESP, + PEER_DEBUG_ID_OL_PEER_MAP, + PEER_DEBUG_ID_OL_PEER_ATTACH, + PEER_DEBUG_ID_OL_TXQ_VDEV_FL, + PEER_DEBUG_ID_OL_HASH_ERS, PEER_DEBUG_ID_MAX }; diff --git a/utils/logging/inc/wlan_roam_debug.h b/utils/logging/inc/wlan_roam_debug.h index 8332caa9e7d7..e49c13984253 100644 --- a/utils/logging/inc/wlan_roam_debug.h +++ b/utils/logging/inc/wlan_roam_debug.h @@ -22,6 +22,9 @@ #define _WLAN_ROAM_DEBUG_H_ +#define roam_debug(args ...) \ + QDF_TRACE_DEBUG(QDF_MODULE_ID_ROAM_DEBUG, ## args) + /** * struct wlan_roam_debug_rec - roam debug information record definition * @time: timestamp when record was added diff --git a/utils/logging/src/wlan_roam_debug.c b/utils/logging/src/wlan_roam_debug.c index 44f8be0669e4..8988282853a4 100644 --- a/utils/logging/src/wlan_roam_debug.c +++ b/utils/logging/src/wlan_roam_debug.c @@ -220,13 +220,10 @@ void wlan_roam_debug_dump_table(void) current_index = qdf_atomic_read(&dbg_tbl->index); if (current_index < 0) { - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "%s: No records to dump", __func__); + roam_debug("No records to dump"); return; } - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "%s: Dumping all records. current index %d", - __func__, current_index); + roam_debug("Dumping all records. current index %d", current_index); i = current_index; do { @@ -248,23 +245,17 @@ void wlan_roam_debug_dump_table(void) 0xffffffff); delta = delta / (DEBUG_CLOCK_TICKS_PER_MSEC >> 8); - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "index = %5d timestamp = 0x%016llx delta ms = %-12u", - i, dbg_rec->time, delta); - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "info = %-24s vdev_id = %-3d mac addr = %pM", - wlan_roam_debug_string(dbg_rec->operation), - (int8_t) dbg_rec->vdev_id, dbg_rec->mac_addr.bytes); - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "peer obj = 0x%pK peer_id = %-4d", - dbg_rec->peer_obj, (int8_t) dbg_rec->peer_id); - QDF_TRACE(QDF_MODULE_ID_ROAM_DEBUG, QDF_TRACE_LEVEL_ERROR, - "arg1 = 0x%-8x arg2 = 0x%-8x", - dbg_rec->arg1, dbg_rec->arg2); + roam_debug("index = %5d timestamp = 0x%016llx delta ms = %-12u", + i, dbg_rec->time, delta); + roam_debug("info = %-24s vdev_id = %-3d mac addr = %pM", + wlan_roam_debug_string(dbg_rec->operation), + (int8_t)dbg_rec->vdev_id, dbg_rec->mac_addr.bytes); + roam_debug("peer obj = 0x%pK peer_id = %-4d", dbg_rec->peer_obj, + (int8_t)dbg_rec->peer_id); + roam_debug("arg1 = 0x%-8x arg2 = 0x%-8x", dbg_rec->arg1, + dbg_rec->arg2); } while (i != current_index); } - qdf_export_symbol(wlan_roam_debug_dump_table); #endif /* FEATURE_ROAM_DEBUG */ - From 689aa38d1e6389eacf4e2896aa969a8cf8c6d421 Mon Sep 17 00:00:00 2001 From: Jeffin Mammen Date: Thu, 30 Aug 2018 16:58:20 +0530 Subject: [PATCH 2/4] qcacmn: Read AC ID from the firmware event Read AC ID from the firmware event(ATF) received. The AC ID sent by the firmware is used to (un)block tx traffic with ATF enabled Change-Id: I4efedea26495b262f1c55fab3a1fc2824e1509f7 CRs-Fixed: 2306297 --- wmi/src/wmi_unified_non_tlv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/wmi/src/wmi_unified_non_tlv.c b/wmi/src/wmi_unified_non_tlv.c index 435a4a08374c..a13927541f38 100644 --- a/wmi/src/wmi_unified_non_tlv.c +++ b/wmi/src/wmi_unified_non_tlv.c @@ -8402,6 +8402,7 @@ static QDF_STATUS extract_tx_data_traffic_ctrl_ev_non_tlv( ev->peer_ast_idx = evt->peer_ast_idx; ev->vdev_id = evt->vdev_id; ev->ctrl_cmd = evt->ctrl_cmd; + ev->wmm_ac = evt->wmm_ac; return QDF_STATUS_SUCCESS; } From df19d488622ccb83c48a2cb357d005683780af82 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Tue, 14 Aug 2018 01:41:35 -0400 Subject: [PATCH 3/4] qcacmn: Correct RSN IE length check The minimal size of RSN ie data size is 2 (only contain version field). The original 3 will cause driver identify such AP beacon/probe rsp as invalid and do not connect to it. Change-Id: Idceaf936cbd0ca448f82d9594b35ca346c6513d4 CRs-Fixed: 2294094 --- umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h index a9147169cd72..6b654772a9f0 100644 --- a/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h +++ b/umac/cmn_services/cmn_defs/inc/wlan_cmn_ieee80211.h @@ -446,7 +446,7 @@ struct wlan_rsn_ie_hdr { u8 version[2]; }; -#define WLAN_RSN_IE_MIN_LEN 3 +#define WLAN_RSN_IE_MIN_LEN 2 /** * struct wlan_rsn_ie: rsn ie info From 08bf93bbaf3f70e84eb22cf2464baec5bf83c203 Mon Sep 17 00:00:00 2001 From: Kiran Venkatappa Date: Mon, 6 Aug 2018 22:08:36 +0530 Subject: [PATCH 4/4] qcacmn: Use multi-page alloc for tso descs Regular allocs usually result in allocation of size aligned to slab boundary resulting in more memory than the requested. Use multi-page allocation to avoid allocation of more memory than requested. Change-Id: Id6562f2fe419179e27206ff5b1d543090b931607 CRs-Fixed: 2294213 --- dp/wifi3.0/dp_tx_desc.c | 188 ++++++++++++++++------------------------ dp/wifi3.0/dp_types.h | 4 + qdf/inc/qdf_types.h | 8 +- 3 files changed, 81 insertions(+), 119 deletions(-) diff --git a/dp/wifi3.0/dp_tx_desc.c b/dp/wifi3.0/dp_tx_desc.c index 12a0919d9174..1bc4e26553eb 100644 --- a/dp/wifi3.0/dp_tx_desc.c +++ b/dp/wifi3.0/dp_tx_desc.c @@ -323,53 +323,46 @@ QDF_STATUS dp_tx_ext_desc_pool_free(struct dp_soc *soc, uint8_t pool_id) QDF_STATUS dp_tx_tso_desc_pool_alloc(struct dp_soc *soc, uint8_t pool_id, uint16_t num_elem) { - int i; - struct qdf_tso_seg_elem_t *c_element; - struct qdf_tso_seg_elem_t *temp; + struct dp_tx_tso_seg_pool_s *tso_desc_pool; + uint32_t desc_size; - soc->tx_tso_desc[pool_id].num_free = 0; - c_element = qdf_mem_malloc(sizeof(struct qdf_tso_seg_elem_t)); + tso_desc_pool = &soc->tx_tso_desc[pool_id]; + tso_desc_pool->num_free = 0; + desc_size = DP_TX_DESC_SIZE(sizeof(struct qdf_tso_seg_elem_t)); + qdf_mem_multi_pages_alloc(soc->osdev, + &tso_desc_pool->desc_pages, + desc_size, + num_elem, 0, true); - if (!c_element) { + if (!tso_desc_pool->desc_pages.num_pages) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("Alloc Failed %pK pool_id %d"), soc, pool_id); return QDF_STATUS_E_NOMEM; } - soc->tx_tso_desc[pool_id].freelist = c_element; - soc->tx_tso_desc[pool_id].num_free++; - for (i = 0; i < (num_elem - 1); i++) { - c_element->next = - qdf_mem_malloc(sizeof(struct qdf_tso_seg_elem_t)); - if (!c_element->next) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - FL("Alloc Failed %pK pool_id %d"), - soc, pool_id); - goto fail; - } - - soc->tx_tso_desc[pool_id].num_free++; - c_element = c_element->next; - c_element->next = NULL; - + tso_desc_pool->freelist = (struct qdf_tso_seg_elem_t *) + *tso_desc_pool->desc_pages.cacheable_pages; + tso_desc_pool->num_free = num_elem; + if (qdf_mem_multi_page_link(soc->osdev, + &tso_desc_pool->desc_pages, + desc_size, + num_elem, true)) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "invalid tso desc allocation - overflow num link"); + goto free_tso_desc; } - TSO_DEBUG("Number of free descriptors: %u\n", - soc->tx_tso_desc[pool_id].num_free); - soc->tx_tso_desc[pool_id].pool_size = num_elem; - qdf_spinlock_create(&soc->tx_tso_desc[pool_id].lock); + TSO_DEBUG("Number of free descriptors: %u\n", tso_desc_pool->num_free); + tso_desc_pool->pool_size = num_elem; + qdf_spinlock_create(&tso_desc_pool->lock); return QDF_STATUS_SUCCESS; -fail: - c_element = soc->tx_tso_desc[pool_id].freelist; - while (c_element) { - temp = c_element->next; - qdf_mem_free(c_element); - c_element = temp; - } +free_tso_desc: + qdf_mem_multi_pages_free(soc->osdev, + &tso_desc_pool->desc_pages, 0, true); - return QDF_STATUS_E_NOMEM; + return QDF_STATUS_E_FAULT; } /** @@ -381,33 +374,19 @@ fail: */ void dp_tx_tso_desc_pool_free(struct dp_soc *soc, uint8_t pool_id) { - int i; - struct qdf_tso_seg_elem_t *c_element; - struct qdf_tso_seg_elem_t *temp; + struct dp_tx_tso_seg_pool_s *tso_desc_pool; - qdf_spin_lock_bh(&soc->tx_tso_desc[pool_id].lock); - c_element = soc->tx_tso_desc[pool_id].freelist; + tso_desc_pool = &soc->tx_tso_desc[pool_id]; - if (!c_element) { - qdf_spin_unlock_bh(&soc->tx_tso_desc[pool_id].lock); - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("Desc Pool Corrupt %d"), pool_id); - return; - } + qdf_spin_lock_bh(&tso_desc_pool->lock); - for (i = 0; i < soc->tx_tso_desc[pool_id].pool_size; i++) { - temp = c_element->next; - qdf_mem_free(c_element); - c_element = temp; - if (!c_element) - break; - } - - soc->tx_tso_desc[pool_id].freelist = NULL; - soc->tx_tso_desc[pool_id].num_free = 0; - soc->tx_tso_desc[pool_id].pool_size = 0; - qdf_spin_unlock_bh(&soc->tx_tso_desc[pool_id].lock); - qdf_spinlock_destroy(&soc->tx_tso_desc[pool_id].lock); + qdf_mem_multi_pages_free(soc->osdev, + &tso_desc_pool->desc_pages, 0, true); + tso_desc_pool->freelist = NULL; + tso_desc_pool->num_free = 0; + tso_desc_pool->pool_size = 0; + qdf_spin_unlock_bh(&tso_desc_pool->lock); + qdf_spinlock_destroy(&tso_desc_pool->lock); return; } /** @@ -421,51 +400,45 @@ void dp_tx_tso_desc_pool_free(struct dp_soc *soc, uint8_t pool_id) QDF_STATUS dp_tx_tso_num_seg_pool_alloc(struct dp_soc *soc, uint8_t pool_id, uint16_t num_elem) { + struct dp_tx_tso_num_seg_pool_s *tso_num_seg_pool; + uint32_t desc_size; - int i; - struct qdf_tso_num_seg_elem_t *c_element; - struct qdf_tso_num_seg_elem_t *temp; - - soc->tx_tso_num_seg[pool_id].num_free = 0; - c_element = qdf_mem_malloc(sizeof(struct qdf_tso_num_seg_elem_t)); - - if (!c_element) { + tso_num_seg_pool = &soc->tx_tso_num_seg[pool_id]; + tso_num_seg_pool->num_free = 0; + desc_size = DP_TX_DESC_SIZE(sizeof(struct qdf_tso_num_seg_elem_t)); + qdf_mem_multi_pages_alloc(soc->osdev, + &tso_num_seg_pool->desc_pages, + desc_size, + num_elem, 0, true); + if (!tso_num_seg_pool->desc_pages.num_pages) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("Alloc Failed %pK pool_id %d"), soc, pool_id); return QDF_STATUS_E_NOMEM; } - soc->tx_tso_num_seg[pool_id].freelist = c_element; - soc->tx_tso_num_seg[pool_id].num_free++; - for (i = 0; i < (num_elem - 1); i++) { - c_element->next = - qdf_mem_malloc(sizeof(struct qdf_tso_num_seg_elem_t)); - - if (!c_element->next) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - FL("Alloc Failed %pK pool_id %d"), - soc, pool_id); - goto fail; - } - soc->tx_tso_num_seg[pool_id].num_free++; - - c_element = c_element->next; - c_element->next = NULL; + if (qdf_mem_multi_page_link(soc->osdev, + &tso_num_seg_pool->desc_pages, + desc_size, + num_elem, true)) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "invalid tso desc allocation - overflow num link"); + goto fail; } - soc->tx_tso_num_seg[pool_id].num_seg_pool_size = num_elem; - qdf_spinlock_create(&soc->tx_tso_num_seg[pool_id].lock); + tso_num_seg_pool->freelist = (struct qdf_tso_num_seg_elem_t *) + *tso_num_seg_pool->desc_pages.cacheable_pages; + tso_num_seg_pool->num_free = num_elem; + tso_num_seg_pool->num_seg_pool_size = num_elem; + + qdf_spinlock_create(&tso_num_seg_pool->lock); return QDF_STATUS_SUCCESS; fail: - c_element = soc->tx_tso_num_seg[pool_id].freelist; - while (c_element) { - temp = c_element->next; - qdf_mem_free(c_element); - c_element = temp; - } + qdf_mem_multi_pages_free(soc->osdev, + &tso_num_seg_pool->desc_pages, 0, true); + return QDF_STATUS_E_NOMEM; } @@ -479,33 +452,18 @@ fail: */ void dp_tx_tso_num_seg_pool_free(struct dp_soc *soc, uint8_t pool_id) { - int i; - struct qdf_tso_num_seg_elem_t *c_element; - struct qdf_tso_num_seg_elem_t *temp; + struct dp_tx_tso_num_seg_pool_s *tso_num_seg_pool; - qdf_spin_lock_bh(&soc->tx_tso_num_seg[pool_id].lock); - c_element = soc->tx_tso_num_seg[pool_id].freelist; + tso_num_seg_pool = &soc->tx_tso_num_seg[pool_id]; + qdf_spin_lock_bh(&tso_num_seg_pool->lock); - if (!c_element) { - qdf_spin_unlock_bh(&soc->tx_tso_num_seg[pool_id].lock); - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - FL("Desc Pool Corrupt %d"), pool_id); - return; - } - - for (i = 0; i < soc->tx_tso_num_seg[pool_id].num_seg_pool_size; i++) { - temp = c_element->next; - qdf_mem_free(c_element); - c_element = temp; - if (!c_element) - break; - } - - soc->tx_tso_num_seg[pool_id].freelist = NULL; - soc->tx_tso_num_seg[pool_id].num_free = 0; - soc->tx_tso_num_seg[pool_id].num_seg_pool_size = 0; - qdf_spin_unlock_bh(&soc->tx_tso_num_seg[pool_id].lock); - qdf_spinlock_destroy(&soc->tx_tso_num_seg[pool_id].lock); + qdf_mem_multi_pages_free(soc->osdev, + &tso_num_seg_pool->desc_pages, 0, true); + tso_num_seg_pool->freelist = NULL; + tso_num_seg_pool->num_free = 0; + tso_num_seg_pool->num_seg_pool_size = 0; + qdf_spin_unlock_bh(&tso_num_seg_pool->lock); + qdf_spinlock_destroy(&tso_num_seg_pool->lock); return; } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 2b7893271dcc..c034d0099453 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -323,12 +323,14 @@ enum flow_pool_status { * @pool_size: total number of pool elements * @num_free: free element count * @freelist: first free element pointer + * @desc_pages: multiple page allocation information for actual descriptors * @lock: lock for accessing the pool */ struct dp_tx_tso_seg_pool_s { uint16_t pool_size; uint16_t num_free; struct qdf_tso_seg_elem_t *freelist; + struct qdf_mem_multi_page_t desc_pages; qdf_spinlock_t lock; }; @@ -337,6 +339,7 @@ struct dp_tx_tso_seg_pool_s { * @num_seg_pool_size: total number of pool elements * @num_free: free element count * @freelist: first free element pointer + * @desc_pages: multiple page allocation information for actual descriptors * @lock: lock for accessing the pool */ @@ -344,6 +347,7 @@ struct dp_tx_tso_num_seg_pool_s { uint16_t num_seg_pool_size; uint16_t num_free; struct qdf_tso_num_seg_elem_t *freelist; + struct qdf_mem_multi_page_t desc_pages; /*tso mutex */ qdf_spinlock_t lock; }; diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index ffbe03f8f9b4..407b5d19f7e5 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -1005,16 +1005,16 @@ struct qdf_tso_seg_dbg_t { /** * qdf_tso_seg_elem_t - tso segment element - * @seg: instance of segment * @next: pointer to the next segment + * @seg: instance of segment */ struct qdf_tso_seg_elem_t { + struct qdf_tso_seg_elem_t *next; struct qdf_tso_seg_t seg; uint32_t cookie:13, on_freelist:1, sent_to_target:1, force_free:1; - struct qdf_tso_seg_elem_t *next; #ifdef TSOSEG_DEBUG struct qdf_tso_seg_dbg_t dbg; #endif /* TSOSEG_DEBUG */ @@ -1033,12 +1033,12 @@ struct qdf_tso_num_seg_t { /** * qdf_tso_num_seg_elem_t - num of tso segment element for jumbo skb - * @num_seg: instance of num of seg * @next: pointer to the next segment + * @num_seg: instance of num of seg */ struct qdf_tso_num_seg_elem_t { - struct qdf_tso_num_seg_t num_seg; struct qdf_tso_num_seg_elem_t *next; + struct qdf_tso_num_seg_t num_seg; }; /**