|  | /* | 
|  | * Copyright (c) 2019 Interay Solutions B.V. | 
|  | * Copyright (c) 2019 Oane Kingma | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_DRIVERS_ETHERNET_ETH_GECKO_PRIV_H_ | 
|  | #define ZEPHYR_DRIVERS_ETHERNET_ETH_GECKO_PRIV_H_ | 
|  |  | 
|  | #include <zephyr/kernel.h> | 
|  | #include <zephyr/types.h> | 
|  |  | 
|  | #define ETH_GECKO_MTU         NET_ETH_MTU | 
|  |  | 
|  | #define SILABS_OUI_B0         0x00 | 
|  | #define SILABS_OUI_B1         0x0B | 
|  | #define SILABS_OUI_B2         0x57 | 
|  |  | 
|  | #define ETH_TX_BUF_SIZE       1536 | 
|  | #define ETH_TX_BUF_COUNT      2 | 
|  | #define ETH_RX_BUF_SIZE       128 | 
|  | #define ETH_RX_BUF_COUNT      32 | 
|  |  | 
|  | #define ETH_BUF_ALIGNMENT     16 | 
|  |  | 
|  | #define ETH_DESC_ALIGNMENT    4 | 
|  |  | 
|  | #define ETH_TX_USED           BIT(31) | 
|  | #define ETH_TX_WRAP           BIT(30) | 
|  | #define ETH_TX_ERROR          BIT(29) | 
|  | #define ETH_TX_UNDERRUN       BIT(28) | 
|  | #define ETH_TX_EXHAUSTED      BIT(27) | 
|  | #define ETH_TX_NO_CRC         BIT(16) | 
|  | #define ETH_TX_LAST           BIT(15) | 
|  | #define ETH_TX_LENGTH         (2048-1) | 
|  |  | 
|  | #define ETH_RX_ADDRESS        ~(ETH_DESC_ALIGNMENT-1) | 
|  | #define ETH_RX_WRAP           BIT(1) | 
|  | #define ETH_RX_OWNERSHIP      BIT(0) | 
|  | #define ETH_RX_BROADCAST      BIT(31) | 
|  | #define ETH_RX_MULTICAST_HASH BIT(30) | 
|  | #define ETH_RX_UNICAST_HASH   BIT(29) | 
|  | #define ETH_RX_EXT_ADDR       BIT(28) | 
|  | #define ETH_RX_SAR1           BIT(26) | 
|  | #define ETH_RX_SAR2           BIT(25) | 
|  | #define ETH_RX_SAR3           BIT(24) | 
|  | #define ETH_RX_SAR4           BIT(23) | 
|  | #define ETH_RX_TYPE_ID        BIT(22) | 
|  | #define ETH_RX_VLAN_TAG       BIT(21) | 
|  | #define ETH_RX_PRIORITY_TAG   BIT(20) | 
|  | #define ETH_RX_VLAN_PRIORITY  (0x7UL<<17) | 
|  | #define ETH_RX_CFI            BIT(16) | 
|  | #define ETH_RX_EOF            BIT(15) | 
|  | #define ETH_RX_SOF            BIT(14) | 
|  | #define ETH_RX_OFFSET         (0x3UL<<12) | 
|  | #define ETH_RX_LENGTH         (4096-1) | 
|  |  | 
|  | #define ETH_RX_ENABLE(base)   (base->NETWORKCTRL |= ETH_NETWORKCTRL_ENBRX) | 
|  | #define ETH_RX_DISABLE(base)  (base->NETWORKCTRL &= ~ETH_NETWORKCTRL_ENBRX) | 
|  |  | 
|  | #define ETH_TX_ENABLE(base)   (base->NETWORKCTRL |= ETH_NETWORKCTRL_ENBTX) | 
|  | #define ETH_TX_DISABLE(base)  (base->NETWORKCTRL &= ~ETH_NETWORKCTRL_ENBTX) | 
|  |  | 
|  | struct eth_buf_desc { | 
|  | uint32_t address; | 
|  | uint32_t status; | 
|  | }; | 
|  |  | 
|  | struct eth_gecko_pin_list { | 
|  | struct soc_gpio_pin mdio[2]; | 
|  | struct soc_gpio_pin rmii[7]; | 
|  | }; | 
|  |  | 
|  | /* Device constant configuration parameters */ | 
|  | struct eth_gecko_dev_cfg { | 
|  | ETH_TypeDef *regs; | 
|  | const struct eth_gecko_pin_list *pin_list; | 
|  | uint32_t pin_list_size; | 
|  | void (*config_func)(void); | 
|  | struct phy_gecko_dev phy; | 
|  | }; | 
|  |  | 
|  | /* Device run time data */ | 
|  | struct eth_gecko_dev_data { | 
|  | struct net_if *iface; | 
|  | uint8_t mac_addr[6]; | 
|  | struct k_sem tx_sem; | 
|  | struct k_sem rx_sem; | 
|  |  | 
|  | K_KERNEL_STACK_MEMBER(rx_thread_stack, | 
|  | CONFIG_ETH_GECKO_RX_THREAD_STACK_SIZE); | 
|  | struct k_thread rx_thread; | 
|  | bool link_up; | 
|  | }; | 
|  |  | 
|  | /* PHY Management pins */ | 
|  | #define PIN_PHY_MDC {DT_INST_PROP_BY_IDX(0, location_phy_mdc, 1), \ | 
|  | DT_INST_PROP_BY_IDX(0, location_phy_mdc, 2), gpioModePushPull,\ | 
|  | 0} | 
|  | #define PIN_PHY_MDIO {DT_INST_PROP_BY_IDX(0, location_phy_mdio, 1), \ | 
|  | DT_INST_PROP_BY_IDX(0, location_phy_mdio, 2), gpioModePushPull,\ | 
|  | 0} | 
|  |  | 
|  | #define PIN_LIST_PHY {PIN_PHY_MDC, PIN_PHY_MDIO} | 
|  |  | 
|  | /* RMII pins excluding reference clock, handled by board.c */ | 
|  | #define PIN_RMII_CRSDV {DT_INST_PROP_BY_IDX(0, location_rmii_crs_dv, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_crs_dv, 2), gpioModeInput, 0} | 
|  |  | 
|  | #define PIN_RMII_TXD0 {DT_INST_PROP_BY_IDX(0, location_rmii_txd0, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_txd0, 2), gpioModePushPull, 0} | 
|  |  | 
|  | #define PIN_RMII_TXD1 {DT_INST_PROP_BY_IDX(0, location_rmii_txd1, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_txd1, 2), gpioModePushPull, 0} | 
|  |  | 
|  | #define PIN_RMII_TX_EN {DT_INST_PROP_BY_IDX(0, location_rmii_tx_en, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_tx_en, 2), gpioModePushPull, 0} | 
|  |  | 
|  | #define PIN_RMII_RXD0 {DT_INST_PROP_BY_IDX(0, location_rmii_rxd0, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_rxd0, 2), gpioModeInput, 0} | 
|  |  | 
|  | #define PIN_RMII_RXD1 {DT_INST_PROP_BY_IDX(0, location_rmii_rxd1, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_rxd1, 2), gpioModeInput, 0} | 
|  |  | 
|  | #define PIN_RMII_RX_ER {DT_INST_PROP_BY_IDX(0, location_rmii_rx_er, 1),\ | 
|  | DT_INST_PROP_BY_IDX(0, location_rmii_rx_er, 2), gpioModeInput, 0} | 
|  |  | 
|  | #define PIN_LIST_RMII {PIN_RMII_CRSDV, PIN_RMII_TXD0, PIN_RMII_TXD1, \ | 
|  | PIN_RMII_TX_EN, PIN_RMII_RXD0, PIN_RMII_RXD1, PIN_RMII_RX_ER} | 
|  |  | 
|  | /* RMII reference clock is not included in RMII pin set | 
|  | * #define PIN_RMII_REFCLK {DT_INST_PROP_BY_IDX(0, location_rmii_refclk, 1),\ | 
|  | *	DT_INST_PROP_BY_IDX(0, location_rmii_refclk, 2), gpioModePushPull, 0} | 
|  | */ | 
|  |  | 
|  | #endif /* ZEPHYR_DRIVERS_ETHERNET_ETH_GECKO_PRIV_H_ */ |