277 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			277 lines
		
	
	
		
			10 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 CVG_BWM_INTERNAL_H
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_INTERNAL_H
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* os shim includes */
							 | 
						||
| 
								 | 
							
								#include "os_types.h"
							 | 
						||
| 
								 | 
							
								#include "os_timer_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* public api includes */
							 | 
						||
| 
								 | 
							
								#include "cvg_api.h"
							 | 
						||
| 
								 | 
							
								#include "plc_fr.h"
							 | 
						||
| 
								 | 
							
								#include "mac_bcm_api.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cvg module internal includes */
							 | 
						||
| 
								 | 
							
								#include "cvg.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define beacon period region info */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_REG_BC          0   /* beacon region */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_REG_CSMA        1   /* csma region */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_REG_TDMA        2   /* tdma region */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_REG_DCSMA       3   /* dedicated csma region */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_REG_CNT         4   /* max number of region count in one bp */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* define bandwidth management state, different state may have different
							 | 
						||
| 
								 | 
							
								 * bandwidth configuration. beacon and csma region are always enabled.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								/* invalid state */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_INVALID           0
							 | 
						||
| 
								 | 
							
								/* network established and only csma region required */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_CSMA_ONLY         1
							 | 
						||
| 
								 | 
							
								/* network established and tdma region required */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_TDMA_EN           2
							 | 
						||
| 
								 | 
							
								/* network established and dedicated csma region required */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_DCSMA_EN          3
							 | 
						||
| 
								 | 
							
								/* network established and both tdma and dedicated csma region required */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_TDMA_DCSMA_EN     4
							 | 
						||
| 
								 | 
							
								/* max number of state */
							 | 
						||
| 
								 | 
							
								#define CVG_BWM_S_CNT               4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cvg_bwm_bw_ratio {
							 | 
						||
| 
								 | 
							
								    /* ratio of each region. The sum of each region ratio must be 100.
							 | 
						||
| 
								 | 
							
								     * see CVG_BWM_REG_XXX for the region definition.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t     ratio[CVG_BWM_REG_CNT];
							 | 
						||
| 
								 | 
							
								    /* minimum ratio of each phase in csma region. if csma region acquired
							 | 
						||
| 
								 | 
							
								     * 50% of a whole beacon period and the minimum ratio of each phase is
							 | 
						||
| 
								 | 
							
								     * 10%, then each phase in csma region will have at least 5% of the whole
							 | 
						||
| 
								 | 
							
								     * beacon period. this is not applicable to dedicated csma region.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t     csma_ratio_per_phase_min;
							 | 
						||
| 
								 | 
							
								} cvg_bwm_bw_ratio_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct _cvg_bwm_cco_vdev {
							 | 
						||
| 
								 | 
							
								    /* ratio table of each state */
							 | 
						||
| 
								 | 
							
								    cvg_bwm_bw_ratio_t  ratio_tab[CVG_BWM_S_CNT];
							 | 
						||
| 
								 | 
							
								    /* the last update time of the frequency change information */
							 | 
						||
| 
								 | 
							
								    uint64_t            fb_chg_last_ts;
							 | 
						||
| 
								 | 
							
								    /* time left of frequency band change */
							 | 
						||
| 
								 | 
							
								    uint32_t            fb_chg_left;
							 | 
						||
| 
								 | 
							
								    /* delay for each frequency band switch request, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint32_t            fb_chg_delay;
							 | 
						||
| 
								 | 
							
								    /* the last update time of the rf channel change information */
							 | 
						||
| 
								 | 
							
								    uint64_t            rf_chg_last_ts;
							 | 
						||
| 
								 | 
							
								    /* time left of rf channel change */
							 | 
						||
| 
								 | 
							
								    uint32_t            rf_chg_left;
							 | 
						||
| 
								 | 
							
								    /* delay for each rf channel switch request, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint32_t            rf_chg_delay;
							 | 
						||
| 
								 | 
							
								    /* current beacon period duration */
							 | 
						||
| 
								 | 
							
								    uint32_t            curr_bc_period;
							 | 
						||
