xref: /freebsd/sys/dev/tsec/if_tsec.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
167196661SRafal Jaworowski /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4d1d3233eSRafal Jaworowski  * Copyright (C) 2006-2007 Semihalf, Piotr Kruszynski
567196661SRafal Jaworowski  * All rights reserved.
667196661SRafal Jaworowski  *
767196661SRafal Jaworowski  * Redistribution and use in source and binary forms, with or without
867196661SRafal Jaworowski  * modification, are permitted provided that the following conditions
967196661SRafal Jaworowski  * are met:
1067196661SRafal Jaworowski  * 1. Redistributions of source code must retain the above copyright
1167196661SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer.
1267196661SRafal Jaworowski  * 2. Redistributions in binary form must reproduce the above copyright
1367196661SRafal Jaworowski  *    notice, this list of conditions and the following disclaimer in the
1467196661SRafal Jaworowski  *    documentation and/or other materials provided with the distribution.
1567196661SRafal Jaworowski  *
1667196661SRafal Jaworowski  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1767196661SRafal Jaworowski  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1867196661SRafal Jaworowski  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
1967196661SRafal Jaworowski  * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2067196661SRafal Jaworowski  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2167196661SRafal Jaworowski  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2267196661SRafal Jaworowski  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2367196661SRafal Jaworowski  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2467196661SRafal Jaworowski  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2567196661SRafal Jaworowski  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2667196661SRafal Jaworowski  */
2767196661SRafal Jaworowski 
28321e12c8SRafal Jaworowski #ifndef _IF_TSEC_H
29321e12c8SRafal Jaworowski #define _IF_TSEC_H
30321e12c8SRafal Jaworowski 
31d1d3233eSRafal Jaworowski #include <dev/ofw/openfirm.h>
32d1d3233eSRafal Jaworowski 
3367196661SRafal Jaworowski #define TSEC_RX_NUM_DESC	256
3467196661SRafal Jaworowski #define TSEC_TX_NUM_DESC	256
352c0dbbcbSJustin Hibbits #define	TSEC_TX_MAX_DMA_SEGS	8
3667196661SRafal Jaworowski 
37bd37530eSRafal Jaworowski /* Interrupt Coalescing types */
38bd37530eSRafal Jaworowski #define	TSEC_IC_RX		0
39bd37530eSRafal Jaworowski #define	TSEC_IC_TX		1
40bd37530eSRafal Jaworowski 
41bd37530eSRafal Jaworowski /* eTSEC ID */
42bd37530eSRafal Jaworowski #define	TSEC_ETSEC_ID		0x0124
43bd37530eSRafal Jaworowski 
44bd37530eSRafal Jaworowski /* Frame sizes */
45bd37530eSRafal Jaworowski #define	TSEC_MIN_FRAME_SIZE	64
46bd37530eSRafal Jaworowski #define	TSEC_MAX_FRAME_SIZE	9600
47bd37530eSRafal Jaworowski 
482c0dbbcbSJustin Hibbits struct tsec_bufmap {
492c0dbbcbSJustin Hibbits 	bus_dmamap_t	map;
502c0dbbcbSJustin Hibbits 	int		map_initialized;
512c0dbbcbSJustin Hibbits 	struct mbuf	*mbuf;
522c0dbbcbSJustin Hibbits };
532c0dbbcbSJustin Hibbits 
5467196661SRafal Jaworowski struct tsec_softc {
5567196661SRafal Jaworowski 	/* XXX MII bus requires that struct ifnet is first!!! */
5647842ecfSJustin Hibbits 	if_t		tsec_ifp;
5767196661SRafal Jaworowski 
5867196661SRafal Jaworowski 	struct mtx	transmit_lock;	/* transmitter lock */
5967196661SRafal Jaworowski 	struct mtx	receive_lock;	/* receiver lock */
6067196661SRafal Jaworowski 
61d1d3233eSRafal Jaworowski 	phandle_t	node;
6267196661SRafal Jaworowski 	device_t	dev;
6367196661SRafal Jaworowski 	device_t	tsec_miibus;
6467196661SRafal Jaworowski 	struct mii_data	*tsec_mii;	/* MII media control */
6567196661SRafal Jaworowski 	int		tsec_link;
6667196661SRafal Jaworowski 
6767196661SRafal Jaworowski 	bus_dma_tag_t	tsec_tx_dtag;	/* TX descriptors tag */
6867196661SRafal Jaworowski 	bus_dmamap_t	tsec_tx_dmap;	/* TX descriptors map */
692c0dbbcbSJustin Hibbits 	bus_dma_tag_t	tsec_tx_mtag;	/* TX mbufs tag */
702c0dbbcbSJustin Hibbits 	uint32_t	tx_idx_head;	/* TX head descriptor/bufmap index */
712c0dbbcbSJustin Hibbits 	uint32_t	tx_idx_tail;	/* TX tail descriptor/bufmap index */
722c0dbbcbSJustin Hibbits 	struct tsec_desc *tsec_tx_vaddr;/* virtual address of TX descriptors */
732c0dbbcbSJustin Hibbits 	struct tsec_bufmap tx_bufmap[TSEC_TX_NUM_DESC];
7467196661SRafal Jaworowski 
752c0dbbcbSJustin Hibbits 	bus_dma_tag_t	tsec_rx_mtag;	/* TX mbufs tag */
7667196661SRafal Jaworowski 	bus_dma_tag_t	tsec_rx_dtag;	/* RX descriptors tag */
7767196661SRafal Jaworowski 	bus_dmamap_t	tsec_rx_dmap;	/* RX descriptors map */
7867196661SRafal Jaworowski 	struct tsec_desc *tsec_rx_vaddr; /* vadress of RX descriptors */
7967196661SRafal Jaworowski 
8067196661SRafal Jaworowski 	struct rx_data_type {
8167196661SRafal Jaworowski 		bus_dmamap_t	map;	/* mbuf map */
8267196661SRafal Jaworowski 		struct mbuf	*mbuf;
83453130d9SPedro F. Giffuni 		uint32_t	paddr;	/* DMA address of buffer */
8467196661SRafal Jaworowski 	} rx_data[TSEC_RX_NUM_DESC];
8567196661SRafal Jaworowski 
8667196661SRafal Jaworowski 	uint32_t	rx_cur_desc_cnt;
8767196661SRafal Jaworowski 
8867196661SRafal Jaworowski 	struct resource	*sc_rres;	/* register resource */
8967196661SRafal Jaworowski 	int		sc_rrid;	/* register rid */
9067196661SRafal Jaworowski 	struct {
9167196661SRafal Jaworowski 		bus_space_tag_t bst;
9267196661SRafal Jaworowski 		bus_space_handle_t bsh;
9367196661SRafal Jaworowski 	} sc_bas;
9467196661SRafal Jaworowski 
9567196661SRafal Jaworowski 	struct resource *sc_transmit_ires;
9667196661SRafal Jaworowski 	void		*sc_transmit_ihand;
9767196661SRafal Jaworowski 	int		sc_transmit_irid;
9867196661SRafal Jaworowski 	struct resource *sc_receive_ires;
9967196661SRafal Jaworowski 	void		*sc_receive_ihand;
10067196661SRafal Jaworowski 	int		sc_receive_irid;
10167196661SRafal Jaworowski 	struct resource *sc_error_ires;
10267196661SRafal Jaworowski 	void		*sc_error_ihand;
10367196661SRafal Jaworowski 	int		sc_error_irid;
10467196661SRafal Jaworowski 
10567196661SRafal Jaworowski 	int		tsec_if_flags;
106bd37530eSRafal Jaworowski 	int		is_etsec;
10767196661SRafal Jaworowski 
1085432bd9fSRafal Jaworowski 	/* Watchdog and MII tick related */
1095432bd9fSRafal Jaworowski 	struct callout	tsec_callout;
1105432bd9fSRafal Jaworowski 	int		tsec_watchdog;
111772619e1SRafal Jaworowski 
112bd37530eSRafal Jaworowski 	/* interrupt coalescing */
113bd37530eSRafal Jaworowski 	struct mtx	ic_lock;
114bd37530eSRafal Jaworowski 	uint32_t	rx_ic_time;	/* RW, valid values 0..65535 */
115bd37530eSRafal Jaworowski 	uint32_t	rx_ic_count;	/* RW, valid values 0..255 */
116bd37530eSRafal Jaworowski 	uint32_t	tx_ic_time;
117bd37530eSRafal Jaworowski 	uint32_t	tx_ic_count;
118bd37530eSRafal Jaworowski 
119bd37530eSRafal Jaworowski 	/* currently received frame */
120bd37530eSRafal Jaworowski 	struct mbuf	*frame;
121d1d3233eSRafal Jaworowski 
122d1d3233eSRafal Jaworowski 	int		phyaddr;
123629aa519SNathan Whitehorn 	bus_space_tag_t phy_bst;
124629aa519SNathan Whitehorn 	bus_space_handle_t phy_bsh;
125e150821aSJustin Hibbits 	int		phy_regoff;
1262c0dbbcbSJustin Hibbits 
1272c0dbbcbSJustin Hibbits 	uint32_t	tsec_rx_raddr;	/* real address of RX descriptors */
1282c0dbbcbSJustin Hibbits 	uint32_t	tsec_tx_raddr;	/* real address of TX descriptors */
12967196661SRafal Jaworowski };
13067196661SRafal Jaworowski 
13167196661SRafal Jaworowski /* interface to get/put generic objects */
13267196661SRafal Jaworowski #define TSEC_CNT_INIT(cnt, wrap) ((cnt) = ((wrap) - 1))
13367196661SRafal Jaworowski 
13467196661SRafal Jaworowski #define TSEC_INC(count, wrap) (count = ((count) + 1) & ((wrap) - 1))
13567196661SRafal Jaworowski 
13667196661SRafal Jaworowski #define TSEC_GET_GENERIC(hand, tab, count, wrap) \
13767196661SRafal Jaworowski 		((hand)->tab[TSEC_INC((hand)->count, wrap)])
13867196661SRafal Jaworowski 
13967196661SRafal Jaworowski #define TSEC_PUT_GENERIC(hand, tab, count, wrap, val)	\
14067196661SRafal Jaworowski 		((hand)->tab[TSEC_INC((hand)->count, wrap)] = val)
14167196661SRafal Jaworowski 
14267196661SRafal Jaworowski #define TSEC_BACK_GENERIC(sc, count, wrap) do {			\
14367196661SRafal Jaworowski 		if ((sc)->count > 0)				\
14467196661SRafal Jaworowski 			(sc)->count--;				\
14567196661SRafal Jaworowski 		else						\
14667196661SRafal Jaworowski 			(sc)->count = (wrap) - 1;		\
14767196661SRafal Jaworowski } while (0)
14867196661SRafal Jaworowski 
14967196661SRafal Jaworowski #define TSEC_FREE_TX_DESC(sc) \
1502c0dbbcbSJustin Hibbits     (((sc)->tx_idx_tail - (sc)->tx_idx_head - 1) & (TSEC_TX_NUM_DESC - 1))
15167196661SRafal Jaworowski 
15267196661SRafal Jaworowski /* interface for manage rx tsec_desc */
15367196661SRafal Jaworowski #define TSEC_RX_DESC_CNT_INIT(sc) do {					\
15467196661SRafal Jaworowski 		TSEC_CNT_INIT((sc)->rx_cur_desc_cnt, TSEC_RX_NUM_DESC);	\
15567196661SRafal Jaworowski } while (0)
15667196661SRafal Jaworowski 
15767196661SRafal Jaworowski #define TSEC_GET_CUR_RX_DESC(sc)					\
15867196661SRafal Jaworowski 		&TSEC_GET_GENERIC(sc, tsec_rx_vaddr, rx_cur_desc_cnt,	\
15967196661SRafal Jaworowski 		TSEC_RX_NUM_DESC)
16067196661SRafal Jaworowski 
16167196661SRafal Jaworowski #define TSEC_BACK_CUR_RX_DESC(sc) \
16267196661SRafal Jaworowski 		TSEC_BACK_GENERIC(sc, rx_cur_desc_cnt, TSEC_RX_NUM_DESC)
16367196661SRafal Jaworowski 
16467196661SRafal Jaworowski #define TSEC_GET_CUR_RX_DESC_CNT(sc) \
16567196661SRafal Jaworowski 		((sc)->rx_cur_desc_cnt)
16667196661SRafal Jaworowski 
16767196661SRafal Jaworowski /* init all counters (for init only!) */
16867196661SRafal Jaworowski #define TSEC_TX_RX_COUNTERS_INIT(sc) do {	\
1692c0dbbcbSJustin Hibbits 		sc->tx_idx_head = 0;		\
1702c0dbbcbSJustin Hibbits 		sc->tx_idx_tail = 0;		\
17167196661SRafal Jaworowski 		TSEC_RX_DESC_CNT_INIT(sc);	\
17267196661SRafal Jaworowski } while (0)
17367196661SRafal Jaworowski 
17467196661SRafal Jaworowski /* read/write bus functions */
17567196661SRafal Jaworowski #define TSEC_READ(sc, reg)		\
17667196661SRafal Jaworowski 		bus_space_read_4((sc)->sc_bas.bst, (sc)->sc_bas.bsh, (reg))
17767196661SRafal Jaworowski #define TSEC_WRITE(sc, reg, val)	\
17867196661SRafal Jaworowski 		bus_space_write_4((sc)->sc_bas.bst, (sc)->sc_bas.bsh, (reg), (val))
17967196661SRafal Jaworowski 
180629aa519SNathan Whitehorn extern struct mtx tsec_phy_mtx;
181629aa519SNathan Whitehorn #define TSEC_PHY_LOCK(sc)	mtx_lock(&tsec_phy_mtx)
182629aa519SNathan Whitehorn #define TSEC_PHY_UNLOCK(sc)	mtx_unlock(&tsec_phy_mtx)
183629aa519SNathan Whitehorn #define TSEC_PHY_READ(sc, reg)		\
184e150821aSJustin Hibbits 		bus_space_read_4((sc)->phy_bst, (sc)->phy_bsh, \
185e150821aSJustin Hibbits 			(reg) + (sc)->phy_regoff)
186629aa519SNathan Whitehorn #define TSEC_PHY_WRITE(sc, reg, val)	\
187e150821aSJustin Hibbits 		bus_space_write_4((sc)->phy_bst, (sc)->phy_bsh, \
188e150821aSJustin Hibbits 			(reg) + (sc)->phy_regoff, (val))
189629aa519SNathan Whitehorn 
19067196661SRafal Jaworowski /* Lock for transmitter */
19167196661SRafal Jaworowski #define TSEC_TRANSMIT_LOCK(sc) do {					\
19267196661SRafal Jaworowski 		mtx_assert(&(sc)->receive_lock, MA_NOTOWNED);		\
19367196661SRafal Jaworowski 		mtx_lock(&(sc)->transmit_lock);				\
19467196661SRafal Jaworowski } while (0)
19567196661SRafal Jaworowski 
19667196661SRafal Jaworowski #define TSEC_TRANSMIT_UNLOCK(sc)	mtx_unlock(&(sc)->transmit_lock)
19767196661SRafal Jaworowski #define TSEC_TRANSMIT_LOCK_ASSERT(sc)	mtx_assert(&(sc)->transmit_lock, MA_OWNED)
19867196661SRafal Jaworowski 
19967196661SRafal Jaworowski /* Lock for receiver */
20067196661SRafal Jaworowski #define TSEC_RECEIVE_LOCK(sc) do {					\
20167196661SRafal Jaworowski 		mtx_assert(&(sc)->transmit_lock, MA_NOTOWNED);		\
20267196661SRafal Jaworowski 		mtx_lock(&(sc)->receive_lock);				\
20367196661SRafal Jaworowski } while (0)
20467196661SRafal Jaworowski 
20567196661SRafal Jaworowski #define TSEC_RECEIVE_UNLOCK(sc)		mtx_unlock(&(sc)->receive_lock)
20667196661SRafal Jaworowski #define TSEC_RECEIVE_LOCK_ASSERT(sc)	mtx_assert(&(sc)->receive_lock, MA_OWNED)
20767196661SRafal Jaworowski 
208bd37530eSRafal Jaworowski /* Lock for interrupts coalescing */
209bd37530eSRafal Jaworowski #define	TSEC_IC_LOCK(sc) do {						\
210bd37530eSRafal Jaworowski 		mtx_assert(&(sc)->ic_lock, MA_NOTOWNED);		\
211bd37530eSRafal Jaworowski 		mtx_lock(&(sc)->ic_lock);				\
212bd37530eSRafal Jaworowski } while (0)
213bd37530eSRafal Jaworowski 
214bd37530eSRafal Jaworowski #define	TSEC_IC_UNLOCK(sc)		mtx_unlock(&(sc)->ic_lock)
215bd37530eSRafal Jaworowski #define	TSEC_IC_LOCK_ASSERT(sc)		mtx_assert(&(sc)->ic_lock, MA_OWNED)
216bd37530eSRafal Jaworowski 
21767196661SRafal Jaworowski /* Global tsec lock (with all locks) */
21867196661SRafal Jaworowski #define TSEC_GLOBAL_LOCK(sc) do {					\
21967196661SRafal Jaworowski 		if ((mtx_owned(&(sc)->transmit_lock) ? 1 : 0) !=	\
22067196661SRafal Jaworowski 			(mtx_owned(&(sc)->receive_lock) ? 1 : 0)) {	\
22167196661SRafal Jaworowski 			panic("tsec deadlock possibility detection!");	\
22267196661SRafal Jaworowski 		}							\
22367196661SRafal Jaworowski 		mtx_lock(&(sc)->transmit_lock);				\
22467196661SRafal Jaworowski 		mtx_lock(&(sc)->receive_lock);				\
22567196661SRafal Jaworowski } while (0)
22667196661SRafal Jaworowski 
22767196661SRafal Jaworowski #define TSEC_GLOBAL_UNLOCK(sc) do {		\
22867196661SRafal Jaworowski 		TSEC_RECEIVE_UNLOCK(sc);	\
22967196661SRafal Jaworowski 		TSEC_TRANSMIT_UNLOCK(sc);	\
23067196661SRafal Jaworowski } while (0)
23167196661SRafal Jaworowski 
23267196661SRafal Jaworowski #define TSEC_GLOBAL_LOCK_ASSERT(sc) do {	\
23367196661SRafal Jaworowski 		TSEC_TRANSMIT_LOCK_ASSERT(sc);	\
23467196661SRafal Jaworowski 		TSEC_RECEIVE_LOCK_ASSERT(sc);	\
23567196661SRafal Jaworowski } while (0)
23667196661SRafal Jaworowski 
23767196661SRafal Jaworowski /* From global to {transmit,receive} */
23867196661SRafal Jaworowski #define TSEC_GLOBAL_TO_TRANSMIT_LOCK(sc) do {	\
23967196661SRafal Jaworowski 		mtx_unlock(&(sc)->receive_lock);\
24067196661SRafal Jaworowski } while (0)
24167196661SRafal Jaworowski 
24267196661SRafal Jaworowski #define TSEC_GLOBAL_TO_RECEIVE_LOCK(sc) do {	\
24367196661SRafal Jaworowski 		mtx_unlock(&(sc)->transmit_lock);\
24467196661SRafal Jaworowski } while (0)
24567196661SRafal Jaworowski 
24667196661SRafal Jaworowski struct tsec_desc {
24767196661SRafal Jaworowski 	volatile uint16_t	flags;	/* descriptor flags */
24867196661SRafal Jaworowski 	volatile uint16_t	length;	/* buffer length */
24967196661SRafal Jaworowski 	volatile uint32_t	bufptr;	/* buffer pointer */
25067196661SRafal Jaworowski };
25167196661SRafal Jaworowski 
25267196661SRafal Jaworowski #define TSEC_READ_RETRY	10000
25367196661SRafal Jaworowski #define TSEC_READ_DELAY	100
254321e12c8SRafal Jaworowski 
255bd37530eSRafal Jaworowski /* Structures and defines for TCP/IP Off-load */
256bd37530eSRafal Jaworowski struct tsec_tx_fcb {
257bd37530eSRafal Jaworowski 	volatile uint16_t	flags;
258bd37530eSRafal Jaworowski 	volatile uint8_t	l4_offset;
259bd37530eSRafal Jaworowski 	volatile uint8_t	l3_offset;
260bd37530eSRafal Jaworowski 	volatile uint16_t	ph_chsum;
261bd37530eSRafal Jaworowski 	volatile uint16_t	vlan;
262bd37530eSRafal Jaworowski };
263bd37530eSRafal Jaworowski 
264bd37530eSRafal Jaworowski struct tsec_rx_fcb {
265bd37530eSRafal Jaworowski 	volatile uint16_t	flags;
266bd37530eSRafal Jaworowski 	volatile uint8_t	rq_index;
267bd37530eSRafal Jaworowski 	volatile uint8_t	protocol;
268bd37530eSRafal Jaworowski 	volatile uint16_t	unused;
269bd37530eSRafal Jaworowski 	volatile uint16_t	vlan;
270bd37530eSRafal Jaworowski };
271bd37530eSRafal Jaworowski 
272bd37530eSRafal Jaworowski #define	TSEC_CHECKSUM_FEATURES	(CSUM_IP | CSUM_TCP | CSUM_UDP)
273bd37530eSRafal Jaworowski 
274bd37530eSRafal Jaworowski #define	TSEC_TX_FCB_IP4		TSEC_TX_FCB_L3_IS_IP
275bd37530eSRafal Jaworowski #define	TSEC_TX_FCB_IP6		(TSEC_TX_FCB_L3_IS_IP | TSEC_TX_FCB_L3_IS_IP6)
276bd37530eSRafal Jaworowski 
277bd37530eSRafal Jaworowski #define	TSEC_TX_FCB_TCP		TSEC_TX_FCB_L4_IS_TCP_UDP
278bd37530eSRafal Jaworowski #define	TSEC_TX_FCB_UDP		(TSEC_TX_FCB_L4_IS_TCP_UDP | TSEC_TX_FCB_L4_IS_UDP)
279bd37530eSRafal Jaworowski 
280bd37530eSRafal Jaworowski #define	TSEC_RX_FCB_IP_CSUM_CHECKED(flags)					\
281bd37530eSRafal Jaworowski 		((flags & (TSEC_RX_FCB_IP_FOUND | TSEC_RX_FCB_IP6_FOUND |	\
282bd37530eSRafal Jaworowski 		TSEC_RX_FCB_IP_CSUM | TSEC_RX_FCB_PARSE_ERROR))			\
283bd37530eSRafal Jaworowski 		 == (TSEC_RX_FCB_IP_FOUND | TSEC_RX_FCB_IP_CSUM))
284bd37530eSRafal Jaworowski 
285bd37530eSRafal Jaworowski #define TSEC_RX_FCB_TCP_UDP_CSUM_CHECKED(flags)					\
286bd37530eSRafal Jaworowski 		((flags & (TSEC_RX_FCB_TCP_UDP_FOUND | TSEC_RX_FCB_TCP_UDP_CSUM	\
287bd37530eSRafal Jaworowski 		| TSEC_RX_FCB_PARSE_ERROR))					\
288bd37530eSRafal Jaworowski 		== (TSEC_RX_FCB_TCP_UDP_FOUND | TSEC_RX_FCB_TCP_UDP_CSUM))
289bd37530eSRafal Jaworowski 
290321e12c8SRafal Jaworowski /* Prototypes */
291321e12c8SRafal Jaworowski int	tsec_attach(struct tsec_softc *sc);
292321e12c8SRafal Jaworowski int	tsec_detach(struct tsec_softc *sc);
293321e12c8SRafal Jaworowski 
294321e12c8SRafal Jaworowski void	tsec_error_intr(void *arg);
295321e12c8SRafal Jaworowski void	tsec_receive_intr(void *arg);
296321e12c8SRafal Jaworowski void	tsec_transmit_intr(void *arg);
297321e12c8SRafal Jaworowski 
298321e12c8SRafal Jaworowski int	tsec_miibus_readreg(device_t dev, int phy, int reg);
299661ee6eeSRafal Jaworowski int	tsec_miibus_writereg(device_t dev, int phy, int reg, int value);
300321e12c8SRafal Jaworowski void	tsec_miibus_statchg(device_t dev);
301321e12c8SRafal Jaworowski int	tsec_resume(device_t dev); /* XXX */
302661ee6eeSRafal Jaworowski int	tsec_shutdown(device_t dev);
303321e12c8SRafal Jaworowski int	tsec_suspend(device_t dev); /* XXX */
304321e12c8SRafal Jaworowski 
305321e12c8SRafal Jaworowski void	tsec_get_hwaddr(struct tsec_softc *sc, uint8_t *addr);
306321e12c8SRafal Jaworowski 
30764f90c9dSRafal Jaworowski #endif /* _IF_TSEC_H */
308