xref: /freebsd/sys/dev/ae/if_aevar.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1ba26d470SStanislav Sedov /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4ba26d470SStanislav Sedov  * Copyright (c) 2008 Stanislav Sedov <stas@FreeBSD.org>.
5ba26d470SStanislav Sedov  * All rights reserved.
6ba26d470SStanislav Sedov  *
7ba26d470SStanislav Sedov  * Redistribution and use in source and binary forms, with or without
8ba26d470SStanislav Sedov  * modification, are permitted provided that the following conditions
9ba26d470SStanislav Sedov  * are met:
10ba26d470SStanislav Sedov  * 1. Redistributions of source code must retain the above copyright
11ba26d470SStanislav Sedov  *    notice, this list of conditions and the following disclaimer.
12ba26d470SStanislav Sedov  * 2. Redistributions in binary form must reproduce the above copyright
13ba26d470SStanislav Sedov  *    notice, this list of conditions and the following disclaimer in the
14ba26d470SStanislav Sedov  *    documentation and/or other materials provided with the distribution.
15ba26d470SStanislav Sedov  *
16ba26d470SStanislav Sedov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17ba26d470SStanislav Sedov  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18ba26d470SStanislav Sedov  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19ba26d470SStanislav Sedov  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20ba26d470SStanislav Sedov  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21ba26d470SStanislav Sedov  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22ba26d470SStanislav Sedov  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23ba26d470SStanislav Sedov  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24ba26d470SStanislav Sedov  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25ba26d470SStanislav Sedov  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26ba26d470SStanislav Sedov  */
27ba26d470SStanislav Sedov 
28ba26d470SStanislav Sedov #ifndef IF_AEVAR_H
29ba26d470SStanislav Sedov #define IF_AEVAR_H
30ba26d470SStanislav Sedov 
31ba26d470SStanislav Sedov /*
32ba26d470SStanislav Sedov  * Supported chips identifiers.
33ba26d470SStanislav Sedov */
34ba26d470SStanislav Sedov #define	VENDORID_ATTANSIC	0x1969
35ba26d470SStanislav Sedov #define	DEVICEID_ATTANSIC_L2	0x2048
36ba26d470SStanislav Sedov 
37ba26d470SStanislav Sedov /* How much to wait for reset to complete (10 microsecond units). */
38ba26d470SStanislav Sedov #define	AE_RESET_TIMEOUT	100
39ba26d470SStanislav Sedov 
40ba26d470SStanislav Sedov /* How much to wait for device to enter idle state (100 microsecond units). */
41ba26d470SStanislav Sedov #define	AE_IDLE_TIMEOUT		100
42ba26d470SStanislav Sedov 
43ba26d470SStanislav Sedov /* How much to wait for MDIO to do the work (2 microsecond units). */
44ba26d470SStanislav Sedov #define	AE_MDIO_TIMEOUT		10
45ba26d470SStanislav Sedov 
46ba26d470SStanislav Sedov /* How much to wait for VPD reading operation to complete (2 ms units). */
47ba26d470SStanislav Sedov #define AE_VPD_TIMEOUT		10
48ba26d470SStanislav Sedov 
49ba26d470SStanislav Sedov /* How much to wait for send operation to complete (HZ units). */
50ba26d470SStanislav Sedov #define	AE_TX_TIMEOUT		5
51ba26d470SStanislav Sedov 
52ba26d470SStanislav Sedov /* Default PHY address. */
53ba26d470SStanislav Sedov #define	AE_PHYADDR_DEFAULT	0
54ba26d470SStanislav Sedov 
55ba26d470SStanislav Sedov /* Tx packet descriptor header format. */
56ba26d470SStanislav Sedov typedef struct ae_txd {
57ba26d470SStanislav Sedov 	uint16_t	len;
58ba26d470SStanislav Sedov 	uint16_t	vlan;
59ba26d470SStanislav Sedov } __packed ae_txd_t;
60ba26d470SStanislav Sedov 
61ba26d470SStanislav Sedov /* Tx status descriptor format. */
62ba26d470SStanislav Sedov typedef struct ae_txs {
63ba26d470SStanislav Sedov 	uint16_t	len;
64ba26d470SStanislav Sedov 	uint16_t	flags;
65ba26d470SStanislav Sedov } __packed ae_txs_t;
66ba26d470SStanislav Sedov 
67ba26d470SStanislav Sedov /* Rx packet descriptor format. */
68ba26d470SStanislav Sedov typedef struct ae_rxd {
69ba26d470SStanislav Sedov 	uint16_t	len;
70ba26d470SStanislav Sedov 	uint16_t	flags;
71ba26d470SStanislav Sedov 	uint16_t	vlan;
72ba26d470SStanislav Sedov 	uint16_t	__pad;
73ba26d470SStanislav Sedov 	uint8_t		data[1528];
74ba26d470SStanislav Sedov } __packed ae_rxd_t;
75ba26d470SStanislav Sedov 
76ba26d470SStanislav Sedov /* Statistics. */
77ba26d470SStanislav Sedov typedef struct ae_stats {
78ba26d470SStanislav Sedov 	uint32_t	rx_bcast;
79ba26d470SStanislav Sedov 	uint32_t	rx_mcast;
80ba26d470SStanislav Sedov 	uint32_t	rx_pause;
81ba26d470SStanislav Sedov 	uint32_t	rx_ctrl;
82ba26d470SStanislav Sedov 	uint32_t	rx_crcerr;
83ba26d470SStanislav Sedov 	uint32_t	rx_codeerr;
84ba26d470SStanislav Sedov 	uint32_t	rx_runt;
85ba26d470SStanislav Sedov 	uint32_t	rx_frag;
86ba26d470SStanislav Sedov 	uint32_t	rx_trunc;
87ba26d470SStanislav Sedov 	uint32_t	rx_align;
88ba26d470SStanislav Sedov 	uint32_t	tx_bcast;
89ba26d470SStanislav Sedov 	uint32_t	tx_mcast;
90ba26d470SStanislav Sedov 	uint32_t	tx_pause;
91ba26d470SStanislav Sedov 	uint32_t	tx_ctrl;
92ba26d470SStanislav Sedov 	uint32_t	tx_defer;
93ba26d470SStanislav Sedov 	uint32_t	tx_excdefer;
94ba26d470SStanislav Sedov 	uint32_t	tx_singlecol;
95ba26d470SStanislav Sedov 	uint32_t	tx_multicol;
96ba26d470SStanislav Sedov 	uint32_t	tx_latecol;
97ba26d470SStanislav Sedov 	uint32_t	tx_abortcol;
98ba26d470SStanislav Sedov 	uint32_t	tx_underrun;
99ba26d470SStanislav Sedov } ae_stats_t;
100ba26d470SStanislav Sedov 
101ba26d470SStanislav Sedov /* Software state structure. */
102ba26d470SStanislav Sedov typedef struct ae_softc	{
1033f14814fSJustin Hibbits 	if_t			ifp;
104ba26d470SStanislav Sedov 	device_t		dev;
105ba26d470SStanislav Sedov 	device_t		miibus;
106ba26d470SStanislav Sedov 	struct resource		*mem[1];
107ba26d470SStanislav Sedov 	struct resource_spec	*spec_mem;
108ba26d470SStanislav Sedov 	struct resource		*irq[1];
109ba26d470SStanislav Sedov 	struct resource_spec	*spec_irq;
110ba26d470SStanislav Sedov 	void			*intrhand;
111ba26d470SStanislav Sedov 
112ba26d470SStanislav Sedov 	struct mtx		mtx;
113ba26d470SStanislav Sedov 
114ba26d470SStanislav Sedov 	uint8_t			eaddr[ETHER_ADDR_LEN];
115ba26d470SStanislav Sedov 	uint8_t			flags;
116ba26d470SStanislav Sedov 	int			if_flags;
117ba26d470SStanislav Sedov 
118ba26d470SStanislav Sedov 	struct callout		tick_ch;
119ba26d470SStanislav Sedov 
120ba26d470SStanislav Sedov 	/* Tasks. */
121ba26d470SStanislav Sedov 	struct task		int_task;
122ba26d470SStanislav Sedov 	struct task		link_task;
123ba26d470SStanislav Sedov 	struct taskqueue	*tq;
124ba26d470SStanislav Sedov 
125ba26d470SStanislav Sedov 	/* DMA tags. */
126ba26d470SStanislav Sedov 	bus_dma_tag_t		dma_parent_tag;
127ba26d470SStanislav Sedov 	bus_dma_tag_t		dma_rxd_tag;
128ba26d470SStanislav Sedov 	bus_dma_tag_t		dma_txd_tag;
129ba26d470SStanislav Sedov 	bus_dma_tag_t		dma_txs_tag;
130ba26d470SStanislav Sedov 	bus_dmamap_t		dma_rxd_map;
131ba26d470SStanislav Sedov 	bus_dmamap_t		dma_txd_map;
132ba26d470SStanislav Sedov 	bus_dmamap_t		dma_txs_map;
133ba26d470SStanislav Sedov 
134ba26d470SStanislav Sedov 	bus_addr_t		dma_rxd_busaddr;
135ba26d470SStanislav Sedov 	bus_addr_t		dma_txd_busaddr;
136ba26d470SStanislav Sedov 	bus_addr_t		dma_txs_busaddr;
137ba26d470SStanislav Sedov 
138ba26d470SStanislav Sedov 	char			*rxd_base_dma;	/* Start of allocated area. */
139ba26d470SStanislav Sedov 	ae_rxd_t		*rxd_base;	/* Start of RxD ring. */
140ba26d470SStanislav Sedov 	char			*txd_base;	/* Start of TxD ring. */
141ba26d470SStanislav Sedov 	ae_txs_t		*txs_base;	/* Start of TxS ring. */
142ba26d470SStanislav Sedov 
143ba26d470SStanislav Sedov 	/* Ring pointers. */
144ba26d470SStanislav Sedov 	unsigned int		rxd_cur;
145ba26d470SStanislav Sedov 	unsigned int		txd_cur;
146ba26d470SStanislav Sedov 	unsigned int		txs_cur;
147ba26d470SStanislav Sedov 	unsigned int		txs_ack;
148ba26d470SStanislav Sedov 	unsigned int		txd_ack;
149ba26d470SStanislav Sedov 
150ba26d470SStanislav Sedov 	int			tx_inproc;	/* Active Tx frames in ring. */
151ba26d470SStanislav Sedov 	int			wd_timer;
152ba26d470SStanislav Sedov 
153ba26d470SStanislav Sedov 	ae_stats_t		stats;
154ba26d470SStanislav Sedov } ae_softc_t;
155ba26d470SStanislav Sedov 
156ba26d470SStanislav Sedov #define	AE_LOCK(_sc)		mtx_lock(&(_sc)->mtx)
157ba26d470SStanislav Sedov #define	AE_UNLOCK(_sc)		mtx_unlock(&(_sc)->mtx)
158ba26d470SStanislav Sedov #define	AE_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->mtx, MA_OWNED)
159ba26d470SStanislav Sedov 
160ba26d470SStanislav Sedov #define	BUS_ADDR_LO(x)		((uint64_t) (x) & 0xFFFFFFFF)
161ba26d470SStanislav Sedov #define	BUS_ADDR_HI(x)		((uint64_t) (x) >> 32)
162ba26d470SStanislav Sedov 
163ba26d470SStanislav Sedov #define	AE_FLAG_LINK		0x01	/* Has link. */
164ba26d470SStanislav Sedov #define	AE_FLAG_DETACH		0x02	/* Is detaching. */
165ba26d470SStanislav Sedov #define	AE_FLAG_TXAVAIL		0x04	/* Tx'es available. */
166ba26d470SStanislav Sedov #define	AE_FLAG_MSI		0x08	/* Using MSI. */
167ba26d470SStanislav Sedov #define	AE_FLAG_PMG		0x10	/* Supports PCI power management. */
168ba26d470SStanislav Sedov 
169ba26d470SStanislav Sedov #endif	/* IF_AEVAR_H */
170