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