310 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			310 lines
		
	
	
		
			11 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_TX_HW_H
 | ||
|  | #define MAC_TX_HW_H
 | ||
|  | 
 | ||
|  | #include "os_types.h"
 | ||
|  | #include "plc_utils.h"
 | ||
|  | #include "mac_pdev.h"
 | ||
|  | #include "mac_msdu.h"
 | ||
|  | #include "tx_mpdu_start.h"
 | ||
|  | #include "mac_dma.h"
 | ||
|  | #include "tx_stream_start.h"
 | ||
|  | #include "iot_plc_led.h"
 | ||
|  | #include "mpdu_header.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define SW_SCHE_REV             0
 | ||
|  | 
 | ||
|  | #define HW_WRITE_DESC_TIME      200
 | ||
|  | 
 | ||
|  | /* for tx hang check time, be careful for HW
 | ||
|  |  * scheduler time of RX only period. | ||
|  |  * TX_HANG_CHECK_TIME_MS * TX_HANG_HANDLE_CNT = 30S | ||
|  |  */ | ||
|  | #define TX_HANG_CHECK_TIME_MS   (15*1000)
 | ||
|  | #define TX_HANG_HANDLE_CNT      (3)
 | ||
|  | 
 | ||
|  | #define BCN_WARNING_DEPTH       (4)
 | ||
|  | 
 | ||
|  | /* above this may trigger adjust packet detection threshold */ | ||
|  | #define CSMA_Q_NORMAL_DEPTH     (PLC_TX_MPDU_POOL_SIZE >> 4)
 | ||
|  | 
 | ||
|  | /* above this would trigger ignore CCA energy */ | ||
|  | #define CSMA_Q_WARNING_DEPTH    (PLC_TX_MPDU_POOL_SIZE >> 2)
 | ||
|  | 
 | ||
|  | #define CSMA_RX_FALSE_ALARM_THD (300)
 | ||
|  | 
 | ||
|  | /* BCSMA warning depth */ | ||
|  | #define BCSMA_Q_WARNING_DEPTH   (1)
 | ||
|  | 
 | ||
|  | /* define the cnt of bcsma non exist beacon period, uint period cnt */ | ||
|  | #define BCSMA_NON_EXIST_PD_CNT  (6)
 | ||
|  | 
 | ||
|  | uint32_t mac_tx_hw_init(uint32_t proto, mac_pdev_t *pdev); | ||
|  | 
 | ||
|  | /*
 | ||
|  | mac tx a buf frag list to PLC network | ||
|  |  mpdu level interface with hw | ||
|  | 
 | ||
|  |     (IN) frag_list - list for tx, it can support dma frag, if HW can support | ||
|  |         scatter/gather, the buffer list can be transfered to HW desc directly. | ||
|  |     (OUT) return 0 for successful put into HW queue, other | ||
|  |         value for failed | ||
|  | 
 | ||
|  | */ | ||
|  | uint32_t mac_tx_hw(mac_pdev_t *pdev, tei_t src_tei, tei_t dst_tei, | ||
|  |     uint32_t nid, uint32_t lid, uint32_t delimiter_type, | ||
|  |     dma_frag_t *frag_list); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * mac_tx_hw_comp() - callback method for sending data complete. | ||
|  |  * | ||
|  |  * @buffer:         address of pointer to the data buffer to be sent | ||
|  |  * @len:            length of data to be sent | ||
|  |  * @need_free:      if the iot_pkt shall be freed | ||
|  |  * @txcomp_desc:    hardware info on the sending option | ||
|  |  * return: | ||
|  |  *      TRUE    -- Take the event successfully | ||
|  |  *      FALSE   -- Failed to take the event within ms milliseconds | ||
|  |  */ | ||
|  | uint32_t mac_tx_hw_comp(mac_pdev_t *pdev, void *buffer, size_t len, | ||
|  |     uint32_t need_free, void* txcomp_desc); | ||
|  | 
 | ||
|  | 
 | ||
|  | /* tx stream */ | ||
|  | uint32_t mac_tx_hw_stream(mac_pdev_t *pdev, tx_stream_start *stream); | ||
|  | uint32_t mac_tx_hw_stream_comp(mac_pdev_t *pdev, tx_stream_start *stream); | ||
|  | 
 | ||
