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(<race->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(<race->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, <race->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