1286 lines
		
	
	
		
			42 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			1286 lines
		
	
	
		
			42 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "chip_reg_base.h"
							 | 
						||
| 
								 | 
							
								#include "hw_reg_api.h"
							 | 
						||
| 
								 | 
							
								#include "hw_tonemask.h"
							 | 
						||
| 
								 | 
							
								#include "tx_mpdu_start.h"
							 | 
						||
| 
								 | 
							
								#include "tx_mpdu_end.h"
							 | 
						||
| 
								 | 
							
								#include "tx_pb_start.h"
							 | 
						||
| 
								 | 
							
								#include "plc_utils.h"
							 | 
						||
| 
								 | 
							
								#include "mac_reset.h"
							 | 
						||
| 
								 | 
							
								#include "mac_hwq_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_sys_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rx_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_tmr_reg.h"
							 | 
						||
| 
								 | 
							
								#include "ada_reg.h"
							 | 
						||
| 
								 | 
							
								#include "hw_phy_init.h"
							 | 
						||
| 
								 | 
							
								#include "phy_ana.h"
							 | 
						||
| 
								 | 
							
								#include "phy_reg.h"
							 | 
						||
| 
								 | 
							
								#include "phy_bb.h"
							 | 
						||
| 
								 | 
							
								#include "mpdu_frame.h"
							 | 
						||
| 
								 | 
							
								#include "ahb.h"
							 | 
						||
| 
								 | 
							
								#include "iot_irq.h"
							 | 
						||
| 
								 | 
							
								//#include "iot_mem.h"
							 | 
						||
| 
								 | 
							
								#include "mac_tx_main.h"
							 | 
						||
| 
								 | 
							
								#include "intc_reg.h"
							 | 
						||
| 
								 | 
							
								#include "apb_glb_reg.h"
							 | 
						||
| 
								 | 
							
								#include "command_list.h"
							 | 
						||
| 
								 | 
							
								#include "dbg_io.h"
							 | 
						||
| 
								 | 
							
								#include "iot_config.h"
							 | 
						||
| 
								 | 
							
								#include "iot_io.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "mac_hwq_mgr.h"
							 | 
						||
| 
								 | 
							
								#include "iot_pkt_api.h"
							 | 
						||
| 
								 | 
							
								#include "mac_desc_engine.h"
							 | 
						||
| 
								 | 
							
								#include "mac_tx_hw.h"
							 | 
						||
| 
								 | 
							
								#include "mac_rx_hw.h"
							 | 
						||
| 
								 | 
							
								#include "os_utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "phy_rxtd_reg.h"
							 | 
						||
| 
								 | 
							
								#include "mac_crc.h"
							 | 
						||
| 
								 | 
							
								#include "mpdu_header.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "mac_avln.h"
							 | 
						||
| 
								 | 
							
								#include "mac_key_hw.h"
							 | 
						||
| 
								 | 
							
								#include "mac_key.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* if mem fun is not ready, use global heap */
							 | 
						||
| 
								 | 
							
								tx_mpdu_start mpdu_start;
							 | 
						||
| 
								 | 
							
								tx_mpdu_end mpdu_end;
							 | 
						||
| 
								 | 
							
								tx_pb_start pb_start,pb_second,pb_third,pb_last;
							 | 
						||
| 
								 | 
							
								uint8_t pb_buf[MAC_PB_SIZE_MAX] = { 0 };
							 | 
						||
| 
								 | 
							
								uint8_t pb_buf_second[MAC_PB_SIZE_MAX] = { 0 };
							 | 
						||
| 
								 | 
							
								uint8_t pb_buf_third[MAC_PB_SIZE_MAX] = { 0 };
							 | 
						||
| 
								 | 
							
								uint8_t pb_buf_last[MAC_PB_SIZE_MAX] = { 0 };
							 | 
						||
| 
								 | 
							
								/* mac tx beacon test - with 7000 GP protocol */
							 | 
						||
| 
								 | 
							
								#if EDA_SIMU_SUPPORT == 1
							 | 
						||
| 
								 | 
							
								uint32_t bcn_period_ms = 6;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								uint32_t bcn_period_ms = 20 << 1;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								iot_mac_intr_info_t mac_info;
							 | 
						||
| 
								 | 
							
								volatile bool_t mac_beacon_alert_flag = false;
							 | 
						||
| 
								 | 
							
								volatile bool_t mac_tx_complete_flag = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* tx cfg */
							 | 
						||
| 
								 | 
							
								iot_tx_cfg_info_t glb_cfg = {PLC_PROTO_TYPE_SG,FC_DELIM_SOF,MAC_TX_TEST_ID, \
							 | 
						||
| 
								 | 
							
								                            MAC_TMI_ID,MAC_PB_NUM_ID,IOT_PLC_PHY_BAND_DFT, \
							 | 
						||
| 
								 | 
							
								                            IOT_RATE_MODE_TX};
							 | 
						||
| 
								 | 
							
								uint32_t print_tx_period_ms=4000;
							 | 
						||
| 
								 | 
							
								//mac_msdu_t *g_msdu[MAX_MAC_TXQ_NUM] = {NULL};
							 | 
						||
| 
								 | 
							
								uint8_t delay_time = 0;
							 | 
						||
| 
								 | 
							
								uint32_t enq_time = 0;
							 | 
						||
| 
								 | 
							
								uint8_t send_tput_flag =0;
							 | 
						||
| 
								 | 
							
								uint8_t mac_ping_enable = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mac_encry_mode_init_test(uint8_t vlan_num, \
							 | 
						||
| 
								 | 
							
								    uint8_t key_tbl_num, uint8_t key_num)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint8_t vlan_idx, key_tbl_idx, key_idx;
							 | 
						||
| 
								 | 
							
								    mac_avln_t *avln_ptr;
							 | 
						||
| 
								 | 
							
								    mac_key_table_t *key_tbl;
							 | 
						||
| 
								 | 
							
								    mac_key_entry *key;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_avln_ctxt_init(vlan_num);
							 | 
						||
