aboutsummaryrefslogtreecommitdiffstats
path: root/src/pcu_l1_if.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pcu_l1_if.cpp')
-rw-r--r--src/pcu_l1_if.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 25c19333..1600da03 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -531,6 +531,22 @@ int pcu_rx_rts_req_ptcch(struct gprs_rlcmac_bts *bts, uint8_t trx, uint8_t ts,
if (!pdch->m_is_enabled)
return -EAGAIN;
+ /* If there's no TBF attached to this PDCH, we can skip Tx of PTCCH
+ * since there's nothing worthy of being transmitted. This way BTS can
+ * identify idle blocks and send nothing or dumy blocks with reduced
+ * energy for the sake of energy saving.
+ */
+ const unsigned num_tbfs = pdch->num_tbfs(GPRS_RLCMAC_DL_TBF)
+ + pdch->num_tbfs(GPRS_RLCMAC_UL_TBF);
+ bool skip_idle = (num_tbfs == 0);
+#ifdef ENABLE_DIRECT_PHY
+ /* In DIRECT_PHY mode we want to always submit something to L1 in
+ * TRX0, since BTS is not preparing dummy bursts on idle TS for us: */
+ skip_idle = skip_idle && trx != 0;
+#endif
+ if (skip_idle)
+ return 0;
+
pcu_l1if_tx_ptcch(bts, trx, ts, bts->trx[trx].arfcn, fn, block_nr,
pdch->ptcch_msg, GSM_MACBLOCK_LEN);
return 0;