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_msg_tx.c |  187 ++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 170 insertions(+), 17 deletions(-)

diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_msg_tx.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_msg_tx.c
old mode 100644
new mode 100755
index edaac90..59e0ebd
--- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_msg_tx.c
+++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/rwnx_msg_tx.c
@@ -19,6 +19,7 @@
 #include "rwnx_compat.h"
 #include "rwnx_cmds.h"
 #include "aicwf_txrxif.h"
+#include "rwnx_wakelock.h"
 
 const struct mac_addr mac_addr_bcst = {{0xFFFF, 0xFFFF, 0xFFFF}};
 
@@ -227,6 +228,7 @@
 
 	//RWNX_DBG(RWNX_FN_ENTRY_STR);
 
+	rwnx_wakeup_lock_timeout(rwnx_hw->ws_tx, jiffies_to_msecs(5));
 #ifdef AICWF_USB_SUPPORT
 	if (rwnx_hw->usbdev->state == USB_DOWN_ST) {
 		rwnx_msg_free(rwnx_hw, msg_params);
@@ -286,8 +288,13 @@
 			empty = list_empty(&rwnx_hw->cmd_mgr->cmds);
 			spin_unlock_bh(&rwnx_hw->cmd_mgr->lock);
 			if (!empty) {
-				udelay(100);
-				printk("check cmdqueue empty\n");
+				if (in_softirq()) {
+					printk("in_softirq:check cmdqueue empty\n");
+					mdelay(10);
+				} else {
+					printk("check cmdqueue empty\n");
+					msleep(50);
+				}
 			}
 		} while	(!empty);//wait for cmd queue empty
 	}
@@ -320,6 +327,7 @@
 
 	RWNX_DBG(RWNX_FN_ENTRY_STR);
 
+	rwnx_wakeup_lock_timeout(rwnx_hw->ws_tx, jiffies_to_msecs(5));
 	msg = container_of((void *)msg_params, struct lmac_msg, param);
 
 	//nonblock = is_non_blocking_msg(msg->id);
@@ -646,7 +654,8 @@
 }
 
 int rwnx_send_roc(struct rwnx_hw *rwnx_hw, struct rwnx_vif *vif,
-				  struct ieee80211_channel *chan, unsigned  int duration)
+				  struct ieee80211_channel *chan, unsigned  int duration,
+				  struct mm_remain_on_channel_cfm *roc_cfm)
 {
 	struct mm_remain_on_channel_req *req;
 	struct cfg80211_chan_def chandef;
@@ -674,7 +683,7 @@
 	req->tx_power     = chan_to_fw_pwr(chan->max_power);
 
 	/* Send the MM_REMAIN_ON_CHANNEL_REQ message to LMAC FW */
-	return rwnx_send_msg(rwnx_hw, req, 1, MM_REMAIN_ON_CHANNEL_CFM, NULL);
+	return rwnx_send_msg(rwnx_hw, req, 1, MM_REMAIN_ON_CHANNEL_CFM, roc_cfm);
 }
 
 int rwnx_send_cancel_roc(struct rwnx_hw *rwnx_hw)
@@ -919,6 +928,8 @@
 	rf_calib_req->param_alpha = 0x0c34c008;
 	rf_calib_req->bt_calib_en = 0;
 	rf_calib_req->bt_calib_param = 0x264203;
+	rf_calib_req->xtal_cap = 0;
+	rf_calib_req->xtal_cap_fine = 0;
 
 	/* Send the MM_SET_RF_CALIB_REQ message to UMAC FW */
 	error = rwnx_send_msg(rwnx_hw, rf_calib_req, 1, MM_SET_RF_CALIB_CFM, cfm);
@@ -949,28 +960,173 @@
 	return error;
 };
 