| 
								 | 
							
								    for(vlan_idx = 0; vlan_idx < vlan_num; vlan_idx++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        mac_avln_init(vlan_idx, key_tbl_num);
							 | 
						||
| 
								 | 
							
								        avln_ptr = (g_mac_avln_ctxt.mac_avln_array + vlan_idx);
							 | 
						||
| 
								 | 
							
								        for(key_tbl_idx = 0; key_tbl_idx < key_tbl_num; key_tbl_idx++)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            key_tbl = (avln_ptr->key_tbl + key_tbl_idx);
							 | 
						||
| 
								 | 
							
								            mac_key_tbl_init(key_tbl, key_num);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for(vlan_idx = 0; vlan_idx < vlan_num; vlan_idx++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        avln_ptr = (g_mac_avln_ctxt.mac_avln_array + vlan_idx);
							 | 
						||
| 
								 | 
							
								        for(key_tbl_idx = 0; key_tbl_idx < key_tbl_num; key_tbl_idx++)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            key_tbl = (avln_ptr->key_tbl + key_tbl_idx);
							 | 
						||
| 
								 | 
							
								            for(key_idx = 0; key_idx < key_num; key_idx++)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                key = (key_tbl->key_array + key_idx);
							 | 
						||
| 
								 | 
							
								                mac_key_set(key, 0, vlan_idx, key_tbl_idx, key_idx);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    key = g_mac_avln_ctxt.mac_avln_array->key_tbl->key_array;
							 | 
						||
| 
								 | 
							
								    mac_key_set(key, 0x12345678, 0x23456789, 0x3456789a, 0x456789ab);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for(vlan_idx = 0; vlan_idx < vlan_num; vlan_idx++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        avln_ptr = (g_mac_avln_ctxt.mac_avln_array + vlan_idx);
							 | 
						||
| 
								 | 
							
								        mac_key_hw_set_avln_key_tlb(vlan_idx, avln_ptr);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for(vlan_idx = 0; vlan_idx < vlan_num; vlan_idx++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        mac_key_hw_set_avln_nid(vlan_idx, 0x1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void ftm_msdu_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								    uint8_t i;
							 | 
						||
| 
								 | 
							
								    for(i=0; i<MAX_MAC_TXQ_NUM; i++)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        g_msdu[i] = \
							 | 
						||
| 
								 | 
							
								            os_mem_malloc(IOT_FTM_MID,sizeof(mac_msdu_t));
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(g_msdu[i]);
							 | 
						||
| 
								 | 
							
								        mac_msdu_init(g_msdu[i], 1, NULL, NULL);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    return;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//TODO:fill mac msdu header for test
							 | 
						||
| 
								 | 
							
								bool_t mac_fill_msdu_frame(uint32_t proto, iot_pkt_t *buf, uint16_t data_len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint16_t msdu_len = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(buf);
							 | 
						||
| 
								 | 
							
								    //TODO: no mac addr case
							 | 
						||
| 
								 | 
							
								    switch (proto)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								#if SUPPORT_SMART_GRID
							 | 
						||
| 
								 | 
							
								    case PLC_PROTO_TYPE_SG:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (iot_pkt_data_len(buf) < (data_len + SG_MAC_MSDU_CRC_LEN))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        mac_header_t *sg_mac = (mac_header_t *)iot_pkt_data(buf);
							 | 
						||
| 
								 | 
							
								        msdu_len = data_len - MAC_HDR_LEN_NO_ADDR;
							 | 
						||
| 
								 | 
							
								        if (sg_mac->msdu_len != msdu_len)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iot_printf("warning: msdu len not match,fix from %d to %d\r\n", \
							 | 
						||
| 
								 | 
							
								                sg_mac->msdu_len, msdu_len);
							 | 
						||
| 
								 | 
							
								            sg_mac->msdu_len = msdu_len;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if SUPPORT_SOUTHERN_POWER_GRID
							 | 
						||
| 
								 | 
							
								    case PLC_PROTO_TYPE_SPG:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if (iot_pkt_data_len(buf) < (data_len + SPG_MAC_MSDU_CRC_LEN))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        spg_mac_header_t *spg_mac = (spg_mac_header_t *)iot_pkt_data(buf);
							 | 
						||
| 
								 | 
							
								        msdu_len = data_len - sizeof(*spg_mac);
							 | 
						||
| 
								 | 
							
								        if (spg_mac->msdu_len != msdu_len)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iot_printf("warning: msdu len not match,fix from %d to %d\r\n", \
							 | 
						||
| 
								 | 
							
								                spg_mac->msdu_len, msdu_len);
							 | 
						||
| 
								 | 
							
								            spg_mac->msdu_len = msdu_len;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if SUPPORT_GREEN_PHY
							 | 
						||
| 
								 | 
							
								        case PLC_PROTO_TYPE_GP:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (iot_pkt_data_len(buf) < (data_len + GP_MAC_MSDU_CRC_LEN))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            gp_mac_header_t *gp_mac = (gp_mac_header_t *)iot_pkt_data(buf);
							 | 
						||
| 
								 | 
							
								            msdu_len = data_len - sizeof(*gp_mac);
							 | 
						||
| 
								 | 
							
								            if (gp_mac->mfl != msdu_len)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                iot_printf("warning: msdu len not match,fix from %d to %d\r\n", \
							 | 
						||
| 
								 | 
							
								                    gp_mac->mfl, msdu_len);
							 | 
						||
| 
								 | 
							
								                gp_mac->mfl = msdu_len;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return true;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								iot_pkt_t *ftm_fill_mac_data(uint8_t delimier_type,\
							 | 
						||
| 
								 | 
							
								    uint16_t buf_len, uint8_t *pkt, uint16_t pkt_len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *buf;
							 | 
						||
| 
								 | 
							
								    IOT_PKT_GET(buf, buf_len, HEAD_SIEZ_64, PLC_MAC_TX_MID);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(buf && ((pkt_len + HEAD_SIEZ_64) <= buf_len));
							 | 
						||
| 
								 | 
							
								    uint8_t *tmp = iot_pkt_put(buf, buf_len-HEAD_SIEZ_64);
							 | 
						||
| 
								 | 
							
								    switch (delimier_type){
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_BEACON:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(pkt);
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(tmp, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								        os_mem_set((tmp+pkt_len), 0, buf_len-pkt_len-HEAD_SIEZ_64);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_SOF:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(pkt);
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(tmp, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								        os_mem_set((tmp+pkt_len), 0, buf_len-pkt_len-HEAD_SIEZ_64);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_NNCCO:
							 | 
						||
| 
								 | 
							
								        (void)pkt;
							 | 
						||
| 
								 | 
							
								        (void)pkt_len;
							 | 
						||
| 
								 | 
							
								        os_mem_set(tmp, 0x55, buf_len);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_SOUND:
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(pkt);
							 | 
						||
| 
								 | 
							
								        os_mem_cpy(tmp, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								        os_mem_set((tmp+pkt_len), 0, buf_len-pkt_len-HEAD_SIEZ_64);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        iot_printf("other frame\n");
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return buf;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mpdu_tx_beacon_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t bcast, uint8_t delimiter_type, uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei, uint8_t tmi, uint8_t ext_tmi,\
							 | 
						||
| 
								 | 
							
								       uint8_t lid, uint8_t need_encry, tx_mpdu_end *mpdu_end,\
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    tx_pb_start *pb;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_sz;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t pb_hdr_resv_crc_len;
							 | 
						||
| 
								 | 
							
								    uint32_t network = (PLC_PROTO_TYPE_SPG == proto)? 1:0;
							 | 
						||
| 
								 | 
							
								    uint8_t ppdu_mode = (PLC_PROTO_TYPE_GP == proto)? \
							 | 
						||
| 
								 | 
							
								        HW_DESC_PPDU_MODE_AVONLY_1FCSYM:0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_PB_START_POOL, (void**)&pb);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu && pb);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *test_data = \
							 | 
						||
| 
								 | 
							
								        ftm_fill_mac_data(delimiter_type, MIN_DATA_SIZE, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_get_pb_size(proto, tmi, ext_tmi, &pb_sz);
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_crc_set_bcn_swcrc(proto,iot_pkt_data(test_data), pb_sz);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_pb_start(pb, NULL, iot_pkt_data(test_data), 0, 1, 1, proto);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_pb_swcrc(proto, pb, FC_DELIM_BEACON, pb_sz);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get pb header + crc length */
							 | 
						||
| 
								 | 
							
								    pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(FC_DELIM_BEACON,
							 | 
						||
| 
								 | 
							
								                                        proto);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, 1, need_encry, 0,
							 | 
						||
| 
								 | 
							
								            phy_get_sym_per_pb(proto, 0, tmi, ext_tmi,
							 | 
						||
| 
								 | 
							
								            phy_get_pss_id(proto, tmi, ext_tmi)),
							 | 
						||
| 
								 | 
							
								            phy_get_fl_per_pb(proto, 0, tmi, ext_tmi), 0,
							 | 
						||
| 
								 | 
							
								            pb_hdr_resv_crc_len, 0, 1, 1, mpdu_end, pb, NULL, 0,
							 | 
						||
| 
								 | 
							
								            (uint32_t)(iot_pkt_data(test_data) - (uint8_t*)test_data),
							 | 
						||
| 
								 | 
							
								            0, 0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, ppdu_mode, 0, pb_mod, rate_mode);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        1, HW_DESC_TX_PHASE_ALL, delimiter_type, network, nid, 0, \
							 | 
						||
| 
								 | 
							
								        tmi, ext_tmi, dtei, stei, lid, bcast, 0, 0, 0, 0, NULL);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        /* get tx fc message */
							 | 
						||
| 
								 | 
							
								        tx_fc_msg_t msg = {0};
							 | 
						||
| 
								 | 
							
								        mac_get_tx_msg_from_fc(proto, delimiter_type, &mpdu->fc, &msg);
							 | 
						||
| 
								 | 
							
								        iot_printf("proto = %d,""hwq = %d,"\
							 | 
						||
| 
								 | 
							
								                   "beacon tx:tmi = %d,"\
							 | 
						||
| 
								 | 
							
								                   "pb_num = %d\n", \
							 | 
						||
| 
								 | 
							
								                   proto, qid, msg.tmi, 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mpdu_tx_sof_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t bcast, uint8_t delimiter_type,uint32_t nid, uint32_t dtei,\
							 | 
						||
| 
								 | 
							
								       uint32_t stei,uint8_t tmi, uint8_t ext_tmi, uint8_t lid,\
							 | 
						||
| 
								 | 
							
								       uint8_t pb_num,uint8_t need_ack, uint8_t need_encry,\
							 | 
						||
| 
								 | 
							
								       uint8_t need_decrypt, uint32_t avln_idx_in_desc,\
							 | 
						||
| 
								 | 
							
								       uint32_t key_table_idx_in_desc, uint32_t key_idx_in_desc,\
							 | 
						||
| 
								 | 
							
								       uint8_t hw_retry_cnt, tx_mpdu_end *mpdu_end,\
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    tx_pb_start *pb;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_sz;
							 | 
						||
| 
								 | 
							
								    uint32_t bitmap;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t network = (PLC_PROTO_TYPE_SPG == proto)? 1:0;
							 | 
						||
| 
								 | 
							
								    uint8_t ppdu_mode = (PLC_PROTO_TYPE_GP == proto)? \
							 | 
						||
| 
								 | 
							
								        HW_DESC_PPDU_MODE_AVONLY_1FCSYM:0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *test_data = \
							 | 
						||
| 
								 | 
							
								        ftm_fill_mac_data(delimiter_type, MAX_DATA_SIZE, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_get_pb_size(proto, tmi,ext_tmi,&pb_sz);
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    bitmap = 0xffffffff >> (32 - pb_num);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_fill_msdu_frame(proto, test_data, pkt_len);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_msdu_swcrc(proto, test_data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_form_pb_list(&pb, test_data, pb_num, bitmap, pb_sz, proto);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get header + crc length */
							 | 
						||
| 
								 | 
							
								    uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, \
							 | 
						||
| 
								 | 
							
								                                        proto);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, pb_num, need_encry, need_ack,\
							 | 
						||
| 
								 | 
							
								        phy_get_sym_per_pb(proto, 0, tmi, ext_tmi,
							 | 
						||
| 
								 | 
							
								        phy_get_pss_id(proto, tmi, ext_tmi)),\
							 | 
						||
| 
								 | 
							
								        phy_get_fl_per_pb(proto, 0, tmi, ext_tmi), 0,\
							 | 
						||
| 
								 | 
							
								        pb_hdr_resv_crc_len, hw_retry_cnt, 1, 1, mpdu_end, pb, NULL, 0, \
							 | 
						||
| 
								 | 
							
								        (uint32_t)(iot_pkt_data(test_data) - (uint8_t*)test_data), 0, \
							 | 
						||
| 
								 | 
							
								        avln_idx_in_desc, key_table_idx_in_desc, key_idx_in_desc, 0);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, ppdu_mode, 0, pb_mod, rate_mode);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        pb_num, HW_DESC_TX_PHASE_ALL, delimiter_type, network, nid, 0,\
							 | 
						||
| 
								 | 
							
								        tmi, ext_tmi, dtei, stei, lid, bcast, 0,need_encry,\
							 | 
						||
| 
								 | 
							
								        key_table_idx_in_desc ,key_idx_in_desc, NULL);
							 | 
						||
| 
								 | 
							
								    if(!need_decrypt)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        switch (proto) {
							 | 
						||
| 
								 | 
							
								        case PLC_PROTO_TYPE_SG:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            frame_control_t *fc = \
							 | 
						||
| 
								 | 
							
								                (frame_control_t *)&mpdu->fc.sg_fc;
							 | 
						||
| 
								 | 
							
								            fc->vf.sof.decrypt_mode = 0;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case PLC_PROTO_TYPE_SPG:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            spg_frame_control_t *fc = \
							 | 
						||
| 
								 | 
							
								                (spg_frame_control_t *)&mpdu->fc.spg_fc;
							 | 
						||
| 
								 | 
							
								            fc->vf.sof.decrypt_mode = 0;
							 | 
						||
| 
								 | 
							
								            break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        default:
							 | 
						||
| 
								 | 
							
								            IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								    if(!send_tput_flag)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tx_fc_msg_t msg = {0};
							 | 
						||
| 
								 | 
							
								        mac_get_tx_msg_from_fc(proto, delimiter_type, &mpdu->fc, &msg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iot_printf("proto = %d," \
							 | 
						||
| 
								 | 
							
								                       "hwq = %d," \
							 | 
						||
| 
								 | 
							
								                       "sof tx:tmi = %d," \
							 | 
						||
| 
								 | 
							
								                       "sof tx:ext_tmi = %d," \
							 | 
						||
| 
								 | 
							
								                       "pb_num = %d\n", \
							 | 
						||
| 
								 | 
							
								                       proto, qid, msg.tmi, msg.ext_tmi, pb_num);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								void gp_mpdu_tx_rtscts_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt,\
							 | 
						||
| 
								 | 
							
								       uint8_t qid, uint8_t delimiter_type,uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t tmi, uint8_t lid,\
							 | 
						||
| 
								 | 
							
								       uint8_t pb_num, uint8_t need_encry,\
							 | 
						||
| 
								 | 
							
								       uint8_t hw_retry_cnt, tx_mpdu_end *mpdu_end,\
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    //tx_pb_start *pb;
							 | 
						||
| 
								 | 
							
								    //uint32_t pb_sz;
							 | 
						||
| 
								 | 
							
								    //uint32_t bitmap;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t network = (PLC_PROTO_TYPE_SPG == proto)? 1:0;
							 | 
						||
| 
								 | 
							
								    uint8_t ppdu_mode = (PLC_PROTO_TYPE_GP == proto)? \
							 | 
						||
| 
								 | 
							
								        HW_DESC_PPDU_MODE_AVONLY_1FCSYM:0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *test_data = \
							 | 
						||
| 
								 | 
							
								        ftm_fill_mac_data(delimiter_type, MID_DATA_SIZE, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //phy_get_pb_size(proto, tmi,0,&pb_sz);
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(proto, tmi, 0, &pb_mod);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //bitmap = 0xffffffff >> (32 - pb_num);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_fill_msdu_frame(proto, test_data, pkt_len);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_msdu_swcrc(proto, test_data);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //mac_tx_mpdu_form_pb_list(&pb, test_data, pb_num, bitmap, pb_sz, proto);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* get header + crc length */
							 | 
						||
| 
								 | 
							
								    uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, \
							 | 
						||
| 
								 | 
							
								                                        proto);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, pb_num, need_encry, 0,\
							 | 
						||
| 
								 | 
							
								        phy_get_sym_per_pb(proto, 0, tmi, 0,
							 | 
						||
| 
								 | 
							
								        phy_get_pss_id(proto, tmi, ext_tmi)), \
							 | 
						||
| 
								 | 
							
								        phy_get_fl_per_pb(proto, 0, tmi, 0), 0,\
							 | 
						||
| 
								 | 
							
								        pb_hdr_resv_crc_len, hw_retry_cnt, 1, 1, mpdu_end, NULL, NULL, 0, \
							 | 
						||
| 
								 | 
							
								        (uint32_t)(iot_pkt_data(test_data) - (uint8_t*)test_data), 0, 0, 0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* For RTS-CTS only */
							 | 
						||
| 
								 | 
							
								    mpdu->pb_num = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, ppdu_mode, 0, pb_mod, rate_mode);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        pb_num, HW_DESC_TX_PHASE_ALL, delimiter_type, network, nid, 0, \
							 | 
						||
| 
								 | 
							
								        tmi, 0, dtei, stei, lid, 0, 0, 0, 0, 0, NULL);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								    if(!send_tput_flag)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tx_fc_msg_t msg = {0};
							 | 
						||
| 
								 | 
							
								        mac_get_tx_msg_from_fc(proto, delimiter_type, &mpdu->fc, &msg);
							 | 
						||
| 
								 | 
							
								        iot_printf("GP:proto = %d," \
							 | 
						||
| 
								 | 
							
								                   "hwq = %d," \
							 | 
						||
| 
								 | 
							
								                   "sof tx:tmi = %d," \
							 | 
						||
| 
								 | 
							
								                   "pb_num = %d\n", \
							 | 
						||
| 
								 | 
							
								                   proto, qid, msg.tmi, pb_num);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mpdu_tx_nncco_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t bcast, uint8_t delimiter_type,uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t lid,uint8_t need_encry,\
							 | 
						||
| 
								 | 
							
								       tx_mpdu_end *mpdu_end)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    uint32_t network = (PLC_PROTO_TYPE_SPG == proto)? 1:0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, 0, 0,0,\
							 | 
						||
| 
								 | 
							
								        0, 0, 0, 0, 0, 1, 1, mpdu_end, NULL, NULL, 0, \
							 | 
						||
| 
								 | 
							
								        0, 0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, 0, 0, 1, 0);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        0, HW_DESC_TX_PHASE_ALL, delimiter_type, network, nid, 0, \
							 | 
						||
| 
								 | 
							
								        0, 0, dtei, stei, lid, bcast, 0, 0, 0, 0, NULL);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_printf("hwq = %d nncco tx_done\n",qid);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mpdu_tx_sound_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t bcast, uint8_t delimiter_type,uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t tmi, uint8_t ext_tmi,\
							 | 
						||
| 
								 | 
							
								       uint8_t lid,uint8_t need_ack, uint8_t need_encry,\
							 | 
						||
| 
								 | 
							
								       uint8_t hw_retry_cnt, tx_mpdu_end *mpdu_end,\
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    tx_pb_start *pb;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_sz;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = 0;
							 | 
						||
| 
								 | 
							
								    if(proto == PLC_PROTO_TYPE_SPG)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        iot_printf("NW do not supprot sound!");
							 | 
						||
| 
								 | 
							
								        return;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *test_data = \
							 | 
						||
| 
								 | 
							
								        ftm_fill_mac_data(delimiter_type, MID_DATA_SIZE, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_get_pb_size(proto, tmi, ext_tmi, &pb_sz);
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_PB_START_POOL, (void**)&pb);
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu && pb);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_pb_start(pb, NULL, iot_pkt_data(test_data), 0, 1, 1, proto);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, \
							 | 
						||
| 
								 | 
							
								                                    proto);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, 1, 0, need_ack,\
							 | 
						||
| 
								 | 
							
								        phy_get_sym_per_pb(proto, 0, tmi, ext_tmi,
							 | 
						||
| 
								 | 
							
								        phy_get_pss_id(proto, tmi, ext_tmi)),\
							 | 
						||
| 
								 | 
							
								        phy_get_fl_per_pb(proto, 0, tmi, ext_tmi), 0,\
							 | 
						||
| 
								 | 
							
								        pb_hdr_resv_crc_len, 0, 1, 1, mpdu_end, pb, NULL, 0, \
							 | 
						||
| 
								 | 
							
								        (uint32_t)(iot_pkt_data(test_data) - (uint8_t*)test_data), 0, 0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, 0, 0, pb_mod, rate_mode);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        1, HW_DESC_TX_PHASE_ALL, delimiter_type, 0, nid, 0,\
							 | 
						||
| 
								 | 
							
								        tmi, ext_tmi, dtei, stei, lid, bcast, 0, 0, 0, 0, NULL);
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tx_fc_msg_t msg = {0};
							 | 
						||