| 
								 | 
							
								    /* next beacon period duration */
							 | 
						||
| 
								 | 
							
								    uint32_t            next_bc_period;
							 | 
						||
| 
								 | 
							
								    /* current min allowed bc period, uint is 1ms */
							 | 
						||
| 
								 | 
							
								    uint32_t            min_bc_period;
							 | 
						||
| 
								 | 
							
								    /* protocol max allowed bc period, uint is 1ms */
							 | 
						||
| 
								 | 
							
								    uint32_t            max_bc_period;
							 | 
						||
| 
								 | 
							
								    /* current bandwidth state */
							 | 
						||
| 
								 | 
							
								    uint8_t             curr_state;
							 | 
						||
| 
								 | 
							
								    /* next bandwidth state */
							 | 
						||
| 
								 | 
							
								    uint8_t             next_state;
							 | 
						||
| 
								 | 
							
								    /* current max allowed bc slot count */
							 | 
						||
| 
								 | 
							
								    uint8_t             max_bc_slot;
							 | 
						||
| 
								 | 
							
								    /* current max allowed beacon region duratio */
							 | 
						||
| 
								 | 
							
								    uint16_t            max_bc_dur;
							 | 
						||
| 
								 | 
							
								    /* current min required csma regtion duration */
							 | 
						||
| 
								 | 
							
								    uint16_t            min_csma_dur;
							 | 
						||
| 
								 | 
							
								    /* current min required tdma regtion duration */
							 | 
						||
| 
								 | 
							
								    uint16_t            min_tdma_dur;
							 | 
						||
| 
								 | 
							
								    /* current min required dedicated csma regtion duration */
							 | 
						||
| 
								 | 
							
								    uint16_t            min_dcsma_dur;
							 | 
						||
| 
								 | 
							
								    /* next beacon slot duration, unit is 1ms */
							 | 
						||
| 
								 | 
							
								    uint8_t             next_bc_slot_dur;
							 | 
						||
| 
								 | 
							
								    /* tei start from which to search next discovery beacon sta */
							 | 
						||
| 
								 | 
							
								    tei_t               d_tei;
							 | 
						||
| 
								 | 
							
								    /* level start from which to search next discovery beacon sta */
							 | 
						||
| 
								 | 
							
								    uint8_t             d_level;
							 | 
						||
| 
								 | 
							
								    /* number of times stay in current search start point for next discovery
							 | 
						||
| 
								 | 
							
								     * beacon sta.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t             d_cnt;
							 | 
						||
| 
								 | 
							
								    /* tei start from which to search next discovery beacon rf sta */
							 | 
						||
| 
								 | 
							
								    tei_t               d_rf_tei;
							 | 
						||
| 
								 | 
							
								    /* level start from which to search next discovery beacon rf sta */
							 | 
						||
| 
								 | 
							
								    uint8_t             d_rf_level;
							 | 
						||
| 
								 | 
							
								    /* number of times stay in current search start point for next discovery
							 | 
						||
| 
								 | 
							
								     * beacon rf sta.
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t             d_rf_cnt;
							 | 
						||
| 
								 | 
							
								    /* link id of the tdma region */
							 | 
						||
| 
								 | 
							
								    uint8_t             tdma_lid;
							 | 
						||
| 
								 | 
							
								    /* link id of the dedicated csma region */
							 | 
						||
| 
								 | 
							
								    uint8_t             dcsma_lid;
							 | 
						||
| 
								 | 
							
								    /* current dcsma bind phase */
							 | 
						||
| 
								 | 
							
								    uint8_t             dcsma_phase     :2,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if CCO device uses csma 1ms unit */
							 | 
						||
| 
								 | 
							
								                        csma_1ms        :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if CCO device enlarge hplc bc slot duration by payload size
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								                        bc_slot_enlarge_by_pld :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if CCO device enlarge hplc bc slot duration by topo level */
							 | 
						||
| 
								 | 
							
								                        bc_slot_enlarge_by_level :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if rf channel change is initiated by internal module */
							 | 
						||
