1 /*
2 * Copyright 2021-2023 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #ifndef FSL_NETC_PORT_H_
8 #define FSL_NETC_PORT_H_
9
10 #include "fsl_netc.h"
11
12 /*******************************************************************************
13 * Definitions
14 ******************************************************************************/
15 #if !(defined(__GNUC__) || defined(__ICCARM__))
16 #pragma region netc_hw_port
17 #endif
18 /*! @addtogroup netc_hw_port
19 * @{
20 */
21
22 /*! @brief The port supported minimum/maximum frame size. */
23 #define NETC_PORT_MIN_FRAME_SIZE (18U)
24 #define NETC_PORT_MAX_FRAME_SIZE (2000U)
25
26 typedef enum _netc_port_intr_flags
27 {
28 kNETC_TxEmptyFlag = NETC_ETH_LINK_PM0_IEVENT_TX_EMPTY_MASK, /*!< Tx FIFO empty flag. */
29 kNETC_RxEmptyFlag = NETC_ETH_LINK_PM0_IEVENT_RX_EMPTY_MASK, /*!< Rx FIFO empty flag. */
30 kNETC_TxOverflowFlag = NETC_ETH_LINK_PM0_IEVENT_TX_OVFL_MASK, /*!< Tx overflow flag. */
31 kNETC_TxUnderflowFlag = NETC_ETH_LINK_PM0_IEVENT_TX_UNFL_MASK, /*!< Tx underflow flag. */
32 kNETC_RxOverflowFlag = NETC_ETH_LINK_PM0_IEVENT_RX_OVFL_MASK, /*!< Rx overflow flag. */
33 kNETC_MagicPacketFlag = NETC_ETH_LINK_PM0_IEVENT_MGI_MASK, /*!< Magic packet detection indication flag. */
34 kNETC_TxClkStopFlag = NETC_ETH_LINK_PM0_IEVENT_TX_CSD_MASK, /*!< Tx clock stop detection flag. */
35 kNETC_RxClkStopFlag = NETC_ETH_LINK_PM0_IEVENT_RX_CSD_MASK, /*!< Rx clock stop detection flag. */
36 kNETC_SpeedDuplexChangeFlag = NETC_ETH_LINK_PM0_IEVENT_SPD_DUP_MASK, /*!< Speed/Duplex Change flag */
37 kNETC_MacMergeSMDErrFlag = NETC_ETH_LINK_PM0_IEVENT_MRG_SERR_MASK, /*!< MAC merge frame SMD error received event flag */
38 kNETC_MacMergeAssemblyErrFlag = NETC_ETH_LINK_PM0_IEVENT_MRG_AERR_MASK, /*!< MAC merge frame assembly error event flag */
39 } netc_port_intr_flags_t;
40
41 /*! @brief Defines the port MAC frame loopback mode. */
42 typedef enum _netc_port_loopback_mode_t
43 {
44 kNETC_PortLpbWithExtTxClk, /*!< Port MAC frame loopback with external Tx clock. */
45 kNETC_PortLpbWithIntTxClk = 2U, /*!< Port MAC frame loopback with internal Tx clock. */
46 } netc_port_loopback_mode_t;
47
48 /*! @} */ // end of netc_hw_port
49 #if !(defined(__GNUC__) || defined(__ICCARM__))
50 #pragma endregion netc_hw_port
51 #endif
52
53 #if !(defined(__GNUC__) || defined(__ICCARM__))
54 #pragma region netc_hw_port_tx
55 #endif
56 /*! @addtogroup netc_hw_port_tx
57 * @{
58 */
59
60 /*! @} */ // end of netc_hw_port_tx
61 #if !(defined(__GNUC__) || defined(__ICCARM__))
62 #pragma endregion netc_hw_port_tx
63 #endif
64
65 #if !(defined(__GNUC__) || defined(__ICCARM__))
66 #pragma region netc_hw_port_rx
67 #endif
68 /*! @addtogroup netc_hw_port_rx
69 * @{
70 */
71
72 /*! @} */ // end of netc_hw_port_rx
73 #if !(defined(__GNUC__) || defined(__ICCARM__))
74 #pragma endregion netc_hw_port_rx
75 #endif
76
77 #if defined(__cplusplus)
78 extern "C" {
79 #endif
80
81 /*******************************************************************************
82 * API
83 ******************************************************************************/
84 #if !(defined(__GNUC__) || defined(__ICCARM__))
85 #pragma region netc_hw_port
86 #endif
87 /*! @addtogroup netc_hw_port
88 * @{
89 */
90 /*!
91 * @brief Configure specified PORT
92 *
93 * @param base NETC port module base address.
94 * @param config Port configuration structure.
95 * @return status_t
96 */
97 status_t NETC_PortConfig(NETC_PORT_Type *base, const netc_port_common_t *config);
98
99 /*!
100 * @brief Set the MAC address.
101 *
102 * @param handle
103 * @param macAddr
104 */
105 void NETC_PortSetMacAddr(NETC_PORT_Type *base, const uint8_t *macAddr);
106
107 /*!
108 * @brief Check whether this port a pseudo MAC port.
109 *
110 * @param base PORT peripheral base address.
111 */
112 bool NETC_PortIsPseudo(NETC_PORT_Type *base);
113
114 /*!
115 * @brief Get specified PORT discard counter
116 *
117 * @param base NETC port module base address.
118 * @param discardType Port discard type.
119 * @param statistic pointer to the statistic data
120 */
121 void NETC_PortGetDiscardStatistic(NETC_PORT_Type *base,
122 netc_port_discard_tpye_t discardType,
123 netc_port_discard_statistic_t *statistic);
124
125 /*!
126 * @brief Clean the Port Rx discard reason. Set the related bits to 1 to clear the specific reasons
127 *
128 * @param base NETC port module base address.
129 * @param discardType Port discard type.
130 * @param reason0
131 * @param reason1
132 */
133 void NETC_PortClearDiscardReason(NETC_PORT_Type *base,
134 netc_port_discard_tpye_t discardType,
135 uint32_t reason0,
136 uint32_t reason1);
137
138 /*!
139 * @brief Get port time gate scheduling gate list status
140 *
141 * @param base NETC port module base address.
142 * @return Port status flags which are ORed by the enumerators in the @ref netc_port_tgsl_status_t
143 */
NETC_PortGetTGSListStatus(NETC_PORT_Type * base)144 static inline uint32_t NETC_PortGetTGSListStatus(NETC_PORT_Type *base)
145 {
146 return base->PTGAGLSR;
147 }
148
149 /*!
150 * @brief Do graceful stop for Port Ethernet MAC receive/transmit
151 *
152 * @param base NETC port module base address.
153 */
154 void NETC_PortEthMacGracefulStop(NETC_PORT_Type *base);
155
156 /*!
157 * @brief Set port speed
158 *
159 * @param base NETC port module base address.
160 * @param pSpeed Transmit Port Speed = 10Mbps * (pSpeed+1), Used by ETS, Qbu and to determine
161 * if cut-through is permissable.
162 */
NETC_PortSetSpeed(NETC_PORT_Type * base,uint16_t pSpeed)163 static inline void NETC_PortSetSpeed(NETC_PORT_Type *base, uint16_t pSpeed)
164 {
165 assert(pSpeed <= 15999U);
166 base->PCR = (base->PCR & ~NETC_PORT_PCR_PSPEED_MASK) | NETC_PORT_PCR_PSPEED(pSpeed);
167 }
168
169 /*! @} */ // end of netc_hw_port
170 #if !(defined(__GNUC__) || defined(__ICCARM__))
171 #pragma endregion netc_hw_port
172 #endif
173
174 #if !(defined(__GNUC__) || defined(__ICCARM__))
175 #pragma region netc_hw_port_tx
176 #endif
177 /*! @addtogroup netc_hw_port_tx
178 * @{
179 */
180
181 /*!
182 * @brief Configure the port time gating Scheduling
183 *
184 * @param base
185 * @param config
186 * @return status_t
187 */
NETC_PortConfigTGS(NETC_PORT_Type * base,const netc_port_tg_config_t * config)188 static inline status_t NETC_PortConfigTGS(NETC_PORT_Type *base, const netc_port_tg_config_t *config)
189 {
190 base->PTGSATOR = NETC_PORT_PTGSATOR_ADV_TIME_OFFSET(config->advOffset);
191 if ((base->PCAPR & NETC_PORT_PCAPR_LINK_TYPE_MASK) == 0U)
192 {
193 base->PTGSHCR = NETC_PORT_PTGSHCR_HOLD_SKEW(config->holdSkew);
194 }
195 return kStatus_Success;
196 }
197
198 /*!
199 * @brief Config the Credit-Based Shaper (CBS) for specified Port Traffic Class
200 *
201 * @param base
202 * @param tcIdx
203 * @param config
204 * @return status_t
205 */
206 status_t NETC_PortConfigTcCBS(NETC_PORT_Type *base, netc_hw_tc_idx_t tcIdx, const netc_port_tc_cbs_config_t *config);
207
208 /*!
209 * @brief Config the max Transmit max SDU for specified Port Traffic Class
210 *
211 * @param base
212 * @param tcIdx
213 * @param config
214 * @return status_t
215 */
NETC_PortConfigTcMaxSDU(NETC_PORT_Type * base,netc_hw_tc_idx_t tcIdx,const netc_port_tc_sdu_config_t * config)216 static inline status_t NETC_PortConfigTcMaxSDU(NETC_PORT_Type *base,
217 netc_hw_tc_idx_t tcIdx,
218 const netc_port_tc_sdu_config_t *config)
219 {
220 status_t result = kStatus_Success;
221
222 if (config->maxSduSized > 0x07D0U)
223 {
224 /* This limit must not exceed 0x07D0 (2000 bytes) */
225 result = kStatus_OutOfRange;
226 }
227 else
228 {
229 base->TCT_NUM[tcIdx].PTCTMSDUR = NETC_PORT_PTCTMSDUR_SF_MAXSDU_DIS(!config->enTxMaxSduCheck) |
230 NETC_PORT_PTCTMSDUR_SDU_TYPE(config->sduType) |
231 NETC_PORT_PTCTMSDUR_MAXSDU(config->maxSduSized);
232 }
233
234 return result;
235 }
236
237 /*!
238 * @brief Read the max Transmit max SDU for specified Port Traffic Class
239 *
240 * @param base
241 * @param tcIdx
242 * @param config
243 * @return status_t
244 */
NETC_PortGetTcMaxSDU(NETC_PORT_Type * base,netc_hw_tc_idx_t tcIdx,netc_port_tc_sdu_config_t * config)245 static inline status_t NETC_PortGetTcMaxSDU(NETC_PORT_Type *base,
246 netc_hw_tc_idx_t tcIdx,
247 netc_port_tc_sdu_config_t *config)
248 {
249 config->maxSduSized = (uint16_t)(base->TCT_NUM[tcIdx].PTCTMSDUR & NETC_PORT_PTCTMSDUR_MAXSDU_MASK) >> NETC_PORT_PTCTMSDUR_MAXSDU_SHIFT;
250 config->enTxMaxSduCheck = (bool)((base->TCT_NUM[tcIdx].PTCTMSDUR & NETC_PORT_PTCTMSDUR_SF_MAXSDU_DIS_MASK) >> NETC_PORT_PTCTMSDUR_SF_MAXSDU_DIS_SHIFT);
251 config->sduType = (netc_tc_sdu_type_t)(uint32_t)((base->TCT_NUM[tcIdx].PTCTMSDUR & NETC_PORT_PTCTMSDUR_SDU_TYPE_MASK) >> NETC_PORT_PTCTMSDUR_SDU_TYPE_SHIFT);
252
253 return kStatus_Success;
254 }
255
256 /*! @} */ // end of netc_hw_port_tx
257 #if !(defined(__GNUC__) || defined(__ICCARM__))
258 #pragma endregion netc_hw_port_tx
259 #endif
260
261 #if !(defined(__GNUC__) || defined(__ICCARM__))
262 #pragma region netc_hw_port_rx
263 #endif
264 /*! @addtogroup netc_hw_port_rx
265 * @{
266 */
267
268 /*!
269 * @brief Set port Parser.
270 *
271 * @param base PORT peripheral base address.
272 * @param config The port Parser configuration.
273 */
NETC_PortSetParser(NETC_PORT_Type * base,const netc_port_parser_config_t * config)274 static inline void NETC_PortSetParser(NETC_PORT_Type *base, const netc_port_parser_config_t *config)
275 {
276 base->PPCR = NETC_PORT_PPCR_L4PFS(config->l4PayloadCount) | NETC_PORT_PPCR_L4HFP(config->enableL4Parser) |
277 NETC_PORT_PPCR_L3PFS(config->l3PayloadCount) | NETC_PORT_PPCR_L3HFP(config->enableL3Parser) |
278 NETC_PORT_PPCR_L2PFS(config->l2PloadCount);
279 }
280
281 /*!
282 * @brief Set port acceptable VLAN.
283 *
284 * @param base PORT peripheral base address.
285 * @param config The port acceptable vlan classification configuration.
286 */
NETC_PortSetVlanClassify(NETC_PORT_Type * base,const netc_port_vlan_classify_config_t * config)287 static inline void NETC_PortSetVlanClassify(NETC_PORT_Type *base, const netc_port_vlan_classify_config_t *config)
288 {
289 base->PTAR = NETC_PORT_PTAR_OVTPIDL(config->outerMask) | NETC_PORT_PTAR_IVTPIDL(config->innerMask);
290 }
291
292 /*!
293 * @brief Set port Qos Classification.
294 *
295 * @param base PORT peripheral base address.
296 * @param config The port QoS classification configuration.
297 * @return status_t
298 */
NETC_PortSetQosClassify(NETC_PORT_Type * base,const netc_port_qos_classify_config_t * config)299 static inline status_t NETC_PortSetQosClassify(NETC_PORT_Type *base, const netc_port_qos_classify_config_t *config)
300 {
301 #if defined(FSL_FEATURE_NETC_HAS_ERRATA_051649) && FSL_FEATURE_NETC_HAS_ERRATA_051649
302 /* ERRATA051649: Only mapping profile instance 0 can be used. Mapping profile instance 1 cannot be used due the decoding of the selected
303 profile is not correct. Therefore, if any switch port is configured to use the second mapping profile (1), all switch ports will not
304 assign the default QoS correctly. */
305 if (config->vlanQosMap != 0U)
306 {
307 return kStatus_InvalidArgument;
308 }
309 #endif
310
311 base->PQOSMR = NETC_PORT_PQOSMR_VQMP(config->vlanQosMap) | NETC_PORT_PQOSMR_DIPV(config->defaultIpv) |
312 NETC_PORT_PQOSMR_DDR(config->defaultDr) | NETC_PORT_PQOSMR_VE(config->enVlanInfo) |
313 NETC_PORT_PQOSMR_VS(config->vlanTagSelect);
314
315 return kStatus_Success;
316 }
317
318 /*!
319 * @brief Set port ingress filter.
320 *
321 * @param base PORT peripheral base address.
322 * @param config The port ingress filter configuration.
323 */
NETC_PortSetIPF(NETC_PORT_Type * base,const netc_port_ipf_config_t * config)324 static inline void NETC_PortSetIPF(NETC_PORT_Type *base, const netc_port_ipf_config_t *config)
325 {
326 base->PCR = NETC_PORT_PCR_L2DOSE(config->enL2Dos);
327 base->PIPFCR = NETC_PORT_PIPFCR_EN(config->enIPFTable);
328 }
329
330 /*!
331 * @brief Set port Ingress stream identification.
332 *
333 * @param base PORT peripheral base address.
334 * @param config The port Ingress stream identification configuration.
335 */
NETC_PortSetISI(NETC_PORT_Type * base,const netc_port_psfp_isi_config * config)336 static inline void NETC_PortSetISI(NETC_PORT_Type *base, const netc_port_psfp_isi_config *config)
337 {
338 /* Configure ingress stream identification */
339 base->PISIDCR = NETC_PORT_PISIDCR_ISEID(config->defaultISEID) | NETC_PORT_PISIDCR_KC1EN(config->enKC1) |
340 NETC_PORT_PISIDCR_KC0EN(config->enKC0) | NETC_PORT_PISIDCR_KCPAIR(config->kcPair);
341 }
342
343 /*! @} */ // end of netc_hw_port_rx
344 #if !(defined(__GNUC__) || defined(__ICCARM__))
345 #pragma endregion netc_hw_port_rx
346 #endif
347
348 #if !(defined(__GNUC__) || defined(__ICCARM__))
349 #pragma region netc_hw_port_mac
350 #endif
351 /*! @addtogroup netc_hw_port_mac
352 * @{
353 */
354
355 /*!
356 * @brief Get port MAC interrupt flags
357 *
358 * @param base NETC ETH link base register.
359 * @param mac MAC type.
360 */
361 uint32_t NETC_GetPortMacInterruptFlags(NETC_ETH_LINK_Type *base, netc_port_phy_mac_type_t macType);
362
363 /*!
364 * @brief Clear port MAC interrupt flags
365 *
366 * @param base NETC ETH link base register.
367 * @param mac MAC type.
368 * @param mask Bit mask of interrupts to enable. See #netc_port_intr_flags_t for the set
369 * of constants that should be OR'd together to form the bit mask.
370 */
371 void NETC_ClearPortMacInterruptFlags(NETC_ETH_LINK_Type *base, netc_port_phy_mac_type_t macType, uint32_t mask);
372
373 /*!
374 * @brief Enable/Disable port MAC interrupts
375 *
376 * @param base NETC ETH link base register.
377 * @param mac MAC type.
378 * @param mask Bit mask of interrupts to enable. See #netc_port_intr_flags_t for the set
379 * of constants that should be OR'd together to form the bit mask.
380 * @param enable Enable/Disable interrupts.
381 */
382 void NETC_EnablePortMacInterrupts(NETC_ETH_LINK_Type *base, netc_port_phy_mac_type_t macType, uint32_t mask, bool enable);
383
384 /*!
385 * @brief Enable/Disable Loopback for specified MAC
386 *
387 * @param base
388 * @param loopMode
389 * @param enable
390 * @return status_t
391 */
392 status_t NETC_PortEnableLoopback(NETC_ETH_LINK_Type *base, netc_port_loopback_mode_t loopMode, bool enable);
393
394 /*!
395 * @brief Get ethernet MAC port MII mode.
396 *
397 * @param base Ethernet MAC port peripheral base address.
398 * @return netc_hw_mii_mode_t
399 */
NETC_PortGetMIIMode(NETC_ETH_LINK_Type * base)400 static inline netc_hw_mii_mode_t NETC_PortGetMIIMode(NETC_ETH_LINK_Type *base)
401 {
402 return (netc_hw_mii_mode_t)(uint32_t)(base->PM0_IF_MODE & NETC_ETH_LINK_PM0_IF_MODE_IFMODE_MASK);
403 }
404
405 /*!
406 * @brief Configure ethernet MAC interface mode, speed and duplex for specified PORT.
407 *
408 * @param base Ethernet MAC port peripheral base address.
409 * @param miiMode The Ethernet MAC MII mode.
410 * @param speed The Ethernet MAC speed.
411 * @param duplex The Ethernet MAC duplex.
412 * @return status_t
413 */
414 status_t NETC_PortSetMII(NETC_ETH_LINK_Type *base,
415 netc_hw_mii_mode_t miiMode,
416 netc_hw_mii_speed_t speed,
417 netc_hw_mii_duplex_t duplex);
418
419 /*!
420 * @brief Set the maximum supported received frame size.
421 *
422 * @param base Ethernet MAC port peripheral base address.
423 * @param size Maximum frame size to set.
424 * @return status_t
425 */
426 status_t NETC_PortSetMaxFrameSize(NETC_ETH_LINK_Type *base, uint16_t size);
427
428 /*!
429 * @brief Configure ethernet MAC for specified PORT.
430 * Set the MII mode, speed/duplex, reverse mode, etc.
431 *
432 * @param base Ethernet MAC port peripheral base address.
433 * @param config The Ethernet MAC configuration.
434 * @return status_t
435 */
436 status_t NETC_PortConfigEthMac(NETC_ETH_LINK_Type *base, const netc_port_ethmac_t *config);
437
438 /*!
439 * @brief Do software reset for Ethernet MAC.
440 *
441 * @note This can reset all statistic counters.
442 *
443 * @param base PORT MAC peripheral base address.
444 */
NETC_PortSoftwareResetEthMac(NETC_ETH_LINK_Type * base)445 static inline void NETC_PortSoftwareResetEthMac(NETC_ETH_LINK_Type *base)
446 {
447 base->PM0_COMMAND_CONFIG |= NETC_ETH_LINK_PM0_COMMAND_CONFIG_SWR_MASK;
448 while ((base->PM0_COMMAND_CONFIG & NETC_ETH_LINK_PM0_COMMAND_CONFIG_SWR_MASK) != 0U)
449 {
450 }
451 base->PM1_COMMAND_CONFIG |= NETC_ETH_LINK_PM0_COMMAND_CONFIG_SWR_MASK;
452 while ((base->PM1_COMMAND_CONFIG & NETC_ETH_LINK_PM1_COMMAND_CONFIG_SWR_MASK) != 0U)
453 {
454 }
455 }
456
457 /*!
458 * @brief Get Ethernet MAC preemption status.
459 *
460 * @param base PORT MAC peripheral base address.
461 * @param status Point to the buffer which store status.
462 */
NETC_PortGetPhyMacPreemptionStatus(NETC_ETH_LINK_Type * base,netc_port_phy_mac_preemption_status_t * status)463 static inline void NETC_PortGetPhyMacPreemptionStatus(NETC_ETH_LINK_Type *base,
464 netc_port_phy_mac_preemption_status_t *status)
465 {
466 status->verifyStatus = (netc_port_preemption_verify_status_t)(uint32_t)(
467 (base->MAC_MERGE_MMCSR & NETC_ETH_LINK_MAC_MERGE_MMCSR_VSTS_MASK) >> NETC_ETH_LINK_MAC_MERGE_MMCSR_VSTS_SHIFT);
468 status->mergeActive = ((base->MAC_MERGE_MMCSR & NETC_ETH_LINK_MAC_MERGE_MMCSR_TXSTS_MASK) != 0U) ? true : false;
469 }
470
471 /*!
472 * @brief Get Ethernet MAC Tx Traffic Statistics .
473 *
474 * @param base PORT MAC peripheral base address.
475 * @param macType Express MAC or Preemptable MAC.
476 * @param status Point to the buffer which store statistics.
477 */
478 void NETC_PortGetPhyMacTxStatistic(NETC_ETH_LINK_Type *base,
479 netc_port_phy_mac_type_t macType,
480 netc_port_phy_mac_traffic_statistic_t *statistic);
481
482 /*!
483 * @brief Get Ethernet MAC Rx Traffic Statistics .
484 *
485 * @param base PORT MAC peripheral base address.
486 * @param macType Express MAC or Preemptable MAC.
487 * @param status Point to the buffer which store statistics.
488 */
489 void NETC_PortGetPhyMacRxStatistic(NETC_ETH_LINK_Type *base,
490 netc_port_phy_mac_type_t macType,
491 netc_port_phy_mac_traffic_statistic_t *statistic);
492
493 /*!
494 * @brief Get Ethernet MAC Rx/Tx Drops/Errors Statistics .
495 *
496 * @param base PORT MAC peripheral base address.
497 * @param macType Express MAC or Preemptable MAC.
498 * @param status Point to the buffer which store statistics.
499 */
500 void NETC_PortGetPhyMacDiscardStatistic(NETC_ETH_LINK_Type *base,
501 netc_port_phy_mac_type_t macType,
502 netc_port_phy_mac_discard_statistic_t *statistic);
503
504 /*!
505 * @brief Get Ethernet Preemptable MAC preemption Statistics .
506 *
507 * @param base PORT MAC peripheral base address.
508 * @param status Point to the buffer which store statistics.
509 */
510 void NETC_PortGetPhyMacPreemptionStatistic(NETC_ETH_LINK_Type *base,
511 netc_port_phy_mac_preemption_statistic_t *statistic);
512
513 #if !(defined(FSL_FEATURE_NETC_HAS_NO_SWITCH) && FSL_FEATURE_NETC_HAS_NO_SWITCH)
514 /*!
515 * @brief Get Pseudo MAC Tx/Rx Traffic Statistics .
516 *
517 * @param base PORT MAC peripheral base address.
518 * @param getTx true is get Tx, false is get Rx.
519 * @param status Point to the buffer which store statistics.
520 */
521 void NETC_PortGetPseudoMacTrafficStatistic(NETC_PSEUDO_LINK_Type *base,
522 bool getTx,
523 netc_port_pseudo_mac_traffic_statistic_t *statistic);
524 #endif
525
526 /*! @} */ // end of netc_hw_port_mac
527 #if !(defined(__GNUC__) || defined(__ICCARM__))
528 #pragma endregion netc_hw_port_mac
529 #endif
530
531 #if defined(__cplusplus)
532 }
533 #endif
534 #endif /* FSL_NETC_PORT_H_ */
535