summaryrefslogtreecommitdiffstats
path: root/sys/dev/utopia/utopia.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/utopia/utopia.h')
-rw-r--r--sys/dev/utopia/utopia.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/sys/dev/utopia/utopia.h b/sys/dev/utopia/utopia.h
new file mode 100644
index 0000000..59db880
--- /dev/null
+++ b/sys/dev/utopia/utopia.h
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $FreeBSD$
+ */
+#ifndef _DEV_UTOPIA_UTOPIA_H
+#define _DEV_UTOPIA_UTOPIA_H
+
+/* Structure for user-level register formatting */
+struct utopia_print {
+ uint8_t type; /* register type */
+ uint8_t reg; /* register number */
+ const char *name; /* register name */
+ const char *fmt; /* format for printing */
+};
+
+/*
+ * Types of registers
+ */
+#define UTP_REGT_BITS 0x0 /* use printb to print */
+#define UTP_REGT_INT8 0x1 /* 8 bit hex number */
+#define UTP_REGT_INT10BITS 0x2 /* 10 bit hex number + 6 bit printb */
+#define UTP_REGT_INT12 0x3 /* 12 bit LE hex */
+#define UTP_REGT_INT16 0x4 /* 16 bit LE hex */
+#define UTP_REGT_INT19 0x5 /* 19 bit LE hex */
+#define UTP_REGT_INT20 0x6 /* 20 bit LE hex */
+#define UTP_REGT_INT21 0x7 /* 21 bit LE hex */
+
+/* number of additional registers per type */
+#define UTP_REG_ADD 0, 0, 1, 1, 1, 2, 2, 2
+
+/* flags field */
+#define UTP_FL_NORESET 0x0001 /* cannot write MRESET register */
+#define UTP_FL_POLL_CARRIER 0x0002 /* need to poll for carrier */
+
+/* state field */
+#define UTP_ST_ACTIVE 0x0001 /* registers accessible */
+#define UTP_ST_SDH 0x0002 /* SDH or SONET */
+#define UTP_ST_UNASS 0x0004 /* produce unassigned cells */
+#define UTP_ST_NOSCRAMB 0x0008 /* no scrambling */
+#define UTP_ST_DETACH 0x0010 /* detaching */
+#define UTP_ST_ATTACHED 0x0020 /* successful attached */
+
+/* carrier field */
+#define UTP_CARR_UNKNOWN 0
+#define UTP_CARR_OK 1
+#define UTP_CARR_LOST 2
+
+/* loopback field */
+#define UTP_LOOP_NONE 0x0000
+#define UTP_LOOP_TIME 0x0001 /* timing source loopback */
+#define UTP_LOOP_DIAG 0x0002 /* diagnostic loopback */
+#define UTP_LOOP_LINE 0x0004 /* serial line loopback */
+#define UTP_LOOP_PARAL 0x0008 /* parallel diagnostic loopback */
+#define UTP_LOOP_TWIST 0x0010 /* twisted pair diagnostic loopback */
+#define UTP_LOOP_PATH 0x0020 /* diagnostic path loopback */
+
+/* type */
+#define UTP_TYPE_UNKNOWN 0
+#define UTP_TYPE_SUNI_LITE 1
+#define UTP_TYPE_SUNI_ULTRA 2
+#define UTP_TYPE_SUNI_622 3
+#define UTP_TYPE_IDT77105 4
+
+#ifdef _KERNEL
+
+#include <sys/queue.h>
+
+/*
+ * These must be implemented by the card driver
+ */
+struct utopia_methods {
+ /* read at most n PHY registers starting at reg into val */
+ int (*readregs)(struct ifatm *, u_int reg, uint8_t *val, u_int *n);
+
+ /* change the bits given by mask to them in val in register reg */
+ int (*writereg)(struct ifatm *, u_int reg, u_int mask, u_int val);
+};
+
+/*
+ * Public state
+ */
+struct utopia {
+ struct ifatm *ifatm; /* driver data */
+ struct ifmedia *media; /* driver supplied */
+ struct mtx *lock; /* driver supplied */
+ const struct utopia_methods *methods;
+ LIST_ENTRY(utopia) link; /* list of these structures */
+ u_int flags; /* flags set by the driver */
+ u_int state; /* current state */
+ u_int carrier; /* carrier state */
+ u_int loopback; /* loopback mode */
+ const struct utopia_chip *chip; /* chip operations */
+};
+
+struct utopia_chip {
+ /* type and name of the chip */
+ u_int type;
+ const char *const name;
+
+ /* number of registers */
+ u_int nregs;
+
+ /* reset chip to known state */
+ int (*reset)(struct utopia *);
+
+ /* set SONET/SDH mode */
+ int (*set_sdh)(struct utopia *, int sdh);
+
+ /* set idle/unassigned cells */
+ int (*set_unass)(struct utopia *, int unass);
+
+ /* enable/disable scrambling */
+ int (*set_noscramb)(struct utopia *, int noscramb);
+
+ /* update carrier status */
+ int (*update_carrier)(struct utopia *);
+
+ /* set loopback mode */
+ int (*set_loopback)(struct utopia *, u_int mode);
+
+ /* handle interrupt */
+ void (*intr)(struct utopia *);
+};
+
+/*
+ * These are implemented in the common utopia code
+ */
+int utopia_attach(struct utopia *, struct ifatm *, struct ifmedia *,
+ struct mtx *, struct sysctl_ctx_list *, struct sysctl_oid_list *,
+ const struct utopia_methods *);
+void utopia_detach(struct utopia *);
+
+int utopia_start(struct utopia *);
+void utopia_stop(struct utopia *);
+
+void utopia_init_media(struct utopia *);
+void utopia_reset_media(struct utopia *);
+
+#define utopia_reset(S) ((S)->chip->reset((S)))
+#define utopia_set_sdh(S, SDH) ((S)->chip->set_sdh((S), (SDH)))
+#define utopia_set_unass(S, U) ((S)->chip->set_unass((S), (U)))
+#define utopia_set_noscramb(S, N) ((S)->chip->set_noscramb((S), (N)))
+#define utopia_update_carrier(S) ((S)->chip->update_carrier((S)))
+#define utopia_set_loopback(S, L) ((S)->chip->set_loopback((S), (L)))
+#define utopia_intr(S) ((S)->chip->intr((S)))
+
+#endif /* _KERNEL */
+
+#endif /* _DEV_UTOPIA_UTOPIA_H */
OpenPOWER on IntegriCloud