summaryrefslogtreecommitdiff
path: root/cesar/mac/pbproc/src
diff options
context:
space:
mode:
Diffstat (limited to 'cesar/mac/pbproc/src')
-rw-r--r--cesar/mac/pbproc/src/fsm.c10
-rw-r--r--cesar/mac/pbproc/src/fsm_handle_fc.c128
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_beacon.c11
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_data.c185
-rw-r--r--cesar/mac/pbproc/src/fsm_rx_sound.c67
-rw-r--r--cesar/mac/pbproc/src/fsm_top.c11
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_data.c210
-rw-r--r--cesar/mac/pbproc/src/fsm_tx_sound.c32
-rw-r--r--cesar/mac/pbproc/src/pbproc.c23
-rw-r--r--cesar/mac/pbproc/src/prep_mpdu.c437
-rw-r--r--cesar/mac/pbproc/src/trace.c67
11 files changed, 1117 insertions, 64 deletions
diff --git a/cesar/mac/pbproc/src/fsm.c b/cesar/mac/pbproc/src/fsm.c
index b036768935..3af9db4559 100644
--- a/cesar/mac/pbproc/src/fsm.c
+++ b/cesar/mac/pbproc/src/fsm.c
@@ -12,6 +12,8 @@
*/
#include "common/std.h"
+#include "hal/gpio/gpio.h"
+
#include "mac/pbproc/pbproc.h"
#include "mac/pbproc/inc/fsm.h"
@@ -106,8 +108,10 @@ pbproc_fsm_handle_rx_fc_event (pbproc_t *ctx, u32 rx_date, const u32 *fc_av)
PBPROC_TRACE (FSM_RX_FC, phy_date (), rx_date,
fc_av ? fc_av[0] : (u32) -1, fc_av ? fc_av[1] : (u32) -1,
fc_av ? fc_av[2] : (u32) -1, fc_av ? fc_av[3] : (u32) -1);
+ GPIO_SET (LED_PBPROC_WORKING, 1);
ctx->fsm.states[ctx->fsm.current_state].
rx_fc_cb (ctx, rx_date, (const pbproc_fc_t *) fc_av);
+ GPIO_SET (LED_PBPROC_WORKING, 0);
if (ctx->fsm.schedule_deferred)
{
ctx->fsm.schedule_deferred = false;
@@ -123,7 +127,9 @@ pbproc_fsm_handle_access_event (pbproc_t *ctx)
dbg_claim (ctx);
dbg_claim (ctx->fsm.current_state < PBPROC_FSM_STATE_NB);
PBPROC_TRACE (FSM_ACCESS, phy_date ());
+ GPIO_SET (LED_PBPROC_WORKING, 1);
ctx->fsm.states[ctx->fsm.current_state].access_cb (ctx);
+ GPIO_SET (LED_PBPROC_WORKING, 0);
if (ctx->fsm.schedule_deferred)
{
ctx->fsm.schedule_deferred = false;
@@ -139,7 +145,9 @@ pbproc_fsm_handle_access_conf_event (pbproc_t *ctx)
dbg_claim (ctx);
dbg_claim (ctx->fsm.current_state < PBPROC_FSM_STATE_NB);
PBPROC_TRACE (FSM_ACCESS_CONF, phy_date ());
+ GPIO_SET (LED_PBPROC_WORKING, 1);
ctx->fsm.states[ctx->fsm.current_state].access_conf_cb (ctx);
+ GPIO_SET (LED_PBPROC_WORKING, 0);
if (ctx->fsm.schedule_deferred)
{
ctx->fsm.schedule_deferred = false;
@@ -156,7 +164,9 @@ pbproc_fsm_handle_pbdma_event (pbproc_t *ctx, u32 status_word)
dbg_claim (ctx->fsm.current_state < PBPROC_FSM_STATE_NB);
PBPROC_TRACE (FSM_PBDMA, phy_date (), status_word);
ctx->pbdma_status = PHY_PBDMA_STATUS (status_word);
+ GPIO_SET (LED_PBPROC_WORKING, 1);
ctx->fsm.states[ctx->fsm.current_state].pbdma_cb (ctx);
+ GPIO_SET (LED_PBPROC_WORKING, 0);
if (ctx->fsm.schedule_deferred)
{
ctx->fsm.schedule_deferred = false;
diff --git a/cesar/mac/pbproc/src/fsm_handle_fc.c b/cesar/mac/pbproc/src/fsm_handle_fc.c
index ece799b878..fbb2d75c88 100644
--- a/cesar/mac/pbproc/src/fsm_handle_fc.c
+++ b/cesar/mac/pbproc/src/fsm_handle_fc.c
@@ -10,6 +10,8 @@
* \brief FSM handle FC part.
* \ingroup mac_pbproc
*/
+#include "config/av.h"
+
#include "common/std.h"
#include "pbproc.h"
@@ -117,7 +119,8 @@ pbproc_fhfc_handle_fc (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
if (!fc_av)
{
/* Handle HP 1.0 detection. */
- bool crc_error = pbproc_fhfc_fc10 (ctx, rx_date,
+ bool crc_error = CONFIG_AV_ONLY_MODE
+ || pbproc_fhfc_fc10 (ctx, rx_date,
phy_rx_fc10 (ctx->phy));
if (crc_error)
{
@@ -168,12 +171,15 @@ pbproc_fhfc_beacon (pbproc_t *ctx, u32 rx_date,
static bool ARCH_ILRAM
pbproc_fhfc_parse_sof (pbproc_t *ctx, const pbproc_fc_t *fc_av)
{
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim (fc_av->sof.clst == false);
/* TODO features. */
dbg_claim (fc_av->sof.dcppcf == false);
dbg_claim (fc_av->sof.rsr == false);
+#endif
pbproc_rx_params_t *rx_params = &ctx->recv_mpdu.rx_params;
bool fc_ok;
+#if !CONFIG_MAC_PBPROC_EOC_FC
u32 sof_w0 = fc_av->words[0];
rx_params->snid = BF_GET (PBPROC_FC_SOF_W0__SNID, sof_w0);
rx_params->dtei = BF_GET (PBPROC_FC_SOF_W0__DTEI, sof_w0);
@@ -222,6 +228,58 @@ pbproc_fhfc_parse_sof (pbproc_t *ctx, const pbproc_fc_t *fc_av)
BF_GET (PBPROC_FC_SOF_W2__MFS_CMD_DATA, sof_w2);
fc_ok = true;
}
+#else
+ u32 sof_w0 = fc_av->words[0];
+ bool direction = BF_GET (PBPROC_FC_EOC_SOF_W0__DIRECTION, sof_w0);
+ rx_params->snid = BF_GET (PBPROC_FC_EOC_SOF_W0__SNID, sof_w0);
+ rx_params->bcast = BF_GET (PBPROC_FC_EOC_SOF_W0__MCF, sof_w0);
+ u32 sof_w1 = fc_av->words[1];
+ u8 tei = ctx->config->tei;
+ rx_params->multi_net_bcast = BF_GET (PBPROC_FC_EOC_SOF_W1__MNBF, sof_w1);
+ if (direction)
+ {
+ rx_params->tei = BF_GET (PBPROC_FC_EOC_SOF_W0__DTEI, sof_w0);
+ rx_params->dtei = MAC_TEI_CCO_DEF;
+ }
+ else
+ {
+ rx_params->dtei = BF_GET (PBPROC_FC_EOC_SOF_W0__DTEI, sof_w0);
+ rx_params->tei = MAC_TEI_CCO_DEF;
+ }
+ /* frame is for us */
+ if (!BF_GET (PBPROC_FC_SOF_W0__ACCESS, sof_w0)
+ && ((rx_params->snid == ctx->alloc.snid) || rx_params->multi_net_bcast)
+ && ((rx_params->dtei && rx_params->dtei == tei)
+ || rx_params->bcast
+ || (direction && MAC_TEI_IS_EOC_CCO(tei))))
+ {
+ rx_params->sound = false;
+ rx_params->lid = BF_GET (PBPROC_FC_EOC_SOF_W0__LID, sof_w0);
+ rx_params->cfp = ctx->access.cfp;
+ rx_params->bdf = 0;
+ rx_params->hp10df = false;
+ rx_params->hp11df = false;
+ rx_params->eks = BF_GET (PBPROC_FC_EOC_SOF_W0__EKS, sof_w0);
+ rx_params->pending_seg_info = 0;
+ rx_params->ble = 0;
+ rx_params->pb_size = BF_GET (PBPROC_FC_EOC_SOF_W0__PBSZ, sof_w0)
+ ? PHY_PB_SIZE_136 : PHY_PB_SIZE_520;
+ rx_params->num_sym = BF_GET (PBPROC_FC_EOC_SOF_W0__NUM_SYM, sof_w0);
+ rx_params->tmi_av = BF_GET (PBPROC_FC_EOC_SOF_W0__TMI_AV, sof_w0);
+ rx_params->fl_tck = MAC_FL_TO_TCK (
+ BF_GET (PBPROC_FC_EOC_SOF_W1__FL_AV, sof_w1));
+ rx_params->mpdu_cnt = BF_GET (PBPROC_FC_EOC_SOF_W1__MPDU_CNT, sof_w1);
+ rx_params->burst_cnt = BF_GET (PBPROC_FC_EOC_SOF_W1__BURST_CNT, sof_w1);
+ rx_params->mrdur_tck = MAC_FL_TO_TCK (
+ BF_GET (PBPROC_FC_EOC_SOF_W1__MRDUR_FL, sof_w1));
+ rx_params->bbf = BF_GET (PBPROC_FC_EOC_SOF_W1__BBF, sof_w1);
+ rx_params->dcppcf = false;
+ rx_params->rsr = false;
+ rx_params->mfs_cmd_mme = MFS_FSM_CMD_NOP;
+ rx_params->mfs_cmd_data = MFS_FSM_CMD_NOP;
+ fc_ok = true;
+ }
+#endif
else
{
/** FC is not for us, it will be ignored. */
@@ -234,8 +292,55 @@ static bool ARCH_ILRAM
pbproc_fhfc_parse_rsof (pbproc_t *ctx, const pbproc_fc_t *fc_av)
{
bool fc_ok = false;
+#if CONFIG_MAC_PBPROC_EOC_FC
+ pbproc_rx_params_t *rx_params = &ctx->recv_mpdu.rx_params;
+ u32 sof_w0 = fc_av->words[0];
+ rx_params->snid = BF_GET (PBPROC_FC_EOC_RSOF_W0__SNID, sof_w0);
+ if (!BF_GET (PBPROC_FC_EOC_RSOF_W0__ACCESS, sof_w0)
+ && (rx_params->snid == ctx->alloc.snid)
+ && ctx->prep_mpdu.valid
+ && ctx->prep_mpdu.bbf
+ && (fc_av->rsof.dtei == ctx->prep_mpdu.dtei))
+ {
+ rx_params->tei = BF_GET (PBPROC_FC_EOC_RSOF_W0__DTEI, sof_w0);
+ rx_params->dtei = MAC_TEI_CCO_DEF;
+ u32 sof_w2 = fc_av->words[2];
+ rx_params->bcast = false;
+ rx_params->multi_net_bcast = false;
+ rx_params->eks = ctx->prep_mpdu.eks;
+ ctx->recv_mpdu.rx_params.fl_tck = MAC_FL_TO_TCK (
+ BF_GET (PBPROC_FC_EOC_RSOF_W0__RSOF_FL_AV, sof_w0));
+ rx_params->num_sym = BF_GET (PBPROC_FC_EOC_RSOF_W0__NUM_SYM, sof_w0);
+ rx_params->mpdu_cnt = 0;
+ rx_params->bdf = BF_GET (PBPROC_FC_EOC_RSOF_W2__BDF, sof_w2);
+ rx_params->hp10df = false;
+ rx_params->hp11df = false;
+ rx_params->mfs_cmd_data = MFS_FSM_CMD_NOP;
+ rx_params->mfs_cmd_mme = MFS_FSM_CMD_NOP;
+ rx_params->sound = false;
+ rx_params->ble = 0;
+ rx_params->pb_size = BF_GET (PBPROC_FC_EOC_RSOF_W2__PBSZ, sof_w2)
+ ? PHY_PB_SIZE_136 : PHY_PB_SIZE_520;;
+ rx_params->cfp = ctx->access.cfp;
+ rx_params->tmi_av = BF_GET (PBPROC_FC_EOC_RSOF_W2__TMI_AV, sof_w2);
+ rx_params->bbf = false;
+ rx_params->lid = BF_GET (PBPROC_FC_EOC_RSOF_W2__LID, sof_w2);
+ u32 sof_w3 = fc_av->words[3];
+ u8 sppb = BF_GET (PBPROC_FC_EOC_RSOF_W3__SPPB, sof_w3);
+ rx_params->pending_seg_info = sppb >> 4;
+ if ((sppb & 0xf) != 0xf)
+ {
+ /* Support old stations. */
+ rx_params->lid = ctx->prep_mpdu.lid != MAC_LID_NONE
+ ? ctx->prep_mpdu.lid : MAC_LLID_MIN;
+ rx_params->pending_seg_info = sppb ? 1 : 0;
+ }
+ fc_ok = true;
+ }
+#else
/* For the moment, this function returns an error everytime because we do
* not handle RSOFs. So they will be processed as frames not for us. */
+#endif
return fc_ok;
}
@@ -279,8 +384,13 @@ pbproc_fhfc_rsof (pbproc_t *ctx, u32 rx_date, const pbproc_fc_t *fc_av)
* it will be a SACK or a SOF. */
ctx->stats.rx_nfu++;
phy_rx_prepare_short (ctx->phy);
+#if CONFIG_MAC_PBPROC_EOC_FC
+ u32 next_date = rx_date + ctx->times.pre_fcs_tck
+ + MAC_FL_TO_TCK (fc_av->rsof.rsof_fl_av);
+#else
u32 next_date = rx_date + ctx->times.pre_fcs_tck
+ PBPROC_FC_RSOF_FL_AV_TO_TCK (fc_av->rsof.rsof_fl_av);
+#endif
ca_access_vcs_restart_eifs (ctx->ca, next_date);
phy_rx_activate (ctx->phy, false, next_date, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
@@ -349,7 +459,16 @@ pbproc_fhfc_sound (pbproc_t *ctx, u32 rx_date, const pbproc_fc_sound_t *sound)
{
if (sound->access == false
&& sound->snid == ctx->alloc.snid
+#if CONFIG_MAC_PBPROC_EOC_FC
+ && ((sound->dtei == ctx->config->tei && !sound->direction)
+ || (MAC_TEI_IS_EOC_CCO(ctx->config->tei)
+ && sound->direction
+ && ctx->prep_mpdu.valid
+ && ctx->prep_mpdu.bbf
+ && sound->dtei == ctx->prep_mpdu.dtei))
+#else
&& sound->dtei == ctx->config->tei
+#endif
&& !sound->saf
&& ((sound->src <= TONEMAP_SRC_TMI_MAX
&& sound->src >= TONEMAP_SRC_TMI_MIN)
@@ -389,7 +508,12 @@ pbproc_fhfc_bad (pbproc_t *ctx, u32 rx_date)
{
dbg_claim (ctx);
phy_rx_prepare_short (ctx->phy);
- ca_access_vcs_restart_eifs (ctx->ca, rx_date);
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ /* We call this function only to have a EoC reschedule.
+ * As scheduling is done in ca_access_compute. */
+ ca_access_vcs_restart (ctx->ca, rx_date + ctx->times.max_fl_tck);
+ else
+ ca_access_vcs_restart_eifs (ctx->ca, rx_date);
phy_rx_activate (ctx->phy, false, rx_date + ctx->times.pre_fcs_tck
+ PHY_RX_ACTIVATE_DELAY_AFTER_SHORT_TCK, true);
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
diff --git a/cesar/mac/pbproc/src/fsm_rx_beacon.c b/cesar/mac/pbproc/src/fsm_rx_beacon.c
index c9caa57e48..9fa02a5638 100644
--- a/cesar/mac/pbproc/src/fsm_rx_beacon.c
+++ b/cesar/mac/pbproc/src/fsm_rx_beacon.c
@@ -26,7 +26,11 @@ pbproc_frbe_init (pbproc_t *ctx)
CALLBACK (pbproc_frbe__rx_beacon__pbdma);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_frbe__handle (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_beacon_t *beacon)
{
@@ -46,7 +50,8 @@ pbproc_frbe__handle (pbproc_t *ctx, u32 rx_date,
+ MAC_B2BIFS_TCK;
ctx->recv_mpdu.ack_date = rx_date + flp_tck;
/* Ignore frames ending after the allocation, handle pool exhaustion. */
- if ((!ctx->alloc.merge
+ if ((!CONFIG_MAC_PBPROC_EOC_FC
+ && !ctx->alloc.merge
&& less_mod2p32 (ctx->alloc.end_date + MAC_TOLERANCE_TCK,
ctx->recv_mpdu.ack_date - MAC_B2BIFS_TCK))
|| ctx->rx_pool_size < 1)
@@ -84,7 +89,11 @@ pbproc_frbe__handle (pbproc_t *ctx, u32 rx_date,
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_RX_BEACON);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_frbe__rx_beacon__pbdma (pbproc_t *ctx)
{
dbg_claim (ctx);
diff --git a/cesar/mac/pbproc/src/fsm_rx_data.c b/cesar/mac/pbproc/src/fsm_rx_data.c
index f54629f1ac..ba75a36321 100644
--- a/cesar/mac/pbproc/src/fsm_rx_data.c
+++ b/cesar/mac/pbproc/src/fsm_rx_data.c
@@ -33,7 +33,11 @@ pbproc_frda_vcs_restart (pbproc_t *ctx);
* Anticipate SACK sending for hybrid mode.
* \param ctx pbproc context
*/
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+static inline void
+#else
static void
+#endif
pbproc_frda_send_sack_anticip (pbproc_t *ctx);
/**
@@ -85,6 +89,56 @@ pbproc_frda_init (pbproc_t *ctx)
CALLBACK (pbproc_frda__rx_burst__access);
}
+#if CONFIG_MAC_COMMON_EOC_SCHED
+/**
+ * The number of active stations which change the poll behavior, under this
+ * value, all stations are polled at each new beacon period.
+ */
+#define PBPROC_STA_ACTIVE_CHANGE_POLL_ALGO 4
+#define PBPROC_EMPTY_POLL_SPC_ALGO 1
+
+static inline void
+pbproc_next_poll_update (pbproc_t *ctx)
+{
+ /* examine only unicast frames */
+ if (MAC_TEI_IS_STA (ctx->prep_mpdu.dtei))
+ {
+ sta_t *sta = mac_store_sta_get_noref (ctx->store,
+ ctx->prep_mpdu.dtei);
+ /* check last poll */
+ if (sta)
+ {
+ u32 bp_delay [] = {0, 0, 1, 1, 2, 2, 3};
+ if (!ctx->recv_mpdu.pb_nb && !ctx->prep_mpdu.burst_seg_nb)
+ {
+ if (sta->empty_poll < COUNT (bp_delay))
+ sta->empty_poll++;
+ }
+ else
+ {
+ sta->empty_poll = 0;
+ }
+ /* Poll now. */
+ sta->bp_before_poll = 0;
+ sta->sppb = ctx->recv_mpdu.rx_params.pending_seg_info;
+ if (ca_sta_active_nb (ctx->ca)
+ < PBPROC_STA_ACTIVE_CHANGE_POLL_ALGO
+ && sta->empty_poll > PBPROC_EMPTY_POLL_SPC_ALGO)
+ {
+ /* Wait one beacon period before polling. */
+ sta->bp_before_poll += 1;
+ }
+ else
+ {
+ /* Update bp_before_poll. */
+ sta->bp_before_poll += bp_delay [sta->empty_poll];
+ }
+ ca_sta_update (ctx->ca, sta);
+ }
+ }
+}
+#endif
+
void ARCH_ILRAM
pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
{
@@ -101,6 +155,9 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
&& rx_params->dtei == ctx->config->tei;
/* PB Size. */
pb_size = rx_params->pb_size;
+#if CONFIG_MAC_PBPROC_EOC_FC
+ ctx->recv_mpdu.send_sack = true;
+#endif
/* Ignore frames ending after the allocation. */
uint fl_tck = rx_params->fl_tck;
if (!ctx->alloc.merge
@@ -174,7 +231,7 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
pb_nb = ((symb_nb - 1) * tm->bits_per_symbol + bits_per_pb)
/ bits_per_pb;
/* Stop if no PB. */
- if (!pb_nb)
+ if ((!CONFIG_MAC_PBPROC_EOC_FC || symb_nb > 0) && !pb_nb)
{
ctx->stats.rx_data_empty++;
pbproc_frda_error (ctx, rx_date, wack,
@@ -247,8 +304,16 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
/* First thing to do: unblock the hardware. */
if (rx_params->tmi_av >= PHY_MOD_ROBO_NB)
phy_set_tonemap (ctx->phy, tm->tmdma_desc_head);
- phy_rx_prepare (ctx->phy, pb_nb, tm->phy_combo_params[pb_size],
- tm->gil, symb_nb, tm->tcc_halfit);
+ if (!CONFIG_MAC_PBPROC_EOC_FC || pb_nb)
+ {
+ phy_rx_prepare (ctx->phy, pb_nb, tm->phy_combo_params[pb_size],
+ tm->gil, symb_nb, tm->tcc_halfit);
+ }
+ else
+ {
+ phy_rx_prepare_short (ctx->phy);
+ ctx->stats.rx_data_empty++;
+ }
/* Save received MPDU parameters. */
ctx->recv_mpdu.rx_params.preamble_ntb = rx_date
+ ctx->config->ntb_offset_tck;
@@ -297,8 +362,36 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
else
pb_it = pb_nb;
ctx->recv_mpdu.pb_head = pool;
- phy_pbdma_start (ctx->phy, bypass_aes, key, pb_nb, pb_it, &pool->phy_pb,
- &ctx->recv_mpdu.chandata_head->phy_pb.chandata, true);
+ if (!CONFIG_MAC_PBPROC_EOC_FC || pb_nb)
+ phy_pbdma_start (ctx->phy, bypass_aes, key, pb_nb, pb_it, &pool->phy_pb,
+ &ctx->recv_mpdu.chandata_head->phy_pb.chandata, true);
+#if CONFIG_MAC_COMMON_EOC_SCHED
+ if (MAC_TEI_IS_EOC_CCO (ctx->config->tei))
+ pbproc_next_poll_update (ctx);
+ else if (ctx->config->tei == rx_params->dtei)
+ ctx->polled = true;
+#endif
+#if CONFIG_MAC_PBPROC_EOC_FC
+ rx_params->agc_gain = phy_rx_agc_gain (ctx->phy);
+ bool near_end_of_alloc = false;
+ /* Check SOF/RSOF do not overflow allocation. */
+ if (!ctx->alloc.merge
+ && less_mod2p32 (ctx->alloc.end_date, ctx->recv_mpdu.ack_date
+ + MAC_CF_SOF_RSOF_IFS_TCK
+ + (rx_params->bbf ? rx_params->mrdur_tck
+ : (2 * ctx->times.pre_fcs_tck
+ + MAC_RIFS_DEFAULT_TCK))))
+ {
+ near_end_of_alloc = true;
+ if (rx_params->bbf)
+ ctx->stats.rx_rsof_out_of_alloc++;
+ }
+ /* Determine if a SACK must be sent. */
+ ctx->recv_mpdu.send_sack = wack
+ && (!rx_params->cfp
+ || (!rx_params->bbf && MAC_TEI_IS_EOC_STA (rx_params->dtei))
+ || near_end_of_alloc);
+#endif
/* Get AGC gain value for this MPDU. */
rx_params->agc_gain = phy_rx_agc_gain (ctx->phy);
/* Program VCS. */
@@ -312,16 +405,27 @@ pbproc_frda__handle (pbproc_t *ctx, u32 rx_date)
pbproc_fsm_change_state (ctx, sack_last_pb
? PBPROC_FSM_STATE_RX_DATA_WACK
: PBPROC_FSM_STATE_RX_DATA_WACK_LAST_PB);
+ if (CONFIG_MAC_PBPROC_EOC_FC && !pb_nb)
+ {
+ u32 status_word = 0;
+ ctx->pbdma_status = PHY_PBDMA_STATUS (status_word);
+ pbproc_frda__rx_data_wack_last_pb__pbdma(ctx); /* simulation */
+ }
ctx->stats.rx_data_wack++;
}
else
{
/* Wait end of frame. */
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_RX_DATA_WOACK);
+ if (CONFIG_MAC_PBPROC_EOC_FC && !pb_nb)
+ pbproc_frda__rx_data_woack__pbdma(ctx); /* simulation */
ctx->stats.rx_data_woack++;
}
- /* Signal received traffic. */
- GPIO_SET (LED_TRAFFIC, 1);
+ if (!CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Signal received traffic. */
+ GPIO_SET (LED_TRAFFIC, 1);
+ }
}
void ARCH_ILRAM
@@ -348,7 +452,11 @@ pbproc_frda__rx_data_wack_last_pb__pbdma (pbproc_t *ctx)
dbg_claim (ctx);
uint mpdu_cnt = ctx->recv_mpdu.rx_params.mpdu_cnt;
/* Prepare FC 1.0 in advance. */
+#if CONFIG_MAC_PBPROC_EOC_FC
+ if (ctx->recv_mpdu.send_sack && mpdu_cnt == 0)
+#else
if (mpdu_cnt == 0)
+#endif
pbproc_frda_send_sack_anticip (ctx);
/* Prepare SACKD. */
ctx->recv_mpdu.sackd.any_pb_crc_error =
@@ -391,7 +499,11 @@ pbproc_frda__rx_data_wack_last_pb__pbdma (pbproc_t *ctx)
}
/* TODO: Handle bidir. */
/* Send SACK if not a burst MPDU. */
+#if CONFIG_MAC_PBPROC_EOC_FC
+ if (ctx->recv_mpdu.send_sack && mpdu_cnt == 0)
+#else
if (mpdu_cnt == 0)
+#endif
pbproc_frda_send_sack (ctx);
/* Unchain and give received frame to upper layer. */
pbproc_frda_commit (ctx);
@@ -417,6 +529,11 @@ static void ARCH_ILRAM
pbproc_frda_commit (pbproc_t *ctx)
{
dbg_claim (ctx);
+ if (CONFIG_MAC_PBPROC_EOC_FC && !ctx->recv_mpdu.pb_nb)
+ {
+ /* Early return from empty message. */
+ return;
+ }
if (!ctx->recv_mpdu.drop)
{
pbproc_rx_desc_t *rx = ctx->recv_mpdu.rx_desc;
@@ -442,7 +559,11 @@ pbproc_frda_commit (pbproc_t *ctx)
dbg_invalid_ptr (ctx->recv_mpdu.chandata_head);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_frda__rx_burst__rx_fc (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_t *fc_av)
{
@@ -451,7 +572,11 @@ pbproc_frda__rx_burst__rx_fc (pbproc_t *ctx, u32 rx_date,
pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_frda__rx_burst__access (pbproc_t *ctx)
{
dbg_claim (ctx);
@@ -469,6 +594,7 @@ pbproc_frda_sackd_init (pbproc_t *ctx)
/* Clear current SACKD if this frame is not part of the previous burst. */
bool reinit = false;
pbproc_sackd_t *sackd = &ctx->recv_mpdu.sackd;
+ /* no burst, always reset sackd fields */
if (!sackd->valid
|| sackd->tei != rx_params->tei
|| sackd->lid != rx_params->lid
@@ -492,13 +618,21 @@ pbproc_frda_sackd_init (pbproc_t *ctx)
sackd->last_mpdu_cnt = rx_params->mpdu_cnt;
/* Initialise SACKD preparation. */
sackd->any_pb_crc_error = false;
- pbproc_sacki_enc_init (&sackd->sacki_enc,
- PBPROC_FC_SACK_SACKI_BITS
- - (MAC_LID_IS_PLID (rx_params->lid) ? 4 : 0),
- reinit);
+ if (!CONFIG_MAC_PBPROC_EOC_FC)
+ pbproc_sacki_enc_init (&sackd->sacki_enc,
+ PBPROC_FC_SACK_SACKI_BITS
+ - (MAC_LID_IS_PLID (rx_params->lid) ? 4 : 0),
+ reinit);
+ else
+ pbproc_sacki_enc_init (&sackd->sacki_enc, PBPROC_FC_SACK_SACKI_BITS,
+ reinit);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+static void
+#else
static void ARCH_ILRAM
+#endif
pbproc_frda_error (pbproc_t *ctx, u32 rx_date,
bool wack, uint sacki_uniform)
{
@@ -509,6 +643,11 @@ pbproc_frda_error (pbproc_t *ctx, u32 rx_date,
/* ACK date. */
ctx->recv_mpdu.ack_date = rx_date + ctx->times.pre_fcs_tck
+ ctx->recv_mpdu.rx_params.fl_tck;
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Prevent reverse response in error state. */
+ ctx->recv_mpdu.rx_params.bbf = false;
+ }
/* With acknowledge? */
uint mpdu_cnt = ctx->recv_mpdu.rx_params.mpdu_cnt;
if (wack)
@@ -535,7 +674,11 @@ pbproc_frda_error (pbproc_t *ctx, u32 rx_date,
ctx->stats.rx_data_error++;
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+static inline void
+#else
static void ARCH_ILRAM
+#endif
pbproc_frda_send_sack_anticip (pbproc_t *ctx)
{
dbg_claim (ctx);
@@ -610,9 +753,29 @@ pbproc_frda_vcs_restart (pbproc_t *ctx)
/* Burst? */
if (ctx->recv_mpdu.rx_params.mpdu_cnt == 0)
{
+#if CONFIG_MAC_PBPROC_EOC_FC
+ /* Check if this is a reverse transmission
+ * else do ordinary sack confirmation, only STA context could use */
+ if (ctx->recv_mpdu.rx_params.bbf && !ctx->recv_mpdu.send_sack)
+ {
+ u32 access_date = ctx->recv_mpdu.ack_date
+ + MAC_CF_SOF_RSOF_IFS_TCK;
+ ca_access_reprogram (ctx->ca, access_date,
+ ctx->recv_mpdu.rx_params.mrdur_tck,
+ ctx->recv_mpdu.rx_params.tei);
+ }
+ else
+ /* Prepare for next MPDU. */
+ /* if there is no SACK in tdma use shorter time */
+ ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date +
+ (!ctx->recv_mpdu.send_sack ?
+ MAC_CF_RSOF_SOF_IFS_TCK :
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK));
+#else
/* Prepare for next MPDU. */
ca_access_vcs_restart (ctx->ca, ctx->recv_mpdu.ack_date
+ ctx->times.pre_fcs_tck + MAC_CIFS_TCK);
+#endif
}
else
{
diff --git a/cesar/mac/pbproc/src/fsm_rx_sound.c b/cesar/mac/pbproc/src/fsm_rx_sound.c
index bcc2e22653..8b381b630f 100644
--- a/cesar/mac/pbproc/src/fsm_rx_sound.c
+++ b/cesar/mac/pbproc/src/fsm_rx_sound.c
@@ -41,6 +41,9 @@ pbproc_frso_init (pbproc_t *ctx)
* \return true if sound is completed
*/
static bool
+#if CONFIG_MAC_PBPROC_EOC_FC
+__attribute__ ((noinline))
+#endif
pbproc_frso_sound_complete (sta_t *sta, uint src, int int_group)
{
if (sta)
@@ -73,6 +76,25 @@ pbproc_frso__handle (pbproc_t *ctx, u32 rx_date,
{
dbg_claim (ctx);
dbg_claim (sound);
+#if !CONFIG_MAC_PBPROC_EOC_FC
+ uint tei = sound->stei;
+#else
+ uint tei = sound->direction ? sound->dtei : MAC_TEI_CCO_DEF;
+ if (MAC_TEI_IS_EOC_STA (ctx->config->tei))
+ ctx->polled = true;
+#if CONFIG_MAC_COMMON_EOC_SCHED
+ else /* cco */
+ {
+ sta_t *sta = mac_store_sta_get_noref (ctx->store, ctx->prep_mpdu.dtei);
+ if (sta)
+ {
+ sta->empty_poll = 0;
+ sta->bp_before_poll = 0;
+ ca_sta_update (ctx->ca, sta);
+ }
+ }
+#endif
+#endif
/* Update stats. */
ctx->stats.rx_sound++;
/* Get tonemap. */
@@ -118,7 +140,7 @@ pbproc_frso__handle (pbproc_t *ctx, u32 rx_date,
/* Unblock hardware. */
phy_rx_prepare_sound (ctx->phy, 1, tm->phy_combo_params[pb_size],
tm->gil, symb_nb);
- sta_t *sta = mac_store_sta_get_noref (ctx->store, sound->stei);
+ sta_t *sta = mac_store_sta_get_noref (ctx->store, tei);
/* Match the frame on the corresponding interval. */
int_group = pbproc_get_interval_group (sta,
rx_date + ctx->times.pre_fcs_tck
@@ -141,19 +163,26 @@ pbproc_frso__handle (pbproc_t *ctx, u32 rx_date,
ctx->recv_mpdu.rx_params.preamble_ntb = rx_date
+ ctx->config->ntb_offset_tck;
ctx->recv_mpdu.rx_params.fl_tck = fl_tck;
- ctx->recv_mpdu.rx_params.tei = sound->stei;
ctx->recv_mpdu.rx_params.lid = sound->lid;
ctx->recv_mpdu.rx_params.snid = sound->snid;
ctx->recv_mpdu.rx_params.bcast = false;
- ctx->recv_mpdu.rx_params.cfp = sound->cfs;
ctx->recv_mpdu.rx_params.multi_net_bcast = false;
ctx->recv_mpdu.rx_params.sound = true;
ctx->recv_mpdu.rx_params.eks = MAC_EKS_CLEAR;
- ctx->recv_mpdu.rx_params.pending_seg_info = sound->ppb;
ctx->recv_mpdu.rx_params.ble = 0;
ctx->recv_mpdu.rx_params.pb_size = pb_size;
ctx->recv_mpdu.rx_params.tmi_av = mod;
+#if !CONFIG_MAC_PBPROC_EOC_FC
+ ctx->recv_mpdu.rx_params.tei = sound->stei;
+ ctx->recv_mpdu.rx_params.pending_seg_info = sound->ppb;
ctx->recv_mpdu.rx_params.bdf = sound->bdf;
+ ctx->recv_mpdu.rx_params.cfp = sound->cfs;
+#else
+ ctx->recv_mpdu.rx_params.pending_seg_info = 0;
+ ctx->recv_mpdu.rx_params.bdf = true;
+ ctx->recv_mpdu.rx_params.cfp = true;
+ ctx->recv_mpdu.rx_params.tei = tei;
+#endif
ctx->recv_mpdu.rx_params.hp10df = false;
ctx->recv_mpdu.rx_params.hp11df = false;
ctx->recv_mpdu.rx_params.mfs_cmd_data = MFS_FSM_CMD_NOP;
@@ -213,6 +242,7 @@ pbproc_frso__rx_sound__pbdma (pbproc_t *ctx)
phy_tx_fc10 (ctx->phy, ctx->recv_mpdu.ack_date, 0);
/* Prepare SOUND acknowledgment. */
pbproc_fc_t fc;
+#if !CONFIG_MAC_PBPROC_EOC_FC
fc.words[0] = BF_FILL (
PBPROC_FC_SOUND_W0,
(DT_AV, PBPROC_FC_DT_SOUND),
@@ -240,6 +270,31 @@ pbproc_frso__rx_sound__pbdma (pbproc_t *ctx)
fc.words[3] = BF_FILL (
PBPROC_FC_SOUND_W3,
(RESERVED2, 0));
+#else
+ fc.words[0] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W0,
+ (DT_AV, PBPROC_FC_DT_SOUND),
+ (ACCESS, false),
+ (SNID, ctx->alloc.snid),
+ (DTEI, MAC_TEI_IS_EOC_CCO(ctx->config->tei)
+ ? ctx->recv_mpdu.rx_params.tei : ctx->config->tei),
+ (FL_AV, 0),
+ (LID, ctx->recv_mpdu.rx_params.lid));
+ fc.words[1] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W1,
+ (SACKT0, PBPROC_FC_SACKT_UNIFORM),
+ (DIRECTION, !MAC_TEI_IS_EOC_CCO(ctx->config->tei)),
+ (PBSZ, false),
+ (SAF, true),
+ (SCF, ctx->recv_mpdu.rx_params.sound_complete),
+ (REQ_TM, 0),
+ (MPDU_CNT, 0),
+ (SACKI0, PBPROC_FC_SACKI_UNIFORM_NOT_AVAILABLE));
+ fc.words[2] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W2,
+ (SACKI1, 0));
+ fc.words[3] = 0;
+#endif
/* Send it. */
phy_tx_param_short (ctx->phy,
PHY_FC_MODE (hybrid, ctx->config->fc_symbols_nb));
@@ -266,7 +321,11 @@ pbproc_frso__rx_sound__pbdma (pbproc_t *ctx)
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+static void
+#else
static void ARCH_ILRAM_PRIO (2)
+#endif
pbproc_frso_vcs_restart (pbproc_t *ctx)
{
dbg_claim (ctx);
diff --git a/cesar/mac/pbproc/src/fsm_top.c b/cesar/mac/pbproc/src/fsm_top.c
index 23b7cf54d1..9416482d83 100644
--- a/cesar/mac/pbproc/src/fsm_top.c
+++ b/cesar/mac/pbproc/src/fsm_top.c
@@ -10,6 +10,8 @@
* \brief FSM top part, handle idle and generic transitions.
* \ingroup mac_pbproc
*/
+#include "config/av.h"
+
#include "common/std.h"
#include "hal/gpio/gpio.h"
@@ -74,11 +76,13 @@ pbproc_ftop_aifs (pbproc_t *ctx)
&& lesseq_mod2p32 (ctx->detect.beacon_detect_expiration_date,
now))
ctx->detect.beacon_detected = false;
- if (ctx->detect.hp10_detected
+ if (!CONFIG_AV_ONLY_MODE
+ && ctx->detect.hp10_detected
&& lesseq_mod2p32 (ctx->detect.hp10_detect_date
+ PBPROC_HP_DETECT_DELAY_TCK, now))
ctx->detect.hp10_detected = false;
- if (ctx->detect.hp11_detected
+ if (!CONFIG_AV_ONLY_MODE
+ && ctx->detect.hp11_detected
&& lesseq_mod2p32 (ctx->detect.hp11_detect_date
+ PBPROC_HP_DETECT_DELAY_TCK, now))
ctx->detect.hp11_detected = false;
@@ -163,6 +167,9 @@ pbproc_ftop__idle__access (pbproc_t *ctx)
if (!ctx->prep_mpdu.valid)
{
PBPROC_TRACE (FTOP_TX_INVALID);
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ ca_backoff_deferred (ctx->ca,
+ ctx->access.duration_tck / MAC_SLOT_TCK);
ca_access_done (ctx->ca);
ca_access_defer (ctx->ca, ctx->access.access_date);
ctx->stats.tx_invalid++;
diff --git a/cesar/mac/pbproc/src/fsm_tx_data.c b/cesar/mac/pbproc/src/fsm_tx_data.c
index 29cfad3506..a23b78a38a 100644
--- a/cesar/mac/pbproc/src/fsm_tx_data.c
+++ b/cesar/mac/pbproc/src/fsm_tx_data.c
@@ -49,15 +49,27 @@ pbproc_ftda__handle (pbproc_t *ctx)
dbg_claim (ctx);
if (PHY_FC_MODE_IS_HYBRID (ctx->prep_mpdu.fc_mode))
phy_tx_fc10 (ctx->phy, ctx->prep_mpdu.tx_date, ctx->prep_mpdu.fc10);
- phy_pbdma_start (ctx->phy, ctx->prep_mpdu.bypass_aes, ctx->prep_mpdu.nek,
- mpdu->pb_nb_total,
- ctx->prep_mpdu.wack ? 0 : mpdu->pb_nb_total,
- &mpdu->main_head->phy_pb, NULL, false);
- if (mpdu->tmi >= PHY_MOD_ROBO_NB)
- phy_set_tonemap (ctx->phy, ctx->prep_mpdu.tonemap);
- phy_tx_param (ctx->phy, ctx->prep_mpdu.fc_mode,
- ctx->prep_mpdu.phy_combo_params, ctx->prep_mpdu.gil,
- ctx->prep_mpdu.symb_nb);
+#if CONFIG_MAC_PBPROC_EOC_FC
+ if (mpdu->pb_nb_total)
+#endif
+ {
+ phy_pbdma_start (ctx->phy, ctx->prep_mpdu.bypass_aes,
+ ctx->prep_mpdu.nek, mpdu->pb_nb_total,
+ ctx->prep_mpdu.wack ? 0 : mpdu->pb_nb_total,
+ &mpdu->main_head->phy_pb, NULL, false);
+ if (mpdu->tmi >= PHY_MOD_ROBO_NB)
+ phy_set_tonemap (ctx->phy, ctx->prep_mpdu.tonemap);
+ phy_tx_param (ctx->phy, ctx->prep_mpdu.fc_mode,
+ ctx->prep_mpdu.phy_combo_params, ctx->prep_mpdu.gil,
+ ctx->prep_mpdu.symb_nb);
+ }
+#if CONFIG_MAC_PBPROC_EOC_FC
+ else
+ {
+ phy_tx_param_short (ctx->phy, ctx->prep_mpdu.fc_mode);
+ ctx->stats.tx_data_empty++;
+ }
+#endif
bool prp = ctx->access.prp && !ctx->prep_mpdu.rts_cts;
phy_tx_frame (ctx->phy, ctx->prep_mpdu.tx_date, true, prp,
ctx->prep_mpdu.fc_av.words);
@@ -84,12 +96,24 @@ pbproc_ftda__tx_wait_access_conf__rx_fc (pbproc_t *ctx, u32 rx_date,
ctx->stats.tx_data_cancel++;
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_ftda__tx_wait_access_conf__access (pbproc_t *ctx)
{
dbg_claim (ctx);
pbproc_prep_mpdu_cancel_burst (ctx);
- pbproc_ftop__idle__access (ctx);
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Prepare next schedule, start access timer. */
+ ca_access_vcs_restart (ctx->ca, phy_date ()
+ + ctx->times.pre_fcs_tck + MAC_CIFS_TCK);
+ pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
+ }
+ else
+ pbproc_ftop__idle__access (ctx);
ctx->stats.prp_lost++;
ctx->stats.tx_data_cancel++;
}
@@ -98,11 +122,15 @@ void ARCH_ILRAM
pbproc_ftda__tx_wait_access_conf__access_conf (pbproc_t *ctx)
{
dbg_claim (ctx);
- /* Start DMA. */
- phy_tx_prepare (ctx->phy);
- /* Chain remaining PB. */
- pbproc_prep_mpdu_chain (ctx);
- uint stats_num_pbs = ctx->prep_mpdu.current->pb_nb_total;
+ uint pb_nb_total = ctx->prep_mpdu.current->pb_nb_total;
+ /* Check PB total. */
+ if (pb_nb_total || !CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Start DMA. */
+ phy_tx_prepare (ctx->phy);
+ /* Chain remaining PB. */
+ pbproc_prep_mpdu_chain (ctx);
+ }
if (ctx->prep_mpdu.mpdu_count != 0)
{
phy_access_timer_cancel (ctx->phy);
@@ -135,6 +163,7 @@ pbproc_ftda__tx_wait_access_conf__access_conf (pbproc_t *ctx)
}
else
{
+ ctx->prep_mpdu.main_mfs->stats.num_bursts++;
if (ctx->prep_mpdu.wack)
{
/* With ACK. */
@@ -157,17 +186,24 @@ pbproc_ftda__tx_wait_access_conf__access_conf (pbproc_t *ctx)
ctx->stats.tx_data_beacon++;
else
ctx->stats.tx_data_woack++;
+ if (CONFIG_MAC_PBPROC_EOC_FC && pb_nb_total == 0)
+ /* If Short SOF is sent goto tx end, but tx_end is here. */
+ pbproc_ftda__tx_wait_tx_end__pbdma(ctx);
}
- ctx->prep_mpdu.main_mfs->stats.num_bursts++;
}
- /* Update link stats. */
- ctx->prep_mpdu.main_mfs->stats.num_mpdus++;
- ctx->prep_mpdu.main_mfs->stats.num_pbs += stats_num_pbs;
- /* If there is a pending SPOC update and enough time, program it. */
- if (ctx->prep_mpdu.ifs_tck >= PHY_PREPARE_DELAY_TCK)
- pbproc_spoc_schedule_update (ctx, ctx->prep_mpdu.tx_date
- + ctx->prep_mpdu.flp_tck
- - ctx->prep_mpdu.ifs_tck);
+
+ /* in EoC it is possible to prematurely ack prep_mpdu, short msgs */
+ if (!CONFIG_MAC_PBPROC_EOC_FC || ctx->prep_mpdu.valid)
+ {
+ /* Update link stats. */
+ ctx->prep_mpdu.main_mfs->stats.num_mpdus++;
+ ctx->prep_mpdu.main_mfs->stats.num_pbs += pb_nb_total;
+ /* If there is a pending SPOC update and enough time, program it. */
+ if (ctx->prep_mpdu.ifs_tck >= PHY_PREPARE_DELAY_TCK)
+ pbproc_spoc_schedule_update (ctx, ctx->prep_mpdu.tx_date
+ + ctx->prep_mpdu.flp_tck
+ - ctx->prep_mpdu.ifs_tck);
+ }
}
static bool ARCH_ILRAM
@@ -229,6 +265,76 @@ pbproc_ftda_parse_sack (pbproc_t *ctx, const pbproc_fc_t *fc_av,
return fc_ok;
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+
+PRIVATE bool ARCH_ILRAM
+pbproc_ftda_parse_sackd (pbproc_t *ctx, const pbproc_fc_t *fc_av,
+ pbproc_fc_ack_data_t *ack_data)
+{
+ dbg_claim (ack_data);
+ bool valid_ack = false;
+ /* Place for EOC SACKD encapsulated in next frame.
+ * Direction should be as expected; for CCO frame should be from
+ * expected station. STA shouldn't consider RSOF at all. */
+ if (fc_av
+ && fc_av->generic.access == false
+ && fc_av->generic.snid == ctx->alloc.snid
+ && ctx->prep_mpdu.valid)
+ {
+ uint direction = MAC_TEI_IS_EOC_CCO (ctx->config->tei);
+ uint tei = ctx->prep_mpdu.dtei;
+ uint type = fc_av->generic.dt_av;
+ if (type == PBPROC_FC_DT_SOUND)
+ valid_ack = (direction == fc_av->sound.direction)
+ && (!direction || fc_av->sound.dtei == tei);
+ else if (type == PBPROC_FC_DT_SOF)
+ valid_ack = (direction == fc_av->sof.direction)
+ && (!direction || fc_av->sof.dtei == tei);
+ else if (type == PBPROC_FC_DT_RSOF)
+ valid_ack = direction && (fc_av->rsof.dtei == tei);
+ }
+ if (valid_ack)
+ {
+ uint sackt0 = PBPROC_FC_SACKT_NOT_RECEIVED, si[3] = {0, 0, 0}, sil = 0;
+ /* Compute bitmap and size */
+ switch(fc_av->generic.dt_av)
+ {
+ case PBPROC_FC_DT_SOF:
+ sackt0 = fc_av->sof.sackt0;
+ si[0] = fc_av->sof.sacki0;
+ si[1] = fc_av->sof.sacki1;
+ sil = PBPROC_FC_SACKI_EOC_SOF_SIZE;
+ break;
+ case PBPROC_FC_DT_RSOF:
+ sackt0 = fc_av->rsof.sackt0;
+ si[0] = fc_av->rsof.sacki0;
+ si[1] = fc_av->rsof.sacki1;
+ sil = PBPROC_FC_SACKI_EOC_RSOF_SIZE;
+ break;
+ case PBPROC_FC_DT_SOUND:
+ sackt0 = fc_av->sound.sackt0;
+ si[0] = fc_av->sound.sacki0
+ | (fc_av->sound.sacki1 << PBPROC_FC_SACKI_EOC_SOUND_LEFT);
+ si[1] = fc_av->sound.sacki1 >> (32 - PBPROC_FC_SACKI_EOC_SOUND_LEFT);
+ sil = PBPROC_FC_SACKI_EOC_SOUND_SIZE;
+ break;
+ default:
+ dbg_assert_default ();
+ }
+ pbproc_sacki_dec_init (&ack_data->sacki_dec, si[0], si[1], si[2], sil);
+ ack_data->sackt[0] = sackt0;
+ ack_data->sackt[1] = PBPROC_FC_SACKT_NOT_RECEIVED;
+ ack_data->sackt[2] = PBPROC_FC_SACKT_NOT_RECEIVED;
+ ack_data->sackt[3] = PBPROC_FC_SACKT_NOT_RECEIVED;
+ ack_data->rrtl_tck = 0;
+ ack_data->mfs_rsp = MFS_FSM_RSP_NB;
+ ack_data->rxwsz = MFS_WINDOW_SIZE_NB;
+ }
+ return valid_ack;
+}
+
+#endif
+
void ARCH_ILRAM
pbproc_ftda__tx_wait_sackd__rx_fc (pbproc_t *ctx, u32 rx_date,
const pbproc_fc_t *fc_av)
@@ -253,24 +359,66 @@ pbproc_ftda__tx_wait_sackd__rx_fc (pbproc_t *ctx, u32 rx_date,
}
else
{
- //handle_access ();
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ ca_access_vcs_restart (ctx->ca, rx_date
+ + ctx->times.pre_fcs_tck
+ + MAC_CIFS_TCK);
+ pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
+ }
+ else
+ {
+ //handle_access ();
+ }
}
ctx->stats.tx_data_wack_ack++;
}
else
{
- pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
- pbproc_prep_mpdu_cancel_burst (ctx);
- ctx->stats.tx_data_wack_noack++;
+#if CONFIG_MAC_PBPROC_EOC_FC
+ /* Not our SACK, may contain our SACKD. */
+ if (less_mod2p32 (rx_date, ctx->prep_mpdu.tx_date /* TODO chk timeval*/
+ + ctx->prep_mpdu.flp_tck
+ + MAC_FL_TO_TCK (MAC_MAX_FL_MAX_FL))
+ && pbproc_ftda_parse_sackd (ctx, fc_av, &ack_data))
+ {
+ if (!ctx->access.cfp)
+ ca_backoff_success (ctx->ca);
+ pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
+ pbproc_prep_mpdu_ack (ctx, ack_data.sackt, &ack_data.sacki_dec);
+ ctx->stats.tx_data_wack_ack++;
+ }
+ else
+#endif
+ {
+ pbproc_fhfc_handle_fc (ctx, rx_date, fc_av);
+ pbproc_prep_mpdu_cancel_burst (ctx);
+ ctx->stats.tx_data_wack_noack++;
+ }
}
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_ftda__tx_wait_sackd__access (pbproc_t *ctx)
{
dbg_claim (ctx);
+#if CONFIG_MAC_COMMON_EOC_MFS
+ pbproc_prep_mpdu_access_track (ctx);
+#endif
pbproc_prep_mpdu_cancel_burst (ctx);
- pbproc_ftop__idle__access (ctx);
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Prepare next schedule, start access timer. */
+ ca_access_vcs_restart (ctx->ca, phy_date ()
+ + ctx->times.pre_fcs_tck + MAC_CIFS_TCK);
+ pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
+ }
+ else
+ pbproc_ftop__idle__access (ctx);
ctx->stats.tx_data_wack_noack++;
}
@@ -287,7 +435,11 @@ pbproc_ftda__tx_wait_tx_end__pbdma (pbproc_t *ctx)
pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_ftda__tx_burst__access_conf (pbproc_t *ctx)
{
dbg_claim (ctx);
diff --git a/cesar/mac/pbproc/src/fsm_tx_sound.c b/cesar/mac/pbproc/src/fsm_tx_sound.c
index b43fed10ca..4381f88b28 100644
--- a/cesar/mac/pbproc/src/fsm_tx_sound.c
+++ b/cesar/mac/pbproc/src/fsm_tx_sound.c
@@ -63,12 +63,20 @@ pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
&& fc_av->generic.access == false
&& fc_av->generic.snid == ctx->alloc.snid
&& fc_av->sound.saf == true
+#if !CONFIG_MAC_PBPROC_EOC_FC
&& fc_av->sound.stei == prep->dtei
&& fc_av->sound.dtei == prep->stei
+#else
+ && ((fc_av->sound.dtei == prep->dtei && fc_av->sound.direction)
+ || (fc_av->sound.dtei == prep->stei && !fc_av->sound.direction))
+#endif
&& less_mod2p32 (rx_date, prep->tx_date + prep->flp_tck
+ MAC_TOLERANCE_TCK))
{
phy_rx_prepare_short (ctx->phy);
+#if CONFIG_MAC_COMMON_EOC_MFS
+ prep->main_mfs->no_reply_count = 0;
+#endif
/* Handle acknowledgement. */
pbproc_prep_mpdu_sound_ack (ctx, fc_av->sound.scf);
/* Next. */
@@ -82,6 +90,13 @@ pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
else
{
//handle_access ();
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Prepare next schedule, start access timer. */
+ ca_access_vcs_restart (ctx->ca, rx_date
+ + ctx->times.pre_fcs_tck + MAC_CIFS_TCK);
+ pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
+ }
}
/* Update stats. */
ctx->stats.tx_sound_ack++;
@@ -99,16 +114,31 @@ pbproc_ftso__tx_sound_wait_ack__rx_fc (pbproc_t *ctx, u32 rx_date,
}
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void
+#else
void ARCH_ILRAM_PRIO (2)
+#endif
pbproc_ftso__tx_sound_wait_ack__access (pbproc_t *ctx)
{
dbg_claim (ctx);
+#if CONFIG_MAC_COMMON_EOC_MFS
+ pbproc_prep_mpdu_access_track (ctx);
+#endif
/* Cancel transmission. */
pbproc_prep_mpdu_sound_ack (ctx, false);
/* Update backoff. */
pbproc_backoff_lost (ctx);
/* Handle ACCESS. */
- pbproc_ftop__idle__access (ctx);
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* Prepare next schedule, start access timer. */
+ ca_access_vcs_restart (ctx->ca, phy_date () + ctx->times.pre_fcs_tck
+ + MAC_CIFS_TCK);
+ pbproc_fsm_change_state (ctx, PBPROC_FSM_STATE_IDLE);
+ }
+ else
+ pbproc_ftop__idle__access (ctx);
/* Update stats. */
ctx->stats.tx_sound_noack++;
}
diff --git a/cesar/mac/pbproc/src/pbproc.c b/cesar/mac/pbproc/src/pbproc.c
index a20755b749..66881b7b0c 100644
--- a/cesar/mac/pbproc/src/pbproc.c
+++ b/cesar/mac/pbproc/src/pbproc.c
@@ -156,6 +156,9 @@ pbproc_stats_init (pbproc_t *ctx)
PBPROC_STAT (cw_lost);
PBPROC_STAT (aifs);
PBPROC_STAT (rx_out_of_alloc);
+#if CONFIG_MAC_PBPROC_EOC_FC
+ PBPROC_STAT (rx_rsof_out_of_alloc);
+#endif
PBPROC_STAT (rx_pool_shortage);
PBPROC_STAT (rx_handle_fc);
PBPROC_STAT (rx_beacon);
@@ -188,6 +191,10 @@ pbproc_stats_init (pbproc_t *ctx)
PBPROC_STAT (tx_sound);
PBPROC_STAT (tx_sound_ack);
PBPROC_STAT (tx_sound_noack);
+#if CONFIG_MAC_PBPROC_EOC_FC
+ PBPROC_STAT (tx_data_empty);
+ PBPROC_STAT (tx_data_pb_total);
+#endif
#endif /* CONFIG_STATS */
}
@@ -259,6 +266,8 @@ pbproc_init (mac_config_t *config, mac_store_t *store)
/* Setup live indicator. */
GPIO_SETUP (LED_PBPROC_ALIVE, GPIO_DIRECTION_OUT);
GPIO_SET (LED_PBPROC_ALIVE, 1);
+ GPIO_SETUP (LED_PBPROC_WORKING, GPIO_DIRECTION_OUT);
+ GPIO_SET (LED_PBPROC_WORKING, 0);
/* All done! */
PBPROC_TRACE (INIT);
return ctx;
@@ -521,3 +530,17 @@ pbproc_get_interval_group (sta_t *sta, uint offset_tck, uint flp_tck)
return interval_group;
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+void
+pbproc_parameters_adjust (pbproc_t *ctx, bool adjust)
+{
+ dbg_assert (ctx);
+ /* adjust only non-hybrid time */
+ if (adjust)
+ {
+ ctx->times_array[0].max_fl_tck =
+ ctx->times_array[2].max_fl_tck = MAC_MS_TO_TCK (4);
+ }
+}
+#endif
+
diff --git a/cesar/mac/pbproc/src/prep_mpdu.c b/cesar/mac/pbproc/src/prep_mpdu.c
index 5452ae863f..3ab2470ebf 100644
--- a/cesar/mac/pbproc/src/prep_mpdu.c
+++ b/cesar/mac/pbproc/src/prep_mpdu.c
@@ -20,12 +20,13 @@
#include "inc/sacki_dec.h"
#include "inc/mfs.h"
+#include "hal/gpio/gpio.h"
#include "config/mac/pbproc.h"
#include <string.h>
/** Number of prepared PB before ACCESS_CONF. */
-#define PBPROC_PB_START_NB 4
+#define PBPROC_PB_START_NB (CONFIG_MAC_PBPROC_EOC_FC ? 16 : 4)
/**
* Commit MPDU.
@@ -52,8 +53,10 @@ pbproc_prep_mpdu_commit (pbproc_t *ctx, uint mpdu_count,
* Commit FSM changes.
* \param ctx pbproc context
*/
+#if !CONFIG_MAC_PBPROC_EOC_FC
static void
pbproc_prep_mpdu_commit_fsm (pbproc_t *ctx);
+#endif
/**
* Prepare a SOUND MPDU.
@@ -68,8 +71,10 @@ pbproc_prep_mpdu_sound (pbproc_t *ctx, mfs_tx_t *mfs, uint fl_tck);
* Prepare a SHORT MPDU for burst interruption.
* \param ctx pbproc context
*/
+#if !CONFIG_MAC_PBPROC_EOC_FC
static void
pbproc_prep_mpdu_short (pbproc_t *ctx);
+#endif
void
pbproc_prep_mpdu_init (pbproc_t *ctx)
@@ -86,6 +91,58 @@ pbproc_prep_mpdu_init (pbproc_t *ctx)
slist_init (prep->main_commit_return_);
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+/* mfs window_size calculation on tx_side
+ * WARNING: mfs size is already checked against <=0 value.
+ * return value: distance between start PB and end PB in mfs.
+ */
+static inline u16
+pbproc_get_segments_nb (mfs_tx_t *mfs)
+{
+ int distance = mfs->window_size
+ - distance_mod2p16 (mfs->next_ssn, mfs->head->header.ssn)
+ + mfs->seg_nb;
+ /* send at least one segment to other side */
+ if (distance <= 0)
+ return 1;
+ else
+ return (u16)distance;
+}
+
+/**
+ * Compute SPPB value to be sent in FC.
+ * \param ctx pbproc context
+ * \param dtei destination TEI
+ * \param current_mfs MFS being sent
+ * \param current_seg_nb PB being sent on the current MFS
+ * \return SPPB value
+ */
+static u8 ARCH_ILRAM
+pbproc_prep_mpdu_sppb (pbproc_t *ctx, u8 dtei,
+ mfs_tx_t *current_mfs, uint current_seg_nb)
+{
+ int cap;
+ u8 sppb = 0x0f;
+ if (MAC_TEI_IS_STA (dtei))
+ {
+ for (cap = 0; cap < MAC_CAP_NB; cap++)
+ {
+ mfs_tx_t *mfs = mac_store_mfs_get_sta_tx_data_locked (
+ ctx->store, MAC_LLID_MIN + cap, dtei);
+ if (mfs)
+ {
+ int seg_nb = mfs->seg_nb;
+ if (mfs == current_mfs)
+ seg_nb -= current_seg_nb;
+ if (seg_nb)
+ sppb |= 0x10 << cap;
+ }
+ }
+ }
+ return sppb;
+}
+#endif
+
/**
* Prepare a RTS_CTS frame.
* \param ctx pbproc context
@@ -128,7 +185,11 @@ pbproc_prep_rts_cts_fc (pbproc_t *ctx, mfs_tx_t *mfs, uint ack_dtei,
(RESERVED2, 0));
}
+#if CONFIG_MAC_PBPROC_EOC_ILRAM
+void /*ARCH_ILRAM: TODO ugly */
+#else
void ARCH_ILRAM_PRIO (1)
+#endif
pbproc_prep_beacon (pbproc_t *ctx, mfs_tx_t *mfs)
{
ca_access_param_t *access;
@@ -153,7 +214,12 @@ pbproc_prep_beacon (pbproc_t *ctx, mfs_tx_t *mfs)
prep->burst_mpdu_nb = 1;
prep->mpdu_count = 0;
prep->current = &prep->mpdu[0];
+#if CONFIG_MAC_PBPROC_EOC_FC
+ prep->bbf = false;
+ prep->fc_mode = PHY_FC_MODE (false, ctx->config->fc_symbols_nb);
+#else
prep->fc_mode = PHY_FC_MODE (true, ctx->config->fc_symbols_nb);
+#endif
prep->sound_reason_code = TONEMAP_SRC_NULL;
prep->bypass_aes = true;
/* Modulation. */
@@ -193,8 +259,12 @@ pbproc_prep_beacon (pbproc_t *ctx, mfs_tx_t *mfs)
+ tm->bits_per_symbol - 1) / tm->bits_per_symbol;
u32 data_tck = MAC_PAYLOAD_TCK (symb_nb, ctx->symbol_tck[tm->gil]);
prep->ifs_tck = MAC_B2BIFS_TCK;
- uint pre_fcs_tck = ctx->times_array[PBPROC_TIMES_ARRAY_INDEX
- (true, MAC_COEXISTENCE_FULL_HYBRID_MODE)].pre_fcs_tck;
+ uint pre_fcs_tck;
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ pre_fcs_tck = ctx->times.pre_fcs_tck;
+ else
+ pre_fcs_tck = ctx->times_array[PBPROC_TIMES_ARRAY_INDEX
+ (true, MAC_COEXISTENCE_FULL_HYBRID_MODE)].pre_fcs_tck;
prep->flp_tck = pre_fcs_tck + data_tck + MAC_B2BIFS_TCK;
prep->symb_nb = symb_nb;
/* Does it fit? */
@@ -263,7 +333,11 @@ pbproc_prep_beacon (pbproc_t *ctx, mfs_tx_t *mfs)
prep->valid = true;
}
+#if (CONFIG_TRACE && CONFIG_MAC_PBPROC_EOC_ILRAM)
+void
+#else
void ARCH_ILRAM
+#endif
pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
{
ca_access_param_t *access;
@@ -286,6 +360,9 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
access_duration_tck = access->duration_tck;
/* If prepared frame is valid, this is a bursts continuation. */
uint ack_dtei;
+#if CONFIG_MAC_PBPROC_EOC_FC
+ bool rsof_fc = false, authenticated = false, mcf = false, mnbf = false;
+#endif
if (!prep->valid)
{
/* Fill easy fields. Work around Intellon behaviour: they do not
@@ -318,6 +395,26 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
{
prep->tx_date = access->access_date;
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+ rsof_fc = access->cfp && ctx->recv_mpdu.rx_params.bbf;
+ authenticated = true;
+ mcf = mfs->common.bcast;
+ mnbf = mfs->common.bcast && (mfs->common.mme || prep->unassociated);
+ /* No way to respect such a short schedule, give up. This is needed
+ * because later code will almost always send something in EoC. */
+ if (access_duration_tck < 2 * times->pre_fcs_tck
+ + MAC_RIFS_DEFAULT_TCK)
+ return;
+ /* dont create rsof while in unassoc state.
+ * avoid conflicts with station removal */
+ if (rsof_fc && ctx->config->tei == MAC_TEI_UNASSOCIATED)
+ {
+ /* set fields used in EoC for SACK + bidirectional */
+ ctx->recv_mpdu.rx_params.bbf = 0;
+ ctx->recv_mpdu.sackd.valid = false;
+ return;
+ }
+#endif
}
else
{
@@ -347,9 +444,16 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
* instead and we always send them in ROBO (see #3988). */
if (!mfs->common.mme && MAC_TEI_IS_STA (prep->dtei))
{
+#if CONFIG_MAC_PBPROC_EOC_FC
+ sta_t *sta = mac_store_sta_get_noref (ctx->store, prep->dtei);
+#else
sta_t *sta = mac_store_sta_get (ctx->store, prep->dtei);
+#endif
if (sta)
{
+#if CONFIG_MAC_PBPROC_EOC_FC
+ authenticated = sta->authenticated;
+#endif
tonemaps_t *tms = sta->tx_tonemaps;
uint default_tmi = tms->default_tmi;
if (default_tmi == TONEMAP_INDEX_INITIAL_START)
@@ -358,7 +462,7 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
sound_reason_code = TONEMAP_SRC_ERROR;
else if (default_tmi == TONEMAP_INDEX_INITIAL_SOUND_COMPLETE)
/* ROBO */;
- else
+ else if (!CONFIG_MAC_PBPROC_EOC_FC || mfs->seg_nb > 0)
{
uint offset_atu = MAC_TCK_TO_ATU (
prep->tx_date + times->pre_fcs_tck
@@ -446,12 +550,19 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
if (tm_data_max_tck < tm->one_pb_data_tck)
tm_data_max_tck = tm->one_pb_data_tck;
}
- blk_release (sta);
+ if (!CONFIG_MAC_PBPROC_EOC_FC)
+ blk_release (sta);
}
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+ /* No sound outside TDMA region in EoC, auth, CE run. */
+ if (!ctx->chandata_nb || !access->cfp || !authenticated)
+ sound_reason_code = TONEMAP_SRC_NULL;
+#else
/* No sound unless a CE is running. */
if (!ctx->chandata_nb)
sound_reason_code = TONEMAP_SRC_NULL;
+#endif
/* Prepare parameters. */
phy_gil_t previous_gil = prep->gil;
prep->phy_combo_params = tm->phy_combo_params[PHY_PB_SIZE_520];
@@ -479,6 +590,12 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
}
else
{
+#if CONFIG_MAC_PBPROC_EOC_FC
+ if (mfs->seg_nb > 0)
+ max_seg_nb = MIN (mfs->seg_nb, pbproc_get_segments_nb (mfs));
+ else
+ max_seg_nb = 0;
+#else
if (mfs->ca_state == CA_MFS_STATE_REMOVED)
max_seg_nb = 0;
else if (mfs->fsm_state == MFS_FSM_CMD_RE_SYNC
@@ -489,7 +606,9 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
max_seg_nb = MIN (mfs->seg_nb, (int) (mfs->window_size
- mfs->holes_seg_nb - prep->burst_seg_nb
- mfs->delta_between_ssn_min));
+#endif
}
+#if !CONFIG_MAC_PBPROC_EOC_FC
/* Early return if no segments. */
if (!max_seg_nb)
{
@@ -497,6 +616,7 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
pbproc_prep_mpdu_short (ctx);
return;
}
+#endif
bits_per_pb = tm->bits_per_pb[PHY_PB_SIZE_520];
/* Do not put more than one segment in the last symbol. Add one symbol if
* this arise. */
@@ -591,6 +711,7 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
&& symb_nb >= 2
&& tmi >= PHY_MOD_ROBO_NB
&& old_max_seg_nb > max_seg_nb + 1
+ && !CONFIG_MAC_PBPROC_EOC_FC
&& data_tck + 25 * 2000 < access_duration_tck)
{
dbg_claim (sound_reason_code == TONEMAP_SRC_NULL);
@@ -618,6 +739,7 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
prep->ifs_tck = rifs_tck;
prep->flp_tck = times->pre_fcs_tck + data_tck + rifs_tck;
prep->symb_nb = symb_nb;
+#if !CONFIG_MAC_PBPROC_EOC_FC
/* Early return if no symbol. */
if (max_seg_nb == 0)
{
@@ -625,6 +747,13 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
pbproc_prep_mpdu_short (ctx);
return;
}
+#else
+ /* Early return if no symbol only in CSMA region or bcast mfs,
+ * else wait for RSOF */
+ if (max_seg_nb == 0 && !access->cfp)
+ return;
+#endif
+#if !CONFIG_MAC_PBPROC_EOC_FC
/* Prepare RTS FC. */
if (prep->rts_cts)
{
@@ -634,8 +763,10 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
/* Invalid FC 1.0, HP 1.0 stations will defer (20 symbols and ROBO). */
prep->rts_fc10 = 0x200000;
}
+#endif
/* Stop here for SOUND. */
- if (sound_reason_code != TONEMAP_SRC_NULL)
+ if (sound_reason_code != TONEMAP_SRC_NULL
+ && (!CONFIG_MAC_PBPROC_EOC_FC || symb_nb))
{
pbproc_prep_mpdu_sound (ctx, mfs, data_tck + rifs_tck);
return;
@@ -646,7 +777,8 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
{
/* No encryption. */
}
- else if (mfs->common.bcast)
+ else if (mfs->common.bcast
+ && (!CONFIG_MAC_PBPROC_EOC_FC || !mfs->common.mme))
{
if (ctx->config->authenticated)
{
@@ -660,7 +792,11 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
}
else if (MAC_TEI_IS_STA (prep->dtei))
{
+#if CONFIG_MAC_PBPROC_EOC_FC
+ sta_t *sta = mac_store_sta_get_noref (ctx->store, prep->dtei);
+#else
sta_t *sta = mac_store_sta_get (ctx->store, prep->dtei);
+#endif
if (sta)
{
if (sta->authenticated)
@@ -677,14 +813,35 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
prep->nek = nek->nek_enc;
}
}
- blk_release (sta);
+ if (!CONFIG_MAC_PBPROC_EOC_FC)
+ blk_release (sta);
}
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+ /* for rsof keep received key type */
+ if (rsof_fc)
+ {
+ eks = ctx->recv_mpdu.rx_params.eks;
+ if (eks != MAC_EKS_CLEAR)
+ {
+ mac_nek_t *nek = ctx->config->nek_mgr.use[0];
+ dbg_claim (nek);
+ if (nek->eks != eks)
+ nek = ctx->config->nek_mgr.use[1];
+ dbg_claim (nek);
+ dbg_claim (nek->in_use);
+ dbg_assert (nek->eks == eks);
+ prep->nek = nek->nek_enc;
+ }
+ }
+ prep->eks = eks; /* Easy life */
+#endif
prep->bypass_aes = eks == MAC_EKS_CLEAR;
// TODO: dbg_assert (mfs->common.mme || !prep->bypass_aes);
/* Data FC. */
prep->main_mfs_cmd = mfs->fsm_state;
prep->main_mfs_rsp = MFS_FSM_RSP_NB;
+#if !CONFIG_MAC_PBPROC_EOC_FC
if (1 /* TODO */)
{
mfs_fsm_cmd_t mfs_cmd_mgmt, mfs_cmd_data;
@@ -738,6 +895,109 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
(MFS_RSP_DATA, MFS_FSM_RSP_ACK), /* TODO */
(BM_SACKI, 0xf)); /* TODO */
}
+#else
+ uint sackt0=PBPROC_FC_SACKT_UNIFORM, sacki0, sacki1=0;
+ if (ctx->recv_mpdu.sackd.valid)
+ {
+ sackt0 = ctx->recv_mpdu.sackd.sackt[0];
+ sacki0 = ctx->recv_mpdu.sackd.sacki_enc.si[0];
+ sacki1 = ctx->recv_mpdu.sackd.sacki_enc.si[1]
+ & BITS_ONES (rsof_fc ? PBPROC_FC_SACKI_EOC_RSOF_LEFT :
+ PBPROC_FC_SACKI_EOC_SOF_LEFT);
+ }
+ else
+ /* Could be also ALL_ERROR */
+ sacki0 = PBPROC_FC_SACKI_UNIFORM_NOT_AVAILABLE;
+ /* decision what to choose SOF or RSOF depend on position,
+ * SOF = cco or BCAST/MCAST, RSOF = sta only
+ * prepare RSOF/SOF by EOC specification */
+ if (rsof_fc)
+ {
+ prep->bbf = false;
+ dbg_assert(MAC_TEI_IS_EOC_STA(ctx->config->tei));
+ prep->fc_av.words[0] = BF_FILL (
+ PBPROC_FC_EOC_RSOF_W0,
+ (DT_AV, PBPROC_FC_DT_RSOF),
+ (ACCESS, false),
+ (SNID, ctx->alloc.snid),
+ (DTEI, prep->stei),
+ (RSOF_FL_AV, MAC_TCK_TO_FL (data_tck + rifs_tck)),
+ (NUM_SYM, symb_nb < 3 ? symb_nb : 3),
+ (SACKT0, sackt0));
+ prep->fc_av.words[1] = BF_FILL (
+ PBPROC_FC_EOC_RSOF_W1,
+ (SACKI0, sacki0));
+ prep->fc_av.words[2] = BF_FILL (
+ PBPROC_FC_EOC_RSOF_W2,
+ (SACKI1, sacki1),
+ (LID, prep->lid & 0xf),
+ (TMI_AV, tmi),
+ (BDF, true), /*TODO: status to be added */
+ (PBSZ, false));
+ prep->fc_av.words[3] = BF_FILL (
+ PBPROC_FC_EOC_RSOF_W3,
+ (SPPB, pbproc_prep_mpdu_sppb (ctx, prep->dtei, mfs, max_seg_nb)));
+ }
+ else
+ {
+ bool direction = !MAC_TEI_IS_EOC_CCO (ctx->config->tei);
+ prep->bbf = !mfs->common.bcast
+ && access->cfp
+ && !direction;
+ uint mrdur_tck = 0;
+ if (prep->bbf)
+ {
+ /* TODO: remove MAC_CF_SOF_RSOF_IFS_TCK, and therefore comparison
+ * with 0. */
+ mrdur_tck = MIN (2 * times->pre_fcs_tck + times->max_fl_tck
+ + MAC_TOLERANCE_TCK + MAC_TCK_PER_FL - 1,
+ (uint) MAX (0, (int) (access_duration_tck
+ - prep->flp_tck
+ - MAC_CF_SOF_RSOF_IFS_TCK)));
+ /* Include margin for reception date jitter, make sure slave will
+ * not send an out_of_alloc frame. */
+ if (mrdur_tck > MAC_TOLERANCE_TCK)
+ mrdur_tck -= MAC_TOLERANCE_TCK;
+ /* Cancel ridiculous durations. */
+ if (mrdur_tck < 2 * times->pre_fcs_tck + MAC_RIFS_DEFAULT_TCK)
+ {
+ prep->bbf = false;
+ mrdur_tck = 0;
+ }
+ }
+ prep->fc_av.words[0] = BF_FILL (
+ PBPROC_FC_EOC_SOF_W0,
+ (DT_AV, PBPROC_FC_DT_SOF),
+ (ACCESS, false),
+ (SNID, ctx->alloc.snid),
+ (DTEI, direction ? prep->stei : ack_dtei),
+ (LID, prep->lid & 0xF),
+ (EKS, eks),
+ (DIRECTION, direction),
+ (PBSZ, false),
+ (NUM_SYM, symb_nb < 3 ? symb_nb : 3),
+ (TMI_AV, tmi),
+ (MCF, mcf));
+ prep->fc_av.words[1] = BF_FILL (
+ PBPROC_FC_EOC_SOF_W1,
+ (FL_AV, MAC_TCK_TO_FL (data_tck + rifs_tck)),
+ (MPDU_CNT, 0),
+ (BURST_CNT, 0),
+ (MRDUR_FL, mrdur_tck / MAC_TCK_PER_FL),
+ (MNBF, mnbf),
+ (BBF, prep->bbf),
+ (SACKT0, sackt0));
+ prep->fc_av.words[2] = BF_FILL (
+ PBPROC_FC_EOC_SOF_W2,
+ (SACKI0, sacki0));
+ prep->fc_av.words[3] = BF_FILL (
+ PBPROC_FC_EOC_SOF_W3,
+ (SACKI1, sacki1));
+ }
+ /* Reset dangerous fields */
+ ctx->recv_mpdu.rx_params.bbf = 0;
+ ctx->recv_mpdu.sackd.valid = false;
+#endif
/* Invalid FC 1.0, HP 1.0 stations will defer (20 symbols and ROBO). */
prep->fc10 = 0x200000;
/* Prepare PB. */
@@ -748,7 +1008,7 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
seg_nb_reserved = max_seg_nb - seg_nb;
/* Get head and tail. */
pb_t *seg;
- seg = mfs->head;
+ seg = (!CONFIG_MAC_PBPROC_EOC_FC || seg_nb) ? mfs->head : 0;
mpdu->main_head = seg;
for (i = 1; i < seg_nb; i++, seg = seg->next)
{
@@ -756,18 +1016,24 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
}
mpdu->main_tail = seg;
/* Set Oldest Pending Segment Flag. */
- if (!prep->valid)
+ if (!prep->valid
+ && (!CONFIG_MAC_PBPROC_EOC_FC || mpdu->main_head))
mpdu->main_head->header.opsf = true;
/* Change MFS. */
mfs->seg_nb -= max_seg_nb;
- slist_slice (mfs->, seg, bare);
+ if (!CONFIG_MAC_PBPROC_EOC_FC || max_seg_nb)
+ slist_slice (mfs->, seg, bare);
mpdu->main_seg_nb = seg_nb;
prep->burst_seg_nb += seg_nb;
prep->main_seg_nb_reserved = seg_nb_reserved;
/* Prepare PB chain, simple one. */
mpdu->pb_nb_total = max_seg_nb + seg_nb_pending;
+#if CONFIG_MAC_PBPROC_EOC_FC
+ ctx->stats.tx_data_pb_total += mpdu->pb_nb_total;
+#endif
/* Loop over the last PB, PBDMA null PB is not working. */
- mpdu->main_tail->next = mpdu->main_tail;
+ if (!CONFIG_MAC_PBPROC_EOC_FC || mpdu->main_tail)
+ mpdu->main_tail->next = mpdu->main_tail;
/* Ok, ready to go! */
if (!prep->valid)
{
@@ -775,6 +1041,8 @@ pbproc_prep_mpdu (pbproc_t *ctx, mfs_tx_t *mfs)
blk_addref (mfs);
prep->valid = true;
}
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ GPIO_SET (LED_TRAFFIC, (seg_nb) ? 1 : 0);
}
static void __attribute__ ((noinline))
@@ -809,9 +1077,22 @@ pbproc_prep_mpdu_chain (pbproc_t *ctx)
pbproc_prep_mpdu_single_t *mpdu = prep->current;
dbg_claim (prep->valid);
dbg_claim_ptr (prep->main_mfs);
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim_ptr (mpdu->main_head);
dbg_claim_ptr (mpdu->main_tail);
dbg_claim (mpdu->main_seg_nb);
+#else
+ if (mpdu->main_seg_nb)
+ {
+ dbg_claim_ptr (mpdu->main_head);
+ dbg_claim_ptr (mpdu->main_tail);
+ }
+ else
+ {
+ dbg_claim (!mpdu->main_head);
+ dbg_claim (!mpdu->main_tail);
+ }
+#endif
/* Already chained? */
if (prep->main_seg_nb_reserved != 0)
{
@@ -885,9 +1166,22 @@ pbproc_prep_mpdu_cancel (pbproc_t *ctx, uint mpdu_count)
pbproc_prep_mpdu_single_t *mpdu = &prep->mpdu[mpdu_count];
dbg_claim (prep->valid);
dbg_claim_ptr (prep->main_mfs);
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim_ptr (mpdu->main_head);
dbg_claim_ptr (mpdu->main_tail);
- dbg_claim (mpdu->main_seg_nb);
+ dbg_claim (mpdu->main_seg_nb); /* possible on EoC */
+#else
+ if (mpdu->main_seg_nb)
+ {
+ dbg_claim_ptr (mpdu->main_head);
+ dbg_claim_ptr (mpdu->main_tail);
+ }
+ else
+ {
+ dbg_claim (!mpdu->main_head);
+ dbg_claim (!mpdu->main_tail);
+ }
+#endif
/* Commit. */
pbproc_prep_mpdu_commit (ctx, mpdu_count, NULL, NULL,
mpdu->main_head, mpdu->main_tail,
@@ -919,11 +1213,26 @@ pbproc_prep_mpdu_ack_all (pbproc_t *ctx, uint mpdu_count)
pbproc_prep_mpdu_single_t *mpdu = &prep->mpdu[mpdu_count];
dbg_claim (prep->valid);
dbg_claim_ptr (prep->main_mfs);
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim_ptr (mpdu->main_head);
dbg_claim_ptr (mpdu->main_tail);
dbg_claim (mpdu->main_seg_nb);
dbg_claim (prep->main_seg_nb_reserved == 0);
dbg_claim (mpdu->pb_nb_total >= mpdu->main_seg_nb);
+#else
+ if (mpdu->main_seg_nb)
+ {
+ dbg_claim_ptr (mpdu->main_head);
+ dbg_claim_ptr (mpdu->main_tail);
+ }
+ else
+ {
+ dbg_claim (!mpdu->main_head);
+ dbg_claim (!mpdu->main_tail);
+ }
+ dbg_claim (prep->main_seg_nb_reserved == 0);
+ dbg_claim (mpdu->pb_nb_total >= mpdu->main_seg_nb);
+#endif
/* Commit. */
pbproc_prep_mpdu_commit (ctx, mpdu_count,
mpdu->main_head, mpdu->main_tail,
@@ -942,9 +1251,22 @@ pbproc_prep_mpdu_ack_bitmap (pbproc_t *ctx, uint mpdu_count,
pbproc_prep_mpdu_single_t *mpdu = &prep->mpdu[mpdu_count];
dbg_claim (prep->valid);
dbg_claim_ptr (prep->main_mfs);
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim_ptr (mpdu->main_head);
dbg_claim_ptr (mpdu->main_tail);
dbg_claim (mpdu->main_seg_nb);
+#else
+ if (mpdu->main_seg_nb)
+ {
+ dbg_claim_ptr (mpdu->main_head);
+ dbg_claim_ptr (mpdu->main_tail);
+ }
+ else
+ {
+ dbg_claim (!mpdu->main_head);
+ dbg_claim (!mpdu->main_tail);
+ }
+#endif
dbg_claim (prep->main_seg_nb_reserved == 0);
dbg_claim (mpdu->pb_nb_total >= mpdu->main_seg_nb);
/* Read bitmap and collect acknowledged PB. */
@@ -1069,11 +1391,26 @@ pbproc_prep_mpdu_ack_encoded (pbproc_t *ctx, uint mpdu_count,
pbproc_prep_mpdu_single_t *mpdu = &prep->mpdu[mpdu_count];
dbg_claim (prep->valid);
dbg_claim_ptr (prep->main_mfs);
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_claim_ptr (mpdu->main_head);
dbg_claim_ptr (mpdu->main_tail);
dbg_claim (mpdu->main_seg_nb);
dbg_claim (prep->main_seg_nb_reserved == 0);
dbg_claim (mpdu->pb_nb_total >= mpdu->main_seg_nb);
+#else
+ if (mpdu->main_seg_nb)
+ {
+ dbg_claim_ptr (mpdu->main_head);
+ dbg_claim_ptr (mpdu->main_tail);
+ }
+ else
+ {
+ dbg_claim (!mpdu->main_head);
+ dbg_claim (!mpdu->main_tail);
+ }
+ dbg_claim (prep->main_seg_nb_reserved == 0);
+ dbg_claim (mpdu->pb_nb_total >= mpdu->main_seg_nb);
+#endif
/* Uncompress. */
pbproc_prep_mpdu_ack_encoded_t enc =
{
@@ -1170,6 +1507,9 @@ pbproc_prep_mpdu_ack (pbproc_t *ctx, const u8 sackt[],
dbg_claim (sacki_dec);
pbproc_prep_mpdu_t *prep = &ctx->prep_mpdu;
dbg_claim (prep->valid);
+#if CONFIG_MAC_COMMON_EOC_MFS
+ prep->main_mfs->no_reply_count = 0;
+#endif
/* Handle SACKD for each MPDU. */
for (mpdu_count = prep->burst_mpdu_nb - 1; mpdu_count >= 0; mpdu_count--)
{
@@ -1316,6 +1656,29 @@ pbproc_prep_mpdu_commit_fsm (pbproc_t *ctx)
}
}
+#if CONFIG_MAC_PBPROC_EOC_FC
+
+/** Maximum number of transmissions toward STA which does not reply*/
+#define PBPROC_TX_ATTEMPTS_NB 5
+
+void
+pbproc_prep_mpdu_access_track (pbproc_t *ctx)
+{
+ dbg_claim (ctx);
+ pbproc_prep_mpdu_t * mpdu = &ctx->prep_mpdu;
+ if (mpdu->valid && !mpdu->main_mfs->common.bcast)
+ {
+ mfs_tx_t * mfs = mpdu->main_mfs;
+ if (++mfs->no_reply_count > PBPROC_TX_ATTEMPTS_NB)
+ {
+ sta_t *sta = mac_store_sta_get_noref (ctx->store, mfs->common.tei);
+ if (sta)
+ sta->poll_off |= 1;
+ }
+ }
+}
+#endif
+
void ARCH_ILRAM
pbproc_prep_mpdu_commit_burst (pbproc_t *ctx)
{
@@ -1401,8 +1764,10 @@ pbproc_prep_mpdu_commit_burst (pbproc_t *ctx)
u16 min_tx_ssn = mfs->head ? mfs->head->header.ssn : mfs->next_ssn;
mfs->delta_between_ssn_min += min_tx_ssn - prep->min_rx_ssn;
}
+#if !CONFIG_MAC_PBPROC_EOC_FC
/* Commit FSM change. */
pbproc_prep_mpdu_commit_fsm (ctx);
+#endif
/* Inform CA. */
ca_access_done (ctx->ca);
/* No longer valid. */
@@ -1413,6 +1778,7 @@ pbproc_prep_mpdu_commit_burst (pbproc_t *ctx)
prep->valid = false;
}
+#if !CONFIG_MAC_PBPROC_EOC_FC
static void
pbproc_prep_mpdu_short (pbproc_t *ctx)
{
@@ -1470,6 +1836,7 @@ pbproc_prep_mpdu_short (pbproc_t *ctx)
/* Invalid FC 1.0, HP 1.0 stations will defer (20 symbols and ROBO). */
prep->fc10 = 0x200000;
}
+#endif
static void
pbproc_prep_mpdu_sound (pbproc_t *ctx, mfs_tx_t *mfs, uint fl_tck)
@@ -1482,6 +1849,7 @@ pbproc_prep_mpdu_sound (pbproc_t *ctx, mfs_tx_t *mfs, uint fl_tck)
/* No encryption. */
prep->bypass_aes = true;
/* SOUND FC. */
+#if !CONFIG_MAC_PBPROC_EOC_FC
prep->fc_av.words[0] = BF_FILL (
PBPROC_FC_SOUND_W0,
(DT_AV, PBPROC_FC_DT_SOUND),
@@ -1509,12 +1877,55 @@ pbproc_prep_mpdu_sound (pbproc_t *ctx, mfs_tx_t *mfs, uint fl_tck)
prep->fc_av.words[3] = BF_FILL (
PBPROC_FC_SOUND_W3,
(RESERVED2, 0));
+#else
+ uint sackt0 = PBPROC_FC_SACKT_UNIFORM;
+ uint sacki0 = PBPROC_FC_SACKI_UNIFORM_NOT_AVAILABLE, sacki1 = 0;
+ /* Inject sacki data */
+ if (ctx->recv_mpdu.sackd.valid)
+ {
+ sackt0 = ctx->recv_mpdu.sackd.sackt[0];
+ sacki0 = ctx->recv_mpdu.sackd.sacki_enc.si[0]
+ & BITS_ONES (PBPROC_FC_SACKI_EOC_SOUND_LEFT);
+ sacki1 = (ctx->recv_mpdu.sackd.sacki_enc.si[0] >> PBPROC_FC_SACKI_EOC_SOUND_LEFT)
+ | (ctx->recv_mpdu.sackd.sacki_enc.si[1] << (32 - PBPROC_FC_SACKI_EOC_SOUND_LEFT));
+ }
+ prep->fc_av.words[0] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W0,
+ (DT_AV, PBPROC_FC_DT_SOUND),
+ (ACCESS, false),
+ (SNID, ctx->alloc.snid),
+ (DTEI, (MAC_TEI_IS_EOC_STA(ctx->config->tei))
+ ? prep->stei : prep->dtei),
+ (FL_AV, MAC_TCK_TO_FL (fl_tck)),
+ (LID, prep->lid));
+ prep->fc_av.words[1] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W1,
+ (SACKT0, sackt0),
+ (DIRECTION, MAC_TEI_IS_EOC_STA(ctx->config->tei)),
+ (PBSZ, false), /* TODO */
+ (SAF, false),
+ (SCF, false),
+ (REQ_TM, TONEMAP_MAX),
+ (MPDU_CNT, 0), /* TODO */
+ (SACKI0, sacki0));
+ prep->fc_av.words[2] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W2,
+ (SACKI1, sacki1));
+ prep->fc_av.words[3] = BF_FILL (
+ PBPROC_FC_EOC_SOUND_W3,
+ (SRC, prep->sound_reason_code));
+#endif
/* Invalid FC 1.0, HP 1.0 stations will defer (20 symbols and ROBO). */
prep->fc10 = 0x200000;
/* Ok, ready to go! */
prep->main_mfs = mfs;
blk_addref (mfs);
prep->valid = true;
+ if (CONFIG_MAC_PBPROC_EOC_FC)
+ {
+ /* reset sackd */
+ ctx->recv_mpdu.sackd.valid = false;
+ }
}
void
diff --git a/cesar/mac/pbproc/src/trace.c b/cesar/mac/pbproc/src/trace.c
index 21a1e5edb4..d15bc62682 100644
--- a/cesar/mac/pbproc/src/trace.c
+++ b/cesar/mac/pbproc/src/trace.c
@@ -26,11 +26,15 @@ static int
pbproc_trace_format_fc (char *text, uint text_size, const int *data,
uint size)
{
+#if !CONFIG_MAC_PBPROC_EOC_FC
static const char *mfs_cmd_str[] = { "INIT", "IN_SYNC", "RE_SYNC",
"RELEASE", "NOP", "RES=5", "RES=6", "RES=7" };
+ char mrtfl[sizeof ("bbf mrtfl=0xn ")];
+#else
+ char mrdur_fl[sizeof ("bbf mrdur_fl=0xnnn ")];
+#endif
static const char *mfs_rsp_str[] = { "ACK", "NACK", "FAIL", "HOLD" };
static const char *sackt[] = { "m", "mc", "nr", "u" };
- char mrtfl[sizeof ("bbf mrtfl=0xn ")];
char mpdu_cnt[sizeof ("mpdu_cnt=n ")];
char burst_cnt[sizeof ("burst_cnt=n ")];
dbg_assert (size == 4);
@@ -54,13 +58,38 @@ pbproc_trace_format_fc (char *text, uint text_size, const int *data,
| fc->beacon.bto3_msb8 << 8);
break;
case PBPROC_FC_DT_SOF:
+#if !CONFIG_MAC_PBPROC_EOC_FC
dbg_check (snprintf (mrtfl, sizeof (mrtfl), "bbf mrtfl=0x%x ",
fc->sof.mrtfl) < (int) sizeof (mrtfl));
+#else
+ dbg_check (snprintf (mrdur_fl, sizeof (mrdur_fl),
+ "bbf mrdur_fl=0x%x ",
+ fc->sof.mrdur_fl) < (int) sizeof (mrdur_fl));
+#endif
dbg_check (snprintf (mpdu_cnt, sizeof (mpdu_cnt), "mpdu_cnt=%d ",
fc->sof.mpdu_cnt) < (int) sizeof (mpdu_cnt));
dbg_check (snprintf (burst_cnt, sizeof (burst_cnt),
"burst_cnt=%d ", fc->sof.burst_cnt)
< (int) sizeof (burst_cnt));
+#if CONFIG_MAC_PBPROC_EOC_FC
+ r = snprintf (text, text_size,
+ "SOF snid=%s%d dir=%s dtei=0x%02x lid=0x%02x"
+ " %s%seks=%d"
+ " %snum_sym=%d tmi=%d fl_av=%d "
+ "%s%s%s"
+ "sackt0=0x%x sacki0=0x%x, sacki1=0x%x",
+ FC_ACCESS_SNID (fc),
+ fc->sof.direction ? "STA->CCO" : "CCO->STA",
+ fc->sof.dtei, fc->sof.lid,
+ fc->sof.mcf ? "mcf " : "",
+ fc->sof.mnbf ? "mnbf " : "", fc->sof.eks,
+ fc->sof.pbsz ? "pb136 " : "", fc->sof.num_sym,
+ fc->sof.tmi_av, fc->sof.fl_av,
+ fc->sof.mpdu_cnt ? mpdu_cnt : "",
+ fc->sof.burst_cnt ? burst_cnt : "",
+ fc->sof.bbf ? mrdur_fl : "",
+ fc->sof.sackt0, fc->sof.sacki0, fc->sof.sacki1);
+#else
r = snprintf (text, text_size,
"SOF snid=%s%d stei=0x%02x dtei=0x%02x lid=0x%02x"
" %s%s%s%s%s%seks=%d ppb=0x%02x ble=0x%02x"
@@ -88,6 +117,7 @@ pbproc_trace_format_fc (char *text, uint text_size, const int *data,
mfs_rsp_str[fc->sof.mfs_rsp_mgmt],
mfs_rsp_str[fc->sof.mfs_rsp_data],
fc->sof.bm_sacki);
+#endif
break;
case PBPROC_FC_DT_SACK:
r = snprintf (text, text_size,
@@ -127,6 +157,25 @@ pbproc_trace_format_fc (char *text, uint text_size, const int *data,
dbg_check (snprintf (mpdu_cnt, sizeof (mpdu_cnt), "mpdu_cnt=%d ",
fc->sound.mpdu_cnt)
< (int) sizeof (mpdu_cnt));
+#if CONFIG_MAC_PBPROC_EOC_FC
+ r = snprintf (text, text_size,
+ "SOUND snid=%s%d dir=%s dtei=0x%02x lid=0x%02x"
+ " %s%s%sreq_tm=%d fl_av=%d %s"
+ "src=0x%02x"
+ " sackt0=0x%x sacki0=0x%x, sacki1=0x%x",
+ FC_ACCESS_SNID (fc),
+ fc->sof.direction ? "STA->CCO" : "CCO->STA",
+ fc->sound.dtei,
+ fc->sound.lid,
+ fc->sound.pbsz ? "pb136 " : "",
+ fc->sound.saf ? "saf " : "",
+ fc->sound.scf ? "scf " : "",
+ fc->sound.req_tm, fc->sound.fl_av,
+ fc->sound.mpdu_cnt ? mpdu_cnt : "",
+ fc->sound.src,
+ fc->sound.sackt0, fc->sound.sacki0,
+ fc->sound.sacki1);
+#else
r = snprintf (text, text_size,
"SOUND snid=%s%d stei=0x%02x dtei=0x%02x lid=0x%02x"
" %s%s%s%s%sreq_tm=%d fl_av=%d %sppb=0x%02x"
@@ -141,8 +190,23 @@ pbproc_trace_format_fc (char *text, uint text_size, const int *data,
fc->sound.req_tm, fc->sound.fl_av,
fc->sound.mpdu_cnt ? mpdu_cnt : "", fc->sound.ppb,
fc->sound.src);
+#endif
break;
case PBPROC_FC_DT_RSOF:
+#if CONFIG_MAC_PBPROC_EOC_FC
+ r = snprintf (text, text_size,
+ "RSOF snid=%s%d dtei=0x%02x lid=0x%02x"
+ " %s%ssppb=0x%x"
+ " fl_av=%d tmi=%d num_sym=%d"
+ " sackt0=0x%x sacki0=0x%x sacki1=0x%x",
+ FC_ACCESS_SNID (fc), fc->rsof.dtei,
+ fc->rsof.lid,
+ fc->rsof.bdf ? "bdf " : "",
+ fc->rsof.pbsz ? "pb136 " : "", fc->rsof.sppb,
+ fc->rsof.rsof_fl_av, fc->rsof.tmi_av,
+ fc->rsof.num_sym,
+ fc->rsof.sackt0, fc->rsof.sacki0, fc->rsof.sacki1);
+#else
r = snprintf (text, text_size,
"RSOF snid=%s%d dtei=0x%02x"
" %s%s%s%smfs=m%s,%s,%s,m%s sackt=%s,%s,%s,%s"
@@ -165,6 +229,7 @@ pbproc_trace_format_fc (char *text, uint text_size, const int *data,
: fc->rsof.rsof_fl_av * 2 - 0x200, fc->rsof.tmi_av,
fc->rsof.pbsz ? "pb136 " : "",
fc->rsof.num_sym);
+#endif
break;
default:
r = snprintf (text, text_size, "UNKNOWN dt=%d snid=%s%d",