Răsfoiți Sursa

qcacld-3.0: Add iwpriv pktlog command to alter pktlog buffer size

Implement iwpriv pktlog command to change the pktlog buffer size.
This command is effective only if pktlog disable is issued previously.
This command needs two argument. First argument should be "3" which
denotes to set the pktlog buff size. Second argument should be the
pktlog size which user wants to change.
For eg, "iwpriv wlan0 pktlog 3 2" will change the buffer size to 2 MB.

Change-Id: Ifa27916667198c3fdc1c51d0e38564869405e041
CRs-Fixed: 1072584
Poddar, Siddarth 8 ani în urmă
părinte
comite
176c436ae7

+ 9 - 4
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;
 }

+ 3 - 0
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) {

+ 7 - 2
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"
 	}
 	,

+ 59 - 6
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)

+ 1 - 1
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;

+ 17 - 6
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"},
 

+ 2 - 0
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;
 };
 
 

+ 1 - 0
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) {

+ 9 - 4
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;
 }

+ 7 - 0
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,