Merge "[qca-nss-clients] Add Multicast support for l2tpv2 netlink module"
diff --git a/match/nss_match_cmd.c b/match/nss_match_cmd.c
index d42ee32..6807f61 100644
--- a/match/nss_match_cmd.c
+++ b/match/nss_match_cmd.c
@@ -552,7 +552,7 @@
  */
 static ssize_t nss_match_cmd_help(struct file *fp, char __user *ubuf, size_t sz, loff_t *ppos)
 {
-	size_t size_wr;
+	size_t size_wr = 0;
 	size_t size_al = NSS_STATS_MAX_STR_LENGTH * 24;
 	ssize_t bytes_read = 0;
 
diff --git a/profiler/profile.c b/profiler/profile.c
index dce3084..f19e4c3 100644
--- a/profiler/profile.c
+++ b/profiler/profile.c
@@ -417,9 +417,19 @@
 	}
 	if (pn->sw_ksp_ptr) {
 		struct debug_box *db = (struct debug_box *) pn->sw_ksp_ptr;
+
+		if ((void*)db != (void*)pn) {
+			profileWarn("%p: hwe data not ready %p\n", pn, db);
+			return -EAGAIN;
+		}
+
+		profileWarn("dbda %p: %x %x %x %x %x\n", db->data,
+			db->data[0], db->data[2], db->data[4], db->data[6], db->data[7]);
+
 		slen = (PROFILE_STS_EVENT_COUNTERS + 1) * sizeof(db->data[0]);
 		if (copy_to_user(buf, db->data, slen))
 			return -EFAULT;
+		profileInfo("%p: sw_ksp_ptr %p slen %d\n", pn, pn->sw_ksp_ptr, slen);
 		return	slen;
 	}
 
@@ -652,6 +662,7 @@
 	 * save data for read()
 	 */
 	memcpy(pdb->data, db->data, (db->dlen + 1) * sizeof(db->data[0]));
+	pio->sw_ksp_ptr = (uint32_t *)pdb;
 }
 
 /*
@@ -692,40 +703,66 @@
 	}
 
 	do {
-		int idx, event;
+		unsigned long idx;
+		int event, e5x;
+		char *kstrp;
 
 		while (isspace(*cp))
 			cp++;
-		if (kstrtoul(cp, 0, (unsigned long *)&event))
-			return -EINVAL;
-
-		cp = strchr(cp, ' ');
-		if (!cp) {
-			printk("missing index %s\n", buf);
+		kstrp = strchr(cp, ' ');
+		if (!kstrp) {
+			printk(KERN_ERR "%p missing index %p %s\n", buf, cp, cp);
 			return	-EINVAL;
 		}
-		while (isspace(*cp))
-			cp++;
-		idx = event >> 16;
-		if (idx) {
+		kstrp[0] = 0;
+
+		/*
+		 * kstrtoul bugs:
+		 *	it does not use white space for delimiter.
+		 *	it cannot use base 0, thus base 10 only.
+		 */
+		event = kstrtoul(cp, 10, &idx);
+		if (event) {
+			printk(KERN_ERR "kstrtoul %d: %s\n", event, cp);
+			return -EINVAL;
+		}
+		event = idx;
+
+		/*
+		 * Processing thread specific events, which requires hex values.
+		 * Because kstrtoul cannot use base 0, it makes this task harder
+		 * in user space. Users need to convert hex value to decimal, then
+		 * pass them in userland command event-counter.
+		 */
+		e5x = event >> 16;
+		if (e5x) {
 			if ((event & 0x1FF) < 50) {
-				printk("thr ID (%d) ignored for event %d\n",
-					idx, event & 0x1FF);
-			} else if (idx > 12) {
-				if ((idx >>= 5) > 12) {
-					printk("tID %d too big [1..12]\n", idx);
+				printk(KERN_INFO "thr ID (%d) ignored for event %d\n",
+					e5x, event & 0x1FF);
+			} else if (e5x > 12) {
+				if ((e5x >>= 5) > 12) {
+					printk(KERN_INFO "tID %d too big [1..12]\n", e5x);
 					return	-E2BIG;
 				}
 			}
 		}
 
-		if (kstrtoul(cp, 10, (unsigned long *)&idx) || idx < 0 || idx > 7) {
-			printk("index %d out of range [0..7]\n", idx);
+		cp = kstrp + 1;
+		while (isspace(*cp))
+			cp++;
+		kstrp = strchr(cp, ' ');
+		if (kstrp) {
+			kstrp[0] = 0;
+			kstrp++;
+		}
+
+		if (kstrtoul(cp, 10, &idx) || idx < 0 || idx > 7) {
+			printk(KERN_ERR "bad index %ld [0..7]\n", idx);
 			return	-ERANGE;
 		}
-		printk("%p: e %d i %d\n", db, event, idx);
+		printk(KERN_INFO "%p: e %d i %ld\n", db, event, idx);
 		db->data[idx] = event;
-		cp = strchr(cp, ' ');
+		cp = kstrp;
 	} while (cp);
 	db->hd_magic = NSS_PROFILE_HD_MAGIC | NSS_PROFILER_SET_SYS_STAT_EVENT;
 	result = nss_profiler_if_tx_buf(pio->ctx, &pio->pnc.un, sizeof(pio->pnc.un),
@@ -874,7 +911,7 @@
 			/*
 			 * set flag so event-counter can read the data from FW
 			 */
-			pio->sw_ksp_ptr = (uint32_t *)db;
+			pio->sw_ksp_ptr = db->data;
 		}
 		return	result;
 	}
