| /***************************************************************************** |
| * Copyright Statement: |
| * -------------------- |
| * This software is protected by Copyright and the information contained |
| * herein is confidential. The software may not be copied and the information |
| * contained herein may not be used or disclosed except with the written |
| * permission of MediaTek Inc. (C) 2012 |
| * |
| * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES |
| * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") |
| * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON |
| * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. |
| * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE |
| * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR |
| * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH |
| * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO |
| * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S |
| * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. |
| * |
| * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE |
| * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, |
| * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, |
| * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO |
| * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. |
| * |
| * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE |
| * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF |
| * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND |
| * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER |
| * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). |
| * |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| * |
| * Filename: |
| * --------- |
| * emac_ota.h |
| * |
| * Project: |
| * -------- |
| * UMOLYA |
| * |
| * Description: |
| * ------------ |
| * Define EMAC statistic structures |
| * |
| * Author: |
| * ------- |
| * ------- |
| * |
| * ========================================================================== |
| * $Log$ |
| * |
| * 09 13 2017 nicole.hsu |
| * [MOLY00277396] [MT6293] EL2 L+L EM development |
| * [TRUNK] L+L EM - EL2EM, EMAC, EMACDL |
| * |
| * 06 29 2017 nicole.hsu |
| * [MOLY00258660] [BIANCO][MT6763][MP1][EVB][PHYTest][ASSERT] Assert fail: dpcopro_mmu_drv.c 1608 |
| * [TRUNK] send rach_trigger em when PRACH is really scheduled by EL1 |
| * refine EMAC DL OTA |
| * |
| * 02 09 2017 nicole.hsu |
| * [MOLY00223067] [MT6293] EL2 EM implementation |
| * modify OTA compile option |
| * |
| * 01 25 2017 nicole.hsu |
| * [MOLY00223067] [MT6293] EL2 EM implementation |
| * fix compile option |
| * |
| ****************************************************************************/ |
| #ifndef EMAC_OTA_H |
| #define EMAC_OTA_H |
| |
| #if defined(__EM_MODE__) |
| |
| #include "kal_public_api.h" |
| #include "dhl_trace.h" |
| |
| typedef struct |
| { |
| kal_uint8 truncated:1; |
| kal_uint8 type:3; |
| kal_uint8 version:4; |
| kal_uint8 direction:1; |
| kal_uint8 transport_channel:3; // 1:bch 2:dl-sch 3:pch 4:mch 5:ul-sch 6:rach |
| kal_uint8 mac_hdr_len:4; // 1~11 |
| kal_uint8 mac_hdr[11]; |
| }emac_ota_header_t; |
| |
| /**** EMAC OTA header struct (for both UL/DL EMAC TB) |
| * |
| * +-----+-----+-----+-----+-----+-----+-----+-----+ |
| * | t | type | version | |
| * +-----+-----+-----+-----+-----+-----+-----+-----+ |
| * | d | trch | mac_hdr_len | |
| * +-----+-----+-----+-----+-----+-----+-----+-----+ |
| * | sfn[9:2] | |
| * +-----+-----+-----+-----+-----+-----+-----+-----+ |
| * | sfn[1:0] | subframe number[3:0] | Reserved | |
| * +-----+-----+-----+-----+-----+-----+-----+-----+ |
| * |
| * t: truncated, set to 1 if the MAC header size is larger than EMAC_OTA_MAC_HDR_LEN bytes |
| * sfn: LTE system frame number (0..1023) |
| * subframe number: LTE subframe number (0..9) |
| * |
| */ |
| |
| // EMAC OTA: length setting |
| #define EMAC_OTA_BUFFER_LEN 15 |
| #define EMAC_OTA_MAC_HDR_LEN 11 |
| #define EMAC_OTA_OVERHEAD 4 |
| |
| // EMAC OTA: header.type |
| #define EMAC_OTA_TYPE_MAC DHL_L2_PDU_MAC_TYPE |
| |
| // EMAC OTA: header.version |
| #define EMAC_OTA_VERSION 1 |
| |
| // EMAC OTA: header.d (direction) |
| #define EMAC_OTA_DIR_UL 0 |
| #define EMAC_OTA_DIR_DL 1 |
| |
| // EMAC OTA: header.trch (transport channel) |
| #define EMAC_OTA_BCH 1 |
| #define EMAC_OTA_DLSCH 2 |
| #define EMAC_OTA_PCH 3 |
| #define EMAC_OTA_MCH 4 |
| #define EMAC_OTA_ULSCH 5 |
| #define EMAC_OTA_RACH 6 |
| |
| #define EMAC_SUB_HDR_E (0x20) // E in MAC subheader |
| #define EMAC_SUB_HDR_F (0x80) // F in MAC subheader |
| |
| extern kal_uint8* p_emac_dl_ota_buffer; |
| extern kal_uint8 emac_dl_ota_length; |
| extern kal_uint8 emac_ul_ota_buffer[]; |
| extern kal_uint8 emac_ul_ota_length; |
| |
| // 2 byte is minimum overhead for emac ota structure |
| #define EMAC_DL_OTA_DECLARE(_pOta, _pCur, _bTruncate, _len, _is_dl_tb_report_needed_in, _pTb_report_in, _pidx) \ |
| kal_uint8* _pOta = p_emac_dl_ota_buffer; \ |
| kal_uint8* _pCur = p_emac_dl_ota_buffer + EMAC_OTA_OVERHEAD; \ |
| kal_uint8 _bTruncate = 0; \ |
| kal_bool _is_dl_tb_report_needed = el2em_is_em_on(EL2EM_EM_TYPE_EMAC_DL_TBS_REPORT, _pidx); \ |
| kal_uint32 _len = 0; \ |
| emac_el2task_dl_tb_report_ind_struct* _pTb_report = (_pTb_report_in); |
| |
| #define EMAC_DL_OTA_CLEAR_BUFFER()\ |
| do {\ |
| EMAC_MEM_SET(p_emac_dl_ota_buffer, 0, EMAC_OTA_BUFFER_LEN);\ |
| } while(0); |
| |
| #define _FILL_EMAC_OTA_BYTE1(ota_ptr, truncated, type, version) \ |
| do {\ |
| *(kal_uint8 *)(ota_ptr) = (((kal_uint8)(truncated) & 0x01) << 7) | (((kal_uint8)(type) & 0x07) << 4) | ((kal_uint8)(version) & 0x0F);\ |
| } while(0); |
| |
| #define _FILL_EMAC_OTA_BYTE2(ota_ptr, direction, tch, ota_len) \ |
| do {\ |
| *(kal_uint8 *)((ota_ptr)+1) = (((kal_uint8)(direction) & 0x01) << 7) | (((kal_uint8)(tch) & 0x07) << 4) | ((kal_uint8)(ota_len) & 0x0F);\ |
| } while(0); |
| |
| #define _FILL_EMAC_OTA_BYTE3_4(ota_ptr, system_fn, sub_fn) \ |
| do {\ |
| *(kal_uint8 *)((ota_ptr)+2) = ((kal_uint8)((system_fn) >> 2));\ |
| *(kal_uint8 *)((ota_ptr)+3) = (((kal_uint8)(system_fn) & 0x03) << 6 ) | ((((kal_uint8)(sub_fn) & 0x0F)) << 2);\ |
| } while(0); |
| |
| #define _FILL_EMAC_OTA_LCID(cur_ptr, ota_len, _bTruncate, lcid) \ |
| do {\ |
| if( !(_bTruncate) && ((ota_len)+MAC_SUBHDR_L_0_SZ) <= EMAC_OTA_MAC_HDR_LEN){ \ |
| *(kal_uint8 *)(cur_ptr) = ((kal_uint8)(lcid) & 0x1F);\ |
| (ota_len)++;\ |
| (cur_ptr)++;\ |
| } \ |
| else{ \ |
| (_bTruncate) = 1; \ |
| } \ |
| } while(0); |
| |
| #define FILL_EMAC_OTA_E_LCID(cur_ptr, ota_len, _bTruncate, lcid) \ |
| do {\ |
| if(DHL_MAC_CHECK_L2_PDU() || _is_dl_tb_report_needed){\ |
| if( !(_bTruncate) && ((ota_len)+MAC_SUBHDR_L_0_SZ) <= EMAC_OTA_MAC_HDR_LEN){ \ |
| *(kal_uint8 *)(cur_ptr) = ((kal_uint8)EMAC_SUB_HDR_E) | (((kal_uint8)(lcid) & 0x1F));\ |
| (ota_len)++;\ |
| (cur_ptr)++;\ |
| } \ |
| else{ \ |
| (_bTruncate) = 1; \ |
| } \ |
| }\ |
| } while(0); |
| |
| #define FILL_EMAC_OTA_LAST_LCID(cur_ptr, ota_len, _bTruncate, lcid, ota_ptr, direction, tch, system_fn, sub_fn) \ |
| do {\ |
| if(DHL_MAC_CHECK_L2_PDU() || _is_dl_tb_report_needed){\ |
| _FILL_EMAC_OTA_LCID((cur_ptr), (ota_len), (_bTruncate), (lcid)); \ |
| _FILL_EMAC_OTA_BYTE1((ota_ptr), (_bTruncate), EMAC_OTA_TYPE_MAC, EMAC_OTA_VERSION); \ |
| _FILL_EMAC_OTA_BYTE2((ota_ptr), (direction), (tch), (ota_len)); \ |
| _FILL_EMAC_OTA_BYTE3_4((ota_ptr), (system_fn), (sub_fn)); \ |
| emac_dl_ota_length = (ota_len) + EMAC_OTA_OVERHEAD;\ |
| if(DHL_MAC_CHECK_L2_PDU()) {\ |
| DHL_MAC_LOG_L2_PDU(emac_dl_ota_buffer, emac_dl_ota_length);\ |
| }\ |
| if(_is_dl_tb_report_needed && _pTb_report) {\ |
| kal_uint32 copy_len = (ota_len) <= EM_EMAC_MAX_HEADER_LEN ?\ |
| (ota_len) : EM_EMAC_MAX_HEADER_LEN;\ |
| EMAC_MEM_CPY(_pTb_report->tb.mac_header_data,\ |
| emac_dl_ota_buffer + EMAC_OTA_OVERHEAD, copy_len);\ |
| _pTb_report->tb.mac_header_len = copy_len;\ |
| }\ |
| }\ |
| } while(0); |
| |
| // requested by ERRC Paging/SIB reporting, ERRC will prepare OTA data buffer |
| #define FILL_EMAC_OTA_NO_LCID(ota_len, _bTruncate, ota_ptr, direction, tch, system_fn, sub_fn) \ |
| do {\ |
| if(DHL_MAC_CHECK_L2_PDU()){\ |
| _FILL_EMAC_OTA_BYTE1((ota_ptr), (_bTruncate), EMAC_OTA_TYPE_MAC, EMAC_OTA_VERSION); \ |
| _FILL_EMAC_OTA_BYTE2((ota_ptr), (direction), (tch), (ota_len)); \ |
| _FILL_EMAC_OTA_BYTE3_4((ota_ptr), (system_fn), (sub_fn)); \ |
| DHL_MAC_LOG_L2_PDU(ota_ptr, (ota_len)+ EMAC_OTA_OVERHEAD);\ |
| }\ |
| } while(0); |
| |
| #define FILL_EMAC_OTA_E_SUBHDR(cur_ptr, ota_len, _bTruncate, lcid, len)\ |
| do {\ |
| if(DHL_MAC_CHECK_L2_PDU() || _is_dl_tb_report_needed){\ |
| if ((len) <= MAC_SUBHDR_L_7_MAX_VAL) {\ |
| if( !(_bTruncate) && ((ota_len)+MAC_SUBHDR_L_7_SZ) <= EMAC_OTA_MAC_HDR_LEN){ \ |
| *(kal_uint8 *)(cur_ptr) = ((kal_uint8)EMAC_SUB_HDR_E) | (((kal_uint8)(lcid) & 0x1F));\ |
| *(kal_uint8 *)((cur_ptr)+1) = (((kal_uint8)(len) & 0x7F));\ |
| (ota_len) += MAC_SUBHDR_L_7_SZ;\ |
| (cur_ptr) += MAC_SUBHDR_L_7_SZ;\ |
| } \ |
| else{ \ |
| (_bTruncate) = 1; \ |
| } \ |
| } else {\ |
| if( !(_bTruncate) && (ota_len+MAC_SUBHDR_L_15_SZ) <= EMAC_OTA_MAC_HDR_LEN){ \ |
| *(kal_uint8 *)(cur_ptr) = ((kal_uint8)EMAC_SUB_HDR_E) | (((kal_uint8)(lcid) & 0x1F));\ |
| *(kal_uint8 *)((cur_ptr)+1) = ((kal_uint8)EMAC_SUB_HDR_F) | (((kal_uint8)((len)>>8)) & 0x7F);\ |
| *(kal_uint8 *)((cur_ptr)+2) = ((kal_uint8)((len) & 0xFF));\ |
| (ota_len) += MAC_SUBHDR_L_15_SZ;\ |
| (cur_ptr) += MAC_SUBHDR_L_15_SZ;\ |
| } \ |
| else{ \ |
| (_bTruncate) = 1; \ |
| } \ |
| }\ |
| }\ |
| } while (0); |
| |
| #define FILL_EMAC_UL_OTA(direction, tch, mac_hdr_ptr, ota_len, system_fn, sub_fn)\ |
| do {\ |
| if(DHL_MAC_CHECK_L2_PDU()){\ |
| if((ota_len) > EMAC_OTA_MAC_HDR_LEN){\ |
| _FILL_EMAC_OTA_BYTE1(emac_ul_ota_buffer, 1, EMAC_OTA_TYPE_MAC, EMAC_OTA_VERSION); \ |
| _FILL_EMAC_OTA_BYTE2(emac_ul_ota_buffer, (direction), (tch), EMAC_OTA_MAC_HDR_LEN); \ |
| _FILL_EMAC_OTA_BYTE3_4(emac_ul_ota_buffer, (system_fn), (sub_fn)); \ |
| EMAC_MEM_CPY(emac_ul_ota_buffer+EMAC_OTA_OVERHEAD, (void*)(mac_hdr_ptr), EMAC_OTA_MAC_HDR_LEN);\ |
| emac_ul_ota_length = EMAC_OTA_BUFFER_LEN;\ |
| }\ |
| else{\ |
| _FILL_EMAC_OTA_BYTE1(emac_ul_ota_buffer, 0, EMAC_OTA_TYPE_MAC, EMAC_OTA_VERSION); \ |
| _FILL_EMAC_OTA_BYTE2(emac_ul_ota_buffer, (direction), (tch), (ota_len)); \ |
| _FILL_EMAC_OTA_BYTE3_4(emac_ul_ota_buffer, (system_fn), (sub_fn)); \ |
| EMAC_MEM_CPY(emac_ul_ota_buffer+EMAC_OTA_OVERHEAD, (void*)(mac_hdr_ptr), (ota_len));\ |
| emac_ul_ota_length = (ota_len) + EMAC_OTA_OVERHEAD;\ |
| }\ |
| DHL_MAC_LOG_L2_PDU(emac_ul_ota_buffer, emac_ul_ota_length);\ |
| }\ |
| }while(0); |
| |
| #else |
| #define EMAC_DL_OTA_DECLARE(_pOta, _pCur, _bTruncate, _len, _is_dl_tb_report_needed_in, _pTb_report_in) |
| #define EMAC_DL_OTA_CLEAR_BUFFER() |
| #define FILL_EMAC_OTA_E_LCID(cur_ptr, ota_len, _bTruncate, lcid) |
| #define FILL_EMAC_OTA_E_SUBHDR(cur_ptr, ota_len, _bTruncate, lcid, len) |
| #define FILL_EMAC_OTA_LAST_LCID(cur_ptr, ota_len, _bTruncate, lcid, ota_ptr, direction, tch, system_fn, sub_fn) |
| #define FILL_EMAC_OTA_NO_LCID(ota_len, _bTruncate, ota_ptr, direction, tch, system_fn, sub_fn) |
| #define FILL_EMAC_UL_OTA(direction, tch, mac_hdr_ptr, ota_len, system_fn, sub_fn) |
| #endif /* __EL2_EM_MODE__ */ |
| |
| #endif /*EMAC_STATS_STRUCT_H*/ |
| |