| 
								 | 
							
								                        rf_chg_inner    :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if CCO device using minimum beacon payload size */
							 | 
						||
| 
								 | 
							
								                        bc_pld_min      :1,
							 | 
						||
| 
								 | 
							
								    /* reserved for future */
							 | 
						||
| 
								 | 
							
								                        rsvd            :1;
							 | 
						||
| 
								 | 
							
								    /* flag to mark if csma solt average distribution of each phase is enabled
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    uint8_t             csma_slot_average;
							 | 
						||
| 
								 | 
							
								    /* the ratio of rf beacon slot duration to hplc beacon slot duration */
							 | 
						||
| 
								 | 
							
								    uint8_t             rf_ts_ratio;
							 | 
						||
| 
								 | 
							
								    /* time stamp of last time CCO device enlarge hplc bc slot, uint is 1s */
							 | 
						||
| 
								 | 
							
								    uint32_t            bc_slot_enlarge_ts;
							 | 
						||
| 
								 | 
							
								} cvg_bwm_cco_vdev_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* per vdev bandwidth management descriptor */
							 | 
						||
| 
								 | 
							
								typedef struct _cvg_bwm_vdev {
							 | 
						||
| 
								 | 
							
								    /* pointer of cvg vdev */
							 | 
						||
| 
								 | 
							
								    cvg_vdev_t              *vdev;
							 | 
						||
| 
								 | 
							
								    /* time slot assignment info */
							 | 
						||
| 
								 | 
							
								    mac_bc_time_slot_t      ts;
							 | 
						||
| 
								 | 
							
								    /* frequency change notification assignment info */
							 | 
						||
| 
								 | 
							
								    mac_bc_freq_chg_t       fb_chg;
							 | 
						||
| 
								 | 
							
								    /* timer for frequency change left time */
							 | 
						||
| 
								 | 
							
								    timer_id_t              fb_chg_timer;
							 | 
						||
| 
								 | 
							
								    /* currently used frequency band ID */
							 | 
						||
| 
								 | 
							
								    uint8_t                 fb_id;
							 | 
						||
| 
								 | 
							
								    /* frequency change target ID */
							 | 
						||
| 
								 | 
							
								    uint8_t                 fb_target_id;
							 | 
						||
| 
								 | 
							
								    /* rf channel change notification assignment info */
							 | 
						||
| 
								 | 
							
								    mac_bc_rf_channel_chg_t rf_chg;
							 | 
						||
| 
								 | 
							
								    /* timer for rf channel change left time */
							 | 
						||
| 
								 | 
							
								    timer_id_t              rf_chg_timer;
							 | 
						||
| 
								 | 
							
								    /* currently used rf channel */
							 | 
						||
| 
								 | 
							
								    uint8_t                 rf_channel;
							 | 
						||
| 
								 | 
							
								    /* rf channel change target ID */
							 | 
						||
| 
								 | 
							
								    uint8_t                 rf_target_channel;
							 | 
						||
| 
								 | 
							
								    /* rf option change target ID, see RF_OPTION_XXX */
							 | 
						||
| 
								 | 
							
								    uint8_t                 rf_target_option;
							 | 
						||
| 
								 | 
							
								    /* currently used rf option, see RF_OPTION_XXX */
							 | 
						||
| 
								 | 
							
								    uint8_t                 rf_option;
							 | 
						||
| 
								 | 
							
								    /* flag to mark if time slot info changed */
							 | 
						||
| 
								 | 
							
								    uint8_t                 ts_updated      :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if frequency band change info changed */
							 | 
						||
| 
								 | 
							
								                            fb_chg_updated  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if band locked */
							 | 
						||
| 
								 | 
							
								                            fb_lock         :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if rf channel and option change info changed */
							 | 
						||
| 
								 | 
							
								                            rf_chg_updated  :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if rf channel and option locked */
							 | 
						||
| 
								 | 
							
								                            rf_lock         :1,
							 | 
						||
| 
								 | 
							
								    /* flag to mark if binding csma or tdma lid is updated */
							 | 
						||
| 
								 | 
							
								                            lid_updated     :1,
							 | 
						||
| 
								 | 
							
								    /* reserved for further use */
							 | 
						||
| 
								 | 
							
								                            reserved        :2;
							 | 
						||
| 
								 | 
							
								    /* rf channel changed detection count */
							 | 
						||
| 
								 | 
							
								    uint8_t                 rf_chg_cnt;
							 | 
						||
| 
								 | 
							
								    /* pointer CCO proprietary bwm structure */
							 | 
						||
| 
								 | 
							
								    cvg_bwm_cco_vdev_t      *cco;
							 | 
						||
| 
								 | 
							
								} cvg_bwm_vdev_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (CVG_BWM_DEBUG)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* debug funtion to dump time slot info */
							 | 
						||
