From d4a1bd480003f3e1a0590bc46fbcb24f05652ca7 Mon Sep 17 00:00:00 2001
From: tzh <tanzhtanzh@gmail.com>
Date: Thu, 15 Aug 2024 06:56:47 +0000
Subject: [PATCH] feat(wfit/bt): update aic8800 wifi/bt drive and hal

---
 longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_debugfs.c |  198 ++++++++++++++++++++-----------------------------
 1 files changed, 80 insertions(+), 118 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_debugfs.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_debugfs.c
old mode 100644
new mode 100755
index e703e34..9840fcd
--- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_debugfs.c
+++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_debugfs.c
@@ -22,6 +22,7 @@
 #include "rwnx_radar.h"
 #include "rwnx_tx.h"
 
+#ifdef CONFIG_DEBUG_FS
 #ifdef CONFIG_RWNX_FULLMAC
 static ssize_t rwnx_dbgfs_stats_read(struct file *file,
 									 char __user *user_buf,
@@ -479,11 +480,15 @@
 #ifdef CONFIG_RWNX_FULLMAC
 	struct wiphy *wiphy = priv->wiphy;
 #endif //CONFIG_RWNX_FULLMAC
-	char buf[(SCAN_CHANNEL_MAX + 1) * 43];
 	int survey_cnt = 0;
 	int len = 0;
 	int band, chan_cnt;
 	int band_max = NL80211_BAND_5GHZ;
+	char *buf = (char *)vmalloc((SCAN_CHANNEL_MAX + 1) * 43);
+	ssize_t size;
+
+	if (!buf)
+		return 0;
 
 	if (priv->band_5g_support)
 		band_max = NL80211_BAND_5GHZ + 1;
@@ -517,7 +522,10 @@
 
 	mutex_unlock(&priv->dbgdump_elem.mutex);
 
-	return simple_read_from_buffer(user_buf, count, ppos, buf, len);
+	size = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+	vfree(buf);
+
+	return size;
 }
 
 DEBUGFS_READ_FILE_OPS(acsinfo);
@@ -782,88 +790,49 @@
 DEBUGFS_WRITE_FILE_OPS(noa);
 #endif /* CONFIG_RWNX_P2P_DEBUGFS */
 
-struct rwnx_dbgfs_fw_trace {
-	struct rwnx_fw_trace_local_buf lbuf;
-	struct rwnx_fw_trace *trace;
-	struct rwnx_hw *rwnx_hw;
-};
+static char fw_log_buffer[FW_LOG_SIZE];
 
