summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/inc/wlan_hdd_main.h13
-rw-r--r--core/hdd/src/wlan_hdd_cfg80211.c3
-rw-r--r--core/hdd/src/wlan_hdd_hostapd.c9
-rw-r--r--core/hdd/src/wlan_hdd_main.c65
-rw-r--r--core/hdd/src/wlan_hdd_power.c2
-rw-r--r--core/hdd/src/wlan_hdd_wext.c23
-rw-r--r--core/mac/inc/sir_api.h2
-rw-r--r--core/sme/src/common/sme_api.c1
-rw-r--r--core/utils/pktlog/pktlog_ac.c13
-rw-r--r--core/wma/src/wma_main.c7
10 files changed, 115 insertions, 23 deletions
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 1fc4e0cc11b6..398e7c2f592e 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;
}
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index d4517ef32b32..052c80abae02 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -4345,6 +4345,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) {
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index 2834804009ee..989892b26b80 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -3603,8 +3603,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 +5493,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"
}
,
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index af549d3ad93d..943f265fe6fb 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -7062,14 +7062,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 +7118,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 +7150,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 +7172,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 +8101,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_power.c b/core/hdd/src/wlan_hdd_power.c
index 7e6e0bd5571f..ffc48c3e714a 100644
--- a/core/hdd/src/wlan_hdd_power.c
+++ b/core/hdd/src/wlan_hdd_power.c
@@ -1586,7 +1586,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;
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index f4af8b1e7619..2761f9e7b65d 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -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;
@@ -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"},
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 84faa1f04cdf..4e43c6dd3f19 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/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c
index 0c6cf0acc201..c5eef8a2f5a7 100644
--- a/core/sme/src/common/sme_api.c
+++ b/core/sme/src/common/sme_api.c
@@ -14760,6 +14760,7 @@ QDF_STATUS sme_wifi_start_logger(tHalHandle hal,
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) {
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/wma/src/wma_main.c b/core/wma/src/wma_main.c
index fa9198feb700..e2e7e1642b44 100644
--- a/core/wma/src/wma_main.c
+++ b/core/wma/src/wma_main.c
@@ -5778,6 +5778,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 +5823,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,