Merge branch 'linus' into x86/cleanups
[GitHub/mt8127/android_kernel_alcatel_ttab.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