257 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************************
 | 
						|
 | 
						|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | 
						|
 | 
						|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | 
						|
be copied by any method or incorporated into another program without
 | 
						|
the express written consent of Aerospace C.Power. This Information or any portion
 | 
						|
thereof remains the property of Aerospace C.Power. The Information contained herein
 | 
						|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | 
						|
liability for its use in any way and conveys no license or title under
 | 
						|
any patent or copyright and makes no representation or warranty that this
 | 
						|
Information is free from patent or copyright infringement.
 | 
						|
 | 
						|
****************************************************************************/
 | 
						|
 | 
						|
#ifndef MAC_RF_VDEV_H
 | 
						|
#define MAC_RF_VDEV_H
 | 
						|
 | 
						|
#include "beacon.h"
 | 
						|
#include "plc_utils.h"
 | 
						|
#include "iot_queue.h"
 | 
						|
#include "os_timer_api.h"
 | 
						|
#include "mac_vdev_api.h"
 | 
						|
#include "mac_bcm_api.h"
 | 
						|
#include "mac_data_api.h"
 | 
						|
#include "mac_ppm_scan.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
/* rate control callback */
 | 
						|
typedef uint32_t(*rf_rate_control_func_t)(void *peer, void *arg);
 | 
						|
 | 
						|
/* more cfg to be added later */
 | 
						|
typedef struct _mac_rf_vdev_start_cfg {
 | 
						|
    /* beacon rx callback of the vdev */
 | 
						|
    mac_bc_rx_func_t        mac_bc_rx_func;
 | 
						|
    /* data frame rx callback of the vdev */
 | 
						|
    mac_recv_msdu_func_t    mac_data_rx_func;
 | 
						|
    /* beacon period end alert callback of the vdev */
 | 
						|
    mac_bp_end_alert_func_t mac_bp_end_alert_func;
 | 
						|
} mac_rf_vdev_start_cfg_t;
 | 
						|
 | 
						|
/* NB: not to expose the structs to the upper layer directly */
 | 
						|
typedef struct _mac_rf_vdev {
 | 
						|
    vdevid_t rf_vdev_id;
 | 
						|
    /* uplay set power */
 | 
						|
    uint32_t fixed_rf_power_cap            : 8,
 | 
						|
    /* stop or start flag */
 | 
						|
             stop_flag                     : 1,
 | 
						|
    /* is rf sync_nid inited */
 | 
						|
             rf_sync_nid_inited            : 1,
 | 
						|
    /* is fixed power or not, used when upper layer set power */
 | 
						|
             fixed_rf_power_flag           : 1,
 | 
						|
    /* flag to mark if rf tx power temperature compensation enable */
 | 
						|
             power_temp_compen_en          : 1,
 | 
						|
    /* whether bcsma slot exist in current beacon period  */
 | 
						|
             bcsma_slot_exist              : 1,
 | 
						|
    /* bcsma nonentity cnt */
 | 
						|
             bcsma_non_exist_cnt           : 3,
 | 
						|
    /* flag to mark if suspend sending and receiving */
 | 
						|
             tx_rx_suspend                 : 1,
 | 
						|
             resv0                         : 15;
 | 
						|
    /* tx power compensation region index */
 | 
						|
    int8_t   power_temp_compen_idx;
 | 
						|
    /* the index meeting the temperature compensation region from the
 | 
						|
     * latest check.
 | 
						|
     */
 | 
						|
    int8_t   last_temp_compen_chk_idx;
 | 
						|
    /* rf ntb ppm, unit: 1/64 ppm */
 | 
						|
    int16_t rf_ntb_ppm;
 | 
						|
    /* rf ntb ppm update to hw count */
 | 
						|
    uint32_t ntb_ppm_update_cnt;
 | 
						|
    /* entering and exiting the temperature compensated condition stability
 | 
						|
     * counter.
 | 
						|
     */
 | 
						|
    uint32_t stable_cnt;
 | 
						|
    vdevid_t parent_vdev_id;
 | 
						|
    pdevid_t ref_pdev_id;
 | 
						|
    mac_rf_vdev_start_cfg_t rf_start_cfg;
 | 
						|
    /* rate control callback */
 | 
						|
    rf_rate_control_func_t ra_cb;
 | 
						|
    /* scheduler context */
 | 
						|
    void *rf_sched_ctx;
 | 
						|
    /* mac rf record ppm */
 | 
						|
    mac_ntb_record_ctxt_t mac_rf_ppm;
 | 
						|
    /* sync ntb record context */
 | 
						|
    mac_ntb_record_ctxt_t sync_ntb_record;
 | 
						|
    /* current ppm sync target nid */
 | 
						|
    uint32_t rf_sync_nid;
 | 
						|
    /* current ppm sync target proxy */
 | 
						|
    tei_t rf_sync_proxy;
 | 
						|
    // TODO: add config
 | 
						|
} mac_rf_vdev_t;
 | 
						|
 | 
						|
