714 lines
23 KiB
C
714 lines
23 KiB
C
|
/****************************************************************************
|
||
|
|
||
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
||
|
|
||
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
||
|
be copied by any method or incorporated into another program without
|
||
|
the express written consent of Aerospace C.Power. This Information or any portion
|
||
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
||
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
||
|
liability for its use in any way and conveys no license or title under
|
||
|
any patent or copyright and makes no representation or warranty that this
|
||
|
Information is free from patent or copyright infringement.
|
||
|
|
||
|
****************************************************************************/
|
||
|
#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
|