|  | /* tx mpdu */ | ||
|  | uint32_t mac_tx_hw_mpdu(mac_queue_ctxt_t *tx_ctxt, uint32_t hwq_id, \ | ||
|  |     tx_mpdu_start *mpdu); | ||
|  | uint32_t mac_tx_hw_mpdu_comp(uint32_t hwqid, uint32_t is_phy_comp); | ||
|  | 
 | ||
|  | uint32_t mac_tx_hw_mpdu_comp_dsr(uint32_t hwqid); | ||
|  | 
 | ||
|  | mac_msdu_t *mac_tx_hw_msdu_comp(uint32_t hwq_id, | ||
|  |     tx_mpdu_start *current_mpdu, mac_pdev_t *pdev, uint32_t is_phy_comp); | ||
|  | 
 | ||
|  | uint32_t mac_tx_mpdu_fill_macinfo(tx_mpdu_start *mpdu_start, \ | ||
|  |     uint32_t swqid, uint32_t pb_num_in_desc, uint32_t need_encry, | ||
|  |     uint32_t need_ack, uint32_t symppb, uint32_t flppb, uint32_t fl_amend, | ||
|  |     uint32_t pb_hdr_crc_len, | ||
|  |     uint32_t hw_retry_cnt, uint32_t list_start, uint32_t list_end, | ||
|  |     tx_mpdu_end *mpdu_end, tx_pb_start *pb_start, \ | ||
|  |     tx_mpdu_start *next, uint32_t pb_buf_reuse, \ | ||
|  |     uint32_t sw_buf_offset, uint32_t is_msdu, uint32_t avln_idx_in_desc,\ | ||
|  |     uint32_t key_table_idx_in_desc, uint32_t key_idx_in_desc, | ||
|  |     uint32_t tx_desc_reuse | ||
|  | ); | ||
|  | 
 | ||
|  | uint32_t mac_tx_mpdu_fill_phyinfo(tx_mpdu_start *mpdu_start, \ | ||
|  |     uint32_t tx_port, uint32_t tx_power, phase_t phase, | ||
|  |     uint32_t hw_band_id, uint32_t ppdu_mode, | ||
|  |     uint32_t tx_tone_amp_table_idx, | ||
|  |     uint32_t pb_mod, uint32_t rate_mode | ||
|  | ); | ||
|  | 
 | ||
|  | uint32_t mac_tx_mpdu_fill_fcinfo(tx_mpdu_start *mpdu_start,\ | ||
|  |     uint32_t proto, uint32_t pb_num, phase_t phase_in_fc,\ | ||
|  |     uint32_t delimter, uint32_t network, uint32_t nid, uint32_t bcn_period_cnt,\ | ||
|  |     uint32_t tmi, uint32_t ext_tmi, tei_t dtei, tei_t stei,\ | ||
|  |     lid_t lid, uint32_t bcast,uint32_t retry_in_fc, uint8_t need_encry,\ | ||
|  |     uint32_t key_table_idx_in_desc, uint32_t key_idx_in_desc,\ | ||
|  |     uint8_t *fc_rawdata | ||
|  | ); | ||
|  | 
 | ||
|  | void mac_get_nncco_sw_info_from_fc(void *fc, nncco_fc_info_t *nn_fc_info); | ||
|  | 
 | ||
|  | uint32_t mac_fill_nncco_variable_fcinfo(uint32_t proto, void *fc_p, | ||
|  |              nncco_fc_info_t *nn_fc_info); | ||
|  | 
 | ||
|  | void mac_tx_mpdu_fill_pb_start(tx_pb_start *pb, \ | ||
|  |     tx_pb_start *next, void *buf_addr, uint32_t pb_seq, \ | ||
|  |     uint32_t msdu_start, uint32_t msdu_end, uint32_t proto | ||
|  | ); | ||
|  | 
 | ||
|  | uint32_t mac_tx_mpdu_form_pb_list(tx_pb_start **pb_list, \ | ||
|  |     iot_pkt_t *pkt_buf, uint32_t pb_num_per_mpdu, \ | ||
|  |     uint32_t bitmap, uint32_t pb_sz, uint32_t proto | ||
|  | ); | ||
|  | 
 | ||
|  | 
 | ||
