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
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
/* $OpenBSD: if_muereg.h,v 1.2 2018/08/15 07:13:51 kevlo Exp $ */
/*
* Copyright (c) 2018 Kevin Lo <kevlo@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*
* USB vendor requests.
*/
#define MUE_UR_WRITEREG 0xa0
#define MUE_UR_READREG 0xa1
/*
* Offset of MAC address inside EEPROM.
*/
#define MUE_EE_IND_OFFSET 0x00
#define MUE_EE_MAC_OFFSET 0x01
#define MUE_EE_LTM_OFFSET 0x3f
#define MUE_INT_STATUS 0x00c
#define MUE_HW_CFG 0x010
#define MUE_PMT_CTL 0x014
#define MUE_DP_SEL 0x024
#define MUE_DP_CMD 0x028
#define MUE_DP_ADDR 0x02c
#define MUE_DP_DATA 0x030
#define MUE_BURST_CAP 0x034
#define MUE_BULK_IN_DELAY 0x03c
#define MUE_E2P_CMD 0x040
#define MUE_E2P_DATA 0x044
#define MUE_RFE_CTL 0x060
#define MUE_USB_CFG0 0x080
#define MUE_USB_CFG1 0x084
#define MUE_FCT_RX_CTL 0x090
#define MUE_FCT_TX_CTL 0x094
#define MUE_FCT_RX_FIFO_END 0x098
#define MUE_FCT_TX_FIFO_END 0x098
#define MUE_FCT_FLOW 0x0a0
#define MUE_7800_RFE_CTL 0x0b0
#define MUE_7800_FCT_RX_CTL 0x0c0
#define MUE_7800_FCT_TX_CTL 0x0c4
#define MUE_7800_FCT_FLOW 0x0d0
#define MUE_LTM_INDEX(idx) (0x0e0 + (idx) * 4)
#define MUE_MAC_CR 0x100
#define MUE_MAC_RX 0x104
#define MUE_MAC_TX 0x108
#define MUE_FLOW 0x10c
#define MUE_RX_ADDRH 0x118
#define MUE_RX_ADDRL 0x11c
#define MUE_MII_ACCESS 0x120
#define MUE_MII_DATA 0x124
#define MUE_ADDR_FILTX 0x300
#define MUE_7800_ADDR_FILTX 0x400
#define MUE_7800_BURST_CAP MUE_FCT_RX_CTL
#define MUE_7800_BULK_IN_DELAY MUE_FCT_TX_CTL
/* Hardware configuration register */
#define MUE_HW_CFG_SRST 0x00000001
#define MUE_HW_CFG_LRST 0x00000002
#define MUE_HW_CFG_BCE 0x00000004
#define MUE_HW_CFG_MEF 0x00000010
#define MUE_HW_CFG_BIR 0x00000080
#define MUE_HW_CFG_LED0_EN 0x00100000
#define MUE_HW_CFG_LED1_EN 0x00200000
/* Power management control register */
#define MUE_PMT_CTL_PHY_RST 0x00000010
#define MUE_PMT_CTL_READY 0x00000080
/* Data port select register */
#define MUE_DP_SEL_RSEL_MASK 0x0000000f
#define MUE_DP_SEL_VHF 0x00000001
#define MUE_DP_SEL_DPRDY 0x80000000
#define MUE_DP_SEL_VHF_HASH_LEN 16
#define MUE_DP_SEL_VHF_VLAN_LEN 128
/* Data port command register */
#define MUE_DP_CMD_WRITE 0x00000001
/* EEPROM command register */
#define MUE_E2P_CMD_ADDR_MASK 0x000001ff
#define MUE_E2P_CMD_READ 0x00000000
#define MUE_E2P_CMD_TIMEOUT 0x00000400
#define MUE_E2P_CMD_BUSY 0x80000000
/* Receive filtering engine control register */
#define MUE_RFE_CTL_PERFECT 0x00000002
#define MUE_RFE_CTL_MULTICAST_HASH 0x00000008
#define MUE_RFE_CTL_UNICAST 0x00000100
#define MUE_RFE_CTL_MULTICAST 0x00000200
#define MUE_RFE_CTL_BROADCAST 0x00000400
/* USB configuration register 0 */
#define MUE_USB_CFG0_BCE 0x00000020
#define MUE_USB_CFG0_BIR 0x00000040
/* USB configuration register 1 */
#define MUE_USB_CFG1_LTM_ENABLE 0x00000100
#define MUE_USB_CFG1_DEV_U1_INIT_EN 0x00000400
#define MUE_USB_CFG1_DEV_U2_INIT_EN 0x00001000
/* RX FIFO control register */
#define MUE_FCT_RX_CTL_EN 0x80000000
/* TX FIFO control register */
#define MUE_FCT_TX_CTL_EN 0x80000000
/* MAC control register */
#define MUE_MAC_CR_RST 0x00000001
#define MUE_MAC_CR_FULL_DUPLEX 0x00000008
#define MUE_MAC_CR_AUTO_SPEED 0x00000800
#define MUE_MAC_CR_AUTO_DUPLEX 0x00001000
#define MUE_MAC_CR_GMII_EN 0x00080000
/* MAC receive register */
#define MUE_MAC_RX_RXEN 0x00000001
#define MUE_MAC_RX_MAX_SIZE_MASK 0x3fff0000
#define MUE_MAC_RX_MAX_SIZE_SHIFT 16
#define MUE_MAC_RX_MAX_LEN(x) \
(((x) << MUE_MAC_RX_MAX_SIZE_SHIFT) & MUE_MAC_RX_MAX_SIZE_MASK)
/* MAC transmit register */
#define MUE_MAC_TX_TXEN 0x00000001
/* Flow control register */
#define MUE_FLOW_PAUSE_TIME 0x0000ffff
#define MUE_FLOW_RX_FCEN 0x20000000
#define MUE_FLOW_TX_FCEN 0x40000000
/* MII access register */
#define MUE_MII_ACCESS_READ 0x00000000
#define MUE_MII_ACCESS_BUSY 0x00000001
#define MUE_MII_ACCESS_WRITE 0x00000002
#define MUE_MII_ACCESS_REGADDR_MASK 0x000007c0
#define MUE_MII_ACCESS_REGADDR_SHIFT 6
#define MUE_MII_ACCESS_PHYADDR_MASK 0x0000f800
#define MUE_MII_ACCESS_PHYADDR_SHIFT 11
#define MUE_MII_ACCESS_REGADDR(x) \
(((x) << MUE_MII_ACCESS_REGADDR_SHIFT) & MUE_MII_ACCESS_REGADDR_MASK)
#define MUE_MII_ACCESS_PHYADDR(x) \
(((x) << MUE_MII_ACCESS_PHYADDR_SHIFT) & MUE_MII_ACCESS_PHYADDR_MASK)
/* MAC address perfect filter register */
#define MUE_ADDR_FILTX_VALID 0x80000000
#define MUE_DEFAULT_BULKIN_DELAY 0x00002000
#define MUE_7800_DEFAULT_BULKIN_DELAY 0x00000800
#define MUE_BURST_MAX_BUFSZ 129
#define MUE_BURST_MIN_BUFSZ 37
#define MUE_7800_BURST_MAX_BUFSZ 24
#define MUE_7800_BURST_MIN_BUFSZ 12
#define MUE_7800_BUFSZ 12288
#define MUE_MAX_BUFSZ 18944
#define MUE_MIN_BUFSZ 8256
#define MUE_EEPROM_INDICATOR 0xa5
/*
* The interrupt endpoint is currently unused by the Moschip part.
*/
#define MUE_ENDPT_RX 0x0
#define MUE_ENDPT_TX 0x1
#define MUE_ENDPT_INTR 0x2
#define MUE_ENDPT_MAX 0x3
#define MUE_RX_LIST_CNT 1
#define MUE_TX_LIST_CNT 1
struct mue_softc;
struct mue_chain {
struct mue_softc *mue_sc;
struct usbd_xfer *mue_xfer;
char *mue_buf;
struct mbuf *mue_mbuf;
int mue_accum;
int mue_idx;
};
struct mue_cdata {
struct mue_chain mue_tx_chain[MUE_TX_LIST_CNT];
struct mue_chain mue_rx_chain[MUE_RX_LIST_CNT];
int mue_tx_prod;
int mue_tx_cons;
int mue_tx_cnt;
int mue_rx_prod;
};
struct mue_rxbuf_hdr {
uint32_t rx_cmd_a;
#define MUE_RX_CMD_A_RED 0x00400000
#define MUE_RX_CMD_A_LEN_MASK 0x00003fff
uint32_t rx_cmd_b;
uint16_t rx_cmd_c;
} __packed;
struct mue_txbuf_hdr {
uint32_t tx_cmd_a;
#define MUE_TX_CMD_A_FCS 0x00400000
#define MUE_TX_CMD_A_LEN_MASK 0x000fffff
uint32_t tx_cmd_b;
} __packed;
struct mue_softc {
struct device mue_dev;
struct arpcom arpcom;
struct mii_data mue_mii;
#define GET_MII(sc) (&(sc)->mue_mii)
#define GET_IFP(sc) (&(sc)->arpcom.ac_if)
int mue_ed[MUE_ENDPT_MAX];
struct usbd_pipe *mue_ep[MUE_ENDPT_MAX];
struct mue_cdata mue_cdata;
struct timeout mue_stat_ch;
struct usbd_device *mue_udev;
struct usbd_interface *mue_iface;
struct usb_task mue_tick_task;
struct usb_task mue_stop_task;
struct rwlock mue_mii_lock;
struct timeval mue_rx_notice;
uint16_t mue_product;
uint16_t mue_flags;
int mue_refcnt;
int mue_phyno;
int mue_bufsz;
int mue_link;
int mue_eeprom_present;
};
|