blob: 1c048b94973a564bb88f92b3f40292312974a369 [file] [log] [blame]
/*****************************************************************************
* 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*/