1 /* $OpenBSD: cn30xxgmxvar.h,v 1.14 2024/05/20 23:13:33 jsg Exp $ */
2
3 /*
4 * Copyright (c) 2007 Internet Initiative Japan, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #ifndef _CN30XXGMXVAR_H_
30 #define _CN30XXGMXVAR_H_
31
32 #include <sys/kstat.h>
33 #include <sys/socket.h>
34 #include <net/if.h>
35 #include <net/if_media.h>
36 #include <netinet/in.h>
37 #include <netinet/if_ether.h>
38 #include <dev/mii/mii.h>
39 #include <dev/mii/miivar.h>
40
41 #include "kstat.h"
42
43 #define GMX_MII_PORT 1
44 #define GMX_GMII_PORT 2
45 #define GMX_RGMII_PORT 3
46 #define GMX_SGMII_PORT 4
47 #define GMX_SPI42_PORT 5
48 #define GMX_AGL_PORT 6
49
50 #define GMX_FRM_MAX_SIZ 0x600
51
52 /* Disable 802.3x flow-control when AutoNego is enabled */
53 #define GMX_802_3X_DISABLE_AUTONEG
54
55
56 struct cn30xxgmx_softc;
57 struct cn30xxgmx_port_softc;
58
59 struct cn30xxgmx_port_softc {
60 struct cn30xxgmx_softc *sc_port_gmx;
61 bus_space_handle_t sc_port_regh;
62 int sc_port_no; /* GMX0:0, GMX0:1, ... */
63 int sc_port_type;
64 uint64_t sc_link;
65 struct mii_data *sc_port_mii;
66 struct arpcom *sc_port_ac;
67 struct cn30xxgmx_port_ops
68 *sc_port_ops;
69 struct cn30xxasx_softc *sc_port_asx;
70 bus_space_handle_t sc_port_pcs_regh;
71 struct cn30xxipd_softc *sc_ipd;
72 uint64_t sc_port_flowflags;
73 };
74
75 struct cn30xxgmx_softc {
76 struct device sc_dev;
77
78 bus_space_tag_t sc_regt;
79 bus_space_handle_t sc_regh;
80 int sc_unitno; /* GMX0, GMX1, ... */
81 int sc_nports;
82 int sc_port_types[4/* XXX */];
83
84 struct cn30xxgmx_port_softc
85 *sc_ports;
86 };
87
88
89 struct cn30xxgmx_attach_args {
90 bus_space_tag_t ga_regt;
91 bus_addr_t ga_addr;
92 bus_dma_tag_t ga_dmat;
93 const char *ga_name;
94 int ga_portno;
95 int ga_port_type;
96 struct cn30xxsmi_softc *ga_smi;
97 int ga_phy_addr;
98
99 struct cn30xxgmx_softc *ga_gmx;
100 struct cn30xxgmx_port_softc
101 *ga_gmx_port;
102 };
103
104 int cn30xxgmx_link_enable(struct cn30xxgmx_port_softc *, int);
105 void cn30xxgmx_stats_init(struct cn30xxgmx_port_softc *);
106 void cn30xxgmx_tx_int_enable(struct cn30xxgmx_port_softc *, int);
107 void cn30xxgmx_rx_int_enable(struct cn30xxgmx_port_softc *, int);
108 int cn30xxgmx_rx_frm_ctl_enable(struct cn30xxgmx_port_softc *,
109 uint64_t rx_frm_ctl);
110 int cn30xxgmx_rx_frm_ctl_disable(struct cn30xxgmx_port_softc *,
111 uint64_t rx_frm_ctl);
112 int cn30xxgmx_tx_thresh(struct cn30xxgmx_port_softc *, int);
113 int cn30xxgmx_set_filter(struct cn30xxgmx_port_softc *);
114 int cn30xxgmx_port_enable(struct cn30xxgmx_port_softc *, int);
115 int cn30xxgmx_reset_speed(struct cn30xxgmx_port_softc *);
116 int cn30xxgmx_reset_flowctl(struct cn30xxgmx_port_softc *);
117 int cn30xxgmx_reset_timing(struct cn30xxgmx_port_softc *);
118 #if NKSTAT > 0
119 void cn30xxgmx_kstat_read(struct cn30xxgmx_port_softc *,
120 struct kstat_kv *);
121 #endif
122
123 static inline int
cn30xxgmx_link_status(struct cn30xxgmx_port_softc * sc)124 cn30xxgmx_link_status(struct cn30xxgmx_port_softc *sc)
125 {
126 return ((sc->sc_port_mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE))
127 == (IFM_AVALID | IFM_ACTIVE));
128 }
129
130 #endif
131