#if HPLC_RF_DEV_SUPPORT
 | 
						|
 | 
						|
/*
 | 
						|
 * rf_vdev_get_tei()             - rf vdev get tei.
 | 
						|
 * @rf_vdev:                     - the point of rf vdev.
 | 
						|
 * return:                       - tei.
 | 
						|
 */
 | 
						|
tei_t rf_vdev_get_tei(mac_rf_vdev_t* rf_vdev);
 | 
						|
 | 
						|
/*
 | 
						|
 * mac_rf_vdev_set_tei()            - rf vdev set tei.
 | 
						|
 * @rf_vdev:                        - the point of rf vdev.
 | 
						|
 * @tei:                            - tei.
 | 
						|
 * return:                          void.
 | 
						|
 */
 | 
						|
void mac_rf_vdev_set_tei(mac_rf_vdev_t* rf_vdev, tei_t tei);
 | 
						|
 | 
						|
/*
 | 
						|
 * @brief mac_rf_vdev_get_sync_nid() - get target nid current rf_vdev is syncing to
 | 
						|
 * @param rf_vdev:                   - mac rf vdev pointer
 | 
						|
 * @return uint32_t:                 - network id
 | 
						|
 */
 | 
						|
uint32_t mac_rf_vdev_get_sync_nid(mac_rf_vdev_t *rf_vdev, nid_t *rf_sync_nid);
 | 
						|
 | 
						|
/*
 | 
						|
 * @brief mac_rf_vdev_set_sync_nid() - set target nid current rf_vdev is syncing to
 | 
						|
 * @param rf_vdev:                   - mac rf vdev pointer
 | 
						|
 * @return void:                     - void
 | 
						|
 */
 | 
						|
void mac_rf_vdev_set_sync_nid(mac_rf_vdev_t *rf_vdev, uint32_t nid);
 | 
						|
 | 
						|
/*
 | 
						|
 * @brief mac_rf_vdev_reset_sync_nid() - reset nid current rf_vdev is syncing to
 | 
						|
 * @param rf_vdev:                     - mac rf vdev pointer
 | 
						|
 * @return void:                       - void
 | 
						|
 */
 | 
						|
void mac_rf_vdev_reset_sync_nid(mac_rf_vdev_t *rf_vdev);
 | 
						|
 | 
						|
/*
 | 
						|
 * @brief mac_rf_vdev_get_sync_proxy() - get target proxy current rf_vdev is
 | 
						|
 *                                       syncing to
 | 
						|
 * @param rf_vdev:                     - mac rf vdev pointer
 | 
						|
 * @return tei_t                       - target proxy tei
 | 
						|
 */
 | 
						|
tei_t mac_rf_vdev_get_sync_proxy(mac_rf_vdev_t *rf_vdev);
 | 
						|
 | 
						|
/*
 | 
						|
 * @brief mac_rf_vdev_set_sync_proxy() - set target proxy current rf_vdev is syncing to
 | 
						|
 * @param rf_vdev:                     - mac rfvdev pointer
 | 
						|
 * @return void:                       - void
 | 
						|
 */
 | 
						|
void mac_rf_vdev_set_sync_proxy(mac_rf_vdev_t *rf_vdev, tei_t proxy);
 | 
						|
 | 
						|
/*
 | 
						|
 * rf_vdev_get_node_role()       - rf vdev get node role.
 | 
						|
 * @rf_vdev:                     - the point of rf vdev.
 | 
						|
 * return:                       - tei.
 | 
						|
 */
 | 
						|
uint8_t rf_vdev_get_node_role(mac_rf_vdev_t* rf_vdev);
 | 
						|
 | 
						|
/*
 | 
						|
 * get_rf_vdev_ptr()             - get the point of rf vdev.
 | 
						|
 * @plc_pdev_id:                 - plc phasical mac device id.
 | 
						|
 * @rf_pdev_id:                  - rf phasical mac device id.
 | 
						|
 * @rf_vdev_id:                  - rf virtual mac device id
 | 
						|
 * return: rf vdev               - the point of rf vdev
 | 
						|
 */
 | 
						|
mac_rf_vdev_t *get_rf_vdev_ptr(uint32_t plc_pdev_id, uint32_t rf_pdev_id,
 | 
						|
    uint32_t rf_vdev_id);
 | 
						|
 | 
						|
/*
 | 
						|
 * rf_vdev_set_ra()              - set rf vdev rate control callback.
 | 
						|
 * @rf_vdev:                     - the pointer of rf vdev.
 | 
						|
 * @ra:                          - callback function.
 | 
						|
 * return:                       - none
 | 
						|
 */
 | 
						|
