/* * Copyright 2024 NXP * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ #define ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ #include "fsl_netc_endpoint.h" #include "fsl_msgintr.h" /* Buffer and descriptor alignment */ #define NETC_BD_ALIGN 128 #define NETC_BUFF_ALIGN 64 #define NETC_RX_RING_BUF_SIZE_ALIGN \ SDK_SIZEALIGN(CONFIG_ETH_NXP_IMX_RX_RING_BUF_SIZE, NETC_BUFF_ALIGN) /* MSIX definitions */ #define NETC_TX_MSIX_ENTRY_IDX 0 #define NETC_RX_MSIX_ENTRY_IDX 1 #define NETC_MSIX_ENTRY_NUM 2 #define NETC_MSIX_EVENTS_COUNT NETC_MSIX_ENTRY_NUM #define NETC_TX_INTR_MSG_DATA_START 0 #define NETC_RX_INTR_MSG_DATA_START 16 #define NETC_DRV_MAX_INST_SUPPORT 16 /* MSGINTR */ #define NETC_MSGINTR_CHANNEL 0 #if (CONFIG_ETH_NXP_IMX_MSGINTR == 1) #define NETC_MSGINTR MSGINTR1 #define NETC_MSGINTR_IRQ MSGINTR1_IRQn #elif (CONFIG_ETH_NXP_IMX_MSGINTR == 2) #define NETC_MSGINTR MSGINTR2 #define NETC_MSGINTR_IRQ MSGINTR2_IRQn #else #error "Current CONFIG_ETH_NXP_IMX_MSGINTR not support" #endif /* Timeout for various operations */ #define NETC_TIMEOUT K_MSEC(20) /* Helper macros to convert from Zephyr PHY speed to NETC speed/duplex types */ #define PHY_TO_NETC_SPEED(x) \ (PHY_LINK_IS_SPEED_1000M(x) \ ? kNETC_MiiSpeed1000M \ : (PHY_LINK_IS_SPEED_100M(x) ? kNETC_MiiSpeed100M : kNETC_MiiSpeed10M)) #define PHY_TO_NETC_DUPLEX_MODE(x) \ (PHY_LINK_IS_FULL_DUPLEX(x) ? kNETC_MiiFullDuplex : kNETC_MiiHalfDuplex) /* Helper function to generate an Ethernet MAC address for a given ENETC instance */ #define FREESCALE_OUI_B0 0x00 #define FREESCALE_OUI_B1 0x04 #define FREESCALE_OUI_B2 0x9f #define _NETC_GENERATE_MAC_ADDRESS_RANDOM \ gen_random_mac(mac_addr, FREESCALE_OUI_B0, FREESCALE_OUI_B1, FREESCALE_OUI_B2) #define _NETC_GENERATE_MAC_ADDRESS_UNIQUE(n) \ do { \ uint32_t id = 0x001100; \ \ mac_addr[0] = FREESCALE_OUI_B0; \ mac_addr[1] = FREESCALE_OUI_B1; \ /* Set MAC address locally administered bit (LAA) */ \ mac_addr[2] = FREESCALE_OUI_B2 | 0x02; \ mac_addr[3] = (id >> 16) & 0xff; \ mac_addr[4] = (id >> 8) & 0xff; \ mac_addr[5] = (id + n) & 0xff; \ } while (0) #define NETC_GENERATE_MAC_ADDRESS(n) \ static void netc_eth##n##_generate_mac(uint8_t mac_addr[6]) \ { \ COND_CODE_1(DT_INST_PROP(n, zephyr_random_mac_address), \ (_NETC_GENERATE_MAC_ADDRESS_RANDOM), \ (COND_CODE_0(DT_INST_NODE_HAS_PROP(n, local_mac_address), \ (_NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)), \ (ARG_UNUSED(mac_addr))))); \ } struct netc_eth_config { uint16_t si_idx; const struct device *phy_dev; void (*generate_mac)(uint8_t *mac_addr); void (*bdr_init)(netc_bdr_config_t *bdr_config, netc_rx_bdr_config_t *rx_bdr_config, netc_tx_bdr_config_t *tx_bdr_config); const struct pinctrl_dev_config *pincfg; uint8_t tx_intr_msg_data; uint8_t rx_intr_msg_data; }; typedef uint8_t rx_buffer_t[NETC_RX_RING_BUF_SIZE_ALIGN]; struct netc_eth_data { ep_handle_t handle; struct net_if *iface; uint8_t mac_addr[6]; /* TX */ struct k_mutex tx_mutex; netc_tx_frame_info_t tx_info; uint8_t *tx_buff; volatile bool tx_done; /* RX */ struct k_sem rx_sem; struct k_thread rx_thread; K_KERNEL_STACK_MEMBER(rx_thread_stack, CONFIG_ETH_NXP_IMX_RX_THREAD_STACK_SIZE); uint8_t *rx_frame; }; int netc_eth_init_common(const struct device *dev); int netc_eth_tx(const struct device *dev, struct net_pkt *pkt); enum ethernet_hw_caps netc_eth_get_capabilities(const struct device *dev); int netc_eth_set_config(const struct device *dev, enum ethernet_config_type type, const struct ethernet_config *config); #endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ */