Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/ncsw/Peripherals/FM/MACSEC/fm_macsec_master.c
48417 views
1
/*
2
* Copyright 2008-2015 Freescale Semiconductor Inc.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
* * Redistributions of source code must retain the above copyright
7
* notice, this list of conditions and the following disclaimer.
8
* * Redistributions in binary form must reproduce the above copyright
9
* notice, this list of conditions and the following disclaimer in the
10
* documentation and/or other materials provided with the distribution.
11
* * Neither the name of Freescale Semiconductor nor the
12
* names of its contributors may be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
*
16
* ALTERNATIVELY, this software may be distributed under the terms of the
17
* GNU General Public License ("GPL") as published by the Free Software
18
* Foundation, either version 2 of that License or (at your option) any
19
* later version.
20
*
21
* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
*/
32
33
/******************************************************************************
34
@File fm_macsec.c
35
36
@Description FM MACSEC driver routines implementation.
37
*//***************************************************************************/
38
39
#include "std_ext.h"
40
#include "error_ext.h"
41
#include "xx_ext.h"
42
#include "string_ext.h"
43
#include "sprint_ext.h"
44
#include "fm_mac_ext.h"
45
46
#include "fm_macsec_master.h"
47
48
49
extern uint16_t FM_MAC_GetMaxFrameLength(t_Handle FmMac);
50
51
52
/****************************************/
53
/* static functions */
54
/****************************************/
55
static t_Error CheckFmMacsecParameters(t_FmMacsec *p_FmMacsec)
56
{
57
if (!p_FmMacsec->f_Exception)
58
RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));
59
60
return E_OK;
61
}
62
63
static void UnimplementedIsr(t_Handle h_Arg, uint32_t id)
64
{
65
UNUSED(h_Arg); UNUSED(id);
66
67
REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented Isr!"));
68
}
69
70
static void MacsecEventIsr(t_Handle h_FmMacsec)
71
{
72
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
73
uint32_t events,event,i;
74
75
SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);
76
77
events = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->evr);
78
events |= GET_UINT32(p_FmMacsec->p_FmMacsecRegs->ever);
79
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->evr,events);
80
81
for (i=0; i<NUM_OF_TX_SC; i++)
82
if (events & FM_MACSEC_EV_TX_SC_NEXT_PN(i))
83
{
84
GET_MACSEC_MODULE_EVENT(e_FM_MACSEC_MOD_SC_TX, i, e_FM_INTR_TYPE_NORMAL, event);
85
p_FmMacsec->intrMng[event].f_Isr(p_FmMacsec->intrMng[event].h_SrcHandle, i);
86
}
87
}
88
89
static void MacsecErrorIsr(t_Handle h_FmMacsec)
90
{
91
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
92
uint32_t errors,error,i;
93
94
SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);
95
96
errors = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->err);
97
errors |= GET_UINT32(p_FmMacsec->p_FmMacsecRegs->erer);
98
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->err,errors);
99
100
for (i=0; i<NUM_OF_TX_SC; i++)
101
if (errors & FM_MACSEC_EX_TX_SC(i))
102
{
103
GET_MACSEC_MODULE_EVENT(e_FM_MACSEC_MOD_SC_TX, i, e_FM_INTR_TYPE_ERR, error);
104
p_FmMacsec->intrMng[error].f_Isr(p_FmMacsec->intrMng[error].h_SrcHandle, i);
105
}
106
107
if (errors & FM_MACSEC_EX_ECC)
108
{
109
uint8_t eccType;
110
uint32_t tmpReg;
111
112
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->meec);
113
ASSERT_COND(tmpReg & MECC_CAP);
114
eccType = (uint8_t)((tmpReg & MECC_CET) >> MECC_CET_SHIFT);
115
116
if (!eccType && (p_FmMacsec->userExceptions & FM_MACSEC_USER_EX_SINGLE_BIT_ECC))
117
p_FmMacsec->f_Exception(p_FmMacsec->h_App,e_FM_MACSEC_EX_SINGLE_BIT_ECC);
118
else if (eccType && (p_FmMacsec->userExceptions & FM_MACSEC_USER_EX_MULTI_BIT_ECC))
119
p_FmMacsec->f_Exception(p_FmMacsec->h_App,e_FM_MACSEC_EX_MULTI_BIT_ECC);
120
else
121
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->meec,tmpReg);
122
}
123
}
124
125
static t_Error MacsecInit(t_Handle h_FmMacsec)
126
{
127
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
128
t_FmMacsecDriverParam *p_FmMacsecDriverParam = NULL;
129
uint32_t tmpReg,i,macId;
130
131
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
132
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
133
134
CHECK_INIT_PARAMETERS(p_FmMacsec, CheckFmMacsecParameters);
135
136
p_FmMacsecDriverParam = p_FmMacsec->p_FmMacsecDriverParam;
137
138
for (i=0;i<e_FM_MACSEC_EV_DUMMY_LAST;i++)
139
p_FmMacsec->intrMng[i].f_Isr = UnimplementedIsr;
140
141
tmpReg = 0;
142
tmpReg |= (p_FmMacsecDriverParam->changedTextWithNoEncryptDeliverUncontrolled << CFG_UECT_SHIFT)|
143
(p_FmMacsecDriverParam->onlyScbIsSetDeliverUncontrolled << CFG_ESCBT_SHIFT) |
144
(p_FmMacsecDriverParam->unknownSciTreatMode << CFG_USFT_SHIFT) |
145
(p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled << CFG_ITT_SHIFT) |
146
(p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled << CFG_KFT_SHIFT) |
147
(p_FmMacsecDriverParam->untagTreatMode << CFG_UFT_SHIFT) |
148
(p_FmMacsecDriverParam->keysUnreadable << CFG_KSS_SHIFT) |
149
(p_FmMacsecDriverParam->reservedSc0 << CFG_S0I_SHIFT) |
150
(p_FmMacsecDriverParam->byPassMode << CFG_BYPN_SHIFT);
151
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg, tmpReg);
152
153
tmpReg = FM_MAC_GetMaxFrameLength(p_FmMacsec->h_FmMac);
154
/* At least Ethernet FCS (4 bytes) overhead must be subtracted from MFL.
155
* In addition, the SCI (8 bytes) overhead might be subtracted as well. */
156
tmpReg -= p_FmMacsecDriverParam->mflSubtract;
157
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->mfl, tmpReg);
158
159
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->tpnet, p_FmMacsecDriverParam->pnExhThr);
160
161
if (!p_FmMacsec->userExceptions)
162
p_FmMacsec->exceptions &= ~FM_MACSEC_EX_ECC;
163
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);
164
165
p_FmMacsec->numRxScAvailable = NUM_OF_RX_SC;
166
if (p_FmMacsecDriverParam->reservedSc0)
167
p_FmMacsec->numRxScAvailable --;
168
p_FmMacsec->numTxScAvailable = NUM_OF_TX_SC;
169
170
XX_Free(p_FmMacsecDriverParam);
171
p_FmMacsec->p_FmMacsecDriverParam = NULL;
172
173
FM_MAC_GetId(p_FmMacsec->h_FmMac, &macId);
174
FmRegisterIntr(p_FmMacsec->h_Fm,
175
e_FM_MOD_MACSEC,
176
(uint8_t)macId,
177
e_FM_INTR_TYPE_NORMAL,
178
MacsecEventIsr,
179
p_FmMacsec);
180
181
FmRegisterIntr(p_FmMacsec->h_Fm,
182
e_FM_MOD_MACSEC,
183
0,
184
e_FM_INTR_TYPE_ERR,
185
MacsecErrorIsr,
186
p_FmMacsec);
187
188
return E_OK;
189
}
190
191
static t_Error MacsecFree(t_Handle h_FmMacsec)
192
{
193
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
194
uint32_t macId;
195
196
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
197
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
198
199
FM_MAC_GetId(p_FmMacsec->h_FmMac, &macId);
200
FmUnregisterIntr(p_FmMacsec->h_Fm,
201
e_FM_MOD_MACSEC,
202
(uint8_t)macId,
203
e_FM_INTR_TYPE_NORMAL);
204
205
FmUnregisterIntr(p_FmMacsec->h_Fm,
206
e_FM_MOD_MACSEC,
207
0,
208
e_FM_INTR_TYPE_ERR);
209
210
if (p_FmMacsec->rxScSpinLock)
211
XX_FreeSpinlock(p_FmMacsec->rxScSpinLock);
212
if (p_FmMacsec->txScSpinLock)
213
XX_FreeSpinlock(p_FmMacsec->txScSpinLock);
214
215
XX_Free(p_FmMacsec);
216
217
return E_OK;
218
}
219
220
static t_Error MacsecConfigUnknownSciFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUnknownSciFrameTreatment treatMode)
221
{
222
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
223
224
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
225
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
226
227
p_FmMacsec->p_FmMacsecDriverParam->unknownSciTreatMode = treatMode;
228
229
return E_OK;
230
}
231
232
static t_Error MacsecConfigInvalidTagsFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)
233
{
234
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
235
236
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
237
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
238
239
p_FmMacsec->p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled = deliverUncontrolled;
240
241
return E_OK;
242
}
243
244
static t_Error MacsecConfigChangedTextWithNoEncryptFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)
245
{
246
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
247
248
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
249
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
250
251
p_FmMacsec->p_FmMacsecDriverParam->changedTextWithNoEncryptDeliverUncontrolled = deliverUncontrolled;
252
253
return E_OK;
254
}
255
256
static t_Error MacsecConfigOnlyScbIsSetFrameTreatment(t_Handle h_FmMacsec, bool deliverUncontrolled)
257
{
258
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
259
260
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
261
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
262
263
p_FmMacsec->p_FmMacsecDriverParam->onlyScbIsSetDeliverUncontrolled = deliverUncontrolled;
264
265
return E_OK;
266
}
267
268
static t_Error MacsecConfigEncryptWithNoChangedTextFrameTreatment(t_Handle h_FmMacsec, bool discardUncontrolled)
269
{
270
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
271
272
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
273
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
274
275
p_FmMacsec->p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled = discardUncontrolled;
276
277
return E_OK;
278
}
279
280
static t_Error MacsecConfigUntagFrameTreatment(t_Handle h_FmMacsec, e_FmMacsecUntagFrameTreatment treatMode)
281
{
282
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
283
284
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
285
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
286
287
p_FmMacsec->p_FmMacsecDriverParam->untagTreatMode = treatMode;
288
289
return E_OK;
290
}
291
292
static t_Error MacsecConfigPnExhaustionThreshold(t_Handle h_FmMacsec, uint32_t pnExhThr)
293
{
294
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
295
296
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
297
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
298
299
p_FmMacsec->p_FmMacsecDriverParam->pnExhThr = pnExhThr;
300
301
return E_OK;
302
}
303
304
static t_Error MacsecConfigKeysUnreadable(t_Handle h_FmMacsec)
305
{
306
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
307
308
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
309
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
310
311
p_FmMacsec->p_FmMacsecDriverParam->keysUnreadable = TRUE;
312
313
return E_OK;
314
}
315
316
static t_Error MacsecConfigSectagWithoutSCI(t_Handle h_FmMacsec)
317
{
318
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
319
320
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
321
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
322
323
p_FmMacsec->p_FmMacsecDriverParam->sectagOverhead -= MACSEC_SCI_SIZE;
324
p_FmMacsec->p_FmMacsecDriverParam->mflSubtract += MACSEC_SCI_SIZE;
325
326
return E_OK;
327
}
328
329
static t_Error MacsecConfigException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)
330
{
331
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
332
uint32_t bitMask = 0;
333
334
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
335
SANITY_CHECK_RETURN_ERROR(p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
336
337
GET_USER_EXCEPTION_FLAG(bitMask, exception);
338
if (bitMask)
339
{
340
if (enable)
341
p_FmMacsec->userExceptions |= bitMask;
342
else
343
p_FmMacsec->userExceptions &= ~bitMask;
344
}
345
else
346
RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
347
348
return E_OK;
349
}
350
351
static t_Error MacsecGetRevision(t_Handle h_FmMacsec, uint32_t *p_MacsecRevision)
352
{
353
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
354
355
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
356
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
357
358
*p_MacsecRevision = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->ip_rev1);
359
360
return E_OK;
361
}
362
363
static t_Error MacsecEnable(t_Handle h_FmMacsec)
364
{
365
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
366
uint32_t tmpReg;
367
368
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
369
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
370
371
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);
372
tmpReg |= CFG_BYPN;
373
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg,tmpReg);
374
375
return E_OK;
376
}
377
378
static t_Error MacsecDisable(t_Handle h_FmMacsec)
379
{
380
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
381
uint32_t tmpReg;
382
383
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
384
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
385
386
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);
387
tmpReg &= ~CFG_BYPN;
388
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg,tmpReg);
389
390
return E_OK;
391
}
392
393
static t_Error MacsecSetException(t_Handle h_FmMacsec, e_FmMacsecExceptions exception, bool enable)
394
{
395
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
396
uint32_t bitMask;
397
398
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
399
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
400
401
GET_USER_EXCEPTION_FLAG(bitMask, exception);
402
if (bitMask)
403
{
404
if (enable)
405
p_FmMacsec->userExceptions |= bitMask;
406
else
407
p_FmMacsec->userExceptions &= ~bitMask;
408
}
409
else
410
RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
411
412
if (!p_FmMacsec->userExceptions)
413
p_FmMacsec->exceptions &= ~FM_MACSEC_EX_ECC;
414
else
415
p_FmMacsec->exceptions |= FM_MACSEC_EX_ECC;
416
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);
417
418
return E_OK;
419
}
420
421
static void InitFmMacsecControllerDriver(t_FmMacsecControllerDriver *p_FmMacsecControllerDriver)
422
{
423
p_FmMacsecControllerDriver->f_FM_MACSEC_Init = MacsecInit;
424
p_FmMacsecControllerDriver->f_FM_MACSEC_Free = MacsecFree;
425
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUnknownSciFrameTreatment = MacsecConfigUnknownSciFrameTreatment;
426
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigInvalidTagsFrameTreatment = MacsecConfigInvalidTagsFrameTreatment;
427
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigEncryptWithNoChangedTextFrameTreatment = MacsecConfigEncryptWithNoChangedTextFrameTreatment;
428
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigUntagFrameTreatment = MacsecConfigUntagFrameTreatment;
429
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigChangedTextWithNoEncryptFrameTreatment = MacsecConfigChangedTextWithNoEncryptFrameTreatment;
430
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigOnlyScbIsSetFrameTreatment = MacsecConfigOnlyScbIsSetFrameTreatment;
431
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigPnExhaustionThreshold = MacsecConfigPnExhaustionThreshold;
432
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigKeysUnreadable = MacsecConfigKeysUnreadable;
433
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigSectagWithoutSCI = MacsecConfigSectagWithoutSCI;
434
p_FmMacsecControllerDriver->f_FM_MACSEC_ConfigException = MacsecConfigException;
435
p_FmMacsecControllerDriver->f_FM_MACSEC_GetRevision = MacsecGetRevision;
436
p_FmMacsecControllerDriver->f_FM_MACSEC_Enable = MacsecEnable;
437
p_FmMacsecControllerDriver->f_FM_MACSEC_Disable = MacsecDisable;
438
p_FmMacsecControllerDriver->f_FM_MACSEC_SetException = MacsecSetException;
439
}
440
441
/****************************************/
442
/* Inter-Module functions */
443
/****************************************/
444
445
void FmMacsecRegisterIntr(t_Handle h_FmMacsec,
446
e_FmMacsecEventModules module,
447
uint8_t modId,
448
e_FmIntrType intrType,
449
void (*f_Isr) (t_Handle h_Arg, uint32_t id),
450
t_Handle h_Arg)
451
{
452
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
453
uint8_t event= 0;
454
455
SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);
456
457
GET_MACSEC_MODULE_EVENT(module, modId, intrType, event);
458
459
ASSERT_COND(event != e_FM_MACSEC_EV_DUMMY_LAST);
460
p_FmMacsec->intrMng[event].f_Isr = f_Isr;
461
p_FmMacsec->intrMng[event].h_SrcHandle = h_Arg;
462
}
463
464
void FmMacsecUnregisterIntr(t_Handle h_FmMacsec,
465
e_FmMacsecEventModules module,
466
uint8_t modId,
467
e_FmIntrType intrType)
468
{
469
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
470
uint8_t event= 0;
471
472
SANITY_CHECK_RETURN(p_FmMacsec, E_INVALID_HANDLE);
473
474
GET_MACSEC_MODULE_EVENT(module, modId,intrType, event);
475
476
ASSERT_COND(event != e_FM_MACSEC_EV_DUMMY_LAST);
477
p_FmMacsec->intrMng[event].f_Isr = NULL;
478
p_FmMacsec->intrMng[event].h_SrcHandle = NULL;
479
}
480
481
t_Error FmMacsecAllocScs(t_Handle h_FmMacsec, e_ScType type, bool isPtp, uint32_t numOfScs, uint32_t *p_ScIds)
482
{
483
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
484
t_Error err = E_OK;
485
bool *p_ScTable;
486
uint32_t *p_ScAvailable,i;
487
488
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
489
SANITY_CHECK_RETURN_ERROR(p_ScIds, E_INVALID_HANDLE);
490
SANITY_CHECK_RETURN_ERROR(numOfScs, E_INVALID_HANDLE);
491
492
if (type == e_SC_RX)
493
{
494
p_ScTable = (bool *)p_FmMacsec->rxScTable;
495
p_ScAvailable = &p_FmMacsec->numRxScAvailable;
496
i = (NUM_OF_RX_SC - 1);
497
}
498
else
499
{
500
p_ScTable = (bool *)p_FmMacsec->txScTable;
501
p_ScAvailable = &p_FmMacsec->numTxScAvailable;
502
i = (NUM_OF_TX_SC - 1);
503
504
}
505
if (*p_ScAvailable < numOfScs)
506
RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Not enough SCs available"));
507
508
if (isPtp)
509
{
510
i = 0;
511
if (p_ScTable[i])
512
RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Sc 0 Not available"));
513
}
514
515
for (;numOfScs;i--)
516
{
517
if (p_ScTable[i])
518
continue;
519
numOfScs --;
520
(*p_ScAvailable)--;
521
p_ScIds[numOfScs] = i;
522
p_ScTable[i] = TRUE;
523
}
524
525
return err;
526
}
527
528
t_Error FmMacsecFreeScs(t_Handle h_FmMacsec, e_ScType type, uint32_t numOfScs, uint32_t *p_ScIds)
529
{
530
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
531
t_Error err = E_OK;
532
bool *p_ScTable;
533
uint32_t *p_ScAvailable,maxNumOfSc,i;
534
535
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
536
SANITY_CHECK_RETURN_ERROR(p_ScIds, E_INVALID_HANDLE);
537
SANITY_CHECK_RETURN_ERROR(numOfScs, E_INVALID_HANDLE);
538
539
if (type == e_SC_RX)
540
{
541
p_ScTable = (bool *)p_FmMacsec->rxScTable;
542
p_ScAvailable = &p_FmMacsec->numRxScAvailable;
543
maxNumOfSc = NUM_OF_RX_SC;
544
}
545
else
546
{
547
p_ScTable = (bool *)p_FmMacsec->txScTable;
548
p_ScAvailable = &p_FmMacsec->numTxScAvailable;
549
maxNumOfSc = NUM_OF_TX_SC;
550
}
551
552
if ((*p_ScAvailable + numOfScs) > maxNumOfSc)
553
RETURN_ERROR(MINOR, E_FULL, ("Too much SCs"));
554
555
for (i=0;i<numOfScs;i++)
556
{
557
p_ScTable[p_ScIds[i]] = FALSE;
558
(*p_ScAvailable)++;
559
}
560
561
return err;
562
563
}
564
565
t_Error FmMacsecSetPTP(t_Handle h_FmMacsec, bool enable)
566
{
567
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
568
uint32_t tmpReg = 0;
569
570
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
571
572
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg);
573
if (enable && (tmpReg & CFG_S0I))
574
RETURN_ERROR(MINOR, E_INVALID_STATE, ("MACSEC already in point-to-point mode"));
575
576
if (enable)
577
tmpReg |= CFG_S0I;
578
else
579
tmpReg &= ~CFG_S0I;
580
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->cfg, tmpReg);
581
582
return E_OK;
583
}
584
585
t_Error FmMacsecCreateRxSc(t_Handle h_FmMacsec, t_RxScParams *p_RxScParams)
586
{
587
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
588
t_Error err = E_OK;
589
uint32_t tmpReg = 0, intFlags;
590
591
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
592
SANITY_CHECK_RETURN_ERROR(p_RxScParams, E_INVALID_HANDLE);
593
SANITY_CHECK_RETURN_ERROR(p_RxScParams->scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
594
595
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
596
597
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, p_RxScParams->scId);
598
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg);
599
if (tmpReg & RX_SCCFG_SCI_EN_MASK)
600
{
601
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
602
RETURN_ERROR(MINOR, E_INVALID_STATE, ("Rx Sc %d must be disable",p_RxScParams->scId));
603
}
604
605
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsci1h, GET_SCI_FIRST_HALF(p_RxScParams->sci));
606
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsci2h, GET_SCI_SECOND_HALF(p_RxScParams->sci));
607
tmpReg |= ((p_RxScParams->replayProtect << RX_SCCFG_RP_SHIFT) & RX_SCCFG_RP_MASK);
608
tmpReg |= ((p_RxScParams->validateFrames << RX_SCCFG_VF_SHIFT) & RX_SCCFG_VF_MASK);
609
tmpReg |= ((p_RxScParams->confidentialityOffset << RX_SCCFG_CO_SHIFT) & RX_SCCFG_CO_MASK);
610
tmpReg |= RX_SCCFG_SCI_EN_MASK;
611
tmpReg |= (p_RxScParams->cipherSuite << RX_SCCFG_CS_SHIFT);
612
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg, tmpReg);
613
614
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rpw, p_RxScParams->replayWindow);
615
616
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
617
618
return err;
619
}
620
621
t_Error FmMacsecDeleteRxSc(t_Handle h_FmMacsec, uint32_t scId)
622
{
623
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
624
t_Error err = E_OK;
625
uint32_t tmpReg = 0, intFlags;
626
627
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
628
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
629
630
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
631
632
tmpReg &= ~RX_SCCFG_SCI_EN_MASK;
633
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
634
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsccfg, tmpReg);
635
636
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
637
638
return err;
639
}
640
641
t_Error FmMacsecCreateTxSc(t_Handle h_FmMacsec, t_TxScParams *p_TxScParams)
642
{
643
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
644
t_Error err = E_OK;
645
uint32_t tmpReg = 0, intFlags;
646
bool alwaysIncludeSCI = FALSE, useES = FALSE, useSCB = FALSE;
647
648
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
649
SANITY_CHECK_RETURN_ERROR(p_TxScParams, E_INVALID_HANDLE);
650
SANITY_CHECK_RETURN_ERROR(p_TxScParams->scId < NUM_OF_TX_SC, E_INVALID_HANDLE);
651
652
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
653
654
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, p_TxScParams->scId);
655
656
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);
657
if (tmpReg & TX_SCCFG_SCE_MASK)
658
{
659
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
660
RETURN_ERROR(MINOR, E_INVALID_STATE, ("Tx Sc %d must be disable",p_TxScParams->scId));
661
}
662
663
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsci1h, GET_SCI_FIRST_HALF(p_TxScParams->sci));
664
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsci2h, GET_SCI_SECOND_HALF(p_TxScParams->sci));
665
alwaysIncludeSCI = (p_TxScParams->sciInsertionMode == e_FM_MACSEC_SCI_INSERTION_MODE_EXPLICIT_SECTAG);
666
useES = (p_TxScParams->sciInsertionMode == e_FM_MACSEC_SCI_INSERTION_MODE_EXPLICIT_MAC_SA);
667
668
tmpReg |= ((p_TxScParams->protectFrames << TX_SCCFG_PF_SHIFT) & TX_SCCFG_PF_MASK);
669
tmpReg |= ((alwaysIncludeSCI << TX_SCCFG_AIS_SHIFT) & TX_SCCFG_AIS_MASK);
670
tmpReg |= ((useES << TX_SCCFG_UES_SHIFT) & TX_SCCFG_UES_MASK);
671
tmpReg |= ((useSCB << TX_SCCFG_USCB_SHIFT) & TX_SCCFG_USCB_MASK);
672
tmpReg |= ((p_TxScParams->confidentialityEnable << TX_SCCFG_CE_SHIFT) & TX_SCCFG_CE_MASK);
673
tmpReg |= ((p_TxScParams->confidentialityOffset << TX_SCCFG_CO_SHIFT) & TX_SCCFG_CO_MASK);
674
tmpReg |= TX_SCCFG_SCE_MASK;
675
tmpReg |= (p_TxScParams->cipherSuite << TX_SCCFG_CS_SHIFT);
676
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);
677
678
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
679
680
return err;
681
}
682
683
t_Error FmMacsecDeleteTxSc(t_Handle h_FmMacsec, uint32_t scId)
684
{
685
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
686
t_Error err = E_OK;
687
uint32_t tmpReg = 0, intFlags;
688
689
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
690
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_TX_SC, E_INVALID_HANDLE);
691
692
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
693
694
tmpReg &= ~TX_SCCFG_SCE_MASK;
695
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);
696
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);
697
698
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
699
700
return err;
701
}
702
703
t_Error FmMacsecCreateRxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecAN_t an, uint32_t lowestPn, macsecSAKey_t key)
704
{
705
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
706
t_Error err = E_OK;
707
uint32_t tmpReg = 0, intFlags;
708
709
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
710
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
711
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);
712
713
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
714
715
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
716
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, DEFAULT_initNextPn);
717
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, lowestPn);
718
MemCpy8((void*)p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsak, key, sizeof(macsecSAKey_t));
719
720
tmpReg |= RX_SACFG_ACTIVE;
721
tmpReg |= ((an << RX_SACFG_AN_SHIFT) & RX_SACFG_AN_MASK);
722
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);
723
724
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
725
726
return err;
727
}
728
729
t_Error FmMacsecCreateTxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecSAKey_t key)
730
{
731
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
732
t_Error err = E_OK;
733
uint32_t tmpReg = 0, intFlags;
734
735
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
736
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
737
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);
738
739
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
740
741
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);
742
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsanpn, DEFAULT_initNextPn);
743
MemCpy8((void*)p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsak, key, sizeof(macsecSAKey_t));
744
745
tmpReg |= TX_SACFG_ACTIVE;
746
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsacs, tmpReg);
747
748
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
749
750
return err;
751
}
752
753
t_Error FmMacsecDeleteRxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId)
754
{
755
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
756
t_Error err = E_OK;
757
uint32_t tmpReg = 0, i, intFlags;
758
759
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
760
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
761
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);
762
763
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
764
765
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
766
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, 0x0);
767
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, 0x0);
768
for (i=0; i<4; i++)
769
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsak[i], 0x0);
770
771
tmpReg |= RX_SACFG_ACTIVE;
772
tmpReg &= ~RX_SACFG_EN_MASK;
773
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);
774
775
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
776
777
return err;
778
}
779
780
t_Error FmMacsecDeleteTxSa(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId)
781
{
782
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
783
t_Error err = E_OK;
784
uint32_t tmpReg = 0, i, intFlags;
785
786
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
787
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
788
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);
789
790
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
791
792
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);
793
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsanpn, 0x0);
794
for (i=0; i<4; i++)
795
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsak[i], 0x0);
796
797
tmpReg |= TX_SACFG_ACTIVE;
798
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecTxScSa[saId].txsacs, tmpReg);
799
800
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
801
802
return err;
803
}
804
805
t_Error FmMacsecRxSaSetReceive(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, bool enableReceive)
806
{
807
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
808
t_Error err = E_OK;
809
uint32_t tmpReg = 0, intFlags;
810
811
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
812
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
813
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);
814
815
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
816
817
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
818
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs);
819
if (enableReceive)
820
tmpReg |= RX_SACFG_EN_MASK;
821
else
822
tmpReg &= ~RX_SACFG_EN_MASK;
823
824
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsacs, tmpReg);
825
826
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
827
828
return err;
829
}
830
831
t_Error FmMacsecRxSaUpdateNextPn(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, uint32_t updtNextPN)
832
{
833
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
834
t_Error err = E_OK;
835
uint32_t intFlags;
836
837
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
838
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
839
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);
840
841
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
842
843
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
844
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsanpn, updtNextPN);
845
846
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
847
848
return err;
849
}
850
851
t_Error FmMacsecRxSaUpdateLowestPn(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, uint32_t updtLowestPN)
852
{
853
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
854
t_Error err = E_OK;
855
uint32_t intFlags;
856
857
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
858
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
859
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_RX_SC, E_INVALID_HANDLE);
860
861
intFlags = XX_LockIntrSpinlock(p_FmMacsec->rxScSpinLock);
862
863
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->rxsca, scId);
864
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->fmMacsecRxScSa[saId].rxsalpn, updtLowestPN);
865
866
XX_UnlockIntrSpinlock(p_FmMacsec->rxScSpinLock, intFlags);
867
868
return err;
869
}
870
871
t_Error FmMacsecTxSaSetActive(t_Handle h_FmMacsec, uint32_t scId, e_ScSaId saId, macsecAN_t an)
872
{
873
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
874
t_Error err = E_OK;
875
uint32_t tmpReg = 0, intFlags;
876
877
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
878
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
879
SANITY_CHECK_RETURN_ERROR(saId < NUM_OF_SA_PER_TX_SC, E_INVALID_HANDLE);
880
881
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
882
883
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);
884
885
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);
886
887
tmpReg |= ((an << TX_SCCFG_AN_SHIFT) & TX_SCCFG_AN_MASK);
888
tmpReg |= ((saId << TX_SCCFG_ASA_SHIFT) & TX_SCCFG_ASA_MASK);
889
890
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg, tmpReg);
891
892
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
893
894
return err;
895
}
896
897
t_Error FmMacsecTxSaGetActive(t_Handle h_FmMacsec, uint32_t scId, macsecAN_t *p_An)
898
{
899
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
900
t_Error err = E_OK;
901
uint32_t tmpReg = 0, intFlags;
902
903
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
904
SANITY_CHECK_RETURN_ERROR(scId < NUM_OF_RX_SC, E_INVALID_HANDLE);
905
SANITY_CHECK_RETURN_ERROR(p_An, E_INVALID_HANDLE);
906
907
intFlags = XX_LockIntrSpinlock(p_FmMacsec->txScSpinLock);
908
909
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->txsca, scId);
910
911
tmpReg = GET_UINT32(p_FmMacsec->p_FmMacsecRegs->txsccfg);
912
913
XX_UnlockIntrSpinlock(p_FmMacsec->txScSpinLock, intFlags);
914
915
*p_An = (macsecAN_t)((tmpReg & TX_SCCFG_AN_MASK) >> TX_SCCFG_AN_SHIFT);
916
917
return err;
918
}
919
920
t_Error FmMacsecSetException(t_Handle h_FmMacsec, e_FmMacsecGlobalExceptions exception, uint32_t scId, bool enable)
921
{
922
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
923
uint32_t bitMask;
924
925
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
926
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
927
928
GET_EXCEPTION_FLAG(bitMask, exception, scId);
929
if (bitMask)
930
{
931
if (enable)
932
p_FmMacsec->exceptions |= bitMask;
933
else
934
p_FmMacsec->exceptions &= ~bitMask;
935
}
936
else
937
RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
938
939
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->erer, p_FmMacsec->exceptions);
940
941
return E_OK;
942
}
943
944
t_Error FmMacsecSetEvent(t_Handle h_FmMacsec, e_FmMacsecGlobalEvents event, uint32_t scId, bool enable)
945
{
946
t_FmMacsec *p_FmMacsec = (t_FmMacsec*)h_FmMacsec;
947
uint32_t bitMask;
948
949
SANITY_CHECK_RETURN_ERROR(p_FmMacsec, E_INVALID_HANDLE);
950
SANITY_CHECK_RETURN_ERROR(!p_FmMacsec->p_FmMacsecDriverParam, E_INVALID_HANDLE);
951
952
GET_EVENT_FLAG(bitMask, event, scId);
953
if (bitMask)
954
{
955
if (enable)
956
p_FmMacsec->events |= bitMask;
957
else
958
p_FmMacsec->events &= ~bitMask;
959
}
960
else
961
RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined event"));
962
963
WRITE_UINT32(p_FmMacsec->p_FmMacsecRegs->ever, p_FmMacsec->events);
964
965
return E_OK;
966
}
967
968
/****************************************/
969
/* API Init unit functions */
970
/****************************************/
971
t_Handle FM_MACSEC_MASTER_Config(t_FmMacsecParams *p_FmMacsecParam)
972
{
973
t_FmMacsec *p_FmMacsec;
974
uint32_t macId;
975
976
/* Allocate FM MACSEC structure */
977
p_FmMacsec = (t_FmMacsec *) XX_Malloc(sizeof(t_FmMacsec));
978
if (!p_FmMacsec)
979
{
980
REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM MACSEC driver structure"));
981
return NULL;
982
}
983
memset(p_FmMacsec, 0, sizeof(t_FmMacsec));
984
InitFmMacsecControllerDriver(&p_FmMacsec->fmMacsecControllerDriver);
985
986
/* Allocate the FM MACSEC driver's parameters structure */
987
p_FmMacsec->p_FmMacsecDriverParam = (t_FmMacsecDriverParam *)XX_Malloc(sizeof(t_FmMacsecDriverParam));
988
if (!p_FmMacsec->p_FmMacsecDriverParam)
989
{
990
XX_Free(p_FmMacsec);
991
REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM MACSEC driver parameters"));
992
return NULL;
993
}
994
memset(p_FmMacsec->p_FmMacsecDriverParam, 0, sizeof(t_FmMacsecDriverParam));
995
996
/* Initialize FM MACSEC parameters which will be kept by the driver */
997
p_FmMacsec->h_Fm = p_FmMacsecParam->h_Fm;
998
p_FmMacsec->h_FmMac = p_FmMacsecParam->nonGuestParams.h_FmMac;
999
p_FmMacsec->p_FmMacsecRegs = (t_FmMacsecRegs *)UINT_TO_PTR(p_FmMacsecParam->nonGuestParams.baseAddr);
1000
p_FmMacsec->f_Exception = p_FmMacsecParam->nonGuestParams.f_Exception;
1001
p_FmMacsec->h_App = p_FmMacsecParam->nonGuestParams.h_App;
1002
p_FmMacsec->userExceptions = DEFAULT_userExceptions;
1003
p_FmMacsec->exceptions = DEFAULT_exceptions;
1004
p_FmMacsec->events = DEFAULT_events;
1005
p_FmMacsec->rxScSpinLock = XX_InitSpinlock();
1006
p_FmMacsec->txScSpinLock = XX_InitSpinlock();
1007
1008
/* Initialize FM MACSEC driver parameters parameters (for initialization phase only) */
1009
p_FmMacsec->p_FmMacsecDriverParam->unknownSciTreatMode = DEFAULT_unknownSciFrameTreatment;
1010
p_FmMacsec->p_FmMacsecDriverParam->invalidTagsDeliverUncontrolled = DEFAULT_invalidTagsFrameTreatment;
1011
p_FmMacsec->p_FmMacsecDriverParam->encryptWithNoChangedTextDiscardUncontrolled = DEFAULT_encryptWithNoChangedTextFrameTreatment;
1012
p_FmMacsec->p_FmMacsecDriverParam->untagTreatMode = DEFAULT_untagFrameTreatment;
1013
p_FmMacsec->p_FmMacsecDriverParam->keysUnreadable = DEFAULT_keysUnreadable;
1014
p_FmMacsec->p_FmMacsecDriverParam->reservedSc0 = DEFAULT_sc0ReservedForPTP;
1015
p_FmMacsec->p_FmMacsecDriverParam->byPassMode = !DEFAULT_normalMode;
1016
p_FmMacsec->p_FmMacsecDriverParam->pnExhThr = DEFAULT_pnExhThr;
1017
p_FmMacsec->p_FmMacsecDriverParam->sectagOverhead = DEFAULT_sectagOverhead;
1018
p_FmMacsec->p_FmMacsecDriverParam->mflSubtract = DEFAULT_mflSubtract;
1019
/* build the FM MACSEC master IPC address */
1020
memset(p_FmMacsec->fmMacsecModuleName, 0, (sizeof(char))*MODULE_NAME_SIZE);
1021
FM_MAC_GetId(p_FmMacsec->h_FmMac,&macId);
1022
if (Sprint (p_FmMacsec->fmMacsecModuleName, "FM-%d-MAC-%d-MACSEC-Master",
1023
FmGetId(p_FmMacsec->h_Fm),macId) != 24)
1024
{
1025
XX_Free(p_FmMacsec->p_FmMacsecDriverParam);
1026
XX_Free(p_FmMacsec);
1027
REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
1028
return NULL;
1029
}
1030
return p_FmMacsec;
1031
}
1032
1033