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