1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright (C) 2021 Gerhard Engleder <gerhard@engleder-embedded.com> */ 3 4 #ifndef _TSNEP_H 5 #define _TSNEP_H 6 7 #include "tsnep_hw.h" 8 9 #include <linux/platform_device.h> 10 #include <linux/dma-mapping.h> 11 #include <linux/etherdevice.h> 12 #include <linux/phy.h> 13 #include <linux/ethtool.h> 14 #include <linux/net_tstamp.h> 15 #include <linux/ptp_clock_kernel.h> 16 #include <linux/miscdevice.h> 17 18 #define TSNEP "tsnep" 19 20 #define TSNEP_RING_SIZE 256 21 #define TSNEP_RING_ENTRIES_PER_PAGE (PAGE_SIZE / TSNEP_DESC_SIZE) 22 #define TSNEP_RING_PAGE_COUNT (TSNEP_RING_SIZE / TSNEP_RING_ENTRIES_PER_PAGE) 23 24 #define TSNEP_QUEUES 1 25 26 struct tsnep_gcl { 27 void __iomem *addr; 28 29 u64 base_time; 30 u64 cycle_time; 31 u64 cycle_time_extension; 32 33 struct tsnep_gcl_operation operation[TSNEP_GCL_COUNT]; 34 int count; 35 36 u64 change_limit; 37 38 u64 start_time; 39 bool change; 40 }; 41 42 struct tsnep_tx_entry { 43 struct tsnep_tx_desc *desc; 44 struct tsnep_tx_desc_wb *desc_wb; 45 dma_addr_t desc_dma; 46 bool owner_user_flag; 47 48 u32 properties; 49 50 struct sk_buff *skb; 51 size_t len; 52 DEFINE_DMA_UNMAP_ADDR(dma); 53 }; 54 55 struct tsnep_tx { 56 struct tsnep_adapter *adapter; 57 void __iomem *addr; 58 59 void *page[TSNEP_RING_PAGE_COUNT]; 60 dma_addr_t page_dma[TSNEP_RING_PAGE_COUNT]; 61 62 /* TX ring lock */ 63 spinlock_t lock; 64 struct tsnep_tx_entry entry[TSNEP_RING_SIZE]; 65 int write; 66 int read; 67 u32 owner_counter; 68 int increment_owner_counter; 69 70 u32 packets; 71 u32 bytes; 72 u32 dropped; 73 }; 74 75 struct tsnep_rx_entry { 76 struct tsnep_rx_desc *desc; 77 struct tsnep_rx_desc_wb *desc_wb; 78 dma_addr_t desc_dma; 79 80 u32 properties; 81 82 struct sk_buff *skb; 83 size_t len; 84 DEFINE_DMA_UNMAP_ADDR(dma); 85 }; 86 87 struct tsnep_rx { 88 struct tsnep_adapter *adapter; 89 void __iomem *addr; 90 91 void *page[TSNEP_RING_PAGE_COUNT]; 92 dma_addr_t page_dma[TSNEP_RING_PAGE_COUNT]; 93 94 struct tsnep_rx_entry entry[TSNEP_RING_SIZE]; 95 int read; 96 u32 owner_counter; 97 int increment_owner_counter; 98 99 u32 packets; 100 u32 bytes; 101 u32 dropped; 102 u32 multicast; 103 }; 104 105 struct tsnep_queue { 106 struct tsnep_adapter *adapter; 107 108 struct tsnep_tx *tx; 109 struct tsnep_rx *rx; 110 111 struct napi_struct napi; 112 113 u32 irq_mask; 114 }; 115 116 struct tsnep_adapter { 117 struct net_device *netdev; 118 u8 mac_address[ETH_ALEN]; 119 struct mii_bus *mdiobus; 120 bool suppress_preamble; 121 phy_interface_t phy_mode; 122 struct phy_device *phydev; 123 int msg_enable; 124 125 struct platform_device *pdev; 126 struct device *dmadev; 127 void __iomem *addr; 128 int irq; 129 130 bool gate_control; 131 /* gate control lock */ 132 struct mutex gate_control_lock; 133 bool gate_control_active; 134 struct tsnep_gcl gcl[2]; 135 int next_gcl; 136 137 struct hwtstamp_config hwtstamp_config; 138 struct ptp_clock *ptp_clock; 139 struct ptp_clock_info ptp_clock_info; 140 /* ptp clock lock */ 141 spinlock_t ptp_lock; 142 143 int num_tx_queues; 144 struct tsnep_tx tx[TSNEP_MAX_QUEUES]; 145 int num_rx_queues; 146 struct tsnep_rx rx[TSNEP_MAX_QUEUES]; 147 148 int num_queues; 149 struct tsnep_queue queue[TSNEP_MAX_QUEUES]; 150 }; 151 152 extern const struct ethtool_ops tsnep_ethtool_ops; 153 154 int tsnep_ptp_init(struct tsnep_adapter *adapter); 155 void tsnep_ptp_cleanup(struct tsnep_adapter *adapter); 156 int tsnep_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); 157 158 int tsnep_tc_init(struct tsnep_adapter *adapter); 159 void tsnep_tc_cleanup(struct tsnep_adapter *adapter); 160 int tsnep_tc_setup(struct net_device *netdev, enum tc_setup_type type, 161 void *type_data); 162 163 #if IS_ENABLED(CONFIG_TSNEP_SELFTESTS) 164 int tsnep_ethtool_get_test_count(void); 165 void tsnep_ethtool_get_test_strings(u8 *data); 166 void tsnep_ethtool_self_test(struct net_device *netdev, 167 struct ethtool_test *eth_test, u64 *data); 168 #else 169 static inline int tsnep_ethtool_get_test_count(void) 170 { 171 return -EOPNOTSUPP; 172 } 173 174 static inline void tsnep_ethtool_get_test_strings(u8 *data) 175 { 176 /* not enabled */ 177 } 178 179 static inline void tsnep_ethtool_self_test(struct net_device *dev, 180 struct ethtool_test *eth_test, 181 u64 *data) 182 { 183 /* not enabled */ 184 } 185 #endif /* CONFIG_TSNEP_SELFTESTS */ 186 187 void tsnep_get_system_time(struct tsnep_adapter *adapter, u64 *time); 188 189 #endif /* _TSNEP_H */ 190