1 /*
2  * $FreeBSD: stable/10/sys/arm/at91/if_macbvar.h 261455 2014-02-04 03:36:42Z eadler $
3  */
4 
5 #ifndef	_IF_MACB_H
6 #define	_IF_MACB_H
7 
8 #define	MACB_MAX_TX_BUFFERS	64
9 #define	MACB_MAX_RX_BUFFERS	256
10 
11 #define MAX_FRAGMENT		20
12 #define DATA_SIZE		128
13 
14 #define	MACB_DESC_INC(x, y)	((x) = ((x) + 1) % (y))
15 
16 #define MACB_TIMEOUT		1000
17 
18 struct eth_tx_desc {
19 	uint32_t		addr;
20 	uint32_t		flags;
21 #define TD_OWN		(1U << 31)
22 #define TD_LAST		(1 << 15)
23 #define	TD_WRAP_MASK		(1 << 30)
24 };
25 
26 struct eth_rx_desc {
27 	uint32_t		addr;
28 #define	RD_LEN_MASK		0x7ff
29 #define	RD_WRAP_MASK		0x00000002
30 #define	RD_OWN			0x00000001
31 
32 	uint32_t		flags;
33 #define RD_BROADCAST		(1U << 31)
34 #define RD_MULTICAST		(1 << 30)
35 #define RD_UNICAST		(1 << 29)
36 #define RD_EXTERNAL		(1 << 28)
37 #define RD_TYPE_ID		(1 << 22)
38 #define RD_PRIORITY		(1 << 20)
39 #define RD_VLAN		(1 << 21)
40 #define RD_CONCAT		(1 << 16)
41 #define RD_EOF		(1 << 15)
42 #define RD_SOF		(1 << 14)
43 #define RD_OFFSET_MASK		(1 << 13)|(1 << 12)
44 #define RD_LENGTH_MASK		(0x00000FFF)
45 
46 };
47 
48 
49 struct rx_desc_info {
50 	struct mbuf *buff;
51 	bus_dmamap_t dmamap;
52 };
53 
54 struct tx_desc_info {
55 	struct mbuf *buff;
56 	bus_dmamap_t dmamap;
57 };
58 
59 
60 struct macb_chain_data{
61 	struct mbuf		*rxhead;
62 	struct mbuf		*rxtail;
63 };
64 
65 struct macb_softc
66 {
67 	struct ifnet *ifp;		/* ifnet pointer */
68 	struct mtx sc_mtx;		/* global mutex */
69 
70 	bus_dma_tag_t	sc_parent_tag;	/* parent bus DMA tag */
71 
72 	device_t dev;			/* Myself */
73 	device_t miibus;		/* My child miibus */
74 	void *intrhand;			/* Interrupt handle */
75 	void *intrhand_qf;		/* queue full */
76 	void *intrhand_tx;		/* tx complete */
77 	void *intrhand_status;		/* error status */
78 
79 	struct resource *irq_res;	/* transmit */
80 	struct resource *irq_res_rec;	/* receive */
81 	struct resource *irq_res_qf;	/* queue full */
82 	struct resource *irq_res_status; /* status */
83 
84 	struct resource	*mem_res;	/* Memory resource */
85 
86 	struct callout tick_ch;		/* Tick callout */
87 
88 	struct taskqueue *sc_tq;
89 	struct task	sc_intr_task;
90 	struct task	sc_tx_task;
91 	struct task	sc_link_task;
92 
93 	bus_dmamap_t	dmamap_ring_tx;
94 	bus_dmamap_t	dmamap_ring_rx;
95 
96 	/*dma tag for ring*/
97 	bus_dma_tag_t	dmatag_ring_tx;
98 	bus_dma_tag_t	dmatag_ring_rx;
99 
100 	/*dma tag for data*/
101 	bus_dma_tag_t	dmatag_data_tx;
102 	bus_dma_tag_t	dmatag_data_rx;
103 
104 	/*the ring*/
105 	struct eth_tx_desc	*desc_tx;
106 	struct eth_rx_desc	*desc_rx;
107 
108 	/*ring physical address*/
109 	bus_addr_t	ring_paddr_tx;
110 	bus_addr_t	ring_paddr_rx;
111 
112 	/*index of last received descriptor*/
113 	int		rx_cons;
114 	struct rx_desc_info rx_desc[MACB_MAX_RX_BUFFERS];
115 
116 	/* tx producer index */
117 	uint32_t tx_prod;
118 	/* tx consumer index */
119 	uint32_t tx_cons;
120 	int	tx_cnt;
121 
122 	struct tx_desc_info tx_desc[MACB_MAX_TX_BUFFERS];
123 
124 	int macb_watchdog_timer;
125 
126 #define	MACB_FLAG_LINK		0x0001
127 
128 	int flags;
129 	int if_flags;
130 	struct at91_pmc_clock *clk;
131 
132 	struct macb_chain_data	macb_cdata;
133 	int clock;
134 };
135 
136 
137 
138 #endif
139