| 
								 | 
							
								        mac_get_tx_msg_from_fc(proto, delimiter_type, &mpdu->fc, &msg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            iot_printf("proto = %d," \
							 | 
						||
| 
								 | 
							
								                       "hwq = %d," \
							 | 
						||
| 
								 | 
							
								                       "sof tx:tmi = %d," \
							 | 
						||
| 
								 | 
							
								                       "sof tx:ext_tmi = %d," \
							 | 
						||
| 
								 | 
							
								                       "pb_num = %d\n", \
							 | 
						||
| 
								 | 
							
								                       proto, qid, msg.tmi, msg.ext_tmi, 1);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void gp_mpdu_tx_sound_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t delimiter_type,uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t tmi,\
							 | 
						||
| 
								 | 
							
								       uint8_t lid,uint8_t need_ack, uint8_t need_encry,\
							 | 
						||
| 
								 | 
							
								       uint8_t hw_retry_cnt, tx_mpdu_end *mpdu_end,\
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_start *mpdu;
							 | 
						||
| 
								 | 
							
								    tx_pb_start *pb;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_sz;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t network = (PLC_PROTO_TYPE_SPG == proto)? 1:0;
							 | 
						||
| 
								 | 
							
								    uint8_t ppdu_mode = (PLC_PROTO_TYPE_GP == proto)? \
							 | 
						||
| 
								 | 
							
								        HW_DESC_PPDU_MODE_AVONLY_1FCSYM:0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_pkt_t *test_data = \
							 | 
						||
| 
								 | 
							
								        ftm_fill_mac_data(delimiter_type, MID_DATA_SIZE, pkt, pkt_len);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    phy_get_pb_size(proto, tmi,0,&pb_sz);
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(proto, tmi, 0, &pb_mod);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_PB_START_POOL, (void**)&pb);
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng,PLC_TX_MPDU_START_POOL, (void**)&mpdu);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(mpdu && pb);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_pb_start(pb, NULL, iot_pkt_data(test_data), 0, 1, 1, proto);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, \
							 | 
						||
