summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cesar/hal/phy/inc/phy_params.txt1
-rw-r--r--cesar/hal/phy/src/rx.c39
-rw-r--r--cesar/lib/blk.h4
-rw-r--r--cesar/lib/src/blk.c7
-rw-r--r--cesar/lib/test/blk/src/test_blk.c6
-rw-r--r--cesar/mac/sar/src/sar.c15
-rw-r--r--cesar/mac/sar/test/unit_test/ecos/src/misc.c35
7 files changed, 72 insertions, 35 deletions
diff --git a/cesar/hal/phy/inc/phy_params.txt b/cesar/hal/phy/inc/phy_params.txt
index 73218216d4..a82fd6a67d 100644
--- a/cesar/hal/phy/inc/phy_params.txt
+++ b/cesar/hal/phy/inc/phy_params.txt
@@ -5,6 +5,7 @@ tx_scale_adapt_blk_exp = 8
rx_fec_param__me10doi_max_it = 9
rx_fec_param__tcc_half_it_fc = 10
rx_fec_param__tcc_half_it_data_last_pb = 15
+rx_fec_param__tcc_half_it_data_one_symbol = 5
rx_fec_param__tcc_dyn_stop = 1
rx_fec_param__tcc_ber_period = 1
rx_fec_param__tcc_threshold = 0
diff --git a/cesar/hal/phy/src/rx.c b/cesar/hal/phy/src/rx.c
index 0ed92062bf..ebd45f2546 100644
--- a/cesar/hal/phy/src/rx.c
+++ b/cesar/hal/phy/src/rx.c
@@ -120,18 +120,33 @@ phy_rx_prepare_common (phy_t *ctx, bool short_ppdu, bool sound, uint nb_pb,
/* TCC decoder parameters. */
if (!sound)
{
- PHY_DSPSS_TCC_HALF_IT_LAST_PB =
- BF_FILL (PHY_DSPSS_TCC_HALF_IT_LAST_PB,
- (VALUE,
- PHY_PARAM_RX_FEC_PARAM__TCC_HALF_IT_DATA_LAST_PB),
- (ENABLED, 1),
- (PB_NB, nb_pb));
- PHY_DSPSS_RX_FEC_PARAM =
- PHY_PARAMS (PHY_DSPSS, RX_FEC_PARAM, ME10DOI_MAX_IT,
- TCC_HALF_IT_FC, TCC_DYN_STOP, TCC_BER_PERIOD,
- TCC_THRESHOLD)
- | BF_FILL (PHY_DSPSS_RX_FEC_PARAM, (TCC_HALF_IT_DATA,
- tcc_halfit));
+ if (symbol_nb == 1)
+ {
+ PHY_DSPSS_TCC_HALF_IT_LAST_PB =
+ BF_FILL (PHY_DSPSS_TCC_HALF_IT_LAST_PB, (ENABLED, 0));
+ PHY_DSPSS_RX_FEC_PARAM =
+ PHY_PARAMS (PHY_DSPSS, RX_FEC_PARAM, ME10DOI_MAX_IT,
+ TCC_HALF_IT_FC, TCC_DYN_STOP, TCC_BER_PERIOD,
+ TCC_THRESHOLD)
+ | BF_FILL (PHY_DSPSS_RX_FEC_PARAM,
+ (TCC_HALF_IT_DATA,
+ PHY_PARAM_RX_FEC_PARAM__TCC_HALF_IT_DATA_ONE_SYMBOL));
+ }
+ else
+ {
+ PHY_DSPSS_TCC_HALF_IT_LAST_PB =
+ BF_FILL (PHY_DSPSS_TCC_HALF_IT_LAST_PB,
+ (VALUE,
+ PHY_PARAM_RX_FEC_PARAM__TCC_HALF_IT_DATA_LAST_PB),
+ (ENABLED, 1),
+ (PB_NB, nb_pb));
+ PHY_DSPSS_RX_FEC_PARAM =
+ PHY_PARAMS (PHY_DSPSS, RX_FEC_PARAM, ME10DOI_MAX_IT,
+ TCC_HALF_IT_FC, TCC_DYN_STOP, TCC_BER_PERIOD,
+ TCC_THRESHOLD)
+ | BF_FILL (PHY_DSPSS_RX_FEC_PARAM, (TCC_HALF_IT_DATA,
+ tcc_halfit));
+ }
}
}
/* Freeze RESYS to write offset table. */
diff --git a/cesar/lib/blk.h b/cesar/lib/blk.h
index 3e207d7417..44277badca 100644
--- a/cesar/lib/blk.h
+++ b/cesar/lib/blk.h
@@ -220,7 +220,7 @@ blk_print_memory (void);
/**
* Querry blk when a huge number of blocks are needed.
- * \return true if possible, false otherwise.
+ * \return number of free blocks which could be allocated, 0 otherwise.
*
* Each time a numerous quantity of blocks are needed to handle a stuff, this
* function should be called. When the number of blocks reach a critical level
@@ -232,7 +232,7 @@ blk_print_memory (void);
* file. X is the minimum number of blocks under the one, the memory level
* is considered as critical.
*/
-bool
+uint
blk_slack (void);
END_DECLS
diff --git a/cesar/lib/src/blk.c b/cesar/lib/src/blk.c
index 520f4b6cd8..40b652ca51 100644
--- a/cesar/lib/src/blk.c
+++ b/cesar/lib/src/blk.c
@@ -399,8 +399,11 @@ blk_print_memory (void)
blk_global.total_nb, blk_global.free_nb);
}
-bool
+uint
blk_slack (void)
{
- return blk_global.free_nb > CONFIG_BLK_SLACK;
+ if (blk_global.free_nb > CONFIG_BLK_SLACK)
+ return blk_global.free_nb - CONFIG_BLK_SLACK;
+ else
+ return 0;
}
diff --git a/cesar/lib/test/blk/src/test_blk.c b/cesar/lib/test/blk/src/test_blk.c
index 8a5ce1d8bb..58ca0b6445 100644
--- a/cesar/lib/test/blk/src/test_blk.c
+++ b/cesar/lib/test/blk/src/test_blk.c
@@ -295,13 +295,13 @@ blk_slack_test_case (test_t t)
uint i;
for (i = 0; i < CONFIG_BLK_NB - CONFIG_BLK_SLACK; i++)
{
- test_fail_unless (blk_slack () == true);
+ test_fail_unless (blk_slack ());
b[i] = blk_alloc ();
}
- test_fail_unless (blk_slack () == false);
+ test_fail_unless (!blk_slack ());
blk_release (b[CONFIG_BLK_NB - CONFIG_BLK_SLACK - 1]);
- test_fail_unless (blk_slack () == true);
+ test_fail_unless (blk_slack ());
for (i = 0; i < CONFIG_BLK_NB - CONFIG_BLK_SLACK - 1; i++)
blk_release (b[i]);
diff --git a/cesar/mac/sar/src/sar.c b/cesar/mac/sar/src/sar.c
index 0056480bef..c8582c3466 100644
--- a/cesar/mac/sar/src/sar.c
+++ b/cesar/mac/sar/src/sar.c
@@ -1107,20 +1107,19 @@ sar_pb_pool_refill (sar_t *ctx, uint pb_nb)
dbg_assert (ctx);
dbg_assert (ctx->pbproc_ctx);
-
pb_nb += ctx->pbs_missing_for_pbproc;
- if (pb_nb && blk_slack ())
+ dbg_assert (pb_nb);
+ uint available = blk_slack ();
+ uint allocate = MIN (pb_nb, available);
+ ctx->pbs_missing_for_pbproc = pb_nb - allocate;
+ if (allocate)
{
- head = (pb_t*) blk_alloc_desc_range (pb_nb, &blk_tail);
+ head = (pb_t*) blk_alloc_desc_range (allocate, &blk_tail);
tail = (pb_t*) blk_tail;
- pbproc_rx_segment_refill (ctx->pbproc_ctx, head, tail, pb_nb);
- ctx->pbs_missing_for_pbproc = 0;
+ pbproc_rx_segment_refill (ctx->pbproc_ctx, head, tail, allocate);
}
else
- {
- ctx->pbs_missing_for_pbproc = pb_nb;
ctx->stats.pb_pool_not_filled++;
- }
}
/**
diff --git a/cesar/mac/sar/test/unit_test/ecos/src/misc.c b/cesar/mac/sar/test/unit_test/ecos/src/misc.c
index 7615a4b471..a96d27866e 100644
--- a/cesar/mac/sar/test/unit_test/ecos/src/misc.c
+++ b/cesar/mac/sar/test/unit_test/ecos/src/misc.c
@@ -31,19 +31,38 @@ void
test_case_misc__exhausted_memory (test_t test)
{
test_case_begin (test, "Exhausted memory");
-
test_begin (test, "SAR PB pool refill")
{
+ uint blk_nb, allocate;
+ int missing_to_alloc = 0;
sar_test_t t;
blk_t *head, *tail;
sar_test_init (&t, INVALID_PTR, INVALID_PTR);
- head = blk_alloc_desc_range (CONFIG_BLK_NB - CONFIG_BLK_SLACK - 4,
- &tail);
- sar_pb_pool_refill (t.sar, CONFIG_BLK_NB - 50);
- test_fail_unless (t.sar->pbs_missing_for_pbproc == CONFIG_BLK_NB - 50);
- blk_release_desc_range (head, tail);
- sar_pb_pool_refill (t.sar, 5);
- test_fail_unless (t.sar->pbs_missing_for_pbproc == 0);
+ for (blk_nb = 1; blk_nb < CONFIG_BLK_NB - 20; blk_nb ++)
+ {
+ head = blk_alloc_desc_range (blk_nb, &tail);
+ allocate = MIN (10u, blk_slack ());
+ if (allocate == 10)
+ missing_to_alloc = 0;
+ else
+ missing_to_alloc += 10 - allocate;
+ sar_pb_pool_refill (t.sar, 10);
+ test_fail_unless (
+ t.sar->pbs_missing_for_pbproc
+ == (uint) missing_to_alloc);
+ blk_release_desc_range (head, tail);
+ }
+ for (missing_to_alloc = t.sar->pbs_missing_for_pbproc - blk_slack ();
+ t.sar->pbs_missing_for_pbproc >= blk_slack ();
+ missing_to_alloc = t.sar->pbs_missing_for_pbproc - blk_slack ())
+ {
+ sar_pb_pool_refill (t.sar, 0);
+ test_fail_unless (t.sar->pbs_missing_for_pbproc
+ == (uint) missing_to_alloc);
+ }
+ /* After this one, all missing block should be allocated. */
+ sar_pb_pool_refill (t.sar, 0);
+ test_fail_unless (!t.sar->pbs_missing_for_pbproc);
sar_test_uninit (&t);
}
test_end;