tsnep.h (3994B)
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 26struct 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 42struct 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 55struct 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 75struct 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 87struct 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 105struct 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 116struct 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 152extern const struct ethtool_ops tsnep_ethtool_ops; 153 154int tsnep_ptp_init(struct tsnep_adapter *adapter); 155void tsnep_ptp_cleanup(struct tsnep_adapter *adapter); 156int tsnep_ptp_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd); 157 158int tsnep_tc_init(struct tsnep_adapter *adapter); 159void tsnep_tc_cleanup(struct tsnep_adapter *adapter); 160int tsnep_tc_setup(struct net_device *netdev, enum tc_setup_type type, 161 void *type_data); 162 163#if IS_ENABLED(CONFIG_TSNEP_SELFTESTS) 164int tsnep_ethtool_get_test_count(void); 165void tsnep_ethtool_get_test_strings(u8 *data); 166void tsnep_ethtool_self_test(struct net_device *netdev, 167 struct ethtool_test *eth_test, u64 *data); 168#else 169static inline int tsnep_ethtool_get_test_count(void) 170{ 171 return -EOPNOTSUPP; 172} 173 174static inline void tsnep_ethtool_get_test_strings(u8 *data) 175{ 176 /* not enabled */ 177} 178 179static 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 187void tsnep_get_system_time(struct tsnep_adapter *adapter, u64 *time); 188 189#endif /* _TSNEP_H */