-int rwnx_send_get_sta_txinfo_req(struct rwnx_hw *rwnx_hw, u8_l sta_idx, struct mm_get_sta_txinfo_cfm *cfm)
+int rwnx_send_get_sta_info_req(struct rwnx_hw *rwnx_hw, u8_l sta_idx, struct mm_get_sta_info_cfm *cfm)
 {
-	struct mm_get_sta_txinfo_req *get_txinfo_req;
+	struct mm_get_sta_info_req *get_info_req;
 	int error;
 
 
-	/* Build the MM_GET_STA_TXINFO_REQ message */
-	get_txinfo_req = rwnx_msg_zalloc(MM_GET_STA_TXINFO_REQ, TASK_MM, DRV_TASK_ID,
-								  sizeof(struct mm_get_sta_txinfo_req));
+	/* Build the MM_GET_STA_INFO_REQ message */
+	get_info_req = rwnx_msg_zalloc(MM_GET_STA_INFO_REQ, TASK_MM, DRV_TASK_ID,
+						sizeof(struct mm_get_sta_info_req));
 
-	if (!get_txinfo_req) {
+	if (!get_info_req) {
 		return -ENOMEM;
 	}
 
-	get_txinfo_req->sta_idx = 1;
+	get_info_req->sta_idx = sta_idx;
 
-	/* Send the MM_GET_STA_TXINFO_REQ  message to UMAC FW */
-	error = rwnx_send_msg(rwnx_hw, get_txinfo_req, 1, MM_GET_STA_TXINFO_CFM, cfm);
+	/* Send the MM_GET_STA_INFO_REQ  message to UMAC FW */
+	error = rwnx_send_msg(rwnx_hw, get_info_req, 1, MM_GET_STA_INFO_CFM, cfm);
 
 	return error;
 };
 
+int rwnx_send_set_stack_start_req(struct rwnx_hw *rwnx_hw, u8_l on, u8_l efuse_valid, u8_l set_vendor_info,
+					u8_l fwtrace_redir_en, struct mm_set_stack_start_cfm *cfm)
+{
+	struct mm_set_stack_start_req *req;
+	int error;
+
+	/* Build the MM_SET_STACK_START_REQ message */
+	req = rwnx_msg_zalloc(MM_SET_STACK_START_REQ, TASK_MM, DRV_TASK_ID, sizeof(struct mm_set_stack_start_req));
+
+	if (!req) {
+		return -ENOMEM;
+	}
+
+	req->is_stack_start = on;
+	req->efuse_valid = efuse_valid;
+	req->set_vendor_info = set_vendor_info;
+	req->fwtrace_redir = fwtrace_redir_en;
+	/* Send the MM_SET_STACK_START_REQ  message to UMAC FW */
+	error = rwnx_send_msg(rwnx_hw, req, 1, MM_SET_STACK_START_CFM, cfm);
+
+	return error;
+}
+
+int rwnx_send_txop_req(struct rwnx_hw *rwnx_hw, uint16_t *txop, u8_l long_nav_en, u8_l cfe_en)
+{
+	struct mm_set_txop_req *req;
+	int error;
+
+	/* Build the MM_SET_TXOP_REQ message */
+	req = rwnx_msg_zalloc(MM_SET_TXOP_REQ, TASK_MM, DRV_TASK_ID, sizeof(struct mm_set_txop_req));
+
+	if (!req) {
+		return -ENOMEM;
+	}
+
+	req->txop_bk = txop[0];
+	req->txop_be = txop[1];
+	req->txop_vi = txop[2];
+	req->txop_vo = txop[3];
+	req->long_nav_en = long_nav_en;
+	req->cfe_en = cfe_en;
+	/* Send the MM_SET_TXOP_REQ  message to UMAC FW */
+	error = rwnx_send_msg(rwnx_hw, req, 1, MM_SET_TXOP_CFM, NULL);
+
+	return error;
+}
+
+int rwnx_send_get_fw_version_req(struct rwnx_hw *rwnx_hw, struct mm_get_fw_version_cfm *cfm)
+{
+	void *req;
+	int error;
+
+	/* Build the MM_GET_FW_VERSION_REQ message */
+	req = rwnx_msg_zalloc(MM_GET_FW_VERSION_REQ, TASK_MM, DRV_TASK_ID, sizeof(u8));
+
+	if (!req) {
+		return -ENOMEM;
+	}
+
+	/* Send the MM_GET_FW_VERSION_REQ  message to UMAC FW */
+	error = rwnx_send_msg(rwnx_hw, req, 1, MM_GET_FW_VERSION_CFM, cfm);
+
+	return error;
+}
+
+
+int rwnx_send_txpwr_idx_req(struct rwnx_hw *rwnx_hw)
+{
+	struct mm_set_txpwr_idx_req *txpwr_idx_req;
+	txpwr_idx_conf_t *txpwr_idx;
+	int error;
+
+	RWNX_DBG(RWNX_FN_ENTRY_STR);
+
+	/* Build the MM_SET_TXPWR_IDX_REQ message */
+	txpwr_idx_req = rwnx_msg_zalloc(MM_SET_TXPWR_IDX_REQ, TASK_MM, DRV_TASK_ID,
+								  sizeof(struct mm_set_txpwr_idx_req));
+
+	if (!txpwr_idx_req) {
+		return -ENOMEM;
+	}
+
+	txpwr_idx = &txpwr_idx_req->txpwr_idx;
+	txpwr_idx->enable = 1;
+	txpwr_idx->dsss = 9;
+	txpwr_idx->ofdmlowrate_2g4 = 8;
+	txpwr_idx->ofdm64qam_2g4 = 8;
+	txpwr_idx->ofdm256qam_2g4 = 8;
+	txpwr_idx->ofdm1024qam_2g4 = 8;
+	txpwr_idx->ofdmlowrate_5g = 11;
+	txpwr_idx->ofdm64qam_5g = 10;
+	txpwr_idx->ofdm256qam_5g = 9;
+	txpwr_idx->ofdm1024qam_5g = 9;
+
+	get_userconfig_txpwr_idx(txpwr_idx);
+
+	if (txpwr_idx->enable == 0) {
+		rwnx_msg_free(rwnx_hw, txpwr_idx_req);
+		return 0;
+	} else {
+		/* Send the MM_SET_TXPWR_IDX_REQ message to UMAC FW */
+		error = rwnx_send_msg(rwnx_hw, txpwr_idx_req, 1, MM_SET_TXPWR_IDX_CFM, NULL);
+
+		return error;
+	}
+};
+
+int rwnx_send_txpwr_ofst_req(struct rwnx_hw *rwnx_hw)
+{
+	struct mm_set_txpwr_ofst_req *txpwr_ofst_req;
+	txpwr_ofst_conf_t *txpwr_ofst;
+	int error;
+
+	RWNX_DBG(RWNX_FN_ENTRY_STR);
+
+	/* Build the MM_SET_TXPWR_OFST_REQ message */
+	txpwr_ofst_req = rwnx_msg_zalloc(MM_SET_TXPWR_OFST_REQ, TASK_MM, DRV_TASK_ID,
+								  sizeof(struct mm_set_txpwr_ofst_req));
+
+	if (!txpwr_ofst_req) {
+		return -ENOMEM;
+	}
+
+	txpwr_ofst = &txpwr_ofst_req->txpwr_ofst;
+	txpwr_ofst->enable       = 1;
+	txpwr_ofst->chan_1_4     = 0;
+	txpwr_ofst->chan_5_9     = 0;
+	txpwr_ofst->chan_10_13   = 0;
+	txpwr_ofst->chan_36_64   = 0;
+	txpwr_ofst->chan_100_120 = 0;
+	txpwr_ofst->chan_122_140 = 0;
+	txpwr_ofst->chan_142_165 = 0;
+
+	get_userconfig_txpwr_ofst(txpwr_ofst);
+
+	if (txpwr_ofst->enable == 0) {
+		rwnx_msg_free(rwnx_hw, txpwr_ofst_req);
+		return 0;
+	} else {
+		/* Send the MM_SET_TXPWR_OFST_REQ message to UMAC FW */
+		error = rwnx_send_msg(rwnx_hw, txpwr_ofst_req, 1, MM_SET_TXPWR_OFST_CFM, NULL);
+
+		return error;
+	}
+};
 
 /******************************************************************************
  *    Control messages handling functions (FULLMAC only)
@@ -1040,13 +1196,10 @@
 	#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 19, 0)
 	if (wiphy->bands[NL80211_BAND_2GHZ]->iftype_data != NULL) {
 		he_cap = &wiphy->bands[NL80211_BAND_2GHZ]->iftype_data->he_cap;
-	}
 	#endif
 	#if defined(CONFIG_HE_FOR_OLD_KERNEL)
 	if (1) {
 		he_cap = &rwnx_he_capa.he_cap;
-	#else
-	{
 	#endif
 		req->he_supp = he_cap->has_he;
 		for (i = 0; i < ARRAY_SIZE(he_cap->he_cap_elem.mac_cap_info); i++) {
@@ -1699,7 +1852,7 @@
 		if (!memcmp(P2P_WILDCARD_SSID, param->ssids[i].ssid,
 			P2P_WILDCARD_SSID_LEN)) {
 			printk("p2p scanu:%d,%d,%d\n", rwnx_vif->vif_index, rwnx_vif->is_p2p_vif, rwnx_hw->is_p2p_alive);
-			if (rwnx_vif->is_p2p_vif && !rwnx_hw->is_p2p_alive) {
+			if (rwnx_vif == rwnx_hw->p2p_dev_vif && !rwnx_vif->up) {
 				err = rwnx_send_add_if (rwnx_hw, rwnx_vif->wdev.address,
 											  RWNX_VIF_TYPE(rwnx_vif), false, &add_if_cfm);
 				if (err)

--
Gitblit v1.6.2