pcu: Wait for USF before start using UL TBF

Change-Id: Ibe8f8c24b239715c0a43d52e59475011e78cb4eb
diff --git a/pcu/GPRS_Components.ttcn b/pcu/GPRS_Components.ttcn
index a3e8c94..59c99d8 100644
--- a/pcu/GPRS_Components.ttcn
+++ b/pcu/GPRS_Components.ttcn
@@ -992,6 +992,36 @@
 	return;
 }
 
+/* Keep receiving & discarding DL blocks until the PCU requests USF for this MS */
+function f_ms_wait_usf(inout GprsMS ms, template (value) TsTrxBtsNum nr := ts_TsTrxBtsNum)
+runs on MS_BTS_IFACE_CT return uint32_t {
+	var BTS_PDTCH_Block data_msg;
+
+	BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
+				  sapi := PCU_IF_SAPI_PDTCH, fn := 0,
+				  arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
+				  block_nr := nr.blk_nr));
+	alt {
+	[] as_pcuif_rx_ignore_empty(nr);
+	[] BTS.receive(tr_PCUIF_DATA_PDTCH(nr.bts_nr,
+					   tr_PCUIF_DATA(nr.trx_nr, nr.ts_nr, sapi := PCU_IF_SAPI_PDTCH),
+					   ?)) -> value data_msg {
+		var uint3_t rx_usf := f_rlcmac_dl_block_get_usf(data_msg.dl_block);
+		var uint3_t exp_usf := ms.ul_tbf.usf[valueof(nr.ts_nr)];
+		log("Rx DL block USF ", rx_usf, " vs exp USF ", exp_usf);
+		if (rx_usf != exp_usf) {
+			BTS.send(ts_PCUIF_RTS_REQ(nr.bts_nr, nr.trx_nr, nr.ts_nr,
+				  sapi := PCU_IF_SAPI_PDTCH, fn := 0,
+				  arfcn := f_trxnr2arfcn(valueof(nr.trx_nr)),
+				  block_nr := nr.blk_nr));
+			repeat;
+		}
+		}
+	};
+
+	return data_msg.raw.fn;
+}
+
 ////////////////////////
 // Low level APIs
 ////////////////////////