Merge tag 'input-for-v5.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / net / ethernet / engleder / tsnep.h
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 */