1210040Scognet/*
2210040Scognet * $FreeBSD: releng/11.0/sys/arm/at91/if_macbvar.h 290509 2015-11-07 20:02:07Z imp $
3210040Scognet */
4210040Scognet
5210040Scognet#ifndef	_IF_MACB_H
6210040Scognet#define	_IF_MACB_H
7210040Scognet
8210040Scognet#define	MACB_MAX_TX_BUFFERS	64
9210040Scognet#define	MACB_MAX_RX_BUFFERS	256
10210040Scognet
11210040Scognet#define MAX_FRAGMENT		20
12210040Scognet#define DATA_SIZE		128
13210040Scognet
14210040Scognet#define	MACB_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
15210040Scognet
16210040Scognet#define MACB_TIMEOUT		1000
17210040Scognet
18210040Scognetstruct eth_tx_desc {
19210040Scognet	uint32_t		addr;
20210040Scognet	uint32_t		flags;
21258780Seadler#define TD_OWN		(1U << 31)
22210040Scognet#define TD_LAST		(1 << 15)
23210040Scognet#define	TD_WRAP_MASK		(1 << 30)
24210040Scognet};
25210040Scognet
26210040Scognetstruct eth_rx_desc {
27210040Scognet	uint32_t		addr;
28210040Scognet#define	RD_LEN_MASK		0x7ff
29210040Scognet#define	RD_WRAP_MASK		0x00000002
30210040Scognet#define	RD_OWN			0x00000001
31210040Scognet
32210040Scognet	uint32_t		flags;
33258780Seadler#define RD_BROADCAST		(1U << 31)
34210040Scognet#define RD_MULTICAST		(1 << 30)
35210040Scognet#define RD_UNICAST		(1 << 29)
36210040Scognet#define RD_EXTERNAL		(1 << 28)
37210040Scognet#define RD_TYPE_ID		(1 << 22)
38210040Scognet#define RD_PRIORITY		(1 << 20)
39210040Scognet#define RD_VLAN		(1 << 21)
40210040Scognet#define RD_CONCAT		(1 << 16)
41210040Scognet#define RD_EOF		(1 << 15)
42210040Scognet#define RD_SOF		(1 << 14)
43210040Scognet#define RD_OFFSET_MASK		(1 << 13)|(1 << 12)
44210040Scognet#define RD_LENGTH_MASK		(0x00000FFF)
45210040Scognet
46210040Scognet};
47210040Scognet
48210040Scognet
49210040Scognetstruct rx_desc_info {
50210040Scognet	struct mbuf *buff;
51210040Scognet	bus_dmamap_t dmamap;
52210040Scognet};
53210040Scognet
54210040Scognetstruct tx_desc_info {
55210040Scognet	struct mbuf *buff;
56210040Scognet	bus_dmamap_t dmamap;
57210040Scognet};
58210040Scognet
59210040Scognet
60210040Scognetstruct macb_chain_data{
61210040Scognet	struct mbuf		*rxhead;
62210040Scognet	struct mbuf		*rxtail;
63210040Scognet};
64210040Scognet
65210040Scognetstruct macb_softc
66210040Scognet{
67210040Scognet	struct ifnet *ifp;		/* ifnet pointer */
68210040Scognet	struct mtx sc_mtx;		/* global mutex */
69210040Scognet
70210040Scognet	bus_dma_tag_t	sc_parent_tag;	/* parent bus DMA tag */
71210040Scognet
72210040Scognet	device_t dev;			/* Myself */
73210040Scognet	device_t miibus;		/* My child miibus */
74210040Scognet	void *intrhand;			/* Interrupt handle */
75210040Scognet	void *intrhand_qf;		/* queue full */
76210040Scognet	void *intrhand_tx;		/* tx complete */
77210040Scognet	void *intrhand_status;		/* error status */
78210040Scognet
79210040Scognet	struct resource *irq_res;	/* transmit */
80210040Scognet	struct resource *irq_res_rec;	/* receive */
81210040Scognet	struct resource *irq_res_qf;	/* queue full */
82210040Scognet	struct resource *irq_res_status; /* status */
83210040Scognet
84210040Scognet	struct resource	*mem_res;	/* Memory resource */
85210040Scognet
86210040Scognet	struct callout tick_ch;		/* Tick callout */
87210040Scognet
88210040Scognet	struct taskqueue *sc_tq;
89210040Scognet	struct task	sc_intr_task;
90210040Scognet	struct task	sc_tx_task;
91210040Scognet	struct task	sc_link_task;
92210040Scognet
93210040Scognet	bus_dmamap_t	dmamap_ring_tx;
94210040Scognet	bus_dmamap_t	dmamap_ring_rx;
95210040Scognet
96210040Scognet	/*dma tag for ring*/
97210040Scognet	bus_dma_tag_t	dmatag_ring_tx;
98210040Scognet	bus_dma_tag_t	dmatag_ring_rx;
99210040Scognet
100210040Scognet	/*dma tag for data*/
101210040Scognet	bus_dma_tag_t	dmatag_data_tx;
102210040Scognet	bus_dma_tag_t	dmatag_data_rx;
103210040Scognet
104210040Scognet	/*the ring*/
105210040Scognet	struct eth_tx_desc	*desc_tx;
106210040Scognet	struct eth_rx_desc	*desc_rx;
107210040Scognet
108210040Scognet	/*ring physical address*/
109210040Scognet	bus_addr_t	ring_paddr_tx;
110210040Scognet	bus_addr_t	ring_paddr_rx;
111210040Scognet
112210040Scognet	/*index of last received descriptor*/
113210040Scognet	int		rx_cons;
114210040Scognet	struct rx_desc_info rx_desc[MACB_MAX_RX_BUFFERS];
115210040Scognet
116210040Scognet	/* tx producer index */
117210040Scognet	uint32_t tx_prod;
118210040Scognet	/* tx consumer index */
119210040Scognet	uint32_t tx_cons;
120210040Scognet	int	tx_cnt;
121210040Scognet
122210040Scognet	struct tx_desc_info tx_desc[MACB_MAX_TX_BUFFERS];
123210040Scognet
124210040Scognet	int macb_watchdog_timer;
125210040Scognet
126210040Scognet#define	MACB_FLAG_LINK		0x0001
127210040Scognet
128210040Scognet	int flags;
129210040Scognet	int if_flags;
130210040Scognet	struct at91_pmc_clock *clk;
131210040Scognet
132210040Scognet	struct macb_chain_data	macb_cdata;
133210040Scognet	int clock;
134290509Simp
135290509Simp	uint32_t use_rmii; /* 0 or USRIO_RMII */
136210040Scognet};
137210040Scognet
138210040Scognet#endif
139