]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/pdk.git/blob - packages/ti/drv/bcp/test/src/test_wcdma_dl.c
bcp-lld: add to PDK
[processor-sdk/pdk.git] / packages / ti / drv / bcp / test / src / test_wcdma_dl.c
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