- Main Page
- Modules
- Data Structures
- Files

- File List
- Globals

# /space/home/slher/rel/Beken/v6_4_5/macsw/plf/refip/src/driver/ipc/ipc_emb.h

Go to the documentation of this file.

    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_