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/ipc_host.c | 692 --------------------------------------------------------- 1 files changed, 0 insertions(+), 692 deletions(-) diff --git a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/ipc_host.c b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/ipc_host.c old mode 100644 new mode 100755 index 6aeeaf0..7746f40 --- a/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/ipc_host.c +++ b/longan/kernel/linux-4.9/drivers/net/wireless/aic8800/aic8800_fdrv/ipc_host.c @@ -16,17 +16,12 @@ */ #ifndef __KERNEL__ #include <stdio.h> -#define REG_SW_SET_PROFILING(env, value) do { } while (0) -#define REG_SW_CLEAR_PROFILING(env, value) do { } while (0) -#define REG_SW_CLEAR_HOSTBUF_IDX_PROFILING(env) do { } while (0) -#define REG_SW_SET_HOSTBUF_IDX_PROFILING(env, val) do { } while (0) #else #include <linux/spinlock.h> #include "rwnx_defs.h" #include "rwnx_prof.h" #endif -#include "reg_ipc_app.h" #include "ipc_host.h" /* @@ -44,16 +39,6 @@ #endif }; -const int nx_txdesc_cnt_msk[] = { - NX_TXDESC_CNT0 - 1, - NX_TXDESC_CNT1 - 1, - NX_TXDESC_CNT2 - 1, - NX_TXDESC_CNT3 - 1, - #if NX_TXQ_CNT == 5 - NX_TXDESC_CNT4 - 1, - #endif -}; - const int nx_txuser_cnt[] = { CONFIG_USER_MAX, CONFIG_USER_MAX, @@ -64,681 +49,4 @@ #endif }; - -/* - * FUNCTIONS DEFINITIONS - ****************************************************************************** - */ -/** - * ipc_host_rxdesc_handler() - Handle the reception of a Rx Descriptor - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_RXDESC is set - */ -static void ipc_host_rxdesc_handler(struct ipc_host_env_tag *env) -{ - // For profiling - REG_SW_SET_PROFILING(env->pthis, SW_PROF_IRQ_E2A_RXDESC); - - // LMAC has triggered an IT saying that a reception has occurred. - // Then we first need to check the validity of the current hostbuf, and the validity - // of the next hostbufs too, because it is likely that several hostbufs have been - // filled within the time needed for this irq handling - do { - #ifdef CONFIG_RWNX_FULLMAC - // call the external function to indicate that a RX descriptor is received - if (env->cb.recv_data_ind(env->pthis, - env->ipc_host_rxdesc_array[env->ipc_host_rxdesc_idx].hostid) != 0) - #else - // call the external function to indicate that a RX packet is received - if (env->cb.recv_data_ind(env->pthis, - env->ipc_host_rxbuf_array[env->ipc_host_rxbuf_idx].hostid) != 0) - #endif //(CONFIG_RWNX_FULLMAC) - break; - - } while (1); - - // For profiling - REG_SW_CLEAR_PROFILING(env->pthis, SW_PROF_IRQ_E2A_RXDESC); -} - -/** - * ipc_host_radar_handler() - Handle the reception of radar events - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_RADAR is set - */ -static void ipc_host_radar_handler(struct ipc_host_env_tag *env) -{ -#ifdef CONFIG_RWNX_RADAR - // LMAC has triggered an IT saying that a radar event has been sent to upper layer. - // Then we first need to check the validity of the current msg buf, and the validity - // of the next buffers too, because it is likely that several buffers have been - // filled within the time needed for this irq handling - // call the external function to indicate that a RX packet is received - spin_lock_bh(&((struct rwnx_hw *)env->pthis)->radar.lock); - while (env->cb.recv_radar_ind(env->pthis, - env->ipc_host_radarbuf_array[env->ipc_host_radarbuf_idx].hostid) == 0) - ; - spin_unlock_bh(&((struct rwnx_hw *)env->pthis)->radar.lock); -#endif /* CONFIG_RWNX_RADAR */ -} - -/** - * ipc_host_unsup_rx_vec_handler() - Handle the reception of unsupported rx vector - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_UNSUP_RX_VEC is set - */ -static void ipc_host_unsup_rx_vec_handler(struct ipc_host_env_tag *env) -{ - while (env->cb.recv_unsup_rx_vec_ind(env->pthis, - env->ipc_host_unsuprxvecbuf_array[env->ipc_host_unsuprxvecbuf_idx].hostid) == 0) - ; -} - -/** - * ipc_host_msg_handler() - Handler for firmware message - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_MSG is set - */ -static void ipc_host_msg_handler(struct ipc_host_env_tag *env) -{ - // For profiling - REG_SW_SET_PROFILING(env->pthis, SW_PROF_IRQ_E2A_MSG); - - // LMAC has triggered an IT saying that a message has been sent to upper layer. - // Then we first need to check the validity of the current msg buf, and the validity - // of the next buffers too, because it is likely that several buffers have been - // filled within the time needed for this irq handling - // call the external function to indicate that a RX packet is received - while (env->cb.recv_msg_ind(env->pthis, - env->ipc_host_msgbuf_array[env->ipc_host_msge2a_idx].hostid) == 0) - ; - - - // For profiling - REG_SW_CLEAR_PROFILING(env->pthis, SW_PROF_IRQ_E2A_MSG); - -} - -/** - * ipc_host_msgack_handler() - Handle the reception of message acknowledgement - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_MSG_ACK is set - */ -static void ipc_host_msgack_handler(struct ipc_host_env_tag *env) -{ - void *hostid = env->msga2e_hostid; - - ASSERT_ERR(hostid); - ASSERT_ERR(env->msga2e_cnt == (((struct lmac_msg *)(&env->shared->msg_a2e_buf.msg))->src_id & 0xFF)); - - env->msga2e_hostid = NULL; - env->msga2e_cnt++; - env->cb.recv_msgack_ind(env->pthis, hostid); -} - -/** - * ipc_host_dbg_handler() - Handle the reception of Debug event - * - * @env: pointer to the IPC Host environment - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_DBG is set - */ -static void ipc_host_dbg_handler(struct ipc_host_env_tag *env) -{ - // For profiling - REG_SW_SET_PROFILING(env->pthis, SW_PROF_IRQ_E2A_DBG); - - // LMAC has triggered an IT saying that a DBG message has been sent to upper layer. - // Then we first need to check the validity of the current buffer, and the validity - // of the next buffers too, because it is likely that several buffers have been - // filled within the time needed for this irq handling - // call the external function to indicate that a RX packet is received - while (env->cb.recv_dbg_ind(env->pthis, - env->ipc_host_dbgbuf_array[env->ipc_host_dbg_idx].hostid) == 0) - ; - - // For profiling - REG_SW_CLEAR_PROFILING(env->pthis, SW_PROF_IRQ_E2A_DBG); -} - -/** - * ipc_host_tx_cfm_handler() - Handle the reception of TX confirmation - * - * @env: pointer to the IPC Host environment - * @queue_idx: index of the hardware on which the confirmation has been received - * @user_pos: index of the user position - * - * Called from general IRQ handler when status %IPC_IRQ_E2A_TXCFM is set - */ -static void ipc_host_tx_cfm_handler(struct ipc_host_env_tag *env, - const int queue_idx, const int user_pos) -{ - // TX confirmation descriptors have been received - REG_SW_SET_PROFILING(env->pthis, SW_PROF_IRQ_E2A_TXCFM); - while (1) { - // Get the used index and increase it. We do the increase before knowing if the - // current buffer is confirmed because the callback function may call the - // ipc_host_txdesc_get() in case flow control was enabled and the index has to be - // already at the good value to ensure that the test of FIFO full is correct - uint32_t used_idx = env->txdesc_used_idx[queue_idx][user_pos]++; - uint32_t used_idx_mod = used_idx & nx_txdesc_cnt_msk[queue_idx]; - void *host_id = env->tx_host_id[queue_idx][user_pos][used_idx_mod]; - - // Reset the host id in the array - env->tx_host_id[queue_idx][user_pos][used_idx_mod] = 0; - - // call the external function to indicate that a TX packet is freed - if (host_id == 0) { - // No more confirmations, so put back the used index at its initial value - env->txdesc_used_idx[queue_idx][user_pos] = used_idx; - break; - } - - if (env->cb.send_data_cfm(env->pthis, host_id) != 0) { - // No more confirmations, so put back the used index at its initial value - env->txdesc_used_idx[queue_idx][user_pos] = used_idx; - env->tx_host_id[queue_idx][user_pos][used_idx_mod] = host_id; - // and exit the loop - break; - } - - REG_SW_SET_PROFILING_CHAN(env->pthis, SW_PROF_CHAN_CTXT_CFM_HDL_BIT); - REG_SW_CLEAR_PROFILING_CHAN(env->pthis, SW_PROF_CHAN_CTXT_CFM_HDL_BIT); - } - - REG_SW_CLEAR_PROFILING(env->pthis, SW_PROF_IRQ_E2A_TXCFM); -} - -/** - ****************************************************************************** - */ -bool ipc_host_tx_frames_pending(struct ipc_host_env_tag *env) -{ - int i, j; - bool tx_frames_pending = false; - - for (i = 0; (i < IPC_TXQUEUE_CNT) && !tx_frames_pending; i++) { - for (j = 0; j < nx_txuser_cnt[i]; j++) { - uint32_t used_idx = env->txdesc_used_idx[i][j]; - uint32_t free_idx = env->txdesc_free_idx[i][j]; - - // Check if this queue is empty or not - if (used_idx != free_idx) { - // The queue is not empty, update the flag and exit - tx_frames_pending = true; - break; - } - } - } - - return tx_frames_pending; -} - -/** - ****************************************************************************** - */ -void *ipc_host_tx_flush(struct ipc_host_env_tag *env, const int queue_idx, const int user_pos) -{ - uint32_t used_idx = env->txdesc_used_idx[queue_idx][user_pos]; - void *host_id = env->tx_host_id[queue_idx][user_pos][used_idx & nx_txdesc_cnt_msk[queue_idx]]; - - // call the external function to indicate that a TX packet is freed - if (host_id != 0) { - // Reset the host id in the array - env->tx_host_id[queue_idx][user_pos][used_idx & nx_txdesc_cnt_msk[queue_idx]] = 0; - - // Increment the used index - env->txdesc_used_idx[queue_idx][user_pos]++; - } - - return host_id; -} - -/** - ****************************************************************************** - */ -void ipc_host_init(struct ipc_host_env_tag *env, - struct ipc_host_cb_tag *cb, - struct ipc_shared_env_tag *shared_env_ptr, - void *pthis) -{ - unsigned int i; - unsigned int size; - unsigned int *dst; - - // Reset the environments - // Reset the IPC Shared memory -#if 0 - /* check potential platform bug on multiple stores */ - memset(shared_env_ptr, 0, sizeof(struct ipc_shared_env_tag)); -#else - dst = (unsigned int *)shared_env_ptr; - size = (unsigned int)sizeof(struct ipc_shared_env_tag); - for (i = 0; i < size; i += 4) { - *dst++ = 0; - } -#endif - // Reset the IPC Host environment - memset(env, 0, sizeof(struct ipc_host_env_tag)); - - // Initialize the shared environment pointer - env->shared = shared_env_ptr; - - // Save the callbacks in our own environment - env->cb = *cb; - - // Save the pointer to the register base - env->pthis = pthis; - - // Initialize buffers numbers and buffers sizes needed for DMA Receptions - env->rx_bufnb = IPC_RXBUF_CNT; - #ifdef CONFIG_RWNX_FULLMAC - env->rxdesc_nb = IPC_RXDESC_CNT; - #endif //(CONFIG_RWNX_FULLMAC) - env->radar_bufnb = IPC_RADARBUF_CNT; - env->radar_bufsz = sizeof(struct radar_pulse_array_desc); - env->unsuprxvec_bufnb = IPC_UNSUPRXVECBUF_CNT; - env->unsuprxvec_bufsz = max(sizeof(struct rx_vector_desc), (size_t) RADIOTAP_HDR_MAX_LEN) + - RADIOTAP_HDR_VEND_MAX_LEN + UNSUP_RX_VEC_DATA_LEN; - env->ipc_e2amsg_bufnb = IPC_MSGE2A_BUF_CNT; - env->ipc_e2amsg_bufsz = sizeof(struct ipc_e2a_msg); - env->ipc_dbg_bufnb = IPC_DBGBUF_CNT; - env->ipc_dbg_bufsz = sizeof(struct ipc_dbg_msg); - - for (i = 0; i < CONFIG_USER_MAX; i++) { - // Initialize the pointers to the hostid arrays - env->tx_host_id[0][i] = env->tx_host_id0[i]; - env->tx_host_id[1][i] = env->tx_host_id1[i]; - env->tx_host_id[2][i] = env->tx_host_id2[i]; - env->tx_host_id[3][i] = env->tx_host_id3[i]; - #if NX_TXQ_CNT == 5 - env->tx_host_id[4][i] = NULL; - #endif - - // Initialize the pointers to the TX descriptor arrays - env->txdesc[0][i] = shared_env_ptr->txdesc0[i]; - env->txdesc[1][i] = shared_env_ptr->txdesc1[i]; - env->txdesc[2][i] = shared_env_ptr->txdesc2[i]; - env->txdesc[3][i] = shared_env_ptr->txdesc3[i]; - #if NX_TXQ_CNT == 5 - env->txdesc[4][i] = NULL; - #endif - } - - #if NX_TXQ_CNT == 5 - env->tx_host_id[4][0] = env->tx_host_id4[0]; - env->txdesc[4][0] = shared_env_ptr->txdesc4[0]; - #endif -} - -/** - ****************************************************************************** - */ -void ipc_host_patt_addr_push(struct ipc_host_env_tag *env, uint32_t addr) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Copy the address - shared_env_ptr->pattern_addr = addr; -} - -/** - ****************************************************************************** - */ -int ipc_host_rxbuf_push(struct ipc_host_env_tag *env, -#ifdef CONFIG_RWNX_FULLMAC - uint32_t hostid, -#endif - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - REG_SW_CLEAR_HOSTBUF_IDX_PROFILING(env->pthis); - REG_SW_SET_HOSTBUF_IDX_PROFILING(env->pthis, env->ipc_host_rxbuf_idx); - -#ifdef CONFIG_RWNX_FULLMAC - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->host_rxbuf[env->ipc_host_rxbuf_idx].hostid = hostid; - shared_env_ptr->host_rxbuf[env->ipc_host_rxbuf_idx].dma_addr = hostbuf; -#else - // Save the hostid and the hostbuf in global array - env->ipc_host_rxbuf_array[env->ipc_host_rxbuf_idx].hostid = hostid; - env->ipc_host_rxbuf_array[env->ipc_host_rxbuf_idx].dma_addr = hostbuf; - - shared_env_ptr->host_rxbuf[env->ipc_host_rxbuf_idx] = hostbuf; -#endif //(CONFIG_RWNX_FULLMAC) - - // Signal to the embedded CPU that at least one buffer is available - ipc_app2emb_trigger_set(shared_env_ptr, IPC_IRQ_A2E_RXBUF_BACK); - - // Increment the array index - env->ipc_host_rxbuf_idx = (env->ipc_host_rxbuf_idx +1)%IPC_RXBUF_CNT; - - return 0; -} - -#ifdef CONFIG_RWNX_FULLMAC -/** - ****************************************************************************** - */ -int ipc_host_rxdesc_push(struct ipc_host_env_tag *env, void *hostid, - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Reset the RX Descriptor DMA Address and increment the counter - env->ipc_host_rxdesc_array[env->ipc_host_rxdesc_idx].dma_addr = hostbuf; - env->ipc_host_rxdesc_array[env->ipc_host_rxdesc_idx].hostid = hostid; - - shared_env_ptr->host_rxdesc[env->ipc_host_rxdesc_idx].dma_addr = hostbuf; - - // Signal to the embedded CPU that at least one descriptor is available - ipc_app2emb_trigger_set(shared_env_ptr, IPC_IRQ_A2E_RXDESC_BACK); - - env->ipc_host_rxdesc_idx = (env->ipc_host_rxdesc_idx + 1) % IPC_RXDESC_CNT; - - return 0; -} -#endif /* CONFIG_RWNX_FULLMAC */ - -/** - ****************************************************************************** - */ -int ipc_host_radarbuf_push(struct ipc_host_env_tag *env, void *hostid, - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Save the hostid and the hostbuf in global array - env->ipc_host_radarbuf_array[env->ipc_host_radarbuf_idx].hostid = hostid; - env->ipc_host_radarbuf_array[env->ipc_host_radarbuf_idx].dma_addr = hostbuf; - - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->radarbuf_hostbuf[env->ipc_host_radarbuf_idx] = hostbuf; - - // Increment the array index - env->ipc_host_radarbuf_idx = (env->ipc_host_radarbuf_idx +1)%IPC_RADARBUF_CNT; - - return 0; -} - -/** - ****************************************************************************** - */ - -int ipc_host_unsup_rx_vec_buf_push(struct ipc_host_env_tag *env, - void *hostid, - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - env->ipc_host_unsuprxvecbuf_array[env->ipc_host_unsuprxvecbuf_idx].hostid = hostid; - env->ipc_host_unsuprxvecbuf_array[env->ipc_host_unsuprxvecbuf_idx].dma_addr = hostbuf; - - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->unsuprxvecbuf_hostbuf[env->ipc_host_unsuprxvecbuf_idx] = hostbuf; - - // Increment the array index - env->ipc_host_unsuprxvecbuf_idx = (env->ipc_host_unsuprxvecbuf_idx + 1)%IPC_UNSUPRXVECBUF_CNT; - - return 0; -} - -/** - ****************************************************************************** - */ -int ipc_host_msgbuf_push(struct ipc_host_env_tag *env, void *hostid, - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Save the hostid and the hostbuf in global array - env->ipc_host_msgbuf_array[env->ipc_host_msge2a_idx].hostid = hostid; - env->ipc_host_msgbuf_array[env->ipc_host_msge2a_idx].dma_addr = hostbuf; - - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->msg_e2a_hostbuf_addr[env->ipc_host_msge2a_idx] = hostbuf; - - // Increment the array index - env->ipc_host_msge2a_idx = (env->ipc_host_msge2a_idx +1)%IPC_MSGE2A_BUF_CNT; - - return 0; -} - -/** - ****************************************************************************** - */ -int ipc_host_dbgbuf_push(struct ipc_host_env_tag *env, void *hostid, - uint32_t hostbuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Save the hostid and the hostbuf in global array - env->ipc_host_dbgbuf_array[env->ipc_host_dbg_idx].hostid = hostid; - env->ipc_host_dbgbuf_array[env->ipc_host_dbg_idx].dma_addr = hostbuf; - - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->dbg_hostbuf_addr[env->ipc_host_dbg_idx] = hostbuf; - - // Increment the array index - env->ipc_host_dbg_idx = (env->ipc_host_dbg_idx +1)%IPC_DBGBUF_CNT; - - return 0; -} - -/** - ****************************************************************************** - */ -void ipc_host_dbginfobuf_push(struct ipc_host_env_tag *env, uint32_t infobuf) -{ - struct ipc_shared_env_tag *shared_env_ptr = env->shared; - - // Copy the hostbuf (DMA address) in the ipc shared memory - shared_env_ptr->la_dbginfo_addr = infobuf; -} - -/** - ****************************************************************************** - */ -volatile struct txdesc_host *ipc_host_txdesc_get(struct ipc_host_env_tag *env, const int queue_idx, const int user_pos) -{ - volatile struct txdesc_host *txdesc_free; - uint32_t used_idx = env->txdesc_used_idx[queue_idx][user_pos]; - uint32_t free_idx = env->txdesc_free_idx[queue_idx][user_pos]; - - ASSERT_ERR(queue_idx < IPC_TXQUEUE_CNT); - ASSERT_ERR((free_idx - used_idx) <= nx_txdesc_cnt[queue_idx]); - - // Check if a free descriptor is available - if (free_idx != (used_idx + nx_txdesc_cnt[queue_idx])) { - // Get the pointer to the first free descriptor - txdesc_free = env->txdesc[queue_idx][user_pos] + (free_idx & nx_txdesc_cnt_msk[queue_idx]); - } else { - txdesc_free = NULL; - } - - return txdesc_free; -} - -/** - ****************************************************************************** - */ -void ipc_host_txdesc_push(struct ipc_host_env_tag *env, const int queue_idx, - const int user_pos, void *host_id) -{ - uint32_t free_idx = env->txdesc_free_idx[queue_idx][user_pos] & nx_txdesc_cnt_msk[queue_idx]; - volatile struct txdesc_host *txdesc_pushed = env->txdesc[queue_idx][user_pos] + free_idx; - - - // Descriptor is now ready - txdesc_pushed->ready = 0xFFFFFFFF; - - // Save the host id in the environment - env->tx_host_id[queue_idx][user_pos][free_idx] = host_id; - - // Increment the index - env->txdesc_free_idx[queue_idx][user_pos]++; - - // trigger interrupt!!! - //REG_SW_SET_PROFILING(env->pthis, CO_BIT(queue_idx+SW_PROF_IRQ_A2E_TXDESC_FIRSTBIT)); - ipc_app2emb_trigger_setf(env->shared, CO_BIT(user_pos + queue_idx * CONFIG_USER_MAX + - IPC_IRQ_A2E_TXDESC_FIRSTBIT)); -} - -/** - ****************************************************************************** - */ -void ipc_host_irq(struct ipc_host_env_tag *env, uint32_t status) -{ - // Acknowledge the pending interrupts - ipc_emb2app_ack_clear(env->shared, status); - // And re-read the status, just to be sure that the acknowledgment is - // effective when we start the interrupt handling - ipc_emb2app_status_get(env->shared); - - // Optimized for only one IRQ at a time - if (status & IPC_IRQ_E2A_RXDESC) { - // handle the RX descriptor reception - ipc_host_rxdesc_handler(env); - } - if (status & IPC_IRQ_E2A_MSG_ACK) { - ipc_host_msgack_handler(env); - } - if (status & IPC_IRQ_E2A_MSG) { - ipc_host_msg_handler(env); - } - if (status & IPC_IRQ_E2A_TXCFM) { - int i; - -#ifdef __KERNEL__ - spin_lock_bh(&((struct rwnx_hw *)env->pthis)->tx_lock); -#endif - // handle the TX confirmation reception - for (i = 0; i < IPC_TXQUEUE_CNT; i++) { - int j = 0; -#ifdef CONFIG_RWNX_MUMIMO_TX - for (; j < nx_txuser_cnt[i]; j++) -#endif - { - uint32_t q_bit = CO_BIT(j + i * CONFIG_USER_MAX + IPC_IRQ_E2A_TXCFM_POS); - if (status & q_bit) { - // handle the confirmation - ipc_host_tx_cfm_handler(env, i, j); - } - } - } -#ifdef __KERNEL__ - spin_unlock_bh(&((struct rwnx_hw *)env->pthis)->tx_lock); -#endif - } - if (status & IPC_IRQ_E2A_RADAR) { - // handle the radar event reception - ipc_host_radar_handler(env); - } - - if (status & IPC_IRQ_E2A_UNSUP_RX_VEC) { - // handle the unsupported rx vector reception - ipc_host_unsup_rx_vec_handler(env); - } - - if (status & IPC_IRQ_E2A_DBG) { - ipc_host_dbg_handler(env); - } - - if (status & IPC_IRQ_E2A_TBTT_PRIM) { - env->cb.prim_tbtt_ind(env->pthis); - } - - if (status & IPC_IRQ_E2A_TBTT_SEC) { - env->cb.sec_tbtt_ind(env->pthis); - } -} - -/** - ****************************************************************************** - */ -int ipc_host_msg_push(struct ipc_host_env_tag *env, void *msg_buf, uint16_t len) -{ - int i; - uint32_t *src, *dst; - - REG_SW_SET_PROFILING(env->pthis, SW_PROF_IPC_MSGPUSH); - - ASSERT_ERR(!env->msga2e_hostid); - ASSERT_ERR(round_up(len, 4) <= sizeof(env->shared->msg_a2e_buf.msg)); - - // Copy the message into the IPC MSG buffer -#ifdef __KERNEL__ - src = (uint32_t *)((struct rwnx_cmd *)msg_buf)->a2e_msg; -#else - src = (uint32_t *) msg_buf; -#endif - dst = (uint32_t *)&(env->shared->msg_a2e_buf.msg); - - // Copy the message in the IPC queue - for (i = 0; i < len; i += 4) { - *dst++ = *src++; - } - - env->msga2e_hostid = msg_buf; - - // Trigger the irq to send the message to EMB - ipc_app2emb_trigger_set(env->shared, IPC_IRQ_A2E_MSG); - - REG_SW_CLEAR_PROFILING(env->pthis, SW_PROF_IPC_MSGPUSH); - - return 0; -} - -/** - ****************************************************************************** - */ -void ipc_host_enable_irq(struct ipc_host_env_tag *env, uint32_t value) -{ - // Enable the handled interrupts - ipc_emb2app_unmask_set(env->shared, value); -} - -/** - ****************************************************************************** - */ -void ipc_host_disable_irq(struct ipc_host_env_tag *env, uint32_t value) -{ - // Enable the handled interrupts - ipc_emb2app_unmask_clear(env->shared, value); -} - -/** - ****************************************************************************** - */ -uint32_t ipc_host_get_status(struct ipc_host_env_tag *env) -{ - volatile uint32_t status; - - status = ipc_emb2app_status_get(env->shared); - - return status; -} - -/** - ****************************************************************************** - */ -uint32_t ipc_host_get_rawstatus(struct ipc_host_env_tag *env) -{ - volatile uint32_t rawstatus; - - rawstatus = ipc_emb2app_rawstatus_get(env->shared); - - return rawstatus; -} -- Gitblit v1.6.2