Yves Godin | 660709d | 2016-05-19 11:08:03 +0200 | [diff] [blame] | 1 | /* NuRAN Wireless Litecell 1.5 L1 API related definitions */ |
| 2 | |
| 3 | /* Copyright (C) 2015 by Yves Godin <support@nuranwireless.com> |
| 4 | * based on: |
| 5 | * sysmobts.c |
| 6 | * (C) 2011 by Harald Welte <laforge@gnumonks.org> |
| 7 | * |
| 8 | * All Rights Reserved |
| 9 | * |
| 10 | * This program is free software; you can redistribute it and/or modify |
| 11 | * it under the terms of the GNU Affero General Public License as published by |
| 12 | * the Free Software Foundation; either version 3 of the License, or |
| 13 | * (at your option) any later version. |
| 14 | * |
| 15 | * This program is distributed in the hope that it will be useful, |
| 16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | * GNU General Public License for more details. |
| 19 | * |
| 20 | * You should have received a copy of the GNU Affero General Public License |
| 21 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 22 | * |
| 23 | */ |
| 24 | |
| 25 | #include <nrw/litecell15/litecell15.h> |
| 26 | #include <nrw/litecell15/gsml1const.h> |
| 27 | #include <nrw/litecell15/gsml1dbg.h> |
| 28 | |
| 29 | #include "lc15bts.h" |
| 30 | |
| 31 | enum l1prim_type lc15bts_get_l1prim_type(GsmL1_PrimId_t id) |
| 32 | { |
| 33 | switch (id) { |
| 34 | case GsmL1_PrimId_MphInitReq: return L1P_T_REQ; |
| 35 | case GsmL1_PrimId_MphCloseReq: return L1P_T_REQ; |
| 36 | case GsmL1_PrimId_MphConnectReq: return L1P_T_REQ; |
| 37 | case GsmL1_PrimId_MphDisconnectReq: return L1P_T_REQ; |
| 38 | case GsmL1_PrimId_MphActivateReq: return L1P_T_REQ; |
| 39 | case GsmL1_PrimId_MphDeactivateReq: return L1P_T_REQ; |
| 40 | case GsmL1_PrimId_MphConfigReq: return L1P_T_REQ; |
| 41 | case GsmL1_PrimId_MphMeasureReq: return L1P_T_REQ; |
| 42 | case GsmL1_PrimId_MphInitCnf: return L1P_T_CONF; |
| 43 | case GsmL1_PrimId_MphCloseCnf: return L1P_T_CONF; |
| 44 | case GsmL1_PrimId_MphConnectCnf: return L1P_T_CONF; |
| 45 | case GsmL1_PrimId_MphDisconnectCnf: return L1P_T_CONF; |
| 46 | case GsmL1_PrimId_MphActivateCnf: return L1P_T_CONF; |
| 47 | case GsmL1_PrimId_MphDeactivateCnf: return L1P_T_CONF; |
| 48 | case GsmL1_PrimId_MphConfigCnf: return L1P_T_CONF; |
| 49 | case GsmL1_PrimId_MphMeasureCnf: return L1P_T_CONF; |
| 50 | case GsmL1_PrimId_PhEmptyFrameReq: return L1P_T_REQ; |
| 51 | case GsmL1_PrimId_PhDataReq: return L1P_T_REQ; |
| 52 | case GsmL1_PrimId_MphTimeInd: return L1P_T_IND; |
| 53 | case GsmL1_PrimId_MphSyncInd: return L1P_T_IND; |
| 54 | case GsmL1_PrimId_PhConnectInd: return L1P_T_IND; |
| 55 | case GsmL1_PrimId_PhReadyToSendInd: return L1P_T_IND; |
| 56 | case GsmL1_PrimId_PhDataInd: return L1P_T_IND; |
| 57 | case GsmL1_PrimId_PhRaInd: return L1P_T_IND; |
| 58 | default: return L1P_T_INVALID; |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | const struct value_string lc15bts_l1prim_names[GsmL1_PrimId_NUM+1] = { |
| 63 | { GsmL1_PrimId_MphInitReq, "MPH-INIT.req" }, |
| 64 | { GsmL1_PrimId_MphCloseReq, "MPH-CLOSE.req" }, |
| 65 | { GsmL1_PrimId_MphConnectReq, "MPH-CONNECT.req" }, |
| 66 | { GsmL1_PrimId_MphDisconnectReq,"MPH-DISCONNECT.req" }, |
| 67 | { GsmL1_PrimId_MphActivateReq, "MPH-ACTIVATE.req" }, |
| 68 | { GsmL1_PrimId_MphDeactivateReq,"MPH-DEACTIVATE.req" }, |
| 69 | { GsmL1_PrimId_MphConfigReq, "MPH-CONFIG.req" }, |
| 70 | { GsmL1_PrimId_MphMeasureReq, "MPH-MEASURE.req" }, |
| 71 | { GsmL1_PrimId_MphInitCnf, "MPH-INIT.conf" }, |
| 72 | { GsmL1_PrimId_MphCloseCnf, "MPH-CLOSE.conf" }, |
| 73 | { GsmL1_PrimId_MphConnectCnf, "MPH-CONNECT.conf" }, |
| 74 | { GsmL1_PrimId_MphDisconnectCnf,"MPH-DISCONNECT.conf" }, |
| 75 | { GsmL1_PrimId_MphActivateCnf, "MPH-ACTIVATE.conf" }, |
| 76 | { GsmL1_PrimId_MphDeactivateCnf,"MPH-DEACTIVATE.conf" }, |
| 77 | { GsmL1_PrimId_MphConfigCnf, "MPH-CONFIG.conf" }, |
| 78 | { GsmL1_PrimId_MphMeasureCnf, "MPH-MEASURE.conf" }, |
| 79 | { GsmL1_PrimId_MphTimeInd, "MPH-TIME.ind" }, |
| 80 | { GsmL1_PrimId_MphSyncInd, "MPH-SYNC.ind" }, |
| 81 | { GsmL1_PrimId_PhEmptyFrameReq, "PH-EMPTY_FRAME.req" }, |
| 82 | { GsmL1_PrimId_PhDataReq, "PH-DATA.req" }, |
| 83 | { GsmL1_PrimId_PhConnectInd, "PH-CONNECT.ind" }, |
| 84 | { GsmL1_PrimId_PhReadyToSendInd,"PH-READY_TO_SEND.ind" }, |
| 85 | { GsmL1_PrimId_PhDataInd, "PH-DATA.ind" }, |
| 86 | { GsmL1_PrimId_PhRaInd, "PH-RA.ind" }, |
| 87 | { 0, NULL } |
| 88 | }; |
| 89 | |
| 90 | GsmL1_PrimId_t lc15bts_get_l1prim_conf(GsmL1_PrimId_t id) |
| 91 | { |
| 92 | switch (id) { |
| 93 | case GsmL1_PrimId_MphInitReq: return GsmL1_PrimId_MphInitCnf; |
| 94 | case GsmL1_PrimId_MphCloseReq: return GsmL1_PrimId_MphCloseCnf; |
| 95 | case GsmL1_PrimId_MphConnectReq: return GsmL1_PrimId_MphConnectCnf; |
| 96 | case GsmL1_PrimId_MphDisconnectReq: return GsmL1_PrimId_MphDisconnectCnf; |
| 97 | case GsmL1_PrimId_MphActivateReq: return GsmL1_PrimId_MphActivateCnf; |
| 98 | case GsmL1_PrimId_MphDeactivateReq: return GsmL1_PrimId_MphDeactivateCnf; |
| 99 | case GsmL1_PrimId_MphConfigReq: return GsmL1_PrimId_MphConfigCnf; |
| 100 | case GsmL1_PrimId_MphMeasureReq: return GsmL1_PrimId_MphMeasureCnf; |
| 101 | default: return -1; // Weak |
| 102 | } |
| 103 | } |
| 104 | |
| 105 | enum l1prim_type lc15bts_get_sysprim_type(Litecell15_PrimId_t id) |
| 106 | { |
| 107 | switch (id) { |
| 108 | case Litecell15_PrimId_SystemInfoReq: return L1P_T_REQ; |
| 109 | case Litecell15_PrimId_SystemInfoCnf: return L1P_T_CONF; |
| 110 | case Litecell15_PrimId_SystemFailureInd: return L1P_T_IND; |
| 111 | case Litecell15_PrimId_ActivateRfReq: return L1P_T_REQ; |
| 112 | case Litecell15_PrimId_ActivateRfCnf: return L1P_T_CONF; |
| 113 | case Litecell15_PrimId_DeactivateRfReq: return L1P_T_REQ; |
| 114 | case Litecell15_PrimId_DeactivateRfCnf: return L1P_T_CONF; |
| 115 | case Litecell15_PrimId_SetTraceFlagsReq: return L1P_T_REQ; |
| 116 | case Litecell15_PrimId_Layer1ResetReq: return L1P_T_REQ; |
| 117 | case Litecell15_PrimId_Layer1ResetCnf: return L1P_T_CONF; |
| 118 | case Litecell15_PrimId_SetCalibTblReq: return L1P_T_REQ; |
| 119 | case Litecell15_PrimId_SetCalibTblCnf: return L1P_T_CONF; |
| 120 | case Litecell15_PrimId_MuteRfReq: return L1P_T_REQ; |
| 121 | case Litecell15_PrimId_MuteRfCnf: return L1P_T_CONF; |
| 122 | case Litecell15_PrimId_SetRxAttenReq: return L1P_T_REQ; |
| 123 | case Litecell15_PrimId_SetRxAttenCnf: return L1P_T_CONF; |
| 124 | default: return L1P_T_INVALID; |
| 125 | } |
| 126 | } |
| 127 | |
| 128 | const struct value_string lc15bts_sysprim_names[Litecell15_PrimId_NUM+1] = { |
| 129 | { Litecell15_PrimId_SystemInfoReq, "SYSTEM-INFO.req" }, |
| 130 | { Litecell15_PrimId_SystemInfoCnf, "SYSTEM-INFO.conf" }, |
| 131 | { Litecell15_PrimId_SystemFailureInd, "SYSTEM-FAILURE.ind" }, |
| 132 | { Litecell15_PrimId_ActivateRfReq, "ACTIVATE-RF.req" }, |
| 133 | { Litecell15_PrimId_ActivateRfCnf, "ACTIVATE-RF.conf" }, |
| 134 | { Litecell15_PrimId_DeactivateRfReq, "DEACTIVATE-RF.req" }, |
| 135 | { Litecell15_PrimId_DeactivateRfCnf, "DEACTIVATE-RF.conf" }, |
| 136 | { Litecell15_PrimId_SetTraceFlagsReq, "SET-TRACE-FLAGS.req" }, |
| 137 | { Litecell15_PrimId_Layer1ResetReq, "LAYER1-RESET.req" }, |
| 138 | { Litecell15_PrimId_Layer1ResetCnf, "LAYER1-RESET.conf" }, |
| 139 | { Litecell15_PrimId_SetCalibTblReq, "SET-CALIB.req" }, |
| 140 | { Litecell15_PrimId_SetCalibTblCnf, "SET-CALIB.cnf" }, |
| 141 | { Litecell15_PrimId_MuteRfReq, "MUTE-RF.req" }, |
| 142 | { Litecell15_PrimId_MuteRfCnf, "MUTE-RF.cnf" }, |
| 143 | { Litecell15_PrimId_SetRxAttenReq, "SET-RX-ATTEN.req" }, |
| 144 | { Litecell15_PrimId_SetRxAttenCnf, "SET-RX-ATTEN-CNF.cnf" }, |
| 145 | { 0, NULL } |
| 146 | }; |
| 147 | |
| 148 | Litecell15_PrimId_t lc15bts_get_sysprim_conf(Litecell15_PrimId_t id) |
| 149 | { |
| 150 | switch (id) { |
| 151 | case Litecell15_PrimId_SystemInfoReq: return Litecell15_PrimId_SystemInfoCnf; |
| 152 | case Litecell15_PrimId_ActivateRfReq: return Litecell15_PrimId_ActivateRfCnf; |
| 153 | case Litecell15_PrimId_DeactivateRfReq: return Litecell15_PrimId_DeactivateRfCnf; |
| 154 | case Litecell15_PrimId_Layer1ResetReq: return Litecell15_PrimId_Layer1ResetCnf; |
| 155 | case Litecell15_PrimId_SetCalibTblReq: return Litecell15_PrimId_SetCalibTblCnf; |
| 156 | case Litecell15_PrimId_MuteRfReq: return Litecell15_PrimId_MuteRfCnf; |
| 157 | case Litecell15_PrimId_SetRxAttenReq: return Litecell15_PrimId_SetRxAttenCnf; |
| 158 | default: return -1; // Weak |
| 159 | } |
| 160 | } |
| 161 | |
| 162 | const struct value_string lc15bts_l1sapi_names[GsmL1_Sapi_NUM+1] = { |
| 163 | { GsmL1_Sapi_Idle, "IDLE" }, |
| 164 | { GsmL1_Sapi_Fcch, "FCCH" }, |
| 165 | { GsmL1_Sapi_Sch, "SCH" }, |
| 166 | { GsmL1_Sapi_Sacch, "SACCH" }, |
| 167 | { GsmL1_Sapi_Sdcch, "SDCCH" }, |
| 168 | { GsmL1_Sapi_Bcch, "BCCH" }, |
| 169 | { GsmL1_Sapi_Pch, "PCH" }, |
| 170 | { GsmL1_Sapi_Agch, "AGCH" }, |
| 171 | { GsmL1_Sapi_Cbch, "CBCH" }, |
| 172 | { GsmL1_Sapi_Rach, "RACH" }, |
| 173 | { GsmL1_Sapi_TchF, "TCH/F" }, |
| 174 | { GsmL1_Sapi_FacchF, "FACCH/F" }, |
| 175 | { GsmL1_Sapi_TchH, "TCH/H" }, |
| 176 | { GsmL1_Sapi_FacchH, "FACCH/H" }, |
| 177 | { GsmL1_Sapi_Nch, "NCH" }, |
| 178 | { GsmL1_Sapi_Pdtch, "PDTCH" }, |
| 179 | { GsmL1_Sapi_Pacch, "PACCH" }, |
| 180 | { GsmL1_Sapi_Pbcch, "PBCCH" }, |
| 181 | { GsmL1_Sapi_Pagch, "PAGCH" }, |
| 182 | { GsmL1_Sapi_Ppch, "PPCH" }, |
| 183 | { GsmL1_Sapi_Pnch, "PNCH" }, |
| 184 | { GsmL1_Sapi_Ptcch, "PTCCH" }, |
| 185 | { GsmL1_Sapi_Prach, "PRACH" }, |
| 186 | { 0, NULL } |
| 187 | }; |
| 188 | |
| 189 | const struct value_string lc15bts_l1status_names[GSML1_STATUS_NUM+1] = { |
| 190 | { GsmL1_Status_Success, "Success" }, |
| 191 | { GsmL1_Status_Generic, "Generic error" }, |
| 192 | { GsmL1_Status_NoMemory, "Not enough memory" }, |
| 193 | { GsmL1_Status_Timeout, "Timeout" }, |
| 194 | { GsmL1_Status_InvalidParam, "Invalid parameter" }, |
| 195 | { GsmL1_Status_Busy, "Resource busy" }, |
| 196 | { GsmL1_Status_NoRessource, "No more resources" }, |
| 197 | { GsmL1_Status_Uninitialized, "Trying to use uninitialized resource" }, |
| 198 | { GsmL1_Status_NullInterface, "Trying to call a NULL interface" }, |
| 199 | { GsmL1_Status_NullFctnPtr, "Trying to call a NULL function ptr" }, |
| 200 | { GsmL1_Status_BadCrc, "Bad CRC" }, |
| 201 | { GsmL1_Status_BadUsf, "Bad USF" }, |
| 202 | { GsmL1_Status_InvalidCPS, "Invalid CPS field" }, |
| 203 | { GsmL1_Status_UnexpectedBurst, "Unexpected burst" }, |
| 204 | { GsmL1_Status_UnavailCodec, "AMR codec is unavailable" }, |
| 205 | { GsmL1_Status_CriticalError, "Critical error" }, |
| 206 | { GsmL1_Status_OverheatError, "Overheat error" }, |
| 207 | { GsmL1_Status_DeviceError, "Device error" }, |
| 208 | { GsmL1_Status_FacchError, "FACCH / TCH order error" }, |
| 209 | { GsmL1_Status_AlreadyDeactivated, "Lchan already deactivated" }, |
| 210 | { GsmL1_Status_TxBurstFifoOvrn, "FIFO overrun" }, |
| 211 | { GsmL1_Status_TxBurstFifoUndr, "FIFO underrun" }, |
| 212 | { GsmL1_Status_NotSynchronized, "Not synchronized" }, |
| 213 | { GsmL1_Status_Unsupported, "Unsupported feature" }, |
| 214 | { GsmL1_Status_ClockError, "System clock error" }, |
| 215 | { 0, NULL } |
| 216 | }; |
| 217 | |
| 218 | const struct value_string lc15bts_tracef_names[29] = { |
| 219 | { DBG_DEBUG, "DEBUG" }, |
| 220 | { DBG_L1WARNING, "L1_WARNING" }, |
| 221 | { DBG_ERROR, "ERROR" }, |
| 222 | { DBG_L1RXMSG, "L1_RX_MSG" }, |
| 223 | { DBG_L1RXMSGBYTE, "L1_RX_MSG_BYTE" }, |
| 224 | { DBG_L1TXMSG, "L1_TX_MSG" }, |
| 225 | { DBG_L1TXMSGBYTE, "L1_TX_MSG_BYTE" }, |
| 226 | { DBG_MPHCNF, "MPH_CNF" }, |
| 227 | { DBG_MPHIND, "MPH_IND" }, |
| 228 | { DBG_MPHREQ, "MPH_REQ" }, |
| 229 | { DBG_PHIND, "PH_IND" }, |
| 230 | { DBG_PHREQ, "PH_REQ" }, |
| 231 | { DBG_PHYRF, "PHY_RF" }, |
| 232 | { DBG_PHYRFMSGBYTE, "PHY_MSG_BYTE" }, |
| 233 | { DBG_MODE, "MODE" }, |
| 234 | { DBG_TDMAINFO, "TDMA_INFO" }, |
| 235 | { DBG_BADCRC, "BAD_CRC" }, |
| 236 | { DBG_PHINDBYTE, "PH_IND_BYTE" }, |
| 237 | { DBG_PHREQBYTE, "PH_REQ_BYTE" }, |
| 238 | { DBG_DEVICEMSG, "DEVICE_MSG" }, |
| 239 | { DBG_RACHINFO, "RACH_INFO" }, |
| 240 | { DBG_LOGCHINFO, "LOG_CH_INFO" }, |
| 241 | { DBG_MEMORY, "MEMORY" }, |
| 242 | { DBG_PROFILING, "PROFILING" }, |
| 243 | { DBG_TESTCOMMENT, "TEST_COMMENT" }, |
| 244 | { DBG_TEST, "TEST" }, |
| 245 | { DBG_STATUS, "STATUS" }, |
| 246 | { 0, NULL } |
| 247 | }; |
| 248 | |
| 249 | const struct value_string lc15bts_tracef_docs[29] = { |
| 250 | { DBG_DEBUG, "Debug Region" }, |
| 251 | { DBG_L1WARNING, "L1 Warning Region" }, |
| 252 | { DBG_ERROR, "Error Region" }, |
| 253 | { DBG_L1RXMSG, "L1_RX_MSG Region" }, |
| 254 | { DBG_L1RXMSGBYTE, "L1_RX_MSG_BYTE Region" }, |
| 255 | { DBG_L1TXMSG, "L1_TX_MSG Region" }, |
| 256 | { DBG_L1TXMSGBYTE, "L1_TX_MSG_BYTE Region" }, |
| 257 | { DBG_MPHCNF, "MphConfirmation Region" }, |
| 258 | { DBG_MPHIND, "MphIndication Region" }, |
| 259 | { DBG_MPHREQ, "MphRequest Region" }, |
| 260 | { DBG_PHIND, "PhIndication Region" }, |
| 261 | { DBG_PHREQ, "PhRequest Region" }, |
| 262 | { DBG_PHYRF, "PhyRF Region" }, |
| 263 | { DBG_PHYRFMSGBYTE, "PhyRF Message Region" }, |
| 264 | { DBG_MODE, "Mode Region" }, |
| 265 | { DBG_TDMAINFO, "TDMA Info Region" }, |
| 266 | { DBG_BADCRC, "Bad CRC Region" }, |
| 267 | { DBG_PHINDBYTE, "PH_IND_BYTE" }, |
| 268 | { DBG_PHREQBYTE, "PH_REQ_BYTE" }, |
| 269 | { DBG_DEVICEMSG, "Device Message Region" }, |
| 270 | { DBG_RACHINFO, "RACH Info" }, |
| 271 | { DBG_LOGCHINFO, "LOG_CH_INFO" }, |
| 272 | { DBG_MEMORY, "Memory Region" }, |
| 273 | { DBG_PROFILING, "Profiling Region" }, |
| 274 | { DBG_TESTCOMMENT, "Test Comments" }, |
| 275 | { DBG_TEST, "Test Region" }, |
| 276 | { DBG_STATUS, "Status Region" }, |
| 277 | { 0, NULL } |
| 278 | }; |
| 279 | |
| 280 | const struct value_string lc15bts_tch_pl_names[] = { |
| 281 | { GsmL1_TchPlType_NA, "N/A" }, |
| 282 | { GsmL1_TchPlType_Fr, "FR" }, |
| 283 | { GsmL1_TchPlType_Hr, "HR" }, |
| 284 | { GsmL1_TchPlType_Efr, "EFR" }, |
| 285 | { GsmL1_TchPlType_Amr, "AMR(IF2)" }, |
| 286 | { GsmL1_TchPlType_Amr_SidBad, "AMR(SID BAD)" }, |
| 287 | { GsmL1_TchPlType_Amr_Onset, "AMR(ONSET)" }, |
| 288 | { GsmL1_TchPlType_Amr_Ratscch, "AMR(RATSCCH)" }, |
| 289 | { GsmL1_TchPlType_Amr_SidUpdateInH, "AMR(SID_UPDATE INH)" }, |
| 290 | { GsmL1_TchPlType_Amr_SidFirstP1, "AMR(SID_FIRST P1)" }, |
| 291 | { GsmL1_TchPlType_Amr_SidFirstP2, "AMR(SID_FIRST P2)" }, |
| 292 | { GsmL1_TchPlType_Amr_SidFirstInH, "AMR(SID_FIRST INH)" }, |
| 293 | { GsmL1_TchPlType_Amr_RatscchMarker, "AMR(RATSCCH MARK)" }, |
| 294 | { GsmL1_TchPlType_Amr_RatscchData, "AMR(RATSCCH DATA)" }, |
| 295 | { 0, NULL } |
| 296 | }; |
| 297 | |
| 298 | const struct value_string lc15bts_dir_names[] = { |
| 299 | { GsmL1_Dir_TxDownlink, "TxDL" }, |
| 300 | { GsmL1_Dir_TxUplink, "TxUL" }, |
| 301 | { GsmL1_Dir_RxUplink, "RxUL" }, |
| 302 | { GsmL1_Dir_RxDownlink, "RxDL" }, |
| 303 | { GsmL1_Dir_TxDownlink|GsmL1_Dir_RxUplink, "BOTH" }, |
| 304 | { 0, NULL } |
| 305 | }; |
| 306 | |
| 307 | const struct value_string lc15bts_chcomb_names[] = { |
| 308 | { GsmL1_LogChComb_0, "dummy" }, |
| 309 | { GsmL1_LogChComb_I, "tch_f" }, |
| 310 | { GsmL1_LogChComb_II, "tch_h" }, |
| 311 | { GsmL1_LogChComb_IV, "ccch" }, |
| 312 | { GsmL1_LogChComb_V, "ccch_sdcch4" }, |
| 313 | { GsmL1_LogChComb_VII, "sdcch8" }, |
| 314 | { GsmL1_LogChComb_XIII, "pdtch" }, |
| 315 | { 0, NULL } |
| 316 | }; |
| 317 | |
| 318 | const uint8_t pdch_msu_size[_NUM_PDCH_CS] = { |
| 319 | [PDCH_CS_1] = 23, |
| 320 | [PDCH_CS_2] = 34, |
| 321 | [PDCH_CS_3] = 40, |
| 322 | [PDCH_CS_4] = 54, |
| 323 | [PDCH_MCS_1] = 27, |
| 324 | [PDCH_MCS_2] = 33, |
| 325 | [PDCH_MCS_3] = 42, |
| 326 | [PDCH_MCS_4] = 49, |
| 327 | [PDCH_MCS_5] = 60, |
| 328 | [PDCH_MCS_6] = 78, |
| 329 | [PDCH_MCS_7] = 118, |
| 330 | [PDCH_MCS_8] = 142, |
| 331 | [PDCH_MCS_9] = 154 |
| 332 | }; |