summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-03-05 08:40:28 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-03-05 08:40:28 -0800
commitff4aa818123672129da4dbef1c53dbdba10d8ac8 (patch)
tree696d0cd19772e4f184115b27e68082d87941e799
parente064dfbccfa91ea8551f69fbfb82bb719f19d651 (diff)
parent69659212ba5fb116ff223f8beb21922e28f8db9e (diff)
Merge "Merge remote-tracking branch 'origin/caf/caf-wlan/master'"
-rw-r--r--CORE/CLD_TXRX/HTT/htt_tx.c2
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c10
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c3
-rw-r--r--CORE/HDD/inc/qc_sap_ioctl.h3
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c24
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c39
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c47
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c48
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c13
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c3
-rw-r--r--CORE/MAC/src/pe/lim/limSendSmeRspMessages.c16
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c51
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h52
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h22
-rw-r--r--CORE/TL/inc/wlan_qct_tl.h6
-rw-r--r--CORE/VOSS/inc/vos_packet.h71
-rw-r--r--CORE/VOSS/src/vos_packet.c201
-rw-r--r--[-rwxr-xr-x]Kbuild3
20 files changed, 608 insertions, 17 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c
index 0b77b0c09197..c0b545bec185 100644
--- a/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -318,6 +318,8 @@ htt_tx_send_std(
htt_tx_sched(pdev);
return 0;
}
+
+ adf_nbuf_trace_update(msdu, "HT:T:");
if (HTCSendDataPkt(pdev->htc_pdev, msdu, pdev->htc_endpoint, download_len)){
HTT_TX_NBUF_QUEUE_ADD(pdev, msdu);
}
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 5b1975f06980..db270f9de0f3 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -904,7 +904,11 @@ void WLANTL_RegisterVdev(void *vos_ctx, void *vdev)
* in case of success, skb pointer in case of failure.
*/
adf_nbuf_t WLANTL_SendSTA_DataFrame(void *vos_ctx, u_int8_t sta_id,
- adf_nbuf_t skb)
+ adf_nbuf_t skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , v_U8_t proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ )
{
struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL,
vos_ctx);
@@ -952,6 +956,10 @@ adf_nbuf_t WLANTL_SendSTA_DataFrame(void *vos_ctx, u_int8_t sta_id,
adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
adf_nbuf_map_single(adf_ctx, skb, ADF_OS_DMA_TO_DEVICE);
+#ifdef QCA_PKT_PROTO_TRACE
+ adf_nbuf_trace_set_proto_type(skb, proto_type);
+#endif /* QCA_PKT_PROTO_TRACE */
+
if ((tl_shim->ip_checksum_offload) && (skb->protocol == htons(ETH_P_IP))
&& (skb->ip_summed == CHECKSUM_PARTIAL))
skb->ip_summed = CHECKSUM_COMPLETE;
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
index 0c8e6f66cabd..8a879a9373b6 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
@@ -455,6 +455,7 @@ ol_tx_completion_handler(
u_int16_t *desc_ids = (u_int16_t *)tx_desc_id_iterator;
u_int16_t tx_desc_id;
struct ol_tx_desc_t *tx_desc;
+ char *trace_str;
uint32_t byte_cnt = 0;
union ol_tx_desc_list_elem_t *td_array = pdev->tx_desc.array;
@@ -467,12 +468,14 @@ ol_tx_completion_handler(
OL_TX_DELAY_COMPUTE(pdev, status, desc_ids, num_msdus);
+ trace_str = (status) ? "OT:C:F:" : "OT:C:S:";
for (i = 0; i < num_msdus; i++) {
tx_desc_id = desc_ids[i];
tx_desc = &td_array[tx_desc_id].tx_desc;
tx_desc->status = status;
netbuf = tx_desc->netbuf;
+ adf_nbuf_trace_update(netbuf, trace_str);
/* Per SDU update of byte count */
byte_cnt += adf_nbuf_len(netbuf);
if (OL_TX_DESC_NO_REFS(tx_desc)) {
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h
index 7c900dda74dd..7c470ea1a8d4 100644
--- a/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/CORE/HDD/inc/qc_sap_ioctl.h
@@ -296,6 +296,9 @@ typedef struct
#define QCSAP_GET_GTX_STEP 65
#define QCSAP_GET_GTX_MINTPC 66
#define QCSAP_GET_GTX_BWMASK 67
+#ifdef QCA_PKT_PROTO_TRACE
+#define QCASAP_SET_DEBUG_LOG 68
+#endif /* QCA_PKT_PROTO_TRACE */
#endif /* QCA_WIFI_2_0 */
enum {
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 6a641f07d70a..212fe6a8f01b 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -817,6 +817,14 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *
WLAN_STA_DISCONNECT, pHddStaCtx->conn_info.bssId);
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ /* STA disconnected, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("ST:DISASC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
if(pHddStaCtx->conn_info.connState != eConnectionState_Disconnecting)
{
INIT_COMPLETION(pAdapter->disconnect_comp_var);
@@ -1312,6 +1320,14 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
#ifdef FEATURE_WLAN_TDLS
wlan_hdd_tdls_connection_callback(pAdapter);
#endif
+
+#ifdef QCA_PKT_PROTO_TRACE
+ /* STA Associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("ST:ASSOC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
//For reassoc, the station is already registered, all we need is to change the state
//of the STA in TL.
//If authentication is required (WPA/WPA2/DWEP), change TL to CONNECTED instead of AUTHENTICATED
@@ -2814,8 +2830,12 @@ eHalStatus hdd_smeRoamCallback( void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U3
}
else
{
- // Clear saved connection information in HDD
- hdd_connRemoveConnectInfo( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) );
+ // To Do - address probable memory leak with WEP encryption upon successful association
+ if (eCSR_ROAM_RESULT_ASSOCIATED != roamResult)
+ {
+ //Clear saved connection information in HDD
+ hdd_connRemoveConnectInfo( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) );
+ }
halStatus = hdd_AssociationCompletionHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
}
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 5c42dac519bd..2fd11b5d3f70 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -702,7 +702,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
WLAN_CLIENT_CONNECT_EX,
pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac.bytes);
#endif
-
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Peer associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("HA:ASSOC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
// Stop AP inactivity timer
if (pHddApCtx->hdd_ap_inactivity_timer.state == VOS_TIMER_STATE_RUNNING)
{
@@ -774,6 +780,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hdd_ipa_wlan_evt(pHostapdAdapter, staId, WLAN_CLIENT_DISCONNECT,
pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac.bytes);
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Peer dis-associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("HA:DISASC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
hdd_softap_DeregisterSTA(pHostapdAdapter, staId);
if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
@@ -1703,6 +1716,23 @@ static iw_softap_setparam(struct net_device *dev,
+#ifdef QCA_PKT_PROTO_TRACE
+ case QCASAP_SET_DEBUG_LOG:
+ {
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter);
+
+ hddLog(LOG1, "QCASAP_SET_DEBUG_LOG val %d", set_value);
+ /* Trace buffer dump only */
+ if (VOS_PKT_TRAC_DUMP_CMD == set_value)
+ {
+ vos_pkt_trace_buf_dump();
+ break;
+ }
+ pHddCtx->cfg_ini->gEnableDebugLog = set_value;
+ break;
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
#endif /* QCA_WIFI_2_0 */
default:
hddLog(LOGE, FL("Invalid setparam command %d value %d"),
@@ -3911,6 +3941,13 @@ static const struct iw_priv_args hostapd_private_args[] = {
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_gtxBWMask" },
+#ifdef QCA_PKT_PROTO_TRACE
+ { QCASAP_SET_DEBUG_LOG,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0,
+ "setDbgLvl" },
+#endif /* QCA_PKT_PROTO_TRACE */
+
#endif /* QCA_WIFI_2_0 */
{ QCSAP_IOCTL_GETPARAM,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 47b0999bd012..fdc6e97e4481 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9505,6 +9505,10 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
}
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ vos_pkt_proto_trace_init();
+#endif /* QCA_PKT_PROTO_TRACE */
+
ftm_processing:
if (VOS_FTM_MODE == hdd_get_conparam())
{
@@ -10221,6 +10225,9 @@ static void hdd_driver_exit(void)
}
else
{
+#ifdef QCA_PKT_PROTO_TRACE
+ vos_pkt_proto_trace_close();
+#endif /* QCA_PKT_PROTO_TRACE */
while(pHddCtx->isLogpInProgress ||
vos_is_logp_in_progress(VOS_MODULE_ID_VOSS, NULL)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index aef32724a97a..880ddb17152c 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -475,6 +475,10 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
v_MACADDR_t *pDestMacAddress;
v_U8_t STAId;
+#ifdef QCA_PKT_PROTO_TRACE
+ hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx;
+ v_U8_t proto_type = 0;
+#endif /* QCA_PKT_PROTO_TRACE */
/* Prevent this funtion to be called during SSR since TL context may
not be reinitialized at this time which will lead crash. */
@@ -556,8 +560,30 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
}
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ /* Proto Trace enabled */
+ proto_type = vos_pkt_get_proto_type(skb,
+ hddCtxt->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:T:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:T:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
if (WLANTL_SendSTA_DataFrame((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- STAId, skb) != NULL) {
+ STAId, skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ ) != NULL) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
"%s: Failed to send packet to txrx for staid:%d",
__func__, STAId);
@@ -1595,6 +1621,9 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
int rxstat;
struct sk_buff *skb = NULL;
hdd_context_t *pHddCtx = NULL;
+#ifdef QCA_PKT_PROTO_TRACE
+ v_U8_t proto_type;
+#endif /* QCA_PKT_PROTO_TRACE */
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
@@ -1635,6 +1664,22 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
++pAdapter->stats.rx_packets;
pAdapter->stats.rx_bytes += skb->len;
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ pHddCtx->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:R:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:R:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_INFO_LOW,
"%s: send one packet to kernel \n", __func__);
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index ec66d29e7e83..cf6b2e84521f 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -830,6 +830,11 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
v_U8_t STAId = WLAN_MAX_STA_COUNT;
hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station;
+#ifdef QCA_PKT_PROTO_TRACE
+ hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx;
+ v_U8_t proto_type = 0;
+#endif /* QCA_PKT_PROTO_TRACE */
+
#ifdef QCA_WIFI_FTM
if (hdd_get_conparam() == VOS_FTM_MODE) {
kfree_skb(skb);
@@ -951,11 +956,32 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb->queue_mapping = hddLinuxUpToAcMap[up];
}
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ hddCtxt->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:T:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:T:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
/*
* TODO: Should we stop net queues when txrx returns non-NULL?.
*/
if (WLANTL_SendSTA_DataFrame((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- STAId, (adf_nbuf_t) skb) != NULL) {
+ STAId, (adf_nbuf_t) skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ ) != NULL) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
"%s: Failed to send packet to txrx for staid:%d",
__func__, STAId);
@@ -1955,6 +1981,9 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
hdd_context_t *pHddCtx = NULL;
int rxstat;
struct sk_buff *skb = NULL;
+#ifdef QCA_PKT_PROTO_TRACE
+ v_U8_t proto_type;
+#endif /* QCA_PKT_PROTO_TRACE */
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
@@ -2021,6 +2050,23 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
#endif /* QCA_WIFI_2_0 */
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ pHddCtx->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:R:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:R:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
skb->dev = pAdapter->dev;
skb->protocol = eth_type_trans(skb, skb->dev);
++pAdapter->hdd_stats.hddTxRxStats.rxPackets;
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index a99d27643cab..df75900cd77d 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -105,6 +105,11 @@
#include "qc_sap_ioctl.h"
#include "sme_Api.h"
#include "wlan_qct_wda.h"
+
+#ifdef QCA_PKT_PROTO_TRACE
+#include "vos_packet.h"
+#endif /* QCA_PKT_PROTO_TRACE */
+
#ifdef CONFIG_HAS_EARLYSUSPEND
extern void hdd_suspend_wlan(struct early_suspend *wlan_suspend);
extern void hdd_resume_wlan(struct early_suspend *wlan_suspend);
@@ -5699,6 +5704,14 @@ static int iw_setint_getnone(struct net_device *dev, struct iw_request_info *inf
case WE_SET_DEBUG_LOG:
{
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Trace buffer dump only */
+ if (VOS_PKT_TRAC_DUMP_CMD == set_value)
+ {
+ vos_pkt_trace_buf_dump();
+ break;
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
pHddCtx->cfg_ini->gEnableDebugLog = set_value;
sme_UpdateConnectDebug(pHddCtx->hHal, set_value);
break;
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 4d08df36c6c2..d69a53991da0 100644
--- a/CORE/MAC/inc/qwlan_version.h
+++ b/CORE/MAC/inc/qwlan_version.h
@@ -42,9 +42,9 @@ BRIEF DESCRIPTION:
#define QWLAN_VERSION_MINOR 0
#define QWLAN_VERSION_PATCH 0
#define QWLAN_VERSION_EXTRA ""
-#define QWLAN_VERSION_BUILD 51
+#define QWLAN_VERSION_BUILD 52
-#define QWLAN_VERSIONSTR "1.0.0.51"
+#define QWLAN_VERSIONSTR "1.0.0.52"
#ifdef QCA_WIFI_2_0
diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
index 615f6a6b8e4e..7785af38b521 100644
--- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
+++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c
@@ -6014,6 +6014,9 @@ limProcessSmeDfsCsaIeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg)
* the template update
*/
limSendBeaconInd(pMac, psessionEntry);
+ PELOG1(limLog(pMac, LOG1,
+ FL(" Updated CSA IE, IE COUNT = %d"),
+ psessionEntry->gLimChannelSwitch.switchCount );)
psessionEntry->gLimChannelSwitch.switchCount--;
}
return;
diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
index 0f2bac0c5a45..1232ff631e4b 100644
--- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
+++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c
@@ -2998,7 +2998,6 @@ limSendSmeDfsEventNotify(tpAniSirGlobal pMac, tANI_U16 msgType, void *event)
static void
limSendDfsChanSwIEUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry)
{
- limLog(pMac, LOG1, FL("DFS Channel Switch update timer expired"));
/* Update the beacon template and send to FW */
if (schSetFixedBeaconFields(pMac, psessionEntry) != eSIR_SUCCESS)
@@ -3009,6 +3008,9 @@ limSendDfsChanSwIEUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry)
/* Send update beacon template message */
limSendBeaconInd(pMac, psessionEntry);
+ PELOG1(limLog(pMac, LOG1,
+ FL(" Updated CSA IE, IE COUNT = %d"),
+ psessionEntry->gLimChannelSwitch.switchCount );)
return;
}
@@ -3116,13 +3118,15 @@ limProcessBeaconTxSuccessInd(tpAniSirGlobal pMac, tANI_U16 msgType, void *event)
if (eLIM_AP_ROLE == psessionEntry->limSystemRole &&
VOS_TRUE == psessionEntry->dfsIncludeChanSwIe)
{
- /* Start a timer to send next CSA IE update */
- if (--psessionEntry->gLimChannelSwitch.switchCount >= 0)
+ /* Send only 5 beacons with CSA IE Set in when a radar is detected */
+ if (psessionEntry->gLimChannelSwitch.switchCount > 0)
{
- /* Start a timer of timeout less than 100ms, to give enough
- * time for template update and transmission
+ /*
+ * Send the next beacon with updated CSA IE count
*/
limSendDfsChanSwIEUpdate(pMac, psessionEntry);
+ /* Decrement the IE count */
+ psessionEntry->gLimChannelSwitch.switchCount--;
}
else
{
@@ -3130,8 +3134,6 @@ limProcessBeaconTxSuccessInd(tpAniSirGlobal pMac, tANI_U16 msgType, void *event)
psessionEntry->gLimChannelSwitch.switchCount = 0;
psessionEntry->dfsIncludeChanSwIe = VOS_FALSE;
- /* Reset CSA IE parameters in beacon/probe responses */
- limSendDfsChanSwIEUpdate(pMac, psessionEntry);
pChanSwTxResponse = (tSirSmeCSAIeTxCompleteRsp *)
vos_mem_malloc(length);
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index a59e14ecb347..3a38d3c03f94 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -33,6 +33,7 @@
#include <adf_os_types.h>
#include <adf_nbuf.h>
+adf_nbuf_trace_update_t trace_update_cb = NULL;
/*
* @brief This allocates an nbuf aligns if needed and reserves
@@ -378,6 +379,56 @@ __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void *arg)
return;
}
+void
+__adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr)
+{
+ trace_update_cb = cb_func_ptr;
+ return;
+}
+
+#ifdef QCA_PKT_PROTO_TRACE
+void
+__adf_nbuf_trace_update(adf_nbuf_t buf, char *event_string)
+{
+
+ char string_buf[NBUF_PKT_TRAC_MAX_STRING];
+
+ if ((!trace_update_cb) || (!event_string)) {
+ return;
+ }
+
+ if (!adf_nbuf_trace_get_proto_type(buf)) {
+ return;
+ }
+
+ /* Buffer over flow */
+ if (NBUF_PKT_TRAC_MAX_STRING <
+ (adf_os_str_len(event_string) + NBUF_PKT_TRAC_PROTO_STRING)) {
+ return;
+ }
+
+ adf_os_mem_zero(string_buf,
+ NBUF_PKT_TRAC_MAX_STRING);
+ adf_os_mem_copy(string_buf,
+ event_string, adf_os_str_len(event_string));
+ if (NBUF_PKT_TRAC_TYPE_EAPOL &
+ adf_nbuf_trace_get_proto_type(buf)) {
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "EPL",
+ NBUF_PKT_TRAC_PROTO_STRING);
+ }
+ else if (NBUF_PKT_TRAC_TYPE_DHCP &
+ adf_nbuf_trace_get_proto_type(buf)) {
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "DHC",
+ NBUF_PKT_TRAC_PROTO_STRING);
+ }
+
+ trace_update_cb(string_buf);
+ return;
+}
+#endif /* QCA_PKT_PROTO_TRACE */
+
EXPORT_SYMBOL(__adf_nbuf_alloc);
EXPORT_SYMBOL(__adf_nbuf_free);
EXPORT_SYMBOL(__adf_nbuf_ref);
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 3b6979fd9d14..c4203fec85c2 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -47,6 +47,12 @@
#ifdef IPA_OFFLOAD
#define IPA_NBUF_OWNER_ID 0xaa55aa55
#endif
+
+#define NBUF_PKT_TRAC_TYPE_EAPOL 0x02
+#define NBUF_PKT_TRAC_TYPE_DHCP 0x04
+#define NBUF_PKT_TRAC_MAX_STRING 11
+#define NBUF_PKT_TRAC_PROTO_STRING 3
+
/**
* @brief Platform indepedent packet abstraction
*/
@@ -1052,4 +1058,50 @@ adf_nbuf_set_protocol(adf_nbuf_t buf, uint16_t proto)
{
__adf_nbuf_set_protocol(buf, proto);
}
+
+/**
+ * @brief This function return packet proto type
+ *
+ * @param[in] buf buffer
+ */
+static inline uint8_t
+adf_nbuf_trace_get_proto_type(adf_nbuf_t buf)
+{
+ return __adf_nbuf_trace_get_proto_type(buf);
+}
+
+/**
+ * @brief This function updates packet proto type
+ *
+ * @param[in] buf buffer
+ * @param[in] proto_type protocol type
+*/
+static inline void
+adf_nbuf_trace_set_proto_type(adf_nbuf_t buf, uint8_t proto_type)
+{
+ __adf_nbuf_trace_set_proto_type(buf, proto_type);
+}
+
+/**
+ * @brief This function registers protocol trace callback
+ *
+ * @param[in] adf_nbuf_trace_update_t callback pointer
+ */
+static inline void
+adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr)
+{
+ __adf_nbuf_reg_trace_cb(cb_func_ptr);
+}
+
+/**
+ * @brief This function updates protocol event
+ *
+ * @param[in] buf buffer
+ * @param[in] char * event string
+ */
+static inline void
+adf_nbuf_trace_update(adf_nbuf_t buf, char *event_string)
+{
+ __adf_nbuf_trace_update(buf, event_string);
+}
#endif
diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
index d7e18d5db2bb..5d684e4fd2f0 100644
--- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
+++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
@@ -63,6 +63,8 @@ typedef void (*__adf_nbuf_callback_fn) (struct sk_buff *skb);
*/
#define CVG_NBUF_MAX_EXTRA_FRAGS 2
+typedef void (*adf_nbuf_trace_update_t)(char *);
+
struct cvg_nbuf_cb {
/*
* Store a pointer to a parent network buffer.
@@ -107,6 +109,10 @@ struct cvg_nbuf_cb {
#ifdef IPA_OFFLOAD
unsigned long priv_data;
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ unsigned char proto_type;
+ unsigned char vdev_id;
+#endif /* QCA_PKT_PROTO_TRACE */
};
#define NBUF_OWNER_ID(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->owner_id)
@@ -131,6 +137,16 @@ struct cvg_nbuf_cb {
#define NBUF_EXTRA_FRAG_WORDSTREAM_FLAGS(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->extra_frags.wordstream_flags)
+#ifdef QCA_PKT_PROTO_TRACE
+#define NBUF_SET_PROTO_TYPE(skb, proto_type) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->proto_type = proto_type)
+#define NBUF_GET_PROTO_TYPE(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->proto_type)
+#else
+#define NBUF_SET_PROTO_TYPE(skb, proto_type);
+#define NBUF_GET_PROTO_TYPE(skb) 0;
+#endif /* QCA_PKT_PROTO_TRACE */
+
#define __adf_nbuf_get_num_frags(skb) \
/* assume the OS provides a single fragment */ \
(NBUF_NUM_EXTRA_FRAGS(skb) + 1)
@@ -178,6 +194,10 @@ struct cvg_nbuf_cb {
((is_wordstream) << frag_num); \
} while (0)
+#define __adf_nbuf_trace_set_proto_type(skb, proto_type) \
+ NBUF_SET_PROTO_TYPE(skb, proto_type)
+#define __adf_nbuf_trace_get_proto_type(skb) \
+ NBUF_GET_PROTO_TYPE(skb);
typedef struct __adf_nbuf_qhead {
struct sk_buff *head;
@@ -229,6 +249,8 @@ void __adf_nbuf_unmap_single(__adf_os_device_t osdev,
void __adf_nbuf_dmamap_info(__adf_os_dma_map_t bmap, adf_os_dmamap_info_t *sg);
void __adf_nbuf_frag_info(struct sk_buff *skb, adf_os_sglist_t *sg);
void __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void *arg);
+void __adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr);
+void __adf_nbuf_trace_update(struct sk_buff *skb, char *event_string);
static inline a_status_t
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index 8af13d78ee53..a2944c554c2d 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -1299,7 +1299,11 @@ WLANTL_STAPktPending
============================================================================*/
adf_nbuf_t WLANTL_SendSTA_DataFrame(v_PVOID_t pvosGCtx, v_U8_t ucSTAId,
- adf_nbuf_t buf);
+ adf_nbuf_t buf
+#ifdef QCA_PKT_PROTO_TRACE
+ , v_U8_t proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ );
#endif
#ifdef IPA_OFFLOAD
diff --git a/CORE/VOSS/inc/vos_packet.h b/CORE/VOSS/inc/vos_packet.h
index 48e01c75ad73..586479d43338 100644
--- a/CORE/VOSS/inc/vos_packet.h
+++ b/CORE/VOSS/inc/vos_packet.h
@@ -57,6 +57,77 @@ struct vos_pkt_t;
typedef struct vos_pkt_t vos_pkt_t;
#ifdef QCA_WIFI_2_0
+
+#ifdef QCA_PKT_PROTO_TRACE
+#include "adf_nbuf.h"
+
+#define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL
+#define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP
+
+#define VOS_PKT_TRAC_DUMP_CMD 9999
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_get_proto_type() -
+ Find protoco type from packet contents
+
+ * skb Packet Pointer
+ * tracking_map packet type want to track
+
+---------------------------------------------------------------------------*/
+v_U8_t vos_pkt_get_proto_type
+(
+ struct sk_buff *skb,
+ v_U8_t tracking_map
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_update() -
+ Update storage buffer with interest event string
+
+ * event_string Event String may packet type or outstanding event
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_update
+(
+ char *event_string
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_dump() -
+ Dump stored information into kernel log
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_dump
+(
+ void
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_init() -
+ Initialize protocol trace functionality, allocate required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_init
+(
+ void
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_close() -
+ Free required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_close
+(
+ void
+);
+#endif /* QCA_PKT_PROTO_TRACE */
+
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 78c556469739..8bb6bfae99b6 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -50,6 +50,31 @@
#include "vos_memory.h"
#include "adf_os_mem.h"
+#ifdef QCA_PKT_PROTO_TRACE
+/* Protocol specific packet tracking feature */
+#define VOS_PKT_TRAC_ETH_TYPE_OFFSET 12
+#define VOS_PKT_TRAC_IP_OFFSET 14
+#define VOS_PKT_TRAC_IP_HEADER_SIZE 20
+#define VOS_PKT_TRAC_DHCP_SRV_PORT 67
+#define VOS_PKT_TRAC_DHCP_CLI_PORT 68
+#define VOS_PKT_TRAC_EAPOL_ETH_TYPE 0x888E
+#define VOS_PKT_TRAC_MAX_STRING_LEN 12
+#define VOS_PKT_TRAC_MAX_TRACE_BUF 50
+#define VOS_PKT_TRAC_MAX_STRING_BUF 64
+
+/* protocol Storage Structure */
+typedef struct
+{
+ v_U32_t order;
+ v_TIME_t event_time;
+ char event_string[VOS_PKT_TRAC_MAX_STRING_LEN];
+} vos_pkt_proto_trace_t;
+
+vos_pkt_proto_trace_t *trace_buffer = NULL;
+unsigned int trace_buffer_order = 0;
+vos_spin_lock_t trace_buffer_lock;
+#endif /* QCA_PKT_PROTO_TRACE */
+
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
@@ -212,6 +237,182 @@ VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket,
return VOS_STATUS_SUCCESS;
}
+#ifdef QCA_PKT_PROTO_TRACE
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_get_proto_type() -
+ Find protoco type from packet contents
+
+ * skb Packet Pointer
+ * tracking_map packet type want to track
+
+---------------------------------------------------------------------------*/
+v_U8_t vos_pkt_get_proto_type
+(
+ struct sk_buff *skb,
+ v_U8_t tracking_map
+)
+{
+ v_U8_t pkt_proto_type = 0;
+ v_U16_t ether_type;
+ v_U16_t SPort;
+ v_U16_t DPort;
+
+ /* EAPOL Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map)
+ {
+ ether_type = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_ETH_TYPE_OFFSET));
+ if (VOS_PKT_TRAC_EAPOL_ETH_TYPE == VOS_SWAP_U16(ether_type))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_EAPOL;
+ }
+ }
+
+ /* DHCP Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_DHCP & tracking_map)
+ {
+ SPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE));
+ DPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE + sizeof(v_U16_t)));
+ if (((VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(DPort))) ||
+ ((VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(DPort))))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_DHCP;
+ }
+ }
+
+ /* Protocol type map */
+ return pkt_proto_type;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_update() -
+ Update storage buffer with interest event string
+
+ * event_string Event String may packet type or outstanding event
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_update
+(
+ char *event_string
+)
+{
+ v_U32_t slot;
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s %d, %s", __func__, __LINE__, event_string);
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ trace_buffer[slot].order = trace_buffer_order;
+ trace_buffer[slot].event_time = vos_timer_get_system_time();
+ vos_mem_copy(trace_buffer[slot].event_string,
+ event_string,
+ (VOS_PKT_TRAC_MAX_STRING_LEN < strlen(event_string))?
+ VOS_PKT_TRAC_MAX_STRING_LEN:strlen(event_string));
+ trace_buffer_order++;
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_dump() -
+ Dump stored information into kernel log
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_dump
+(
+ void
+)
+{
+ v_U32_t slot, idx;
+
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP START Current Timestamp %u",
+ (unsigned int)vos_timer_get_system_time());
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "ORDER : TIME : EVT");
+ if (VOS_PKT_TRAC_MAX_TRACE_BUF > trace_buffer_order)
+ {
+ for (slot = 0 ; slot < trace_buffer_order; slot++)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+ else
+ {
+ for (idx = 0 ; idx < VOS_PKT_TRAC_MAX_TRACE_BUF; idx++)
+ {
+ slot = (trace_buffer_order + idx) % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP END");
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_init() -
+ Initialize protocol trace functionality, allocate required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_init
+(
+ void
+)
+{
+ /* Init spin lock to protect global memory */
+ vos_spin_lock_init(&trace_buffer_lock);
+ trace_buffer_order = 0;
+ trace_buffer = vos_mem_malloc(
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+ vos_mem_zero((void *)trace_buffer,
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+
+ /* Register callback function to NBUF
+ * Lower layer event also will be reported to here */
+ adf_nbuf_reg_trace_cb(vos_pkt_trace_buf_update);
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_close() -
+ Free required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_close
+(
+ void
+)
+{
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s %d", __func__, __LINE__);
+ vos_mem_free(trace_buffer);
+ vos_spin_lock_destroy(&trace_buffer_lock);
+
+ return;
+}
+#endif /* QCA_PKT_PROTO_TRACE */
#else
/*--------------------------------------------------------------------------
diff --git a/Kbuild b/Kbuild
index 0aecfdf5d771..fa5b33c0de73 100755..100644
--- a/Kbuild
+++ b/Kbuild
@@ -879,7 +879,8 @@ ifeq ($(CONFIG_QCA_WIFI_2_0), 0)
CDEFINES += -DWLANTL_DEBUG
else
CDEFINES += -DOSIF_NEED_RX_PEER_ID \
- -DQCA_SUPPORT_TXRX_LOCAL_PEER_ID
+ -DQCA_SUPPORT_TXRX_LOCAL_PEER_ID \
+ -DQCA_PKT_PROTO_TRACE
endif
ifneq ($(CONFIG_QCA_CLD_WLAN),)