Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[sfrench/cifs-2.6.git] / drivers / staging / epl / EplEventk.c
1 /****************************************************************************
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
84 #include "user/EplEventu.h"
85 #else
86 #include "SharedBuff.h"
87 #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_
103 void PUBLIC TgtDbgSignalTracePoint(BYTE bTracePointNumber_p);
104 void PUBLIC TgtDbgPostTraceValue(DWORD dwTraceValue_p);
105 #define TGT_DBG_SIGNAL_TRACE_POINT(p)   TgtDbgSignalTracePoint(p)
106 #define TGT_DBG_POST_TRACE_VALUE(v)     TgtDbgPostTraceValue(v)
107 #else
108 #define TGT_DBG_SIGNAL_TRACE_POINT(p)
109 #define TGT_DBG_POST_TRACE_VALUE(v)
110 #endif
111
112 //---------------------------------------------------------------------------
113 // local types
114 //---------------------------------------------------------------------------
115
116 typedef struct {
117 #ifndef EPL_NO_FIFO
118         tShbInstance m_pShbKernelToUserInstance;
119         tShbInstance m_pShbUserToKernelInstance;
120 #else
121
122 #endif
123         tEplSyncCb m_pfnCbSync;
124         unsigned int m_uiUserToKernelFullCount;
125
126 } tEplEventkInstance;
127
128 //---------------------------------------------------------------------------
129 // modul globale vars
130 //---------------------------------------------------------------------------
131 static tEplEventkInstance EplEventkInstance_g;
132 //---------------------------------------------------------------------------
133 // local function prototypes
134 //---------------------------------------------------------------------------
135
136 // callback function for incoming events
137 #ifndef EPL_NO_FIFO
138 static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
139                                        unsigned long ulDataSize_p);
140 #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
175 tEplKernel PUBLIC EplEventkInit(tEplSyncCb pfnCbSync_p)
176 {
177         tEplKernel Ret;
178
179         Ret = EplEventkAddInstance(pfnCbSync_p);
180
181         return Ret;
182
183 }
184
185 //---------------------------------------------------------------------------
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
199 tEplKernel PUBLIC EplEventkAddInstance(tEplSyncCb pfnCbSync_p)
200 {
201         tEplKernel Ret;
202 #ifndef EPL_NO_FIFO
203         tShbError ShbError;
204         unsigned int fShbNewCreated;
205 #endif
206
207         Ret = kEplSuccessful;
208
209         // init instance structure
210         EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
211
212         // save cb-function
213         EplEventkInstance_g.m_pfnCbSync = pfnCbSync_p;
214
215 #ifndef EPL_NO_FIFO
216         // 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         }
256
257       Exit:
258 #endif
259
260         return Ret;
261
262 }
263
264 //---------------------------------------------------------------------------
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
278 tEplKernel PUBLIC EplEventkDelInstance()
279 {
280         tEplKernel Ret;
281 #ifndef EPL_NO_FIFO
282         tShbError ShbError;
283 #endif
284
285         Ret = kEplSuccessful;
286
287 #ifndef EPL_NO_FIFO
288         // 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         }
310
311         // 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         }
322 #endif
323
324         return Ret;
325
326 }
327
328 //---------------------------------------------------------------------------
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
342 tEplKernel PUBLIC EplEventkProcess(tEplEvent * pEvent_p)
343 {
344         tEplKernel Ret;
345         tEplEventSource EventSource;
346
347         Ret = kEplSuccessful;
348
349         // error handling if event queue is full
350         if (EplEventkInstance_g.m_uiUserToKernelFullCount > 0) {        // UserToKernel event queue has run out of space -> kEplNmtEventInternComError
351 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
352                 tEplEvent Event;
353                 tEplNmtEvent NmtEvent;
354 #endif
355 #ifndef EPL_NO_FIFO
356                 tShbError ShbError;
357 #endif
358
359                 // directly call NMTk process function, because event queue is full
360 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
361                 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);
369 #endif
370
371                 // 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
373 #ifndef EPL_NO_FIFO
374                 ShbError =
375                     ShbCirResetBuffer(EplEventkInstance_g.
376                                       m_pShbUserToKernelInstance, 1000, NULL);
377 #endif
378
379                 EplEventkInstance_g.m_uiUserToKernelFullCount = 0;
380                 TGT_DBG_SIGNAL_TRACE_POINT(22);
381
382                 // 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) {
392 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
393                                         // mark TPDOs as valid
394                                         Ret = EplPdokCalSetTpdosValid(TRUE);
395 #endif
396                                 } else if ((Ret != kEplReject)
397                                            && (Ret != kEplShutdown)) {
398                                         EventSource = kEplEventSourceSyncCb;
399
400                                         // Error event for API layer
401                                         EplEventkPostError
402                                             (kEplEventSourceEventk, Ret,
403                                              sizeof(EventSource), &EventSource);
404                                 }
405                         }
406                         break;
407                 }
408
409                 // NMT-Kernel-Modul
410         case kEplEventSinkNmtk:
411                 {
412 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMTK)) != 0)
413                         Ret = EplNmtkProcess(pEvent_p);
414                         if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
415                                 EventSource = kEplEventSourceNmtk;
416
417                                 // Error event for API layer
418                                 EplEventkPostError(kEplEventSourceEventk,
419                                                    Ret,
420                                                    sizeof(EventSource),
421                                                    &EventSource);
422                         }
423 #endif
424 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
425                         if ((pEvent_p->m_EventType == kEplEventTypeNmtEvent)
426                             &&
427                             ((*((tEplNmtEvent *) pEvent_p->m_pArg) ==
428                               kEplNmtEventDllCeSoa)
429 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
430                              || (*((tEplNmtEvent *) pEvent_p->m_pArg) ==
431                                  kEplNmtEventDllMeSoaSent)
432 #endif
433                             )) {        // forward SoA event to error handler
434                                 Ret = EplErrorHandlerkProcess(pEvent_p);
435                                 if ((Ret != kEplSuccessful)
436                                     && (Ret != kEplShutdown)) {
437                                         EventSource = kEplEventSourceErrk;
438
439                                         // Error event for API layer
440                                         EplEventkPostError
441                                             (kEplEventSourceEventk, Ret,
442                                              sizeof(EventSource), &EventSource);
443                                 }
444 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
445                                 // 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;
451
452                                         // Error event for API layer
453                                         EplEventkPostError
454                                             (kEplEventSourceEventk, Ret,
455                                              sizeof(EventSource), &EventSource);
456                                 }
457 #endif
458
459                         }
460                         break;
461 #endif
462                 }
463
464                 // events for Dllk module
465         case kEplEventSinkDllk:
466                 {
467 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
468                         Ret = EplDllkProcess(pEvent_p);
469                         if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
470                                 EventSource = kEplEventSourceDllk;
471
472                                 // Error event for API layer
473                                 EplEventkPostError(kEplEventSourceEventk,
474                                                    Ret,
475                                                    sizeof(EventSource),
476                                                    &EventSource);
477                         }
478 #endif
479                         break;
480                 }
481
482                 // events for DllkCal module
483         case kEplEventSinkDllkCal:
484                 {
485 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
486                         Ret = EplDllkCalProcess(pEvent_p);
487                         if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
488                                 EventSource = kEplEventSourceDllk;
489
490                                 // Error event for API layer
491                                 EplEventkPostError(kEplEventSourceEventk,
492                                                    Ret,
493                                                    sizeof(EventSource),
494                                                    &EventSource);
495                         }
496 #endif
497                         break;
498                 }
499
500                 //
501         case kEplEventSinkPdok:
502                 {
503                         // PDO-Module
504 #if (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_PDOK)) != 0)
505                         Ret = EplPdokProcess(pEvent_p);
506                         if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
507                                 EventSource = kEplEventSourcePdok;
508
509                                 // Error event for API layer
510                                 EplEventkPostError(kEplEventSourceEventk,
511                                                    Ret,
512                                                    sizeof(EventSource),
513                                                    &EventSource);
514                         }
515 #endif
516                         break;
517                 }
518
519                 // events for Error handler module
520         case kEplEventSinkErrk:
521                 {
522                         // only call error handler if DLL is present
523 #if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
524                         Ret = EplErrorHandlerkProcess(pEvent_p);
525                         if ((Ret != kEplSuccessful) && (Ret != kEplShutdown)) {
526                                 EventSource = kEplEventSourceErrk;
527
528                                 // Error event for API layer
529                                 EplEventkPostError(kEplEventSourceEventk,
530                                                    Ret,
531                                                    sizeof(EventSource),
532                                                    &EventSource);
533                         }
534                         break;
535 #endif
536                 }
537
538                 // unknown sink
539         default:
540                 {
541                         Ret = kEplEventUnknownSink;
542                 }
543
544         }                       // end of switch(pEvent_p->m_EventSink)
545
546       Exit:
547         return Ret;
548
549 }
550
551 //---------------------------------------------------------------------------
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
565 tEplKernel PUBLIC EplEventkPost(tEplEvent * pEvent_p)
566 {
567         tEplKernel Ret;
568 #ifndef EPL_NO_FIFO
569         tShbError ShbError;
570         tShbCirChunk ShbCirChunk;
571         unsigned long ulDataSize;
572         unsigned int fBufferCompleted;
573 #endif
574
575         Ret = kEplSuccessful;
576
577         // 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
580
581 #ifndef EPL_NO_FIFO
582         // 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);
586 #endif
587
588         // 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                 {
598 #ifndef EPL_NO_FIFO
599                         // 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;
608
609                         case kShbBufferFull:
610                                 {
611                                         EplEventkInstance_g.
612                                             m_uiUserToKernelFullCount++;
613                                         Ret = kEplEventPostError;
614                                         goto Exit;
615                                 }
616
617                         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);
658
659 #else
660                         Ret = EplEventkProcess(pEvent_p);
661 #endif
662
663                         break;
664                 }
665
666                 // userspace modules
667         case kEplEventSinkNmtu:
668         case kEplEventSinkNmtMnu:
669         case kEplEventSinkSdoAsySeq:
670         case kEplEventSinkApi:
671         case kEplEventSinkDlluCal:
672         case kEplEventSinkErru:
673                 {
674 #ifndef EPL_NO_FIFO
675                         // post message
676 //            BENCHMARK_MOD_27_SET(3);    // 74 µs until reset
677                         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                         }
719 //            BENCHMARK_MOD_27_RESET(3);  // 82 µs until ShbCirGetReadDataSize() in EplEventu
720
721 #else
722                         Ret = EplEventuProcess(pEvent_p);
723 #endif
724
725                         break;
726                 }
727
728         default:
729                 {
730                         Ret = kEplEventUnknownSink;
731                 }
732
733         }                       // end of switch(pEvent_p->m_EventSink)
734
735 #ifndef EPL_NO_FIFO
736       Exit:
737 #endif
738         return Ret;
739 }
740
741 //---------------------------------------------------------------------------
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
758 tEplKernel PUBLIC EplEventkPostError(tEplEventSource EventSource_p,
759                                      tEplKernel EplError_p,
760                                      unsigned int uiArgSize_p, void *pArg_p)
761 {
762         tEplKernel Ret;
763         BYTE abBuffer[EPL_MAX_EVENT_ARG_SIZE];
764         tEplEventError *pEventError = (tEplEventError *) abBuffer;
765         tEplEvent EplEvent;
766
767         Ret = kEplSuccessful;
768
769         // create argument
770         pEventError->m_EventSource = EventSource_p;
771         pEventError->m_EplError = EplError_p;
772         EPL_MEMCPY(&pEventError->m_Arg, pArg_p, uiArgSize_p);
773
774         // 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];
781
782         // post errorevent
783         Ret = EplEventkPost(&EplEvent);
784
785         return Ret;
786 }
787
788 //=========================================================================//
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
810 static void EplEventkRxSignalHandlerCb(tShbInstance pShbRxInstance_p,
811                                        unsigned long ulDataSize_p)
812 {
813         tEplEvent *pEplEvent;
814         tShbError ShbError;
815 //unsigned long   ulBlockCount;
816 //unsigned long   ulDataSize;
817         BYTE abDataBuffer[sizeof(tEplEvent) + EPL_MAX_EVENT_ARG_SIZE];
818         // d.k.: abDataBuffer contains the complete tEplEvent structure
819         //       and behind this the argument
820
821         TGT_DBG_SIGNAL_TRACE_POINT(20);
822
823         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         }
843
844         BENCHMARK_MOD_27_SET(0);
845         // call processfunction
846         EplEventkProcess(pEplEvent);
847
848       Exit:
849         return;
850 }
851 #endif
852
853 // EOF