void rf_vdev_set_ra(mac_rf_vdev_t *rf_vdev, rf_rate_control_func_t ra);
 | 
						|
 | 
						|
/*
 | 
						|
 * mac_create_rf_vdev_internal() - create mac layer virtual device.
 | 
						|
 * @plc_pdev_id:                 - plc phasical mac device id.
 | 
						|
 * @plc_vdev_id:                 - plc virtual mac device id.
 | 
						|
 * @rf_pdev_id:                  - rf phasical mac device id.
 | 
						|
 * @rf_vdev_id_created:          - pointer to receive the created vdev id
 | 
						|
 * return:
 | 
						|
 *      0         -- for success case
 | 
						|
 *      othersie  -- error code
 | 
						|
 */
 | 
						|
uint32_t mac_create_rf_vdev_internal(uint8_t plc_pdev_id, uint8_t plc_vdev_id,
 | 
						|
    uint8_t rf_pdev_id, uint8_t *rf_vdev_id_created);
 | 
						|
 | 
						|
/*
 | 
						|
 * mac_start_rf_vdev_internal() - start mac layer virtual device.
 | 
						|
 * @plc_pdev_id:                - plc phasical mac device id.
 | 
						|
 * @rf_pdev_id:                 - rf phasical mac device id.
 | 
						|
 * @rf_vdev_id:                 - rf virtual mac device id.
 | 
						|
 * @cfg:                        - pointer to start config
 | 
						|
 * return:
 | 
						|
 *      0         -- for success case
 | 
						|
 *      othersie  -- error code
 | 
						|
 */
 | 
						|
uint32_t mac_start_rf_vdev_internal(uint8_t plc_pdev_id, uint8_t rf_pdev_id,
 | 
						|
    uint8_t rf_vdev_id, mac_vdev_start_cfg_t *rf_cfg);
 | 
						|
 | 
						|
/*
 | 
						|
 * mac_stop_rf_vdev_internal()  - stop mac layer virtual device.
 | 
						|
 * @plc_pdev_id:                - plc phasical mac device id.
 | 
						|
 * @rf_pdev_id:                 - rf phasical mac device id.
 | 
						|
 * @rf_vdev_id:                 - rf virtual mac device id.
 | 
						|
 * return:
 | 
						|
 *      0         -- for success case
 | 
						|
 *      othersie  -- error code
 | 
						|
 */
 | 
						|
uint32_t mac_stop_rf_vdev_internal(uint8_t plc_pdev_id, uint8_t rf_pdev_id,
 | 
						|
    uint8_t rf_vdev_id);
 | 
						|
 | 
						|
#else /* HPLC_RF_DEV_SUPPORT */
 | 
						|
 | 
						|
#define rf_vdev_set_ra(rf_vdev, ra) \
 | 
						|
    do { \
 | 
						|
        (void)(rf_vdev); \
 | 
						|
        (void)(ra); \
 | 
						|
    } while(0);
 | 
						|
 | 
						|
#define mac_rf_vdev_reset_sync_nid(rf_vdev) \
 | 
						|
    do { \
 | 
						|
        (void)(rf_vdev); \
 | 
						|
    } while(0);
 | 
						|
 | 
						|
#define get_rf_vdev_ptr(plc_pdev_id, rf_pdev_id, rf_vdev_id)    NULL; \
 | 
						|
    do { \
 | 
						|
        (void)plc_pdev_id;(void)rf_pdev_id;(void)rf_vdev_id; \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#define mac_create_rf_vdev_internal(plc_pdev_id, plc_vdev_id, \
 | 
						|
    rf_pdev_id, rf_vdev_id_created)       ERR_NOSUPP; \
 | 
						|
    do { \
 | 
						|
        (void)plc_pdev_id;(void)plc_vdev_id;(void)rf_pdev_id;\
 | 
						|
        (void)rf_vdev_id_created; \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#define mac_start_rf_vdev_internal(plc_pdev_id, rf_pdev_id, rf_vdev_id, cfg) \
 | 
						|
                             ERR_NOSUPP;  \
 | 
						|
    do { \
 | 
						|
        (void)plc_pdev_id;(void)rf_pdev_id;(void)rf_vdev_id;(void)cfg; \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#define mac_stop_rf_vdev_internal(plc_pdev_id, rf_pdev_id, rf_vdev_id) \
 | 
						|
                              ERR_NOSUPP; \
 | 
						|
    do { \
 | 
						|
        (void)plc_pdev_id;(void)rf_pdev_id;(void)rf_vdev_id; \
 | 
						|
    } while(0)
 | 
						|
 | 
						|
#endif /* HPLC_RF_DEV_SUPPORT */
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif // !MAC_VDEV_H
 |