3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
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.
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
27 * Author: Hartmut Brandt <harti@freebsd.org>
31 #ifndef _DEV_UTOPIA_UTOPIA_H
32 #define _DEV_UTOPIA_UTOPIA_H
34 /* Structure for user-level register formatting */
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 */
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 */
55 /* number of additional registers per type */
56 #define UTP_REG_ADD 0, 0, 1, 1, 1, 2, 2, 2, 2
59 #define UTP_FL_NORESET 0x0001 /* cannot write MRESET register */
60 #define UTP_FL_POLL_CARRIER 0x0002 /* need to poll for carrier */
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 */
71 #define UTP_CARR_UNKNOWN 0
73 #define UTP_CARR_LOST 2
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 */
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
94 * Statistics. These structures are versioned.
96 struct utopia_stats1 {
97 uint32_t version; /* version of this statistics struct */
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 */
110 uint64_t tx_cells; /* transmitted cells */
115 #include <sys/queue.h>
118 * These must be implemented by the card driver
120 struct 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);
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);
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 */
146 /* type and name of the chip */
148 const char *const name;
150 /* number of registers */
153 /* reset chip to known state */
154 int (*reset)(struct utopia *);
156 /* set SONET/SDH mode */
157 int (*set_sdh)(struct utopia *, int sdh);
159 /* set idle/unassigned cells */
160 int (*set_unass)(struct utopia *, int unass);
162 /* enable/disable scrambling */
163 int (*set_noscramb)(struct utopia *, int noscramb);
165 /* update carrier status */
166 int (*update_carrier)(struct utopia *);
168 /* set loopback mode */
169 int (*set_loopback)(struct utopia *, u_int mode);
171 /* handle interrupt */
172 void (*intr)(struct utopia *);
174 /* update statistics */
175 void (*update_stats)(struct utopia *);
179 * These are implemented in the common utopia code
181 int utopia_attach(struct utopia *, struct ifatm *, struct ifmedia *,
182 struct mtx *, struct sysctl_ctx_list *, struct sysctl_oid_list *,
183 const struct utopia_methods *);
184 void utopia_detach(struct utopia *);
186 int utopia_start(struct utopia *);
187 void utopia_stop(struct utopia *);
189 void utopia_init_media(struct utopia *);
190 void utopia_reset_media(struct utopia *);
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)))
203 #endif /* _DEV_UTOPIA_UTOPIA_H */