diff --git a/tls/nss_tlsmgr_ctx.c b/tls/nss_tlsmgr_ctx.c
index e846f0b..f6c5d9d 100644
--- a/tls/nss_tlsmgr_ctx.c
+++ b/tls/nss_tlsmgr_ctx.c
@@ -79,14 +79,12 @@
 	{"\trx_ccs_rec", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_ccs", NSS_TLSMGR_PRINT_DWORD},
 	{"\teth_node_deactive", NSS_TLSMGR_PRINT_DWORD},
-	{"\tfail_dma_avail", NSS_TLSMGR_PRINT_DWORD},
 	{"\tcrypto_alloc_success", NSS_TLSMGR_PRINT_DWORD},
 	{"\tcrypto_free_req", NSS_TLSMGR_PRINT_DWORD},
 	{"\tcrypto_free_success", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_crypto_alloc", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_crypto_lookup", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_req_alloc", NSS_TLSMGR_PRINT_DWORD},
-	{"\tfail_req_detach", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_pbuf_stats", NSS_TLSMGR_PRINT_DWORD},
 	{"\tfail_ctx_active", NSS_TLSMGR_PRINT_DWORD},
 
@@ -101,6 +99,10 @@
 	{"\thw_auth_error", NSS_TLSMGR_PRINT_DWORD},
 	{"\thw_pad_verify_error", NSS_TLSMGR_PRINT_DWORD},
 	{"\thw_timeout_error", NSS_TLSMGR_PRINT_DWORD},
+
+	{"\tno_desc_in", NSS_TLSMGR_PRINT_DWORD},
+	{"\tno_desc_out", NSS_TLSMGR_PRINT_DWORD},
+	{"\tno_reqs", NSS_TLSMGR_PRINT_DWORD},
 };
 
 #ifdef NSS_TLSMGR_DEBUG_DUMP
diff --git a/tls/nss_tlsmgr_ctx.h b/tls/nss_tlsmgr_ctx.h
index bec13af..ff49a42 100644
--- a/tls/nss_tlsmgr_ctx.h
+++ b/tls/nss_tlsmgr_ctx.h
@@ -42,14 +42,12 @@
 	uint64_t rx_ccs_rec;			/**< Number of change cipher spec records received. */
 	uint64_t fail_ccs;			/**< Failed to switch to new crypto. */
 	uint64_t eth_node_deactive;		/**< Ethernet node deactivated as no crypto available. */
-	uint64_t fail_dma_avail;		/**< No DMA avail. */
 	uint64_t crypto_alloc_success;		/**< Number of crypto allocation. */
 	uint64_t crypto_free_req;		/**< Number of crypto free request. */
 	uint64_t crypto_free_success;		/**< Number of crypto free success. */
 	uint64_t fail_crypto_alloc;		/**< Number of crypto allocation failed. */
 	uint64_t fail_crypto_lookup;		/**< Failed to find acive crypto session. */
 	uint64_t fail_req_alloc;		/**< Failuer to allocate request memory pool.  */
-	uint64_t fail_req_detach;		/**< Failure to get new request from pool. */
 	uint64_t fail_pbuf_stats;		/**< Failure in pbuf allocation for statistics. */
 	uint64_t fail_ctx_active;		/**< Failure in enqueue due to inactive context. */
 
@@ -67,6 +65,13 @@
 	uint64_t hw_auth_error;         	/**< Hash input overflow. */
 	uint64_t hw_pad_verify_error;		/**< Pad verification error. */
 	uint64_t hw_timeout_error;              /**< Data timed-out. */
+
+	/*
+	 * Performance statistics
+	 */
+	uint64_t no_desc_in;			/**< Ingress DMA descriptor not available. */
+	uint64_t no_desc_out;			/**< Egress DMA descriptor not available. */
+	uint64_t no_reqs;			/**< Not enough requests available for records. */
 };
 
 /*