summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2023-05-22 22:34:15 +0700
committerfixeria <vyanitskiy@sysmocom.de>2023-05-30 19:35:29 +0000
commit0ee32177a28e7191bb1ddba9c4115352b1d366d7 (patch)
treec1ce1eb3970ff9dee01269f6a4aff518ae159a20
parentd400126d0fe60783c10d99c96fcf42ddf3a8ee5f (diff)
trxcon/l1sched: rework burst buffer shifting for TCH/[FH]
This is how the buffer shifting is implemented in osmo-bts-trx. Keep trxcon's l1sched implementation as close to osmo-bts-trx as possible in order to simplify the integration of CSD support. Change-Id: Idb6e415f37f41b8ab92a3864962dac0a40c2fbaa Related: OS#4396
-rw-r--r--src/host/trxcon/src/sched_lchan_tchf.c30
-rw-r--r--src/host/trxcon/src/sched_lchan_tchh.c41
2 files changed, 31 insertions, 40 deletions
diff --git a/src/host/trxcon/src/sched_lchan_tchf.c b/src/host/trxcon/src/sched_lchan_tchf.c
index 691ad5a5..a4aa80cb 100644
--- a/src/host/trxcon/src/sched_lchan_tchf.c
+++ b/src/host/trxcon/src/sched_lchan_tchf.c
@@ -75,9 +75,16 @@ int rx_tchf_fn(struct l1sched_lchan_state *lchan,
LOGP_LCHAND(lchan, LOGL_DEBUG,
"Traffic received: fn=%u bid=%u\n", bi->fn, bi->bid);
- /* Align to the first burst of a block */
- if (*mask == 0x00 && bi->bid != 0)
- return 0;
+ if (bi->bid == 0) {
+ /* Shift the burst buffer by 4 bursts leftwards */
+ memcpy(&bursts_p[0], &bursts_p[464], 464);
+ memset(&bursts_p[464], 0, 464);
+ *mask = *mask << 4;
+ } else {
+ /* Align to the first burst of a block */
+ if (*mask == 0x00)
+ return 0;
+ }
/* Update mask */
*mask |= (1 << bi->bid);
@@ -108,9 +115,6 @@ int rx_tchf_fn(struct l1sched_lchan_state *lchan,
}
- /* Keep the mask updated */
- *mask = *mask << 4;
-
switch (lchan->tch_mode) {
case GSM48_CMODE_SIGN:
case GSM48_CMODE_SPEECH_V1: /* FR */
@@ -157,9 +161,6 @@ int rx_tchf_fn(struct l1sched_lchan_state *lchan,
return -EINVAL;
}
- /* Shift buffer by 4 bursts for interleaving */
- memcpy(bursts_p, bursts_p + 464, 464);
-
/* Check decoding result */
if (rc < 4) {
LOGP_LCHAND(lchan, LOGL_ERROR,
@@ -227,8 +228,10 @@ int tx_tchf_fn(struct l1sched_lchan_state *lchan,
if (br->bid > 0)
goto send_burst;
- /* Shift buffer by 4 bursts back for interleaving */
- memcpy(bursts_p, bursts_p + 464, 464);
+ /* Shift the burst buffer by 4 bursts leftwards for interleaving */
+ memcpy(&bursts_p[0], &bursts_p[464], 464);
+ memset(&bursts_p[464], 0, 464);
+ *mask = *mask << 4;
/* populate the buffer with bursts */
switch (lchan->tch_mode) {
@@ -332,12 +335,9 @@ send_burst:
LOGP_LCHAND(lchan, LOGL_DEBUG, "Scheduled fn=%u burst=%u\n", br->fn, br->bid);
/* If we have sent the last (4/4) burst */
- if (*mask == 0x0f) {
+ if ((*mask & 0x0f) == 0x0f) {
/* Confirm data / traffic sending (pass ownership of the prim) */
l1sched_lchan_emit_data_cnf(lchan, br->fn);
-
- /* Reset mask */
- *mask = 0x00;
}
return 0;
diff --git a/src/host/trxcon/src/sched_lchan_tchh.c b/src/host/trxcon/src/sched_lchan_tchh.c
index bff9b1b0..30d623b5 100644
--- a/src/host/trxcon/src/sched_lchan_tchh.c
+++ b/src/host/trxcon/src/sched_lchan_tchh.c
@@ -252,6 +252,14 @@ int rx_tchh_fn(struct l1sched_lchan_state *lchan,
LOGP_LCHAND(lchan, LOGL_DEBUG,
"Traffic received: fn=%u bid=%u\n", bi->fn, bi->bid);
+ if (bi->bid == 0) {
+ /* Shift the burst buffer by 2 bursts leftwards */
+ memcpy(&bursts_p[0], &bursts_p[232], 232);
+ memcpy(&bursts_p[232], &bursts_p[464], 232);
+ memset(&bursts_p[464], 0, 232);
+ *mask = *mask << 2;
+ }
+
if (*mask == 0x00) {
/* Align to the first burst */
if (bi->bid > 0)
@@ -286,17 +294,17 @@ int rx_tchh_fn(struct l1sched_lchan_state *lchan,
if (lchan->tch_mode == GSM48_CMODE_SIGN) {
/* FACCH/H is interleaved over 6 bursts */
if ((*mask & 0x3f) != 0x3f)
- goto bfi_shift;
+ goto bfi;
} else {
/* Traffic is interleaved over 4 bursts */
if ((*mask & 0x0f) != 0x0f)
- goto bfi_shift;
+ goto bfi;
}
/* Skip decoding attempt in case of FACCH/H */
if (lchan->dl_ongoing_facch) {
lchan->dl_ongoing_facch = false;
- goto bfi_shift; /* 2/2 BFI */
+ goto bfi; /* 2/2 BFI */
}
switch (lchan->tch_mode) {
@@ -340,13 +348,6 @@ int rx_tchh_fn(struct l1sched_lchan_state *lchan,
return -EINVAL;
}
- /* Shift buffer by 4 bursts for interleaving */
- memcpy(bursts_p, bursts_p + 232, 232);
- memcpy(bursts_p + 232, bursts_p + 464, 232);
-
- /* Shift burst mask */
- *mask = *mask << 2;
-
/* Check decoding result */
if (rc < 4) {
/* Calculate AVG of the measurements (assuming 4 bursts) */
@@ -384,14 +385,6 @@ int rx_tchh_fn(struct l1sched_lchan_state *lchan,
return l1sched_lchan_emit_data_ind(lchan, &tch_data[0], tch_data_len,
n_errors, n_bits_total, true);
-bfi_shift:
- /* Shift buffer */
- memcpy(bursts_p, bursts_p + 232, 232);
- memcpy(bursts_p + 232, bursts_p + 464, 232);
-
- /* Shift burst mask */
- *mask = *mask << 2;
-
bfi:
/* Didn't try to decode, fake measurements */
if (n_errors < 0) {
@@ -441,17 +434,15 @@ int tx_tchh_fn(struct l1sched_lchan_state *lchan,
return 0;
}
- /* Shift buffer by 2 bursts back for interleaving */
- memcpy(bursts_p, bursts_p + 232, 232);
-
- /* Also shift TX burst mask */
+ /* Shift the burst buffer by 2 bursts leftwards for interleaving */
+ memcpy(&bursts_p[0], &bursts_p[232], 232);
+ memcpy(&bursts_p[232], &bursts_p[464], 232);
+ memset(&bursts_p[464], 0, 232);
*mask = *mask << 2;
/* If FACCH/H blocks are still pending */
- if (lchan->ul_facch_blocks > 2) {
- memcpy(bursts_p + 232, bursts_p + 464, 232);
+ if (lchan->ul_facch_blocks > 2)
goto send_burst;
- }
if (msgb_l2len(lchan->prim) == GSM_MACBLOCK_LEN)
lchan->ul_facch_blocks = 6;