aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2023-04-24 22:24:44 +0200
committerdexter <pmaier@sysmocom.de>2023-05-03 07:56:47 +0000
commit5e024342c4956f34dbc69b085229c81a20226760 (patch)
tree4babb0290759e9fe5d1ea0c72e5b02ef6e7e655e
parente1a8915936a6f5e372169b4c55cc807f3108fa33 (diff)
er_ccu_l1_if: use one ccu_desr per timeslot
At the moment only allocate one CCU descriptor and use it as context for the whole TRX. This is fine when running with one PDCH only but as soon as multiple PDCHs are used the CCU descriptor gets messed up. Let's fix this by introducing a TRX descriptor that contains an array of 8 CCU descriptors, one for each timeslot. Related: OS#6022 Change-Id: I09a51f34ce0edef79a797c4686c7b1d27c376e49
-rw-r--r--src/ericsson-rbs/er_ccu_descr.h4
-rw-r--r--src/ericsson-rbs/er_ccu_l1_if.c67
2 files changed, 46 insertions, 25 deletions
diff --git a/src/ericsson-rbs/er_ccu_descr.h b/src/ericsson-rbs/er_ccu_descr.h
index 0b56cc06..9fe1aab8 100644
--- a/src/ericsson-rbs/er_ccu_descr.h
+++ b/src/ericsson-rbs/er_ccu_descr.h
@@ -47,3 +47,7 @@ struct er_ccu_descr {
};
+
+struct er_trx_descr {
+ struct er_ccu_descr ts_ccu_descr[8];
+};
diff --git a/src/ericsson-rbs/er_ccu_l1_if.c b/src/ericsson-rbs/er_ccu_l1_if.c
index b7dd1027..0fe30b27 100644
--- a/src/ericsson-rbs/er_ccu_l1_if.c
+++ b/src/ericsson-rbs/er_ccu_l1_if.c
@@ -372,18 +372,22 @@ static int cs_hdr_from_len(uint8_t len)
int l1if_pdch_req(void *obj, uint8_t ts, int is_ptcch, uint32_t fn,
uint16_t arfcn, uint8_t block_nr, uint8_t *data, uint8_t len)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
struct er_gprs_trau_frame trau_frame;
ubit_t trau_frame_encoded[ER_GPRS_TRAU_FRAME_LEN_64K];
struct gprs_rlcmac_bts *bts;
int rc;
/* Make sure that the CCU is synchronized and connected. */
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: PDCH(ts=%u, arfcn=%u) no CCU context, tossing MAC block...\n",
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: PDCH(ts=%u, arfcn=%u) no TRX context, tossing MAC block...\n",
ts, arfcn);
return -EINVAL;
}
+
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
+
if (!ccu_descr->link.ccu_connected) {
LOGPL1IF(ccu_descr, LOGL_NOTICE, "PCU-DATA-IND", "CCU not connected, tossing MAC block...\n");
return -EINVAL;
@@ -450,46 +454,56 @@ int l1if_pdch_req(void *obj, uint8_t ts, int is_ptcch, uint32_t fn,
void *l1if_open_pdch(uint8_t bts_nr, uint8_t trx_no, uint32_t hlayer1, struct gsmtap_inst *gsmtap)
{
- struct er_ccu_descr *ccu_descr;
+ struct er_trx_descr *trx_descr;
+ unsigned int i;
/* Note: We do not have enough information to really open anything at
- * this point. We will just create the CCU context. */
-
- ccu_descr = talloc_zero(tall_pcu_ctx, struct er_ccu_descr);
- OSMO_ASSERT(ccu_descr);
- ccu_descr->er_ccu_rx_cb = er_ccu_rx_cb;
- ccu_descr->er_ccu_empty_cb = er_ccu_empty_cb;
- ccu_descr->pcu.trx_no = trx_no;
- ccu_descr->pcu.bts_nr = bts_nr;
+ * this point. We will just create the TRX context and fill it wit basic
+ * CCU context (one for each TS) */
+
+ trx_descr = talloc_zero(tall_pcu_ctx, struct er_trx_descr);
+ OSMO_ASSERT(trx_descr);
+
+ for (i = 0; i < ARRAY_SIZE(trx_descr->ts_ccu_descr); i++) {
+ trx_descr->ts_ccu_descr[i].er_ccu_rx_cb = er_ccu_rx_cb;
+ trx_descr->ts_ccu_descr[i].er_ccu_empty_cb = er_ccu_empty_cb;
+ trx_descr->ts_ccu_descr[i].pcu.trx_no = trx_no;
+ trx_descr->ts_ccu_descr[i].pcu.bts_nr = bts_nr;
+ trx_descr->ts_ccu_descr[i].pcu.ts = i;
+ }
- return ccu_descr;
+ return trx_descr;
}
int l1if_close_pdch(void *obj)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ unsigned int i;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: no CCU context, cannot close unknown PDCH...\n");
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "PCU-DATA-IND: no TRX context, cannot close unknown TRX...\n");
return -EINVAL;
}
- er_ccu_if_close(ccu_descr);
- talloc_free(ccu_descr);
+ for (i = 0; i < ARRAY_SIZE(trx_descr->ts_ccu_descr); i++)
+ er_ccu_if_close(&trx_descr->ts_ccu_descr[i]);
+
+ talloc_free(trx_descr);
return 0;
}
int l1if_connect_pdch(void *obj, uint8_t ts)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
int rc;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, PDCH never opened before?\n", ts);
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, TRX never opened before?\n", ts);
return -EINVAL;
}
- ccu_descr->pcu.ts = ts;
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
rc = pcu_l1if_get_e1_ccu_conn_pars(&ccu_descr->e1_conn_pars, ccu_descr->pcu.bts_nr, ccu_descr->pcu.trx_no,
ccu_descr->pcu.ts);
@@ -507,13 +521,16 @@ int l1if_connect_pdch(void *obj, uint8_t ts)
int l1if_disconnect_pdch(void *obj, uint8_t ts)
{
- struct er_ccu_descr *ccu_descr = obj;
+ struct er_trx_descr *trx_descr = obj;
+ struct er_ccu_descr *ccu_descr;
- if (!ccu_descr) {
- LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no CCU context, PDCH never opened before?\n", ts);
+ if (!trx_descr) {
+ LOGP(DL1IF, LOGL_ERROR, "SETUP: PDCH(ts=%u) no TRX context, TRX never opened before?\n", ts);
return -EINVAL;
}
+ ccu_descr = &trx_descr->ts_ccu_descr[ts];
+
er_ccu_if_close(ccu_descr);
return 0;