|  | uint32_t mac_tx_flush_all_tdma_queue(mac_queue_ctxt_t *tx_ctxt); | ||
|  | 
 | ||
|  | /* flush queue according to specifc type */ | ||
|  | uint32_t mac_tx_flush_all_queue(mac_queue_ctxt_t *tx_ctxt, \ | ||
|  |     uint32_t is_all_csma, uint32_t is_all_tdma); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_handle_timeout_tx_abort    handle phy tx abort is electrical level. | ||
|  |  *@return                               [none.] | ||
|  | */ | ||
|  | void mac_handle_timeout_tx_abort(); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_check_timeout_tx_abort     trigger phy_tx_abort dsr. | ||
|  |  *@return                               [none.] | ||
|  | */ | ||
|  | void mac_check_timeout_tx_abort(); | ||
|  | 
 | ||
|  | void mac_tx_mpdu_fill_total_len(tx_mpdu_start *mpdu, uint32_t len); | ||
|  | 
 | ||
|  | void mac_tx_mpdu_fill_proto(tx_mpdu_start *mpdu, uint32_t proto); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  *@brief mac send sound | ||
|  |  */ | ||
|  | uint32_t mac_send_sound(pdevid_t pdev_id, \ | ||
|  |     uint32_t proto, \ | ||
|  |     uint32_t nid, /* if gp, fill in snid */\ | ||
|  |     uint32_t dtei, \ | ||
|  |     uint32_t stei, \ | ||
|  |     lid_t lid, \ | ||
|  |     phase_t phase, \ | ||
|  |     uint32_t tmi, \ | ||
|  |     uint32_t rc | ||
|  | ); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * mac_crc_set_fc_swcrc() - calculate MPDU fccs and filling | ||
|  |  * @proto:      mpdu data protocol, for example | ||
|  |  *                  PLC_PROTO_TYPE_SG 0 | ||
|  |  *                  PLC_PROTO_TYPE_GP 1 | ||
|  |  *                  PLC_PROTO_TYPE_AV 2 | ||
|  |  *                  PLC_PROTO_TYPE_SPG 3 | ||
|  |  * @mpdu:       tx mpdu start description point | ||
|  |  * | ||
|  |  * return:      error num, reference iot_errno.h | ||
|  |  */ | ||
|  | uint8_t mac_crc_set_fc_swcrc(uint32_t proto, tx_mpdu_start *mpdu); | ||
|  | 
 | ||
