1
2
3
4
5
6
7
8
9
10#ifndef __LINUX_MDIO_H__
11#define __LINUX_MDIO_H__
12
13#include <linux/types.h>
14#include <linux/mii.h>
15
16
17#define MDIO_MMD_PMAPMD 1
18
19#define MDIO_MMD_WIS 2
20#define MDIO_MMD_PCS 3
21#define MDIO_MMD_PHYXS 4
22#define MDIO_MMD_DTEXS 5
23#define MDIO_MMD_TC 6
24#define MDIO_MMD_AN 7
25#define MDIO_MMD_C22EXT 29
26#define MDIO_MMD_VEND1 30
27#define MDIO_MMD_VEND2 31
28
29
30#define MDIO_CTRL1 MII_BMCR
31#define MDIO_STAT1 MII_BMSR
32#define MDIO_DEVID1 MII_PHYSID1
33#define MDIO_DEVID2 MII_PHYSID2
34#define MDIO_SPEED 4
35#define MDIO_DEVS1 5
36#define MDIO_DEVS2 6
37#define MDIO_CTRL2 7
38#define MDIO_STAT2 8
39#define MDIO_PMA_TXDIS 9
40#define MDIO_PMA_RXDET 10
41#define MDIO_PMA_EXTABLE 11
42#define MDIO_PKGID1 14
43#define MDIO_PKGID2 15
44#define MDIO_AN_ADVERTISE 16
45#define MDIO_AN_LPA 19
46#define MDIO_PHYXS_LNSTAT 24
47
48
49#define MDIO_PMA_10GBT_SWAPPOL 130
50#define MDIO_PMA_10GBT_TXPWR 131
51#define MDIO_PMA_10GBT_SNR 133
52
53#define MDIO_PMA_10GBR_FECABLE 170
54#define MDIO_PCS_10GBX_STAT1 24
55#define MDIO_PCS_10GBRT_STAT1 32
56#define MDIO_PCS_10GBRT_STAT2 33
57#define MDIO_AN_10GBT_CTRL 32
58#define MDIO_AN_10GBT_STAT 33
59#define MDIO_AN_EEE_ADV 60
60
61
62#define MDIO_PMA_LASI_RXCTRL 0x9000
63#define MDIO_PMA_LASI_TXCTRL 0x9001
64#define MDIO_PMA_LASI_CTRL 0x9002
65#define MDIO_PMA_LASI_RXSTAT 0x9003
66#define MDIO_PMA_LASI_TXSTAT 0x9004
67#define MDIO_PMA_LASI_STAT 0x9005
68
69
70
71#define MDIO_CTRL1_SPEEDSELEXT (BMCR_SPEED1000 | BMCR_SPEED100)
72
73#define MDIO_CTRL1_SPEEDSEL (MDIO_CTRL1_SPEEDSELEXT | 0x003c)
74#define MDIO_CTRL1_FULLDPLX BMCR_FULLDPLX
75#define MDIO_CTRL1_LPOWER BMCR_PDOWN
76#define MDIO_CTRL1_RESET BMCR_RESET
77#define MDIO_PMA_CTRL1_LOOPBACK 0x0001
78#define MDIO_PMA_CTRL1_SPEED1000 BMCR_SPEED1000
79#define MDIO_PMA_CTRL1_SPEED100 BMCR_SPEED100
80#define MDIO_PCS_CTRL1_LOOPBACK BMCR_LOOPBACK
81#define MDIO_PHYXS_CTRL1_LOOPBACK BMCR_LOOPBACK
82#define MDIO_AN_CTRL1_RESTART BMCR_ANRESTART
83#define MDIO_AN_CTRL1_ENABLE BMCR_ANENABLE
84#define MDIO_AN_CTRL1_XNP 0x2000
85
86
87#define MDIO_CTRL1_SPEED10G (MDIO_CTRL1_SPEEDSELEXT | 0x00)
88
89#define MDIO_CTRL1_SPEED10P2B (MDIO_CTRL1_SPEEDSELEXT | 0x04)
90
91
92#define MDIO_STAT1_LPOWERABLE 0x0002
93#define MDIO_STAT1_LSTATUS BMSR_LSTATUS
94#define MDIO_STAT1_FAULT 0x0080
95#define MDIO_AN_STAT1_LPABLE 0x0001
96#define MDIO_AN_STAT1_ABLE BMSR_ANEGCAPABLE
97#define MDIO_AN_STAT1_RFAULT BMSR_RFAULT
98#define MDIO_AN_STAT1_COMPLETE BMSR_ANEGCOMPLETE
99#define MDIO_AN_STAT1_PAGE 0x0040
100#define MDIO_AN_STAT1_XNP 0x0080
101
102
103#define MDIO_SPEED_10G 0x0001
104#define MDIO_PMA_SPEED_2B 0x0002
105#define MDIO_PMA_SPEED_10P 0x0004
106#define MDIO_PMA_SPEED_1000 0x0010
107#define MDIO_PMA_SPEED_100 0x0020
108#define MDIO_PMA_SPEED_10 0x0040
109#define MDIO_PCS_SPEED_10P2B 0x0002
110
111
112#define MDIO_DEVS_PRESENT(devad) (1 << (devad))
113#define MDIO_DEVS_PMAPMD MDIO_DEVS_PRESENT(MDIO_MMD_PMAPMD)
114#define MDIO_DEVS_WIS MDIO_DEVS_PRESENT(MDIO_MMD_WIS)
115#define MDIO_DEVS_PCS MDIO_DEVS_PRESENT(MDIO_MMD_PCS)
116#define MDIO_DEVS_PHYXS MDIO_DEVS_PRESENT(MDIO_MMD_PHYXS)
117#define MDIO_DEVS_DTEXS MDIO_DEVS_PRESENT(MDIO_MMD_DTEXS)
118#define MDIO_DEVS_TC MDIO_DEVS_PRESENT(MDIO_MMD_TC)
119#define MDIO_DEVS_AN MDIO_DEVS_PRESENT(MDIO_MMD_AN)
120#define MDIO_DEVS_C22EXT MDIO_DEVS_PRESENT(MDIO_MMD_C22EXT)
121
122
123#define MDIO_PMA_CTRL2_TYPE 0x000f
124#define MDIO_PMA_CTRL2_10GBCX4 0x0000
125#define MDIO_PMA_CTRL2_10GBEW 0x0001
126#define MDIO_PMA_CTRL2_10GBLW 0x0002
127#define MDIO_PMA_CTRL2_10GBSW 0x0003
128#define MDIO_PMA_CTRL2_10GBLX4 0x0004
129#define MDIO_PMA_CTRL2_10GBER 0x0005
130#define MDIO_PMA_CTRL2_10GBLR 0x0006
131#define MDIO_PMA_CTRL2_10GBSR 0x0007
132#define MDIO_PMA_CTRL2_10GBLRM 0x0008
133#define MDIO_PMA_CTRL2_10GBT 0x0009
134#define MDIO_PMA_CTRL2_10GBKX4 0x000a
135#define MDIO_PMA_CTRL2_10GBKR 0x000b
136#define MDIO_PMA_CTRL2_1000BT 0x000c
137#define MDIO_PMA_CTRL2_1000BKX 0x000d
138#define MDIO_PMA_CTRL2_100BTX 0x000e
139#define MDIO_PMA_CTRL2_10BT 0x000f
140#define MDIO_PCS_CTRL2_TYPE 0x0003
141#define MDIO_PCS_CTRL2_10GBR 0x0000
142#define MDIO_PCS_CTRL2_10GBX 0x0001
143#define MDIO_PCS_CTRL2_10GBW 0x0002
144#define MDIO_PCS_CTRL2_10GBT 0x0003
145
146
147#define MDIO_STAT2_RXFAULT 0x0400
148#define MDIO_STAT2_TXFAULT 0x0800
149#define MDIO_STAT2_DEVPRST 0xc000
150#define MDIO_STAT2_DEVPRST_VAL 0x8000
151#define MDIO_PMA_STAT2_LBABLE 0x0001
152#define MDIO_PMA_STAT2_10GBEW 0x0002
153#define MDIO_PMA_STAT2_10GBLW 0x0004
154#define MDIO_PMA_STAT2_10GBSW 0x0008
155#define MDIO_PMA_STAT2_10GBLX4 0x0010
156#define MDIO_PMA_STAT2_10GBER 0x0020
157#define MDIO_PMA_STAT2_10GBLR 0x0040
158#define MDIO_PMA_STAT2_10GBSR 0x0080
159#define MDIO_PMD_STAT2_TXDISAB 0x0100
160#define MDIO_PMA_STAT2_EXTABLE 0x0200
161#define MDIO_PMA_STAT2_RXFLTABLE 0x1000
162#define MDIO_PMA_STAT2_TXFLTABLE 0x2000
163#define MDIO_PCS_STAT2_10GBR 0x0001
164#define MDIO_PCS_STAT2_10GBX 0x0002
165#define MDIO_PCS_STAT2_10GBW 0x0004
166#define MDIO_PCS_STAT2_RXFLTABLE 0x1000
167#define MDIO_PCS_STAT2_TXFLTABLE 0x2000
168
169
170#define MDIO_PMD_TXDIS_GLOBAL 0x0001
171#define MDIO_PMD_TXDIS_0 0x0002
172#define MDIO_PMD_TXDIS_1 0x0004
173#define MDIO_PMD_TXDIS_2 0x0008
174#define MDIO_PMD_TXDIS_3 0x0010
175
176
177#define MDIO_PMD_RXDET_GLOBAL 0x0001
178#define MDIO_PMD_RXDET_0 0x0002
179#define MDIO_PMD_RXDET_1 0x0004
180#define MDIO_PMD_RXDET_2 0x0008
181#define MDIO_PMD_RXDET_3 0x0010
182
183
184#define MDIO_PMA_EXTABLE_10GCX4 0x0001
185#define MDIO_PMA_EXTABLE_10GBLRM 0x0002
186#define MDIO_PMA_EXTABLE_10GBT 0x0004
187#define MDIO_PMA_EXTABLE_10GBKX4 0x0008
188#define MDIO_PMA_EXTABLE_10GBKR 0x0010
189#define MDIO_PMA_EXTABLE_1000BT 0x0020
190#define MDIO_PMA_EXTABLE_1000BKX 0x0040
191#define MDIO_PMA_EXTABLE_100BTX 0x0080
192#define MDIO_PMA_EXTABLE_10BT 0x0100
193
194
195#define MDIO_PHYXS_LNSTAT_SYNC0 0x0001
196#define MDIO_PHYXS_LNSTAT_SYNC1 0x0002
197#define MDIO_PHYXS_LNSTAT_SYNC2 0x0004
198#define MDIO_PHYXS_LNSTAT_SYNC3 0x0008
199#define MDIO_PHYXS_LNSTAT_ALIGN 0x1000
200
201
202#define MDIO_PMA_10GBT_SWAPPOL_ABNX 0x0001
203#define MDIO_PMA_10GBT_SWAPPOL_CDNX 0x0002
204#define MDIO_PMA_10GBT_SWAPPOL_AREV 0x0100
205#define MDIO_PMA_10GBT_SWAPPOL_BREV 0x0200
206#define MDIO_PMA_10GBT_SWAPPOL_CREV 0x0400
207#define MDIO_PMA_10GBT_SWAPPOL_DREV 0x0800
208
209
210#define MDIO_PMA_10GBT_TXPWR_SHORT 0x0001
211
212
213
214#define MDIO_PMA_10GBT_SNR_BIAS 0x8000
215#define MDIO_PMA_10GBT_SNR_MAX 127
216
217
218#define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001
219#define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002
220
221
222#define MDIO_PCS_10GBRT_STAT1_BLKLK 0x0001
223
224
225#define MDIO_PCS_10GBRT_STAT2_ERR 0x00ff
226#define MDIO_PCS_10GBRT_STAT2_BER 0x3f00
227
228
229#define MDIO_AN_10GBT_CTRL_ADV10G 0x1000
230
231
232#define MDIO_AN_10GBT_STAT_LPTRR 0x0200
233#define MDIO_AN_10GBT_STAT_LPLTABLE 0x0400
234#define MDIO_AN_10GBT_STAT_LP10G 0x0800
235#define MDIO_AN_10GBT_STAT_REMOK 0x1000
236#define MDIO_AN_10GBT_STAT_LOCOK 0x2000
237#define MDIO_AN_10GBT_STAT_MS 0x4000
238#define MDIO_AN_10GBT_STAT_MSFLT 0x8000
239
240
241#define MDIO_AN_EEE_ADV_100TX 0x0002
242#define MDIO_AN_EEE_ADV_1000T 0x0004
243
244
245#define MDIO_PMA_LASI_RX_PHYXSLFLT 0x0001
246#define MDIO_PMA_LASI_RX_PCSLFLT 0x0008
247#define MDIO_PMA_LASI_RX_PMALFLT 0x0010
248#define MDIO_PMA_LASI_RX_OPTICPOWERFLT 0x0020
249#define MDIO_PMA_LASI_RX_WISLFLT 0x0200
250
251
252#define MDIO_PMA_LASI_TX_PHYXSLFLT 0x0001
253#define MDIO_PMA_LASI_TX_PCSLFLT 0x0008
254#define MDIO_PMA_LASI_TX_PMALFLT 0x0010
255#define MDIO_PMA_LASI_TX_LASERPOWERFLT 0x0080
256#define MDIO_PMA_LASI_TX_LASERTEMPFLT 0x0100
257#define MDIO_PMA_LASI_TX_LASERBICURRFLT 0x0200
258
259
260#define MDIO_PMA_LASI_LSALARM 0x0001
261#define MDIO_PMA_LASI_TXALARM 0x0002
262#define MDIO_PMA_LASI_RXALARM 0x0004
263
264
265
266#define MDIO_PHY_ID_C45 0x8000
267#define MDIO_PHY_ID_PRTAD 0x03e0
268#define MDIO_PHY_ID_DEVAD 0x001f
269#define MDIO_PHY_ID_C45_MASK \
270 (MDIO_PHY_ID_C45 | MDIO_PHY_ID_PRTAD | MDIO_PHY_ID_DEVAD)
271
272static inline __u16 mdio_phy_id_c45(int prtad, int devad)
273{
274 return MDIO_PHY_ID_C45 | (prtad << 5) | devad;
275}
276
277#ifdef __KERNEL__
278
279static inline bool mdio_phy_id_is_c45(int phy_id)
280{
281 return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);
282}
283
284static inline __u16 mdio_phy_id_prtad(int phy_id)
285{
286 return (phy_id & MDIO_PHY_ID_PRTAD) >> 5;
287}
288
289static inline __u16 mdio_phy_id_devad(int phy_id)
290{
291 return phy_id & MDIO_PHY_ID_DEVAD;
292}
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308struct mdio_if_info {
309 int prtad;
310 u32 mmds;
311 unsigned mode_support;
312
313 struct net_device *dev;
314 int (*mdio_read)(struct net_device *dev, int prtad, int devad,
315 u16 addr);
316 int (*mdio_write)(struct net_device *dev, int prtad, int devad,
317 u16 addr, u16 val);
318};
319
320#define MDIO_PRTAD_NONE (-1)
321#define MDIO_DEVAD_NONE (-1)
322#define MDIO_SUPPORTS_C22 1
323#define MDIO_SUPPORTS_C45 2
324#define MDIO_EMULATE_C22 4
325
326struct ethtool_cmd;
327struct ethtool_pauseparam;
328extern int mdio45_probe(struct mdio_if_info *mdio, int prtad);
329extern int mdio_set_flag(const struct mdio_if_info *mdio,
330 int prtad, int devad, u16 addr, int mask,
331 bool sense);
332extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds);
333extern int mdio45_nway_restart(const struct mdio_if_info *mdio);
334extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
335 struct ethtool_cmd *ecmd,
336 u32 npage_adv, u32 npage_lpa);
337extern void
338mdio45_ethtool_spauseparam_an(const struct mdio_if_info *mdio,
339 const struct ethtool_pauseparam *ecmd);
340
341
342
343
344
345
346
347
348
349
350
351static inline void mdio45_ethtool_gset(const struct mdio_if_info *mdio,
352 struct ethtool_cmd *ecmd)
353{
354 mdio45_ethtool_gset_npage(mdio, ecmd, 0, 0);
355}
356
357extern int mdio_mii_ioctl(const struct mdio_if_info *mdio,
358 struct mii_ioctl_data *mii_data, int cmd);
359
360#endif
361#endif
362