1 /** \r
2 * @file test_wcdma_dl.c\r
3 *\r
4 * @brief \r
5 * Runs WCDMA Downlink (DL) test case using BCP driver APIs.\r
6 * \r
7 * \par\r
8 * ============================================================================\r
9 * @n (C) Copyright 2010, Texas Instruments, Inc.\r
10 * \r
11 * Redistribution and use in source and binary forms, with or without \r
12 * modification, are permitted provided that the following conditions \r
13 * are met:\r
14 *\r
15 * Redistributions of source code must retain the above copyright \r
16 * notice, this list of conditions and the following disclaimer.\r
17 *\r
18 * Redistributions in binary form must reproduce the above copyright\r
19 * notice, this list of conditions and the following disclaimer in the \r
20 * documentation and/or other materials provided with the \r
21 * distribution.\r
22 *\r
23 * Neither the name of Texas Instruments Incorporated nor the names of\r
24 * its contributors may be used to endorse or promote products derived\r
25 * from this software without specific prior written permission.\r
26 *\r
27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \r
28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT \r
29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
30 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT \r
31 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \r
32 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT \r
33 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
34 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
35 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT \r
36 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE \r
37 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
38 *\r
39 */\r
40 #include "bcp_test.h"\r
41 #include "bcp_test_wcdma.h"\r
42 \r
43 #define TX_DATA_BUFFER_SIZE 3072 \r
44 #define RX_DATA_BUFFER_SIZE 2048\r
45 #define TX_NUM_DESC 2\r
46 #define RX_NUM_DESC ((BCP_TEST_NUM_HOST_DESC/4) - TX_NUM_DESC)\r
47 #define RX_Q_NUM 900 + CSL_chipReadReg (CSL_CHIP_DNUM)\r
48 #define RX_FLOW_ID 0 + CSL_chipReadReg (CSL_CHIP_DNUM)\r
49 \r
50 extern UInt32 totalNumTestsPass, totalNumTestsFail;\r
51 \r
52 /* Input test vector */\r
53 #pragma DATA_SECTION (testVectorHsdpa, ".testData");\r
54 const UInt32 testVectorHsdpa [1][5] = { /* modScheme 0:QPSK, 1:16QAM, 2:64QAM */\r
55 /*TBsize modScheme Nir nPhyCh RVindex*/ \r
56 { 19904, 1, 28800, 11, 0 } \r
57 }; \r
58 \r
59 /* Output Reference Data */\r
60 #define WCDMA_DL_OUTPUT_PKT_1_WRD_SIZE 660\r
61 \r
62 #pragma DATA_SECTION (wcdma_dl_out_packet_1, ".testData");\r
63 static UInt32 wcdma_dl_out_packet_1[WCDMA_DL_OUTPUT_PKT_1_WRD_SIZE] = {\r
64 0x0b11d405,0x023b7515,0xdbd8d4ab,0x4b4bd5b0,\r
65 0x6c563dfe,0xcaa3f738,0xa67e1624,0x39f7d54f,\r
66 0x8fc41a45,0xe555602f,0x98234ae8,0x9e41fc66,\r
67 0x4d48b778,0x1cbc1c38,0x7f975df5,0xebc5288c,\r
68 0x6154814e,0x36823aa5,0xa1fdadd9,0x6412c616,\r
69 0x47703ec7,0x31059356,0x4cb0d247,0x368368bb,\r
70 0x09fc48c0,0xbc0d0c28,0x01a32772,0x0b6c1343,\r
71 0xbf0ee34b,0xadc2a144,0x0daf9506,0xbf2f42ea,\r
72 0x79d43a9e,0x85b2d179,0x0975ba4b,0x40be03e1,\r
73 0x482c95d9,0xdae85fbc,0x52e94515,0x9a4bb810,\r
74 0x361108d4,0xc2c2074b,0xf5cde3a3,0x65426e7c,\r
75 0x2e202a29,0x152b2074,0xa35b9012,0x11ad4fe5,\r
76 0xab5f23f9,0xc0738bf8,0x48fddd6e,0x1b7bc734,\r
77 0x9df5fd3c,0x5c7672ae,0xfb9dd1f4,0x13038a1c,\r
78 0x19840e1c,0xdc03077e,0xac4c54a1,0xf7313cc7,\r
79 0x9f364c1c,0xc56a9d2e,0x159d0542,0x55506ffb,\r
80 0x78a0bdfd,0x428a7f60,0x0140b9a3,0x4bed4304,\r
81 0xdddbda96,0x4766fa21,0xa1340b96,0xdee93da9,\r
82 0xa5a06628,0xc0485444,0x75c4cd88,0xcae5d523,\r
83 0xb443c96e,0x6e976aac,0x9c17e7c8,0x015d2b09,\r
84 0x94a99af9,0x7c726c3a,0x0616fdb4,0x96c5de8a,\r
85 0x39e3eb6c,0x91e1756a,0x11c0f5e9,0xeb31a4c8,\r
86 0x80c0b5ed,0xe8a9029d,0xdf7538ef,0x9acd09c7,\r
87 0x76269550,0x2ec6a35a,0xcc5cfd5c,0xb013cd8a,\r
88 0x714ab460,0x678569cc,0x16bd4501,0xbfc7284a,\r
89 0x232fb7dc,0x6b093b40,0xf9dd8b07,0x2a68b007,\r
90 0x362ffbfb,0xf2c74485,0x347abcca,0xecfac4f2,\r
91 0x804f882d,0x9d3e038b,0x5f8adea4,0x554f77cd,\r
92 0xbb5f2cbd,0x8458daf1,0x534e8590,0x30ebfdfa,\r
93 0x73ae6cc2,0xc4d3dff5,0xa09d8d8e,0x33a3e425,\r
94 0xb70a2641,0x5fc4dda5,0x4e8abe39,0xa5b69069,\r
95 0xc7fdde2e,0x5975a033,0xfab77422,0x44ba4583,\r
96 0xef10db32,0x5b092b77,0x8d54c5dd,0xf082d05e,\r
97 0x9d8708c2,0x236a2be4,0x4abf315e,0xcf6a2f24,\r
98 0x83d3ee79,0x5192d336,0x7bc7917c,0xe82ae07a,\r
99 0xce43a746,0x358cea4d,0xadbbf762,0xf67e1529,\r
100 0x4d35d500,0x0c647121,0x067987f1,0x01675586,\r
101 0x370d49ef,0x2d4809ef,0x5f7cdf09,0x8abeb245,\r
102 0xe441d8eb,0xe49d6c52,0x2c97054f,0xb90a67c3,\r
103 0xe01326d7,0x8904ebe9,0x3422b9c1,0x9021a8e3,\r
104 0x8ca30de8,0xb2aa22aa,0xe86d3ad0,0x100762f9,\r
105 0xa04d59f4,0xdc27527b,0x8cb53a52,0xb512b98e,\r
106 0xedd046c9,0x5add56d4,0x7227cc04,0x15fc6835,\r
107 0x7b9d1855,0x417433a0,0xbe10dd78,0xac73ec2a,\r
108 0x0a05a27f,0x987f7eb0,0x9f09bb52,0xfcdc7025,\r
109 0x47f78b1a,0xf3b187df,0xf78656f8,0x109fea86,\r
110 0xe5b0afd1,0x0c686a4f,0xeee48783,0x04d6af3c,\r
111 0x1597bfea,0x8df1aad3,0x51437920,0x8d80ec34,\r
112 0x774a9198,0xd00b3e08,0x0051c204,0xc5de2e58,\r
113 0xd0a33d88,0x0dbb8bbd,0xc41bb37e,0xc30f79f6,\r
114 0x8a8ead2e,0xdf4f16cd,0xac56e31a,0xa11345f9,\r
115 0x438250bf,0x62e267dd,0xf7c90bae,0x7a21a2b7,\r
116 0xd0ec0de6,0xa385a168,0x75a45761,0x685dae36,\r
117 0x0876b552,0xae631ffa,0xf38eeef3,0x88710938,\r
118 0xb2677a7b,0xd962db43,0xdb2cb1cc,0x44911a73,\r
119 0x2ee22970,0x25181e5b,0xc916bfb8,0xb1512cd1,\r
120 0xd64d0414,0xfcd245ed,0x2148857b,0x70436c82,\r
121 0x43a2839e,0x3edd4f03,0xcbf3c7fe,0x3b554400,\r
122 0x98525a1b,0x1fcbce80,0x5d2e3e2c,0x6cba6306,\r
123 0x5cad235c,0x478edd21,0x389da68e,0x93b16844,\r
124 0x156bcb87,0x3520306c,0x18bafe1f,0x5c1db8b5,\r
125 0x6cfdab5a,0x42ba5278,0xf4caae03,0x7784c119,\r
126 0x7acb7877,0xef0dcc3e,0xc261f0ca,0xb995e2d6,\r
127 0x632d5d29,0xb976a8c0,0xc03752f0,0xe48fb443,\r
128 0x0b32d8a5,0xa7123501,0x8a06110c,0x0f715fb2,\r
129 0xeecff07f,0xabccc554,0x60404f1d,0xcaae86cc,\r
130 0x3dbb608d,0xfae1932c,0x5577d2a3,0xaaa872b0,\r
131 0x069a9ceb,0x5d067f74,0x518fbffa,0xbd1b865f,\r
132 0xc6da5da3,0xaeeb76d2,0x20277eda,0x0cde9d6b,\r
133 0x19f0b162,0x37063e9b,0xc9d321d9,0x846fc94a,\r
134 0xd5a5589e,0x449b9d52,0x6c278993,0xb6f4c740,\r
135 0x639cc5d2,0xc5c45043,0x1364e083,0xd7e0c60b,\r
136 0x25ceed82,0xb3cfe57e,0xd2c14987,0xb87881ef,\r
137 0xbbd10816,0xfc09136a,0xfe0fc804,0x579861d9,\r
138 0xe47b6e7e,0x6e56e6a8,0x63597a8b,0x2bb656e0,\r
139 0x49838d6c,0xf87488d2,0x2e6b03c4,0x0e61c93a,\r
140 0x2e4849ee,0xdf094559,0x2d3954fb,0x974d0a69,\r
141 0x4867f73b,0x03c95ead,0xfd896310,0x2795f124,\r
142 0x02efd6d1,0x03c57d47,0x1ab3e0f0,0xd2202afd,\r
143 0x43d03737,0x89f007b5,0x0bf7d829,0xb7c2a49a,\r
144 0xd0f666a5,0x4aed8f5b,0xc3d3d119,0xed044e05,\r
145 0x3b406af3,0x5790d325,0x0539989d,0xc1935088,\r
146 0xfeb4ee3e,0x2127afe4,0xd651aa12,0xf077d788,\r
147 0x688977b0,0x67733fbe,0xefc7a68c,0x2502dea7,\r
148 0x1ce330eb,0xb0376050,0x95554b9c,0xd0840203,\r
149 0xec82afae,0xaf94f6f1,0x4374b273,0xacc013b3,\r
150 0x172249c5,0x7ae1b263,0x343f79b4,0x6f1f981f,\r
151 0xde7c479d,0x5ea4ed0a,0x760f8354,0x7c4faeb4,\r
152 0x3f15d4bd,0xf89a302e,0x7bba3719,0x57549d8f,\r
153 0x4df422ca,0x371374eb,0x173743fb,0xf30df611,\r
154 0x67aebab5,0x6b332e4e,0xcab8fca0,0xc6f23ab0,\r
155 0x86886c54,0x8af0e236,0x56b1e8c9,0xd5a29212,\r
156 0xa900dfb0,0xa6e529ee,0xeab68dfb,0x2b51e7ab,\r
157 0xa0231d5a,0xfd91a619,0xcff548e1,0x0668f879,\r
158 0xe027a185,0x4179fa7b,0xf2af98a4,0x94b5f9a6,\r
159 0x2c5e2068,0xa65ca76a,0xd2f576e7,0xcb5dd94c,\r
160 0xf0bd3681,0xb28b5262,0x500c6c29,0x50d7777e,\r
161 0x5c848f2d,0x2296822b,0x514466bd,0xe9d82a73,\r
162 0x7fbb8c1d,0xbc7241ef,0xe7f64a5b,0x780948fb,\r
163 0x08ab5bb4,0x21c41778,0x6f57db19,0xad26065e,\r
164 0xe68274c1,0x7c3e7159,0x47e1038a,0xd5f3cfb9,\r
165 0xd18adf03,0xdf1f9d0e,0x624cdc27,0x59e352e3,\r
166 0xfcac8850,0xa8e90d6a,0x3cf3f5ad,0xfbf2c729,\r
167 0x64f5f296,0x2507066d,0x4979a8c4,0x3066d4af,\r
168 0x4506ccb2,0x289877c8,0xcaecb1b7,0xf57e9a44,\r
169 0x05012cef,0x4ba23455,0xff936f79,0xbd897b74,\r
170 0x756fc386,0xdca2619d,0x87464903,0x3dd29f5d,\r
171 0xdec4ef53,0xcfb5b4d2,0xb6c953c1,0x5103207c,\r
172 0xa80c5d4d,0xe2558bb2,0x7c864228,0x7e0a8175,\r
173 0xf8400ff0,0xf193a5f6,0xa38ff58d,0xdbe49d18,\r
174 0xb5223f27,0xea73b3ab,0xbabb4090,0x154574c7,\r
175 0xce2ee913,0xc9ce27d8,0xb39f9dfc,0xf38e0d84,\r
176 0x346ae61d,0xfb53236b,0x9abaecf5,0xede34182,\r
177 0x47197893,0x4f797e25,0xdbf54c99,0x284f15e6,\r
178 0x671641d9,0xef848723,0x06eddd31,0xf5df3b10,\r
179 0xe5f78eb5,0x155d478e,0x23630e3c,0xdce6b5bf,\r
180 0x7e248575,0x2cca1a91,0xdef37e3d,0x1fdedcd6,\r
181 0xb586d73d,0xacf0b678,0xbbdcace8,0x391d9804,\r
182 0xe9082aa3,0xf1ec8985,0xe16a73db,0xf688959f,\r
183 0xe74d22c6,0x459e46e1,0xb0247dda,0x9fd11e05,\r
184 0x0b5def2d,0xecf32dc2,0xa384d385,0x510fe884,\r
185 0x2d3f5227,0xff850179,0xe313112d,0x7fb97ad5,\r
186 0x8ff85e62,0x40690bf2,0x2739fb6e,0x7346da23,\r
187 0xac066fb1,0xf6916c7d,0xf4431640,0xa1d99245,\r
188 0x7266d171,0xf47e2f3b,0xb0fceeb8,0x4c031b76,\r
189 0x3d5f0934,0xb09d4f09,0x6c5b57be,0xea82efe9,\r
190 0xc8cf0ab2,0x610e3f7f,0xb485af08,0xa9ed95af,\r
191 0x8153a5e3,0x2a8af54e,0xf19373d3,0x59144aaa,\r
192 0xa02cfaee,0x5aee05a0,0x8e5730ac,0xbccd5d33,\r
193 0x9d05320c,0x1a9e8407,0xe947c8d9,0x00fe3183,\r
194 0x5880ac93,0x68fda70d,0x611d7e00,0x986a5dd6,\r
195 0x03cee2db,0x96a46f44,0x93158028,0xc4f0b2ff,\r
196 0x23b8783e,0xc914b503,0x32fdc2cf,0xad20c2ba,\r
197 0x47c73ea8,0x840e0efe,0x6cb4ca6d,0xc94d1934,\r
198 0x2ba1b6e2,0xda4428b4,0x644ff43c,0xa1f9ed81,\r
199 0xbdde80c8,0xb738efde,0xcd097f06,0xc14c72d6,\r
200 0x9ca6cc9a,0x83536f1d,0x38894e1f,0x0acd57f9,\r
201 0xd5f1c2cd,0x043f91fe,0x3af792d0,0x0a70c96d,\r
202 0x79aecf54,0x5f8596cf,0x33e13d34,0x70dfecc6,\r
203 0xeea62734,0x6975223b,0xe583ce5b,0x196c3390,\r
204 0xf9ae3c7b,0x4541c644,0x927bcd5e,0x59f9ab76,\r
205 0x25fa1cf8,0x664398f2,0x7d814b42,0xaac5533f,\r
206 0x2b6120f8,0xa91cd863,0x4b7da0d1,0x9a894f62,\r
207 0x5b22bf7d,0x6b762af4,0xd8cdb535,0x98f23dd8,\r
208 0xf947261b,0x0102563e,0x0c2458a8,0x5dec7030,\r
209 0xbe08e482,0xec1b4c83,0x1ae2fadf,0x40ca332b,\r
210 0x288bb8c2,0x2645a069,0x93bf5db1,0x7cb5f150,\r
211 0xe0e8c8bc,0xd74ce29b,0xf7f65cca,0x1e0a69bf,\r
212 0x07111fac,0x5c66e829,0x3f3b1c40,0xdbcd4176,\r
213 0xe141d347,0x24da2e9a,0x69a0268b,0xbbbe01d5,\r
214 0xaf9d9fbd,0x7207639c,0x981071fb,0xe0c1757c,\r
215 0xfe64fd5f,0x4856eb87,0xbd56a8fd,0x1f919215,\r
216 0x26afd1e8,0x5deae9a3,0xa4b25dd8,0x8b8f171d,\r
217 0x621b869d,0x16efc050,0x2b8b47f2,0x3c93e9c5,\r
218 0x73e5d8be,0xde031aaa,0x78c381a8,0xa53c135c,\r
219 0xe8dc64e2,0x41fcd33d,0xf799aca4,0x6a9793fd,\r
220 0xecf5f535,0xbd8d85bc,0xa862009b,0x759c20b9,\r
221 0xbc245324,0xf86109fa,0x03c0b6ab,0x875f3ba6,\r
222 0x4bd1fc10,0x0d85b87a,0xb6ab752e,0xa35a39cb,\r
223 0x6dae94f1,0x613bb3bc,0x4df5c36c,0xd32da5f8,\r
224 0xbf20c81d,0xe5ec998f,0x69e0f30a,0xfbadf35c,\r
225 0x56749b45,0x1819e000,0x3e4385b8,0xaccb194a,\r
226 0xc081b1ae,0xa7ec3c2c,0x2a49a670,0xb05148e4,\r
227 0x749a730a,0x5a590b2a,0xe0de46f8,0x8aaae429,\r
228 0xfc0574ac,0x51c6eaf5,0x2ccedddc,0x77e426ec};\r
229 \r
230 \r
231 /** ============================================================================\r
232 * @n@b computeParams_secRateMatch\r
233 *\r
234 * @b Description\r
235 * @n Utility function used by WCDMA 3GPP --> BCP Params mapper API \r
236 * @a computeParams_hsdpa() to calculate 2nd loop Rate matching params.\r
237 *\r
238 * @param[in] \r
239 * @n Nedata Number of rate matching output bits\r
240 * \r
241 * @param[in] \r
242 * @n Nsys Number of 2nd loop rate matching input systematic bits\r
243 * \r
244 * @param[in] \r
245 * @n Np1 Number of 2nd loop rate matching input parity1 bits\r
246 * \r
247 * @param[in] \r
248 * @n Np2 Number of 2nd loop rate matching input parity1 bits \r
249 *\r
250 * @param[in] \r
251 * @n r \r
252 * \r
253 * @param[in] \r
254 * @n s \r
255 * \r
256 * @param[in] \r
257 * @n rmax \r
258 * \r
259 * @param[out] \r
260 * @n pEinit Init value for rate matching loop\r
261 * \r
262 * @param[out] \r
263 * @n pEminus Minus value for rate matching loop\r
264 * \r
265 * @param[out] \r
266 * @n pEplus Plus value for rate matching loop\r
267 * \r
268 * @param[out] \r
269 * @n pNtsys Number of systematic bits for the loop\r
270 * \r
271 * @param[out] \r
272 * @n pPunctureFlag Indicates if puncturing is to be performed\r
273 * \r
274 * @return \r
275 * @n None\r
276 * =============================================================================\r
277 */\r
278 static Void computeParams_secRateMatch\r
279 ( \r
280 Int32 Nedata, \r
281 Int32 Nsys, \r
282 Int32 Np1, \r
283 Int32 Np2, \r
284 Int32 r,\r
285 Int32 s,\r
286 Int32 rmax,\r
287 Int32 *pEinit,\r
288 Int32 *pEminus,\r
289 Int32 *pEplus,\r
290 Int32 *pNtsys,\r
291 Int32 *pPunctureFlag\r
292 )\r
293 {\r
294 Int32 einit[3];\r
295 Int32 eminus[3];\r
296 Int32 eplus[3];\r
297 Int32 punctureFlag;\r
298 Int32 Ntsys;\r
299 Int32 Ntp1;\r
300 Int32 Ntp2;\r
301 Int32 temp_int32;\r
302 double temp_double;\r
303 Int32 Xi[3];\r
304 Uint32 i;\r
305 \r
306 if (Nedata <= Nsys+Np1+Np2)//puncturing case\r
307 {\r
308 punctureFlag = 1;\r
309 }\r
310 else if (Nedata > Nsys+Np1+Np2) //repeatition case\r
311 {\r
312 punctureFlag = 0;\r
313 }\r
314 \r
315 /* get einit, eplus and eminus for the second RM based on 3GPP 25.212 section 4.5.4.3 */\r
316 if (punctureFlag == 1)//puncturing case\r
317 {\r
318 if (s==1) //systematic bits are prioritised \r
319 {\r
320 if (Nsys < Nedata)\r
321 Ntsys = Nsys;\r
322 else\r
323 Ntsys = Nedata;\r
324 }\r
325 else if (s==0) //systematic bits are not prioritised \r
326 {\r
327 temp_int32 = (Int32)Nedata-(Np1+Np2);\r
328 if (temp_int32>0)\r
329 Ntsys = temp_int32;\r
330 else\r
331 Ntsys = 0;\r
332 }\r
333 }\r
334 else // repeatition case\r
335 {\r
336 temp_double = (double)Nsys*Nedata/(Nsys+2*Np1);\r
337 Ntsys = (Int32)floor(temp_double); \r
338 }\r
339 \r
340 temp_double = (double)(Nedata-Ntsys)/2;\r
341 Ntp1 = (Int32)floor(temp_double);\r
342 Ntp2 = (Int32)ceil (temp_double);\r
343 \r
344 /* 3GPP 25.212 section 4.5.4.3 table 10 */ \r
345 Xi[0] = Nsys;\r
346 Xi[1] = Np1;\r
347 Xi[2] = Np2;\r
348 \r
349 /* get eplus */\r
350 eplus[0] = Nsys;\r
351 eplus[1] = 2*Np1;\r
352 eplus[2] = Np2;\r
353 \r
354 /* get eminus */\r
355 temp_int32 = (Int32)Nsys-Ntsys;\r
356 eminus[0] = (Int32)abs(temp_int32);\r
357 \r
358 temp_int32 = (Int32)Np1-Ntp1;\r
359 eminus[1] = (Int32)2*abs(temp_int32);\r
360 \r
361 temp_int32 = (Int32)Np2-Ntp2;\r
362 eminus[2] = (Int32)abs(temp_int32);\r
363 \r
364 /* get einit */\r
365 for (i = 0; i < 3; i++)\r
366 {\r
367 if (punctureFlag == 1)//puncturing case \r
368 temp_double = (double)r*eplus[i]/rmax;\r
369 else//repeating case\r
370 temp_double = (double)(s+2*r)*eplus[i]/(2*rmax);\r
371 \r
372 temp_int32 = (Int32)(Xi[i]-(Int32)floor(temp_double)-1);\r
373 \r
374 if (eplus[i] == 0)\r
375 {\r
376 einit[i] = temp_int32 + 1;\r
377 }\r
378 else\r
379 {\r
380 while (temp_int32 < 0)\r
381 {\r
382 temp_int32 += eplus[i];\r
383 }\r
384 einit[i] = (temp_int32%eplus[i]) + 1;\r
385 }\r
386 }\r
387 \r
388 /* output */\r
389 for (i = 0; i < 3; i++)\r
390 {\r
391 pEinit[i] = einit[i];\r
392 pEminus[i] = eminus[i];\r
393 pEplus[i] = eplus[i];\r
394 }\r
395 \r
396 *pNtsys = Ntsys;\r
397 *pPunctureFlag = punctureFlag;\r
398 }\r
399 \r
400 /** ============================================================================\r
401 * @n@b computeParams_hsdpa\r
402 *\r
403 * @b Description\r
404 * @n Given a small subset of 3GPP params, this function calculates and maps \r
405 * out the params based on 3GPP specs to actual BCP H/w Parameters.\r
406 *\r
407 * @param[out] \r
408 * @n pHsdpaParams HSDPA parameters calculated for this test.\r
409 * \r
410 * @return \r
411 * @n None\r
412 * =============================================================================\r
413 */\r
414 static Void computeParams_hsdpa (BcpTest_HsdpaParams* pHsdpaParams)\r
415 {\r
416 Int32 B;\r
417 double temp_double;\r
418 Int32 C;\r
419 Int32 K;\r
420 Int32 Ne;\r
421 Int32 deltaNtti;\r
422 Int32 Nsys;\r
423 Int32 Np1;\r
424 Int32 Np2;\r
425 Int32 einit1_p1;\r
426 Int32 einit1_p2;\r
427 Int32 eplus1_p1;\r
428 Int32 eplus1_p2;\r
429 Int32 eminus1_p1;\r
430 Int32 eminus1_p2;\r
431 Int32 a_p1;\r
432 Int32 a_p2;\r
433 Int32 deltaNi_p1;\r
434 Int32 deltaNi_p2;\r
435 Int32 rmax;\r
436 Int32* tab_s;\r
437 Int32* tab_r;\r
438 Int32* tab_b;\r
439 Int32 Ndata;\r
440 Int32 s;\r
441 Int32 r; \r
442 Int32 Nedata;\r
443 Int32 Ntsys;\r
444 Int32 Xi_p1;\r
445 Int32 Xi_p2;\r
446 Int32 eplus[3];\r
447 Int32 eminus[3];\r
448 Int32 einit[3];\r
449 Int32 Ncol;\r
450 Int32 Nrow;\r
451 Int32 Nr;\r
452 Int32 Nc;\r
453 Int32 punctureFlag;\r
454 \r
455 /* RV value to s R table 3GPP 25.212 sec 4.6.2.1 table 12 */\r
456 /* RV value 0 1 2 3 4 5 6 7 */\r
457 const Int32 tab_s_16QAM_64QAM[8] = {1, 0, 1, 0, 1, 1, 1, 1};\r
458 const Int32 tab_R_16QAM_64QAM[8] = {0, 0, 1, 1, 0, 0, 0, 1};\r
459 const Int32 tab_b_16QAM_64QAM[8] = {0, 0, 1, 1, 1, 2, 3, 0};\r
460 \r
461 /* RV value to s R table 3GPP 25.212 sec 4.6.2.1 table 13 */\r
462 /* RV value 0 1 2 3 4 5 6 7 */\r
463 const Int32 tab_s_QPSK[8] = {1, 0, 1, 0, 1, 0, 1, 0};\r
464 const Int32 tab_r_QPSK[8] = {0, 0, 1, 1, 2, 2, 3, 3};\r
465 const Int32 tab_b_QPSK[8] = {0, 0, 0, 0, 0, 0, 0, 0};//QPSK is transparent\r
466 \r
467 /* start calculate */\r
468 B = pHsdpaParams->TBsize + 24;\r
469 \r
470 temp_double = (double)B/5114;\r
471 C = (Int32)ceil(temp_double);\r
472 \r
473 if (B < 40)\r
474 {\r
475 K = 40;\r
476 }\r
477 else\r
478 {\r
479 temp_double = (double)B/C;\r
480 K = (Int32)ceil(temp_double);\r
481 }\r
482 \r
483 /* the number of turbo encoder output bit */ \r
484 /* the number of rate matching input bit */ \r
485 Ne = C*(3*K+12);\r
486 \r
487 /* the first stage rate matching */\r
488 /* 3GPP 25.212 sec4.5.4.2 */\r
489 Nsys = Ne/3;// systematic stream is transparent always %\r
490 \r
491 if (Nsys > pHsdpaParams->Nir)\r
492 {\r
493 pHsdpaParams->valid = 0;//this test case is not valid\r
494 }\r
495 else\r
496 {\r
497 pHsdpaParams->valid = 1;//this test case is valid\r
498 \r
499 deltaNtti = pHsdpaParams->Nir - Ne;\r
500 \r
501 a_p1 = 2;\r
502 a_p2 = 1;\r
503 \r
504 if (deltaNtti >= 0) //two parity streams transparent\r
505 {\r
506 Np1 = Ne/3;\r
507 Np2 = Ne/3;\r
508 \r
509 /* As long as e_init>0, e_minus=0; e_plus=any_value; this is equivalent to transparent (no puncture/no repeat) operation */\r
510 /* set the value based on 25.212 Sec4.2.7.2.1.4 */\r
511 einit1_p1 = Np1;//any value greater than 0\r
512 einit1_p2 = Np2;//any value greater than 0\r
513 \r
514 eplus1_p1 = a_p1*Np1;//it is not be used actually\r
515 eplus1_p2 = a_p2*Np2;//it is not be used actually\r
516 \r
517 eminus1_p1 = 0;//must be 0\r
518 eminus1_p2 = 0;//must be 0\r
519 }\r
520 else //two parity streams puncturing\r
521 { \r
522 //3GPP 25.212 sec 4.2.7.2.2.3 \r
523 temp_double = (double)deltaNtti/2;\r
524 deltaNi_p1 = (Int32)floor(temp_double);\r
525 deltaNi_p2 = (Int32)ceil (temp_double);\r
526 \r
527 Xi_p1 = Ne/3;\r
528 Xi_p2 = Ne/3;\r
529 \r
530 einit1_p1 = Xi_p1;// innital parity 1 \r
531 einit1_p2 = Xi_p2;//innital parity 2 \r
532 \r
533 eplus1_p1 = a_p1*Xi_p1;\r
534 eplus1_p2 = a_p2*Xi_p2;\r
535 \r
536 eminus1_p1 = a_p1*abs(deltaNi_p1);\r
537 eminus1_p2 = a_p2*abs(deltaNi_p2);\r
538 \r
539 Np1 = Ne/3 + deltaNi_p1;\r
540 Np2 = Ne/3 + deltaNi_p2;\r
541 }\r
542 \r
543 /* the second stage rate matching */\r
544 /* parameters in 3GPP 25.212 section 4.5.4.3 */\r
545 if (pHsdpaParams->modScheme == 0) //QPSK \r
546 {\r
547 rmax = 4;\r
548 tab_s = (Int32*)tab_s_QPSK;\r
549 tab_r = (Int32*)tab_r_QPSK;\r
550 tab_b = (Int32*)tab_b_QPSK;\r
551 Ndata = 320;\r
552 }\r
553 else // 16QAM and 64QAM \r
554 {\r
555 rmax = 2;\r
556 tab_s = (Int32*)tab_s_16QAM_64QAM;\r
557 tab_r = (Int32*)tab_R_16QAM_64QAM;\r
558 tab_b = (Int32*)tab_b_16QAM_64QAM;\r
559 if (pHsdpaParams->modScheme == 1)//16QAM\r
560 Ndata = 640;\r
561 else//64QAM\r
562 Ndata = 960;\r
563 }\r
564 \r
565 s = tab_s[pHsdpaParams->RVindex];\r
566 r = tab_r[pHsdpaParams->RVindex];\r
567 \r
568 /* the number of rate matching output bit */ \r
569 Nedata = pHsdpaParams->nPhyCh*3*Ndata;\r
570 \r
571 computeParams_secRateMatch(Nedata,//number of rate matching output bit \r
572 Nsys, //number of 2nd rate matching input sys bits\r
573 Np1, //number of 2nd rate matching input par1 bits\r
574 Np2, //number of 2nd rate matching input par2 bits\r
575 r,\r
576 s,\r
577 rmax,\r
578 (Int32*)einit,\r
579 (Int32*)eminus,\r
580 (Int32*)eplus,\r
581 (Int32*)&Ntsys,\r
582 (Int32*)&punctureFlag);\r
583 \r
584 Nrow = (pHsdpaParams->modScheme+1)*2;\r
585 Ncol = Nedata/Nrow;\r
586 temp_double = (double)Ntsys/Ncol;\r
587 Nr = (Int32)floor(temp_double);\r
588 Nc = Ntsys-Nr*Ncol;\r
589 \r
590 /* output parameters */\r
591 pHsdpaParams->numCodeBks = C;\r
592 pHsdpaParams->codeBkSizeK = K;\r
593 pHsdpaParams->numFillerBits = C*K-B;\r
594 pHsdpaParams->Ne = Ne;\r
595 pHsdpaParams->Nedata = Nedata;\r
596 pHsdpaParams->einit_sys = einit[0];\r
597 pHsdpaParams->eplus_sys = eplus[0];\r
598 pHsdpaParams->eminus_sys = eminus[0];\r
599 pHsdpaParams->einit1_p1 = einit1_p1;\r
600 pHsdpaParams->eplus1_p1 = eplus1_p1;\r
601 pHsdpaParams->eminus1_p1 = eminus1_p1;\r
602 pHsdpaParams->einit1_p2 = einit1_p2;\r
603 pHsdpaParams->eplus1_p2 = eplus1_p2;\r
604 pHsdpaParams->eminus1_p2 = eminus1_p2;\r
605 pHsdpaParams->einit_p1 = einit[1];\r
606 pHsdpaParams->eplus_p1 = eplus[1]; \r
607 pHsdpaParams->eminus_p1 = eminus[1]; \r
608 pHsdpaParams->einit_p2 = einit[2]; \r
609 pHsdpaParams->eplus_p2 = eplus[2]; \r
610 pHsdpaParams->eminus_p2 = eminus[2]; \r
611 pHsdpaParams->Ncol = Ncol;\r
612 pHsdpaParams->Nrow = Nrow;\r
613 pHsdpaParams->Nr = Nr;\r
614 pHsdpaParams->Nc = Nc;\r
615 pHsdpaParams->punctureFlag = punctureFlag;\r
616 pHsdpaParams->b = tab_b[pHsdpaParams->RVindex];\r
617 }\r
618 \r
619 return;\r
620 }\r
621 \r
622 \r
623 /** ============================================================================\r
624 * @n@b prepare_wcdma_enchdr_cfg\r
625 *\r
626 * @b Description\r
627 * @n Sets up the Encoder engine header for the test. \r
628 *\r
629 * @param[out] \r
630 * @n pEncHdrCfg Encoder Header configuration thus populated for the test.\r
631 * \r
632 * @param[in] \r
633 * @n pHsdpaParams HSDPA parameters calculated for this test.\r
634 * \r
635 * @return \r
636 * @n None\r
637 * =============================================================================\r
638 */\r
639 static Void prepare_wcdma_enchdr_cfg\r
640 (\r
641 Bcp_EncHdrCfg* pEncHdrCfg, \r
642 BcpTest_HsdpaParams* pHsdpaParams,\r
643 UInt32 turboFlag,\r
644 UInt32 codeRateFlag\r
645 )\r
646 {\r
647 UInt32 i; \r
648 \r
649 /* Setup the Encoder header as per inputs passed. */ \r
650 pEncHdrCfg->local_hdr_len = 1; \r
651 pEncHdrCfg->turbo_conv_sel = turboFlag;\r
652 \r
653 if (pHsdpaParams->numCodeBks)\r
654 {\r
655 pEncHdrCfg->blockCfg[0].block_size = pHsdpaParams->codeBkSizeK;\r
656 pEncHdrCfg->blockCfg[0].num_code_blks = pHsdpaParams->numCodeBks;\r
657 }\r
658 else\r
659 {\r
660 pEncHdrCfg->blockCfg[0].block_size = 0;\r
661 pEncHdrCfg->blockCfg[0].num_code_blks = 0;\r
662 }\r
663 pEncHdrCfg->blockCfg[1].block_size = 0;\r
664 pEncHdrCfg->blockCfg[1].num_code_blks = 0;\r
665 \r
666 pEncHdrCfg->blockCfg[2].block_size = 0;\r
667 pEncHdrCfg->blockCfg[2].num_code_blks = 0;\r
668 \r
669 pEncHdrCfg->scr_crc_en = 0; //Dont add CRC\r
670 \r
671 if (turboFlag == 1)\r
672 pEncHdrCfg->code_rate_flag = 0;\r
673 else\r
674 pEncHdrCfg->code_rate_flag = codeRateFlag;\r
675 \r
676 for (i = 0; i < 3; i ++)\r
677 {\r
678 pEncHdrCfg->blockCfg[i].intvpar0 = 0;\r
679 pEncHdrCfg->blockCfg[i].intvpar1 = 0;\r
680 pEncHdrCfg->blockCfg[i].intvpar2 = 0;\r
681 pEncHdrCfg->blockCfg[i].intvpar3 = 0;\r
682 }\r
683 \r
684 return; \r
685 }\r
686 \r
687 /** ============================================================================\r
688 * @n@b prepare_wcdma_rmhdr_cfg\r
689 *\r
690 * @b Description\r
691 * @n Sets up the Rate Modulation engine header for the test. \r
692 *\r
693 * @param[out] \r
694 * @n pRmHdrCfg Rate Modulation Header configuration thus populated for the test.\r
695 * \r
696 * @param[in] \r
697 * @n xCdmaChanType WCDMA channel type.\r
698 * \r
699 * @param[in] \r
700 * @n pHsdpaParams HSDPA parameters calculated for this test.\r
701 * \r
702 * @return \r
703 * @n None\r
704 * =============================================================================\r
705 */\r
706 static Void prepare_wcdma_rmhdr_cfg\r
707 (\r
708 Bcp_RmHdr_xCdmaCfg* pRmHdrCfg,\r
709 UInt8 xCdmaChanType,\r
710 BcpTest_HsdpaParams* pHsdpaParams\r
711 )\r
712 {\r
713 UInt32 i; \r
714 \r
715 /* Setup the xCDMA Rate Modulation header as per inputs passed. */ \r
716 pRmHdrCfg->local_hdr_len = 20;\r
717 pRmHdrCfg->input_order = 1;\r
718 pRmHdrCfg->half_rate = 0;\r
719 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
720 {\r
721 pRmHdrCfg->collect_cols = pHsdpaParams->Ncol;\r
722 pRmHdrCfg->collect_rows = pHsdpaParams->Nrow;\r
723 }\r
724 else if (xCdmaChanType == WCDMAFDD_HSUPAPIC)\r
725 {\r
726 pRmHdrCfg->collect_cols = 0;\r
727 pRmHdrCfg->collect_rows = 0;\r
728 }\r
729 pRmHdrCfg->num_scram = 0;\r
730 \r
731 /* Setup Systematic channel */\r
732 pRmHdrCfg->sys0_len = pHsdpaParams->Ne/3;\r
733 pRmHdrCfg->sys0_init2 = pHsdpaParams->einit_sys;\r
734 pRmHdrCfg->sys0_minus2 = pHsdpaParams->eminus_sys;\r
735 pRmHdrCfg->sys0_plus2 = pHsdpaParams->eplus_sys;\r
736 pRmHdrCfg->sys0_alpha = 0;\r
737 pRmHdrCfg->sys0_beta = 0;\r
738 pRmHdrCfg->sys0_puncture = pHsdpaParams->punctureFlag;\r
739 \r
740 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
741 pRmHdrCfg->sys0_turbo = 3;\r
742 else\r
743 pRmHdrCfg->sys0_turbo = 2;\r
744 \r
745 /* Transport channels 0-4 not used */\r
746 for (i = 0; i < 5; i ++)\r
747 {\r
748 pRmHdrCfg->channelCfg[i].sys_len = 0; \r
749 pRmHdrCfg->channelCfg[i].sys_init2 = 0; \r
750 pRmHdrCfg->channelCfg[i].sys_minus2 = 0; \r
751 pRmHdrCfg->channelCfg[i].sys_plus2 = 0; \r
752 pRmHdrCfg->channelCfg[i].sys_aplha = 0; \r
753 pRmHdrCfg->channelCfg[i].sys_beta = 0; \r
754 pRmHdrCfg->channelCfg[i].sys_puncture = 0; \r
755 pRmHdrCfg->channelCfg[i].sys_turbo = 0; \r
756 }\r
757 \r
758 /* Setup Parity 1 */\r
759 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
760 {\r
761 pRmHdrCfg->p0_par1_len = pHsdpaParams->Ne/3;\r
762 pRmHdrCfg->p0_par1_init1 = pHsdpaParams->einit1_p1;\r
763 pRmHdrCfg->p0_par1_minus1 = pHsdpaParams->eminus1_p1;\r
764 pRmHdrCfg->p0_par1_plus1 = pHsdpaParams->eplus1_p1;\r
765 pRmHdrCfg->p0_par1_init2 = pHsdpaParams->einit_p1;\r
766 pRmHdrCfg->p0_par1_minus2 = pHsdpaParams->eminus_p1;\r
767 pRmHdrCfg->p0_par1_plus2 = pHsdpaParams->eplus_p1;\r
768 }\r
769 else if (xCdmaChanType == WCDMAFDD_HSUPAPIC)\r
770 {\r
771 pRmHdrCfg->p0_par1_len = 0;\r
772 pRmHdrCfg->p0_par1_init1 = 0;\r
773 pRmHdrCfg->p0_par1_minus1 = 0;\r
774 pRmHdrCfg->p0_par1_plus1 = 0;\r
775 pRmHdrCfg->p0_par1_init2 = 0;\r
776 pRmHdrCfg->p0_par1_minus2 = 0;\r
777 pRmHdrCfg->p0_par1_plus2 = 0;\r
778 }\r
779 \r
780 /* Setup Parity 2 */\r
781 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
782 {\r
783 pRmHdrCfg->p0_par2_len = pHsdpaParams->Ne/3;\r
784 pRmHdrCfg->p0_par2_init1 = pHsdpaParams->einit1_p2;\r
785 pRmHdrCfg->p0_par2_minus1 = pHsdpaParams->eminus1_p2;\r
786 pRmHdrCfg->p0_par2_plus1 = pHsdpaParams->eplus1_p2;\r
787 pRmHdrCfg->p0_par2_init2 = pHsdpaParams->einit_p2;\r
788 pRmHdrCfg->p0_par2_minus2 = pHsdpaParams->eminus_p2;\r
789 pRmHdrCfg->p0_par2_plus2 = pHsdpaParams->eplus_p2;\r
790 }\r
791 else if (xCdmaChanType == WCDMAFDD_HSUPAPIC)\r
792 {\r
793 pRmHdrCfg->p0_par2_len = 0;\r
794 pRmHdrCfg->p0_par2_init1 = 0;\r
795 pRmHdrCfg->p0_par2_minus1 = 0;\r
796 pRmHdrCfg->p0_par2_plus1 = 0;\r
797 pRmHdrCfg->p0_par2_init2 = 0;\r
798 pRmHdrCfg->p0_par2_minus2 = 0;\r
799 pRmHdrCfg->p0_par2_plus2 = 0;\r
800 }\r
801 \r
802 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
803 {\r
804 pRmHdrCfg->p1_par1_len = 0;\r
805 pRmHdrCfg->p1_par1_init2 = 0;\r
806 pRmHdrCfg->p1_par1_minus2 = 0;\r
807 pRmHdrCfg->p1_par1_plus2 = 0;\r
808 }\r
809 else if (xCdmaChanType == WCDMAFDD_HSUPAPIC)\r
810 {\r
811 pRmHdrCfg->p1_par1_len = pHsdpaParams->Ne/3;\r
812 pRmHdrCfg->p1_par1_init2 = pHsdpaParams->einit_p1;\r
813 pRmHdrCfg->p1_par1_minus2 = pHsdpaParams->eminus_p1;\r
814 pRmHdrCfg->p1_par1_plus2 = pHsdpaParams->eplus_p1;\r
815 }\r
816 \r
817 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
818 {\r
819 pRmHdrCfg->p1_par2_len = 0;\r
820 pRmHdrCfg->p1_par2_init2 = 0;\r
821 pRmHdrCfg->p1_par2_minus2 = 0;\r
822 pRmHdrCfg->p1_par2_plus2 = 0;\r
823 }\r
824 else if (xCdmaChanType == WCDMAFDD_HSUPAPIC)\r
825 {\r
826 pRmHdrCfg->p1_par2_len = pHsdpaParams->Ne/3;\r
827 pRmHdrCfg->p1_par2_init2 = pHsdpaParams->einit_p2;\r
828 pRmHdrCfg->p1_par2_minus2 = pHsdpaParams->eminus_p2;\r
829 pRmHdrCfg->p1_par2_plus2 = pHsdpaParams->eplus_p2;\r
830 }\r
831 \r
832 return; \r
833 }\r
834 \r
835 /** ============================================================================\r
836 * @n@b prepare_inthdr_cfg\r
837 *\r
838 * @b Description\r
839 * @n Sets up the Interleaver engine header for the test. \r
840 *\r
841 * @param[out] \r
842 * @n pIntHdrCfg Interleaver Header configuration thus populated for the test.\r
843 * \r
844 * @param[in] \r
845 * @n xCdmaChanType WCDMA channel type.\r
846 * \r
847 * @param[in] \r
848 * @n pHsdpaParams HSDPA parameters calculated for this test.\r
849 * \r
850 * @return \r
851 * @n None\r
852 * =============================================================================\r
853 */\r
854 static Void prepare_inthdr_cfg \r
855 (\r
856 Bcp_IntHdrCfg* pIntHdrCfg,\r
857 UInt8 xCdmaChanType,\r
858 BcpTest_HsdpaParams* pHsdpaParams\r
859 )\r
860 {\r
861 UInt32 i; \r
862 \r
863 /* Setup the interleaver header as per inputs passed */\r
864 pIntHdrCfg->local_hdr_len = 3;\r
865 pIntHdrCfg->num_constellation = pHsdpaParams->b;\r
866 pIntHdrCfg->flag_half_rate = 0;\r
867 \r
868 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
869 pIntHdrCfg->num_data_format_out = 7 - pHsdpaParams->TACformatFlag * 2;\r
870 else\r
871 pIntHdrCfg->num_data_format_out = 0;\r
872 pIntHdrCfg->num_add_dtx = 0;\r
873 \r
874 for (i = 0; i < 6; i ++)\r
875 {\r
876 if (i == 0)\r
877 pIntHdrCfg->tblCfg[i].num_data_format_in = (pHsdpaParams->modScheme + 1) * 2;\r
878 else\r
879 pIntHdrCfg->tblCfg[i].num_data_format_in = 0;\r
880 }\r
881 \r
882 if (xCdmaChanType == TDSCDMA_REL99DL)\r
883 {\r
884 pIntHdrCfg->flag_in_order = 1; // input is from encoder\r
885 }\r
886 else\r
887 {\r
888 pIntHdrCfg->flag_in_order = 0; // input is from rate matching engine\r
889 }\r
890 \r
891 if (xCdmaChanType == WCDMAFDD_HSDPA)\r
892 {\r
893 pIntHdrCfg->num_int_ways = 30;\r
894 \r
895 for (i = 0; i < 6; i ++)\r
896 {\r
897 if (i == 0)\r
898 pIntHdrCfg->tblCfg[i].num_r2_length = 32;\r
899 else\r
900 pIntHdrCfg->tblCfg[i].num_r2_length = 0;\r
901 pIntHdrCfg->tblCfg[i].num_dummy = 0;\r
902 }\r
903 }\r
904 else\r
905 {\r
906 pIntHdrCfg->num_int_ways = 0;\r
907 \r
908 for (i = 0; i < 6; i ++)\r
909 {\r
910 pIntHdrCfg->tblCfg[i].num_r2_length = 0;\r
911 pIntHdrCfg->tblCfg[i].num_dummy = 0;\r
912 }\r
913 }\r
914 \r
915 pIntHdrCfg->num_frame_count = pHsdpaParams->nPhyCh;\r
916 \r
917 return; \r
918 }\r
919 \r
920 /** ============================================================================\r
921 * @n@b prepare_tmhdr_cfg\r
922 *\r
923 * @b Description\r
924 * @n Sets up the Traffic Manager header for the test. \r
925 *\r
926 * @param[out] \r
927 * @n pTmHdrCfg TM Header configuration thus populated for the test.\r
928 * \r
929 * @return \r
930 * @n None.\r
931 * =============================================================================\r
932 */\r
933 static Void prepare_tmhdr_cfg (Bcp_TmHdrCfg* pTmHdrCfg)\r
934 {\r
935 /* No PS/Info data for now */ \r
936 pTmHdrCfg->ps_data_size = 0;\r
937 pTmHdrCfg->info_data_size = 0;\r
938 \r
939 return;\r
940 }\r
941 \r
942 /** ============================================================================\r
943 * @n@b add_test_config_data\r
944 *\r
945 * @b Description\r
946 * @n Given a data buffer, this API sets up the packet contents for the test.\r
947 * It adds all the BCP configuration params and the payload to the data buffer.\r
948 * On success, returns the number of bytes of configuration and payload data\r
949 * added to the data buffer passed. \r
950 *\r
951 * @param[in] \r
952 * @n hBcp BCP driver handle\r
953 *\r
954 * @param[in] \r
955 * @n pDataBuffer Data Buffer handle to which the payload and BCP configuration\r
956 * params need to be added.\r
957 * \r
958 * @return Int32\r
959 * @n >0 - Number of bytes of data (payload + header configuration) added \r
960 * to the data buffer.\r
961 *\r
962 * @n -1 - Error populating the data buffer.\r
963 * =============================================================================\r
964 */\r
965 static Int32 add_test_config_data (Bcp_DrvHandle hBcp, UInt8* pDataBuffer)\r
966 {\r
967 FILE* pTestCfgFile; \r
968 BcpTest_HsdpaParams hsdpaParams;\r
969 UInt32 dataBufferLen, tmpLen, tmpVal;\r
970 UInt8 wcdmaChanType;\r
971 Bcp_RadioStd radioStd;\r
972 Bcp_GlobalHdrCfg bcpGlblHdrCfg;\r
973 Bcp_CrcHdrCfg crcHdrCfg;\r
974 Bcp_EncHdrCfg encHdrCfg;\r
975 Bcp_RmHdr_xCdmaCfg wcdmaRmHdrCfg;\r
976 Bcp_IntHdrCfg intHdrCfg;\r
977 Bcp_TmHdrCfg tmHdrCfg;\r
978 UInt8* pStartDataBuffer;\r
979 \r
980 #ifdef BCP_TEST_DEBUG\r
981 Bcp_osalLog ("Reading test configuration ... \n");\r
982 #endif\r
983 \r
984 /* Get the HSDPA input test vector params */\r
985 hsdpaParams.TBsize = testVectorHsdpa[0][0]; \r
986 hsdpaParams.modScheme = testVectorHsdpa[0][1];/* 0:QPSK, 1:16QAM, 2:64QAM */ \r
987 hsdpaParams.Nir = testVectorHsdpa[0][2]; \r
988 hsdpaParams.nPhyCh = testVectorHsdpa[0][3]; \r
989 hsdpaParams.RVindex = testVectorHsdpa[0][4]; \r
990 hsdpaParams.TACformatFlag = 1;//1 TAC format, 0 unpacked format\r
991 \r
992 /* Generate rest of the parameters */\r
993 computeParams_hsdpa ((BcpTest_HsdpaParams *) &hsdpaParams);\r
994 \r
995 radioStd = Bcp_RadioStd_WCDMA_R99; \r
996 wcdmaChanType = WCDMAFDD_HSDPA;\r
997 \r
998 /* Start adding BCP Packet headers based on the test configuration we read. */\r
999 \r
1000 /* Initialize our data buffer length running counter */\r
1001 dataBufferLen = 0;\r
1002 tmpLen = 0;\r
1003 \r
1004 /* Save the start pointer and set running pointer to CRC header */\r
1005 pStartDataBuffer = pDataBuffer;\r
1006 pDataBuffer += 8;\r
1007 dataBufferLen += 8;\r
1008 \r
1009 /* Header 2: CRC Header */\r
1010 prepare_crchdr_cfg (&crcHdrCfg, radioStd, hsdpaParams.TBsize, hsdpaParams.numFillerBits, 0, 0, 1, 24, 1, 1, 0, &tmpVal);\r
1011 if (Bcp_addCRCHeader (&crcHdrCfg, pDataBuffer, &tmpLen) < 0)\r
1012 {\r
1013 #ifdef BCP_TEST_DEBUG\r
1014 Bcp_osalLog ("Failed to add CRC Header to packet \n");\r
1015 #endif\r
1016 return -1;\r
1017 }\r
1018 pDataBuffer += tmpLen;\r
1019 dataBufferLen += tmpLen;\r
1020 tmpLen = 0;\r
1021 \r
1022 \r
1023 /* Header 3: Encoder Header */\r
1024 prepare_wcdma_enchdr_cfg (&encHdrCfg, &hsdpaParams, 1, 0);\r
1025 if (Bcp_addEncoderHeader (&encHdrCfg, pDataBuffer, &tmpLen) < 0)\r
1026 {\r
1027 #ifdef BCP_TEST_DEBUG\r
1028 Bcp_osalLog ("Failed to add Encoder Header to packet \n"); \r
1029 #endif\r
1030 return -1;\r
1031 }\r
1032 pDataBuffer += tmpLen;\r
1033 dataBufferLen += tmpLen;\r
1034 tmpLen = 0;\r
1035 \r
1036 /* Header 4: Rate matching header */\r
1037 prepare_wcdma_rmhdr_cfg (&wcdmaRmHdrCfg, wcdmaChanType, &hsdpaParams);\r
1038 if (Bcp_addxCdma_RMHeader (&wcdmaRmHdrCfg, pDataBuffer, &tmpLen) < 0)\r
1039 {\r
1040 #ifdef BCP_TEST_DEBUG\r
1041 Bcp_osalLog ("Failed to add WCDMA rate modulation header to packet \n"); \r
1042 #endif\r
1043 return -1;\r
1044 }\r
1045 pDataBuffer += tmpLen;\r
1046 dataBufferLen += tmpLen;\r
1047 tmpLen = 0;\r
1048 \r
1049 /* Header 5: Interleaver header */\r
1050 prepare_inthdr_cfg (&intHdrCfg, wcdmaChanType, &hsdpaParams);\r
1051 if (Bcp_addInterleaverHeader (&intHdrCfg, pDataBuffer, &tmpLen) < 0)\r
1052 {\r
1053 #ifdef BCP_TEST_DEBUG\r
1054 Bcp_osalLog ("Failed to add Interleaver header to packet \n"); \r
1055 #endif\r
1056 return -1;\r
1057 }\r
1058 pDataBuffer += tmpLen;\r
1059 dataBufferLen += tmpLen;\r
1060 tmpLen = 0;\r
1061 \r
1062 /* Header 6: Traffic Manager header */\r
1063 prepare_tmhdr_cfg (&tmHdrCfg);\r
1064 if (Bcp_addTMHeader (&tmHdrCfg, pDataBuffer, &tmpLen) < 0)\r
1065 {\r
1066 #ifdef BCP_TEST_DEBUG\r
1067 Bcp_osalLog ("Failed to add Traffic Manager header to packet \n"); \r
1068 #endif\r
1069 return -1;\r
1070 }\r
1071 pDataBuffer += tmpLen;\r
1072 dataBufferLen += tmpLen;\r
1073 tmpLen = 0;\r
1074 \r
1075 /* Header 1: Global Header */\r
1076 bcpGlblHdrCfg.pkt_type = Bcp_PacketType_Normal;\r
1077 bcpGlblHdrCfg.flush = 0;\r
1078 bcpGlblHdrCfg.drop = 0;\r
1079 bcpGlblHdrCfg.halt = 0;\r
1080 bcpGlblHdrCfg.radio_standard = radioStd;\r
1081 bcpGlblHdrCfg.hdr_end_ptr = ((dataBufferLen + 3) >> 2); // 2 + 4 + 2 + 21 + 4 + 2\r
1082 bcpGlblHdrCfg.flow_id = RX_FLOW_ID;\r
1083 bcpGlblHdrCfg.destn_tag = 0xDEAD;\r
1084 if (Bcp_addGlobalHeader (&bcpGlblHdrCfg, pStartDataBuffer, &tmpLen) < 0)\r
1085 {\r
1086 #ifdef BCP_TEST_DEBUG\r
1087 System_printf ("Failed to add Global Header to packet \n");\r
1088 #endif\r
1089 return -1;\r
1090 }\r
1091 \r
1092 /* No Info words/PS to be added for now */\r
1093 \r
1094 /* Check and Add padding to align data on 128 bits (16 bytes) */\r
1095 tmpLen = (dataBufferLen % 16)? (16 - (dataBufferLen % 16)): 0;\r
1096 \r
1097 /* Add padding to align data on 128 bits */\r
1098 pDataBuffer += tmpLen;\r
1099 dataBufferLen += tmpLen;\r
1100 \r
1101 /* Finally add the data to the packet in the same order as the headers */\r
1102 if ((pTestCfgFile = fopen("..\\..\\testcases\\wcdma\\bcp_fdd_hsdpa_input.dat","r")) == NULL)\r
1103 {\r
1104 #ifdef BCP_TEST_DEBUG\r
1105 Bcp_osalLog ("Cannot open data input file: ..\..\testcases\wcdma\bcp_fdd_hsdpa_input.dat\n");\r
1106 #endif\r
1107 return -1;\r
1108 }\r
1109 read_data_from_file (pTestCfgFile, pDataBuffer, &dataBufferLen);\r
1110 fclose (pTestCfgFile);\r
1111 \r
1112 /* Successfully read the test configuration */ \r
1113 return dataBufferLen;\r
1114 }\r
1115 \r
1116 /** ============================================================================\r
1117 * @n@b test_wcdma_dl\r
1118 *\r
1119 * @b Description\r
1120 * @n Sets up the parameters required and runs a WCDMA Downlink (DL) test case.\r
1121 *\r
1122 * @param[in] \r
1123 * @n hBcp BCP driver handle\r
1124 *\r
1125 * @param[in] \r
1126 * @n hGlblFDQ Global free descriptor queue handle. The test will allocate all its\r
1127 * free descriptors from this queue for its run and release them\r
1128 * back once done to this queue.\r
1129 * \r
1130 * @return\r
1131 * @n None\r
1132 *\r
1133 * =============================================================================\r
1134 */\r
1135 Void test_wcdma_dl (Bcp_DrvHandle hBcp, Qmss_QueueHnd hGlblFDQ)\r
1136 {\r
1137 Bcp_TxCfg txCfg;\r
1138 Bcp_TxHandle hTx = NULL;\r
1139 Bcp_RxCfg rxCfg;\r
1140 Bcp_RxHandle hRx = NULL;\r
1141 Qmss_QueueHnd hTxFDQ, hRxFDQ;\r
1142 UInt8 rxFlowId, rxSrcId, i;\r
1143 UInt32 dataBufferLen, rxDataBufferLen, rxPsInfoLen, rxDataTotalLen, testFail = 0, numTestPkts;\r
1144 UInt16 rxDestnTag;\r
1145 Cppi_Desc* pCppiDesc;\r
1146 UInt8* pDataBuffer;\r
1147 UInt8* pRxDataBuffer;\r
1148 UInt8* pRxPsInfo;\r
1149 Bcp_DrvBufferHandle hRxDrvBuffer;\r
1150 Bcp_DrvBufferHandle hVoid;\r
1151 Bcp_DrvBufferHandle hTmp;\r
1152 Int32 dataBufferLenUsed;\r
1153 Qmss_Queue tmpQ;\r
1154 \r
1155 /* Setup Rx side:\r
1156 * - Open BCP Rx queue on which BCP results are to be received\r
1157 * - Setup a Rx FDQ, CPPI Rx flow and TM flow to receive data\r
1158 * - Set the BCP Tunnel Rx endpoint configuration to NULL since we\r
1159 * are processing BCP packets locally.\r
1160 */\r
1161 if (allocate_fdq (hGlblFDQ, RX_NUM_DESC, RX_DATA_BUFFER_SIZE, 0, &hRxFDQ, NULL) < 0)\r
1162 {\r
1163 Bcp_osalLog ("Error opening Rx FDQ \n"); \r
1164 return;\r
1165 }\r
1166 else\r
1167 {\r
1168 Bcp_osalLog ("Rx FDQ %d successfully setup with %d descriptors\n", hRxFDQ, RX_NUM_DESC);\r
1169 }\r
1170 tmpQ = Qmss_getQueueNumber(hRxFDQ);\r
1171 rxCfg.rxQNum = RX_Q_NUM; \r
1172 rxCfg.bUseInterrupts = 0; // Use polling \r
1173 memset (&rxCfg.flowCfg, 0, sizeof(Cppi_RxFlowCfg));\r
1174 rxCfg.flowCfg.flowIdNum = RX_FLOW_ID; \r
1175 rxCfg.flowCfg.rx_dest_qmgr = 0; \r
1176 rxCfg.flowCfg.rx_dest_qnum = RX_Q_NUM; \r
1177 rxCfg.flowCfg.rx_desc_type = Cppi_DescType_HOST; \r
1178 rxCfg.flowCfg.rx_ps_location = Cppi_PSLoc_PS_IN_DESC; \r
1179 rxCfg.flowCfg.rx_psinfo_present = 0; \r
1180 rxCfg.flowCfg.rx_error_handling = 0; // Drop the packet, do not retry on starvation\r
1181 rxCfg.flowCfg.rx_einfo_present = 0; // By default no EPIB info\r
1182 \r
1183 rxCfg.flowCfg.rx_dest_tag_lo_sel = 4; // Pick dest tag 7:0 bits from the PD dest_tag \r
1184 rxCfg.flowCfg.rx_dest_tag_hi_sel = 5; // Pick the dest tag 15:8 bits from the PD dest_tag\r
1185 rxCfg.flowCfg.rx_src_tag_lo_sel = 2; // Pick the src tag 7:0 bits from the PD flow_id 7:0\r
1186 rxCfg.flowCfg.rx_src_tag_hi_sel = 4; // Pick the src tag 15:8 bits from the PD src_tag 7:0 \r
1187 \r
1188 rxCfg.flowCfg.rx_size_thresh0_en = 0; \r
1189 rxCfg.flowCfg.rx_size_thresh1_en = 0; \r
1190 rxCfg.flowCfg.rx_size_thresh2_en = 0; \r
1191 \r
1192 rxCfg.flowCfg.rx_size_thresh0 = 0x0;\r
1193 rxCfg.flowCfg.rx_size_thresh1 = 0x0;\r
1194 rxCfg.flowCfg.rx_size_thresh2 = 0x0;\r
1195 \r
1196 rxCfg.flowCfg.rx_fdq0_sz0_qmgr = tmpQ.qMgr;\r
1197 rxCfg.flowCfg.rx_fdq0_sz0_qnum = tmpQ.qNum; \r
1198 rxCfg.flowCfg.rx_fdq0_sz1_qnum = 0x0; \r
1199 rxCfg.flowCfg.rx_fdq0_sz1_qmgr = 0x0;\r
1200 rxCfg.flowCfg.rx_fdq0_sz2_qnum = 0x0;\r
1201 rxCfg.flowCfg.rx_fdq0_sz2_qmgr = 0x0;\r
1202 rxCfg.flowCfg.rx_fdq0_sz3_qnum = 0x0;\r
1203 rxCfg.flowCfg.rx_fdq0_sz3_qmgr = 0x0;\r
1204 \r
1205 rxCfg.flowCfg.rx_fdq1_qnum = tmpQ.qNum; \r
1206 rxCfg.flowCfg.rx_fdq1_qmgr = tmpQ.qMgr;\r
1207 rxCfg.flowCfg.rx_fdq2_qnum = tmpQ.qNum; \r
1208 rxCfg.flowCfg.rx_fdq2_qmgr = tmpQ.qMgr;\r
1209 rxCfg.flowCfg.rx_fdq3_qnum = tmpQ.qNum; \r
1210 rxCfg.flowCfg.rx_fdq3_qmgr = tmpQ.qMgr;\r
1211 \r
1212 /* Setup the corresponding TM flow entry configuration */\r
1213 #ifdef SIMULATOR_SUPPORT\r
1214 /* Simulator bug workaround: BCP TM module endian handling not correct. */\r
1215 rxCfg.tmFlowCfg.endian_in = Bcp_EndianFormat_128;\r
1216 rxCfg.tmFlowCfg.endian_out = Bcp_EndianFormat_128;\r
1217 #else\r
1218 rxCfg.tmFlowCfg.endian_in = Bcp_EndianFormat_32;\r
1219 rxCfg.tmFlowCfg.endian_out = Bcp_EndianFormat_32;\r
1220 #endif\r
1221 rxCfg.tmFlowCfg.format_in = Bcp_DataFormat_NoChange;\r
1222 rxCfg.tmFlowCfg.pkt_type = 0; // No special pkt assignments\r
1223 rxCfg.tmFlowCfg.dsp_int_sel = 0; // Interrupt core 0 on error\r
1224 rxCfg.tmFlowCfg.format_out = Bcp_DataFormat_NoChange;\r
1225 rxCfg.tmFlowCfg.qfifo_out = RX_FLOW_ID; // Setup Rx QFIFO\r
1226 rxCfg.tmFlowCfg.ps_flags = 0; // No PS for now\r
1227 \r
1228 if ((hRx = Bcp_rxOpen (hBcp, &rxCfg, NULL)) == NULL)\r
1229 {\r
1230 Bcp_osalLog ("BCP Rx Open failed \n");\r
1231 goto cleanup_and_return;\r
1232 }\r
1233 else\r
1234 {\r
1235 Bcp_osalLog ("Flow %d opened to send data to RxQ: %d \n", RX_FLOW_ID, RX_Q_NUM);\r
1236 }\r
1237 \r
1238 /* Setup Tx side:\r
1239 * - Open BCP Tx queue using which data would be sent \r
1240 * - Setup a Tx FDQ and initialize it with some Tx FDs\r
1241 * - Set the BCP Tunnel Tx endpoint configuration to NULL since we\r
1242 * are processing BCP packets locally.\r
1243 */\r
1244 txCfg.txQNum = (Bcp_QueueId) (Bcp_QueueId_0 + CSL_chipReadReg (CSL_CHIP_DNUM));\r
1245 if ((hTx = Bcp_txOpen (hBcp, &txCfg, NULL)) == NULL)\r
1246 {\r
1247 Bcp_osalLog ("BCP Tx Open failed \n");\r
1248 return;\r
1249 }\r
1250 \r
1251 if (allocate_fdq (hGlblFDQ, TX_NUM_DESC, TX_DATA_BUFFER_SIZE, 0, &hTxFDQ, NULL) < 0)\r
1252 {\r
1253 Bcp_osalLog ("Error opening Tx FDQ \n"); \r
1254 return;\r
1255 }\r
1256 else\r
1257 {\r
1258 Bcp_osalLog ("Tx FDQ %d successfully setup with %d descriptors\n", hTxFDQ, TX_NUM_DESC);\r
1259 }\r
1260 \r
1261 for (numTestPkts = 0; numTestPkts < BCP_TEST_NUM_PACKETS; numTestPkts ++)\r
1262 {\r
1263 /* Build and Send a packet with WCDMA DL parameters for BCP Processing */\r
1264 if ((pCppiDesc = (Cppi_Desc*) Qmss_queuePop (hTxFDQ)) == NULL)\r
1265 {\r
1266 #ifdef BCP_TEST_DEBUG\r
1267 Bcp_osalLog ("Error! Out of Tx FDs! \n");\r
1268 #endif\r
1269 testFail ++;\r
1270 goto cleanup_and_return;\r
1271 }\r
1272 pCppiDesc = (Cppi_Desc *) (QMSS_DESC_PTR (pCppiDesc)); \r
1273 Cppi_getData (Cppi_DescType_HOST, pCppiDesc, &pDataBuffer, &dataBufferLen);\r
1274 \r
1275 memset (pDataBuffer, 0, dataBufferLen); \r
1276 \r
1277 /* Read test configuration */\r
1278 if ((dataBufferLenUsed = add_test_config_data (hBcp, pDataBuffer)) <= 0)\r
1279 {\r
1280 Bcp_osalLog ("Error reading test vectors/populating packet \n");\r
1281 testFail ++;\r
1282 goto cleanup_and_return;\r
1283 }\r
1284 \r
1285 #ifdef BCP_TEST_DEBUG\r
1286 Bcp_osalLog ("Sending a packet of len: %d to BCP ...\n", dataBufferLenUsed);\r
1287 #endif\r
1288 \r
1289 /* Setup the data length in the descriptor */\r
1290 Cppi_setDataLen (Cppi_DescType_HOST, pCppiDesc, dataBufferLenUsed);\r
1291 Cppi_setPacketLen (Cppi_DescType_HOST, pCppiDesc, dataBufferLenUsed);\r
1292 \r
1293 /* Since BCP is local to the device, set destination address to NULL */\r
1294 Bcp_send (hTx, (Bcp_DrvBufferHandle) pCppiDesc, BCP_TEST_SIZE_HOST_DESC, NULL);\r
1295 \r
1296 /* Wait on data to be received from BCP and validate it. Poll on Rx queue for results. */\r
1297 while (Bcp_rxGetNumOutputEntries (hRx) == 0); \r
1298 \r
1299 #ifdef BCP_TEST_DEBUG\r
1300 Bcp_osalLog ("Got %d packet(s) from BCP \n", Bcp_rxGetNumOutputEntries (hRx));\r
1301 #endif\r
1302 \r
1303 for (i = 0; i < Bcp_rxGetNumOutputEntries (hRx); i ++)\r
1304 {\r
1305 /* Data could arrive scattered across multiple linked descriptors.\r
1306 * Collect data from all linked descriptors and validate it.\r
1307 */\r
1308 rxDataTotalLen = 0;\r
1309 \r
1310 Bcp_recv (hRx,\r
1311 &hRxDrvBuffer,\r
1312 &pRxDataBuffer,\r
1313 &rxDataBufferLen,\r
1314 &pRxPsInfo,\r
1315 &rxPsInfoLen,\r
1316 &rxFlowId,\r
1317 &rxSrcId,\r
1318 &rxDestnTag); \r
1319 \r
1320 if (validate_rxdata ((UInt8 *)wcdma_dl_out_packet_1, \r
1321 WCDMA_DL_OUTPUT_PKT_1_WRD_SIZE*4, \r
1322 pRxDataBuffer, \r
1323 rxDataBufferLen, \r
1324 rxDataTotalLen) != 0)\r
1325 testFail ++;\r
1326 \r
1327 rxDataTotalLen += rxDataBufferLen;\r
1328 \r
1329 /* Check if there are any descriptors linked to this Rx desc */\r
1330 while (hRxDrvBuffer)\r
1331 {\r
1332 /* Save original Rx desc handle. */\r
1333 hTmp = hRxDrvBuffer;\r
1334 \r
1335 if ((hRxDrvBuffer = Cppi_getNextBD (Cppi_getDescType (hRxDrvBuffer), hRxDrvBuffer)))\r
1336 {\r
1337 Bcp_rxProcessDesc (hRx,\r
1338 hRxDrvBuffer,\r
1339 &hVoid,\r
1340 &pRxDataBuffer,\r
1341 &rxDataBufferLen,\r
1342 &pRxPsInfo,\r
1343 &rxPsInfoLen,\r
1344 &rxFlowId,\r
1345 &rxSrcId,\r
1346 &rxDestnTag); \r
1347 \r
1348 if (validate_rxdata ((UInt8 *)wcdma_dl_out_packet_1, \r
1349 WCDMA_DL_OUTPUT_PKT_1_WRD_SIZE*4, \r
1350 pRxDataBuffer, \r
1351 rxDataBufferLen, \r
1352 rxDataTotalLen) != 0)\r
1353 testFail ++; \r
1354 \r
1355 rxDataTotalLen += rxDataBufferLen;\r
1356 }\r
1357 \r
1358 Bcp_rxFreeRecvBuffer (hRx, hTmp, BCP_TEST_SIZE_HOST_DESC);\r
1359 }\r
1360 \r
1361 #ifdef BCP_TEST_DEBUG\r
1362 Bcp_osalLog ("[Pkt %d]: Total Len: %d DestnTag: 0x%x SrcId: 0x%x (testFail: %d)\n", i, rxDataTotalLen, rxDestnTag, rxSrcId, testFail);\r
1363 #endif\r
1364 \r
1365 if (rxDataTotalLen != WCDMA_DL_OUTPUT_PKT_1_WRD_SIZE * 4)\r
1366 {\r
1367 testFail ++;\r
1368 }\r
1369 }\r
1370 }\r
1371 cleanup_and_return:\r
1372 if (testFail > 0)\r
1373 {\r
1374 Bcp_osalLog ("WCDMA DL Test: FAILED\n"); \r
1375 totalNumTestsFail ++;\r
1376 }\r
1377 else\r
1378 {\r
1379 Bcp_osalLog ("WCDMA DL Test: PASS\n"); \r
1380 totalNumTestsPass ++;\r
1381 }\r
1382 \r
1383 if (hRx)\r
1384 Bcp_rxClose (hRx);\r
1385 \r
1386 deallocate_fdq (hRxFDQ, hGlblFDQ, RX_NUM_DESC, RX_DATA_BUFFER_SIZE, NULL);\r
1387 \r
1388 if (hTx)\r
1389 Bcp_txClose (hTx);\r
1390 \r
1391 deallocate_fdq (hTxFDQ, hGlblFDQ, TX_NUM_DESC, TX_DATA_BUFFER_SIZE, NULL);\r
1392 \r
1393 return;\r
1394 }\r