diff options
| -rw-r--r-- | core/hdd/inc/wlan_hdd_main.h | 13 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_cfg80211.c | 3 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_hostapd.c | 9 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_main.c | 65 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_power.c | 2 | ||||
| -rw-r--r-- | core/hdd/src/wlan_hdd_wext.c | 23 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 2 | ||||
| -rw-r--r-- | core/sme/src/common/sme_api.c | 1 | ||||
| -rw-r--r-- | core/utils/pktlog/pktlog_ac.c | 13 | ||||
| -rw-r--r-- | core/wma/src/wma_main.c | 7 |
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, |
