1 /* 2 * Copyright 2024-2025 NXP 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ 8 #define ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ 9 10 #include "nxp_imx_netc.h" 11 #include "fsl_netc_endpoint.h" 12 #include "fsl_msgintr.h" 13 14 /* Buffer and descriptor alignment */ 15 #define NETC_BUFF_ALIGN 64 16 #define NETC_RX_RING_BUF_SIZE_ALIGN \ 17 SDK_SIZEALIGN(CONFIG_ETH_NXP_IMX_RX_RING_BUF_SIZE, NETC_BUFF_ALIGN) 18 19 /* MSIX definitions */ 20 #define NETC_TX_MSIX_ENTRY_IDX 0 21 #define NETC_RX_MSIX_ENTRY_IDX 1 22 #define NETC_MSIX_ENTRY_NUM 2 23 24 #define NETC_MSIX_EVENTS_COUNT NETC_MSIX_ENTRY_NUM 25 #define NETC_TX_INTR_MSG_DATA_START 0 26 #define NETC_RX_INTR_MSG_DATA_START 16 27 #define NETC_DRV_MAX_INST_SUPPORT 16 28 29 /* MSGINTR */ 30 #define NETC_MSGINTR_CHANNEL 0 31 32 #if (CONFIG_ETH_NXP_IMX_MSGINTR == 1) 33 #define NETC_MSGINTR MSGINTR1 34 #define NETC_MSGINTR_IRQ MSGINTR1_IRQn 35 #elif (CONFIG_ETH_NXP_IMX_MSGINTR == 2) 36 #define NETC_MSGINTR MSGINTR2 37 #define NETC_MSGINTR_IRQ MSGINTR2_IRQn 38 #else 39 #error "Current CONFIG_ETH_NXP_IMX_MSGINTR not support" 40 #endif 41 42 /* Timeout for various operations */ 43 #define NETC_TIMEOUT K_MSEC(20) 44 45 /* Helper function to generate an Ethernet MAC address for a given ENETC instance */ 46 #define FREESCALE_OUI_B0 0x00 47 #define FREESCALE_OUI_B1 0x04 48 #define FREESCALE_OUI_B2 0x9f 49 50 #define _NETC_GENERATE_MAC_ADDRESS_RANDOM \ 51 gen_random_mac(mac_addr, FREESCALE_OUI_B0, FREESCALE_OUI_B1, FREESCALE_OUI_B2) 52 53 #define _NETC_GENERATE_MAC_ADDRESS_UNIQUE(n) \ 54 do { \ 55 uint32_t id = 0x001100; \ 56 \ 57 mac_addr[0] = FREESCALE_OUI_B0; \ 58 mac_addr[1] = FREESCALE_OUI_B1; \ 59 /* Set MAC address locally administered bit (LAA) */ \ 60 mac_addr[2] = FREESCALE_OUI_B2 | 0x02; \ 61 mac_addr[3] = (id >> 16) & 0xff; \ 62 mac_addr[4] = (id >> 8) & 0xff; \ 63 mac_addr[5] = (id + n) & 0xff; \ 64 } while (0) 65 66 #define NETC_GENERATE_MAC_ADDRESS(n) \ 67 static void netc_eth##n##_generate_mac(uint8_t mac_addr[6]) \ 68 { \ 69 COND_CODE_1(DT_INST_PROP(n, zephyr_random_mac_address), \ 70 (_NETC_GENERATE_MAC_ADDRESS_RANDOM), \ 71 (COND_CODE_0(DT_INST_NODE_HAS_PROP(n, local_mac_address), \ 72 (_NETC_GENERATE_MAC_ADDRESS_UNIQUE(n)), \ 73 (ARG_UNUSED(mac_addr))))); \ 74 } 75 76 struct netc_eth_config { 77 uint16_t si_idx; 78 const struct device *phy_dev; 79 netc_hw_mii_mode_t phy_mode; 80 volatile bool pseudo_mac; 81 void (*generate_mac)(uint8_t *mac_addr); 82 void (*bdr_init)(netc_bdr_config_t *bdr_config, netc_rx_bdr_config_t *rx_bdr_config, 83 netc_tx_bdr_config_t *tx_bdr_config); 84 const struct pinctrl_dev_config *pincfg; 85 uint8_t tx_intr_msg_data; 86 uint8_t rx_intr_msg_data; 87 }; 88 89 typedef uint8_t rx_buffer_t[NETC_RX_RING_BUF_SIZE_ALIGN]; 90 91 struct netc_eth_data { 92 ep_handle_t handle; 93 struct net_if *iface; 94 uint8_t mac_addr[6]; 95 /* TX */ 96 struct k_mutex tx_mutex; 97 netc_tx_frame_info_t tx_info; 98 uint8_t *tx_buff; 99 volatile bool tx_done; 100 /* RX */ 101 struct k_sem rx_sem; 102 struct k_thread rx_thread; 103 104 K_KERNEL_STACK_MEMBER(rx_thread_stack, CONFIG_ETH_NXP_IMX_RX_THREAD_STACK_SIZE); 105 uint8_t *rx_frame; 106 }; 107 108 int netc_eth_init_common(const struct device *dev); 109 int netc_eth_tx(const struct device *dev, struct net_pkt *pkt); 110 enum ethernet_hw_caps netc_eth_get_capabilities(const struct device *dev); 111 int netc_eth_set_config(const struct device *dev, enum ethernet_config_type type, 112 const struct ethernet_config *config); 113 114 #endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_NXP_IMX_NETC_PRIV_H_ */ 115