xref: /dragonfly/sys/dev/netif/txp/if_txpreg.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1 /*        $OpenBSD: if_txpreg.h,v 1.30 2001/06/23 04:18:02 jason Exp $ */
2 /*        $FreeBSD: src/sys/dev/txp/if_txpreg.h,v 1.2.2.1 2001/07/30 17:31:39 wpaul Exp $ */
3 /*        $DragonFly: src/sys/dev/netif/txp/if_txpreg.h,v 1.6 2006/08/01 18:10:40 swildner Exp $ */
4 
5 /*
6  * Copyright (c) 2001 Aaron Campbell <aaron@monkey.org>.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. All advertising materials mentioning features or use of this software
18  *    must display the following acknowledgement:
19  *      This product includes software developed by Aaron Campbell.
20  * 4. The name of the author may not be used to endorse or promote products
21  *    derived from this software without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
32  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33  * THE POSSIBILITY OF SUCH DAMAGE.
34  */
35 
36 #define   TXP_PCI_LOMEM                           0x14      /* pci conf, memory map BAR */
37 #define   TXP_PCI_LOIO                            0x10      /* pci conf, IO map BAR */
38 #define TXP_PCI_INTLINE                           0x3C
39 
40 /*
41  * Typhoon registers.
42  */
43 #define   TXP_SRR                                 0x00      /* soft reset register */
44 #define   TXP_ISR                                 0x04      /* interrupt status register */
45 #define   TXP_IER                                 0x08      /* interrupt enable register */
46 #define   TXP_IMR                                 0x0c      /* interrupt mask register */
47 #define   TXP_SIR                                 0x10      /* self interrupt register */
48 #define   TXP_H2A_7                     0x14      /* host->arm comm 7 */
49 #define   TXP_H2A_6                     0x18      /* host->arm comm 6 */
50 #define   TXP_H2A_5                     0x1c      /* host->arm comm 5 */
51 #define   TXP_H2A_4                     0x20      /* host->arm comm 4 */
52 #define   TXP_H2A_3                     0x24      /* host->arm comm 3 */
53 #define   TXP_H2A_2                     0x28      /* host->arm comm 2 */
54 #define   TXP_H2A_1                     0x2c      /* host->arm comm 1 */
55 #define   TXP_H2A_0                     0x30      /* host->arm comm 0 */
56 #define   TXP_A2H_3                     0x34      /* arm->host comm 3 */
57 #define   TXP_A2H_2                     0x38      /* arm->host comm 2 */
58 #define   TXP_A2H_1                     0x3c      /* arm->host comm 1 */
59 #define   TXP_A2H_0                     0x40      /* arm->host comm 0 */
60 
61 /*
62  * interrupt bits (IMR, ISR, IER)
63  */
64 #define   TXP_INT_RESERVED    0xffff0000
65 #define   TXP_INT_A2H_7                 0x00008000          /* arm->host comm 7 */
66 #define   TXP_INT_A2H_6                 0x00004000          /* arm->host comm 6 */
67 #define   TXP_INT_A2H_5                 0x00002000          /* arm->host comm 5 */
68 #define   TXP_INT_A2H_4                 0x00001000          /* arm->host comm 4 */
69 #define   TXP_INT_SELF                  0x00000800          /* self interrupt */
70 #define   TXP_INT_PCI_TABORT  0x00000400          /* pci target abort */
71 #define   TXP_INT_PCI_MABORT  0x00000200          /* pci master abort */
72 #define   TXP_INT_DMA3                  0x00000100          /* dma3 done */
73 #define   TXP_INT_DMA2                  0x00000080          /* dma2 done */
74 #define   TXP_INT_DMA1                  0x00000040          /* dma1 done */
75 #define   TXP_INT_DMA0                  0x00000020          /* dma0 done */
76 #define   TXP_INT_A2H_3                 0x00000010          /* arm->host comm 3 */
77 #define   TXP_INT_A2H_2                 0x00000008          /* arm->host comm 2 */
78 #define   TXP_INT_A2H_1                 0x00000004          /* arm->host comm 1 */
79 #define   TXP_INT_A2H_0                 0x00000002          /* arm->host comm 0 */
80 #define   TXP_INT_LATCH                 0x00000001          /* interrupt latch */
81 
82 /*
83  * soft reset register (SRR)
84  */
85 #define   TXP_SRR_ALL                   0x0000007f          /* full reset */
86 
87 /*
88  * Typhoon boot commands.
89  */
90 #define   TXP_BOOTCMD_NULL                        0x00
91 #define   TXP_BOOTCMD_DOWNLOAD_COMPLETE           0xfb
92 #define   TXP_BOOTCMD_SEGMENT_AVAILABLE           0xfc
93 #define   TXP_BOOTCMD_RUNTIME_IMAGE               0xfd
94 #define   TXP_BOOTCMD_REGISTER_BOOT_RECORD        0xff
95 
96 /*
97  * Typhoon runtime commands.
98  */
99 #define   TXP_CMD_GLOBAL_RESET                              0x00
100 #define   TXP_CMD_TX_ENABLE                       0x01
101 #define   TXP_CMD_TX_DISABLE                      0x02
102 #define   TXP_CMD_RX_ENABLE                       0x03
103 #define   TXP_CMD_RX_DISABLE                      0x04
104 #define   TXP_CMD_RX_FILTER_WRITE                           0x05
105 #define   TXP_CMD_RX_FILTER_READ                            0x06
106 #define   TXP_CMD_READ_STATISTICS                           0x07
107 #define   TXP_CMD_CYCLE_STATISTICS                0x08
108 #define   TXP_CMD_CLEAR_STATISTICS                0x09
109 #define   TXP_CMD_MEMORY_READ                     0x0a
110 #define   TXP_CMD_MEMORY_WRITE_SINGLE             0x0b
111 #define   TXP_CMD_VARIABLE_SECTION_READ           0x0c
112 #define   TXP_CMD_VARIABLE_SECTION_WRITE                    0x0d
113 #define   TXP_CMD_STATIC_SECTION_READ             0x0e
114 #define   TXP_CMD_STATIC_SECTION_WRITE            0x0f
115 #define   TXP_CMD_IMAGE_SECTION_PROGRAM           0x10
116 #define   TXP_CMD_NVRAM_PAGE_READ                           0x11
117 #define   TXP_CMD_NVRAM_PAGE_WRITE                0x12
118 #define   TXP_CMD_XCVR_SELECT                     0x13
119 #define   TXP_CMD_TEST_MUX                        0x14
120 #define   TXP_CMD_PHYLOOPBACK_ENABLE              0x15
121 #define   TXP_CMD_PHYLOOPBACK_DISABLE             0x16
122 #define   TXP_CMD_MAC_CONTROL_READ                0x17
123 #define   TXP_CMD_MAC_CONTROL_WRITE               0x18
124 #define   TXP_CMD_MAX_PKT_SIZE_READ               0x19
125 #define   TXP_CMD_MAX_PKT_SIZE_WRITE              0x1a
126 #define   TXP_CMD_MEDIA_STATUS_READ               0x1b
127 #define   TXP_CMD_MEDIA_STATUS_WRITE              0x1c
128 #define   TXP_CMD_NETWORK_DIAGS_READ              0x1d
129 #define   TXP_CMD_NETWORK_DIAGS_WRITE             0x1e
130 #define   TXP_CMD_PHY_MGMT_READ                             0x1f
131 #define   TXP_CMD_PHY_MGMT_WRITE                            0x20
132 #define   TXP_CMD_VARIABLE_PARAMETER_READ                   0x21
133 #define   TXP_CMD_VARIABLE_PARAMETER_WRITE        0x22
134 #define   TXP_CMD_GOTO_SLEEP                      0x23
135 #define   TXP_CMD_FIREWALL_CONTROL                0x24
136 #define   TXP_CMD_MCAST_HASH_MASK_WRITE           0x25
137 #define   TXP_CMD_STATION_ADDRESS_WRITE           0x26
138 #define   TXP_CMD_STATION_ADDRESS_READ            0x27
139 #define   TXP_CMD_STATION_MASK_WRITE              0x28
140 #define   TXP_CMD_STATION_MASK_READ               0x29
141 #define   TXP_CMD_VLAN_ETHER_TYPE_READ            0x2a
142 #define   TXP_CMD_VLAN_ETHER_TYPE_WRITE           0x2b
143 #define   TXP_CMD_VLAN_MASK_READ                            0x2c
144 #define   TXP_CMD_VLAN_MASK_WRITE                           0x2d
145 #define   TXP_CMD_BCAST_THROTTLE_WRITE            0x2e
146 #define   TXP_CMD_BCAST_THROTTLE_READ             0x2f
147 #define   TXP_CMD_DHCP_PREVENT_WRITE              0x30
148 #define   TXP_CMD_DHCP_PREVENT_READ               0x31
149 #define   TXP_CMD_RECV_BUFFER_CONTROL             0x32
150 #define   TXP_CMD_SOFTWARE_RESET                            0x33
151 #define   TXP_CMD_CREATE_SA                       0x34
152 #define   TXP_CMD_DELETE_SA                       0x35
153 #define   TXP_CMD_ENABLE_RX_IP_OPTION             0x36
154 #define   TXP_CMD_RANDOM_NUMBER_CONTROL           0x37
155 #define   TXP_CMD_RANDOM_NUMBER_READ              0x38
156 #define   TXP_CMD_MATRIX_TABLE_MODE_WRITE                   0x39
157 #define   TXP_CMD_MATRIX_DETAIL_READ              0x3a
158 #define   TXP_CMD_FILTER_ARRAY_READ               0x3b
159 #define   TXP_CMD_FILTER_DETAIL_READ              0x3c
160 #define   TXP_CMD_FILTER_TABLE_MODE_WRITE                   0x3d
161 #define   TXP_CMD_FILTER_TCL_WRITE                0x3e
162 #define   TXP_CMD_FILTER_TBL_READ                           0x3f
163 #define   TXP_CMD_FILTER_DEFINE                             0x45
164 #define   TXP_CMD_ADD_WAKEUP_PKT                            0x46
165 #define   TXP_CMD_ADD_SLEEP_PKT                             0x47
166 #define   TXP_CMD_ENABLE_SLEEP_EVENTS             0x48
167 #define   TXP_CMD_ENABLE_WAKEUP_EVENTS            0x49
168 #define   TXP_CMD_GET_IP_ADDRESS                            0x4a
169 #define   TXP_CMD_READ_PCI_REG                              0x4c
170 #define   TXP_CMD_WRITE_PCI_REG                             0x4d
171 #define   TXP_CMD_OFFLOAD_READ                              0x4e
172 #define   TXP_CMD_OFFLOAD_WRITE                             0x4f
173 #define   TXP_CMD_HELLO_RESPONSE                            0x57
174 #define   TXP_CMD_ENABLE_RX_FILTER                0x58
175 #define   TXP_CMD_RX_FILTER_CAPABILITY            0x59
176 #define   TXP_CMD_HALT                                      0x5d
177 #define   TXP_CMD_READ_IPSEC_INFO                           0x54
178 #define   TXP_CMD_GET_IPSEC_ENABLE                0x67
179 #define   TXP_CMD_INVALID                                   0xffff
180 
181 #define   TXP_FRAGMENT                  0x0000
182 #define   TXP_TXFRAME                   0x0001
183 #define   TXP_COMMAND                   0x0002
184 #define   TXP_OPTION                    0x0003
185 #define   TXP_RECEIVE                   0x0004
186 #define   TXP_RESPONSE                  0x0005
187 
188 #define   TXP_TYPE_IPSEC                0x0000
189 #define   TXP_TYPE_TCPSEGMENT 0x0001
190 
191 #define   TXP_PFLAG_NOCRC               0x0000
192 #define   TXP_PFLAG_IPCKSUM   0x0001
193 #define   TXP_PFLAG_TCPCKSUM  0x0002
194 #define   TXP_PFLAG_TCPSEGMENT          0x0004
195 #define   TXP_PFLAG_INSERTVLAN          0x0008
196 #define   TXP_PFLAG_IPSEC               0x0010
197 #define   TXP_PFLAG_PRIORITY  0x0020
198 #define   TXP_PFLAG_UDPCKSUM  0x0040
199 #define   TXP_PFLAG_PADFRAME  0x0080
200 
201 #define   TXP_MISC_FIRSTDESC  0x0000
202 #define   TXP_MISC_LASTDESC   0x0001
203 
204 #define   TXP_ERR_INTERNAL    0x0000
205 #define   TXP_ERR_FIFOUNDERRUN          0x0001
206 #define   TXP_ERR_BADSSD                0x0002
207 #define   TXP_ERR_RUNT                  0x0003
208 #define   TXP_ERR_CRC                   0x0004
209 #define   TXP_ERR_OVERSIZE    0x0005
210 #define   TXP_ERR_ALIGNMENT   0x0006
211 #define   TXP_ERR_DRIBBLEBIT  0x0007
212 
213 #define   TXP_PROTO_UNKNOWN   0x0000
214 #define   TXP_PROTO_IP                  0x0001
215 #define   TXP_PROTO_IPX                 0x0002
216 #define   TXP_PROTO_RESERVED  0x0003
217 
218 #define   TXP_STAT_PROTO                0x0001
219 #define   TXP_STAT_VLAN                 0x0002
220 #define   TXP_STAT_IPFRAGMENT 0x0004
221 #define   TXP_STAT_IPSEC                0x0008
222 #define   TXP_STAT_IPCKSUMBAD 0x0010
223 #define   TXP_STAT_TCPCKSUMBAD          0x0020
224 #define   TXP_STAT_UDPCKSUMBAD          0x0040
225 #define   TXP_STAT_IPCKSUMGOOD          0x0080
226 #define   TXP_STAT_TCPCKSUMGOOD         0x0100
227 #define   TXP_STAT_UDPCKSUMGOOD         0x0200
228 
229 struct txp_tx_desc {
230           volatile u_int8_t   tx_flags; /* type/descriptor flags */
231           volatile u_int8_t   tx_numdesc;         /* number of descriptors */
232           volatile u_int16_t  tx_totlen;          /* total packet length */
233           volatile u_int32_t  tx_addrlo;          /* virt addr low word */
234           volatile u_int32_t  tx_addrhi;          /* virt addr high word */
235           volatile u_int32_t  tx_pflags;          /* processing flags */
236 };
237 #define   TX_FLAGS_TYPE_M               0x07                /* type mask */
238 #define   TX_FLAGS_TYPE_FRAG  0x00                /* type: fragment */
239 #define   TX_FLAGS_TYPE_DATA  0x01                /* type: data frame */
240 #define   TX_FLAGS_TYPE_CMD   0x02                /* type: command frame */
241 #define   TX_FLAGS_TYPE_OPT   0x03                /* type: options */
242 #define   TX_FLAGS_TYPE_RX    0x04                /* type: command */
243 #define   TX_FLAGS_TYPE_RESP  0x05                /* type: response */
244 #define   TX_FLAGS_RESP                 0x40                /* response requested */
245 #define   TX_FLAGS_VALID                0x80                /* valid descriptor */
246 
247 #define   TX_PFLAGS_DNAC                0x00000001          /* do not add crc */
248 #define   TX_PFLAGS_IPCKSUM   0x00000002          /* ip checksum */
249 #define   TX_PFLAGS_TCPCKSUM  0x00000004          /* tcp checksum */
250 #define   TX_PFLAGS_TCPSEG    0x00000008          /* tcp segmentation */
251 #define   TX_PFLAGS_VLAN                0x00000010          /* insert vlan */
252 #define   TX_PFLAGS_IPSEC               0x00000020          /* perform ipsec */
253 #define   TX_PFLAGS_PRIO                0x00000040          /* priority field valid */
254 #define   TX_PFLAGS_UDPCKSUM  0x00000080          /* udp checksum */
255 #define   TX_PFLAGS_PADFRAME  0x00000100          /* pad frame */
256 #define   TX_PFLAGS_VLANTAG_M 0x0ffff000          /* vlan tag mask */
257 #define   TX_PFLAGS_VLANPRI_M 0x00700000          /* vlan priority mask */
258 #define   TX_PFLAGS_VLANTAG_S 12                  /* amount to shift tag */
259 
260 struct txp_rx_desc {
261           volatile u_int8_t   rx_flags; /* type/descriptor flags */
262           volatile u_int8_t   rx_numdesc;         /* number of descriptors */
263           volatile u_int16_t  rx_len;             /* frame length */
264 #ifdef notdef
265           volatile u_int32_t  rx_vaddrlo;         /* virtual address, lo word */
266           volatile u_int32_t  rx_vaddrhi;         /* virtual address, hi word */
267 #endif
268           union {
269                     struct txp_swdesc   *rx_sd;
270                     u_int64_t           rx_dummy;
271           } txp_rx_u;
272           volatile u_int32_t  rx_stat;  /* status */
273           volatile u_int16_t  rx_filter;          /* filter status */
274           volatile u_int16_t  rx_hash;  /* hash status */
275           volatile u_int32_t  rx_vlan;  /* vlan tag/priority */
276 };
277 
278 #define rx_sd       txp_rx_u.rx_sd
279 
280 /* txp_rx_desc.rx_flags */
281 #define   RX_FLAGS_TYPE_M               0x07                /* type mask */
282 #define   RX_FLAGS_TYPE_FRAG  0x00                /* type: fragment */
283 #define   RX_FLAGS_TYPE_DATA  0x01                /* type: data frame */
284 #define   RX_FLAGS_TYPE_CMD   0x02                /* type: command frame */
285 #define   RX_FLAGS_TYPE_OPT   0x03                /* type: options */
286 #define   RX_FLAGS_TYPE_RX    0x04                /* type: command */
287 #define   RX_FLAGS_TYPE_RESP  0x05                /* type: response */
288 #define   RX_FLAGS_RCV_TYPE_M 0x18                /* rcvtype mask */
289 #define   RX_FLAGS_RCV_TYPE_RX          0x00                /* rcvtype: receive */
290 #define   RX_FLAGS_RCV_TYPE_RSP         0x08                /* rcvtype: response */
291 #define   RX_FLAGS_ERROR                0x40                /* error in packet */
292 
293 /* txp_rx_desc.rx_stat (if rx_flags & RX_FLAGS_ERROR bit set) */
294 #define   RX_ERROR_ADAPTER    0x00000000          /* adapter internal error */
295 #define   RX_ERROR_FIFO                 0x00000001          /* fifo underrun */
296 #define   RX_ERROR_BADSSD               0x00000002          /* bad ssd */
297 #define   RX_ERROR_RUNT                 0x00000003          /* runt packet */
298 #define   RX_ERROR_CRC                  0x00000004          /* bad crc */
299 #define   RX_ERROR_OVERSIZE   0x00000005          /* oversized packet */
300 #define   RX_ERROR_ALIGN                0x00000006          /* alignment error */
301 #define   RX_ERROR_DRIBBLE    0x00000007          /* dribble bit */
302 
303 /* txp_rx_desc.rx_stat (if rx_flags & RX_FLAGS_ERROR not bit set) */
304 #define   RX_STAT_PROTO_M               0x00000003          /* protocol mask */
305 #define   RX_STAT_PROTO_UK    0x00000000          /* unknown protocol */
306 #define   RX_STAT_PROTO_IPX   0x00000001          /* IPX */
307 #define   RX_STAT_PROTO_IP    0x00000002          /* IP */
308 #define   RX_STAT_PROTO_RSV   0x00000003          /* reserved */
309 #define   RX_STAT_VLAN                  0x00000004          /* vlan tag (in rxd) */
310 #define   RX_STAT_IPFRAG                0x00000008          /* fragment, ipsec not done */
311 #define   RX_STAT_IPSEC                 0x00000010          /* ipsec decoded packet */
312 #define   RX_STAT_IPCKSUMBAD  0x00000020          /* ip checksum failed */
313 #define   RX_STAT_UDPCKSUMBAD 0x00000040          /* udp checksum failed */
314 #define   RX_STAT_TCPCKSUMBAD 0x00000080          /* tcp checksum failed */
315 #define   RX_STAT_IPCKSUMGOOD 0x00000100          /* ip checksum succeeded */
316 #define   RX_STAT_UDPCKSUMGOOD          0x00000200          /* udp checksum succeeded */
317 #define   RX_STAT_TCPCKSUMGOOD          0x00000400          /* tcp checksum succeeded */
318 
319 
320 struct txp_rxbuf_desc {
321           volatile u_int32_t  rb_paddrlo;
322           volatile u_int32_t  rb_paddrhi;
323 #ifdef notdef
324           volatile u_int32_t  rb_vaddrlo;
325           volatile u_int32_t  rb_vaddrhi;
326 #endif
327           union {
328                     struct txp_swdesc   *rb_sd;
329                     u_int64_t           rb_dummy;
330           } txp_rb_u;
331 };
332 
333 #define rb_sd       txp_rb_u.rb_sd
334 
335 /* Extension descriptor */
336 struct txp_ext_desc {
337           volatile u_int32_t  ext_1;
338           volatile u_int32_t  ext_2;
339           volatile u_int32_t  ext_3;
340           volatile u_int32_t  ext_4;
341 };
342 
343 struct txp_cmd_desc {
344           volatile u_int8_t   cmd_flags;
345           volatile u_int8_t   cmd_numdesc;
346           volatile u_int16_t  cmd_id;
347           volatile u_int16_t  cmd_seq;
348           volatile u_int16_t  cmd_par1;
349           volatile u_int32_t  cmd_par2;
350           volatile u_int32_t  cmd_par3;
351 };
352 #define   CMD_FLAGS_TYPE_M    0x07                /* type mask */
353 #define   CMD_FLAGS_TYPE_FRAG 0x00                /* type: fragment */
354 #define   CMD_FLAGS_TYPE_DATA 0x01                /* type: data frame */
355 #define   CMD_FLAGS_TYPE_CMD  0x02                /* type: command frame */
356 #define   CMD_FLAGS_TYPE_OPT  0x03                /* type: options */
357 #define   CMD_FLAGS_TYPE_RX   0x04                /* type: command */
358 #define   CMD_FLAGS_TYPE_RESP 0x05                /* type: response */
359 #define   CMD_FLAGS_RESP                0x40                /* response requested */
360 #define   CMD_FLAGS_VALID               0x80                /* valid descriptor */
361 
362 struct txp_rsp_desc {
363           volatile u_int8_t   rsp_flags;
364           volatile u_int8_t   rsp_numdesc;
365           volatile u_int16_t  rsp_id;
366           volatile u_int16_t  rsp_seq;
367           volatile u_int16_t  rsp_par1;
368           volatile u_int32_t  rsp_par2;
369           volatile u_int32_t  rsp_par3;
370 };
371 #define   RSP_FLAGS_TYPE_M    0x07                /* type mask */
372 #define   RSP_FLAGS_TYPE_FRAG 0x00                /* type: fragment */
373 #define   RSP_FLAGS_TYPE_DATA 0x01                /* type: data frame */
374 #define   RSP_FLAGS_TYPE_CMD  0x02                /* type: command frame */
375 #define   RSP_FLAGS_TYPE_OPT  0x03                /* type: options */
376 #define   RSP_FLAGS_TYPE_RX   0x04                /* type: command */
377 #define   RSP_FLAGS_TYPE_RESP 0x05                /* type: response */
378 #define   RSP_FLAGS_ERROR               0x40                /* response error */
379 
380 struct txp_frag_desc {
381           volatile u_int8_t   frag_flags;         /* type/descriptor flags */
382           volatile u_int8_t   frag_rsvd1;
383           volatile u_int16_t  frag_len; /* bytes in this fragment */
384           volatile u_int32_t  frag_addrlo;        /* phys addr low word */
385           volatile u_int32_t  frag_addrhi;        /* phys addr high word */
386           volatile u_int32_t  frag_rsvd2;
387 };
388 #define   FRAG_FLAGS_TYPE_M   0x07                /* type mask */
389 #define   FRAG_FLAGS_TYPE_FRAG          0x00                /* type: fragment */
390 #define   FRAG_FLAGS_TYPE_DATA          0x01                /* type: data frame */
391 #define   FRAG_FLAGS_TYPE_CMD 0x02                /* type: command frame */
392 #define   FRAG_FLAGS_TYPE_OPT 0x03                /* type: options */
393 #define   FRAG_FLAGS_TYPE_RX  0x04                /* type: command */
394 #define   FRAG_FLAGS_TYPE_RESP          0x05                /* type: response */
395 
396 struct txp_opt_desc {
397           u_int8_t            opt_desctype:3,
398                                         opt_rsvd:1,
399                                         opt_type:4;
400 
401           u_int8_t            opt_num;
402           u_int16_t           opt_dep1;
403           u_int32_t           opt_dep2;
404           u_int32_t           opt_dep3;
405           u_int32_t           opt_dep4;
406 };
407 
408 struct txp_ipsec_desc {
409           u_int8_t            ipsec_desctpe:3,
410                                         ipsec_rsvd:1,
411                                         ipsec_type:4;
412 
413           u_int8_t            ipsec_num;
414           u_int16_t           ipsec_flags;
415           u_int16_t           ipsec_ah1;
416           u_int16_t           ipsec_esp1;
417           u_int16_t           ipsec_ah2;
418           u_int16_t           ipsec_esp2;
419           u_int32_t           ipsec_rsvd1;
420 };
421 
422 struct txp_tcpseg_desc {
423           u_int8_t            tcpseg_desctype:3,
424                                         tcpseg_rsvd:1,
425                                         tcpseg_type:4;
426 
427           u_int8_t            tcpseg_num;
428 
429           u_int16_t           tcpseg_mss:12,
430                                         tcpseg_misc:4;
431 
432           u_int32_t           tcpseg_respaddr;
433           u_int32_t           tcpseg_txbytes;
434           u_int32_t           tcpseg_lss;
435 };
436 
437 /*
438  * Transceiver types
439  */
440 #define   TXP_XCVR_10_HDX               0
441 #define   TXP_XCVR_10_FDX               1
442 #define   TXP_XCVR_100_HDX    2
443 #define   TXP_XCVR_100_FDX    3
444 #define   TXP_XCVR_AUTO                 4
445 
446 #define TXP_MEDIA_CRC                   0x0004    /* crc strip disable */
447 #define   TXP_MEDIA_CD                  0x0010    /* collision detection */
448 #define   TXP_MEDIA_CS                  0x0020    /* carrier sense */
449 #define   TXP_MEDIA_POL                 0x0400    /* polarity reversed */
450 #define   TXP_MEDIA_NOLINK    0x0800    /* 0 = link, 1 = no link */
451 
452 /*
453  * receive filter bits (par1 to TXP_CMD_RX_FILTER_{READ|WRITE}
454  */
455 #define   TXP_RXFILT_DIRECT   0x0001    /* directed packets */
456 #define   TXP_RXFILT_ALLMULTI 0x0002    /* all multicast packets */
457 #define   TXP_RXFILT_BROADCAST          0x0004    /* broadcast packets */
458 #define   TXP_RXFILT_PROMISC  0x0008    /* promiscuous mode */
459 #define   TXP_RXFILT_HASHMULTI          0x0010    /* use multicast filter */
460 
461 /*
462  * boot record (pointers to rings)
463  */
464 struct txp_boot_record {
465           volatile u_int32_t  br_hostvar_lo;                /* host ring pointer */
466           volatile u_int32_t  br_hostvar_hi;
467           volatile u_int32_t  br_txlopri_lo;                /* tx low pri ring */
468           volatile u_int32_t  br_txlopri_hi;
469           volatile u_int32_t  br_txlopri_siz;
470           volatile u_int32_t  br_txhipri_lo;                /* tx high pri ring */
471           volatile u_int32_t  br_txhipri_hi;
472           volatile u_int32_t  br_txhipri_siz;
473           volatile u_int32_t  br_rxlopri_lo;                /* rx low pri ring */
474           volatile u_int32_t  br_rxlopri_hi;
475           volatile u_int32_t  br_rxlopri_siz;
476           volatile u_int32_t  br_rxbuf_lo;                  /* rx buffer ring */
477           volatile u_int32_t  br_rxbuf_hi;
478           volatile u_int32_t  br_rxbuf_siz;
479           volatile u_int32_t  br_cmd_lo;                    /* command ring */
480           volatile u_int32_t  br_cmd_hi;
481           volatile u_int32_t  br_cmd_siz;
482           volatile u_int32_t  br_resp_lo;                   /* response ring */
483           volatile u_int32_t  br_resp_hi;
484           volatile u_int32_t  br_resp_siz;
485           volatile u_int32_t  br_zero_lo;                   /* zero word */
486           volatile u_int32_t  br_zero_hi;
487           volatile u_int32_t  br_rxhipri_lo;                /* rx high pri ring */
488           volatile u_int32_t  br_rxhipri_hi;
489           volatile u_int32_t  br_rxhipri_siz;
490 };
491 
492 /*
493  * hostvar structure (shared with typhoon)
494  */
495 struct txp_hostvar {
496           volatile u_int32_t  hv_rx_hi_read_idx;  /* host->arm */
497           volatile u_int32_t  hv_rx_lo_read_idx;  /* host->arm */
498           volatile u_int32_t  hv_rx_buf_write_idx;          /* host->arm */
499           volatile u_int32_t  hv_resp_read_idx;   /* host->arm */
500           volatile u_int32_t  hv_tx_lo_desc_read_idx;       /* arm->host */
501           volatile u_int32_t  hv_tx_hi_desc_read_idx;       /* arm->host */
502           volatile u_int32_t  hv_rx_lo_write_idx; /* arm->host */
503           volatile u_int32_t  hv_rx_buf_read_idx; /* arm->host */
504           volatile u_int32_t  hv_cmd_read_idx;    /* arm->host */
505           volatile u_int32_t  hv_resp_write_idx;  /* arm->host */
506           volatile u_int32_t  hv_rx_hi_write_idx; /* arm->host */
507 };
508 
509 /*
510  * TYPHOON status register state (in TXP_A2H_0)
511  */
512 #define   STAT_ROM_CODE                           0x00000001
513 #define   STAT_ROM_EEPROM_LOAD                    0x00000002
514 #define   STAT_WAITING_FOR_BOOT                   0x00000007
515 #define   STAT_RUNNING                            0x00000009
516 #define   STAT_WAITING_FOR_HOST_REQUEST 0x0000000d
517 #define   STAT_WAITING_FOR_SEGMENT      0x00000010
518 #define   STAT_SLEEPING                           0x00000011
519 #define   STAT_HALTED                             0x00000014
520 
521 #define   TX_ENTRIES                              256
522 #define   RX_ENTRIES                              128
523 #define   RXBUF_ENTRIES                           256
524 #define   CMD_ENTRIES                             32
525 #define   RSP_ENTRIES                             32
526 
527 #define   OFFLOAD_TCPCKSUM              0x00000002          /* tcp checksum */
528 #define   OFFLOAD_UDPCKSUM              0x00000004          /* udp checksum */
529 #define   OFFLOAD_IPCKSUM                         0x00000008          /* ip checksum */
530 #define   OFFLOAD_IPSEC                           0x00000010          /* ipsec enable */
531 #define   OFFLOAD_BCAST                           0x00000020          /* broadcast throttle */
532 #define   OFFLOAD_DHCP                            0x00000040          /* dhcp prevention */
533 #define   OFFLOAD_VLAN                            0x00000080          /* vlan enable */
534 #define   OFFLOAD_FILTER                          0x00000100          /* filter enable */
535 #define   OFFLOAD_TCPSEG                          0x00000200          /* tcp segmentation */
536 #define   OFFLOAD_MASK                            0xfffffffe          /* mask off low bit */
537 
538 /*
539  * Macros for converting array indices to offsets within the descriptor
540  * arrays.  The chip operates on offsets, but it's much easier for us
541  * to operate on indices.  Assumes descriptor entries are 16 bytes.
542  */
543 #define   TXP_IDX2OFFSET(idx) ((idx) << 4)
544 #define   TXP_OFFSET2IDX(off) ((off) >> 4)
545 
546 struct txp_cmd_ring {
547           struct txp_cmd_desc *base;
548           u_int32_t           lastwrite;
549           u_int32_t           size;
550 };
551 
552 struct txp_rsp_ring {
553           struct txp_rsp_desc *base;
554           u_int32_t           lastwrite;
555           u_int32_t           size;
556 };
557 
558 struct txp_tx_ring {
559           struct txp_tx_desc  *r_desc;  /* base address of descs */
560           u_int32_t           r_reg;              /* register to activate */
561           u_int32_t           r_prod;             /* producer */
562           u_int32_t           r_cons;             /* consumer */
563           u_int32_t           r_cnt;              /* # descs in use */
564           volatile u_int32_t  *r_off;             /* hostvar index pointer */
565 };
566 
567 struct txp_swdesc {
568           struct mbuf *                 sd_mbuf;
569           bus_dmamap_t                  sd_map;
570 };
571 
572 struct txp_rx_ring {
573           struct txp_rx_desc  *r_desc;  /* base address of descs */
574           volatile u_int32_t  *r_roff;  /* hv read offset ptr */
575           volatile u_int32_t  *r_woff;  /* hv write offset ptr */
576 };
577 
578 struct txp_ldata {
579           struct txp_boot_record        txp_boot;
580           struct txp_hostvar  txp_hostvar;
581           struct txp_tx_desc  txp_txhiring[TX_ENTRIES];
582           struct txp_tx_desc  txp_txloring[TX_ENTRIES];
583           struct txp_rxbuf_desc         txp_rxbufs[RXBUF_ENTRIES];
584           struct txp_rx_desc  txp_rxhiring[RX_ENTRIES];
585           struct txp_rx_desc  txp_rxloring[RX_ENTRIES];
586           struct txp_cmd_desc txp_cmdring[CMD_ENTRIES];
587           struct txp_rsp_desc txp_rspring[RSP_ENTRIES];
588           u_int32_t           txp_zero;
589 };
590 
591 struct txp_softc {
592           struct arpcom                 sc_arpcom;          /* ethernet common */
593           struct txp_hostvar  *sc_hostvar;
594           struct txp_boot_record        *sc_boot;
595           bus_space_handle_t  sc_bh;              /* bus handle (regs) */
596           bus_space_tag_t               sc_bt;              /* bus tag (regs) */
597           struct resource               *sc_res;
598           struct resource               *sc_irq;
599           void                          *sc_intrhand;
600           struct txp_ldata    *sc_ldata;
601           void                          *sc_fwbuf;
602           int                           sc_rxbufprod;
603           struct txp_cmd_ring sc_cmdring;
604           struct txp_rsp_ring sc_rspring;
605           struct txp_swdesc   sc_txd[TX_ENTRIES];
606           struct callout                txp_stat_timer;
607           struct ifmedia                sc_ifmedia;
608           struct txp_tx_ring  sc_txhir, sc_txlor;
609           struct txp_rxbuf_desc         *sc_rxbufs;
610           struct txp_rx_ring  sc_rxhir, sc_rxlor;
611           u_int16_t           sc_xcvr;
612           u_int16_t           sc_seq;
613           u_int32_t           sc_rx_capability, sc_tx_capability;
614 };
615 
616 struct txp_fw_file_header {
617           u_int8_t  magicid[8];         /* TYPHOON\0 */
618           u_int32_t version;
619           u_int32_t nsections;
620           u_int32_t addr;
621 };
622 
623 struct txp_fw_section_header {
624           u_int32_t nbytes;
625           u_int16_t cksum;
626           u_int16_t reserved;
627           u_int32_t addr;
628 };
629 
630 #define   TXP_MAX_SEGLEN      0xffff
631 #define   TXP_MAX_PKTLEN      0x0800
632 
633 #define   WRITE_REG(sc,reg,val) \
634     bus_space_write_4((sc)->sc_bt, (sc)->sc_bh, reg, val)
635 #define   READ_REG(sc,reg) \
636     bus_space_read_4((sc)->sc_bt, (sc)->sc_bh, reg)
637 
638 struct txp_type {
639           u_int16_t           txp_vid;
640           u_int16_t           txp_did;
641           char                          *txp_name;
642 };
643