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
 |