summaryrefslogtreecommitdiff
path: root/sys/dev/usb/if_udavreg.h
blob: 9b692b675881d4f32dd33d411bc0b1bcefbe7f1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
/*	$OpenBSD: if_udavreg.h,v 1.10 2007/11/25 16:40:03 jmc Exp $ */
/*	$NetBSD: if_udavreg.h,v 1.2 2003/09/04 15:17:39 tsutsui Exp $	*/
/*	$nabe: if_udavreg.h,v 1.2 2003/08/21 16:26:40 nabe Exp $	*/
/*
 * Copyright (c) 2003
 *     Shingo WATANABE <nabe@nabechan.org>.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the author nor the names of any co-contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 */

#define	UDAV_IFACE_INDEX	0
#define	UDAV_CONFIG_NO		1

#define	UDAV_TX_LIST_CNT	1
#define	UDAV_RX_LIST_CNT	1

#define	UDAV_TX_TIMEOUT		1000
#define	UDAV_TIMEOUT		10000


/* Request */
#define	UDAV_REQ_REG_READ	0x00 /* Read from register(s) */
#define	UDAV_REQ_REG_WRITE	0x01 /* Write to register(s) */
#define	UDAV_REQ_REG_WRITE1	0x03 /* Write to a register */

#define	UDAV_REQ_MEM_READ	0x02 /* Read from memory */
#define	UDAV_REQ_MEM_WRITE	0x05 /* Write to memory */
#define	UDAV_REQ_MEM_WRITE1	0x07 /* Write a byte to memory */

/* Registers */
#define	UDAV_NCR		0x00 /* Network Control Register */
#define	 UDAV_NCR_EXT_PHY	(1<<7) /* Select External PHY */
#define	 UDAV_NCR_WAKEEN	(1<<6) /* Wakeup Event Enable */
#define	 UDAV_NCR_FCOL		(1<<4) /* Force Collision Mode */
#define	 UDAV_NCR_FDX		(1<<3) /* Full-Duplex Mode (RO on Int. PHY) */
#define	 UDAV_NCR_LBK1		(1<<2) /* Lookback Mode */
#define	 UDAV_NCR_LBK0		(1<<1) /* Lookback Mode */
#define	 UDAV_NCR_RST		(1<<0) /* Software reset */

#define	UDAV_RCR		0x05 /* RX Control Register */
#define	 UDAV_RCR_WTDIS		(1<<6) /* Watchdog Timer Disable */
#define	 UDAV_RCR_DIS_LONG	(1<<5) /* Discard Long Packet(over 1522Byte) */
#define	 UDAV_RCR_DIS_CRC	(1<<4) /* Discard CRC Error Packet */
#define	 UDAV_RCR_ALL		(1<<3) /* Pass All Multicast */
#define	 UDAV_RCR_RUNT		(1<<2) /* Pass Runt Packet */
#define	 UDAV_RCR_PRMSC		(1<<1) /* Promiscuous Mode */
#define	 UDAV_RCR_RXEN		(1<<0) /* RX Enable */

#define	UDAV_RSR		0x06 /* RX Status Register */
#define	 UDAV_RSR_RF		(1<<7) /* Runt Frame */
#define	 UDAV_RSR_MF		(1<<6) /* Multicast Frame */
#define	 UDAV_RSR_LCS		(1<<5) /* Late Collision Seen */
#define	 UDAV_RSR_RWTO		(1<<4) /* Receive Watchdog Time-Out */
#define	 UDAV_RSR_PLE		(1<<3) /* Physical Layer Error */
#define	 UDAV_RSR_AE		(1<<2) /* Alignment Error */
#define	 UDAV_RSR_CE		(1<<1) /* CRC Error */
#define	 UDAV_RSR_FOE		(1<<0) /* FIFO Overflow Error */
#define	 UDAV_RSR_ERR		(UDAV_RSR_RF | UDAV_RSR_LCS | UDAV_RSR_RWTO |\
				UDAV_RSR_PLE | UDAV_RSR_AE | UDAV_RSR_CE |\
				UDAV_RSR_FOE)

#define	UDAV_EPCR		0x0b /* EEPROM & PHY Control Register */
#define	 UDAV_EPCR_REEP		(1<<5) /* Reload EEPROM */
#define	 UDAV_EPCR_WEP		(1<<4) /* Write EEPROM enable */
#define	 UDAV_EPCR_EPOS		(1<<3) /* EEPROM or PHY Operation Select */
#define	 UDAV_EPCR_ERPRR	(1<<2) /* EEPROM/PHY Register Read Command */
#define	 UDAV_EPCR_ERPRW	(1<<1) /* EEPROM/PHY Register Write Command */
#define	 UDAV_EPCR_ERRE		(1<<0) /* EEPROM/PHY Access Status */

#define	UDAV_EPAR		0x0c /* EEPROM & PHY Control Register */
#define	 UDAV_EPAR_PHY_ADR1	(1<<7) /* PHY Address bit 1 */
#define	 UDAV_EPAR_PHY_ADR0	(1<<6) /* PHY Address bit 0 */
#define	 UDAV_EPAR_EROA		(1<<0) /* EEPROM Word/PHY Register Address */
#define	 UDAV_EPAR_EROA_MASK	(0x1f) /* [5:0] */

