forked from zephyrproject-rtos/zephyr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheth_adin2111_priv.h
266 lines (231 loc) · 8.74 KB
/
eth_adin2111_priv.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
/*
* Copyright (c) 2023 PHOENIX CONTACT Electronics GmbH
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ETH_ADIN2111_PRIV_H__
#define ETH_ADIN2111_PRIV_H__
#include <stdint.h>
#include <stdbool.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/drivers/spi.h>
#include <zephyr/net/net_if.h>
#include <ethernet/eth_stats.h>
/* SPI frequency maximum, based on clock cycle time */
#define ADIN2111_SPI_MAX_FREQUENCY 25000000U
#define ADIN2111_PHYID 0x01U
/* PHY Identification Register Reset Value */
#define ADIN2111_PHYID_RST_VAL 0x0283BCA1U
#define ADIN1110_PHYID_RST_VAL 0x0283BC91U
/* Reset Control and Status Register */
#define ADIN2111_RESET 0x03U
/* MACPHY software reset */
#define ADIN2111_RESET_SWRESET BIT(0)
/* Configuration Register 0 */
#define ADIN2111_CONFIG0 0x04U
/* Configuration Synchronization */
#define ADIN2111_CONFIG0_SYNC BIT(15)
/* Transmit Frame Check Sequence Validation Enable */
#define ADIN2111_CONFIG0_TXFCSVE BIT(14)
/* Zero Align Receive Frame Enable */
#define ADIN2111_CONFIG0_ZARFE BIT(12)
/* New packet received only after a new CS assertion */
#define ADIN2111_CONFIG0_CSARFE BIT(13)
/* Transmit Cut Through Enable */
#define ADIN2111_CONFIG0_TXCTE BIT(9)
/* Receive Cut Through Enable. Must be 0 for Generic SPI */
#define ADIN2111_CONFIG0_RXCTE BIT(8)
/* Configuration Register 2 */
#define ADIN2111_CONFIG2 0x06U
/* Forward Frames from Port 2 Not Matching a MAC Address to Port 1 */
#define ADIN2111_CONFIG2_P2_FWD_UNK2P1 BIT(14)
/* Forward Frames from Port 1 Not Matching a MAC Address to Port 2 */
#define ADIN2111_CONFIG2_P1_FWD_UNK2P2 BIT(13)
/* Forward Frames Not Matching Any MAC Address to the Host */
#define ADIN2111_CONFIG2_P2_FWD_UNK2HOST BIT(12)
/* Enable Cut Through from Port to Port */
#define ADIN2111_CONFIG2_PORT_CUT_THRU_EN BIT(11)
/* Enable CRC Append */
#define ADIN2111_CONFIG2_CRC_APPEND BIT(5)
/* Forward Frames Not Matching Any MAC Address to the Host */
#define ADIN2111_CONFIG2_P1_FWD_UNK2HOST BIT(2)
/* Status Register 0 */
#define ADIN2111_STATUS0 0x08U
/* PHY Interrupt for Port 1 */
#define ADIN2111_STATUS0_PHYINT BIT(7)
/**
* Reset Complete.
* The bit is set when the MACPHY reset is complete
* and ready for configuration.
*/
#define ADIN2111_STATUS0_RESETC BIT(6)
/* Value to completely clear status register 0 */
#define ADIN2111_STATUS0_CLEAR 0x1F7FU
/* Status Register 1 */
#define ADIN2111_STATUS1 0x09U
/* PHY Interrupt for Port 2 */
#define ADIN2111_STATUS1_PHYINT BIT(19)
/* Port 2 RX FIFO Contains Data */
#define ADIN2111_STATUS1_P2_RX_RDY BIT(17)
/* Indicates that a CRC error was detected */
#define ADIN2111_STATUS1_SPI_ERR BIT(10)
/* Port 1 RX FIFO Contains Data */
#define ADIN2111_STATUS1_P1_RX_RDY BIT(4)
/* Frame transmitted */
#define ADIN2111_STATUS1_TX_RDY BIT(3)
/* Value to completely clear status register 1 */
#define ADIN2111_STATUS1_CLEAR 0xFFF01F08U
/* Buffer Status Register */
#define ADIN2111_BUFSTS 0x0BU
/* Rx chunks available */
#define ADIN2111_BUFSTS_RCA_MASK GENMASK(7, 0)
/* Tx credits */
#define ADIN2111_BUFSTS_TXC 8U
#define ADIN2111_BUFSTS_TXC_MASK GENMASK(15, 8)
/* Interrupt Mask Register 0 */
#define ADIN2111_IMASK0 0x0CU
/* Physical Layer Interrupt Mask */
#define ADIN2111_IMASK0_PHYINTM BIT(7)
/* Interrupt Mask Register 1 */
#define ADIN2111_IMASK1 0x0DU
/* Mask Bit for P2_PHYINT */
#define ADIN2111_IMASK1_P2_PHYINT_MASK BIT(19)
/*!< Mask Bit for P2_RX_RDY. Generic SPI only.*/
#define ADIN2111_IMASK1_P2_RX_RDY_MASK BIT(17)
/*!< Mask Bit for SPI_ERR. Generic SPI only. */
#define ADIN2111_IMASK1_SPI_ERR_MASK BIT(10)
/*!< Mask Bit for P1_RX_RDY. Generic SPI only.*/
#define ADIN2111_IMASK1_P1_RX_RDY_MASK BIT(4)
/*!< Mask Bit for TX_FRM_DONE. Generic SPI only.*/
#define ADIN2111_IMASK1_TX_RDY_MASK BIT(3)
/* MAC Tx Frame Size Register */
#define ADIN2111_TX_FSIZE 0x30U
/* Tx FIFO Space Register */
#define ADIN2111_TX_SPACE 0x32U
/* MAC Address Rule and DA Filter Upper 16 Bits Registers */
#define ADIN2111_ADDR_FILT_UPR 0x50U
#define ADIN2111_ADDR_APPLY2PORT2 BIT(31)
#define ADIN2111_ADDR_APPLY2PORT1 BIT(30)
#define ADIN2111_ADDR_TO_OTHER_PORT BIT(17)
#define ADIN2111_ADDR_TO_HOST BIT(16)
/* MAC Address DA Filter Lower 32 Bits Registers */
#define ADIN2111_ADDR_FILT_LWR 0x51U
/* Upper 16 Bits of the MAC Address Mask */
#define ADIN2111_ADDR_MSK_UPR 0x70U
/* Lower 32 Bits of the MAC Address Mask */
#define ADIN2111_ADDR_MSK_LWR 0x71U
/* P1 MAC Rx Frame Size Register */
#define ADIN2111_P1_RX_FSIZE 0x90U
/* P1 MAC Receive Register */
#define ADIN2111_P1_RX 0x91U
/* P2 MAC Rx Frame Size Register */
#define ADIN2111_P2_RX_FSIZE 0xC0U
/* P2 MAC Receive Register */
#define ADIN2111_P2_RX 0xC1U
/* MAC reset status */
#define ADIN1110_MAC_RST_STATUS_REG 0x3BU
/* MAC reset */
#define ADIN2111_SOFT_RST_REG 0x3CU
#define ADIN2111_SWRESET_KEY1 0x4F1CU
#define ADIN2111_SWRESET_KEY2 0xC1F4U
#define ADIN2111_SWRELEASE_KEY1 0x6F1AU
#define ADIN2111_SWRELEASE_KEY2 0xA1F6U
/* SPI header size in bytes */
#define ADIN2111_SPI_HEADER_SIZE 2U
/* SPI header size for write transaction */
#define ADIN2111_WRITE_HEADER_SIZE ADIN2111_SPI_HEADER_SIZE
/* SPI header size for read transaction (1 for TA) */
#define ADIN2111_READ_HEADER_SIZE (ADIN2111_SPI_HEADER_SIZE + 1U)
/* SPI register write buffer size without CRC */
#define ADIN2111_REG_WRITE_BUF_SIZE (ADIN2111_WRITE_HEADER_SIZE + sizeof(uint32_t))
/* SPI register write buffer with appended CRC size (1 for header, 1 for register) */
#define ADIN2111_REG_WRITE_BUF_SIZE_CRC (ADIN2111_REG_WRITE_BUF_SIZE + 2U)
/* SPI register read buffer size with TA without CRC */
#define ADIN2111_REG_READ_BUF_SIZE (ADIN2111_READ_HEADER_SIZE + sizeof(uint32_t))
/* SPI register read buffer with TA and appended CRC size (1 header, 1 for register) */
#define ADIN2111_REG_READ_BUF_SIZE_CRC (ADIN2111_REG_READ_BUF_SIZE + 2U)
/* SPI read fifo cmd buffer size with TA without CRC */
#define ADIN2111_FIFO_READ_CMD_BUF_SIZE (ADIN2111_READ_HEADER_SIZE)
/* SPI read fifo cmd buffer with TA and appended CRC size */
#define ADIN2111_FIFO_READ_CMD_BUF_SIZE_CRC (ADIN2111_FIFO_READ_CMD_BUF_SIZE + 1U)
/* SPI Header for writing control transaction in half duplex mode */
#define ADIN2111_WRITE_TXN_CTRL 0xA000U
/* SPI Header for writing control transaction with MAC TX register (!) in half duplex mode */
#define ADIN2111_TXN_CTRL_TX_REG 0xA031U
/* SPI Header for reading control transaction in half duplex mode */
#define ADIN2111_READ_TXN_CTRL 0x8000U
/* Frame header size in bytes */
#define ADIN2111_FRAME_HEADER_SIZE 2U
#define ADIN2111_INTERNAL_HEADER_SIZE 2U
/* Number of buffer bytes in TxFIFO to provide frame margin upon writes */
#define ADIN2111_TX_FIFO_BUFFER_MARGIN 4U
/* Manufacturer unique ID */
#define ADIN2111_PHYID_OUI 0xa0ef
/* Open Alliance definitions */
#define ADIN2111_OA_ALLOC_TIMEOUT K_MSEC(10)
/* Max setting to a max RCA of 255 68-bytes ckunks */
#define ADIN2111_OA_BUF_SZ (255U * 64U)
#define ADIN2111_OA_CTL_LEN_PROT 16U
#define ADIN2111_OA_CTL_LEN 12U
#define ADIN2111_OA_CTL_MMS BIT(24)
#define ADIN2111_OA_CTL_WNR BIT(29)
#define ADIN2111_OA_DATA_HDR_DNC BIT(31)
#define ADIN2111_OA_DATA_HDR_NORX BIT(29)
#define ADIN2111_OA_DATA_HDR_VS 22U
#define ADIN2111_OA_DATA_HDR_DV BIT(21)
#define ADIN2111_OA_DATA_HDR_SV BIT(20)
#define ADIN2111_OA_DATA_HDR_EV BIT(14)
#define ADIN2111_OA_DATA_HDR_EBO 8U
#define ADIN2111_OA_DATA_FTR_SYNC BIT(29)
#define ADIN2111_OA_DATA_FTR_EBO 8U
#define ADIN2111_OA_DATA_FTR_DV BIT(21)
#define ADIN2111_OA_DATA_FTR_SV BIT(20)
#define ADIN2111_OA_DATA_FTR_EV BIT(14)
#define ADIN2111_OA_DATA_FTR_SWO 16U
#define ADIN2111_OA_DATA_FTR_SWO_MSK GENMASK(19, 16)
#define ADIN2111_OA_DATA_FTR_EBO 8U
#define ADIN2111_OA_DATA_FTR_EBO_MSK GENMASK(13, 8)
enum adin2111_chips_id {
ADIN2111_MAC = 0,
ADIN1110_MAC,
};
struct adin2111_config {
enum adin2111_chips_id id;
struct spi_dt_spec spi;
struct gpio_dt_spec interrupt;
struct gpio_dt_spec reset;
};
struct adin2111_data {
struct k_mutex lock;
struct k_sem offload_sem;
uint32_t imask0;
uint32_t imask1;
uint8_t *buf;
/* Port 0: PHY 1, Port 1: PHY 2 */
const struct device *port[2];
uint8_t *oa_tx_buf;
uint8_t *oa_rx_buf;
uint16_t ifaces_left_to_init;
uint16_t scur;
struct gpio_callback gpio_int_callback;
bool oa;
bool oa_prot;
uint8_t oa_cps;
K_KERNEL_STACK_MEMBER(rx_thread_stack, CONFIG_ETH_ADIN2111_IRQ_THREAD_STACK_SIZE);
struct k_thread rx_thread;
};
struct adin2111_port_data {
struct net_if *iface;
uint8_t mac_addr[6];
#if defined(CONFIG_NET_STATISTICS_ETHERNET)
struct net_stats_eth stats;
#endif /* CONFIG_NET_STATISTICS_ETHERNET */
};
struct adin2111_port_config {
const struct device *adin;
const struct device *phy;
const uint16_t port_idx;
const uint16_t phy_addr;
};
#endif /* ETH_ADIN2111_PRIV_H__ */