Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 DLL Communication Abstraction Layer module in EPL user part
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: EplDlluCal.c,v $
53
54 $Author: D.Krueger $
55
56 $Revision: 1.7 $ $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 d.k.: start of the implementation, version 1.00
68
69****************************************************************************/
70
71#include "user/EplDlluCal.h"
72#include "user/EplEventu.h"
73
74#include "EplDllCal.h"
75
76// include only if direct call between user- and kernelspace is enabled
77#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
78#include "kernel/EplDllkCal.h"
79#endif
80
81#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
82
83/***************************************************************************/
84/* */
85/* */
86/* G L O B A L D E F I N I T I O N S */
87/* */
88/* */
89/***************************************************************************/
90
91//---------------------------------------------------------------------------
92// const defines
93//---------------------------------------------------------------------------
94
95//---------------------------------------------------------------------------
96// local types
97//---------------------------------------------------------------------------
98
99//---------------------------------------------------------------------------
100// modul globale vars
101//---------------------------------------------------------------------------
102
103//---------------------------------------------------------------------------
104// local function prototypes
105//---------------------------------------------------------------------------
106
107/***************************************************************************/
108/* */
109/* */
110/* C L A S S EplDlluCal */
111/* */
112/* */
113/***************************************************************************/
114//
115// Description:
116//
117//
118/***************************************************************************/
119
120//=========================================================================//
121// //
122// P R I V A T E D E F I N I T I O N S //
123// //
124//=========================================================================//
125
126//---------------------------------------------------------------------------
127// const defines
128//---------------------------------------------------------------------------
129
130//---------------------------------------------------------------------------
131// local types
132//---------------------------------------------------------------------------
133
134typedef struct {
135 tEplDlluCbAsnd m_apfnDlluCbAsnd[EPL_DLL_MAX_ASND_SERVICE_ID];
136
137} tEplDlluCalInstance;
138
139//---------------------------------------------------------------------------
140// local vars
141//---------------------------------------------------------------------------
142
143// if no dynamic memory allocation shall be used
144// define structures statically
145static tEplDlluCalInstance EplDlluCalInstance_g;
146
147//---------------------------------------------------------------------------
148// local function prototypes
149//---------------------------------------------------------------------------
150
151static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
152 ServiceId_p,
153 tEplDllAsndFilter Filter_p);
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: EplDlluCalAddInstance()
164//
165// Description: add and initialize new instance of DLL CAL module
166//
167// Parameters: none
168//
169// Returns: tEplKernel = error code
170//
171//
172// State:
173//
174//---------------------------------------------------------------------------
175
176tEplKernel EplDlluCalAddInstance(void)
177{
178 tEplKernel Ret = kEplSuccessful;
179
180 // reset instance structure
181 EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
182
183 return Ret;
184}
185
186//---------------------------------------------------------------------------
187//
188// Function: EplDlluCalDelInstance()
189//
190// Description: deletes an instance of DLL CAL module
191//
192// Parameters: none
193//
194// Returns: tEplKernel = error code
195//
196//
197// State:
198//
199//---------------------------------------------------------------------------
200
201tEplKernel EplDlluCalDelInstance(void)
202{
203 tEplKernel Ret = kEplSuccessful;
204
205 // reset instance structure
206 EPL_MEMSET(&EplDlluCalInstance_g, 0, sizeof(EplDlluCalInstance_g));
207
208 return Ret;
209}
210
211//---------------------------------------------------------------------------
212//
213// Function: EplDlluCalProcess
214//
215// Description: process the passed asynch frame
216//
217// Parameters: pEvent_p = event containing frame to be processed
218//
219// Returns: tEplKernel = error code
220//
221//
222// State:
223//
224//---------------------------------------------------------------------------
225
226tEplKernel EplDlluCalProcess(tEplEvent * pEvent_p)
227{
228 tEplKernel Ret = kEplSuccessful;
229 tEplMsgType MsgType;
230 unsigned int uiAsndServiceId;
231 tEplFrameInfo FrameInfo;
232
233 if (pEvent_p->m_EventType == kEplEventTypeAsndRx) {
234 FrameInfo.m_pFrame = (tEplFrame *) pEvent_p->m_pArg;
235 FrameInfo.m_uiFrameSize = pEvent_p->m_uiSize;
236 // extract NetTime
237 FrameInfo.m_NetTime = pEvent_p->m_NetTime;
238
239 MsgType =
240 (tEplMsgType) AmiGetByteFromLe(&FrameInfo.m_pFrame->
241 m_le_bMessageType);
242 if (MsgType != kEplMsgTypeAsnd) {
243 Ret = kEplInvalidOperation;
244 goto Exit;
245 }
246
247 uiAsndServiceId =
248 (unsigned int)AmiGetByteFromLe(&FrameInfo.m_pFrame->m_Data.
249 m_Asnd.m_le_bServiceId);
250 if (uiAsndServiceId < EPL_DLL_MAX_ASND_SERVICE_ID) { // ASnd service ID is valid
251 if (EplDlluCalInstance_g.m_apfnDlluCbAsnd[uiAsndServiceId] != NULL) { // handler was registered
252 Ret =
253 EplDlluCalInstance_g.
254 m_apfnDlluCbAsnd[uiAsndServiceId]
255 (&FrameInfo);
256 }
257 }
258 }
259
260 Exit:
261 return Ret;
262}
263
264//---------------------------------------------------------------------------
265//
266// Function: EplDlluCalRegAsndService()
267//
268// Description: registers the specified handler for the specified
269// AsndServiceId with the specified node ID filter.
270//
271// Parameters: ServiceId_p = ASnd Service ID
272// pfnDlluCbAsnd_p = callback function
273// Filter_p = node ID filter
274//
275// Returns: tEplKernel = error code
276//
277//
278// State:
279//
280//---------------------------------------------------------------------------
281
282tEplKernel EplDlluCalRegAsndService(tEplDllAsndServiceId ServiceId_p,
283 tEplDlluCbAsnd pfnDlluCbAsnd_p,
284 tEplDllAsndFilter Filter_p)
285{
286 tEplKernel Ret = kEplSuccessful;
287
288 if (ServiceId_p < tabentries(EplDlluCalInstance_g.m_apfnDlluCbAsnd)) {
289 // memorize function pointer
290 EplDlluCalInstance_g.m_apfnDlluCbAsnd[ServiceId_p] =
291 pfnDlluCbAsnd_p;
292
293 if (pfnDlluCbAsnd_p == NULL) { // close filter
294 Filter_p = kEplDllAsndFilterNone;
295 }
296 // set filter in DLL module in kernel part
297 Ret = EplDlluCalSetAsndServiceIdFilter(ServiceId_p, Filter_p);
298
299 }
300
301 return Ret;
302}
303
304//---------------------------------------------------------------------------
305//
306// Function: EplDlluCalAsyncSend()
307//
308// Description: sends the frame with the specified priority.
309//
310// Parameters: pFrameInfo_p = frame
311// m_uiFrameSize does not include the
312// ethernet header (14 bytes)
313// Priority_p = priority
314//
315// Returns: tEplKernel = error code
316//
317//
318// State:
319//
320//---------------------------------------------------------------------------
321
322tEplKernel EplDlluCalAsyncSend(tEplFrameInfo * pFrameInfo_p,
323 tEplDllAsyncReqPriority Priority_p)
324{
325 tEplKernel Ret = kEplSuccessful;
326
327#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLK)) != 0)
328 pFrameInfo_p->m_uiFrameSize += 14; // add size of ethernet header
329 Ret = EplDllkCalAsyncSend(pFrameInfo_p, Priority_p);
330#else
331 Ret = kEplSuccessful;
332#endif
333
334 return Ret;
335}
336
337#if(((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
338
339//---------------------------------------------------------------------------
340//
341// Function: EplDlluCalIssueRequest()
342//
343// Description: issues a StatusRequest or a IdentRequest to the specified node.
344//
345// Parameters: Service_p = request service ID
346// uiNodeId_p = node ID
347// bSoaFlag1_p = flag1 for this node (transmit in SoA and PReq)
348// If 0xFF this flag is ignored.
349//
350// Returns: tEplKernel = error code
351//
352//
353// State:
354//
355//---------------------------------------------------------------------------
356
357tEplKernel EplDlluCalIssueRequest(tEplDllReqServiceId Service_p,
358 unsigned int uiNodeId_p, u8 bSoaFlag1_p)
359{
360 tEplKernel Ret = kEplSuccessful;
361
362 // add node to appropriate request queue
363 switch (Service_p) {
364 case kEplDllReqServiceIdent:
365 case kEplDllReqServiceStatus:
366 {
367 tEplEvent Event;
368 tEplDllCalIssueRequest IssueReq;
369
370 Event.m_EventSink = kEplEventSinkDllkCal;
371 Event.m_EventType = kEplEventTypeDllkIssueReq;
372 IssueReq.m_Service = Service_p;
373 IssueReq.m_uiNodeId = uiNodeId_p;
374 IssueReq.m_bSoaFlag1 = bSoaFlag1_p;
375 Event.m_pArg = &IssueReq;
376 Event.m_uiSize = sizeof(IssueReq);
377
378 Ret = EplEventuPost(&Event);
379 break;
380 }
381
382 default:
383 {
384 Ret = kEplDllInvalidParam;
385 goto Exit;
386 }
387 }
388
389 Exit:
390 return Ret;
391}
392
393//---------------------------------------------------------------------------
394//
395// Function: EplDlluCalAddNode()
396//
397// Description: adds the specified node to the isochronous phase.
398//
399// Parameters: pNodeInfo_p = pointer of node info structure
400//
401// Returns: tEplKernel = error code
402//
403//
404// State:
405//
406//---------------------------------------------------------------------------
407
408tEplKernel EplDlluCalAddNode(tEplDllNodeInfo * pNodeInfo_p)
409{
410 tEplKernel Ret = kEplSuccessful;
411 tEplEvent Event;
412
413 Event.m_EventSink = kEplEventSinkDllkCal;
414 Event.m_EventType = kEplEventTypeDllkAddNode;
415 Event.m_pArg = pNodeInfo_p;
416 Event.m_uiSize = sizeof(tEplDllNodeInfo);
417
418 Ret = EplEventuPost(&Event);
419
420 return Ret;
421}
422
423//---------------------------------------------------------------------------
424//
425// Function: EplDlluCalDeleteNode()
426//
427// Description: removes the specified node from the isochronous phase.
428//
429// Parameters: uiNodeId_p = node ID
430//
431// Returns: tEplKernel = error code
432//
433//
434// State:
435//
436//---------------------------------------------------------------------------
437
438tEplKernel EplDlluCalDeleteNode(unsigned int uiNodeId_p)
439{
440 tEplKernel Ret = kEplSuccessful;
441 tEplEvent Event;
442
443 Event.m_EventSink = kEplEventSinkDllkCal;
444 Event.m_EventType = kEplEventTypeDllkDelNode;
445 Event.m_pArg = &uiNodeId_p;
446 Event.m_uiSize = sizeof(uiNodeId_p);
447
448 Ret = EplEventuPost(&Event);
449
450 return Ret;
451}
452
453//---------------------------------------------------------------------------
454//
455// Function: EplDlluCalSoftDeleteNode()
456//
457// Description: removes the specified node softly from the isochronous phase.
458//
459// Parameters: uiNodeId_p = node ID
460//
461// Returns: tEplKernel = error code
462//
463//
464// State:
465//
466//---------------------------------------------------------------------------
467
468tEplKernel EplDlluCalSoftDeleteNode(unsigned int uiNodeId_p)
469{
470 tEplKernel Ret = kEplSuccessful;
471 tEplEvent Event;
472
473 Event.m_EventSink = kEplEventSinkDllkCal;
474 Event.m_EventType = kEplEventTypeDllkSoftDelNode;
475 Event.m_pArg = &uiNodeId_p;
476 Event.m_uiSize = sizeof(uiNodeId_p);
477
478 Ret = EplEventuPost(&Event);
479
480 return Ret;
481}
482
483#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_NMT_MN)) != 0)
484
485//=========================================================================//
486// //
487// P R I V A T E F U N C T I O N S //
488// //
489//=========================================================================//
490
491//---------------------------------------------------------------------------
492//
493// Function: EplDlluCalSetAsndServiceIdFilter()
494//
495// Description: forwards call to EplDllkSetAsndServiceIdFilter() in kernel part
496//
497// Parameters: ServiceId_p = ASnd Service ID
498// Filter_p = node ID filter
499//
500// Returns: tEplKernel = error code
501//
502//
503// State:
504//
505//---------------------------------------------------------------------------
506
507static tEplKernel EplDlluCalSetAsndServiceIdFilter(tEplDllAsndServiceId
508 ServiceId_p,
509 tEplDllAsndFilter Filter_p)
510{
511 tEplKernel Ret = kEplSuccessful;
512 tEplEvent Event;
513 tEplDllCalAsndServiceIdFilter ServFilter;
514
515 Event.m_EventSink = kEplEventSinkDllkCal;
516 Event.m_EventType = kEplEventTypeDllkServFilter;
517 ServFilter.m_ServiceId = ServiceId_p;
518 ServFilter.m_Filter = Filter_p;
519 Event.m_pArg = &ServFilter;
520 Event.m_uiSize = sizeof(ServFilter);
521
522 Ret = EplEventuPost(&Event);
523
524 return Ret;
525}
526
527#endif // (((EPL_MODULE_INTEGRATION) & (EPL_MODULE_DLLU)) != 0)
528
529// EOF