| 
								 | 
							
								                                    proto);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_macinfo(mpdu, qid, 1, 0, 0,\
							 | 
						||
| 
								 | 
							
								        phy_get_sym_per_pb(proto, 0, tmi, 0,
							 | 
						||
| 
								 | 
							
								        phy_get_pss_id(proto, tmi, ext_tmi)), \
							 | 
						||
| 
								 | 
							
								        phy_get_fl_per_pb(proto, 0, tmi, 0), 0,\
							 | 
						||
| 
								 | 
							
								        pb_hdr_resv_crc_len, 0, 1, 1, mpdu_end, pb, NULL, 0, \
							 | 
						||
| 
								 | 
							
								        (uint32_t)(iot_pkt_data(test_data) - (uint8_t*)test_data), 0, 0, 0, 0, 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
							 | 
						||
| 
								 | 
							
								        128, HW_DESC_TX_PHASE_ALL, 0, ppdu_mode, 0, pb_mod, rate_mode);
							 | 
						||
| 
								 | 
							
								    mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
							 | 
						||
| 
								 | 
							
								        1, HW_DESC_TX_PHASE_ALL, delimiter_type, network, nid, 0,\
							 | 
						||
| 
								 | 
							
								        tmi, 0, dtei, stei, lid, 0, 0, 0, 0, 0, NULL);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_crc_set_fc_swcrc(proto, mpdu);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        tx_fc_msg_t msg = {0};
							 | 
						||
| 
								 | 
							
								        mac_get_tx_msg_from_fc(proto, delimiter_type, &mpdu->fc, &msg);
							 | 
						||
