[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/interface/protocol/general/gpd_lib.h b/mcu/interface/protocol/general/gpd_lib.h
new file mode 100644
index 0000000..4b9ea55
--- /dev/null
+++ b/mcu/interface/protocol/general/gpd_lib.h
@@ -0,0 +1,324 @@
+/*******************************************************************************
+*  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) 2011
+*
+*  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:
+ * ---------
+ *   gpd_lib.h
+ *
+ * Project:
+ * --------
+ *   MAUI
+ *
+ * Description:
+ * ------------
+ *   
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *     HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ ******************************************************************************/
+
+#ifndef GPD_LIB_H
+#define GPD_LIB_H
+/******************************************************************************/
+
+/******************************************************************************
+* SAMPLE CODE                                                                                                              
+*******************************************************************************/
+
+// Basic
+/******************************************************************************
+// An example of combining two gpd linked lists and poll the first 3 nodes
+{
+    gpd_node*   gpd_nodes_a; //gpd linked list A with 5 items
+    gpd_node*   gpd_nodes_b; //gpd linked list B with 5 items
+
+    gpd_nodes_a = gpd_lib_add( gpd_nodes_a, gpd_nodes_b);
+    gpd_nodes_a = gpd_lib_poll( gpd_nodes_a, 3, &gpd_node_b);
+
+    gpd_lib_size( gpd_nodes_a); // 7
+    gpd_lib_size( gpd_nodes_b); // 3
+}
+*******************************************************************************/
+
+// List
+/******************************************************************************
+// An example of adding nodes to gpd_list and poll all items out
+{
+    gpd_list   node_list; //a gpd_list
+    gpd_node*   gpd_nodes; //gpd linked list with 5 items   
+
+    gpd_lib_list_create ( &node_list ); // Initialize gpd_list struct
+    gpd_lib_list_add( &node_list, gpd_nodes); // add nodes into gpd_list
+
+    gpd_lib_list_size( &node_list ); // 5
+
+    gpd_nodes = gpd_lib_list_pollAll( &node_list ); // Poll all gpd nodes out
+
+    gpd_lib_size(gpd_nodes); // 5
+    gpd_lib_list_size( &node_list ); // 0        
+}
+*******************************************************************************/
+
+// Iterator
+/******************************************************************************
+// An example of traversing a gpd linked list and remove nodes
+{
+    gpd_node*   gpd_nodes; //The gpd linked list which is going to be traversed
+
+    gpd_itr     itr;
+    gpd_node*   node;
+    gpd_lib_iterator_create( &itr, &gpd_nodes ); // Create an iterator
+    while( (node = gpd_lib_iterator_next(&itr))!= NULL )
+    {
+        if ( gpd_lib_data_size(node) > 1500 )
+        {
+            node = gpd_lib_iterator_remove(&itr); // Remove gpd with 1500+ data length
+        }
+    }
+}
+*******************************************************************************/
+
+// Umts GPD Header and Tail
+/******************************************************************************
+// An example of adding and removing a header and a tail to an umts gpd node
+{
+    gpd_node*   umts_dl_gpd; //A umts dl gpd node
+
+    kal_uint8   head[] = {0xAA,0xAA,0xAA};
+    kal_uint8   tail[] = {0xBB,0xBB,0xBB};
+
+    // Add header and tail
+    gpd_lib_umts_addHeader( umts_dl_gpd, head, 3 );
+    gpd_lib_umts_addTail( umts_dl_gpd, tail, 3 );
+
+    // Delete header and tail
+    gpd_lib_umts_delHeader( umts_dl_gpd, head, 3 );
+    gpd_lib_umts_delTail( umts_dl_gpd, tail, 3 );
+}
+*******************************************************************************/
+
+// Create Umts Single GPD and BD
+/******************************************************************************
+// An example of creating a single GPD with a single BD
+{
+    gpd_node*   umts_dl_gpd;
+
+    kal_uint8 mem[1024];
+    kal_uint8 data[] = { 1, 2, 3, 4 };
+
+    if( gpd_lib_umts_sizeSingleGpdBd() > 1024 ) ASSERT(0);
+
+    umts_dl_gpd = gpd_lib_umts_createSingleGpdBd( mem, data, 4 );
+
+    //You get a gpd_node umts_dl_gpd
+}
+*******************************************************************************/
+
+/******************************************************************************/
+
+#include "kal_general_types.h"
+
+/******************************************************************************/
+
+//#define __GPD_LIB_DUBUG__
+
+/******************************************************************************/
+
+#define GPD_LIB_GPD_RX_HEADER_SIZE  (0)
+#define GPD_LIB_GPD_RX_FOOTER_SIZE  (8)
+
+/******************************************************************************/
+
+typedef struct _gpd_node
+{
+    struct
+    {
+        kal_uint32  hwo:1;
+        kal_uint32  bdp:1;
+        kal_uint32  reserved:6;
+        kal_uint32  checksum:8;
+        kal_uint32  allow_buff_size:16;
+    } w0;
+    union
+    {
+        kal_uint32*         next_gpd_addr;
+        struct _gpd_node*   next_gpd_node;
+    } w1;
+    union
+    {
+        kal_uint8*  buff_addr;
+        kal_uint32* first_bd_addr;
+    } w2;
+    struct
+    {
+        kal_uint16  data_buff_size;
+        kal_uint16  reserved;
+    } w3;
+} gpd_node;
+
+/******************************************************************************/
+
+typedef struct _gpd_list
+{
+    gpd_node*   first;
+    gpd_node*   last;
+    
+} gpd_list;
+
+/******************************************************************************/
+
+typedef struct _gpd_itr
+{
+    gpd_node*   ptr;
+    gpd_node*   pre;
+    gpd_node**  root;
+    
+} gpd_itr;
+
+/******************************************************************************/
+
+extern gpd_node* gpd_lib_add( gpd_node* root, gpd_node* nodes );
+extern gpd_node* gpd_lib_poll( gpd_node* root, kal_uint16 num, gpd_node** nodes );
+extern kal_uint16 gpd_lib_size( gpd_node* root );
+extern kal_bool gpd_lib_scan( gpd_node* root, kal_uint16* size, gpd_node** last );
+
+/******************************************************************************/
+
+extern gpd_list* gpd_lib_list_create( void* mem_ptr );
+extern void gpd_lib_list_add( gpd_list* list, gpd_node* nodes );
+extern gpd_node* gpd_lib_list_poll( gpd_list* list, kal_uint16 num );
+extern void gpd_lib_list_add_ex( gpd_list* list, gpd_node* first, gpd_node* last );
+extern gpd_node* gpd_lib_list_poll_ex( gpd_list* list, gpd_node** last );
+extern kal_uint16 gpd_lib_list_size( gpd_list* list );
+
+/******************************************************************************/
+
+extern gpd_itr* gpd_lib_iterator_create( void* mem_ptr, gpd_node** nodes );
+extern gpd_node* gpd_lib_iterator_next( gpd_itr* itr );
+extern kal_bool gpd_lib_iterator_hasNext( gpd_itr* itr );
+extern gpd_node* gpd_lib_iterator_remove( gpd_itr* itr );
+extern gpd_node* gpd_lib_iterator_cut( gpd_itr* itr );
+
+/******************************************************************************/
+
+#define gpd_lib_data_size(np)           ((kal_uint16)((np)->w3.data_buff_size))
+#define gpd_lib_data_getAddr(np)        ((kal_uint8*)((np)->w2.buff_addr))
+#define gpd_lib_data_setSize(np,size)   ((np)->w3.data_buff_size = (kal_uint16)(size))
+extern kal_uint16 gpd_lib_data_totalsize( gpd_node* nodes );
+
+/******************************************************************************/
+
+extern void gpd_lib_umts_addHeader( gpd_node* node, kal_uint8* buff_ptr, 
+    kal_uint16 buff_len );
+extern void gpd_lib_umts_delHeader( gpd_node* node, kal_uint8** buff_ptr );
+extern kal_uint8* gpd_lib_umts_peekHeader( gpd_node* node );
+extern void gpd_lib_umts_addTail( gpd_node* node, kal_uint8* buff_ptr, 
+    kal_uint16 buff_len );
+extern void gpd_lib_umts_delTail( gpd_node* node, kal_uint8** buff_ptr );
+
+extern kal_uint8* gpd_lib_umts_getFirstBDDataPtr( gpd_node* node );
+extern kal_uint32* gpd_lib_umts_getFirstBDPeerBuffPtr( gpd_node* node );
+extern void gpd_lib_umts_clearFirstBDPeerBuffPtr( gpd_node* node );
+extern kal_uint8 gpd_lib_umts_getType( gpd_node* node );
+extern void gpd_lib_umts_setOutputAddr( gpd_node* node, kal_uint8* addr );
+
+/******************************************************************************/
+
+extern void gpd_lib_sdio_tx_initGpd(gpd_node * node);
+extern gpd_node* gpd_lib_sdio_tx_createGpd( void* mem_ptr, kal_uint8* buff_addr, 
+    kal_uint16 buff_len  );
+extern kal_uint8* gpd_lib_sdio_tx_getCCCIHeader( gpd_node* node );
+extern kal_uint8* gpd_lib_sdio_tx_getPayloadAddr(gpd_node * node);
+extern kal_uint16 gpd_lib_sdio_tx_getPayloadLen( gpd_node* node );
+extern kal_uint16 gpd_lib_sdio_tx_sizeGpd( void );
+
+/******************************************************************************/
+
+#if defined(__3G_NEW_DATA_PLANE_ARCH__) && defined(__GPD_LIB_TEST__)
+#include "uas_data_common.h"
+
+#define UMTSGPD_HEADER_BUFFER_SIZE 60  // used by module UPS
+#define UMTSGPD_FOOTER_BUFFER_SIZE 4   // used by module UPS
+
+typedef struct _umts_dl_gpd_flc
+{
+    umts_dl_gpd gpd;
+    
+    kal_uint32  header_buffer[(UMTSGPD_HEADER_BUFFER_SIZE+3)/4];
+    kal_uint32  footer_buffer[(UMTSGPD_FOOTER_BUFFER_SIZE+3)/4];
+   
+} umts_dl_gpd_flc;
+
+extern void gpd_lib_umts_initBd(umts_dl_bd * bd);
+extern void gpd_lib_umts_initGpd ( umts_dl_gpd* gpd );
+extern void gpd_lib_umts_initGpdFlc ( umts_dl_gpd_flc* gpd );
+extern void gpd_lib_umts_addBdtoGpd( umts_dl_gpd* gpd, umts_dl_bd* bd );
+extern gpd_node* gpd_lib_umts_createSingleGpdBd( void* mem_ptr, 
+    kal_uint8* buff_addr, kal_uint16 buff_len  );
+extern kal_uint16 gpd_lib_umts_sizeSingleGpdBd( void );
+#endif
+
+/******************************************************************************/
+#endif /* GPD_LIB_H */
+