#define	UDAV_EPDRL		0x0d /* EEPROM & PHY Data Register */
#define	UDAV_EPDRH		0x0e /* EEPROM & PHY Data Register */

#define	UDAV_PAR0		0x10 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR1		0x11 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR2		0x12 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR3		0x13 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR4		0x14 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR5		0x15 /* Ethernet Address, load from EEPROM */
#define	UDAV_PAR		UDAV_PAR0

#define	UDAV_MAR0		0x16 /* Multicast Register */
#define	UDAV_MAR1		0x17 /* Multicast Register */
#define	UDAV_MAR2		0x18 /* Multicast Register */
#define	UDAV_MAR3		0x19 /* Multicast Register */
#define	UDAV_MAR4		0x1a /* Multicast Register */
#define	UDAV_MAR5		0x1b /* Multicast Register */
#define	UDAV_MAR6		0x1c /* Multicast Register */
#define	UDAV_MAR7		0x1d /* Multicast Register */
#define	UDAV_MAR		UDAV_MAR0

#define	UDAV_GPCR		0x1e /* General purpose control register */
#define	 UDAV_GPCR_GEP_CNTL6	(1<<6) /* General purpose control 6 */
#define	 UDAV_GPCR_GEP_CNTL5	(1<<5) /* General purpose control 5 */
#define	 UDAV_GPCR_GEP_CNTL4	(1<<4) /* General purpose control 4 */
#define	 UDAV_GPCR_GEP_CNTL3	(1<<3) /* General purpose control 3 */
#define	 UDAV_GPCR_GEP_CNTL2	(1<<2) /* General purpose control 2 */
#define	 UDAV_GPCR_GEP_CNTL1	(1<<1) /* General purpose control 1 */
#define	 UDAV_GPCR_GEP_CNTL0	(1<<0) /* General purpose control 0 */

#define	UDAV_GPR		0x1f /* General purpose register */
#define	 UDAV_GPR_GEPIO6	(1<<6) /* General purpose 6 */
#define	 UDAV_GPR_GEPIO5	(1<<5) /* General purpose 5 */
#define	 UDAV_GPR_GEPIO4	(1<<4) /* General purpose 4 */
#define	 UDAV_GPR_GEPIO3	(1<<3) /* General purpose 3 */
#define	 UDAV_GPR_GEPIO2	(1<<2) /* General purpose 2 */
#define	 UDAV_GPR_GEPIO1	(1<<1) /* General purpose 1 */
#define	 UDAV_GPR_GEPIO0	(1<<0) /* General purpose 0 */

#define GET_IFP(sc)             (&(sc)->sc_ac.ac_if)
#define	GET_MII(sc)		(&(sc)->sc_mii)

struct udav_chain {
	struct udav_softc	*udav_sc;
	usbd_xfer_handle	udav_xfer;
	char			*udav_buf;
	struct mbuf		*udav_mbuf;
	int			udav_idx;
};

struct udav_cdata {
	struct udav_chain	udav_tx_chain[UDAV_TX_LIST_CNT];
	struct udav_chain	udav_rx_chain[UDAV_TX_LIST_CNT];
#if 0
	/* XXX: Interrupt Endpoint is not yet supported! */
	struct udav_intrpkg	udav_ibuf;
#endif
	int			udav_tx_prod;
	int			udav_tx_cons;
	int			udav_tx_cnt;
	int			udav_rx_prod;
};

struct udav_softc {
	struct device		sc_dev;	/* base device */
	usbd_device_handle	sc_udev;

	/* USB */
	usbd_interface_handle	sc_ctl_iface;
	/* int			sc_ctl_iface_no; */
	int			sc_bulkin_no; /* bulk in endpoint */
	int			sc_bulkout_no; /* bulk out endpoint */
	int			sc_intrin_no; /* intr in endpoint */
	usbd_pipe_handle	sc_pipe_rx;
	usbd_pipe_handle	sc_pipe_tx;
	usbd_pipe_handle	sc_pipe_intr;
	struct timeout		sc_stat_ch;
	u_int			sc_rx_errs;
	/* u_int		sc_intr_errs; */
	struct timeval		sc_rx_notice;

	/* Ethernet */
        struct arpcom           sc_ac; /* ethernet common */
	struct mii_data		sc_mii;
	struct rwlock		sc_mii_lock;
	int			sc_link;
#define	sc_media udav_mii.mii_media
	struct udav_cdata	sc_cdata;

	int                     sc_attached;
	int			sc_dying;
        int                     sc_refcnt;

	struct usb_task		sc_tick_task;
	struct usb_task		sc_stop_task;

	u_int16_t		sc_flags;
};

struct udav_rx_hdr {
	uByte			pktstat;
	uWord			length;
} __packed;
#define UDAV_RX_HDRLEN		sizeof(struct udav_rx_hdr)

/* Packet length */
#define	UDAV_MAX_MTU		1536 /* XXX: max frame size is unknown */
#define	UDAV_MIN_FRAME_LEN	60
#define	UDAV_BUFSZ		UDAV_MAX_MTU + UDAV_RX_HDRLEN