Merge from vendor branch BSDTAR:
[dragonfly.git] / sys / dev / netif / cue / if_cuereg.h
1 /*
2  * Copyright (c) 1997, 1998, 1999, 2000
3  *      Bill Paul <wpaul@ee.columbia.edu>.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Bill Paul.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD: src/sys/dev/usb/if_cuereg.h,v 1.12 2003/10/04 21:41:01 joe Exp $
33  * $DragonFly: src/sys/dev/netif/cue/if_cuereg.h,v 1.5 2004/09/14 22:35:28 joerg Exp $
34  */
35
36 /*
37  * Definitions for the CATC Netmate II USB to ethernet controller.
38  */
39
40
41 /*
42  * Vendor specific control commands.
43  */
44 #define CUE_CMD_RESET                           0xF4
45 #define CUE_CMD_GET_MACADDR                     0xF2
46 #define CUE_CMD_WRITEREG                        0xFA
47 #define CUE_CMD_READREG                         0xFB
48 #define CUE_CMD_READSRAM                        0xF1
49 #define CUE_CMD_WRITESRAM                       0xFC
50
51 /*
52  * Internal registers
53  */
54 #define CUE_TX_BUFCNT                           0x20
55 #define CUE_RX_BUFCNT                           0x21
56 #define CUE_ADVANCED_OPMODES                    0x22
57 #define CUE_TX_BUFPKTS                          0x23
58 #define CUE_RX_BUFPKTS                          0x24
59 #define CUE_RX_MAXCHAIN                         0x25
60
61 #define CUE_ETHCTL                              0x60
62 #define CUE_ETHSTS                              0x61
63 #define CUE_PAR5                                0x62
64 #define CUE_PAR4                                0x63
65 #define CUE_PAR3                                0x64
66 #define CUE_PAR2                                0x65
67 #define CUE_PAR1                                0x66
68 #define CUE_PAR0                                0x67
69
70 /* Error counters, all 16 bits wide. */
71 #define CUE_TX_SINGLECOLL                       0x69
72 #define CUE_TX_MULTICOLL                        0x6B
73 #define CUE_TX_EXCESSCOLL                       0x6D
74 #define CUE_RX_FRAMEERR                         0x6F
75
76 #define CUE_LEDCTL                              0x81
77
78 /* Advenced operating mode register */
79 #define CUE_AOP_SRAMWAITS                       0x03
80 #define CUE_AOP_EMBED_RXLEN                     0x08
81 #define CUE_AOP_RXCOMBINE                       0x10
82 #define CUE_AOP_TXCOMBINE                       0x20
83 #define CUE_AOP_EVEN_PKT_READS                  0x40
84 #define CUE_AOP_LOOPBK                          0x80
85
86 /* Ethernet control register */
87 #define CUE_ETHCTL_RX_ON                        0x01
88 #define CUE_ETHCTL_LINK_POLARITY                0x02
89 #define CUE_ETHCTL_LINK_FORCE_OK                0x04
90 #define CUE_ETHCTL_MCAST_ON                     0x08
91 #define CUE_ETHCTL_PROMISC                      0x10
92
93 /* Ethernet status register */
94 #define CUE_ETHSTS_NO_CARRIER                   0x01
95 #define CUE_ETHSTS_LATECOLL                     0x02
96 #define CUE_ETHSTS_EXCESSCOLL                   0x04
97 #define CUE_ETHSTS_TXBUF_AVAIL                  0x08
98 #define CUE_ETHSTS_BAD_POLARITY                 0x10
99 #define CUE_ETHSTS_LINK_OK                      0x20
100
101 /* LED control register */
102 #define CUE_LEDCTL_BLINK_1X                     0x00
103 #define CUE_LEDCTL_BLINK_2X                     0x01
104 #define CUE_LEDCTL_BLINK_QUARTER_ON             0x02
105 #define CUE_LEDCTL_BLINK_QUARTER_OFF            0x03
106 #define CUE_LEDCTL_OFF                          0x04
107 #define CUE_LEDCTL_FOLLOW_LINK                  0x08
108
109 /*
110  * Address in ASIC's internal SRAM where the
111  * multicast hash table lives. The table is 64 bytes long,
112  * giving us a 512-bit table. We have to set the bit that
113  * corresponds to the broadcast address in order to enable
114  * reception of broadcast frames.
115  */
116 #define CUE_MCAST_TABLE_ADDR                    0xFA80
117 #define CUE_MCAST_TABLE_LEN                     64
118
119 #define CUE_TIMEOUT             1000
120 #define CUE_BUFSZ               1536
121 #define CUE_MIN_FRAMELEN        60
122 #define CUE_RX_FRAMES           1
123 #define CUE_TX_FRAMES           1
124
125 #define CUE_RX_LIST_CNT         1
126 #define CUE_TX_LIST_CNT         1
127
128 #define CUE_CTL_READ            0x01
129 #define CUE_CTL_WRITE           0x02
130
131 #define CUE_CONFIG_NO           1
132
133 /*
134  * The interrupt endpoint is currently unused
135  * by the KLSI part.
136  */
137 #define CUE_ENDPT_RX            0x0
138 #define CUE_ENDPT_TX            0x1
139 #define CUE_ENDPT_INTR          0x2
140 #define CUE_ENDPT_MAX           0x3
141
142 struct cue_type {
143         u_int16_t               cue_vid;
144         u_int16_t               cue_did;
145 };
146
147 struct cue_softc;
148
149 struct cue_chain {
150         struct cue_softc        *cue_sc;
151         usbd_xfer_handle        cue_xfer;
152         char                    *cue_buf;
153         struct mbuf             *cue_mbuf;
154         int                     cue_accum;
155         int                     cue_idx;
156 };
157
158 struct cue_cdata {
159         struct cue_chain        cue_tx_chain[CUE_TX_LIST_CNT];
160         struct cue_chain        cue_rx_chain[CUE_RX_LIST_CNT];
161         int                     cue_tx_prod;
162         int                     cue_tx_cons;
163         int                     cue_tx_cnt;
164         int                     cue_rx_prod;
165 };
166
167 #define CUE_INC(x, y)           (x) = (x + 1) % y
168
169 struct cue_softc {
170         struct arpcom           arpcom;
171         usbd_device_handle      cue_udev;
172         usbd_interface_handle   cue_iface;
173         int                     cue_ed[CUE_ENDPT_MAX];
174         usbd_pipe_handle        cue_ep[CUE_ENDPT_MAX];
175         int                     cue_unit;
176         u_int8_t                cue_mctab[CUE_MCAST_TABLE_LEN];
177         int                     cue_if_flags;
178         u_int16_t               cue_rxfilt;
179         struct cue_cdata        cue_cdata;
180         struct callout          cue_stat_timer;
181 #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
182         struct mtx              cue_mtx;
183 #endif
184         char                    cue_dying;
185         struct timeval          cue_rx_notice;
186 };
187
188 #if 0
189 #define CUE_LOCK(_sc)           mtx_lock(&(_sc)->cue_mtx)
190 #define CUE_UNLOCK(_sc)         mtx_unlock(&(_sc)->cue_mtx)
191 #else
192 #define CUE_LOCK(_sc)
193 #define CUE_UNLOCK(_sc)
194 #endif