Files
kunlun/plc/halmac/test/tx_test_lib.c

714 lines
23 KiB
C
Raw Permalink Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
#include "tx_test_lib.h"
#include "mac_sys_reg.h"
#include "hw_reg_api.h"
#include "mac_tx_hw.h"
#include "iot_errno.h"
#include "iot_io.h"
#include "mac_pdev.h"
#include "iot_bitops.h"
#include "hw_phy_init.h"
#include "hw_tonemap.h"
#include "phy_chn.h"
#include "mac_crc.h"
#include "mpdu_header.h"
#include "mac_desc_engine.h"
#include "mac_rx_hw.h"
#include "mac_cert_test.h"
#include "tx_desc_reg_api.h"
#include "rf_tx_test_lib.h"
#if (IOT_FTM_SUPPORT || CPLC_IOT_CERT_SUPPORT)
#if HW_PLATFORM >= HW_PLATFORM_FPGA
uint32_t enq_time = 0;
uint8_t close_tx_print = 0;
uint8_t mac_ping_enable = 0;
uint32_t mac_sche_set_cfg(void *vdev, hw_sched_cmd_t *cmdlist,
uint16_t cmd_num, uint32_t bcn_pd, uint32_t start_ntb)
{
/* disable plc schedule */
mac_sched_enable_bp(vdev, 0);
/* config HW scheduler alert time */
mac_sched_set_bp_ahead_alert(vdev, MAC_BP_AHEAD_ALERT_DUR);
/*set cmd list and cmd num*/
mac_sched_set_bp_cmd_list(vdev, cmdlist, cmd_num);
/*set bcn period*/
mac_sched_set_bp_dur(vdev, bcn_pd);
/* set plc start ntb */
mac_sched_set_bp_start_ntb(vdev, start_ntb);
/* start plc */
mac_sched_trigger_bp(vdev);
mac_sched_enable_bp(vdev, 1);
return 0;
}
//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);
if (sg_mac->mac_exist_flag) {
msdu_len = data_len - MAC_HDR_LEN_WITH_ADDR;
} else {
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);
if (spg_mac->mac_hdr_type) {
/* short msdu */
msdu_len = data_len - MAC_SHORT_HDR_LEN_SPG;
} else {
/* long msdu */
msdu_len = data_len - MAC_LONG_HDR_LEN_SPG;
}
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, 0, PLC_MAC_TX_MID);
IOT_ASSERT(buf);
if (pkt_len > buf_len) {
iot_printf("waring drop some data, pb len:%d, data len:%d\n",
buf_len, pkt_len);
pkt_len = buf_len;
}
uint8_t *tmp = iot_pkt_put(buf, buf_len);
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);
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);
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);
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, uint8_t phase, uint32_t band_sel)
{
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);
phy_get_pb_size(proto, tmi, ext_tmi, &pb_sz);
phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
/* get pb header + crc length */
pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(FC_DELIM_BEACON, \
proto);
iot_pkt_t *test_data = \
ftm_fill_mac_data(delimiter_type, (pb_sz - pb_hdr_resv_crc_len), \
pkt, pkt_len);
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);
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, phase, phy_def_hw_band_id_get(), \
ppdu_mode, 0, pb_mod, rate_mode);
mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
1, phase, 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};
void *fc = mac_tx_mpdu_start_get_fc_ptr(mpdu);
mac_get_tx_msg_from_fc(proto, delimiter_type, 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, uint8_t phase, uint32_t band_sel, \
uint8_t rawdata_mode, uint8_t *fc_rawdata)
{
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;
phy_get_pb_size(proto, tmi, ext_tmi,&pb_sz);
phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
/* get header + crc length */
uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, proto);
iot_pkt_t *test_data = \
ftm_fill_mac_data(delimiter_type, \
((pb_sz - pb_hdr_resv_crc_len) * pb_num), pkt, pkt_len);
bitmap = 0xffffffff >> (32 - pb_num);
if(!rawdata_mode)
{
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);
if(rawdata_mode)
{
/* if raw data mode, sw fill pb header and pb crc */
#if CPLC_IOT_CERT_SUPPORT
fill_pb_hdr_crc_rawdata(pb, g_mt_ctxt->pb_header, g_mt_ctxt->pb_crc);
#endif
}
mac_tx_mpdu_fill_macinfo(mpdu, qid, pb_num, need_encry, need_ack,\
phy_get_sym_per_pb(proto, phy_def_hw_band_id_get(), tmi, ext_tmi,
phy_get_pss_id(proto, tmi, ext_tmi)),\
phy_get_fl_per_pb(proto, \
phy_def_hw_band_id_get(), 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, phase, phy_def_hw_band_id_get(), \
ppdu_mode, 0, pb_mod, rate_mode);
uint8_t proto_org = 0;
if(rawdata_mode)
{
/* if raw data mode, save original proto */
proto_org = proto;
proto = PLC_PROTO_TYPE_RAWDATA;
}
mac_tx_mpdu_fill_fcinfo(mpdu, proto, \
pb_num, phase, delimiter_type, network, nid, 0,\
tmi, ext_tmi, dtei, stei, lid, bcast, 0,need_encry,\
key_table_idx_in_desc ,key_idx_in_desc, fc_rawdata);
void *fcv = mac_tx_mpdu_start_get_fc_ptr(mpdu);
if(rawdata_mode)
{
proto = proto_org;
}
if(!need_decrypt)
{
switch (proto) {
#if SUPPORT_SMART_GRID
case PLC_PROTO_TYPE_SG:
{
frame_control_t *fc = \
(frame_control_t *)fcv;
fc->vf.sof.decrypt_mode = 0;
break;
}
#endif
#if SUPPORT_SOUTHERN_POWER_GRID
case PLC_PROTO_TYPE_SPG:
{
spg_frame_control_t *fc = \
(spg_frame_control_t *)fcv;
fc->vf.sof.decrypt_mode = 0;
break;
}
#endif
#if SUPPORT_GREEN_PHY
case PLC_PROTO_TYPE_GP:
{
hpav_frame_control *fc = (hpav_frame_control *)fcv;
fc->vf_av.sof.eks = 0x0f;
break;
}
#endif
default:
IOT_ASSERT(0);
}
}
mac_crc_set_fc_swcrc(proto, mpdu);
if(rawdata_mode)
{
/* if rawdata mode, copy fcs and don't use hw fcs */
#if SUPPORT_SMART_GRID
frame_control_t *fc = (frame_control_t *) fcv;
frame_control_t *fc_rawdata_p = (frame_control_t *) fc_rawdata;
fc->vf.sof.fccs = fc_rawdata_p->vf.sof.fccs;
#elif SUPPORT_SOUTHERN_POWER_GRID
spg_frame_control_t *fc = (spg_frame_control_t*)fcv;
spg_frame_control_t *fc_rawdata_p = (spg_frame_control_t *) fc_rawdata;
fc->vf.sof.fccs = fc_rawdata_p->vf.sof.fccs;
#endif
}
if(!close_tx_print)
{
tx_fc_msg_t msg = {0};
mac_get_tx_msg_from_fc(proto, delimiter_type, fcv, &msg);
{
iot_printf("proto = %d," \
"hwq = %d," \
"sof tx:tmi = %d," \
"sof tx:ext_tmi = %d," \
"pb_num = %d\n", \
proto, qid, tmi, ext_tmi, pb_num);
}
}
/* send */
mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
}
uint32_t mac_tx_mpdu_fill_ack_fcinfo(tx_mpdu_start *mpdu_start,\
uint32_t proto, uint32_t delimter, uint32_t network, uint32_t nid,\
uint32_t rx_result, uint32_t rx_status, \
uint32_t stei, uint32_t dtei, uint32_t rx_pb, uint32_t snr, \
uint32_t load, uint32_t ext_deli)
{
IOT_ASSERT(mpdu_start);
mpdu_start->proto_type = proto;
#if SUPPORT_SMART_GRID
frame_control_t *fc = (frame_control_t *)mac_tx_mpdu_start_get_fc_ptr(mpdu_start);
fc->delimiter_type = delimter;
fc->network_type = network;
fc->nid = nid;
fc->vf.sack.rx_result = rx_result;
fc->vf.sack.rx_status = rx_status;
fc->vf.sack.stei = stei;
fc->vf.sack.dtei = dtei;
fc->vf.sack.rx_pb = rx_pb;
fc->vf.sack.resv0 = 0;
fc->vf.sack.snr = snr;
fc->vf.sack.load = load;
fc->vf.sack.resv1 = 0;
fc->vf.sack.ext_deli = ext_deli;
fc->vf.sack.version = 0;
#else
IOT_ASSERT(0);
#endif
return 0;
}
void mpdu_tx_ack_test(uint32_t proto, mac_queue_ctxt_t *tx_ctxt,\
uint8_t qid, tx_mpdu_end *mpdu_end, uint32_t band_sel, \
uint8_t rawdata_mode, uint8_t *fc_rawdata, uint8_t phase,\
uint8_t delimiter_type, uint32_t nid,
uint32_t rx_result, uint32_t rx_status, uint32_t stei, \
uint32_t dtei, uint32_t rx_pb, uint32_t snr, uint32_t load, \
uint32_t ext_deli)
{
tx_mpdu_start *mpdu;
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);
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, 0);
mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC, \
128, phase, phy_def_hw_band_id_get(), ppdu_mode, 0, 1, 0);
uint8_t proto_tmp = 0;
if(rawdata_mode) //if mtmode goto rawdata mode
{
proto_tmp = proto;
proto = PLC_PROTO_TYPE_RAWDATA;
}
mac_tx_mpdu_fill_ack_fcinfo(mpdu, proto, delimiter_type, network, nid,\
rx_result, rx_status, stei, dtei, rx_pb, snr, load, ext_deli);
if(rawdata_mode)
{
proto = proto_tmp;
}
mac_crc_set_fc_swcrc(proto, mpdu);
{
iot_printf("hwq = %d ack tx_done\n",qid);
}
/* send */
mac_tx_hw_mpdu(tx_ctxt, qid, mpdu);
}
void mpdu_tx_nncco_or_rtscts_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;
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);
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, 0);
mac_tx_mpdu_fill_phyinfo(mpdu, HW_DESC_TX_PORT_PLC,
128, HW_DESC_TX_PHASE_ALL, 0, ppdu_mode, 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 deli:%d tx_done\n", qid, delimiter_type);
/* 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;
uint8_t ppdu_mode = (PLC_PROTO_TYPE_GP == proto)? \
HW_DESC_PPDU_MODE_AVONLY_1FCSYM:0;
if(proto == PLC_PROTO_TYPE_SPG)
{
iot_printf("NW do not supprot sound!");
return;
}
phy_get_pb_size(proto, tmi, ext_tmi, &pb_sz);
phy_get_pb_mod(proto, tmi, ext_tmi, &pb_mod);
uint8_t pb_hdr_resv_crc_len = mac_get_pb_hdr_resv_crc_len(delimiter_type, proto);
iot_pkt_t *test_data = \
ftm_fill_mac_data(delimiter_type, (pb_sz - pb_hdr_resv_crc_len), \
pkt, pkt_len);
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);
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, ppdu_mode, 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};
void *fc = mac_tx_mpdu_start_get_fc_ptr(mpdu);
mac_get_tx_msg_from_fc(proto, delimiter_type, 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 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, uint8_t phase,
uint32_t band_sel, uint8_t rawdata_mode, uint8_t *fc_rawdata)
{
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;
(proto != PLC_PROTO_TYPE_GP)? (bcast = bcast):
(bcast = 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, phase,
band_sel);
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, phase,
band_sel, rawdata_mode, fc_rawdata);
break;
}
case FC_DELIM_SACK:
{
mpdu_tx_ack_test(proto, tx_ctxt, qid, end, band_sel,
rawdata_mode, fc_rawdata, phase, FC_DELIM_SACK, nid,
0, 1, 1, 0xfff, 1, 0xff, 0, 0);
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;
(void)band_sel;
mpdu_tx_nncco_or_rtscts_test(proto, tx_ctxt, qid, bcast,
FC_DELIM_NNCCO, nid, dtei, stei, lid, need_encry, end);
break;
}
case I1901_RTS_CTS:
{
(void)pb_num;
(void)need_encry;
(void)need_decrypt;
(void)avln_idx_in_desc;
(void)key_table_idx_in_desc;
(void)key_idx_in_desc;
mpdu_tx_nncco_or_rtscts_test(proto, tx_ctxt, qid, bcast,
I1901_RTS_CTS, nid, dtei, stei, lid, need_encry, end);
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
}
/* used for ping under ftm mode,
* TODO: to be removed later
*/
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, 0, 0, 0, NULL);
if(mac_ping_enable)
{
enq_time = RGF_MAC_READ_REG(CFG_RD_NTB_ADDR);
}
do {
mac_rx_hw_mpdu_internal(g_mac_pdev[0], 0, 1000);
} while (!end->tx_done);
mac_tx_hw_mpdu_comp(qid, 1);
return 0;
}
#endif
#endif