summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSrinivas Girigowda <sgirigow@qca.qualcomm.com>2016-02-25 16:02:42 -0800
committerqcabuildsw <qcabuildsw@localhost>2016-08-20 10:36:55 -0700
commitc34f11dfd8a86b1c314ad776663258d74769d3ef (patch)
tree16a16a24d9615306fd8e4c2cb543e1ca2e9ee0f4
parentd9e6f7bb2f81f71ed8f581a08596cd6e52a54dac (diff)
qcacld-3.0: Add support to enable/disable packetlog using iwpriv
Add support to enable/disable packetlog using iwpriv wlan0 pktlog command. Change-Id: Ia17f659e16221985be5cd9e75ebf0c46f2dc5693 CRs-Fixed: 970647
-rw-r--r--core/hdd/inc/qc_sap_ioctl.h3
-rw-r--r--core/hdd/inc/wlan_hdd_main.h23
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c41
-rw-r--r--core/hdd/src/wlan_hdd_main.c49
-rw-r--r--core/hdd/src/wlan_hdd_power.c2
-rw-r--r--core/hdd/src/wlan_hdd_wext.c12
-rw-r--r--core/mac/inc/sir_api.h4
-rw-r--r--core/sme/src/common/sme_api.c2
-rw-r--r--core/utils/pktlog/include/pktlog_ac.h16
-rw-r--r--core/utils/pktlog/linux_ac.c31
-rw-r--r--core/utils/pktlog/pktlog_ac.c58
-rw-r--r--core/wma/src/wma_features.c11
-rw-r--r--core/wma/src/wma_main.c6
13 files changed, 194 insertions, 64 deletions
diff --git a/core/hdd/inc/qc_sap_ioctl.h b/core/hdd/inc/qc_sap_ioctl.h
index 33dd11d68278..ed8bec7dd5e4 100644
--- a/core/hdd/inc/qc_sap_ioctl.h
+++ b/core/hdd/inc/qc_sap_ioctl.h
@@ -144,7 +144,8 @@ typedef struct {
#define QCSAP_IOCTL_GET_CHANNEL (SIOCIWFIRSTPRIV + 9)
#define QCSAP_IOCTL_ASSOC_STA_MACADDR (SIOCIWFIRSTPRIV + 10)
#define QCSAP_IOCTL_DISASSOC_STA (SIOCIWFIRSTPRIV + 11)
-/* (SIOCIWFIRSTPRIV+12) is unused */
+#define QCSAP_IOCTL_SET_PKTLOG (SIOCIWFIRSTPRIV + 12)
+
/* Private ioctls and their sub-ioctls */
#define QCSAP_PRIV_GET_CHAR_SET_NONE (SIOCIWFIRSTPRIV + 13)
#define QCSAP_GET_STATS 1
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index fe1170847e88..40242313f10e 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -1690,6 +1690,20 @@ 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);
+#else
+int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable, uint8_t)
+{
+ return 0;
+}
+int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value)
+{
+ return 0;
+}
+#endif /* REMOVE_PKT_LOG */
+
#ifdef FEATURE_TSO
/**
* hdd_set_tso_flags() - enable TSO flags in the network device
@@ -1806,13 +1820,4 @@ 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);
-#if !defined(REMOVE_PKT_LOG)
-int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable);
-#else
-int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable)
-{
- return 0;
-}
-#endif /* REMOVE_PKT_LOG */
-
#endif /* end #if !defined(WLAN_HDD_MAIN_H) */
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index 98443d195e8e..22f74ef1ef36 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -3603,6 +3603,39 @@ static iw_softap_set_max_tx_power(struct net_device *dev,
}
int
+static __iw_softap_set_pktlog(struct net_device *dev,
+ struct iw_request_info *info,
+ union iwreq_data *wrqu, char *extra)
+{
+ hdd_adapter_t *pHostapdAdapter = netdev_priv(dev);
+ hdd_context_t *hdd_ctx;
+ int *value = (int *)extra;
+
+ ENTER_DEV(dev);
+
+ if (NULL == value)
+ return -ENOMEM;
+
+ hdd_ctx = WLAN_HDD_GET_CTX(pHostapdAdapter);
+ return hdd_process_pktlog_command(hdd_ctx, value[0]);
+}
+
+int
+static iw_softap_set_pktlog(struct net_device *dev,
+ struct iw_request_info *info,
+ union iwreq_data *wrqu, char *extra)
+{
+ int ret;
+
+ cds_ssr_protect(__func__);
+ ret = __iw_softap_set_pktlog(dev, info, wrqu, extra);
+ cds_ssr_unprotect(__func__);
+
+ return ret;
+}
+
+
+int
static __iw_softap_set_tx_power(struct net_device *dev,
struct iw_request_info *info,
union iwreq_data *wrqu, char *extra)
@@ -6096,6 +6129,12 @@ static const struct iw_priv_args hostapd_private_args[] = {
0, "setTxMaxPower"
}
,
+ {
+ QCSAP_IOCTL_SET_PKTLOG,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "pktlog"
+ }
+ ,
/* Set HDD CFG Ini param */
{
QCSAP_IOCTL_SET_INI_CFG,
@@ -6195,6 +6234,8 @@ static const iw_handler hostapd_private[] = {
iw_softap_set_tx_power,
[QCSAP_IOCTL_SET_MAX_TX_POWER - SIOCIWFIRSTPRIV] =
iw_softap_set_max_tx_power,
+ [QCSAP_IOCTL_SET_PKTLOG - SIOCIWFIRSTPRIV] =
+ iw_softap_set_pktlog,
[QCSAP_IOCTL_SET_INI_CFG - SIOCIWFIRSTPRIV] =
iw_softap_set_ini_cfg,
[QCSAP_IOCTL_GET_INI_CFG - SIOCIWFIRSTPRIV] =
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index a71efbdb767e..fa75d45d4e53 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -6704,6 +6704,47 @@ static inline void hdd_release_rtnl_lock(void) { }
#endif
#if !defined(REMOVE_PKT_LOG)
+
+/**
+ * hdd_process_pktlog_command() - process pktlog command
+ * @hdd_ctx: hdd context
+ * @set_value: value set by user
+ *
+ * Return: 0 for success or error.
+ */
+int hdd_process_pktlog_command(hdd_context_t *hdd_ctx, uint32_t set_value)
+{
+ int ret;
+ bool enable;
+ uint8_t user_triggered = 0;
+
+ ret = wlan_hdd_validate_context(hdd_ctx);
+ if (0 != ret)
+ return ret;
+
+ hdd_info("set pktlog %d", set_value);
+
+ if (set_value > 2) {
+ hdd_err("invalid pktlog value %d", set_value);
+ return -EINVAL;
+ }
+
+ /*
+ * set_value = 0 then disable packetlog
+ * set_value = 1 enable packetlog forcefully
+ * set_vlaue = 2 then disable packetlog if disabled through ini or
+ * enable packetlog with AUTO type.
+ */
+ enable = ((set_value > 0) && cds_is_packet_log_enabled()) ?
+ true : false;
+
+ if (1 == set_value) {
+ enable = true;
+ user_triggered = 1;
+ }
+
+ return hdd_pktlog_enable_disable(hdd_ctx, enable, user_triggered);
+}
/**
* hdd_pktlog_enable_disable() - Enable/Disable packet logging
* @hdd_ctx: HDD context
@@ -6711,7 +6752,8 @@ static inline void hdd_release_rtnl_lock(void) { }
*
* Return: 0 on success; error number otherwise
*/
-int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable)
+int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable,
+ uint8_t user_triggered)
{
struct sir_wifi_start_log start_log;
QDF_STATUS status;
@@ -6719,6 +6761,9 @@ int hdd_pktlog_enable_disable(hdd_context_t *hdd_ctx, bool enable)
start_log.ring_id = RING_ID_PER_PACKET_STATS;
start_log.verbose_level =
enable ? WLAN_LOG_LEVEL_ACTIVE : WLAN_LOG_LEVEL_OFF;
+ start_log.ini_triggered = cds_is_packet_log_enabled();
+ start_log.user_triggered = user_triggered;
+
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);
@@ -7537,7 +7582,7 @@ int hdd_wlan_startup(struct device *dev)
if (cds_is_packet_log_enabled())
- hdd_pktlog_enable_disable(hdd_ctx, true);
+ hdd_pktlog_enable_disable(hdd_ctx, true, 0);
ret = hdd_register_notifiers(hdd_ctx);
if (ret)
diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c
index 02f62be9ace5..d538ff112010 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -1444,7 +1444,7 @@ QDF_STATUS hdd_wlan_re_init(void)
goto err_cds_disable;
if (cds_is_packet_log_enabled())
- hdd_pktlog_enable_disable(pHddCtx, true);
+ hdd_pktlog_enable_disable(pHddCtx, true, 0);
hdd_err("WLAN host driver reinitiation completed!");
goto success;
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index f6979d1ef69a..5d35da691eba 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -165,7 +165,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = {
#define WE_TXRX_FWSTATS_RESET 41
#define WE_SET_MAX_TX_POWER_2_4 42
#define WE_SET_MAX_TX_POWER_5_0 43
-/* 44 is unused */
+#define WE_SET_PKTLOG 44
/* Private ioctl for packet powe save */
#define WE_PPS_PAID_MATCH 45
#define WE_PPS_GID_MATCH 46
@@ -5158,6 +5158,11 @@ 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))) {
@@ -9895,6 +9900,11 @@ static const struct iw_priv_args we_private_args[] = {
0,
"setTxMaxPower5G"},
+ {WE_SET_PKTLOG,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0,
+ "pktlog"},
+
/* SAP has TxMax whereas STA has MaxTx, adding TxMax for STA
* as well to keep same syntax as in SAP. Now onwards, STA
* will support both */
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index ceb21734f77c..e294a02668fe 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -3174,11 +3174,15 @@ typedef struct {
* statistics, connectivity etc.
* @verbose_level: Verbose level which can be 0,1,2,3
* @flag: Flag field for future use
+ * @ini_triggered: triggered using ini
+ * @user_triggered: triggered by user
*/
struct sir_wifi_start_log {
uint32_t ring_id;
uint32_t verbose_level;
uint32_t flag;
+ bool ini_triggered;
+ uint8_t user_triggered;
};
diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index a9e35d20e8c1..04ef192dba05 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -14446,6 +14446,8 @@ QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
req_msg->verbose_level = start_log.verbose_level;
req_msg->flag = start_log.flag;
req_msg->ring_id = start_log.ring_id;
+ req_msg->ini_triggered = start_log.ini_triggered;
+ req_msg->user_triggered = start_log.user_triggered;
status = sme_acquire_global_lock(&mac->sme);
if (status != QDF_STATUS_SUCCESS) {
diff --git a/core/utils/pktlog/include/pktlog_ac.h b/core/utils/pktlog/include/pktlog_ac.h
index 7c72bbc9f23f..9d213e0c76bb 100644
--- a/core/utils/pktlog/include/pktlog_ac.h
+++ b/core/utils/pktlog/include/pktlog_ac.h
@@ -66,10 +66,13 @@ extern void pktlog_release_buf(struct hif_opaque_softc *scn);
ssize_t pktlog_read_proc_entry(char *buf, size_t nbytes, loff_t *ppos,
struct ath_pktlog_info *pl_info, bool *read_complete);
int pktlog_send_per_pkt_stats_to_user(void);
+A_STATUS
+wdi_pktlog_unsubscribe(struct ol_txrx_pdev_t *txrx_pdev, uint32_t log_state);
struct ol_pl_arch_dep_funcs {
void (*pktlog_init)(struct hif_opaque_softc *scn);
- int (*pktlog_enable)(struct hif_opaque_softc *scn, int32_t log_state);
+ int (*pktlog_enable)(struct hif_opaque_softc *scn, int32_t log_state,
+ bool ini, uint8_t user);
int (*pktlog_setsize)(struct hif_opaque_softc *scn, int32_t log_state);
int (*pktlog_disable)(struct hif_opaque_softc *scn);
};
@@ -82,6 +85,8 @@ struct ol_pl_os_dep_funcs {
struct ath_pktlog_wmi_params {
WMI_PKTLOG_EVENT pktlog_event;
WMI_CMD_ID cmd_id;
+ bool ini_triggered;
+ uint8_t user_triggered;
};
extern struct ol_pl_arch_dep_funcs ol_pl_funcs;
@@ -93,7 +98,8 @@ struct ol_pktlog_dev_t {
struct ath_pktlog_info *pl_info;
ol_ath_generic_softc_handle scn;
char *name;
- bool tgt_pktlog_enabled;
+ bool tgt_pktlog_alloced;
+ bool is_pktlog_cb_subscribed;
bool mt_pktlog_enabled;
uint32_t htc_err_cnt;
uint8_t htc_endpoint;
@@ -124,7 +130,8 @@ extern struct ol_pktlog_dev_t ol_pl_dev;
void pktlog_callback(void *pdev, enum WDI_EVENT event, void *log_data);
void pktlog_init(struct hif_opaque_softc *scn);
-int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state);
+int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
+ bool, uint8_t);
int pktlog_setsize(struct hif_opaque_softc *scn, int32_t log_state);
int pktlog_disable(struct hif_opaque_softc *scn);
int pktlogmod_init(void *context);
@@ -153,7 +160,8 @@ static inline void pktlog_init(struct hif_opaque_softc *scn)
{
return;
}
-static int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state)
+static int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
+ bool ini, uint8_t user)
{
return 0;
}
diff --git a/core/utils/pktlog/linux_ac.c b/core/utils/pktlog/linux_ac.c
index 4289ab331a0e..b92de81f683d 100644
--- a/core/utils/pktlog/linux_ac.c
+++ b/core/utils/pktlog/linux_ac.c
@@ -231,7 +231,8 @@ qdf_sysctl_decl(ath_sysctl_pktlog_enable, ctl, write, filp, buffer, lenp, ppos)
lenp, ppos);
if (ret == 0)
ret = pl_dev->pl_funcs->pktlog_enable(
- (struct hif_opaque_softc *)scn, enable);
+ (struct hif_opaque_softc *)scn, enable,
+ cds_is_packet_log_enabled(), 0);
else
printk(PKTLOG_TAG "%s:proc_dointvec failed\n",
__func__);
@@ -438,7 +439,7 @@ static int pktlog_attach(struct hif_opaque_softc *scn)
* initialize log info
* might be good to move to pktlog_init
*/
- /* pl_dev->tgt_pktlog_enabled = false; */
+ /* pl_dev->tgt_pktlog_alloced = false; */
pl_info_lnx->proc_entry = NULL;
pl_info_lnx->sysctl_header = NULL;
@@ -491,10 +492,18 @@ static void pktlog_sysctl_unregister(struct ol_pktlog_dev_t *pl_dev)
static void pktlog_detach(struct hif_opaque_softc *scn)
{
- struct ol_pktlog_dev_t *pl_dev = (struct ol_pktlog_dev_t *)
- get_pl_handle(scn);
+ struct ol_txrx_pdev_t *txrx_pdev;
+ struct ol_pktlog_dev_t *pl_dev;
struct ath_pktlog_info *pl_info;
+ txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+ if (!txrx_pdev) {
+ printk("%s: Invalid txrx_pdev context\n", __func__);
+ ASSERT(0);
+ return;
+ }
+
+ pl_dev = txrx_pdev->pl_dev;
if (!pl_dev) {
printk("%s: Invalid pktlog context\n", __func__);
ASSERT(0);
@@ -506,8 +515,10 @@ static void pktlog_detach(struct hif_opaque_softc *scn)
pktlog_sysctl_unregister(pl_dev);
pktlog_cleanup(pl_info);
- if (pl_info->buf)
+ if (pl_info->buf) {
pktlog_release_buf(scn);
+ pl_dev->tgt_pktlog_alloced = false;
+ }
if (pl_dev) {
kfree(pl_info);
@@ -1034,15 +1045,7 @@ void pktlogmod_exit(void *context)
if (!pl_dev || g_pktlog_pde == NULL)
return;
- /*
- * Disable firmware side pktlog function
- */
- if (pl_dev->tgt_pktlog_enabled) {
- if (pl_dev->pl_funcs->pktlog_enable(scn, 0)) {
- printk("%s: cannot disable pktlog in the target\n",
- __func__);
- }
- }
+
pktlog_detach(scn);
/*
* pdev kill needs to be implemented
diff --git a/core/utils/pktlog/pktlog_ac.c b/core/utils/pktlog/pktlog_ac.c
index 8d296b53da81..db6284871bc4 100644
--- a/core/utils/pktlog/pktlog_ac.c
+++ b/core/utils/pktlog/pktlog_ac.c
@@ -74,7 +74,8 @@ void ol_pl_sethandle(ol_pktlog_dev_handle *pl_handle,
}
static A_STATUS pktlog_wma_post_msg(WMI_PKTLOG_EVENT event_types,
- WMI_CMD_ID cmd_id)
+ WMI_CMD_ID cmd_id, bool ini_triggered,
+ uint8_t user_triggered)
{
cds_msg_t msg = { 0 };
QDF_STATUS status;
@@ -87,6 +88,8 @@ static A_STATUS pktlog_wma_post_msg(WMI_PKTLOG_EVENT event_types,
param->cmd_id = cmd_id;
param->pktlog_event = event_types;
+ param->ini_triggered = ini_triggered;
+ param->user_triggered = user_triggered;
msg.type = WMA_PKTLOG_ENABLE_REQ;
msg.bodyptr = param;
@@ -102,8 +105,9 @@ static A_STATUS pktlog_wma_post_msg(WMI_PKTLOG_EVENT event_types,
return A_OK;
}
-static inline A_STATUS pktlog_enable_tgt(struct hif_opaque_softc *_scn,
- uint32_t log_state)
+static inline A_STATUS
+pktlog_enable_tgt(struct hif_opaque_softc *_scn, uint32_t log_state,
+ bool ini_triggered, uint8_t user_triggered)
{
uint32_t types = 0;
@@ -122,7 +126,8 @@ static inline A_STATUS pktlog_enable_tgt(struct hif_opaque_softc *_scn,
if (log_state & ATH_PKTLOG_SW_EVENT)
types |= WMI_PKTLOG_EVENT_SW;
- return pktlog_wma_post_msg(types, WMI_PDEV_PKTLOG_ENABLE_CMDID);
+ return pktlog_wma_post_msg(types, WMI_PDEV_PKTLOG_ENABLE_CMDID,
+ ini_triggered, user_triggered);
}
static inline A_STATUS
@@ -248,7 +253,7 @@ void pktlog_callback(void *pdev, enum WDI_EVENT event, void *log_data)
}
}
-static inline A_STATUS
+A_STATUS
wdi_pktlog_unsubscribe(struct ol_txrx_pdev_t *txrx_pdev, uint32_t log_state)
{
if (log_state & ATH_PKTLOG_TX) {
@@ -308,16 +313,17 @@ int pktlog_disable(struct hif_opaque_softc *scn)
pl_dev = txrx_pdev->pl_dev;
pl_info = pl_dev->pl_info;
- if (pktlog_wma_post_msg(0, WMI_PDEV_PKTLOG_DISABLE_CMDID)) {
+ if (pktlog_wma_post_msg(0, WMI_PDEV_PKTLOG_DISABLE_CMDID, 0, 0)) {
printk("Failed to disable pktlog in target\n");
return -1;
}
- if (wdi_pktlog_unsubscribe(txrx_pdev, pl_info->log_state)) {
+ if (pl_dev->is_pktlog_cb_subscribed &&
+ wdi_pktlog_unsubscribe(txrx_pdev, pl_info->log_state)) {
printk("Cannot unsubscribe pktlog from the WDI\n");
return -1;
}
-
+ pl_dev->is_pktlog_cb_subscribed = false;
return 0;
}
@@ -358,7 +364,8 @@ void pktlog_init(struct hif_opaque_softc *scn)
PKTLOG_SW_EVENT_SUBSCRIBER.callback = pktlog_callback;
}
-int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state)
+int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state,
+ bool ini_triggered, uint8_t user_triggered)
{
struct ol_pktlog_dev_t *pl_dev;
struct ath_pktlog_info *pl_info;
@@ -390,7 +397,7 @@ int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state)
if (!pl_info)
return 0;
- if (log_state != 0 && !pl_dev->tgt_pktlog_enabled) {
+ if (!pl_dev->tgt_pktlog_alloced) {
if (pl_info->buf == NULL) {
error = pktlog_alloc_buf(scn);
@@ -418,25 +425,25 @@ int pktlog_enable(struct hif_opaque_softc *scn, int32_t log_state)
pl_info->start_time_thruput = os_get_timestamp();
pl_info->start_time_per = pl_info->start_time_thruput;
+ pl_dev->tgt_pktlog_alloced = true;
+ }
+
+ if (log_state != 0) {
/* WDI subscribe */
- if (wdi_pktlog_subscribe(txrx_pdev, log_state)) {
+ if ((!pl_dev->is_pktlog_cb_subscribed) &&
+ wdi_pktlog_subscribe(txrx_pdev, log_state)) {
printk("Unable to subscribe to the WDI %s\n", __func__);
return -1;
}
+ pl_dev->is_pktlog_cb_subscribed = true;
/* WMI command to enable pktlog on the firmware */
- if (pktlog_enable_tgt(scn, log_state)) {
+ if (pktlog_enable_tgt(scn, log_state, ini_triggered,
+ user_triggered)) {
printk("Device cannot be enabled, %s\n", __func__);
return -1;
- } else {
- pl_dev->tgt_pktlog_enabled = true;
}
- } else if (!log_state && pl_dev->tgt_pktlog_enabled) {
+ } else {
pl_dev->pl_funcs->pktlog_disable(scn);
- pl_dev->tgt_pktlog_enabled = false;
- if (wdi_pktlog_unsubscribe(txrx_pdev, pl_info->log_state)) {
- printk("Cannot unsubscribe pktlog from the WDI\n");
- return -1;
- }
}
pl_info->log_state = log_state;
@@ -470,8 +477,17 @@ int pktlog_setsize(struct hif_opaque_softc *scn, int32_t size)
return -EINVAL;
}
- if (pl_info->buf != NULL)
+ if (pl_info->buf != NULL) {
+ if (pl_dev->is_pktlog_cb_subscribed &&
+ wdi_pktlog_unsubscribe(pdev_txrx_handle,
+ pl_info->log_state)) {
+ printk("Cannot unsubscribe pktlog from the WDI\n");
+ return -EFAULT;
+ }
pktlog_release_buf(scn);
+ pl_dev->is_pktlog_cb_subscribed = false;
+ pl_dev->tgt_pktlog_alloced = false;
+ }
if (size != 0)
pl_info->buf_size = size;
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index fc60c85cf9f9..54c1937bce7c 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -2224,19 +2224,12 @@ QDF_STATUS wma_pktlog_wmi_send_cmd(WMA_HANDLE handle,
tp_wma_handle wma_handle = (tp_wma_handle) handle;
int ret;
- /*Check if packet log is enabled in cfg.ini */
- if (!cds_is_packet_log_enabled()) {
- WMA_LOGE("%s:pkt log is not enabled in cfg.ini", __func__);
- return QDF_STATUS_E_FAILURE;
- }
-
ret = wmi_unified_pktlog_wmi_send_cmd(wma_handle->wmi_handle,
- params->pktlog_event,
- params->cmd_id);
+ params->pktlog_event,
+ params->cmd_id, params->user_triggered);
if (ret)
return QDF_STATUS_E_FAILURE;
-
return QDF_STATUS_SUCCESS;
}
#endif /* REMOVE_PKT_LOG */
diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c
index 266cf22e11c2..19628077f81a 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -5333,10 +5333,12 @@ void wma_set_wifi_start_packet_stats(void *wma_handle,
ATH_PKTLOG_TEXT | ATH_PKTLOG_SW_EVENT;
if (start_log->verbose_level == WLAN_LOG_LEVEL_ACTIVE) {
- pktlog_enable(scn, log_state);
+ pktlog_enable(scn, log_state, start_log->ini_triggered,
+ start_log->user_triggered);
WMA_LOGI("%s: Enabling per packet stats", __func__);
} else {
- pktlog_enable(scn, 0);
+ pktlog_enable(scn, 0, start_log->ini_triggered,
+ start_log->user_triggered);
WMA_LOGI("%s: Disabling per packet stats", __func__);
}
}