1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 #ifndef _DEV_MII_MIIVAR_H_
42 #define _DEV_MII_MIIVAR_H_
43
44 #include <sys/queue.h>
45 #include <sys/timeout.h>
46
47
48
49
50
51
52
53
54 struct mii_softc;
55
56
57
58
59 typedef int (*mii_readreg_t)(struct device *, int, int);
60 typedef void (*mii_writereg_t)(struct device *, int, int, int);
61 typedef void (*mii_statchg_t)(struct device *);
62
63
64
65
66
67
68 struct mii_data {
69 struct ifmedia mii_media;
70 struct ifnet *mii_ifp;
71
72 int mii_flags;
73
74
75
76
77
78
79 LIST_HEAD(mii_listhead, mii_softc) mii_phys;
80 int mii_instance;
81
82
83
84
85 int mii_media_status;
86 int mii_media_active;
87
88
89
90
91 mii_readreg_t mii_readreg;
92 mii_writereg_t mii_writereg;
93 mii_statchg_t mii_statchg;
94 };
95 typedef struct mii_data mii_data_t;
96
97 struct mii_phy_funcs {
98 int (*pf_service)(struct mii_softc *, struct mii_data *, int);
99 void (*pf_status)(struct mii_softc *);
100 void (*pf_reset)(struct mii_softc *);
101 };
102
103
104
105
106 #define MII_TICK 1
107 #define MII_MEDIACHG 2
108 #define MII_POLLSTAT 3
109 #define MII_DOWN 4
110
111
112
113
114
115
116 struct mii_softc {
117 struct device mii_dev;
118
119 LIST_ENTRY(mii_softc) mii_list;
120
121 int mii_phy;
122 int mii_model;
123 int mii_rev;
124 int mii_offset;
125 int mii_inst;
126
127
128 const struct mii_phy_funcs *mii_funcs;
129
130 struct mii_data *mii_pdata;
131
132 int mii_flags;
133 int mii_capabilities;
134 int mii_extcapabilities;
135 int mii_ticks;
136 int mii_anegticks;
137
138 struct timeout mii_phy_timo;
139
140 int mii_media_active;
141 int mii_media_status;
142 };
143 typedef struct mii_softc mii_softc_t;
144
145
146 #define MII_ANEGTICKS 5
147 #define MII_ANEGTICKS_GIGE 10
148
149
150 #define MIIF_INITDONE 0x0001
151 #define MIIF_NOISOLATE 0x0002
152 #define MIIF_NOLOOP 0x0004
153 #define MIIF_DOINGAUTO 0x0008
154 #define MIIF_AUTOTSLEEP 0x0010
155 #define MIIF_HAVEFIBER 0x0020
156 #define MIIF_HAVE_GTCR 0x0040
157 #define MIIF_IS_1000X 0x0080
158 #define MIIF_DOPAUSE 0x0100
159 #define MIIF_IS_HPNA 0x0200
160 #define MIIF_FORCEANEG 0x0400
161
162 #define MIIF_INHERIT_MASK (MIIF_NOISOLATE|MIIF_NOLOOP|MIIF_AUTOTSLEEP)
163
164
165
166
167
168
169 #define MII_OFFSET_ANY -1
170 #define MII_PHY_ANY -1
171
172
173
174
175 struct mii_attach_args {
176 struct mii_data *mii_data;
177 int mii_phyno;
178 int mii_id1;
179 int mii_id2;
180 int mii_capmask;
181 int mii_flags;
182 };
183 typedef struct mii_attach_args mii_attach_args_t;
184
185
186
187
188 struct mii_phydesc {
189 u_int32_t mpd_oui;
190 u_int32_t mpd_model;
191 const char *mpd_name;
192 };
193
194
195
196
197 struct mii_media {
198 int mm_bmcr;
199 int mm_anar;
200 int mm_gtcr;
201 };
202
203 #define MII_MEDIA_NONE 0
204 #define MII_MEDIA_10_T 1
205 #define MII_MEDIA_10_T_FDX 2
206 #define MII_MEDIA_100_T4 3
207 #define MII_MEDIA_100_TX 4
208 #define MII_MEDIA_100_TX_FDX 5
209 #define MII_MEDIA_1000_X 6
210 #define MII_MEDIA_1000_X_FDX 7
211 #define MII_MEDIA_1000_T 8
212 #define MII_MEDIA_1000_T_FDX 9
213 #define MII_NMEDIA 10
214
215 #ifdef _KERNEL
216
217 #define PHY_READ(p, r) \
218 (*(p)->mii_pdata->mii_readreg)((p)->mii_dev.dv_parent, \
219 (p)->mii_phy, (r))
220
221 #define PHY_WRITE(p, r, v) \
222 (*(p)->mii_pdata->mii_writereg)((p)->mii_dev.dv_parent, \
223 (p)->mii_phy, (r), (v))
224
225 #define PHY_SERVICE(p, d, o) \
226 (*(p)->mii_funcs->pf_service)((p), (d), (o))
227
228 #define PHY_STATUS(p) \
229 (*(p)->mii_funcs->pf_status)((p))
230
231 #define PHY_RESET(p) \
232 (*(p)->mii_funcs->pf_reset)((p))
233
234 #define mii_phy_probe(x, y, z) \
235 mii_attach((x), (y), (z), MII_PHY_ANY, MII_OFFSET_ANY, 0)
236
237 #define MII_OUI(id1, id2) (((id1) << 6) | ((id2) >> 10))
238 #define MII_MODEL(id2) (((id2) & IDR2_MODEL) >> 4)
239 #define MII_REV(id2) ((id2) & IDR2_REV)
240
241 void mii_attach(struct device *, struct mii_data *, int, int,
242 int, int);
243 void mii_activate(struct mii_data *, enum devact, int, int);
244 void mii_detach(struct mii_data *, int, int);
245
246 int mii_mediachg(struct mii_data *);
247 void mii_tick(struct mii_data *);
248 void mii_pollstat(struct mii_data *);
249 void mii_down(struct mii_data *);
250 int mii_anar(int);
251
252 int mii_phy_activate(struct device *, enum devact);
253 int mii_phy_detach(struct device *, int);
254
255 const struct mii_phydesc *mii_phy_match(const struct mii_attach_args *,
256 const struct mii_phydesc *);
257
258 void mii_phy_add_media(struct mii_softc *);
259 void mii_phy_delete_media(struct mii_softc *);
260
261 void mii_phy_setmedia(struct mii_softc *);
262 int mii_phy_auto(struct mii_softc *, int);
263 void mii_phy_auto_timeout(void *);
264 void mii_phy_reset(struct mii_softc *);
265 void mii_phy_down(struct mii_softc *);
266 int mii_phy_tick(struct mii_softc *);
267
268 void mii_phy_status(struct mii_softc *);
269 void mii_phy_update(struct mii_softc *, int);
270 int mii_phy_statusmsg(struct mii_softc *);
271
272 int mii_phy_flowstatus(struct mii_softc *);
273
274 void ukphy_status(struct mii_softc *);
275
276 #endif
277
278 #endif