xref: /freebsd-11-stable/sys/dev/fatm/if_fatmreg.h (revision 453130d9bfc1c6d68b366dfcb041689d69f81295)
1 /*-
2  * Copyright (c) 2001-2003
3  *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4  * 	All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * Author: Hartmut Brandt <harti@freebsd.org>
28  *
29  * $FreeBSD$
30  *
31  * Fore PCA200E hardware definitions.
32  */
33 
34 /*
35  * Fore implements some additional PCI registers. One of them is the
36  * master control register. One of the bits allow to automatically byte
37  * swap accesses to the on-board RAM.
38  */
39 #define	FATM_PCIR_MCTL	0x41
40 #define	FATM_PCIM_SWAB	0x100
41 
42 /*
43  * Operations codes for commands.
44  */
45 enum {
46 	FATM_OP_INITIALIZE	= 0x01,	/* Initialize the card */
47 	FATM_OP_ACTIVATE_VCIN	= 0x02,	/* Start reassembly on a channel */
48 	FATM_OP_ACTIVATE_VCOUT	= 0x03,	/* (not used) */
49 	FATM_OP_DEACTIVATE_VCIN	= 0x04,	/* Stop reassembly on a channel */
50 	FATM_OP_DEACTIVATE_VCOUT= 0x05,	/* (not used) */
51 	FATM_OP_REQUEST_STATS	= 0x06,	/* Get statistics */
52 	FATM_OP_OC3_SET_REG	= 0x07,	/* Set OC3 chip register */
53 	FATM_OP_OC3_GET_REG	= 0x08,	/* Get OC3 chip registers */
54 	FATM_OP_ZERO_STATS	= 0x09,	/* Zero out statistics */
55 	FATM_OP_GET_PROM_DATA	= 0x0a,	/* Return expansion ROM data */
56 	FATM_OP_SETVPI_BITS	= 0x0b,	/* (not used, not implemented) */
57 
58 	FATM_OP_INTERRUPT_SEL	= 0x80,	/* Request interrupt on completion */
59 };
60 
61 /*
62  * Status word definitions. Before initiating an operation the host sets the
63  * status word to PENDING. The card sets it to COMPLETE upon completion of
64  * the transmit/receive or command. An unused queue entry contains FREE.
65  * The ERROR can be ored into the COMPLETE. Note, that there are circumstances
66  * when ERROR is set without COMPLETE being set (when you try to activate
67  * a bad VCI like, for example, VCI 0).
68  */
69 enum {
70 	FATM_STAT_PENDING	= 0x01,
71 	FATM_STAT_COMPLETE	= 0x02,
72 	FATM_STAT_FREE		= 0x04,
73 	FATM_STAT_ERROR		= 0x08,
74 };
75 
76 /*
77  * On board queue offsets. There are two fundamentally different queue types:
78  * the command queue and all other queues. The command queue has 32 byte
79  * entries on the card which contain the operation code, parameters and the
80  * DMA pointer to the status word. All other queues have 8 byte entries, which
81  * contain a DMA pointer to the i/o block, that contains the parameters, and
82  * a DMA pointer to the status word.
83  */
84 #define	FATMOC_OP		0	/* cmd queue: offset to op code */
85 #define	FATMOC_PARAM		4	/* cmd queue: offset to parameters */
86 #define	FATMOC_STATP		16	/* cmd queue: offset to status ptr */
87 #define	FATMOC_END		32	/* cmd queue: element size */
88 
89 #define	FATMOC_ACTIN_VPVC	(FATMOC_PARAM + 0)
90 #define	FATMOC_ACTIN_MTU	(FATMOC_PARAM + 4)
91 #define	FATMOC_DEACTIN_VPVC	(FATMOC_PARAM + 0)
92 #define	FATMOC_GETOC3_BUF	(FATMOC_PARAM + 0)
93 #define	FATMOC_GSTAT_BUF	(FATMOC_PARAM + 0)
94 #define	FATMOC_GPROM_BUF	(FATMOC_PARAM + 0)
95 
96 #define	FATMOS_IOBLK		0	/* other queues: offset to ioblk ptr */
97 #define	FATMOS_STATP		4	/* other queues: offset to status ptr */
98 
99 #define	FATM_MAKE_SETOC3(REG,VAL,MASK)					\
100     (FATM_OP_OC3_SET_REG | (((REG) & 0xff) << 8) | 			\
101      (((VAL) & 0xff) << 16) | (((MASK) & 0xff) << 24))
102 #define	FATM_NREGS	128
103 
104 
105 /*
106  * On board memory layout.
107  *
108  * The card contains up to 2MByte memory that is mapped at virtual offset 0.
109  * It is followed by three registers. The memory contains two areas at
110  * fixed addresses: the mon960 area that is used for communication with
111  * the card's operating system and the common block that is used by the
112  * firmware to communicate with the driver.
113  */
114 #define	FATM_RAM_SIZE		(256 * 1024)	/* normal RAM size */
115 
116 #define	FATMO_RAM		(0x0)		/* virtual RAM start */
117 #define	FATMO_MON960		(0x400)		/* mon960 communication area */
118 #define	FATMO_COMMON_ORIGIN	(0x4d40)	/* firmware comm. area */
119 
120 #define	FATMO_HCR		(0x100000)	/* host control registers */
121 #define	FATMO_HIMR		(0x100004)	/* host interrupt mask */
122 #define	FATMO_PSR		(0x100008)	/* PCI control register */
123 
124 #define	FATMO_END		(0x200000)	/* end of mapped area */
125 
126 /*
127  * The mon960 area contains two cells that are used as a virtual serial
128  * interface, a status word, the base for loading the application (i.e.
129  * firmware) and a version number.
130  */
131 #define	FATMO_UART_TO_960	(FATMO_MON960 + 0)
132 #define	FATMO_UART_TO_HOST	(FATMO_MON960 + 4)
133 #define	FATMO_BOOT_STATUS	(FATMO_MON960 + 8)
134 #define	FATMO_APP_BASE		(FATMO_MON960 + 12)
135 #define	FATMO_VERSION		(FATMO_MON960 + 16)
136 
137 
138 /*
139  * The host control register allows to hold the i960 or send it interrupts.
140  * The bits have different meaning on read and write.
141  */
142 #define	FATM_HCR_RESET		0x01	/* (W) reset the card */
143 #define	FATM_HCR_LOCK_HOLD	0x02	/* (W) hold the i960 */
144 #define	FATM_HCR_I960FAIL	0x04	/* (R) internal self-test failed */
145 #define	FATM_HCR_INTR2		0x04	/* (W) assert i960 interrupt 2 */
146 #define	FATM_HCR_HOLDA		0x08	/* (R) hold ack from i960 */
147 #define	FATM_HCR_INTR1		0x08	/* (W) assert i960 interrupt 1 */
148 #define	FATM_HCR_OFIFO		0x10	/* (R) DMA request FIFO full */
149 #define	FATM_HCR_CLRIRQ		0x10	/* (W) clear interrupt request */
150 #define	FATM_HCR_ESP_HOLD	0x20	/* (R) SAR chip holds i960 */
151 #define	FATM_HCR_IFIFO		0x40	/* (R) input FIFO full */
152 #define	FATM_HCR_TESTMODE	0x80	/* (R) board is in test mode */
153 
154 /*
155  * The mon960 area contains a virtual UART and a status word.
156  * The UART uses a simple protocol: a zero means, that there is no
157  * character available from the i960 or that one can write the next
158  * character to the i960. This character has to be ored with 0x1000000
159  * to signal to the i960 that there is a new character.
160  * The cold_start values must be written to the status word, the others
161  * denote certain stages of initializing.
162  */
163 #define	XMIT_READY	0
164 #define	CHAR_AVAIL	0x1000000
165 
166 #define	COLD_START	0xc01dc01d
167 #define	SELF_TEST_OK	0x02201958
168 #define	SELF_TEST_FAIL	0xadbadbad
169 #define	CP_RUNNING	0xce11feed
170 #define	MON906_TOO_BIG	0x10aded00
171 
172 /*
173  * The firmware communication area contains a big structure most of which
174  * is used only during initialisation.
175  */
176 /*
177  * These are the offsets to the onboard queues that are valid after the
178  * initialisation command has completed.
179  */
180 #define	FATMO_COMMAND_QUEUE	(FATMO_COMMON_ORIGIN + 0)
181 #define	FATMO_TRANSMIT_QUEUE	(FATMO_COMMON_ORIGIN + 4)
182 #define	FATMO_RECEIVE_QUEUE	(FATMO_COMMON_ORIGIN + 8)
183 #define	FATMO_SMALL_B1_QUEUE	(FATMO_COMMON_ORIGIN + 12)
184 #define	FATMO_LARGE_B1_QUEUE	(FATMO_COMMON_ORIGIN + 16)
185 #define	FATMO_SMALL_B2_QUEUE	(FATMO_COMMON_ORIGIN + 20)
186 #define	FATMO_LARGE_B2_QUEUE	(FATMO_COMMON_ORIGIN + 24)
187 
188 /*
189  * If the interrupt mask is set to 1, interrupts to the host are queued, but
190  * inhbited. The istat variable is set, when this card has posted an interrupt.
191  */
192 #define	FATMO_IMASK		(FATMO_COMMON_ORIGIN + 28)
193 #define	FATMO_ISTAT		(FATMO_COMMON_ORIGIN + 32)
194 
195 /*
196  * This is the offset and the size of the queue area. Could be used to
197  * dynamically compute queue sizes.
198  */
199 #define	FATMO_HEAP_BASE		(FATMO_COMMON_ORIGIN + 36)
200 #define	FATMO_HEAP_SIZE		(FATMO_COMMON_ORIGIN + 40)
201 
202 #define	FATMO_HLOGGER		(FATMO_COMMON_ORIGIN + 44)
203 
204 /*
205  * The heartbeat variable is incremented in each loop of the normal processing.
206  * If it is stuck this means, that the card had a fatal error. In this case
207  * it may set the word to a number of values of the form 0xdeadXXXX where
208  * XXXX is an error code.
209  */
210 #define	FATMO_HEARTBEAT		(FATMO_COMMON_ORIGIN + 48)
211 
212 #define	FATMO_FIRMWARE_RELEASE	(FATMO_COMMON_ORIGIN + 52)
213 #define	FATMO_MON960_RELEASE	(FATMO_COMMON_ORIGIN + 56)
214 #define	FATMO_TQ_PLEN		(FATMO_COMMON_ORIGIN + 60)
215 
216 /*
217  * At this offset the init command block is located. The init command cannot
218  * use the normal queue mechanism because it is used to initialize the
219  * queues. For this reason it is located at this fixed offset.
220  */
221 #define	FATMO_INIT		(FATMO_COMMON_ORIGIN + 64)
222 
223 /*
224  * physical media type
225  */
226 #define	FATMO_MEDIA_TYPE	(FATMO_COMMON_ORIGIN + 176)
227 #define	FATMO_OC3_REVISION	(FATMO_COMMON_ORIGIN + 180)
228 
229 /*
230  * End of the common block
231  */
232 #define	FATMO_COMMON_END	(FATMO_COMMON_ORIGIN + 184)
233 
234 /*
235  * The INITIALIZE command block. This is embedded into the above common
236  * block. The offsets are from the beginning of the command block.
237  */
238 #define	FATMOI_OP		0	/* operation code */
239 #define	FATMOI_STATUS		4	/* status word */
240 #define	FATMOI_RECEIVE_TRESHOLD	8	/* when to start interrupting */
241 #define	FATMOI_NUM_CONNECT	12	/* max number of VCIs */
242 #define	FATMOI_CQUEUE_LEN	16	/* length of command queue */
243 #define	FATMOI_TQUEUE_LEN	20	/* length of transmit queue */
244 #define	FATMOI_RQUEUE_LEN	24	/* length of receive queue */
245 #define	FATMOI_RPD_EXTENSION	28	/* additional 32 byte blocks */
246 #define	FATMOI_TPD_EXTENSION	32	/* additional 32 byte blocks */
247 #define	FATMOI_CONLESS_VPVC	36	/* (not used) */
248 #define	FATMOI_SMALL_B1		48	/* small buffer 1 pool */
249 #define	FATMOI_LARGE_B1		64	/* small buffer 2 pool */
250 #define	FATMOI_SMALL_B2		80	/* large buffer 1 pool */
251 #define	FATMOI_LARGE_B2		96	/* large buffer 2 pool */
252 #define	FATMOI_END		112	/* size of init block */
253 
254 /*
255  * Each of the four buffer schemes is initialized with a block that
256  * contains four words:
257  */
258 #define	FATMOB_QUEUE_LENGTH	0	/* supply queue length */
259 #define	FATMOB_BUFFER_SIZE	4	/* size of each buffer */
260 #define	FATMOB_POOL_SIZE	8	/* size of on-board pool */
261 #define	FATMOB_SUPPLY_BLKSIZE	12	/* number of buffers/supply */
262 
263 /*
264  * The fore firmware is a binary file, that starts with a header. The
265  * header contains the offset to where the file must be loaded and the
266  * entry for execution. The header must also be loaded onto the card!
267  */
268 struct firmware {
269 	uint32_t	id;		/* "FORE" */
270 	uint32_t	version;	/* firmware version */
271 	uint32_t	offset;		/* load offset */
272 	uint32_t	entry;		/* entry point */
273 };
274 #define	FATM_FWID	0x65726f66	/* "FORE" */
275 #define	FATM_FWVERSION	0x100		/* supported version */
276 
277 /*
278  * PDUs to be transmitted are described by Transmit PDU Descriptors.
279  * These descriptors are held in host memory, but referenced from the ioblk
280  * member of the queue structure on the card. The card DMAs the descriptor
281  * and than gather-DMAs the PDU transmitting it on-the-fly. Tpds are variable
282  * length in blocks of 32 byte (8 words). The minimum length is one block,
283  * maximum 15. The number of blocks beyond 1 is configured during the
284  * initialisation command (tpd_extension).
285  * Each gather-DMA segment is described by a segment descriptor. The buffer
286  * address and the length must be a multiple of four.
287  * Tpd must also be 4 byte aligned.
288  * Because of the minimum length of 32 byte, the first blocks contains already
289  * 2 segement descriptors. Each extension block holds four descriptors.
290  */
291 #define	TXD_FIXED	2
292 #define	SEGS_PER_BLOCK	4	/* segment descriptors per extension block */
293 struct txseg {
294 	uint32_t	buffer;		/* DMA buffer address */
295 	uint32_t	length;		/* and length */
296 };
297 struct tpd {
298 	uint32_t	atm_header;	/* header for the transmitted cells */
299 	uint32_t	spec;		/* PDU description */
300 	uint32_t	stream;		/* traffic shaping word */
301 	uint32_t	pad[1];
302 	struct txseg	segment[TXD_FIXED];
303 };
304 
305 #define	TDX_MKSPEC(INTR,AAL,NSEG,LEN) \
306 	(((INTR) << 28) | ((AAL) << 24) | ((NSEG) << 16) | (LEN))
307 #define	TDX_MKSTR(DATA,IDLE) \
308 	(((DATA) << 16) | (IDLE))
309 #define	TDX_MKHDR(VPI,VCI,PT,CLP) \
310 	(((VPI) << 20) | ((VCI) << 4) | ((PT) << 1) | (CLP))
311 #define	TDX_SEGS2BLKS(SEGS) \
312 	(1 + ((SEGS)-TXD_FIXED+SEGS_PER_BLOCK-1)/SEGS_PER_BLOCK)
313 
314 /*
315  * We want probably support scatter transmission, so we use the maximum
316  * transmit descriptor extension that is possible. Because the size of the
317  * Tpd is encoded in 32-byte blocks in a 4-bit field, the maximum extension
318  * is 14 such blocks. The value for the init command is the number of
319  * additional descriptor entries NOT the number of 32 byte blocks.
320  */
321 #define	TPD_EXTENSION_BLOCKS	14
322 #define	TPD_EXTENSIONS		(TPD_EXTENSION_BLOCKS * 4)
323 #define	TPD_SIZE		((size_t)((TPD_EXTENSION_BLOCKS+1) * 32))
324 
325 /*
326  * Received PDUs are handed from the card to the host by means of Receive
327  * PDU descriptors. Each segment describes on part of the PDU. The buffer
328  * handle is a 32 bit value that is supplied by the host and passed
329  * transparently back to the host by the card. It is used to locate the buffer.
330  * The length field is the number of actual bytes in that buffer.
331  */
332 #define	RXD_FIXED	3
333 struct rxseg {
334 	uint32_t	handle;		/* buffer handle */
335 	uint32_t	length;		/* number of bytes */
336 };
337 struct rpd {
338 	uint32_t	atm_header;
339 	uint32_t	nseg;
340 	struct rxseg	segment[RXD_FIXED];
341 };
342 
343 /*
344  * PDUs received are stored in buffers supplied to the card. We use only
345  * buffer scheme 1: small buffers are normal mbuf's which can hold three
346  * cells in their default size (256 byte) and mbuf clusters which can
347  * hold 42 cells (2 kbyte).
348  * The number of receive segments can be computed from these sizes:
349  */
350 #define	FATM_MAXPDU		65535
351 #define	MAXPDU_CELLS		((FATM_MAXPDU+47)/48)
352 
353 #define	SMALL_BUFFER_CELLS	(MHLEN/48)
354 #define	LARGE_BUFFER_CELLS	(MCLBYTES/48)
355 
356 #define	SMALL_BUFFER_LEN	(SMALL_BUFFER_CELLS * 48)
357 #define	LARGE_BUFFER_LEN	(LARGE_BUFFER_CELLS * 48)
358 
359 /*
360  * The card first alloctes a small buffer and the switches to large
361  * buffers. So the number of large buffers needed to store the maximum
362  * PDU is:
363  */
364 #define	MAX_LARGE_BUFFERS	((MAXPDU_CELLS - SMALL_BUFFER_CELLS	\
365 				  + LARGE_BUFFER_CELLS - 1)		\
366 				 / LARGE_BUFFER_CELLS)			\
367 
368 /*
369  * From this we get the number of extension blocks for the Rpds as:
370  */
371 #define	RPD_EXTENSION_BLOCKS	((MAX_LARGE_BUFFERS + 1 - RXD_FIXED	\
372 				  + SEGS_PER_BLOCK - 1)			\
373 				 / SEGS_PER_BLOCK)
374 #define	RPD_EXTENSIONS		(RPD_EXTENSION_BLOCKS * 4)
375 #define	RPD_SIZE		((size_t)((RPD_EXTENSION_BLOCKS+1) * 32))
376 
377 /*
378  * Buffers are supplied to the card prior receiving by the supply queues.
379  * We use two queues: scheme 1 small buffers and scheme 1 large buffers.
380  * The queues and on-card pools are initialized by the initialize command.
381  * Buffers are supplied in chunks. Each chunk can contain from 4 to 124
382  * buffers in multiples of four. The chunk sizes are configured by the
383  * initialize command. Each buffer in a chunk is described by a Receive
384  * Buffer Descriptor that is held in host memory and given as the ioblk
385  * to the card.
386  */
387 #define	BSUP_BLK2SIZE(CHUNK)	(8 * (CHUNK))
388 
389 struct rbd {
390 	uint32_t	handle;
391 	uint32_t	buffer;		/* DMA address for card */
392 };
393 
394 /*
395  * The PCA200E has an expansion ROM that contains version information and
396  * the FORE-assigned MAC address. It can be read via the get_prom_data
397  * operation.
398  */
399 struct prom {
400 	uint32_t	version;
401 	uint32_t	serial;
402 	uint8_t		mac[8];
403 };
404 
405 /*
406  * The media type member of the firmware communication block contains a
407  * code that describes the physical medium and physical protocol.
408  */
409 #define	FORE_MT_TAXI_100	0x04
410 #define	FORE_MT_TAXI_140	0x05
411 #define	FORE_MT_UTP_SONET	0x06
412 #define	FORE_MT_MM_OC3_ST	0x16
413 #define	FORE_MT_MM_OC3_SC	0x26
414 #define	FORE_MT_SM_OC3_ST	0x36
415 #define	FORE_MT_SM_OC3_SC	0x46
416 
417 /*
418  * Assorted constants
419  */
420 #define	FORE_MAX_VCC	1024	/* max. number of VCIs supported */
421 #define	FORE_VCIBITS	10
422 
423 #define	FATM_STATE_TIMEOUT	500	/* msec */
424 
425 /*
426  * Statistics as delivered by the FORE cards
427  */
428 struct fatm_stats {
429 	struct {
430 		uint32_t	crc_header_errors;
431 		uint32_t	framing_errors;
432 		uint32_t	pad[2];
433 	}			phy_4b5b;
434 
435 	struct {
436 		uint32_t	section_bip8_errors;
437 		uint32_t	path_bip8_errors;
438 		uint32_t	line_bip24_errors;
439 		uint32_t	line_febe_errors;
440 		uint32_t	path_febe_errors;
441 		uint32_t	corr_hcs_errors;
442 		uint32_t	ucorr_hcs_errors;
443 		uint32_t	pad[1];
444 	}			phy_oc3;
445 
446 	struct {
447 		uint32_t	cells_transmitted;
448 		uint32_t	cells_received;
449 		uint32_t	vpi_bad_range;
450 		uint32_t	vpi_no_conn;
451 		uint32_t	vci_bad_range;
452 		uint32_t	vci_no_conn;
453 		uint32_t	pad[2];
454 	}			atm;
455 
456 	struct {
457 		uint32_t	cells_transmitted;
458 		uint32_t	cells_received;
459 		uint32_t	cells_dropped;
460 		uint32_t	pad[1];
461 	}			aal0;
462 
463 	struct {
464 		uint32_t	cells_transmitted;
465 		uint32_t	cells_received;
466 		uint32_t	cells_crc_errors;
467 		uint32_t	cels_protocol_errors;
468 		uint32_t	cells_dropped;
469 		uint32_t	cspdus_transmitted;
470 		uint32_t	cspdus_received;
471 		uint32_t	cspdus_protocol_errors;
472 		uint32_t	cspdus_dropped;
473 		uint32_t	pad[3];
474 	}			aal4;
475 
476 	struct {
477 		uint32_t	cells_transmitted;
478 		uint32_t	cells_received;
479 		uint32_t	congestion_experienced;
480 		uint32_t	cells_dropped;
481 		uint32_t	cspdus_transmitted;
482 		uint32_t	cspdus_received;
483 		uint32_t	cspdus_crc_errors;
484 		uint32_t	cspdus_protocol_errors;
485 		uint32_t	cspdus_dropped;
486 		uint32_t	pad[3];
487 	}			aal5;
488 
489 	struct {
490 		uint32_t	small_b1_failed;
491 		uint32_t	large_b1_failed;
492 		uint32_t	small_b2_failed;
493 		uint32_t	large_b2_failed;
494 		uint32_t	rpd_alloc_failed;
495 		uint32_t	receive_carrier;
496 		uint32_t	pad[2];
497 	}			aux;
498 };
499 #define	FATM_NSTATS	42
500