| 
								 | 
							
								void cvg_bwm_dump_ts(cvg_vdev_t *vdev, mac_bc_time_slot_t *ts);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else /* CVG_BWM_DEBUG */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define cvg_bwm_dump_ts(vdev, ts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* CVG_BWM_DEBUG */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief cvg_bwm_restart_fb_chg_timer() - restart freq band change timer.
							 | 
						||
| 
								 | 
							
								 * @param bwm:   pointer to bwm
							 | 
						||
| 
								 | 
							
								 * @param dur:   duration, uint is 1ms.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void cvg_bwm_restart_fb_chg_timer(cvg_bwm_vdev_t *bwm, uint32_t dur);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if (PLC_SUPPORT_CCO_ROLE)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * cvg_bwm_cco_reset_vdev() - bwm cco vdev reset function
							 | 
						||
| 
								 | 
							
								 * @bwm:    bwm vdev pointer
							 | 
						||
| 
								 | 
							
								 * @cfg:    pointer of vdev configuration
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void cvg_bwm_cco_reset_vdev(cvg_bwm_vdev_t *bwm, cvg_vdev_cfg_t *cfg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * cvg_bwm_cco_init_vdev() - bwm cco vdev init function
							 | 
						||
| 
								 | 
							
								 * @bwm:    bwm vdev pointer
							 | 
						||
| 
								 | 
							
								 * @cfg:    pointer of vdev configuration
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * return:
							 | 
						||
| 
								 | 
							
								 *  0           --  for success case
							 | 
						||
| 
								 | 
							
								 *  otherwise   --  error code
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t cvg_bwm_cco_init_vdev(cvg_bwm_vdev_t *bwm, cvg_vdev_cfg_t *cfg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * cvg_bwm_cco_deinit_vdev() - bwm cco vdev deinit function
							 | 
						||
| 
								 | 
							
								 * @bwm:    bwm vdev pointer
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void cvg_bwm_cco_deinit_vdev(cvg_bwm_vdev_t *bwm);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief cvg_bwm_cco_set_fb() - set new frequency band ID for CCO.
							 | 
						||
| 
								 | 
							
								 * @param bwm:           pointer to bwm
							 | 
						||
| 
								 | 
							
								 * @param freq_band_id:  new frequency band ID to be set.
							 | 
						||
| 
								 | 
							
								 * @retval:  0           --  for success case
							 | 
						||
| 
								 | 
							
								 * @retval:  otherwise   --  error code
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								uint32_t cvg_bwm_cco_set_fb(cvg_bwm_vdev_t *bwm, uint8_t freq_band_id);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define cvg_bwm_cco_reset_vdev(bwm, cfg)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define cvg_bwm_cco_init_vdev(bwm, cfg) (ERR_NOSUPP)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static inline uint32_t cvg_bwm_cco_set_fb(cvg_bwm_vdev_t *bwm,
							 | 
						||
| 
								 | 
							
								    uint8_t freq_band_id)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    (void)bwm;
							 | 
						||
| 
								 | 
							
								    (void)freq_band_id;
							 | 
						||
| 
								 | 
							
								    return ERR_NOSUPP;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define cvg_bwm_cco_deinit_vdev(bwm)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* PLC_SUPPORT_CCO_ROLE */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* CVG_BWM_INTERNAL_H */
							 |