1*53ee8cc1Swenshuai.xi
2*53ee8cc1Swenshuai.xi #include <string.h>
3*53ee8cc1Swenshuai.xi #include "MsCommon.h"
4*53ee8cc1Swenshuai.xi
5*53ee8cc1Swenshuai.xi #include "hdi_121.h"
6*53ee8cc1Swenshuai.xi #include "nsk_dbg.h"
7*53ee8cc1Swenshuai.xi #include "drvEMMFlt.h"
8*53ee8cc1Swenshuai.xi #include "drvNSK2Type.h"
9*53ee8cc1Swenshuai.xi #include "nsk2hdi_header.h"
10*53ee8cc1Swenshuai.xi #include "nsk2hdx_header.h"
11*53ee8cc1Swenshuai.xi
12*53ee8cc1Swenshuai.xi /*****************************************************************************\
13*53ee8cc1Swenshuai.xi \ local defines
14*53ee8cc1Swenshuai.xi \*****************************************************************************/
15*53ee8cc1Swenshuai.xi #define HARMRetFrom8 8
16*53ee8cc1Swenshuai.xi #define EMMReturnStart HARMRetFrom8
17*53ee8cc1Swenshuai.xi
18*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
19*53ee8cc1Swenshuai.xi // Local Variables
20*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
21*53ee8cc1Swenshuai.xi static void *pDstBuf;
22*53ee8cc1Swenshuai.xi static MS_BOOL _bStop = FALSE;
23*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
24*53ee8cc1Swenshuai.xi // Global Variables
25*53ee8cc1Swenshuai.xi //--------------------------------------------------------------------------------------------------
26*53ee8cc1Swenshuai.xi
27*53ee8cc1Swenshuai.xi /*****************************************************************************\
28*53ee8cc1Swenshuai.xi \ local functions
29*53ee8cc1Swenshuai.xi \*****************************************************************************/
30*53ee8cc1Swenshuai.xi
NSK2_EMMFLT_Notify(MS_U32 conn,MS_U32 reason,void * pData)31*53ee8cc1Swenshuai.xi void NSK2_EMMFLT_Notify(MS_U32 conn, MS_U32 reason, void *pData)
32*53ee8cc1Swenshuai.xi {
33*53ee8cc1Swenshuai.xi NDS_UBYTE *pEMMBuf;
34*53ee8cc1Swenshuai.xi //printf("************************************NSK2_EMMFLT_Notify\n");
35*53ee8cc1Swenshuai.xi
36*53ee8cc1Swenshuai.xi if(EMM_EVENT_ARRIVE == reason)
37*53ee8cc1Swenshuai.xi {
38*53ee8cc1Swenshuai.xi //printf("************************************EMM_EVENT_ARRIVE\n");
39*53ee8cc1Swenshuai.xi pEMMBuf = (NDS_UBYTE *)pData;
40*53ee8cc1Swenshuai.xi //MsOS_ReadMemory();
41*53ee8cc1Swenshuai.xi //printf("BYTE 29, 30 = %x, %x\n",pEMMBuf[28+EMMReturnStart],pEMMBuf[29+EMMReturnStart]);
42*53ee8cc1Swenshuai.xi //printf("pData = %x\n", (MS_U32)pData);
43*53ee8cc1Swenshuai.xi //printf("emm return buf = %x\n", (MS_U32)&pEMMBuf[EMMReturnStart]);
44*53ee8cc1Swenshuai.xi if(_bStop == FALSE)
45*53ee8cc1Swenshuai.xi {
46*53ee8cc1Swenshuai.xi NSK2HDX_EmmArrived(conn, &pEMMBuf[EMMReturnStart]/* RPC SIZECONST(256) */);
47*53ee8cc1Swenshuai.xi }
48*53ee8cc1Swenshuai.xi }
49*53ee8cc1Swenshuai.xi else if(EMM_EVENT_OVERFLOW == reason)
50*53ee8cc1Swenshuai.xi {
51*53ee8cc1Swenshuai.xi NSK_TRACE(("EMM_EVENT_OVERFLOW\n"));
52*53ee8cc1Swenshuai.xi NSK2HDX_EmmBufferOverflow(conn);
53*53ee8cc1Swenshuai.xi }
54*53ee8cc1Swenshuai.xi }
55*53ee8cc1Swenshuai.xi
NSK2_EMMFLT_Init(EMM_Init_Paras_t * pInitPara)56*53ee8cc1Swenshuai.xi MS_U32 NSK2_EMMFLT_Init(EMM_Init_Paras_t *pInitPara)
57*53ee8cc1Swenshuai.xi {
58*53ee8cc1Swenshuai.xi EMMFLT_RESULT init_result, bufcnt_result;
59*53ee8cc1Swenshuai.xi EMMFLT_Require_t tRequre;
60*53ee8cc1Swenshuai.xi MS_PHY u64AlignAddr;
61*53ee8cc1Swenshuai.xi MS_U32 BufCnt;
62*53ee8cc1Swenshuai.xi
63*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetDbgLevel(EMM_DBGLV_INFO);
64*53ee8cc1Swenshuai.xi
65*53ee8cc1Swenshuai.xi memset(&tRequre,0x0,sizeof(tRequre));
66*53ee8cc1Swenshuai.xi init_result = MDrv_EMMFLT_Init(&tRequre);
67*53ee8cc1Swenshuai.xi NSK_TRACE(("test by Jeff, init_result = %x \n",init_result));
68*53ee8cc1Swenshuai.xi
69*53ee8cc1Swenshuai.xi //MDrv_EMMFLT_SrcSelect(0, EMM_SRC_LIVEIN, EMM_SRC_INTERDEMOD_0);
70*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SrcSelect(0, pInitPara->u32SrcFrom, pInitPara->u32SrcType);
71*53ee8cc1Swenshuai.xi
72*53ee8cc1Swenshuai.xi
73*53ee8cc1Swenshuai.xi //allocate one memory for EMM fliter hw use....
74*53ee8cc1Swenshuai.xi pDstBuf = MApi_NSK2_AllocateMemory((tRequre.u32DstBufSize + tRequre.u32AlignBytes), FALSE);
75*53ee8cc1Swenshuai.xi if(pDstBuf == NULL)
76*53ee8cc1Swenshuai.xi {
77*53ee8cc1Swenshuai.xi NSK_ERROR(("null pointer from allocate memory\n"));
78*53ee8cc1Swenshuai.xi return FALSE;
79*53ee8cc1Swenshuai.xi }
80*53ee8cc1Swenshuai.xi
81*53ee8cc1Swenshuai.xi memset(pDstBuf,0x0,(tRequre.u32DstBufSize + tRequre.u32AlignBytes));
82*53ee8cc1Swenshuai.xi
83*53ee8cc1Swenshuai.xi u64AlignAddr = MsOS_VA2PA((MS_VIRT)pDstBuf);
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi u64AlignAddr = ( (u64AlignAddr + tRequre.u32AlignBytes) & (~(tRequre.u32AlignBytes-1)) );
86*53ee8cc1Swenshuai.xi NSK_TRACE(("u64AlignAddr = 0x%llx, AllocBuf = %p\n",u64AlignAddr,pDstBuf));
87*53ee8cc1Swenshuai.xi
88*53ee8cc1Swenshuai.xi
89*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetDstBufInfo(0,(MS_U32)u64AlignAddr, tRequre.u32DstBufSize);
90*53ee8cc1Swenshuai.xi
91*53ee8cc1Swenshuai.xi bufcnt_result = MDrv_EMMFLT_GetHwBufCnt(&BufCnt);
92*53ee8cc1Swenshuai.xi NSK2HDX_SetEmmHwInfo(BufCnt);
93*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetNotify(&NSK2_EMMFLT_Notify);
94*53ee8cc1Swenshuai.xi return TRUE;
95*53ee8cc1Swenshuai.xi }
96*53ee8cc1Swenshuai.xi
NSK2HDX_RequestEmm(NDS_ULONG x_connection,NSK2HDX_EMM_FILTER * emmfl)97*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_RequestEmm(NDS_ULONG x_connection, NSK2HDX_EMM_FILTER *emmfl/* RPC IN OUT */)
98*53ee8cc1Swenshuai.xi {
99*53ee8cc1Swenshuai.xi MS_U16 i;
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi //printf("enxter NSK2HDX_RequestEmm\n");
102*53ee8cc1Swenshuai.xi NSK_INFO(("enxter x_connection = %x \n",x_connection));
103*53ee8cc1Swenshuai.xi
104*53ee8cc1Swenshuai.xi //MDrv_EMMFLT_SrcSelect(0, EMM_SRC_LIVEIN, EMM_SRC_INTERDEMOD_0);
105*53ee8cc1Swenshuai.xi
106*53ee8cc1Swenshuai.xi NSK_INFO(("pid = %x, num_of_filters = %x\n",emmfl->emm_pid,emmfl->num_of_filters));
107*53ee8cc1Swenshuai.xi for(i=0;i<16;i++)
108*53ee8cc1Swenshuai.xi {
109*53ee8cc1Swenshuai.xi NSK_INFO(("table_id[%x]=%x, table_id_flag[%x]=%x\n",i,emmfl->table_id[i],i,emmfl->table_id_flag[i]));
110*53ee8cc1Swenshuai.xi }
111*53ee8cc1Swenshuai.xi
112*53ee8cc1Swenshuai.xi for(i=0;i<emmfl->num_of_filters;i++)
113*53ee8cc1Swenshuai.xi {
114*53ee8cc1Swenshuai.xi if(i>7)
115*53ee8cc1Swenshuai.xi {
116*53ee8cc1Swenshuai.xi break;
117*53ee8cc1Swenshuai.xi }
118*53ee8cc1Swenshuai.xi NSK_INFO(("Address[%x] = (%x, %x, %x, %x)\n",i, emmfl->filter_def[i].filter_address[0], \
119*53ee8cc1Swenshuai.xi emmfl->filter_def[i].filter_address[1],emmfl->filter_def[i].filter_address[2],emmfl->filter_def[i].filter_address[3]));
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi NSK_INFO(("Mask[%x] = (%x, %x, %x, %x)\n",i, emmfl->filter_def[i].filter_address_mask[0], \
122*53ee8cc1Swenshuai.xi emmfl->filter_def[i].filter_address_mask[1],emmfl->filter_def[i].filter_address_mask[2],emmfl->filter_def[i].filter_address_mask[3]));
123*53ee8cc1Swenshuai.xi NSK_INFO(("type = %x\n",emmfl->filter_def[i].filter_type));
124*53ee8cc1Swenshuai.xi }
125*53ee8cc1Swenshuai.xi
126*53ee8cc1Swenshuai.xi #if 0
127*53ee8cc1Swenshuai.xi emmfl->filter_def[0].filter_address[3] = 0x8;
128*53ee8cc1Swenshuai.xi emmfl->filter_def[1].filter_address_mask[3] = 0x0;
129*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address_mask[0] = emmfl->filter_def[2].filter_address_mask[1] = 0x0;
130*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address_mask[2] = emmfl->filter_def[2].filter_address_mask[3] = 0x0;
131*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address[0] = 0x1;
132*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address[1] = 0x2;
133*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address[2] = 0x3;
134*53ee8cc1Swenshuai.xi emmfl->filter_def[2].filter_address[3] = 0x4;
135*53ee8cc1Swenshuai.xi #endif
136*53ee8cc1Swenshuai.xi
137*53ee8cc1Swenshuai.xi emmfl->emm_pid |= 0x8000;
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi MS_U8 TID_Enable = FALSE;
140*53ee8cc1Swenshuai.xi MS_U8 num_of_flt,u8I;
141*53ee8cc1Swenshuai.xi EMM_FILTER_DEF_t tEMMFilter;
142*53ee8cc1Swenshuai.xi //check TID flag.....
143*53ee8cc1Swenshuai.xi for(i = 0; i< 16 ; i++)
144*53ee8cc1Swenshuai.xi {
145*53ee8cc1Swenshuai.xi if(emmfl->table_id[i] == 0)
146*53ee8cc1Swenshuai.xi {
147*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_INGORE);
148*53ee8cc1Swenshuai.xi continue;
149*53ee8cc1Swenshuai.xi }
150*53ee8cc1Swenshuai.xi
151*53ee8cc1Swenshuai.xi TID_Enable = TRUE;
152*53ee8cc1Swenshuai.xi //DRVEMM_DBG(EMM_DBGLV_DEBUG,"table_id(%d) = %x\n",u8I,pEmmFlt->table_id[u8I]);
153*53ee8cc1Swenshuai.xi
154*53ee8cc1Swenshuai.xi if(emmfl->table_id_flag[i] == NSK2HDX_DISABLE_TID)
155*53ee8cc1Swenshuai.xi {
156*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_INGORE);
157*53ee8cc1Swenshuai.xi }
158*53ee8cc1Swenshuai.xi else if(emmfl->table_id_flag[i] == NSK2HDX_ENABLE_TID)
159*53ee8cc1Swenshuai.xi {
160*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_ACCEPT_ALL);
161*53ee8cc1Swenshuai.xi }
162*53ee8cc1Swenshuai.xi else if(emmfl->table_id_flag[i] == NSK2HDX_ENABLE_TID_NDS)
163*53ee8cc1Swenshuai.xi {
164*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_ACCEPT_ADDRESS);
165*53ee8cc1Swenshuai.xi }
166*53ee8cc1Swenshuai.xi else
167*53ee8cc1Swenshuai.xi {
168*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetTidMode(x_connection,(i&0xf),EMM_TIDMODE_RESERVED);
169*53ee8cc1Swenshuai.xi }
170*53ee8cc1Swenshuai.xi }
171*53ee8cc1Swenshuai.xi
172*53ee8cc1Swenshuai.xi NSK_INFO(("Set PID\n"));
173*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetEmmPID(x_connection,emmfl->emm_pid);
174*53ee8cc1Swenshuai.xi
175*53ee8cc1Swenshuai.xi NSK_INFO(("Enable TID\n"));
176*53ee8cc1Swenshuai.xi MDrv_EMMFLT_EnableEmmTID(x_connection,TID_Enable);
177*53ee8cc1Swenshuai.xi
178*53ee8cc1Swenshuai.xi if(emmfl->num_of_filters > 8) //fixed bug 6th
179*53ee8cc1Swenshuai.xi {
180*53ee8cc1Swenshuai.xi NSK_ERROR(("num_of_filters > 8 !!!!!\n"));
181*53ee8cc1Swenshuai.xi return NSK2HDX_INVALID_REQUEST;
182*53ee8cc1Swenshuai.xi }
183*53ee8cc1Swenshuai.xi else
184*53ee8cc1Swenshuai.xi {
185*53ee8cc1Swenshuai.xi num_of_flt = (MS_U8) emmfl->num_of_filters;
186*53ee8cc1Swenshuai.xi }
187*53ee8cc1Swenshuai.xi
188*53ee8cc1Swenshuai.xi NSK_INFO(("Set Filter CFG\n"));
189*53ee8cc1Swenshuai.xi for(u8I = 0; u8I< num_of_flt ; u8I++)
190*53ee8cc1Swenshuai.xi {
191*53ee8cc1Swenshuai.xi memset(&tEMMFilter,0x0,sizeof(EMM_FILTER_DEF_t));
192*53ee8cc1Swenshuai.xi memcpy(&tEMMFilter,&emmfl->filter_def[u8I],sizeof(EMM_FILTER_DEF_t));
193*53ee8cc1Swenshuai.xi MDrv_EMMFLT_SetFilterCfg(x_connection,u8I,&tEMMFilter);
194*53ee8cc1Swenshuai.xi }
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi _bStop = FALSE;
197*53ee8cc1Swenshuai.xi //fire EMM filter to wait stream...
198*53ee8cc1Swenshuai.xi MDrv_EMMFLT_Fire(x_connection);
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi NSK_INFO(("leave NSK2HDX_RequestEmm\n"));
201*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
202*53ee8cc1Swenshuai.xi }
203*53ee8cc1Swenshuai.xi
NSK2HDX_StopEmm(NDS_ULONG x_connection)204*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_StopEmm(NDS_ULONG x_connection)
205*53ee8cc1Swenshuai.xi {
206*53ee8cc1Swenshuai.xi NSK_TRACE(("enxter NSK2HDX_StopEmm\n"));
207*53ee8cc1Swenshuai.xi _bStop = TRUE;
208*53ee8cc1Swenshuai.xi MDrv_EMMFLT_StopEmm(x_connection);
209*53ee8cc1Swenshuai.xi NSK_TRACE(("leave NSK2HDX_StopEmm\n"));
210*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
211*53ee8cc1Swenshuai.xi }
212*53ee8cc1Swenshuai.xi
NSK2HDX_EmmProcessingFinished(NDS_UBYTE * emm_buf)213*53ee8cc1Swenshuai.xi NDS_STATUS32 NSK2HDX_EmmProcessingFinished(NDS_UBYTE *emm_buf/* RPC SIZECONST(256) */)
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi NSK_TRACE(("enxter NSK2HDX_EmmProcessingFinished\n"));
216*53ee8cc1Swenshuai.xi //MsOS_DelayTask(10);
217*53ee8cc1Swenshuai.xi
218*53ee8cc1Swenshuai.xi //printf("enxter NSK2HDX_EmmProcessingFinished \n");
219*53ee8cc1Swenshuai.xi //return NSK2HDX_OK;
220*53ee8cc1Swenshuai.xi MDrv_EMMFLT_EmmProcessingFinished(emm_buf-EMMReturnStart);
221*53ee8cc1Swenshuai.xi //printf("leave NSK2HDX_EmmProcessingFinished \n");
222*53ee8cc1Swenshuai.xi //NSK_TRACE(("leave NSK2HDX_EmmProcessingFinished\n"));
223*53ee8cc1Swenshuai.xi return NSK2HDX_OK;
224*53ee8cc1Swenshuai.xi }
225*53ee8cc1Swenshuai.xi
226*53ee8cc1Swenshuai.xi
227