Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mdio.h
Go to the documentation of this file.
1 /*
2  * linux/mdio.h: definitions for MDIO (clause 45) transceivers
3  * Copyright 2006-2009 Solarflare Communications Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 as published
7  * by the Free Software Foundation, incorporated herein by reference.
8  */
9 #ifndef __LINUX_MDIO_H__
10 #define __LINUX_MDIO_H__
11 
12 #include <uapi/linux/mdio.h>
13 
14 
15 static inline bool mdio_phy_id_is_c45(int phy_id)
16 {
17  return (phy_id & MDIO_PHY_ID_C45) && !(phy_id & ~MDIO_PHY_ID_C45_MASK);
18 }
19 
20 static inline __u16 mdio_phy_id_prtad(int phy_id)
21 {
22  return (phy_id & MDIO_PHY_ID_PRTAD) >> 5;
23 }
24 
25 static inline __u16 mdio_phy_id_devad(int phy_id)
26 {
27  return phy_id & MDIO_PHY_ID_DEVAD;
28 }
29 
44 struct mdio_if_info {
45  int prtad;
47  unsigned mode_support;
48 
49  struct net_device *dev;
50  int (*mdio_read)(struct net_device *dev, int prtad, int devad,
51  u16 addr);
52  int (*mdio_write)(struct net_device *dev, int prtad, int devad,
53  u16 addr, u16 val);
54 };
55 
56 #define MDIO_PRTAD_NONE (-1)
57 #define MDIO_DEVAD_NONE (-1)
58 #define MDIO_SUPPORTS_C22 1
59 #define MDIO_SUPPORTS_C45 2
60 #define MDIO_EMULATE_C22 4
61 
62 struct ethtool_cmd;
63 struct ethtool_pauseparam;
64 extern int mdio45_probe(struct mdio_if_info *mdio, int prtad);
65 extern int mdio_set_flag(const struct mdio_if_info *mdio,
66  int prtad, int devad, u16 addr, int mask,
67  bool sense);
68 extern int mdio45_links_ok(const struct mdio_if_info *mdio, u32 mmds);
69 extern int mdio45_nway_restart(const struct mdio_if_info *mdio);
70 extern void mdio45_ethtool_gset_npage(const struct mdio_if_info *mdio,
71  struct ethtool_cmd *ecmd,
72  u32 npage_adv, u32 npage_lpa);
73 extern void
75  const struct ethtool_pauseparam *ecmd);
76 
87 static inline void mdio45_ethtool_gset(const struct mdio_if_info *mdio,
88  struct ethtool_cmd *ecmd)
89 {
90  mdio45_ethtool_gset_npage(mdio, ecmd, 0, 0);
91 }
92 
93 extern int mdio_mii_ioctl(const struct mdio_if_info *mdio,
94  struct mii_ioctl_data *mii_data, int cmd);
95 
103 static inline u32 mmd_eee_cap_to_ethtool_sup_t(u16 eee_cap)
104 {
105  u32 supported = 0;
106 
107  if (eee_cap & MDIO_EEE_100TX)
108  supported |= SUPPORTED_100baseT_Full;
109  if (eee_cap & MDIO_EEE_1000T)
110  supported |= SUPPORTED_1000baseT_Full;
111  if (eee_cap & MDIO_EEE_10GT)
112  supported |= SUPPORTED_10000baseT_Full;
113  if (eee_cap & MDIO_EEE_1000KX)
114  supported |= SUPPORTED_1000baseKX_Full;
115  if (eee_cap & MDIO_EEE_10GKX4)
116  supported |= SUPPORTED_10000baseKX4_Full;
117  if (eee_cap & MDIO_EEE_10GKR)
118  supported |= SUPPORTED_10000baseKR_Full;
119 
120  return supported;
121 }
122 
131 static inline u32 mmd_eee_adv_to_ethtool_adv_t(u16 eee_adv)
132 {
133  u32 adv = 0;
134 
135  if (eee_adv & MDIO_EEE_100TX)
137  if (eee_adv & MDIO_EEE_1000T)
139  if (eee_adv & MDIO_EEE_10GT)
141  if (eee_adv & MDIO_EEE_1000KX)
143  if (eee_adv & MDIO_EEE_10GKX4)
145  if (eee_adv & MDIO_EEE_10GKR)
147 
148  return adv;
149 }
150 
159 static inline u16 ethtool_adv_to_mmd_eee_adv_t(u32 adv)
160 {
161  u16 reg = 0;
162 
163  if (adv & ADVERTISED_100baseT_Full)
164  reg |= MDIO_EEE_100TX;
165  if (adv & ADVERTISED_1000baseT_Full)
166  reg |= MDIO_EEE_1000T;
167  if (adv & ADVERTISED_10000baseT_Full)
168  reg |= MDIO_EEE_10GT;
169  if (adv & ADVERTISED_1000baseKX_Full)
170  reg |= MDIO_EEE_1000KX;
172  reg |= MDIO_EEE_10GKX4;
173  if (adv & ADVERTISED_10000baseKR_Full)
174  reg |= MDIO_EEE_10GKR;
175 
176  return reg;
177 }
178 
179 #endif /* __LINUX_MDIO_H__ */