|  | /*
 | ||
|  |  * mac_crc_set_fc_swcrc() - calculate PB crc and filling | ||
|  |  * @proto:      mpdu data protocol, eg. | ||
|  |  *                  PLC_PROTO_TYPE_SG 0 | ||
|  |  *                  PLC_PROTO_TYPE_GP 1 | ||
|  |  *                  PLC_PROTO_TYPE_AV 2 | ||
|  |  *                  PLC_PROTO_TYPE_SPG 3 | ||
|  |  * @pb_st:      tx pb start description point | ||
|  |  * @delimite:   delimite type, | ||
|  |  * @pb_sz:      pb size(eg. 72/136/264/520...) | ||
|  |  * | ||
|  |  * return:      error num, reference iot_errno.h | ||
|  |  */ | ||
|  | uint8_t mac_crc_set_pb_swcrc(uint32_t proto, tx_pb_start *pb_st, | ||
|  |     uint8_t delimite, uint32_t pb_sz); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_cal_ucast_hw_sw_retry_cnt   cal ucast hw sw retry cnt. | ||
|  |  *@param pdev                            [pointer to pdev] | ||
|  |  *@param first_try_done_flag             [is first time tx msdu] | ||
|  |  *@param cur_retry_cnt                   [current retry cnt] | ||
|  |  *@param dft_hw_retry_cnt                [default hw retry cnt] | ||
|  |  *@param pb_num                          [current msdu tx pb num] | ||
|  |  *@param *hw_retry_cnt                   [hw retry cnt] | ||
|  |  *@param *sw_retry_cnt                   [sw retry cnt] | ||
|  |  *@exception                             [none.] | ||
|  |  *@return                                [0] | ||
|  | */ | ||
|  | uint32_t mac_cal_ucast_hw_sw_retry_cnt(mac_pdev_t *pdev, | ||
|  |     uint32_t first_try_done_flag, uint32_t cur_retry_cnt, | ||
|  |     uint32_t dft_hw_retry_cnt, uint32_t pb_num, uint32_t *hw_retry_cnt, | ||
|  |     uint32_t *sw_retry_cnt); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_cal_fd_and_preamble_time    calculation the additional time for | ||
|  |                                          different platform/chip version | ||
|  |  *@param bandid                          cur bandid | ||
|  |  *@param tmi                             cur tmi | ||
|  |  *@exception                             [none.] | ||
|  |  *@return                                [0] | ||
|  | */ | ||
|  | uint32_t mac_cal_fd_and_preamble_time(uint32_t bandid, uint32_t tmi); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_tx_cal_fl                   calculation mpdu tx time | ||
|  |  * | ||
|  |  *@param is_bcast                        indicate this mpdu is broadcast or | ||
|  |  *                                       unicast. | ||
|  |  *                                       0: unicast, others: broadcast | ||
|  |  *@param rate_id                         phy tx rate mode id. | ||
|  |  *                                       0: SR, 1:QR, 2:XR, 3: FSK | ||
|  |  *@param proto_band_id                   phy tx protocol band id | ||
|  |  *@param tmi                             tx tmi | ||
|  |  *@param extmi                           tx extmi | ||
|  |  *@param pb_num                          pb number in this mpdu | ||
|  |  * | ||
|  |  *@return                                mpdu tx time. unit:ms | ||
|  | */ | ||
|  | uint16_t mac_tx_cal_fl(uint8_t is_bcast, uint8_t rate_id, | ||
|  |     uint32_t proto_band_id, uint32_t tmi, uint32_t extmi, uint32_t pb_num); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_tx_get_slot_guard          get hw cmd slot guard time. | ||
|  |  * | ||
|  |  *@param proto                          protocol type. | ||
|  |  *@param delimiter                      delimiter type. see FC_DELIM_TYPE. | ||
|  |  * | ||
|  |  *@return                               cmd slot guard time. unit: us | ||
|  | */ | ||
|  | uint32_t mac_tx_get_slot_guard(uint8_t proto, uint8_t delimiter); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_tx_fill_extsackinfo         mac fill ext sack info. | ||
|  |  *@param proto                           [protocal] | ||
|  |  *@param fc                              [fc] | ||
|  |  *@param delimiter                       [delimiter type] | ||
|  |  *@param nid                             [nid] | ||
|  |  *@param ext_type                        [ext type] | ||
|  |  *@param addr                            [mac addr] | ||
|  |  *@param stei                            [stei] | ||
|  |  *@param sn                              [sn] | ||
|  |  *@exception                             [none.] | ||
|  |  *@return                                [none] | ||
|  | */ | ||
|  | void mac_tx_fill_extsackinfo(uint32_t proto, void *fc, uint32_t delimiter, \ | ||
|  |     uint32_t nid, uint32_t ext_type, uint8_t *addr, uint16_t stei, uint8_t sn); | ||
|  | 
 | ||
|  | /**
 | ||
|  |  *@brief mac_tx_set_mpdu_ppm             set current mpdu tx ppm | ||
|  |  *@param mpdu_start                      [mpdu start desc] | ||
|  |  *@param proto                           [protocal type] | ||
|  |  *@param delimiter                       [delimiter type] | ||
|  |  *@param param                           [set ppm parameter] | ||
|  |  *@param is_fixed_ppm                    [fixed ppm or scan ppm mode] | ||
|  |  *@return                                [none] | ||
|  | */ | ||
|  | void mac_tx_set_mpdu_ppm(tx_mpdu_start *mpdu_start, uint32_t proto, | ||
|  |     uint32_t delimter, uint8_t param, uint8_t is_fixed_ppm); | ||
|  | 
 | ||
|  | /*
 | ||
|  | * @breif  mac_tx_flush_bcsma_pending_queue()  check bcsma is pending and handle | ||
|  | * @param  tx_ctxt                       the pointer of the hwq_ctxt | ||
|  | * @return uint32_t                      1 -> do not flush hwq. | ||
|  | *                                       0 -> already flush hwq; | ||
|  | */ | ||
|  | uint32_t mac_tx_flush_bcsma_pending_queue(mac_queue_ctxt_t *tx_ctxt); | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif // !MAC_TX_HW_H
 |