summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2014-11-12 13:58:16 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2014-11-12 13:58:16 -0800
commit1f4ae4f453374bc52c6bc52e44bcd5f512825f94 (patch)
treed0a9a26b42cb4e9a7dc7160d44b89e6827d9b8d7
parent7c379ac3b0f1290a3e7fbda7799f1ab1950a6bbf (diff)
parentece76135a524e45ffe882c5e0e9305b9ea4b77f0 (diff)
Merge "Release 1.0.0.233 QCACLD WLAN Drive"
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h12
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c12
-rw-r--r--CORE/MAC/inc/qwlan_version.h4
-rw-r--r--CORE/SERVICES/BMI/ol_fw.c3
-rw-r--r--CORE/SERVICES/HIF/USB/if_usb.c86
-rw-r--r--CORE/SERVICES/HIF/USB/if_usb.h2
-rw-r--r--CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c40
-rw-r--r--CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h2
-rw-r--r--CORE/SME/inc/csrApi.h6
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c10
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c5
-rw-r--r--CORE/UTILS/PKTLOG/linux_ac.c7
13 files changed, 158 insertions, 38 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 05930db731ab..06506df25a91 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2365,14 +2365,14 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_BUS_BANDWIDTH_COMPUTE_INTERVAL_MAX ( 10000 )
#define CFG_TCP_DELACK_THRESHOLD_HIGH "gTcpDelAckThresholdHigh"
-#define CFG_TCP_DELACK_THRESHOLD_HIGH_DEFAULT ( 4000 )
+#define CFG_TCP_DELACK_THRESHOLD_HIGH_DEFAULT ( 10000 )
#define CFG_TCP_DELACK_THRESHOLD_HIGH_MIN ( 1000 )
-#define CFG_TCP_DELACK_THRESHOLD_HIGH_MAX ( 10000 )
+#define CFG_TCP_DELACK_THRESHOLD_HIGH_MAX ( 16000 )
#define CFG_TCP_DELACK_THRESHOLD_LOW "gTcpDelAckThresholdLow"
#define CFG_TCP_DELACK_THRESHOLD_LOW_DEFAULT ( 1000 )
#define CFG_TCP_DELACK_THRESHOLD_LOW_MIN ( 0 )
-#define CFG_TCP_DELACK_THRESHOLD_LOW_MAX ( 4000 )
+#define CFG_TCP_DELACK_THRESHOLD_LOW_MAX ( 10000 )
#endif /* MSM_PLATFORM */
#ifdef WLAN_FEATURE_11W
@@ -2575,6 +2575,11 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
#define CFG_DHCP_SERVER_IP_DEFAULT ""
#endif /* DHCP_SERVER_OFFLOAD */
+#define CFG_ENABLE_MAC_ADDR_SPOOFING "gEnableMacAddrSpoof"
+#define CFG_ENABLE_MAC_ADDR_SPOOFING_MIN (0)
+#define CFG_ENABLE_MAC_ADDR_SPOOFING_MAX (1)
+#define CFG_ENABLE_MAC_ADDR_SPOOFING_DEFAULT (1)
+
/*---------------------------------------------------------------------------
Type declarations
-------------------------------------------------------------------------*/
@@ -3131,6 +3136,7 @@ typedef struct
v_U32_t dhcpMaxNumClients;
v_U8_t dhcpServerIP[IPADDR_STRING_LENGTH];
#endif /* DHCP_SERVER_OFFLOAD */
+ bool enable_mac_spoofing;
} hdd_config_t;
#ifdef WLAN_FEATURE_MBSSID
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index aa4bedb17048..607ac533e25b 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -3376,6 +3376,13 @@ REG_TABLE_ENTRY g_registry_table[] =
VAR_FLAGS_OPTIONAL,
(void *) CFG_DHCP_SERVER_IP_DEFAULT ),
#endif /* DHCP_SERVER_OFFLOAD */
+
+ REG_VARIABLE( CFG_ENABLE_MAC_ADDR_SPOOFING, WLAN_PARAM_Integer,
+ hdd_config_t, enable_mac_spoofing,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ENABLE_MAC_ADDR_SPOOFING_DEFAULT,
+ CFG_ENABLE_MAC_ADDR_SPOOFING_MIN,
+ CFG_ENABLE_MAC_ADDR_SPOOFING_MAX ),
};
#ifdef WLAN_FEATURE_MBSSID
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index ef72807a3717..d56a6aa5ae90 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -1243,9 +1243,21 @@ wlan_hdd_cfg80211_set_scanning_mac_oui(struct wiphy *wiphy,
hdd_context_t *pHddCtx = wiphy_priv(wiphy);
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX + 1];
eHalStatus status;
+ int ret;
ENTER();
+ ret = wlan_hdd_validate_context(pHddCtx);
+ if (0 != ret) {
+ hddLog(LOGE, FL("HDD context is not valid"));
+ return ret;
+ }
+
+ if (FALSE == pHddCtx->cfg_ini->enable_mac_spoofing) {
+ hddLog(LOGW, FL("MAC address spoofing is not enabled"));
+ return -ENOTSUPP;
+ }
+
if (nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SET_SCANNING_MAC_OUI_MAX,
data, data_len,
NULL)) {
diff --git a/CORE/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h
index 4e80a4d7c8da..cc73bea666e9 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 232
+#define QWLAN_VERSION_BUILD 233
-#define QWLAN_VERSIONSTR "1.0.0.232"
+#define QWLAN_VERSIONSTR "1.0.0.233"
#define AR6320_REV1_VERSION 0x5000000
diff --git a/CORE/SERVICES/BMI/ol_fw.c b/CORE/SERVICES/BMI/ol_fw.c
index 42cd9bef6f17..3b1996c1e9e0 100644
--- a/CORE/SERVICES/BMI/ol_fw.c
+++ b/CORE/SERVICES/BMI/ol_fw.c
@@ -1077,6 +1077,9 @@ void ol_ramdump_handler(struct ol_softc *scn)
min_t(A_UINT32, len - 4, FW_REG_DUMP_CNT * 4),
false);
scn->fw_ram_dumping = 0;
+
+ if (scn->enableFwSelfRecovery)
+ kobject_uevent(&scn->adf_dev->dev->kobj, KOBJ_OFFLINE);
}
else if (pattern == FW_REG_PATTERN) {
reg = (A_UINT32 *) (data + 4);
diff --git a/CORE/SERVICES/HIF/USB/if_usb.c b/CORE/SERVICES/HIF/USB/if_usb.c
index 2b3ded45a077..2169a93b3f15 100644
--- a/CORE/SERVICES/HIF/USB/if_usb.c
+++ b/CORE/SERVICES/HIF/USB/if_usb.c
@@ -39,7 +39,7 @@
#include "wma_api.h"
#include "wlan_hdd_main.h"
#include "epping_main.h"
-
+#include "vos_sched.h"
#ifndef REMOVE_PKT_LOG
#include "ol_txrx_types.h"
@@ -71,6 +71,7 @@ static wait_queue_head_t hif_usb_unload_event_wq;
static atomic_t hif_usb_unload_state;
struct hif_usb_softc *usb_sc = NULL;
static int hif_usb_resume(struct usb_interface *interface);
+static atomic_t hif_usb_hdd_remove;
static int
hif_usb_configure(struct hif_usb_softc *sc, hif_handle_t *hif_hdl,
@@ -170,7 +171,9 @@ hif_usb_probe(struct usb_interface *interface, const struct usb_device_id *id)
init_waitqueue_head(&ol_sc->sc_osdev->event_queue);
- ret = hdd_wlan_startup(&pdev->dev, ol_sc);
+ ret = hif_init_adf_ctx(ol_sc);
+ if (ret == 0)
+ ret = hdd_wlan_startup(&pdev->dev, ol_sc);
if (ret) {
hif_nointrs(sc);
if (sc->hif_device != NULL) {
@@ -205,6 +208,7 @@ hif_usb_probe(struct usb_interface *interface, const struct usb_device_id *id)
return 0;
err_config:
+ hif_deinit_adf_ctx(ol_sc);
A_FREE(ol_sc);
err_attach:
ret = -EIO;
@@ -253,19 +257,24 @@ static void hif_usb_remove(struct usb_interface *interface)
HIF_USB_UNLOAD_STATE_TARGET_RESET);
scn = sc->ol_sc;
- if (usb_sc->hdd_removed == 0) {
- usb_sc->hdd_removed_processing = 1;
+ if (atomic_read(&hif_usb_hdd_remove) == 0) {
+ atomic_set(&hif_usb_hdd_remove, 1);
+
+ if (usb_sc->hdd_removed == 0) {
+ usb_sc->hdd_removed = 1;
+ usb_sc->hdd_removed_processing = 1;
#ifndef REMOVE_PKT_LOG
- if (vos_get_conparam() != VOS_FTM_MODE &&
- !WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
- pktlogmod_exit(scn);
+ if (vos_get_conparam() != VOS_FTM_MODE &&
+ !WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
+ pktlogmod_exit(scn);
#endif
- __hdd_wlan_exit();
- usb_sc->hdd_removed_processing = 0;
- usb_sc->hdd_removed = 1;
+ __hdd_wlan_exit();
+ usb_sc->hdd_removed_processing = 0;
+ }
}
hif_nointrs(sc);
HIF_USBDeviceDetached(interface, 1);
+ hif_deinit_adf_ctx(scn);
A_FREE(scn);
A_FREE(sc);
usb_sc = NULL;
@@ -384,20 +393,44 @@ struct usb_driver hif_usb_drv_id = {
.supports_autosuspend = true,
};
-void hif_init_adf_ctx(adf_os_device_t adf_dev, void *ol_sc)
+int hif_init_adf_ctx(void *ol_sc)
{
+ adf_os_device_t adf_ctx;
+ v_CONTEXT_t pVosContext = NULL;
struct ol_softc *sc = (struct ol_softc *)ol_sc;
struct hif_usb_softc *hif_sc = (struct hif_usb_softc *)sc->hif_sc;
- adf_dev->drv = &hif_sc->aps_osdev;
- adf_dev->drv_hdl = hif_sc->aps_osdev.bdev;
- adf_dev->dev = hif_sc->aps_osdev.device;
- sc->adf_dev = adf_dev;
+
+ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ if(pVosContext == NULL)
+ return -EFAULT;
+
+ adf_ctx = vos_mem_malloc(sizeof(*adf_ctx));
+ if (!adf_ctx)
+ return -ENOMEM;
+ vos_mem_zero(adf_ctx, sizeof(*adf_ctx));
+ adf_ctx->drv = &hif_sc->aps_osdev;
+ adf_ctx->drv_hdl = hif_sc->aps_osdev.bdev;
+ adf_ctx->dev = hif_sc->aps_osdev.device;
+ sc->adf_dev = adf_ctx;
+ ((VosContextType*)(pVosContext))->adf_ctx = adf_ctx;
+ return 0;
}
void hif_deinit_adf_ctx(void *ol_sc)
{
struct ol_softc *sc = (struct ol_softc *)ol_sc;
- sc->adf_dev = NULL;
+
+ if (sc == NULL)
+ return;
+ if (sc->adf_dev) {
+ v_CONTEXT_t pVosContext = NULL;
+
+ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ vos_mem_free(sc->adf_dev);
+ sc->adf_dev = NULL;
+ if (pVosContext)
+ ((VosContextType*)(pVosContext))->adf_ctx = NULL;
+ }
}
static int hif_usb_dev_notify(struct notifier_block *nb,
@@ -433,6 +466,7 @@ int hif_register_driver(void)
is_usb_driver_register = 1;
init_waitqueue_head(&hif_usb_unload_event_wq);
atomic_set(&hif_usb_unload_state, HIF_USB_UNLOAD_STATE_NULL);
+ atomic_set(&hif_usb_hdd_remove, 0);
usb_register_notify(&hif_usb_dev_nb);
return usb_register(&hif_usb_drv_id);
}
@@ -458,16 +492,20 @@ void hif_unregister_driver(void)
usb_sc->local_state.event = 0;
}
- if (usb_sc->hdd_removed == 0) {
- usb_sc->hdd_removed_processing = 1;
+ if (atomic_read(&hif_usb_hdd_remove) == 0) {
+ atomic_set(&hif_usb_hdd_remove, 1);
+
+ if (usb_sc->hdd_removed == 0) {
+ usb_sc->hdd_removed = 1;
+ usb_sc->hdd_removed_processing = 1;
#ifndef REMOVE_PKT_LOG
- if (vos_get_conparam() != VOS_FTM_MODE &&
- !WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
- pktlogmod_exit(usb_sc->ol_sc);
+ if (vos_get_conparam() != VOS_FTM_MODE &&
+ !WLAN_IS_EPPING_ENABLED(vos_get_conparam()))
+ pktlogmod_exit(usb_sc->ol_sc);
#endif
- __hdd_wlan_exit();
- usb_sc->hdd_removed_processing = 0;
- usb_sc->hdd_removed = 1;
+ __hdd_wlan_exit();
+ usb_sc->hdd_removed_processing = 0;
+ }
}
}
is_usb_driver_register = 0;
diff --git a/CORE/SERVICES/HIF/USB/if_usb.h b/CORE/SERVICES/HIF/USB/if_usb.h
index cfdf4e76c8f2..85ce3c001b51 100644
--- a/CORE/SERVICES/HIF/USB/if_usb.h
+++ b/CORE/SERVICES/HIF/USB/if_usb.h
@@ -100,7 +100,7 @@ extern void pktlogmod_exit(void *context);
/*These functions are exposed to HDD*/
int hif_register_driver(void);
void hif_unregister_driver(void);
-void hif_init_adf_ctx(adf_os_device_t adf_dev, void *ol_sc);
+int hif_init_adf_ctx(void *ol_sc);
void hif_init_pdev_txrx_handle(void *ol_sc, void *txrx_handle);
void hif_disable_isr(void *ol_sc);
void hif_reset_soc(void *ol_sc);
diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c
index f4d7ebe44d36..76010b373da7 100644
--- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c
+++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c
@@ -43,6 +43,7 @@
#include "bmi_msg.h" /* TARGET_TYPE_ */
#include "if_ath_sdio.h"
#include "vos_api.h"
+#include "vos_sched.h"
#ifndef REMOVE_PKT_LOG
#include "ol_txrx_types.h"
@@ -164,8 +165,9 @@ ath_hif_sdio_probe(void *context, void *hif_handle)
ret = A_ERROR;
goto err_attach1;
}
-
- ret = hdd_wlan_startup(&(func->dev), ol_sc);
+ ret = hif_init_adf_ctx(ol_sc);
+ if (ret == 0)
+ ret = hdd_wlan_startup(&(func->dev), ol_sc);
if ( ret ) {
VOS_TRACE(VOS_MODULE_ID_HIF, VOS_TRACE_LEVEL_FATAL," hdd_wlan_startup failed");
goto err_attach2;
@@ -195,6 +197,7 @@ end:
err_attach2:
athdiag_procfs_remove();
+ hif_deinit_adf_ctx(ol_sc);
err_attach1:
A_FREE(ol_sc);
err_attach:
@@ -249,6 +252,7 @@ ath_hif_sdio_remove(void *context, void *hif_handle)
__hdd_wlan_exit();
if (sc && sc->ol_sc){
+ hif_deinit_adf_ctx(sc->ol_sc);
A_FREE(sc->ol_sc);
sc->ol_sc = NULL;
}
@@ -340,21 +344,43 @@ void hif_unregister_driver(void)
return ;
}
-void hif_init_adf_ctx(adf_os_device_t adf_dev, void *ol_sc)
+int hif_init_adf_ctx(void *ol_sc)
{
+ adf_os_device_t adf_ctx;
+ v_CONTEXT_t pVosContext = NULL;
struct ol_softc *ol_sc_local = (struct ol_softc *)ol_sc;
struct ath_hif_sdio_softc *hif_sc = ol_sc_local->hif_sc;
ENTER();
- adf_dev->drv = &hif_sc->aps_osdev;
- adf_dev->dev = hif_sc->aps_osdev.device;
- ol_sc_local->adf_dev = adf_dev;
+ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ if(pVosContext == NULL)
+ return -EFAULT;
+ adf_ctx = vos_mem_malloc(sizeof(*adf_ctx));
+ if (!adf_ctx)
+ return -ENOMEM;
+ vos_mem_zero(adf_ctx, sizeof(*adf_ctx));
+ adf_ctx->drv = &hif_sc->aps_osdev;
+ adf_ctx->dev = hif_sc->aps_osdev.device;
+ ol_sc_local->adf_dev = adf_ctx;
+ ((VosContextType*)(pVosContext))->adf_ctx = adf_ctx;
EXIT();
+ return 0;
}
void hif_deinit_adf_ctx(void *ol_sc)
{
struct ol_softc *sc = (struct ol_softc *)ol_sc;
- sc->adf_dev = NULL;
+
+ if (sc == NULL)
+ return;
+ if (sc->adf_dev) {
+ v_CONTEXT_t pVosContext = NULL;
+
+ pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL);
+ vos_mem_free(sc->adf_dev);
+ sc->adf_dev = NULL;
+ if (pVosContext)
+ ((VosContextType*)(pVosContext))->adf_ctx = NULL;
+ }
}
/* Function to set the TXRX handle in the ol_sc context */
diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h
index 8de7217ad844..103443af8636 100644
--- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h
+++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h
@@ -93,7 +93,7 @@ int ath_sdio_resume(void *context);
/*These functions are exposed to HDD*/
int hif_register_driver(void);
void hif_unregister_driver(void);
-void hif_init_adf_ctx(adf_os_device_t adf_dev, void *ol_sc);
+int hif_init_adf_ctx(void *ol_sc);
void hif_deinit_adf_ctx(void *ol_sc);
void hif_disable_isr(void *ol_sc);
void hif_init_pdev_txrx_handle(void *ol_sc, void *txrx_handle);
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 53357291e16a..e839a5d8ee4b 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -1017,6 +1017,12 @@ typedef struct tagCsrRoamConnectedProfile
#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
tCsrRoamHTProfile HTProfile;
#endif
+#ifdef WLAN_FEATURE_11W
+ /* Management Frame Protection */
+ tANI_BOOLEAN MFPEnabled;
+ tANI_U8 MFPRequired;
+ tANI_U8 MFPCapable;
+#endif
}tCsrRoamConnectedProfile;
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index d4e014d965d3..df1fa201c266 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -6675,6 +6675,11 @@ eHalStatus csrRoamCopyConnectedProfile(tpAniSirGlobal pMac, tANI_U32 sessionId,
pDstProfile->CBMode = pSrcProfile->CBMode;
vos_mem_copy(&pDstProfile->Keys, &pSrcProfile->Keys,
sizeof(pDstProfile->Keys));
+#ifdef WLAN_FEATURE_11W
+ pDstProfile->MFPEnabled = pSrcProfile->MFPEnabled;
+ pDstProfile->MFPRequired = pSrcProfile->MFPRequired;
+ pDstProfile->MFPCapable = pSrcProfile->MFPCapable;
+#endif
#ifdef WLAN_FEATURE_VOWIFI_11R
if (pSrcProfile->MDID.mdiePresent)
{
@@ -7580,6 +7585,11 @@ eHalStatus csrRoamSaveConnectedInfomation(tpAniSirGlobal pMac, tANI_U32 sessionI
pProfile->nAddIEAssocLength);
}
+#ifdef WLAN_FEATURE_11W
+ pConnectProfile->MFPEnabled = pProfile->MFPEnabled;
+ pConnectProfile->MFPRequired = pProfile->MFPRequired;
+ pConnectProfile->MFPCapable = pProfile->MFPCapable;
+#endif
//Save bssid
csrGetBssIdBssDesc(pMac, pSirBssDesc, &pConnectProfile->bssid);
#ifdef WLAN_FEATURE_VOWIFI_11R
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 2cf7ad0e974c..8cbea8ce5e76 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -1867,6 +1867,11 @@ csrNeighborRoamPrepareScanProfileFilter(tpAniSirGlobal pMac,
}
#endif
+#ifdef WLAN_FEATURE_11W
+ pScanFilter->MFPEnabled = pCurProfile->MFPEnabled;
+ pScanFilter->MFPRequired = pCurProfile->MFPRequired;
+ pScanFilter->MFPCapable = pCurProfile->MFPCapable;
+#endif
return eHAL_STATUS_SUCCESS;
}
diff --git a/CORE/UTILS/PKTLOG/linux_ac.c b/CORE/UTILS/PKTLOG/linux_ac.c
index e067c23524fc..96a131e69582 100644
--- a/CORE/UTILS/PKTLOG/linux_ac.c
+++ b/CORE/UTILS/PKTLOG/linux_ac.c
@@ -874,6 +874,13 @@ void pktlogmod_exit(void *context)
return;
/*
+ * pktlog already be detached
+ * avoid to detach and remove proc entry again
+ */
+ if (!pl_dev->pl_info)
+ return;
+
+ /*
* Disable firmware side pktlog function
*/
if (pl_dev->tgt_pktlog_enabled) {