blob: ef36815c798420e5a48fc26867e6d922e33120d7 [file] [log] [blame]
Daniel Krueger9d7164c2008-12-19 11:41:57 -08001/****************************************************************************
2
3 (c) SYSTEC electronic GmbH, D-07973 Greiz, August-Bebel-Str. 29
4 www.systec-electronic.com
5
6 Project: openPOWERLINK
7
8 Description: source file for Epl-Kernelspace-Event-Modul
9
10 License:
11
12 Redistribution and use in source and binary forms, with or without
13 modification, are permitted provided that the following conditions
14 are met:
15
16 1. Redistributions of source code must retain the above copyright
17 notice, this list of conditions and the following disclaimer.
18
19 2. Redistributions in binary form must reproduce the above copyright
20 notice, this list of conditions and the following disclaimer in the
21 documentation and/or other materials provided with the distribution.
22
23 3. Neither the name of SYSTEC electronic GmbH nor the names of its
24 contributors may be used to endorse or promote products derived
25 from this software without prior written permission. For written
26 permission, please contact info@systec-electronic.com.
27
28 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
31 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
32 COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
33 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
34 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
35 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
37 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
38 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 POSSIBILITY OF SUCH DAMAGE.
40
41 Severability Clause:
42
43 If a provision of this License is or becomes illegal, invalid or
44 unenforceable in any jurisdiction, that shall not affect:
45 1. the validity or enforceability in that jurisdiction of any other
46 provision of this License; or
47 2. the validity or enforceability in other jurisdictions of that or
48 any other provision of this License.
49
50 -------------------------------------------------------------------------
51
52 $RCSfile: EplEventk.c,v $
53
54 $Author: D.Krueger $
55
56 $Revision: 1.9 $ $Date: 2008/10/17 15:32:32 $
57
58 $State: Exp $
59
60 Build Environment:
61 GCC V3.4
62
63 -------------------------------------------------------------------------
64
65 Revision History:
66
67 2006/06/20 k.t.: start of the implementation
68
69****************************************************************************/
70
71#include "kernel/EplEventk.h"
72#include "kernel/EplNmtk.h"
73#include "kernel/EplDllk.h"
74#include "kernel/EplDllkCal.h"
75#include "kernel/EplErrorHandlerk.h"
76#include "Benchmark.h"
77
78#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
79#include "kernel/EplPdok.h"
80#include "kernel/EplPdokCal.h"
81#endif
82
83#ifdef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -080084#include "user/EplEventu.h"
Daniel Krueger9d7164c2008-12-19 11:41:57 -080085#else
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -080086#include "SharedBuff.h"
Daniel Krueger9d7164c2008-12-19 11:41:57 -080087#endif
88
89/***************************************************************************/
90/* */
91/* */
92/* G L O B A L D E F I N I T I O N S */
93/* */
94/* */
95/***************************************************************************/
96
97//---------------------------------------------------------------------------
98// const defines
99//---------------------------------------------------------------------------
100
101// TracePoint support for realtime-debugging
102#ifdef _DBG_TRACE_POINTS_
Greg Kroah-Hartman2ed53cf2009-03-23 12:36:38 -0700103void TgtDbgSignalTracePoint(u8 bTracePointNumber_p);
Greg Kroah-Hartmand539cfb2009-03-23 12:51:37 -0700104void TgtDbgPostTraceValue(u32 dwTraceValue_p);
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800105#define TGT_DBG_SIGNAL_TRACE_POINT(p) TgtDbgSignalTracePoint(p)
106#define TGT_DBG_POST_TRACE_VALUE(v) TgtDbgPostTraceValue(v)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800107#else
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800108#define TGT_DBG_SIGNAL_TRACE_POINT(p)
109#define TGT_DBG_POST_TRACE_VALUE(v)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800110#endif
111
112//---------------------------------------------------------------------------
113// local types
114//---------------------------------------------------------------------------
115
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800116typedef struct {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800117#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800118 tShbInstance m_pShbKernelToUserInstance;
119 tShbInstance m_pShbUserToKernelInstance;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800120#else
121
122#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800123 tEplSyncCb m_pfnCbSync;
124 unsigned int m_uiUserToKernelFullCount;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800125
126} tEplEventkInstance;
127
128//---------------------------------------------------------------------------
129// modul globale vars
130//---------------------------------------------------------------------------
131static tEplEventkInstance EplEventkInstance_g;
132//---------------------------------------------------------------------------
133// local function prototypes
134//---------------------------------------------------------------------------
135
136// callback function for incoming events
137#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800138static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
139 unsigned long ulDataSize_p);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800140#endif
141
142/***************************************************************************/
143/* */
144/* */
145/* C L A S S <Epl-Kernelspace-Event> */
146/* */
147/* */
148/***************************************************************************/
149//
150// Description:
151//
152//
153/***************************************************************************/
154
155//=========================================================================//
156// //
157// P U B L I C F U N C T I O N S //
158// //
159//=========================================================================//
160
161//---------------------------------------------------------------------------
162//
163// Function: EplEventkInit
164//
165// Description: function initializes the first instance
166//
167// Parameters: pfnCbSync_p = callback-function for sync event
168//
169// Returns: tEpKernel = errorcode
170//
171// State:
172//
173//---------------------------------------------------------------------------
174
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700175tEplKernel EplEventkInit(tEplSyncCb pfnCbSync_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800176{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800177 tEplKernel Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800178
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800179 Ret = EplEventkAddInstance(pfnCbSync_p);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800180
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800181 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800182
183}
184
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800185//---------------------------------------------------------------------------
186//
187// Function: EplEventkAddInstance
188//
189// Description: function adds one more instance
190//
191// Parameters: pfnCbSync_p = callback-function for sync event
192//
193// Returns: tEpKernel = errorcode
194//
195// State:
196//
197//---------------------------------------------------------------------------
198
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700199tEplKernel EplEventkAddInstance(tEplSyncCb pfnCbSync_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800200{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800201 tEplKernel Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800202#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800203 tShbError ShbError;
204 unsigned int fShbNewCreated;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800205#endif
206
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800207 Ret = kEplSuccessful;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800208
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800209 // init instance structure
210 EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800211
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800212 // save cb-function
213 EplEventkInstance_g.m_pfnCbSync = pfnCbSync_p;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800214
215#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800216 // init shared loop buffer
217 // kernel -> user
218 ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_KERNEL_TO_USER,
219 EPL_EVENT_NAME_SHB_KERNEL_TO_USER,
220 &EplEventkInstance_g.
221 m_pShbKernelToUserInstance,
222 &fShbNewCreated);
223 if (ShbError != kShbOk) {
224 EPL_DBGLVL_EVENTK_TRACE1
225 ("EplEventkAddInstance(): ShbCirAllocBuffer(K2U) -> 0x%X\n",
226 ShbError);
227 Ret = kEplNoResource;
228 goto Exit;
229 }
230 // user -> kernel
231 ShbError = ShbCirAllocBuffer(EPL_EVENT_SIZE_SHB_USER_TO_KERNEL,
232 EPL_EVENT_NAME_SHB_USER_TO_KERNEL,
233 &EplEventkInstance_g.
234 m_pShbUserToKernelInstance,
235 &fShbNewCreated);
236 if (ShbError != kShbOk) {
237 EPL_DBGLVL_EVENTK_TRACE1
238 ("EplEventkAddInstance(): ShbCirAllocBuffer(U2K) -> 0x%X\n",
239 ShbError);
240 Ret = kEplNoResource;
241 goto Exit;
242 }
243 // register eventhandler
244 ShbError =
245 ShbCirSetSignalHandlerNewData(EplEventkInstance_g.
246 m_pShbUserToKernelInstance,
247 EplEventkRxSignalHandlerCb,
248 kshbPriorityHigh);
249 if (ShbError != kShbOk) {
250 EPL_DBGLVL_EVENTK_TRACE1
251 ("EplEventkAddInstance(): ShbCirSetSignalHandlerNewData(U2K) -> 0x%X\n",
252 ShbError);
253 Ret = kEplNoResource;
254 goto Exit;
255 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800256
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800257 Exit:
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800258#endif
259
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800260 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800261
262}
263
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800264//---------------------------------------------------------------------------
265//
266// Function: EplEventkDelInstance
267//
268// Description: function deletes instance and frees the buffers
269//
270// Parameters: void
271//
272// Returns: tEpKernel = errorcode
273//
274// State:
275//
276//---------------------------------------------------------------------------
277
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700278tEplKernel EplEventkDelInstance(void)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800279{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800280 tEplKernel Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800281#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800282 tShbError ShbError;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800283#endif
284
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800285 Ret = kEplSuccessful;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800286
287#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800288 // set eventhandler to NULL
289 ShbError =
290 ShbCirSetSignalHandlerNewData(EplEventkInstance_g.
291 m_pShbUserToKernelInstance, NULL,
292 kShbPriorityNormal);
293 if (ShbError != kShbOk) {
294 EPL_DBGLVL_EVENTK_TRACE1
295 ("EplEventkDelInstance(): ShbCirSetSignalHandlerNewData(U2K) -> 0x%X\n",
296 ShbError);
297 Ret = kEplNoResource;
298 }
299 // free buffer User -> Kernel
300 ShbError =
301 ShbCirReleaseBuffer(EplEventkInstance_g.m_pShbUserToKernelInstance);
302 if (ShbError != kShbOk) {
303 EPL_DBGLVL_EVENTK_TRACE1
304 ("EplEventkDelInstance(): ShbCirReleaseBuffer(U2K) -> 0x%X\n",
305 ShbError);
306 Ret = kEplNoResource;
307 } else {
308 EplEventkInstance_g.m_pShbUserToKernelInstance = NULL;
309 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800310
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800311 // free buffer Kernel -> User
312 ShbError =
313 ShbCirReleaseBuffer(EplEventkInstance_g.m_pShbKernelToUserInstance);
314 if (ShbError != kShbOk) {
315 EPL_DBGLVL_EVENTK_TRACE1
316 ("EplEventkDelInstance(): ShbCirReleaseBuffer(K2U) -> 0x%X\n",
317 ShbError);
318 Ret = kEplNoResource;
319 } else {
320 EplEventkInstance_g.m_pShbKernelToUserInstance = NULL;
321 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800322#endif
323
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800324 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800325
326}
327
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800328//---------------------------------------------------------------------------
329//
330// Function: EplEventkProcess
331//
332// Description: Kernelthread that dispatches events in kernel part
333//
334// Parameters: pEvent_p = pointer to event-structure from buffer
335//
336// Returns: tEpKernel = errorcode
337//
338// State:
339//
340//---------------------------------------------------------------------------
341
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700342tEplKernel EplEventkProcess(tEplEvent *pEvent_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800343{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800344 tEplKernel Ret;
345 tEplEventSource EventSource;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800346
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800347 Ret = kEplSuccessful;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800348
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800349 // error handling if event queue is full
350 if (EplEventkInstance_g.m_uiUserToKernelFullCount > 0) { // UserToKernel event queue has run out of space -> kEplNmtEventInternComError
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800351#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800352 tEplEvent Event;
353 tEplNmtEvent NmtEvent;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800354#endif
355#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800356 tShbError ShbError;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800357#endif
358
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800359 // directly call NMTk process function, because event queue is full
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800360#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800361 NmtEvent = kEplNmtEventInternComError;
362 Event.m_EventSink = kEplEventSinkNmtk;
363 Event.m_NetTime.m_dwNanoSec = 0;
364 Event.m_NetTime.m_dwSec = 0;
365 Event.m_EventType = kEplEventTypeNmtEvent;
366 Event.m_pArg = &NmtEvent;
367 Event.m_uiSize = sizeof(NmtEvent);
368 Ret = EplNmtkProcess(&Event);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800369#endif
370
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800371 // NMT state machine changed to reset (i.e. NMT_GS_RESET_COMMUNICATION)
372 // now, it is safe to reset the counter and empty the event queue
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800373#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800374 ShbError =
375 ShbCirResetBuffer(EplEventkInstance_g.
376 m_pShbUserToKernelInstance, 1000, NULL);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800377#endif
378
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800379 EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
380 TGT_DBG_SIGNAL_TRACE_POINT(22);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800381
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800382 // also discard the current event (it doesn't matter if we lose another event)
383 goto Exit;
384 }
385 // check m_EventSink
386 switch (pEvent_p->m_EventSink) {
387 case kEplEventSinkSync:
388 {
389 if (EplEventkInstance_g.m_pfnCbSync != NULL) {
390 Ret = EplEventkInstance_g.m_pfnCbSync();
391 if (Ret == kEplSuccessful) {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800392#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800393 // mark TPDOs as valid
394 Ret = EplPdokCalSetTpdosValid(TRUE);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800395#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800396 } else if ((Ret != kEplReject)
397 && (Ret != kEplShutdown)) {
398 EventSource = kEplEventSourceSyncCb;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800399
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800400 // Error event for API layer
401 EplEventkPostError
402 (kEplEventSourceEventk, Ret,
403 sizeof(EventSource), &EventSource);
404 }
405 }
406 break;
407 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800408
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800409 // NMT-Kernel-Modul
410 case kEplEventSinkNmtk:
411 {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800412#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800413 Ret = EplNmtkProcess(pEvent_p);
414 if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
415 EventSource = kEplEventSourceNmtk;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800416
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800417 // Error event for API layer
418 EplEventkPostError(kEplEventSourceEventk,
419 Ret,
420 sizeof(EventSource),
421 &EventSource);
422 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800423#endif
424#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800425 if ((pEvent_p->m_EventType == kEplEventTypeNmtEvent)
426 &&
427 ((*((tEplNmtEvent *) pEvent_p->m_pArg) ==
428 kEplNmtEventDllCeSoa)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800429#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800430 || (*((tEplNmtEvent *) pEvent_p->m_pArg) ==
431 kEplNmtEventDllMeSoaSent)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800432#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800433 )) { // forward SoA event to error handler
434 Ret = EplErrorHandlerkProcess(pEvent_p);
435 if ((Ret != kEplSuccessful)
436 && (Ret != kEplShutdown)) {
437 EventSource = kEplEventSourceErrk;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800438
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800439 // Error event for API layer
440 EplEventkPostError
441 (kEplEventSourceEventk, Ret,
442 sizeof(EventSource), &EventSource);
443 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800444#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800445 // forward SoA event to PDO module
446 pEvent_p->m_EventType = kEplEventTypePdoSoa;
447 Ret = EplPdokProcess(pEvent_p);
448 if ((Ret != kEplSuccessful)
449 && (Ret != kEplShutdown)) {
450 EventSource = kEplEventSourcePdok;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800451
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800452 // Error event for API layer
453 EplEventkPostError
454 (kEplEventSourceEventk, Ret,
455 sizeof(EventSource), &EventSource);
456 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800457#endif
458
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800459 }
460 break;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800461#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800462 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800463
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800464 // events for Dllk module
465 case kEplEventSinkDllk:
466 {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800467#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800468 Ret = EplDllkProcess(pEvent_p);
469 if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
470 EventSource = kEplEventSourceDllk;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800471
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800472 // Error event for API layer
473 EplEventkPostError(kEplEventSourceEventk,
474 Ret,
475 sizeof(EventSource),
476 &EventSource);
477 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800478#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800479 break;
480 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800481
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800482 // events for DllkCal module
483 case kEplEventSinkDllkCal:
484 {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800485#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800486 Ret = EplDllkCalProcess(pEvent_p);
487 if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
488 EventSource = kEplEventSourceDllk;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800489
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800490 // Error event for API layer
491 EplEventkPostError(kEplEventSourceEventk,
492 Ret,
493 sizeof(EventSource),
494 &EventSource);
495 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800496#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800497 break;
498 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800499
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800500 //
501 case kEplEventSinkPdok:
502 {
503 // PDO-Module
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800504#if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800505 Ret = EplPdokProcess(pEvent_p);
506 if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
507 EventSource = kEplEventSourcePdok;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800508
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800509 // Error event for API layer
510 EplEventkPostError(kEplEventSourceEventk,
511 Ret,
512 sizeof(EventSource),
513 &EventSource);
514 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800515#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800516 break;
517 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800518
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800519 // events for Error handler module
520 case kEplEventSinkErrk:
521 {
522 // only call error handler if DLL is present
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800523#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800524 Ret = EplErrorHandlerkProcess(pEvent_p);
525 if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
526 EventSource = kEplEventSourceErrk;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800527
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800528 // Error event for API layer
529 EplEventkPostError(kEplEventSourceEventk,
530 Ret,
531 sizeof(EventSource),
532 &EventSource);
533 }
534 break;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800535#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800536 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800537
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800538 // unknown sink
539 default:
540 {
541 Ret = kEplEventUnknownSink;
542 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800543
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800544 } // end of switch(pEvent_p->m_EventSink)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800545
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800546 Exit:
547 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800548
549}
550
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800551//---------------------------------------------------------------------------
552//
553// Function: EplEventkPost
554//
555// Description: post events from kernel part
556//
557// Parameters: pEvent_p = pointer to event-structure from buffer
558//
559// Returns: tEpKernel = errorcode
560//
561// State:
562//
563//---------------------------------------------------------------------------
564
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700565tEplKernel EplEventkPost(tEplEvent *pEvent_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800566{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800567 tEplKernel Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800568#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800569 tShbError ShbError;
570 tShbCirChunk ShbCirChunk;
571 unsigned long ulDataSize;
572 unsigned int fBufferCompleted;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800573#endif
574
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800575 Ret = kEplSuccessful;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800576
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800577 // the event must be posted by using the abBuffer
578 // it is neede because the Argument must by copied
579 // to the buffer too and not only the pointer
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800580
581#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800582 // 2006/08/03 d.k.: Event and argument are posted as separate chunks to the event queue.
583 ulDataSize =
584 sizeof(tEplEvent) +
585 ((pEvent_p->m_pArg != NULL) ? pEvent_p->m_uiSize : 0);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800586#endif
587
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800588 // decide in which buffer the event have to write
589 switch (pEvent_p->m_EventSink) {
590 // kernelspace modules
591 case kEplEventSinkSync:
592 case kEplEventSinkNmtk:
593 case kEplEventSinkDllk:
594 case kEplEventSinkDllkCal:
595 case kEplEventSinkPdok:
596 case kEplEventSinkErrk:
597 {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800598#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800599 // post message
600 BENCHMARK_MOD_27_SET(2);
601 ShbError =
602 ShbCirAllocDataBlock(EplEventkInstance_g.
603 m_pShbUserToKernelInstance,
604 &ShbCirChunk, ulDataSize);
605 switch (ShbError) {
606 case kShbOk:
607 break;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800608
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800609 case kShbBufferFull:
610 {
611 EplEventkInstance_g.
612 m_uiUserToKernelFullCount++;
613 Ret = kEplEventPostError;
614 goto Exit;
615 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800616
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800617 default:
618 {
619 EPL_DBGLVL_EVENTK_TRACE1
620 ("EplEventkPost(): ShbCirAllocDataBlock(U2K) -> 0x%X\n",
621 ShbError);
622 Ret = kEplEventPostError;
623 goto Exit;
624 }
625 }
626 ShbError =
627 ShbCirWriteDataChunk(EplEventkInstance_g.
628 m_pShbUserToKernelInstance,
629 &ShbCirChunk, pEvent_p,
630 sizeof(tEplEvent),
631 &fBufferCompleted);
632 if (ShbError != kShbOk) {
633 EPL_DBGLVL_EVENTK_TRACE1
634 ("EplEventkPost(): ShbCirWriteDataChunk(U2K) -> 0x%X\n",
635 ShbError);
636 Ret = kEplEventPostError;
637 goto Exit;
638 }
639 if (fBufferCompleted == FALSE) {
640 ShbError =
641 ShbCirWriteDataChunk(EplEventkInstance_g.
642 m_pShbUserToKernelInstance,
643 &ShbCirChunk,
644 pEvent_p->m_pArg,
645 (unsigned long)
646 pEvent_p->m_uiSize,
647 &fBufferCompleted);
648 if ((ShbError != kShbOk)
649 || (fBufferCompleted == FALSE)) {
650 EPL_DBGLVL_EVENTK_TRACE1
651 ("EplEventkPost(): ShbCirWriteDataChunk2(U2K) -> 0x%X\n",
652 ShbError);
653 Ret = kEplEventPostError;
654 goto Exit;
655 }
656 }
657 BENCHMARK_MOD_27_RESET(2);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800658
659#else
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800660 Ret = EplEventkProcess(pEvent_p);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800661#endif
662
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800663 break;
664 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800665
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800666 // userspace modules
667 case kEplEventSinkNmtu:
668 case kEplEventSinkNmtMnu:
669 case kEplEventSinkSdoAsySeq:
670 case kEplEventSinkApi:
671 case kEplEventSinkDlluCal:
672 case kEplEventSinkErru:
673 {
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800674#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800675 // post message
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800676// BENCHMARK_MOD_27_SET(3); // 74 µs until reset
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800677 ShbError =
678 ShbCirAllocDataBlock(EplEventkInstance_g.
679 m_pShbKernelToUserInstance,
680 &ShbCirChunk, ulDataSize);
681 if (ShbError != kShbOk) {
682 EPL_DBGLVL_EVENTK_TRACE1
683 ("EplEventkPost(): ShbCirAllocDataBlock(K2U) -> 0x%X\n",
684 ShbError);
685 Ret = kEplEventPostError;
686 goto Exit;
687 }
688 ShbError =
689 ShbCirWriteDataChunk(EplEventkInstance_g.
690 m_pShbKernelToUserInstance,
691 &ShbCirChunk, pEvent_p,
692 sizeof(tEplEvent),
693 &fBufferCompleted);
694 if (ShbError != kShbOk) {
695 EPL_DBGLVL_EVENTK_TRACE1
696 ("EplEventkPost(): ShbCirWriteDataChunk(K2U) -> 0x%X\n",
697 ShbError);
698 Ret = kEplEventPostError;
699 goto Exit;
700 }
701 if (fBufferCompleted == FALSE) {
702 ShbError =
703 ShbCirWriteDataChunk(EplEventkInstance_g.
704 m_pShbKernelToUserInstance,
705 &ShbCirChunk,
706 pEvent_p->m_pArg,
707 (unsigned long)
708 pEvent_p->m_uiSize,
709 &fBufferCompleted);
710 if ((ShbError != kShbOk)
711 || (fBufferCompleted == FALSE)) {
712 EPL_DBGLVL_EVENTK_TRACE1
713 ("EplEventkPost(): ShbCirWriteDataChunk2(K2U) -> 0x%X\n",
714 ShbError);
715 Ret = kEplEventPostError;
716 goto Exit;
717 }
718 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800719// BENCHMARK_MOD_27_RESET(3); // 82 µs until ShbCirGetReadDataSize() in EplEventu
720
721#else
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800722 Ret = EplEventuProcess(pEvent_p);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800723#endif
724
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800725 break;
726 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800727
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800728 default:
729 {
730 Ret = kEplEventUnknownSink;
731 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800732
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800733 } // end of switch(pEvent_p->m_EventSink)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800734
735#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800736 Exit:
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800737#endif
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800738 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800739}
740
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800741//---------------------------------------------------------------------------
742//
743// Function: EplEventkPostError
744//
745// Description: post error event from kernel part to API layer
746//
747// Parameters: EventSource_p = source-module of the error event
748// EplError_p = code of occured error
749// ArgSize_p = size of the argument
750// pArg_p = pointer to the argument
751//
752// Returns: tEpKernel = errorcode
753//
754// State:
755//
756//---------------------------------------------------------------------------
757
Greg Kroah-Hartmand10f4692009-03-23 10:45:12 -0700758tEplKernel EplEventkPostError(tEplEventSource EventSource_p,
759 tEplKernel EplError_p,
760 unsigned int uiArgSize_p, void *pArg_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800761{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800762 tEplKernel Ret;
Greg Kroah-Hartman2ed53cf2009-03-23 12:36:38 -0700763 u8 abBuffer[EPL_MAX_EVENT_ARG_SIZE];
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800764 tEplEventError *pEventError = (tEplEventError *) abBuffer;
765 tEplEvent EplEvent;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800766
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800767 Ret = kEplSuccessful;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800768
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800769 // create argument
770 pEventError->m_EventSource = EventSource_p;
771 pEventError->m_EplError = EplError_p;
772 EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800773
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800774 // create event
775 EplEvent.m_EventType = kEplEventTypeError;
776 EplEvent.m_EventSink = kEplEventSinkApi;
777 EPL_MEMSET(&EplEvent.m_NetTime, 0x00, sizeof(EplEvent.m_NetTime));
778 EplEvent.m_uiSize =
779 (sizeof(EventSource_p) + sizeof(EplError_p) + uiArgSize_p);
780 EplEvent.m_pArg = &abBuffer[0];
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800781
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800782 // post errorevent
783 Ret = EplEventkPost(&EplEvent);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800784
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800785 return Ret;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800786}
787
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800788//=========================================================================//
789// //
790// P R I V A T E F U N C T I O N S //
791// //
792//=========================================================================//
793
794//---------------------------------------------------------------------------
795//
796// Function: EplEventkRxSignalHandlerCb()
797//
798// Description: Callback-function for events from user and kernel part
799//
800// Parameters: pShbRxInstance_p = Instance-pointer of buffer
801// ulDataSize_p = size of data
802//
803// Returns: void
804//
805// State:
806//
807//---------------------------------------------------------------------------
808
809#ifndef EPL_NO_FIFO
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800810static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
811 unsigned long ulDataSize_p)
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800812{
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800813 tEplEvent *pEplEvent;
814 tShbError ShbError;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800815//unsigned long ulBlockCount;
816//unsigned long ulDataSize;
Greg Kroah-Hartman2ed53cf2009-03-23 12:36:38 -0700817 u8 abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800818 // d.k.: abDataBuffer contains the complete tEplEvent structure
819 // and behind this the argument
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800820
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800821 TGT_DBG_SIGNAL_TRACE_POINT(20);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800822
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800823 BENCHMARK_MOD_27_RESET(0);
824 // copy data from event queue
825 ShbError = ShbCirReadDataBlock(pShbRxInstance_p,
826 &abDataBuffer[0],
827 sizeof(abDataBuffer), &ulDataSize_p);
828 if (ShbError != kShbOk) {
829 // error goto exit
830 goto Exit;
831 }
832 // resolve the pointer to the event structure
833 pEplEvent = (tEplEvent *) abDataBuffer;
834 // set Datasize
835 pEplEvent->m_uiSize = (ulDataSize_p - sizeof(tEplEvent));
836 if (pEplEvent->m_uiSize > 0) {
837 // set pointer to argument
838 pEplEvent->m_pArg = &abDataBuffer[sizeof(tEplEvent)];
839 } else {
840 //set pointer to NULL
841 pEplEvent->m_pArg = NULL;
842 }
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800843
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800844 BENCHMARK_MOD_27_SET(0);
845 // call processfunction
846 EplEventkProcess(pEplEvent);
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800847
Greg Kroah-Hartman833dfbe2008-12-19 17:11:52 -0800848 Exit:
849 return;
Daniel Krueger9d7164c2008-12-19 11:41:57 -0800850}
851#endif
852
853// EOF