1 /*
2  * Copyright 2008-2012 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 /******************************************************************************
35  @File          fm_mac.c
36 
37  @Description   FM MAC ...
38 *//***************************************************************************/
39 #include "std_ext.h"
40 #include "string_ext.h"
41 #include "sprint_ext.h"
42 #include "error_ext.h"
43 #include "fm_ext.h"
44 
45 #include "fm_common.h"
46 #include "fm_mac.h"
47 
48 
49 /* ......................................................................... */
50 
51 t_Handle FM_MAC_Config (t_FmMacParams *p_FmMacParam)
52 {
53     t_FmMacControllerDriver *p_FmMacControllerDriver;
54     uint16_t                fmClkFreq;
55 
56     SANITY_CHECK_RETURN_VALUE(p_FmMacParam, E_INVALID_HANDLE, NULL);
57 
58     fmClkFreq = FmGetClockFreq(p_FmMacParam->h_Fm);
59     if (fmClkFreq == 0)
60     {
61         REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Can't get clock for MAC!"));
62         return NULL;
63     }
64 
65 #if (DPAA_VERSION == 10)
66     if (ENET_SPEED_FROM_MODE(p_FmMacParam->enetMode) < e_ENET_SPEED_10000)
67         p_FmMacControllerDriver = (t_FmMacControllerDriver *)DTSEC_Config(p_FmMacParam);
68     else
69 #if FM_MAX_NUM_OF_10G_MACS > 0
70         p_FmMacControllerDriver = (t_FmMacControllerDriver *)TGEC_Config(p_FmMacParam);
71 #else
72         p_FmMacControllerDriver = NULL;
73 #endif /* FM_MAX_NUM_OF_10G_MACS > 0 */
74 #else
75     p_FmMacControllerDriver = (t_FmMacControllerDriver *)MEMAC_Config(p_FmMacParam);
76 #endif /* (DPAA_VERSION == 10) */
77 
78     if (!p_FmMacControllerDriver)
79         return NULL;
80 
81     p_FmMacControllerDriver->h_Fm           = p_FmMacParam->h_Fm;
82     p_FmMacControllerDriver->enetMode       = p_FmMacParam->enetMode;
83     p_FmMacControllerDriver->macId          = p_FmMacParam->macId;
84     p_FmMacControllerDriver->resetOnInit    = DEFAULT_resetOnInit;
85 
86     p_FmMacControllerDriver->clkFreq        = fmClkFreq;
87 
88     return (t_Handle)p_FmMacControllerDriver;
89 }
90 
91 /* ......................................................................... */
92 
93 t_Error FM_MAC_Init (t_Handle h_FmMac)
94 {
95     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
96 
97     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
98 
99     if (p_FmMacControllerDriver->resetOnInit &&
100         !p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit &&
101         (FmResetMac(p_FmMacControllerDriver->h_Fm,
102                     ((ENET_INTERFACE_FROM_MODE(p_FmMacControllerDriver->enetMode) == e_ENET_IF_XGMII) ?
103                         e_FM_MAC_10G : e_FM_MAC_1G),
104                     p_FmMacControllerDriver->macId) != E_OK))
105         RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Can't reset MAC!"));
106 
107     if (p_FmMacControllerDriver->f_FM_MAC_Init)
108         return p_FmMacControllerDriver->f_FM_MAC_Init(h_FmMac);
109     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
110 }
111 
112 /* ......................................................................... */
113 
114 t_Error FM_MAC_Free (t_Handle h_FmMac)
115 {
116     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
117 
118     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
119 
120     if (p_FmMacControllerDriver->f_FM_MAC_Free)
121         return p_FmMacControllerDriver->f_FM_MAC_Free(h_FmMac);
122 
123     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
124 }
125 
126 /* ......................................................................... */
127 
128 t_Error FM_MAC_ConfigResetOnInit (t_Handle h_FmMac, bool enable)
129 {
130     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
131 
132     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
133 
134     if (p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit)
135         return p_FmMacControllerDriver->f_FM_MAC_ConfigResetOnInit(h_FmMac, enable);
136 
137     p_FmMacControllerDriver->resetOnInit = enable;
138 
139     return E_OK;
140 }
141 
142 /* ......................................................................... */
143 
144 t_Error FM_MAC_ConfigLoopback (t_Handle h_FmMac, bool newVal)
145 {
146     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
147 
148     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
149 
150     if (p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback)
151         return p_FmMacControllerDriver->f_FM_MAC_ConfigLoopback(h_FmMac, newVal);
152 
153     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
154 }
155 
156 /* ......................................................................... */
157 
158 t_Error FM_MAC_ConfigMaxFrameLength (t_Handle h_FmMac, uint16_t newVal)
159 {
160     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
161 
162     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
163 
164     if (p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength)
165         return p_FmMacControllerDriver->f_FM_MAC_ConfigMaxFrameLength(h_FmMac, newVal);
166     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
167 }
168 
169 /* ......................................................................... */
170 
171 t_Error FM_MAC_ConfigWan (t_Handle h_FmMac, bool flag)
172 {
173    t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
174 
175     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
176 
177     if (p_FmMacControllerDriver->f_FM_MAC_ConfigWan)
178         return p_FmMacControllerDriver->f_FM_MAC_ConfigWan(h_FmMac, flag);
179 
180     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
181 }
182 
183 /* ......................................................................... */
184 
185 t_Error FM_MAC_ConfigPadAndCrc (t_Handle h_FmMac, bool newVal)
186 {
187     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
188 
189     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
190 
191     if (p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc)
192         return p_FmMacControllerDriver->f_FM_MAC_ConfigPadAndCrc(h_FmMac, newVal);
193 
194     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
195 }
196 
197 /* ......................................................................... */
198 
199 t_Error FM_MAC_ConfigHalfDuplex (t_Handle h_FmMac, bool newVal)
200 {
201     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
202 
203     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
204 
205     if (p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex)
206         return p_FmMacControllerDriver->f_FM_MAC_ConfigHalfDuplex(h_FmMac,newVal);
207 
208     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
209 }
210 
211 /* ......................................................................... */
212 
213 t_Error FM_MAC_ConfigTbiPhyAddr (t_Handle h_FmMac, uint8_t newVal)
214 {
215     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
216 
217     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
218 
219     if (p_FmMacControllerDriver->f_FM_MAC_ConfigTbiPhyAddr)
220         return p_FmMacControllerDriver->f_FM_MAC_ConfigTbiPhyAddr(h_FmMac,newVal);
221 
222     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
223 }
224 
225 /* ......................................................................... */
226 
227 t_Error FM_MAC_ConfigLengthCheck (t_Handle h_FmMac, bool newVal)
228 {
229     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
230 
231     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
232 
233     if (p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck)
234         return p_FmMacControllerDriver->f_FM_MAC_ConfigLengthCheck(h_FmMac,newVal);
235 
236     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
237 }
238 
239 /* ......................................................................... */
240 
241 t_Error FM_MAC_ConfigException (t_Handle h_FmMac, e_FmMacExceptions ex, bool enable)
242 {
243     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
244 
245     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
246 
247     if (p_FmMacControllerDriver->f_FM_MAC_ConfigException)
248         return p_FmMacControllerDriver->f_FM_MAC_ConfigException(h_FmMac, ex, enable);
249 
250     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
251 }
252 
253 #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004
254 /* ......................................................................... */
255 
256 t_Error FM_MAC_ConfigSkipFman11Workaround (t_Handle h_FmMac)
257 {
258     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
259 
260     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
261 
262     if (p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround)
263         return p_FmMacControllerDriver->f_FM_MAC_ConfigSkipFman11Workaround(h_FmMac);
264 
265     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
266 }
267 #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */
268 
269 
270 /*****************************************************************************/
271 /* Run Time Control                                                          */
272 /*****************************************************************************/
273 
274 /* ......................................................................... */
275 
276 t_Error FM_MAC_Enable  (t_Handle h_FmMac,  e_CommMode mode)
277 {
278     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
279 
280     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
281 
282     if (p_FmMacControllerDriver->f_FM_MAC_Enable)
283         return p_FmMacControllerDriver->f_FM_MAC_Enable(h_FmMac, mode);
284 
285     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
286 }
287 
288 /* ......................................................................... */
289 
290 t_Error FM_MAC_Disable (t_Handle h_FmMac, e_CommMode mode)
291 {
292     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
293 
294     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
295 
296     if (p_FmMacControllerDriver->f_FM_MAC_Disable)
297         return p_FmMacControllerDriver->f_FM_MAC_Disable(h_FmMac, mode);
298 
299     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
300 }
301 
302 t_Error FM_MAC_Resume (t_Handle h_FmMac)
303 {
304     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
305 
306     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
307 
308     if (p_FmMacControllerDriver->f_FM_MAC_Resume)
309         return p_FmMacControllerDriver->f_FM_MAC_Resume(h_FmMac);
310 
311     return E_OK;
312 }
313 
314 /* ......................................................................... */
315 
316 t_Error FM_MAC_Enable1588TimeStamp (t_Handle h_FmMac)
317 {
318     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
319 
320     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
321 
322     if (p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp)
323         return p_FmMacControllerDriver->f_FM_MAC_Enable1588TimeStamp(h_FmMac);
324 
325     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
326 }
327 
328 /* ......................................................................... */
329 
330 t_Error FM_MAC_Disable1588TimeStamp (t_Handle h_FmMac)
331 {
332     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
333 
334     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
335 
336     if (p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp)
337         return p_FmMacControllerDriver->f_FM_MAC_Disable1588TimeStamp(h_FmMac);
338 
339     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
340 }
341 
342 /* ......................................................................... */
343 
344 t_Error FM_MAC_SetTxAutoPauseFrames(t_Handle h_FmMac,
345                                     uint16_t pauseTime)
346 {
347     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
348 
349     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
350 
351     if (p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames)
352         return p_FmMacControllerDriver->f_FM_MAC_SetTxAutoPauseFrames(h_FmMac,
353                                                                       pauseTime);
354 
355     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
356 }
357 
358 /* ......................................................................... */
359 
360 t_Error FM_MAC_SetTxPauseFrames(t_Handle h_FmMac,
361                                 uint8_t  priority,
362                                 uint16_t pauseTime,
363                                 uint16_t threshTime)
364 {
365     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
366 
367     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
368 
369     if (p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames)
370         return p_FmMacControllerDriver->f_FM_MAC_SetTxPauseFrames(h_FmMac,
371                                                                   priority,
372                                                                   pauseTime,
373                                                                   threshTime);
374 
375     RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
376 }
377 
378 /* ......................................................................... */
379 
380 t_Error FM_MAC_SetRxIgnorePauseFrames (t_Handle h_FmMac, bool en)
381 {
382     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
383 
384     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
385 
386     if (p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames)
387         return p_FmMacControllerDriver->f_FM_MAC_SetRxIgnorePauseFrames(h_FmMac, en);
388 
389     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
390 }
391 
392 /* ......................................................................... */
393 
394 t_Error FM_MAC_SetWakeOnLan (t_Handle h_FmMac, bool en)
395 {
396     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
397 
398     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
399 
400     if (p_FmMacControllerDriver->f_FM_MAC_SetWakeOnLan)
401         return p_FmMacControllerDriver->f_FM_MAC_SetWakeOnLan(h_FmMac, en);
402 
403     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
404 }
405 
406 /* ......................................................................... */
407 
408 t_Error FM_MAC_ResetCounters (t_Handle h_FmMac)
409 {
410     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
411 
412     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
413 
414     if (p_FmMacControllerDriver->f_FM_MAC_ResetCounters)
415         return p_FmMacControllerDriver->f_FM_MAC_ResetCounters(h_FmMac);
416 
417     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
418 }
419 
420 /* ......................................................................... */
421 
422 t_Error FM_MAC_SetException(t_Handle h_FmMac, e_FmMacExceptions ex, bool enable)
423 {
424    t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
425 
426     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
427 
428     if (p_FmMacControllerDriver->f_FM_MAC_SetException)
429         return p_FmMacControllerDriver->f_FM_MAC_SetException(h_FmMac, ex, enable);
430 
431     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
432 }
433 
434 /* ......................................................................... */
435 
436 t_Error FM_MAC_SetStatistics (t_Handle h_FmMac, e_FmMacStatisticsLevel statisticsLevel)
437 {
438     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
439 
440     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
441 
442     if (p_FmMacControllerDriver->f_FM_MAC_SetStatistics)
443         return p_FmMacControllerDriver->f_FM_MAC_SetStatistics(h_FmMac, statisticsLevel);
444 
445     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
446 }
447 
448 /* ......................................................................... */
449 
450 t_Error FM_MAC_GetStatistics (t_Handle h_FmMac, t_FmMacStatistics *p_Statistics)
451 {
452     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
453 
454     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
455 
456     if (p_FmMacControllerDriver->f_FM_MAC_GetStatistics)
457         return p_FmMacControllerDriver->f_FM_MAC_GetStatistics(h_FmMac, p_Statistics);
458 
459     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
460 }
461 
462 /* ......................................................................... */
463 
464 t_Error FM_MAC_ModifyMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
465 {
466     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
467 
468     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
469 
470     if (p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr)
471         return p_FmMacControllerDriver->f_FM_MAC_ModifyMacAddr(h_FmMac, p_EnetAddr);
472 
473     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
474 }
475 
476 /* ......................................................................... */
477 
478 t_Error FM_MAC_AddHashMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
479 {
480     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
481 
482     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
483 
484     if (p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr)
485         return p_FmMacControllerDriver->f_FM_MAC_AddHashMacAddr(h_FmMac, p_EnetAddr);
486 
487     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
488 }
489 
490 /* ......................................................................... */
491 
492 t_Error FM_MAC_RemoveHashMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
493 {
494     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
495 
496     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
497 
498     if (p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr)
499         return p_FmMacControllerDriver->f_FM_MAC_RemoveHashMacAddr(h_FmMac, p_EnetAddr);
500 
501     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
502 }
503 
504 /* ......................................................................... */
505 
506 t_Error FM_MAC_AddExactMatchMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
507 {
508     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
509 
510     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
511 
512     if (p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr)
513         return p_FmMacControllerDriver->f_FM_MAC_AddExactMatchMacAddr(h_FmMac, p_EnetAddr);
514 
515     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
516 }
517 
518 /* ......................................................................... */
519 
520 t_Error FM_MAC_RemovelExactMatchMacAddr (t_Handle h_FmMac, t_EnetAddr *p_EnetAddr)
521 {
522     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
523 
524     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
525 
526     if (p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr)
527         return p_FmMacControllerDriver->f_FM_MAC_RemovelExactMatchMacAddr(h_FmMac, p_EnetAddr);
528 
529     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
530 }
531 
532 /* ......................................................................... */
533 
534 t_Error FM_MAC_GetVesrion (t_Handle h_FmMac, uint32_t *macVresion)
535 {
536     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
537 
538     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
539 
540     if (p_FmMacControllerDriver->f_FM_MAC_GetVersion)
541         return p_FmMacControllerDriver->f_FM_MAC_GetVersion(h_FmMac, macVresion);
542 
543     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
544 
545 }
546 
547 /* ......................................................................... */
548 
549 t_Error FM_MAC_GetId (t_Handle h_FmMac, uint32_t *macId)
550 {
551     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
552 
553     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
554 
555     if (p_FmMacControllerDriver->f_FM_MAC_GetId)
556         return p_FmMacControllerDriver->f_FM_MAC_GetId(h_FmMac, macId);
557 
558     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
559 }
560 
561 /* ......................................................................... */
562 
563 t_Error FM_MAC_SetPromiscuous (t_Handle h_FmMac, bool newVal)
564 {
565     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
566 
567     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
568 
569     if (p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous)
570         return p_FmMacControllerDriver->f_FM_MAC_SetPromiscuous(h_FmMac, newVal);
571 
572     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
573 }
574 
575 /* ......................................................................... */
576 
577 t_Error FM_MAC_AdjustLink(t_Handle h_FmMac, e_EnetSpeed speed, bool fullDuplex)
578 {
579     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
580 
581     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
582 
583     if (p_FmMacControllerDriver->f_FM_MAC_AdjustLink)
584         return p_FmMacControllerDriver->f_FM_MAC_AdjustLink(h_FmMac, speed, fullDuplex);
585 
586     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
587 }
588 
589 /* ......................................................................... */
590 
591 t_Error FM_MAC_RestartAutoneg(t_Handle h_FmMac)
592 {
593     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
594 
595     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
596 
597     if (p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg)
598         return p_FmMacControllerDriver->f_FM_MAC_RestartAutoneg(h_FmMac);
599 
600     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
601 }
602 
603 /* ......................................................................... */
604 
605 t_Error FM_MAC_MII_WritePhyReg (t_Handle h_FmMac, uint8_t phyAddr, uint8_t reg, uint16_t data)
606 {
607     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
608 
609     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
610 
611     if (p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg)
612         return p_FmMacControllerDriver->f_FM_MAC_MII_WritePhyReg(h_FmMac, phyAddr, reg, data);
613 
614     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
615 }
616 
617 /* ......................................................................... */
618 
619 t_Error FM_MAC_MII_ReadPhyReg(t_Handle h_FmMac,  uint8_t phyAddr, uint8_t reg, uint16_t *p_Data)
620 {
621     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
622 
623     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
624 
625     if (p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg)
626         return p_FmMacControllerDriver->f_FM_MAC_MII_ReadPhyReg(h_FmMac, phyAddr, reg, p_Data);
627 
628     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
629 }
630 
631 /* ......................................................................... */
632 
633 uint16_t FM_MAC_GetMaxFrameLength(t_Handle h_FmMac)
634 {
635     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
636 
637     SANITY_CHECK_RETURN_VALUE(p_FmMacControllerDriver, E_INVALID_HANDLE, 0);
638 
639     if (p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength)
640         return p_FmMacControllerDriver->f_FM_MAC_GetMaxFrameLength(h_FmMac);
641 
642     REPORT_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
643     return 0;
644 }
645 
646 #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
647 /*****************************************************************************/
648 t_Error FM_MAC_DumpRegs(t_Handle h_FmMac)
649 {
650     t_FmMacControllerDriver *p_FmMacControllerDriver = (t_FmMacControllerDriver *)h_FmMac;
651 
652     SANITY_CHECK_RETURN_ERROR(p_FmMacControllerDriver, E_INVALID_HANDLE);
653 
654     if (p_FmMacControllerDriver->f_FM_MAC_DumpRegs)
655          return p_FmMacControllerDriver->f_FM_MAC_DumpRegs(h_FmMac);
656     RETURN_ERROR(MINOR, E_NOT_SUPPORTED, NO_MSG);
657 }
658 #endif /* (defined(DEBUG_ERRORS) && ... */
659