| 
								 | 
							
								        iot_printf("mac_type = %d," \
							 | 
						||
| 
								 | 
							
								                   "hwq = %d," \
							 | 
						||
| 
								 | 
							
								                   "sound tx:tmi = %d," \
							 | 
						||
| 
								 | 
							
								                   "pb_num = %d\n", \
							 | 
						||
| 
								 | 
							
								                   proto, qid, msg.tmi, 1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    /* send */
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mpdu_send_test(mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t bcast, uint8_t delimiter_type,uint32_t nid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t tmi, uint8_t ext_tmi,\
							 | 
						||
| 
								 | 
							
								       uint8_t lid, uint8_t pb_num, uint8_t need_ack,\
							 | 
						||
| 
								 | 
							
								       uint8_t need_encry, uint8_t need_decrypt,\
							 | 
						||
| 
								 | 
							
								       uint32_t avln_idx_in_desc, uint32_t key_table_idx_in_desc,\
							 | 
						||
| 
								 | 
							
								       uint32_t key_idx_in_desc,\
							 | 
						||
| 
								 | 
							
								       uint8_t hw_retry_cnt, uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_end *end;
							 | 
						||
| 
								 | 
							
								    /* mac protocol */
							 | 
						||
| 
								 | 
							
								    uint32_t proto = PHY_PROTO_TYPE_GET();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng, PLC_TX_MPDU_END_POOL, (void**)&end);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(end);
							 | 
						||
| 
								 | 
							
								    end->tx_done = 0;
							 | 
						||
| 
								 | 
							
								    end->tx_ok = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    switch(delimiter_type){
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_BEACON:
							 | 
						||
| 
								 | 
							
								        (void)pb_num;
							 | 
						||
| 
								 | 
							
								        (void)need_ack;
							 | 
						||
| 
								 | 
							
								        (void)need_decrypt;
							 | 
						||
| 
								 | 
							
								        (void)hw_retry_cnt;
							 | 
						||
| 
								 | 
							
								        (void)avln_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_table_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        mpdu_tx_beacon_test(proto,tx_ctxt, qid, bcast, FC_DELIM_BEACON, nid,\
							 | 
						||
| 
								 | 
							
								            dtei,  stei, tmi, ext_tmi,lid, need_encry, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_SOF:
							 | 
						||
| 
								 | 
							
								        mpdu_tx_sof_test(proto, tx_ctxt, qid, bcast, FC_DELIM_SOF, nid,\
							 | 
						||
| 
								 | 
							
								            dtei, stei, tmi, ext_tmi,lid, pb_num, need_ack, need_encry,\
							 | 
						||
| 
								 | 
							
								            need_decrypt, avln_idx_in_desc, key_table_idx_in_desc,\
							 | 
						||
| 
								 | 
							
								            key_idx_in_desc, hw_retry_cnt, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_NNCCO:
							 | 
						||
| 
								 | 
							
								        (void)tmi;
							 | 
						||
| 
								 | 
							
								        (void)ext_tmi;
							 | 
						||
| 
								 | 
							
								        (void)pb_num;
							 | 
						||
| 
								 | 
							
								        (void)need_ack;
							 | 
						||
| 
								 | 
							
								        (void)need_decrypt;
							 | 
						||
| 
								 | 
							
								        (void)hw_retry_cnt;
							 | 
						||
| 
								 | 
							
								        (void)avln_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_table_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)pkt;
							 | 
						||
| 
								 | 
							
								        (void)pkt_len;
							 | 
						||
| 
								 | 
							
								        mpdu_tx_nncco_test(proto, tx_ctxt, qid, bcast, FC_DELIM_NNCCO, nid,\
							 | 
						||
| 
								 | 
							
								               dtei, stei, lid, need_encry, end);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case FC_DELIM_SOUND:
							 | 
						||
| 
								 | 
							
								        (void)pb_num;
							 | 
						||
| 
								 | 
							
								        (void)need_decrypt;
							 | 
						||
| 
								 | 
							
								        (void)avln_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_table_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        (void)key_idx_in_desc;
							 | 
						||
| 
								 | 
							
								        mpdu_tx_sound_test(proto, tx_ctxt, qid, bcast, FC_DELIM_SOUND,nid,\
							 | 
						||
| 
								 | 
							
								        dtei, stei, tmi, ext_tmi,lid, need_ack, need_encry, hw_retry_cnt, end,\
							 | 
						||
| 
								 | 
							
								        pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								    uint32_t enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    uint32_t cur_time, time_span;
							 | 
						||
| 
								 | 
							
								#define NTB_MS_TICK 25000 // 0.04us * 25 = 1us, 1us * 1000 = 1ms
							 | 
						||
| 
								 | 
							
								#define TX_TIMEOUT_TICK (NTB_MS_TICK << 5) // 32 ms
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_rx_ring_ctxt_t *ring_ctxt = &g_mac_pdev[0]->ring_hdl;
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								        time_span = cur_time - enq_time;
							 | 
						||
| 
								 | 
							
								        if (time_span < 0) { // wrap around
							 | 
						||
| 
								 | 
							
								             time_span = (0x100000000LL) - enq_time + cur_time;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        if (time_span > TX_TIMEOUT_TICK) {
							 | 
						||
| 
								 | 
							
								            iot_printf("tx timeout: %dms > %dms\n", \
							 | 
						||
| 
								 | 
							
								                time_span / NTB_MS_TICK, \
							 | 
						||
| 
								 | 
							
								                TX_TIMEOUT_TICK / NTB_MS_TICK);
							 | 
						||
| 
								 | 
							
								            IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        for(uint8_t i=0;i<MAX_PLC_RX_RING_NUM;i++){
							 | 
						||
| 
								 | 
							
								            if(ring_ctxt->ring[i].enabled){
							 | 
						||
| 
								 | 
							
								                mac_rx_hw_mpdu(g_mac_pdev[0], i);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    } while (!end->tx_done);
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu_comp(qid);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* For GP protocol only */
							 | 
						||
| 
								 | 
							
								void gp_mpdu_send_test(mac_queue_ctxt_t *tx_ctxt, uint8_t qid,\
							 | 
						||
| 
								 | 
							
								       uint8_t delimiter_type,uint32_t snid,\
							 | 
						||
| 
								 | 
							
								       uint32_t dtei, uint32_t stei,uint8_t tmi,\
							 | 
						||
| 
								 | 
							
								       uint8_t lid,uint8_t pb_num,\
							 | 
						||
| 
								 | 
							
								       uint8_t need_encry, uint8_t need_ack, uint8_t hw_retry_cnt, \
							 | 
						||
| 
								 | 
							
								       uint16_t pkt_len, uint8_t *pkt)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tx_mpdu_end *end;
							 | 
						||
| 
								 | 
							
								    /* mac protocol */
							 | 
						||
| 
								 | 
							
								    uint32_t proto = PHY_PROTO_TYPE_GET();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng, PLC_TX_MPDU_END_POOL, (void**)&end);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(end);
							 | 
						||
| 
								 | 
							
								    end->tx_done = 0;
							 | 
						||
| 
								 | 
							
								    end->tx_ok = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    switch(delimiter_type){
							 | 
						||
| 
								 | 
							
								    case DT_AV_BEACON:
							 | 
						||
| 
								 | 
							
								        mpdu_tx_beacon_test(proto, tx_ctxt, qid, 0, DT_AV_BEACON, snid,\
							 | 
						||
| 
								 | 
							
								            dtei, stei, tmi, 0, lid, need_encry, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case DT_AV_SOF:
							 | 
						||
| 
								 | 
							
								        mpdu_tx_sof_test(proto, tx_ctxt, qid, 0, DT_AV_SOF, snid,\
							 | 
						||
| 
								 | 
							
								            dtei, stei, tmi, 0, lid, pb_num, need_ack, need_encry,\
							 | 
						||
| 
								 | 
							
								            0, 0, 0, 0, hw_retry_cnt, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case DT_AV_RTS_CTS:
							 | 
						||
| 
								 | 
							
								        gp_mpdu_tx_rtscts_test(proto, tx_ctxt, qid, DT_AV_RTS_CTS, snid,\
							 | 
						||
| 
								 | 
							
								            dtei, stei, tmi, lid, pb_num, need_encry,\
							 | 
						||
| 
								 | 
							
								            0, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case DT_AV_SACK:
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    case DT_AV_SOUND:
							 | 
						||
| 
								 | 
							
								        gp_mpdu_tx_sound_test(proto, tx_ctxt, qid, DT_AV_SOUND, snid,\
							 | 
						||
| 
								 | 
							
								            dtei, stei, tmi, lid, 0, need_encry, 0, end, pkt_len, pkt);
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    default:
							 | 
						||
| 
								 | 
							
								        IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t test_send_sof(mac_queue_ctxt_t *tx_ctxt,
							 | 
						||
| 
								 | 
							
								    uint32_t stei, uint32_t dtei, uint32_t nid,\
							 | 
						||
| 
								 | 
							
								    uint8_t tmi, uint8_t ext_tmi,\
							 | 
						||
| 
								 | 
							
								    uint8_t pb_num, uint8_t *pkt,uint8_t need_ack)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* mac protocol */
							 | 
						||
| 
								 | 
							
								    uint32_t proto = PHY_PROTO_TYPE_GET();
							 | 
						||
| 
								 | 
							
								    tx_mpdu_end *end;
							 | 
						||
| 
								 | 
							
								    mac_desc_get(&g_mac_desc_eng, PLC_TX_MPDU_END_POOL, (void**)&end);
							 | 
						||
| 
								 | 
							
								    IOT_ASSERT(end);
							 | 
						||
| 
								 | 
							
								    end->tx_done = 0;
							 | 
						||
| 
								 | 
							
								    end->tx_ok = 0;
							 | 
						||
| 
								 | 
							
								    uint8_t qid = 0;
							 | 
						||
| 
								 | 
							
								    mpdu_tx_sof_test(proto,tx_ctxt, qid, 0, FC_DELIM_SOF, nid,\
							 | 
						||
| 
								 | 
							
								        dtei, stei, tmi, ext_tmi,0, pb_num, need_ack, 0, 0,\
							 | 
						||
| 
								 | 
							
								        0, 0, 0, 0, end,100, pkt);
							 | 
						||
| 
								 | 
							
								    if(mac_ping_enable)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        mac_rx_hw_mpdu(g_mac_pdev[0], 0);
							 | 
						||
| 
								 | 
							
								    } while (!end->tx_done);
							 | 
						||
| 
								 | 
							
								    mac_tx_hw_mpdu_comp(qid, 1);
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint8_t loop = 0;
							 | 
						||
| 
								 | 
							
								int32_t mac_tx_mpdu_test(void *pdev, tx_mpdu_start *mpdu) {
							 | 
						||
| 
								 | 
							
								    (void)pdev;
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_size = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t tmi = 0, ext_tmi = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t pb_mod = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t rate_mode = glb_cfg.rate_mode;
							 | 
						||
| 
								 | 
							
								    uint32_t* dbg_buf =NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mpdu->desc_type = DESC_TYPE_TX_MPDU_START;
							 | 
						||
| 
								 | 
							
								    mpdu->proto_type = glb_cfg.m_type;
							 | 
						||
| 
								 | 
							
								    mpdu->tx_port = HW_DESC_TX_PORT_PLC;
							 | 
						||
| 
								 | 
							
								    mpdu->tx_phase = HW_DESC_TX_PHASE_ALL;
							 | 
						||
| 
								 | 
							
								    mpdu->tx_power = 128; // 1/8 unit db
							 | 
						||
| 
								 | 
							
								    if((glb_cfg.p_type == DT_AV_SOF)||(glb_cfg.p_type == FC_DELIM_SOF))
							 | 
						||
| 
								 | 
							
								        mpdu->need_ack = 1;
							 | 
						||
| 
								 | 
							
								    mpdu->ppdu_mode = HW_DESC_PPDU_MODE_AVONLY_1FCSYM;
							 | 
						||
| 
								 | 
							
								    mpdu->next = NULL;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* clear the mpdu_end */
							 | 
						||
| 
								 | 
							
								    if (mpdu->tx_status) {
							 | 
						||
| 
								 | 
							
								        mpdu->tx_status->tx_done = 0;
							 | 
						||
| 
								 | 
							
								        mpdu->tx_status->tx_ok = 0;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tmi info */
							 | 
						||
| 
								 | 
							
								    tmi = glb_cfg.tmi;
							 | 
						||
| 
								 | 
							
								    if (tmi >= 15) {
							 | 
						||
| 
								 | 
							
								        /* if use ext_tmi */
							 | 
						||
| 
								 | 
							
								        tmi = 15;
							 | 
						||
| 
								 | 
							
								        ext_tmi = glb_cfg.tmi - 15;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(glb_cfg.m_type == PLC_PROTO_TYPE_SG)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == FC_DELIM_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.delimiter_type = FC_DELIM_BEACON; /*beacon*/
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.time_stamp = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.tmi = tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.sym_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.phase_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.pb_num = glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.bcn.version = 0;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == FC_DELIM_SOF)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.delimiter_type = FC_DELIM_SOF; /*sof*/
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.dst_tei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.lid = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.frame_len = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.pb_num = glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.sym_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.bcast = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.tmi = tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.tmi_ext = ext_tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.version = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // RAW DATA TESTING
							 | 
						||
| 
								 | 
							
								            //mpdu->fc.sg_fc.vf.sof.lid = loop++;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == FC_DELIM_SOUND)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.delimiter_type = FC_DELIM_SOUND; /*sound*/
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.dst_tei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.lid = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.frame_len = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.pb_num = glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.sym_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.bcast = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.tmi = tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.tmi_ext = ext_tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.sg_fc.vf.sof.version = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        mpdu->fc.sg_fc.network_type = 0;
							 | 
						||
| 
								 | 
							
								        // RAW DATA TESTING
							 | 
						||
| 
								 | 
							
								        //mpdu->fc.sg_fc.nid = 0x123456 + (loop++);
							 | 
						||
| 
								 | 
							
								        mpdu->fc.sg_fc.nid = 0x123456;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if (glb_cfg.m_type == PLC_PROTO_TYPE_SPG)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == FC_DELIM_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.delimiter_type = FC_DELIM_BEACON; /*beacon*/
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.time_stamp = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.tmi = tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.sym_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.phase_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.bcn.version = 0;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == FC_DELIM_SOF)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.delimiter_type = FC_DELIM_SOF; /*sof*/
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.dst_tei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.lid = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.frm_len = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.pb_num = glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.sym_num = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.tmi = tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.tmi_ext = ext_tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.spg_fc.vf.sof.version = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        mpdu->fc.spg_fc.access_ind = 1;
							 | 
						||
| 
								 | 
							
								        mpdu->fc.spg_fc.snid = 0xb;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else{
							 | 
						||
| 
								 | 
							
								        /* AV FC */
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == DT_AV_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.delimiter_type = DT_AV_BEACON;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == DT_AV_SOF)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.delimiter_type = DT_AV_SOF;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.dst_tei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.lid = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.eks = 0xf;
							 | 
						||
| 
								 | 
							
								            if(tmi == 0 || tmi == 1)
							 | 
						||
| 
								 | 
							
								                mpdu->fc.hpav_fc.vf_av.sof.pbsz = 0;
							 | 
						||
| 
								 | 
							
								            else if(tmi == 2)
							 | 
						||
| 
								 | 
							
								                mpdu->fc.hpav_fc.vf_av.sof.pbsz = 1;
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                IOT_ASSERT(0);
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.numsym = 3;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.tmi_av = glb_cfg.tmi;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sof.fl_av = 0;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == DT_AV_RTS_CTS)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.delimiter_type = DT_AV_RTS_CTS;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.rtscts.src_tei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.rtscts.dst_tei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.rtscts.lid = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.rtscts.rtsf = 1;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == DT_AV_SOUND)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.delimiter_type = DT_AV_SOUND;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.stei = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.dtei = 2;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.lid = 0;
							 | 
						||
| 
								 | 
							
								            if(tmi == 0 || tmi == 1)
							 | 
						||
| 
								 | 
							
								                mpdu->fc.hpav_fc.vf_av.sound.pbsz = 0;
							 | 
						||
| 
								 | 
							
								            else if(tmi == 2)
							 | 
						||
| 
								 | 
							
								                mpdu->fc.hpav_fc.vf_av.sound.pbsz = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.req_tm = 1;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.fl_av = 0;
							 | 
						||
| 
								 | 
							
								            mpdu->fc.hpav_fc.vf_av.sound.src = 0xFD;//as part of Initial Channel Estimation
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        mpdu->fc.hpav_fc.access = 1;
							 | 
						||
| 
								 | 
							
								        mpdu->fc.hpav_fc.snid = 0xb;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* band info */
							 | 
						||
| 
								 | 
							
								#ifdef IOT_SUPPORT_MULTI_RATE_HW
							 | 
						||
| 
								 | 
							
								    mpdu->sg_bandsel = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR)%3;
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								    mpdu->sg_bandsel = 0;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* only contains the pb's size */
							 | 
						||
| 
								 | 
							
								    phy_get_pb_size(glb_cfg.m_type, tmi, ext_tmi, &pb_size);
							 | 
						||
| 
								 | 
							
								    mpdu->pb_num = glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								    mpdu->total_bytes = pb_size*glb_cfg.pb_num;
							 | 
						||
| 
								 | 
							
								    /* start/end time, ignore in GP's case */
							 | 
						||
| 
								 | 
							
								    //mpdu->start_time = 0;
							 | 
						||
| 
								 | 
							
								    //mpdu->end_time = 0;
							 | 
						||
| 
								 | 
							
								    /* TODO: amplitude table select */
							 | 
						||
| 
								 | 
							
								    mpdu->tx_tone_amp = 0;
							 | 
						||
| 
								 | 
							
								    mpdu->tx_symbnum_ppb =  phy_get_sym_per_pb(glb_cfg.m_type, mpdu->sg_bandsel,
							 | 
						||
| 
								 | 
							
								        tmi, ext_tmi, phy_get_pss_id(glb_cfg.m_type, tmi, ext_tmi));
							 | 
						||
| 
								 | 
							
								    if(mpdu->tx_symbnum_ppb*glb_cfg.pb_num >= 512){
							 | 
						||
| 
								 | 
							
								        iot_printf("[TMI-%d][PB-%d][error]:symbol size %d bigger than 512.", \
							 | 
						||
| 
								 | 
							
								                    ext_tmi+tmi,glb_cfg.pb_num,mpdu->tx_symbnum_ppb*glb_cfg.pb_num);
							 | 
						||
| 
								 | 
							
								        return -1;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    mpdu->sw_tx_fl_ppb = (uint32_t) \
							 | 
						||
| 
								 | 
							
								        phy_get_fl_per_pb(glb_cfg.m_type, mpdu->sg_bandsel, tmi, ext_tmi);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* hw id */
							 | 
						||
| 
								 | 
							
								    mpdu->swq_id = 0;
							 | 
						||
| 
								 | 
							
								    /* hw retry cnt */
							 | 
						||
| 
								 | 
							
								    mpdu->hw_retry_cnt = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* set the crc hdr len, GP is 4 for bcn */
							 | 
						||
| 
								 | 
							
								    if(glb_cfg.m_type == PLC_PROTO_TYPE_SG)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == FC_DELIM_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 3;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if((glb_cfg.p_type == FC_DELIM_SOF)||(glb_cfg.p_type == FC_DELIM_SOUND))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 4;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else if(glb_cfg.m_type == PLC_PROTO_TYPE_SPG)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == FC_DELIM_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 3;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if((glb_cfg.p_type == FC_DELIM_SOF)||(glb_cfg.p_type == FC_DELIM_SOUND))
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 7;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else{
							 | 
						||
| 
								 | 
							
								        if(glb_cfg.p_type == DT_AV_BEACON)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 4;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        else if(glb_cfg.p_type == DT_AV_SOF)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            mpdu->pb_hdr_crc_len = 8;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* pb modulation and rate */
							 | 
						||
| 
								 | 
							
								    phy_get_pb_mod(glb_cfg.m_type,tmi, ext_tmi, &pb_mod);
							 | 
						||
| 
								 | 
							
								    mpdu->tx_pb_modulation = pb_mod;
							 | 
						||
| 
								 | 
							
								    mpdu->tx_rate_mode = rate_mode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* zliu test */
							 | 
						||
| 
								 | 
							
								    mpdu->proto_type = 4;
							 | 
						||
| 
								 | 
							
								    mpdu->fc.sg_fc.vf.sof.frame_len = 0x1c1;
							 | 
						||
| 
								 | 
							
								    mpdu->fc.sg_fc.vf.sof.pb_num =2; //0x2 is 6/30versions
							 | 
						||
| 
								 | 
							
								    //zliu RAW SPECIAL
							 | 
						||
| 
								 | 
							
								    mpdu->fc.sg_fc.vf.sof.sym_num = 0x15;//mpdu->tx_symbnum_ppb;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    dbg_buf= (uint32_t*)&mpdu->fc.sg_fc.vf.sof;
							 | 
						||
| 
								 | 
							
								    iot_printf("FC:0x%04x 0x%04x 0x%04x 0x%04x\n", dbg_buf[0],dbg_buf[1],dbg_buf[2],dbg_buf[3]);
							 | 
						||
| 
								 | 
							
								    /* set hwq0's ptr list */
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_HWQ0_PTR_ADDR, (uint32_t)mpdu);
							 | 
						||
| 
								 | 
							
								    /* read NTB and fill in the start and end time
							 | 
						||
| 
								 | 
							
								     * by max time span value
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_HWQ0_START_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_HWQ0_END_ADDR, (tmp + (0xffffffff >> 1) - 1));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* trigger send */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_HWQ_READ_REG(CFG_HWQ0_ADDR);
							 | 
						||
| 
								 | 
							
								    if (REG_FIELD_GET(CFG_DBG_HWQ0_EN, tmp)) {
							 | 
						||
| 
								 | 
							
								        /* if enable then disable first */
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_DBG_HWQ0_EN, tmp, 0); // disable hwq
							 | 
						||
| 
								 | 
							
								        RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_DBG_HWQ0_EN, tmp, 1); // enable hwq
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t tx_complete_handler(uint32_t vector, iot_addrword_t data)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t status;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    status = RGF_MAC_READ_REG(CFG_MAC_INT_STS_ADDR);
							 | 
						||
| 
								 | 
							
								    //iot_printf("intc status=0x%x\r\n",status);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(status & (0x1 <<5)){
							 | 
						||
| 
								 | 
							
								        /* clear intr */
							 | 
						||
| 
								 | 
							
								        RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<5);
							 | 
						||
| 
								 | 
							
								        RGF_HWQ_WRITE_REG(CFG_HWQ_TX_DONE_INT_CLR_ADDR,0xf);
							 | 
						||
| 
								 | 
							
								        if(!mpdu_start.tx_status->tx_done)
							 | 
						||
| 
								 | 
							
								            iot_printf("Intr complete,but tx not done!\r\n");
							 | 
						||
| 
								 | 
							
								        mpdu_start.tx_status->tx_done = 0;
							 | 
						||
| 
								 | 
							
								        mac_tx_complete_flag = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(status & (0x1 <<0)){
							 | 
						||
| 
								 | 
							
								        /* clear intr */
							 | 
						||
| 
								 | 
							
								        RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<0);
							 | 
						||
| 
								 | 
							
								        mac_beacon_alert_flag = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if(status & (0x1 <<4)){
							 | 
						||
| 
								 | 
							
								        /* clear intr */
							 | 
						||
| 
								 | 
							
								        RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        mac_beacon_alert_flag = true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if MODULE_EN
							 | 
						||
| 
								 | 
							
								    /* single interrupt handler */
							 | 
						||
| 
								 | 
							
								    INTC_WRITE_REG(CFG_INT_ENA0_ADDR,0x0);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void mac_interrupt_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t tmp = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    os_mem_set(&mac_info, 0x0, sizeof(iot_mac_intr_info_t));
							 | 
						||
| 
								 | 
							
								    /* intc en */
							 | 
						||
| 
								 | 
							
								    INTC_WRITE_REG(CFG_INT_ENA0_ADDR,0x21);
							 | 
						||
| 
								 | 
							
								    /* clr mac int */
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<(5));//tx complete
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_MAC_INT_CLR_ADDR, 0x1<<(0));//tx beacon alert
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* MPDU done intr enable */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_MAC_READ_REG(CFG_INT_ENA_MASK_ADDR);
							 | 
						||
| 
								 | 
							
								    if(glb_cfg.t_type == MAC_TX_INTR_MPDU_COMPLETE)
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,(0x1<<5));
							 | 
						||
| 
								 | 
							
								    else if(glb_cfg.t_type == MAC_TX_INTR_BCN_ALT)
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,(0x1<<0));
							 | 
						||
| 
								 | 
							
								    else if(glb_cfg.t_type == MAC_TX_SCHED_BCN_AHEAD_ALERT)
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_INT_ENABLE_MASK,tmp,(0x1<<5));
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_INT_ENA_MASK_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* pri int */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_MAC_READ_REG(CFG_INT_PRI1_MASK_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_INT_PRI1_MASK,tmp,(0x1<<0) | (0x1<<5));
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_INT_PRI1_MASK_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* interrupt controller */
							 | 
						||
| 
								 | 
							
								    mac_info.int_num = HAL_VECTOR_MAC_1;
							 | 
						||
| 
								 | 
							
								    mac_info.handle = iot_interrupt_create( mac_info.int_num, 0, (iot_addrword_t)&mac_info, tx_complete_handler);
							 | 
						||
| 
								 | 
							
								    iot_interrupt_attach( mac_info.handle);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    iot_interrupt_unmask( mac_info.handle);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								uint32_t mac_hw_init() {
							 | 
						||
| 
								 | 
							
								    uint32_t tmp;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* reset mac */
							 | 
						||
| 
								 | 
							
								    mac_reset(MAC_RST_REASON_COLD);
							 | 
						||
| 
								 | 
							
								    /* reset phy */
							 | 
						||
| 
								 | 
							
								    phy_reset(PHY_RST_REASON_COLD);
							 | 
						||
| 
								 | 
							
								    /* reset mac */
							 | 
						||
| 
								 | 
							
								    mac_reset(MAC_RST_REASON_COLD);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* init */
							 | 
						||
| 
								 | 
							
								    phy_init(PLC_PROTO_TYPE_SG, IOT_PLC_PHY_BAND_DFT, TONE_MASK_ID_NULL, true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* dtest mac interrupt cfg */
							 | 
						||
| 
								 | 
							
								    if(glb_cfg.t_type >= MAC_TX_INTR_BCN_ALT)
							 | 
						||
| 
								 | 
							
								        mac_interrupt_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /******************************************************/
							 | 
						||
| 
								 | 
							
								    /* mac related dtest param */
							 | 
						||
| 
								 | 
							
								    /* enable DCU debug mode */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_HWQ_READ_REG(CFG_SCH_ADDR);
							 | 
						||
| 
								 | 
							
								    if(glb_cfg.t_type == MAC_TX_SCHED_BCN_AHEAD_ALERT)
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_HWQ_DBG_MODE, tmp, 0); // commandlist enable
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								        REG_FIELD_SET(CFG_HWQ_DBG_MODE, tmp, 1); // debug enable
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_SCH_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* set hwq 0 's config */
							 | 
						||
| 
								 | 
							
								    /* set hwq0's type, cap */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_HWQ_READ_REG(CFG_HWQ0_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_DBG_HWQ0_TYPE, tmp, 0); // 0:TDMA, 1:CSMA
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_DBG_HWQ0_CAP, tmp, 1); // CAP1 as default
							 | 
						||
| 
								 | 
							
								    RGF_HWQ_WRITE_REG(CFG_HWQ0_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* set beacon period */
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_BEACON_PERIOD_ADDR, bcn_period_ms * TICKS_MS);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* config my nid */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_MAC_READ_REG(CFG_MYNID_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_MYNID, tmp, 0x123456);
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_MYNID_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* tei cfg */
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_MYTEI_ADDR, 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* enable and trigger the HW to load it */
							 | 
						||
| 
								 | 
							
								    tmp = RGF_MAC_READ_REG(CFG_TMI_CTRL_ADDR);
							 | 
						||
| 
								 | 
							
								    REG_FIELD_SET(CFG_TONE_AMP_EN, tmp, 0);
							 | 
						||
| 
								 | 
							
								    RGF_MAC_WRITE_REG(CFG_TMI_CTRL_ADDR, tmp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* delete timeout for long pkt */
							 | 
						||
| 
								 | 
							
								    RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_0_ADDR,0x0);
							 | 
						||
| 
								 | 
							
								    RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_1_ADDR,0x0);
							 | 
						||
| 
								 | 
							
								    RGF_TMR_WRITE_REG(CFG_TX_TIMEOUT_2_ADDR,0x0);
							 | 
						||
| 
								 | 
							
								    RGF_TMR_WRITE_REG(CFG_PHY_TX_TIMEOUT_ADDR,0x0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* support mode : ftm, module, dtest scan */
							 | 
						||
| 
								 | 
							
								void tx_common_init()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    /* basic data struct init for bit ops */
							 | 
						||
| 
								 | 
							
								    iot_bitops_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_hw_init();
							 | 
						||
| 
								 | 
							
								    /* construct the desc */
							 | 
						||
| 
								 | 
							
								#if MAC_PB_NUM_ID == 1
							 | 
						||
| 
								 | 
							
								    pb_start.next_pb = NULL;
							 | 
						||
| 
								 | 
							
								    pb_start.pb_buf_addr = (uint32_t)&pb_buf[0];
							 | 
						||
| 
								 | 
							
								#elif MAC_PB_NUM_ID == 2
							 | 
						||
| 
								 | 
							
								    pb_start.next_pb = &pb_second;
							 | 
						||
| 
								 | 
							
								    pb_second.next_pb = NULL;
							 | 
						||
| 
								 | 
							
								    pb_start.pb_buf_addr = (uint32_t)&pb_buf[0];
							 | 
						||
| 
								 | 
							
								    pb_second.pb_buf_addr = (uint32_t)&pb_buf_second[0];
							 | 
						||
| 
								 | 
							
								#elif MAC_PB_NUM_ID == 3
							 | 
						||
| 
								 | 
							
								    pb_start.next_pb = &pb_second;
							 | 
						||
| 
								 | 
							
								    pb_second.next_pb = &pb_third;
							 | 
						||
| 
								 | 
							
								    pb_third.next_pb = NULL;
							 | 
						||
| 
								 | 
							
								    pb_start.pb_buf_addr = (uint32_t)&pb_buf[0];
							 | 
						||
| 
								 | 
							
								    pb_second.pb_buf_addr = (uint32_t)&pb_buf_second[0];
							 | 
						||
| 
								 | 
							
								    pb_third.pb_buf_addr = (uint32_t)&pb_buf_third[0];
							 | 
						||
| 
								 | 
							
								#elif MAC_PB_NUM_ID == 4
							 | 
						||
| 
								 | 
							
								    pb_start.next_pb = &pb_second;
							 | 
						||
| 
								 | 
							
								    pb_second.next_pb = &pb_third;
							 | 
						||
| 
								 | 
							
								    pb_third.next_pb = &pb_last;
							 | 
						||
| 
								 | 
							
								    pb_last.next_pb = NULL;
							 | 
						||
| 
								 | 
							
								    pb_start.pb_buf_addr = (uint32_t)&pb_buf[0];
							 | 
						||
| 
								 | 
							
								    pb_second.pb_buf_addr = (uint32_t)&pb_buf_second[0];
							 | 
						||
| 
								 | 
							
								    pb_third.pb_buf_addr = (uint32_t)&pb_buf_third[0];
							 | 
						||
| 
								 | 
							
								    pb_last.pb_buf_addr = (uint32_t)&pb_buf_last[0];
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    if((glb_cfg.p_type == DT_AV_SOF) \
							 | 
						||
| 
								 | 
							
								        ||(glb_cfg.p_type == FC_DELIM_SOF) \
							 | 
						||
| 
								 | 
							
								        ||(glb_cfg.p_type == FC_DELIM_SOUND))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        sg_sof_pb_hdr_t sg_sof_pb_hdr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        sg_sof_pb_hdr.mac_frame_start = 1;
							 | 
						||
| 
								 | 
							
								        sg_sof_pb_hdr.mac_frame_end = 1;
							 | 
						||
| 
								 | 
							
								        sg_sof_pb_hdr.seq = 0;
							 | 
						||
| 
								 | 
							
								        pb_start.sof_pb_header = *((uint8_t *)&sg_sof_pb_hdr);
							 | 
						||
| 
								 | 
							
								        pb_second.sof_pb_header = *((uint8_t *)&sg_sof_pb_hdr);
							 | 
						||
| 
								 | 
							
								        pb_third.sof_pb_header = *((uint8_t *)&sg_sof_pb_hdr);
							 | 
						||
| 
								 | 
							
								        pb_last.sof_pb_header = *((uint8_t *)&sg_sof_pb_hdr);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mpdu_start.next = NULL;
							 | 
						||
| 
								 | 
							
								    mpdu_start.pb_list = &pb_start;
							 | 
						||
| 
								 | 
							
								    mpdu_start.tx_status = &mpdu_end;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /* fill in the beacon content */
							 | 
						||
| 
								 | 
							
								    hp_beacon_payload_fixed_header *tmp =
							 | 
						||
| 
								 | 
							
								        (hp_beacon_payload_fixed_header *)&pb_buf[0];
							 | 
						||
| 
								 | 
							
								    tmp->nid = 0x123456;
							 | 
						||
| 
								 | 
							
								    tmp->hm = 0;
							 | 
						||
| 
								 | 
							
								    tmp->stei = 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uint32_t i;
							 | 
						||
| 
								 | 
							
								    tmp->bmi.opad[0] = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								    for (i = 1; i < sizeof(tmp->bmi.opad)/4; i++) { //init pb_buf with 4 pb
							 | 
						||
| 
								 | 
							
								        tmp->bmi.opad[i] = tmp->bmi.opad[0]+i;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* fresh all the cfg */
							 | 
						||
| 
								 | 
							
								void mac_glb_map(uint32_t mac_type, uint32_t pkt_type, uint32_t test_type)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    glb_cfg.m_type = mac_type;
							 | 
						||
| 
								 | 
							
								    glb_cfg.p_type = pkt_type;
							 | 
						||
| 
								 | 
							
								    glb_cfg.t_type = test_type;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* cli api */
							 | 
						||
| 
								 | 
							
								void mac_tx_handle(uint32_t mac_type, uint32_t pkt_type, uint32_t num)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    uint32_t tx_done = 0;
							 | 
						||
| 
								 | 
							
								    uint32_t enq_time = 0, cur_time = 0;
							 | 
						||
| 
								 | 
							
								    int64_t time_span = 0;
							 | 
						||
| 
								 | 
							
								    bool_t period_done = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    mac_glb_map(mac_type,pkt_type,pkt_type);
							 | 
						||
| 
								 | 
							
								    tx_common_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    do {
							 | 
						||
| 
								 | 
							
								        enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        mac_tx_mpdu_test(NULL, &mpdu_start);
							 | 
						||
| 
								 | 
							
								        do { // wait for tx done and hwq disable
							 | 
						||
| 
								 | 
							
								            cur_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
							 | 
						||
| 
								 | 
							
								            time_span = cur_time - enq_time;
							 | 
						||
| 
								 | 
							
								            if (time_span < 0) { // wrap around
							 | 
						||
| 
								 | 
							
								                time_span = (0x100000000LL) - enq_time + cur_time;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            tx_done = mpdu_start.tx_status->tx_done;
							 | 
						||
| 
								 | 
							
								            period_done = ((uint64_t)time_span < bcn_period_ms * TICKS_MS)?0:1;
							 | 
						||
| 
								 | 
							
								            if(!tx_done && period_done){
							 | 
						||
| 
								 | 
							
								                iot_printf("[Dtest][tx][timeout] Please check again!\r\n");
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } while (!tx_done || !period_done);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(--num == 0){
							 | 
						||
| 
								 | 
							
								            iot_printf("[Dtest][tx][done] Successfully!\r\n");
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } while (true);
							 | 
						||
| 
								 | 
							
								}
							 |