1/*-
2 * Copyright (c) 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#ifndef _DEV_UTOPIA_UTOPIA_H
32#define	_DEV_UTOPIA_UTOPIA_H
33
34/* Structure for user-level register formatting */
35struct utopia_print {
36	uint8_t		type;	/* register type */
37	uint8_t		reg;	/* register number */
38	const char	*name;	/* register name */
39	const char	*fmt;	/* format for printing */
40};
41
42/*
43 * Types of registers
44 */
45#define	UTP_REGT_BITS		0x0	/* use printb to print */
46#define	UTP_REGT_INT8		0x1	/* 8 bit hex number */
47#define	UTP_REGT_INT10BITS	0x2	/* 10 bit hex number + 6 bit printb */
48#define	UTP_REGT_INT12		0x3	/* 12 bit LE hex */
49#define	UTP_REGT_INT16		0x4	/* 16 bit LE hex */
50#define	UTP_REGT_INT19		0x5	/* 19 bit LE hex */
51#define	UTP_REGT_INT20		0x6	/* 20 bit LE hex */
52#define	UTP_REGT_INT21		0x7	/* 21 bit LE hex */
53#define	UTP_REGT_INT18		0x8	/* 18 bit LE hex */
54
55/* number of additional registers per type */
56#define	UTP_REG_ADD	0, 0, 1, 1, 1, 2, 2, 2, 2
57
58/* flags field */
59#define	UTP_FL_NORESET		0x0001	/* cannot write MRESET register */
60#define	UTP_FL_POLL_CARRIER	0x0002	/* need to poll for carrier */
61
62/* state field */
63#define	UTP_ST_ACTIVE		0x0001	/* registers accessible */
64#define	UTP_ST_SDH		0x0002	/* SDH or SONET */
65#define	UTP_ST_UNASS		0x0004	/* produce unassigned cells */
66#define	UTP_ST_NOSCRAMB		0x0008	/* no scrambling */
67#define	UTP_ST_DETACH		0x0010	/* detaching */
68#define	UTP_ST_ATTACHED		0x0020	/* successful attached */
69
70/* carrier field */
71#define	UTP_CARR_UNKNOWN	0
72#define	UTP_CARR_OK		1
73#define	UTP_CARR_LOST		2
74
75/* loopback field */
76#define	UTP_LOOP_NONE		0x0000
77#define	UTP_LOOP_TIME		0x0001	/* timing source loopback */
78#define	UTP_LOOP_DIAG		0x0002	/* diagnostic loopback */
79#define	UTP_LOOP_LINE		0x0004	/* serial line loopback */
80#define	UTP_LOOP_PARAL		0x0008	/* parallel diagnostic loopback */
81#define	UTP_LOOP_TWIST		0x0010	/* twisted pair diagnostic loopback */
82#define	UTP_LOOP_PATH		0x0020	/* diagnostic path loopback */
83
84/* type */
85#define	UTP_TYPE_UNKNOWN	0
86#define	UTP_TYPE_SUNI_LITE	1
87#define	UTP_TYPE_SUNI_ULTRA	2
88#define	UTP_TYPE_SUNI_622	3
89#define	UTP_TYPE_IDT77105	4
90#define	UTP_TYPE_IDT77155	5
91#define	UTP_TYPE_CX28250	6
92
93/*
94 * Statistics. These structures are versioned.
95 */
96struct utopia_stats1 {
97	uint32_t	version;	/* version of this statistics struct */
98	uint32_t	fill;
99
100	uint64_t	rx_sbip;	/* rx section BIP errors */
101	uint64_t	rx_lbip;	/* rx line BIP errors */
102	uint64_t	rx_lfebe;	/* rx line far end block errors */
103	uint64_t	rx_pbip;	/* rx path BIP errors */
104	uint64_t	rx_pfebe;	/* rx path far end block errors */
105	uint64_t	rx_cells;	/* received cells */
106	uint64_t	rx_corr;	/* correctable cell errors */
107	uint64_t	rx_uncorr;	/* uncorrectable cell errors */
108	uint64_t	rx_symerr;	/* symbol errors */
109
110	uint64_t	tx_cells;	/* transmitted cells */
111};
112
113#ifdef _KERNEL
114
115#include <sys/queue.h>
116
117/*
118 * These must be implemented by the card driver
119 */
120struct utopia_methods {
121	/* read at most n PHY registers starting at reg into val */
122	int	(*readregs)(struct ifatm *, u_int reg, uint8_t *val, u_int *n);
123
124	/* change the bits given by mask to them in val in register reg */
125	int	(*writereg)(struct ifatm *, u_int reg, u_int mask, u_int val);
126};
127
128/*
129 * Public state
130 */
131struct utopia {
132	struct ifatm	*ifatm;		/* driver data */
133	struct ifmedia	*media;		/* driver supplied */
134	struct mtx	*lock;		/* driver supplied */
135	const struct utopia_methods *methods;
136	LIST_ENTRY(utopia) link;	/* list of these structures */
137	u_int		flags;		/* flags set by the driver */
138	u_int		state;		/* current state */
139	u_int		carrier;	/* carrier state */
140	u_int		loopback;	/* loopback mode */
141	const struct utopia_chip *chip;	/* chip operations */
142	struct utopia_stats1 stats;	/* statistics */
143};
144
145struct utopia_chip {
146	/* type and name of the chip */
147	u_int	type;
148	const char *const name;
149
150	/* number of registers */
151	u_int	nregs;
152
153	/* reset chip to known state */
154	int	(*reset)(struct utopia *);
155
156	/* set SONET/SDH mode */
157	int	(*set_sdh)(struct utopia *, int sdh);
158
159	/* set idle/unassigned cells */
160	int	(*set_unass)(struct utopia *, int unass);
161
162	/* enable/disable scrambling */
163	int	(*set_noscramb)(struct utopia *, int noscramb);
164
165	/* update carrier status */
166	int	(*update_carrier)(struct utopia *);
167
168	/* set loopback mode */
169	int	(*set_loopback)(struct utopia *, u_int mode);
170
171	/* handle interrupt */
172	void	(*intr)(struct utopia *);
173
174	/* update statistics */
175	void	(*update_stats)(struct utopia *);
176};
177
178/*
179 * These are implemented in the common utopia code
180 */
181int utopia_attach(struct utopia *, struct ifatm *, struct ifmedia *,
182    struct mtx *, struct sysctl_ctx_list *, struct sysctl_oid_list *,
183    const struct utopia_methods *);
184void utopia_detach(struct utopia *);
185
186int utopia_start(struct utopia *);
187void utopia_stop(struct utopia *);
188
189void utopia_init_media(struct utopia *);
190void utopia_reset_media(struct utopia *);
191
192#define	utopia_reset(S)			((S)->chip->reset((S)))
193#define	utopia_set_sdh(S, SDH)		((S)->chip->set_sdh((S), (SDH)))
194#define	utopia_set_unass(S, U)		((S)->chip->set_unass((S), (U)))
195#define	utopia_set_noscramb(S, N)	((S)->chip->set_noscramb((S), (N)))
196#define	utopia_update_carrier(S)	((S)->chip->update_carrier((S)))
197#define	utopia_update_stats(S)		((S)->chip->update_stats((S)))
198#define	utopia_set_loopback(S, L)	((S)->chip->set_loopback((S), (L)))
199#define	utopia_intr(S)			((S)->chip->intr((S)))
200
201#endif /* _KERNEL */
202
203#endif	/* _DEV_UTOPIA_UTOPIA_H */
204