-static int rwnx_dbgfs_fw_trace_open(struct inode *inode, struct file *file)
-{
-	struct rwnx_dbgfs_fw_trace *ltrace = kmalloc(sizeof(*ltrace), GFP_KERNEL);
-	struct rwnx_hw *priv = inode->i_private;
-
-	if (!ltrace)
-		return -ENOMEM;
-
-	if (rwnx_fw_trace_alloc_local(&ltrace->lbuf, 5120)) {
-		kfree(ltrace);
-	}
-
-	ltrace->trace = &priv->debugfs.fw_trace;
-	ltrace->rwnx_hw = priv;
-	file->private_data = ltrace;
-	return 0;
-}
-
-static int rwnx_dbgfs_fw_trace_release(struct inode *inode, struct file *file)
-{
-	struct rwnx_dbgfs_fw_trace *ltrace = file->private_data;
-
-	if (ltrace) {
-		rwnx_fw_trace_free_local(&ltrace->lbuf);
-		kfree(ltrace);
-	}
-
-	return 0;
-}
-
-static ssize_t rwnx_dbgfs_fw_trace_read(struct file *file,
-										char __user *user_buf,
-										size_t count, loff_t *ppos)
-{
-	struct rwnx_dbgfs_fw_trace *ltrace = file->private_data;
-	bool dont_wait = ((file->f_flags & O_NONBLOCK) ||
-					  ltrace->rwnx_hw->debugfs.unregistering);
-
-	return rwnx_fw_trace_read(ltrace->trace, &ltrace->lbuf,
-							  dont_wait, user_buf, count);
-}
-
-static ssize_t rwnx_dbgfs_fw_trace_write(struct file *file,
-										 const char __user *user_buf,
-										 size_t count, loff_t *ppos)
-{
-	struct rwnx_dbgfs_fw_trace *ltrace = file->private_data;
-	int ret;
-
-	ret = _rwnx_fw_trace_reset(ltrace->trace, true);
-	if (ret)
-		return ret;
-
-	return count;
-}
-
-DEBUGFS_READ_WRITE_OPEN_RELEASE_FILE_OPS(fw_trace);
-
-static ssize_t rwnx_dbgfs_fw_trace_level_read(struct file *file,
+static ssize_t rwnx_dbgfs_fw_log_read(struct file *file,
 											  char __user *user_buf,
 											  size_t count, loff_t *ppos)
 {
 	struct rwnx_hw *priv = file->private_data;
-	return rwnx_fw_trace_level_read(&priv->debugfs.fw_trace, user_buf,
-									count, ppos);
+	size_t not_cpy;
+	size_t nb_cpy;
+	char *log = fw_log_buffer;
+
+	printk("%s, %d, %p, %p\n", __func__, priv->debugfs.fw_log.buf.size, priv->debugfs.fw_log.buf.start, priv->debugfs.fw_log.buf.dataend);
+	//spin_lock_bh(&priv->debugfs.fw_log.lock);
+
+	if ((priv->debugfs.fw_log.buf.start + priv->debugfs.fw_log.buf.size) >= priv->debugfs.fw_log.buf.dataend) {
+		memcpy(log, priv->debugfs.fw_log.buf.start, priv->debugfs.fw_log.buf.dataend - priv->debugfs.fw_log.buf.start);
+		not_cpy = copy_to_user(user_buf, log, priv->debugfs.fw_log.buf.dataend - priv->debugfs.fw_log.buf.start);
+		nb_cpy = priv->debugfs.fw_log.buf.dataend - priv->debugfs.fw_log.buf.start - not_cpy;
+		priv->debugfs.fw_log.buf.start = priv->debugfs.fw_log.buf.data;
+	} else {
+		memcpy(log, priv->debugfs.fw_log.buf.start, priv->debugfs.fw_log.buf.size);
+		not_cpy = copy_to_user(user_buf, log, priv->debugfs.fw_log.buf.size);
+		nb_cpy = priv->debugfs.fw_log.buf.size - not_cpy;
+		priv->debugfs.fw_log.buf.start = priv->debugfs.fw_log.buf.start + priv->debugfs.fw_log.buf.size - not_cpy;
+	}
+
+	priv->debugfs.fw_log.buf.size -= nb_cpy;
+	//spin_unlock_bh(&priv->debugfs.fw_log.lock);
+
+	printk("nb_cpy=%zu, not_cpy=%zu, start=%p, end=%p\n", nb_cpy, not_cpy, priv->debugfs.fw_log.buf.start, priv->debugfs.fw_log.buf.end);
+	return nb_cpy;
 }
 
-static ssize_t rwnx_dbgfs_fw_trace_level_write(struct file *file,
+static ssize_t rwnx_dbgfs_fw_log_write(struct file *file,
 											   const char __user *user_buf,
 											   size_t count, loff_t *ppos)
 {
-	struct rwnx_hw *priv = file->private_data;
-	return rwnx_fw_trace_level_write(&priv->debugfs.fw_trace, user_buf, count);
-}
-DEBUGFS_READ_WRITE_FILE_OPS(fw_trace_level);
+	//struct rwnx_hw *priv = file->private_data;
 
+	printk("%s\n", __func__);
+	return count;
+}
+DEBUGFS_READ_WRITE_FILE_OPS(fw_log);
 
 #ifdef CONFIG_RWNX_RADAR
 static ssize_t rwnx_dbgfs_pulses_read(struct file *file,
@@ -1256,6 +1225,34 @@
 DEBUGFS_READ_WRITE_FILE_OPS(set);
 #endif /* CONFIG_RWNX_RADAR */
 
+static ssize_t rwnx_dbgfs_regdbg_write(struct file *file,
+					const char __user *user_buf,
+					size_t count, loff_t *ppos)
+{
+	struct rwnx_hw *priv = file->private_data;
+	char buf[32];
+	u32 addr, val, oper;
+	size_t len = min_t(size_t, count, sizeof(buf) - 1);
+	struct dbg_mem_read_cfm mem_read_cfm;
+	int ret;
+
+	if (copy_from_user(buf, user_buf, len))
+		return -EFAULT;
+
+	buf[len] = '\0';
+
+	if (sscanf(buf, "%x %x %x", &oper, &addr, &val) > 0)
+		printk("addr=%x, val=%x,oper=%d\n", addr, val, oper);
+
+	if (oper == 0) {
+		ret = rwnx_send_dbg_mem_read_req(priv, addr, &mem_read_cfm);
+		printk("[0x%x] = [0x%x]\n", mem_read_cfm.memaddr, mem_read_cfm.memdata);
+	}
+
+	return count;
+}
+
+DEBUGFS_WRITE_FILE_OPS(regdbg);
 #ifdef CONFIG_RWNX_FULLMAC
 
 #define LINE_MAX_SZ 150
@@ -1789,33 +1786,6 @@
 
 #endif /* CONFIG_RWNX_FULLMAC */
 
-/*
- * trace helper
- */
-void rwnx_fw_trace_dump(struct rwnx_hw *rwnx_hw)
-{
-	/* may be called before rwnx_dbgfs_register */
-	if (rwnx_hw->plat->enabled && !rwnx_hw->debugfs.fw_trace.buf.data) {
-		rwnx_fw_trace_buf_init(&rwnx_hw->debugfs.fw_trace.buf,
-							   rwnx_ipc_fw_trace_desc_get(rwnx_hw));
-	}
-
-	if (!rwnx_hw->debugfs.fw_trace.buf.data)
-		return;
-
-	_rwnx_fw_trace_dump(&rwnx_hw->debugfs.fw_trace.buf);
-}
-
-void rwnx_fw_trace_reset(struct rwnx_hw *rwnx_hw)
-{
-	_rwnx_fw_trace_reset(&rwnx_hw->debugfs.fw_trace, true);
-}
-
-void rwnx_dbgfs_trigger_fw_dump(struct rwnx_hw *rwnx_hw, char *reason)
-{
-	rwnx_send_dbg_trigger_req(rwnx_hw, reason);
-}
-
 #ifdef CONFIG_RWNX_FULLMAC
 static void rwnx_rc_stat_work(struct work_struct *ws)
 {
@@ -1992,6 +1962,8 @@
 	struct rwnx_debugfs *rwnx_debugfs = &rwnx_hw->debugfs;
 	struct dentry *dir_drv, *dir_diags;
 
+	RWNX_DBG(RWNX_FN_ENTRY_STR);
+
 	dir_drv = debugfs_create_dir(name, phyd);
 	if (!dir_drv)
 		return -ENOMEM;
@@ -2039,19 +2011,10 @@
 	}
 #endif /* CONFIG_RWNX_P2P_DEBUGFS */
 
-	if (rwnx_dbgfs_register_fw_dump(rwnx_hw, dir_drv, dir_diags))
-		goto err;
-	DEBUGFS_ADD_FILE(fw_dbg, dir_diags, S_IWUSR | S_IRUSR);
-
-	if (!rwnx_fw_trace_init(&rwnx_hw->debugfs.fw_trace,
-							rwnx_ipc_fw_trace_desc_get(rwnx_hw))) {
-		DEBUGFS_ADD_FILE(fw_trace, dir_diags, S_IWUSR | S_IRUSR);
-		if (rwnx_hw->debugfs.fw_trace.buf.nb_compo)
-			DEBUGFS_ADD_FILE(fw_trace_level, dir_diags, S_IWUSR | S_IRUSR);
-	} else {
-		rwnx_debugfs->fw_trace.buf.data = NULL;
+	if (rwnx_hw->fwlog_en) {
+		rwnx_fw_log_init(&rwnx_hw->debugfs.fw_log);
+		DEBUGFS_ADD_FILE(fw_log, dir_drv, S_IWUSR | S_IRUSR);
 	}
-
 #ifdef CONFIG_RWNX_RADAR
 	{
 		struct dentry *dir_radar, *dir_sec;
@@ -2090,10 +2053,7 @@
 {
 	struct rwnx_debugfs *rwnx_debugfs = &rwnx_hw->debugfs;
 #ifdef CONFIG_RWNX_FULLMAC
-		struct rwnx_rc_config_save *cfg, *next;
-#endif
-#if defined(AICWF_USB_SUPPORT) || defined(AICWF_SDIO_SUPPORT)
-	return;
+	struct rwnx_rc_config_save *cfg, *next;
 #endif
 
 #ifdef CONFIG_RWNX_FULLMAC
@@ -2103,13 +2063,13 @@
 	}
 #endif /* CONFIG_RWNX_FULLMAC */
 
-	rwnx_fw_trace_deinit(&rwnx_hw->debugfs.fw_trace);
+	if (rwnx_hw->fwlog_en)
+		rwnx_fw_log_deinit(&rwnx_hw->debugfs.fw_log);
 
 	if (!rwnx_hw->debugfs.dir)
 		return;
 
 	rwnx_debugfs->unregistering = true;
-	flush_work(&rwnx_debugfs->helper_work);
 #ifdef CONFIG_RWNX_FULLMAC
 	flush_work(&rwnx_debugfs->rc_stat_work);
 #endif
@@ -2117,3 +2077,5 @@
 	rwnx_hw->debugfs.dir = NULL;
 }
 
+#endif /* CONFIG_DEBUG_FS */
+

--
Gitblit v1.6.2