| /* |
| * Copyright (c) 2017 Intel Corporation. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef DRIVERS_ETHERNET_ETH_DW_PRIV_H_ |
| #define DRIVERS_ETHERNET_ETH_DW_PRIV_H_ |
| |
| #ifdef CONFIG_PCI |
| #include <pci/pci.h> |
| #include <pci/pci_mgr.h> |
| #endif /* CONFIG_PCI */ |
| |
| #include <misc/util.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| typedef void (*eth_config_irq_t)(struct device *port); |
| |
| struct eth_config { |
| u32_t irq_num; |
| eth_config_irq_t config_func; |
| |
| #ifdef CONFIG_ETH_DW_SHARED_IRQ |
| char *shared_irq_dev_name; |
| #endif /* CONFIG_ETH_DW_SHARED_IRQ */ |
| }; |
| |
| /* Refer to Intel Quark SoC X1000 Datasheet, Chapter 15 for more details on |
| * Ethernet device operation. |
| * |
| * This driver puts the Ethernet device into a very simple and space-efficient |
| * mode of operation. It only allocates a single packet descriptor for each of |
| * the transmit and receive directions, computes checksums on the CPU, and |
| * enables store-and-forward mode for both transmit and receive directions. |
| */ |
| |
| /* Transmit descriptor */ |
| struct eth_tx_desc { |
| /* First word of transmit descriptor */ |
| union { |
| struct { |
| /* Only valid in half-duplex mode. */ |
| u32_t deferred_bit : 1; |
| u32_t err_underflow : 1; |
| u32_t err_excess_defer : 1; |
| u32_t coll_cnt_slot_num : 4; |
| u32_t vlan_frm : 1; |
| u32_t err_excess_coll : 1; |
| u32_t err_late_coll : 1; |
| u32_t err_no_carrier : 1; |
| u32_t err_carrier_loss : 1; |
| u32_t err_ip_payload : 1; |
| u32_t err_frm_flushed : 1; |
| u32_t err_jabber_tout : 1; |
| /* OR of all other error bits. */ |
| u32_t err_summary : 1; |
| u32_t err_ip_hdr : 1; |
| u32_t tx_timestamp_stat : 1; |
| u32_t vlan_ins_ctrl : 2; |
| u32_t addr2_chained : 1; |
| u32_t tx_end_of_ring : 1; |
| u32_t chksum_ins_ctrl : 2; |
| u32_t replace_crc : 1; |
| u32_t tx_timestamp_en : 1; |
| u32_t dis_pad : 1; |
| u32_t dis_crc : 1; |
| u32_t first_seg_in_frm : 1; |
| u32_t last_seg_in_frm : 1; |
| u32_t intr_on_complete : 1; |
| /* When set, descriptor is owned by DMA. */ |
| u32_t own : 1; |
| }; |
| u32_t tdes0; |
| }; |
| /* Second word of transmit descriptor */ |
| union { |
| struct { |
| u32_t tx_buf1_sz : 13; |
| u32_t : 3; |
| u32_t tx_buf2_sz : 13; |
| u32_t src_addr_ins_ctrl : 3; |
| }; |
| u32_t tdes1; |
| }; |
| /* Pointer to frame data buffer */ |
| u8_t *buf1_ptr; |
| /* Unused, since this driver initializes only a single descriptor for each |
| * direction. |
| */ |
| u8_t *buf2_ptr; |
| }; |
| |
| /* Transmit descriptor */ |
| struct eth_rx_desc { |
| /* First word of receive descriptor */ |
| union { |
| struct { |
| u32_t ext_stat : 1; |
| u32_t err_crc : 1; |
| u32_t err_dribble_bit : 1; |
| u32_t err_rx_mii : 1; |
| u32_t err_rx_wdt : 1; |
| u32_t frm_type : 1; |
| u32_t err_late_coll : 1; |
| u32_t giant_frm : 1; |
| u32_t last_desc : 1; |
| u32_t first_desc : 1; |
| u32_t vlan_tag : 1; |
| u32_t err_overflow : 1; |
| u32_t length_err : 1; |
| u32_t s_addr_filt_fail : 1; |
| u32_t err_desc : 1; |
| u32_t err_summary : 1; |
| u32_t frm_len : 14; |
| u32_t d_addr_filt_fail : 1; |
| u32_t own : 1; |
| }; |
| u32_t rdes0; |
| }; |
| /* Second word of receive descriptor */ |
| union { |
| struct { |
| u32_t rx_buf1_sz : 13; |
| u32_t : 1; |
| u32_t addr2_chained : 1; |
| u32_t rx_end_of_ring : 1; |
| u32_t rx_buf2_sz : 13; |
| u32_t : 2; |
| u32_t dis_int_compl : 1; |
| }; |
| u32_t rdes1; |
| }; |
| /* Pointer to frame data buffer */ |
| u8_t *buf1_ptr; |
| /* Unused, since this driver initializes only a single descriptor for each |
| * direction. |
| */ |
| u8_t *buf2_ptr; |
| }; |
| |
| #define ETH_DW_MTU 1500 |
| |
| /* Driver metadata associated with each Ethernet device */ |
| struct eth_runtime { |
| u32_t base_addr; |
| struct net_if *iface; |
| #ifdef CONFIG_PCI |
| struct pci_dev_info pci_dev; |
| #endif /* CONFIG_PCI */ |
| /* Transmit descriptor */ |
| volatile struct eth_tx_desc tx_desc; |
| /* Receive descriptor */ |
| volatile struct eth_rx_desc rx_desc; |
| /* Receive DMA packet buffer */ |
| volatile u8_t rx_buf[ETH_DW_MTU]; |
| |
| union { |
| struct { |
| u8_t bytes[6]; |
| u8_t pad[2]; |
| } __packed; |
| u32_t words[2]; |
| } mac_addr; |
| }; |
| |
| #define MMC_DEFAULT_MASK 0xffffffff |
| |
| #define MAC_CONF_14_RMII_100M BIT(14) |
| #define MAC_CONF_11_DUPLEX BIT(11) |
| #define MAC_CONF_3_TX_EN BIT(3) |
| #define MAC_CONF_2_RX_EN BIT(2) |
| #define MAC_FILTER_4_PM BIT(4) |
| |
| #define STATUS_NORMAL_INT BIT(16) |
| #define STATUS_RX_INT BIT(6) |
| |
| #define OP_MODE_25_RX_STORE_N_FORWARD BIT(25) |
| #define OP_MODE_21_TX_STORE_N_FORWARD BIT(21) |
| #define OP_MODE_13_START_TX BIT(13) |
| #define OP_MODE_1_START_RX BIT(1) |
| |
| #define INT_ENABLE_NORMAL BIT(16) |
| #define INT_ENABLE_RX BIT(6) |
| |
| #define REG_ADDR_MAC_CONF 0x0000 |
| #define REG_ADDR_MAC_FRAME_FILTER 0x0004 |
| #define REG_ADDR_MACADDR_HI 0x0040 |
| #define REG_ADDR_MACADDR_LO 0x0044 |
| |
| #define REG_MMC_RX_INTR_MASK 0x010c |
| #define REG_MMC_TX_INTR_MASK 0x0110 |
| #define REG_MMC_RX_IPC_INTR_MASK 0x0200 |
| |
| #define REG_ADDR_TX_POLL_DEMAND 0x1004 |
| #define REG_ADDR_RX_POLL_DEMAND 0x1008 |
| #define REG_ADDR_RX_DESC_LIST 0x100C |
| #define REG_ADDR_TX_DESC_LIST 0x1010 |
| #define REG_ADDR_STATUS 0x1014 |
| #define REG_ADDR_DMA_OPERATION 0x1018 |
| #define REG_ADDR_INT_ENABLE 0x101C |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* DRIVERS_ETHERNET_ETH_DW_PRIV_H_ */ |