xref: /utopia/UTPA2-700.0.x/modules/dscmb/api/nsk2hdi/nsk2hdx_emmflt.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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