00001 00013 #ifndef _IPC_EMB_H_ 00014 #define _IPC_EMB_H_ 00015 00016 /* 00017 * INCLUDE FILES 00018 **************************************************************************************** 00019 */ 00020 #include "co_int.h" 00021 #include "co_bool.h" 00022 00023 #include "compiler.h" 00024 00025 #include "co_status.h" 00026 #include "ipc_shared.h" 00027 #include "ke_queue.h" 00028 #include "ke_event.h" 00029 #include "reg_ipc_emb.h" 00030 00031 // forward declarations 00032 struct ke_msg; 00033 00040 00041 struct ipc_emb_env_tag 00042 { 00044 struct co_list rx_queue; 00045 00047 struct co_list cfm_queue; 00048 00049 #if (NX_UMAC_PRESENT) 00051 uint8_t ipc_rxdesc_idx; 00052 #endif //(NX_UMAC_PRESENT) 00054 uint8_t ipc_rxbuf_idx; 00056 uint8_t ipc_radar_buf_idx; 00058 uint8_t ipc_msge2a_buf_idx; 00060 uint8_t ipc_dbg_buf_idx; 00062 uint8_t ipc_msgacke2a_cnt; 00064 uint8_t ipc_unsup_rx_vec_buf_idx; 00065 00067 uint32_t txdesc_idx[IPC_TXQUEUE_CNT][RW_USER_MAX]; 00068 #if RW_MUMIMO_TX_EN 00070 uint8_t user_active[IPC_TXQUEUE_CNT]; 00071 #endif 00073 volatile struct txdesc_host *txdesc[IPC_TXQUEUE_CNT][RW_USER_MAX]; 00074 }; 00075 00077 extern struct ipc_emb_env_tag ipc_emb_env; 00078 00081 extern const int nx_txdesc_cnt_msk[]; 00082 00091 __INLINE uint32_t ipc_emb_tx_pattern_addr_get(void) 00092 { 00093 return(ipc_shared_env.pattern_addr); 00094 } 00095 00107 __INLINE uint32_t ipc_emb_buffered_get(uint8_t sta, uint8_t tid) 00108 { 00109 return(ipc_shared_env.buffered[sta][tid]); 00110 } 00111 00122 __INLINE bool ipc_emb_tx_q_has_data(int queue_idx) 00123 { 00124 volatile struct txdesc_host *txdesc_src; 00125 00126 #if RW_MUMIMO_TX_EN 00127 for (int i = 0; i < nx_txuser_cnt[queue_idx]; i++) 00128 { 00129 txdesc_src = ipc_emb_env.txdesc[queue_idx][i] 00130 + (ipc_emb_env.txdesc_idx[queue_idx][i] & nx_txdesc_cnt_msk[queue_idx]); 00131 00132 if (txdesc_src->ready) 00133 return true; 00134 } 00135 00136 return false; 00137 #else 00138 txdesc_src = ipc_emb_env.txdesc[queue_idx][0] 00139 + (ipc_emb_env.txdesc_idx[queue_idx][0] & nx_txdesc_cnt_msk[queue_idx]); 00140 00141 // Return the status of the first descriptor 00142 return (txdesc_src->ready); 00143 #endif 00144 } 00145 00157 uint8_t ipc_emb_tx_q_len(int queue_idx, int vif_idx); 00158 00170 __INLINE uint32_t ipc_emb_tx_evt_field(uint32_t stat) 00171 { 00172 #if RW_MUMIMO_TX_EN 00173 return (((((stat & IPC_IRQ_A2E_AC0_MSK) != 0) << 0) 00174 | (((stat & IPC_IRQ_A2E_AC1_MSK) != 0) << 1) 00175 | (((stat & IPC_IRQ_A2E_AC2_MSK) != 0) << 2) 00176 | (((stat & IPC_IRQ_A2E_AC3_MSK) != 0) << 3) 00177 #if (NX_BEACONING) 00178 | (((stat & IPC_IRQ_A2E_BCN_MSK) != 0) << 4) 00179 #endif 00180 ) << (31 - KE_EVT_MACIF_TXDESC_AC0)); 00181 #else 00182 return ((stat >> IPC_IRQ_A2E_TXDESC_FIRSTBIT) << (31 - KE_EVT_MACIF_TXDESC_AC0)); 00183 #endif 00184 } 00185 00186 #if RW_MUMIMO_TX_EN 00187 00196 __INLINE void ipc_emb_enable_users(int queue_idx, uint8_t active_users) 00197 { 00198 uint32_t enable = active_users << (RW_USER_MAX * queue_idx + IPC_IRQ_A2E_TXDESC_FIRSTBIT); 00199 00200 // Update active users 00201 ipc_emb_env.user_active[queue_idx] = active_users; 00202 00203 // Re-enable the IPC interrupts for these users 00204 ipc_app2emb_unmask_set(enable & IPC_IRQ_A2E_TXDESC); 00205 00206 // Launch the event in case buffers are available 00207 ke_evt_set(ipc_emb_tx_evt_field(enable)); 00208 } 00209 #endif 00210 00217 void ipc_emb_radar_event_ind(void); 00218 00219 #if NX_UF_EN 00220 00226 void ipc_emb_unsup_rx_vec_event_ind(void); 00227 #endif 00228 00237 void ipc_emb_txcfm_ind(uint32_t queue_bits); 00238 00239 00248 void ipc_emb_prim_tbtt_ind(void); 00249 00258 void ipc_emb_sec_tbtt_ind(void); 00259 00271 bool ipc_emb_hostrxbuf_check(void); 00272 00293 #if (NX_UMAC_PRESENT) 00294 uint32_t ipc_emb_hostrxbuf_get(uint32_t *host_id); 00295 #else 00296 uint32_t ipc_emb_hostrxbuf_get(void); 00297 #endif //(NX_UMAC_PRESENT) 00298 00299 #if (NX_UMAC_PRESENT) 00300 00308 bool ipc_emb_hostrxdesc_check(void); 00309 00318 uint32_t ipc_emb_hostrxdesc_get(void); 00319 #endif //(NX_UMAC_PRESENT) 00320 00329 uint32_t ipc_emb_hostdbgdumpbuf_get(void); 00330 00339 uint32_t ipc_emb_hostradarbuf_get(void); 00340 00341 #if NX_UF_EN 00342 00350 uint32_t ipc_emb_hostunsuprxvectbuf_get(void); 00351 #endif 00352 00362 void ipc_emb_rxdata_ind(void); 00363 00364 00375 void ipc_emb_kmsg_fwd(const struct ke_msg *ke_msg); 00376 00386 void ipc_emb_init(void); 00387 00388 00395 void ipc_emb_tx_flow_off(void); 00396 00403 void ipc_emb_tx_flow_on(void); 00404 00405 00412 void ipc_emb_tx_irq(void); 00413 00414 00421 void ipc_emb_msg_irq(void); 00422 00423 00430 void ipc_emb_cfmback_irq(void); 00431 00440 void ipc_emb_tx_evt(int queue_idx); 00441 00453 void ipc_emb_msg_evt(int dummy); 00454 00462 void ipc_emb_msg_dma_int_handler(void); 00463 00476 void ipc_emb_print_fwd(bool poll, const uint32_t len, char *string); 00477 00485 void ipc_emb_dbg_dma_int_handler(void); 00486 00488 00489 #endif // _IPC_EMB_H_
1.6.1