xref: /freebsd/sys/dev/neta/if_mvnetavar.h (revision e17f5b1d)
1 /*
2  * Copyright (c) 2017 Stormshield.
3  * Copyright (c) 2017 Semihalf.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
24  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25  * POSSIBILITY OF SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  *
29  */
30 
31 #ifndef _IF_MVNETAVAR_H_
32 #define	_IF_MVNETAVAR_H_
33 #include <net/if.h>
34 
35 #define	MVNETA_HWHEADER_SIZE		2	/* Marvell Header */
36 #define	MVNETA_ETHER_SIZE		22	/* Maximum ether size */
37 #define	MVNETA_A370_MAX_CSUM_MTU	1600	/* Max frame len for TX csum */
38 #define	MVNETA_A3700_MAX_CSUM_MTU	9600
39 
40 #define	MVNETA_MAX_FRAME		(MJUM9BYTES)
41 
42 /*
43  * Default limit of queue length
44  *
45  * queue 0 is lowest priority and queue 7 is highest priority.
46  * IP packet is received on queue 7 by default.
47  */
48 #define	MVNETA_TX_RING_CNT	512
49 #define	MVNETA_RX_RING_CNT	256
50 
51 #define	MVNETA_BUFRING_SIZE	1024
52 
53 #define	MVNETA_PACKET_OFFSET	64
54 
55 #define	MVNETA_RXTH_COUNT	128
56 #define	MVNETA_RX_REFILL_COUNT	8
57 #define	MVNETA_TX_RECLAIM_COUNT	32
58 
59 /*
60  * Device Register access
61  */
62 #define	MVNETA_READ(sc, reg) \
63 	bus_read_4((sc)->res[0], (reg))
64 #define	MVNETA_WRITE(sc, reg, val) \
65 	bus_write_4((sc)->res[0], (reg), (val))
66 
67 #define	MVNETA_READ_REGION(sc, reg, val, c) \
68 	bus_read_region_4((sc)->res[0], (reg), (val), (c))
69 #define	MVNETA_WRITE_REGION(sc, reg, val, c) \
70 	bus_write_region_4((sc)->res[0], (reg), (val), (c))
71 
72 #define	MVNETA_READ_MIB_4(sc, reg) \
73 	bus_read_4((sc)->res[0], MVNETA_PORTMIB_BASE + (reg))
74 #define	MVNETA_READ_MIB_8(sc, reg) \
75 	bus_read_8((sc)->res[0], MVNETA_PORTMIB_BASE + (reg))
76 
77 #define	MVNETA_IS_LINKUP(sc) \
78 	(MVNETA_READ((sc), MVNETA_PSR) & MVNETA_PSR_LINKUP)
79 
80 #define	MVNETA_IS_QUEUE_SET(queues, q) \
81 	((((queues) >> (q)) & 0x1))
82 
83 /*
84  * EEE: Lower Power Idle config
85  * Default timer is duration of MTU sized frame transmission.
86  * The timer can be negotiated by LLDP protocol, but we have no
87  * support.
88  */
89 #define	MVNETA_LPI_TS		(ETHERMTU * 8 / 1000) /* [us] */
90 #define	MVNETA_LPI_TW		(ETHERMTU * 8 / 1000) /* [us] */
91 #define	MVNETA_LPI_LI		(ETHERMTU * 8 / 1000) /* [us] */
92 
93 /*
94  * DMA Descriptor
95  *
96  * the ethernet device has 8 rx/tx DMA queues. each of queue has its own
97  * decriptor list. descriptors are simply index by counter inside the device.
98  */
99 #define	MVNETA_TX_SEGLIMIT	32
100 
101 #define	MVNETA_QUEUE_IDLE	1
102 #define	MVNETA_QUEUE_WORKING	2
103 #define	MVNETA_QUEUE_DISABLED	3
104 
105 struct mvneta_buf {
106 	struct mbuf *	m;	/* pointer to related mbuf */
107 	bus_dmamap_t	dmap;
108 };
109 
110 struct mvneta_rx_ring {
111 	int				queue_status;
112 	/* Real descriptors array. shared by RxDMA */
113 	struct mvneta_rx_desc		*desc;
114 	bus_dmamap_t			desc_map;
115 	bus_addr_t			desc_pa;
116 
117 	/* Virtual address of the RX buffer */
118 	void 				*rxbuf_virt_addr[MVNETA_RX_RING_CNT];
119 
120 	/* Managment entries for each of descritors */
121 	struct mvneta_buf		rxbuf[MVNETA_RX_RING_CNT];
122 
123 	/* locks */
124 	struct mtx			ring_mtx;
125 
126 	/* Index */
127 	int				dma;
128 	int				cpu;
129 
130 	/* Limit */
131 	int				queue_th_received;
132 	int				queue_th_time; /* [Tclk] */
133 
134 	/* LRO */
135 	struct lro_ctrl			lro;
136 	boolean_t			lro_enabled;
137 	/* Is this queue out of mbuf */
138 	boolean_t			needs_refill;
139 } __aligned(CACHE_LINE_SIZE);
140 
141 struct mvneta_tx_ring {
142 	/* Index of this queue */
143 	int				qidx;
144 	/* IFNET pointer */
145 	struct ifnet			*ifp;
146 	/* Ring buffer for IFNET */
147 	struct buf_ring			*br;
148 	/* Real descriptors array. shared by TxDMA */
149 	struct mvneta_tx_desc		*desc;
150 	bus_dmamap_t			desc_map;
151 	bus_addr_t			desc_pa;
152 
153 	/* Managment entries for each of descritors */
154 	struct mvneta_buf		txbuf[MVNETA_TX_RING_CNT];
155 
156 	/* locks */
157 	struct mtx			ring_mtx;
158 
159 	/* Index */
160 	int				used;
161 	int				dma;
162 	int				cpu;
163 
164 	/* watchdog */
165 #define	MVNETA_WATCHDOG_TXCOMP	(hz / 10) /* 100ms */
166 #define	MVNETA_WATCHDOG	(10 * hz) /* 10s */
167 	int				watchdog_time;
168 	int				queue_status;
169 	boolean_t			queue_hung;
170 
171 	/* Task */
172 	struct task			task;
173 	struct taskqueue		*taskq;
174 
175 	/* Stats */
176 	uint32_t			drv_error;
177 } __aligned(CACHE_LINE_SIZE);
178 
179 static __inline int
180 tx_counter_adv(int ctr, int n)
181 {
182 
183 	ctr += n;
184 	while (__predict_false(ctr >= MVNETA_TX_RING_CNT))
185 		ctr -= MVNETA_TX_RING_CNT;
186 
187 	return (ctr);
188 }
189 
190 static __inline int
191 rx_counter_adv(int ctr, int n)
192 {
193 
194 	ctr += n;
195 	while (__predict_false(ctr >= MVNETA_RX_RING_CNT))
196 		ctr -= MVNETA_RX_RING_CNT;
197 
198 	return (ctr);
199 }
200 
201 /*
202  * Timeout control
203  */
204 #define	MVNETA_PHY_TIMEOUT	10000	/* msec */
205 #define	RX_DISABLE_TIMEOUT	0x1000000 /* times */
206 #define	TX_DISABLE_TIMEOUT	0x1000000 /* times */
207 #define	TX_FIFO_EMPTY_TIMEOUT	0x1000000 /* times */
208 
209 /*
210  * Debug
211  */
212 #define	KASSERT_SC_MTX(sc) \
213     KASSERT(mtx_owned(&(sc)->mtx), ("SC mutex not owned"))
214 #define	KASSERT_BM_MTX(sc) \
215     KASSERT(mtx_owned(&(sc)->bm.bm_mtx), ("BM mutex not owned"))
216 #define	KASSERT_RX_MTX(sc, q) \
217     KASSERT(mtx_owned(&(sc)->rx_ring[(q)].ring_mtx),\
218         ("RX mutex not owned"))
219 #define	KASSERT_TX_MTX(sc, q) \
220     KASSERT(mtx_owned(&(sc)->tx_ring[(q)].ring_mtx),\
221         ("TX mutex not owned"))
222 
223 /*
224  * sysctl(9) parameters
225  */
226 struct mvneta_sysctl_queue {
227 	struct mvneta_softc	*sc;
228 	int			rxtx;
229 	int			queue;
230 };
231 #define	MVNETA_SYSCTL_RX		0
232 #define	MVNETA_SYSCTL_TX		1
233 
234 struct mvneta_sysctl_mib {
235 	struct mvneta_softc	*sc;
236 	int			index;
237 	uint64_t		counter;
238 };
239 
240 enum mvneta_phy_mode {
241 	MVNETA_PHY_QSGMII,
242 	MVNETA_PHY_SGMII,
243 	MVNETA_PHY_RGMII,
244 	MVNETA_PHY_RGMII_ID
245 };
246 
247 /*
248  * Ethernet Device main context
249  */
250 DECLARE_CLASS(mvneta_driver);
251 
252 struct mvneta_softc {
253 	device_t	dev;
254 	uint32_t	version;
255 	/*
256 	 * mtx must be held by interface functions to/from
257 	 * other frameworks. interrupt hander, sysctl hander,
258 	 * ioctl hander, and so on.
259 	 */
260 	struct mtx	mtx;
261 	struct resource *res[2];
262 	void            *ih_cookie[1];
263 
264 	struct ifnet	*ifp;
265 	uint32_t        mvneta_if_flags;
266 	uint32_t        mvneta_media;
267 	uint32_t	tx_csum_limit;
268 	uint32_t	rx_frame_size;
269 
270 	int			phy_attached;
271 	enum mvneta_phy_mode	phy_mode;
272 	int			phy_addr;
273 	int			phy_speed;	/* PHY speed */
274 	boolean_t		phy_fdx;	/* Full duplex mode */
275 	boolean_t		autoneg;	/* Autonegotiation status */
276 	boolean_t		use_inband_status;	/* In-band link status */
277 
278 	/*
279 	 * Link State control
280 	 */
281 	boolean_t	linkup;
282         device_t        miibus;
283 	struct mii_data *mii;
284 	uint8_t		enaddr[ETHER_ADDR_LEN];
285 	struct ifmedia	mvneta_ifmedia;
286 
287 	bus_dma_tag_t	rx_dtag;
288 	bus_dma_tag_t	rxbuf_dtag;
289 	bus_dma_tag_t	tx_dtag;
290 	bus_dma_tag_t	txmbuf_dtag;
291 	struct mvneta_rx_ring		rx_ring[MVNETA_RX_QNUM_MAX];
292 	struct mvneta_tx_ring		tx_ring[MVNETA_TX_QNUM_MAX];
293 
294 	/*
295 	 * Maintance clock
296 	 */
297 	struct callout		tick_ch;
298 
299 	int cf_lpi;
300 	int cf_fc;
301 	int debug;
302 
303 	/*
304 	 * Sysctl interfaces
305 	 */
306 	struct mvneta_sysctl_queue sysctl_rx_queue[MVNETA_RX_QNUM_MAX];
307 	struct mvneta_sysctl_queue sysctl_tx_queue[MVNETA_TX_QNUM_MAX];
308 
309 	/*
310 	 * MIB counter
311 	 */
312 	struct mvneta_sysctl_mib sysctl_mib[MVNETA_PORTMIB_NOCOUNTER];
313 	uint64_t counter_pdfc;
314 	uint64_t counter_pofc;
315 	uint32_t counter_watchdog;		/* manual reset when clearing mib */
316 	uint32_t counter_watchdog_mib;	/* reset after each mib update */
317 };
318 #define	MVNETA_RX_RING(sc, q) \
319     (&(sc)->rx_ring[(q)])
320 #define	MVNETA_TX_RING(sc, q) \
321     (&(sc)->tx_ring[(q)])
322 
323 int mvneta_attach(device_t);
324 
325 #ifdef FDT
326 int mvneta_fdt_mac_address(struct mvneta_softc *, uint8_t *);
327 #endif
328 
329 #endif /* _IF_MVNETAVAR_H_ */
330