~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/mii.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/mii.h (Architecture sparc64) and /include/linux/mii.h (Architecture alpha)


  1 /* SPDX-License-Identifier: GPL-2.0 */              1 /* SPDX-License-Identifier: GPL-2.0 */
  2 /*                                                  2 /*
  3  * linux/mii.h: definitions for MII-compatible      3  * linux/mii.h: definitions for MII-compatible transceivers
  4  * Originally drivers/net/sunhme.h.                 4  * Originally drivers/net/sunhme.h.
  5  *                                                  5  *
  6  * Copyright (C) 1996, 1999, 2001 David S. Mil      6  * Copyright (C) 1996, 1999, 2001 David S. Miller (davem@redhat.com)
  7  */                                                 7  */
  8 #ifndef __LINUX_MII_H__                             8 #ifndef __LINUX_MII_H__
  9 #define __LINUX_MII_H__                             9 #define __LINUX_MII_H__
 10                                                    10 
 11                                                    11 
 12 #include <linux/if.h>                              12 #include <linux/if.h>
 13 #include <linux/linkmode.h>                        13 #include <linux/linkmode.h>
 14 #include <uapi/linux/mii.h>                        14 #include <uapi/linux/mii.h>
 15                                                    15 
 16 struct ethtool_cmd;                                16 struct ethtool_cmd;
 17                                                    17 
 18 struct mii_if_info {                               18 struct mii_if_info {
 19         int phy_id;                                19         int phy_id;
 20         int advertising;                           20         int advertising;
 21         int phy_id_mask;                           21         int phy_id_mask;
 22         int reg_num_mask;                          22         int reg_num_mask;
 23                                                    23 
 24         unsigned int full_duplex : 1;   /* is      24         unsigned int full_duplex : 1;   /* is full duplex? */
 25         unsigned int force_media : 1;   /* is      25         unsigned int force_media : 1;   /* is autoneg. disabled? */
 26         unsigned int supports_gmii : 1; /* are     26         unsigned int supports_gmii : 1; /* are GMII registers supported? */
 27                                                    27 
 28         struct net_device *dev;                    28         struct net_device *dev;
 29         int (*mdio_read) (struct net_device *d     29         int (*mdio_read) (struct net_device *dev, int phy_id, int location);
 30         void (*mdio_write) (struct net_device      30         void (*mdio_write) (struct net_device *dev, int phy_id, int location, int val);
 31 };                                                 31 };
 32                                                    32 
 33 extern int mii_link_ok (struct mii_if_info *mi     33 extern int mii_link_ok (struct mii_if_info *mii);
 34 extern int mii_nway_restart (struct mii_if_inf     34 extern int mii_nway_restart (struct mii_if_info *mii);
 35 extern void mii_ethtool_gset(struct mii_if_inf     35 extern void mii_ethtool_gset(struct mii_if_info *mii, struct ethtool_cmd *ecmd);
 36 extern void mii_ethtool_get_link_ksettings(        36 extern void mii_ethtool_get_link_ksettings(
 37         struct mii_if_info *mii, struct ethtoo     37         struct mii_if_info *mii, struct ethtool_link_ksettings *cmd);
 38 extern int mii_ethtool_sset(struct mii_if_info     38 extern int mii_ethtool_sset(struct mii_if_info *mii, struct ethtool_cmd *ecmd);
 39 extern int mii_ethtool_set_link_ksettings(         39 extern int mii_ethtool_set_link_ksettings(
 40         struct mii_if_info *mii, const struct      40         struct mii_if_info *mii, const struct ethtool_link_ksettings *cmd);
 41 extern int mii_check_gmii_support(struct mii_i     41 extern int mii_check_gmii_support(struct mii_if_info *mii);
 42 extern void mii_check_link (struct mii_if_info     42 extern void mii_check_link (struct mii_if_info *mii);
 43 extern unsigned int mii_check_media (struct mi     43 extern unsigned int mii_check_media (struct mii_if_info *mii,
 44                                      unsigned      44                                      unsigned int ok_to_print,
 45                                      unsigned      45                                      unsigned int init_media);
 46 extern int generic_mii_ioctl(struct mii_if_inf     46 extern int generic_mii_ioctl(struct mii_if_info *mii_if,
 47                              struct mii_ioctl_     47                              struct mii_ioctl_data *mii_data, int cmd,
 48                              unsigned int *dup     48                              unsigned int *duplex_changed);
 49                                                    49 
 50                                                    50 
 51 static inline struct mii_ioctl_data *if_mii(st     51 static inline struct mii_ioctl_data *if_mii(struct ifreq *rq)
 52 {                                                  52 {
 53         return (struct mii_ioctl_data *) &rq->     53         return (struct mii_ioctl_data *) &rq->ifr_ifru;
 54 }                                                  54 }
 55                                                    55 
 56 /**                                                56 /**
 57  * mii_nway_result                                 57  * mii_nway_result
 58  * @negotiated: value of MII ANAR and'd with A     58  * @negotiated: value of MII ANAR and'd with ANLPAR
 59  *                                                 59  *
 60  * Given a set of MII abilities, check each bi     60  * Given a set of MII abilities, check each bit and returns the
 61  * currently supported media, in the priority      61  * currently supported media, in the priority order defined by
 62  * IEEE 802.3u.  We use LPA_xxx constants but      62  * IEEE 802.3u.  We use LPA_xxx constants but note this is not the
 63  * value of LPA solely, as described above.        63  * value of LPA solely, as described above.
 64  *                                                 64  *
 65  * The one exception to IEEE 802.3u is that 10     65  * The one exception to IEEE 802.3u is that 100baseT4 is placed
 66  * between 100T-full and 100T-half.  If your p     66  * between 100T-full and 100T-half.  If your phy does not support
 67  * 100T4 this is fine.  If your phy places 100     67  * 100T4 this is fine.  If your phy places 100T4 elsewhere in the
 68  * priority order, you will need to roll your      68  * priority order, you will need to roll your own function.
 69  */                                                69  */
 70 static inline unsigned int mii_nway_result (un     70 static inline unsigned int mii_nway_result (unsigned int negotiated)
 71 {                                                  71 {
 72         unsigned int ret;                          72         unsigned int ret;
 73                                                    73 
 74         if (negotiated & LPA_100FULL)              74         if (negotiated & LPA_100FULL)
 75                 ret = LPA_100FULL;                 75                 ret = LPA_100FULL;
 76         else if (negotiated & LPA_100BASE4)        76         else if (negotiated & LPA_100BASE4)
 77                 ret = LPA_100BASE4;                77                 ret = LPA_100BASE4;
 78         else if (negotiated & LPA_100HALF)         78         else if (negotiated & LPA_100HALF)
 79                 ret = LPA_100HALF;                 79                 ret = LPA_100HALF;
 80         else if (negotiated & LPA_10FULL)          80         else if (negotiated & LPA_10FULL)
 81                 ret = LPA_10FULL;                  81                 ret = LPA_10FULL;
 82         else                                       82         else
 83                 ret = LPA_10HALF;                  83                 ret = LPA_10HALF;
 84                                                    84 
 85         return ret;                                85         return ret;
 86 }                                                  86 }
 87                                                    87 
 88 /**                                                88 /**
 89  * mii_duplex                                      89  * mii_duplex
 90  * @duplex_lock: Non-zero if duplex is locked      90  * @duplex_lock: Non-zero if duplex is locked at full
 91  * @negotiated: value of MII ANAR and'd with A     91  * @negotiated: value of MII ANAR and'd with ANLPAR
 92  *                                                 92  *
 93  * A small helper function for a common case.      93  * A small helper function for a common case.  Returns one
 94  * if the media is operating or locked at full     94  * if the media is operating or locked at full duplex, and
 95  * returns zero otherwise.                         95  * returns zero otherwise.
 96  */                                                96  */
 97 static inline unsigned int mii_duplex (unsigne     97 static inline unsigned int mii_duplex (unsigned int duplex_lock,
 98                                        unsigne     98                                        unsigned int negotiated)
 99 {                                                  99 {
100         if (duplex_lock)                          100         if (duplex_lock)
101                 return 1;                         101                 return 1;
102         if (mii_nway_result(negotiated) & LPA_    102         if (mii_nway_result(negotiated) & LPA_DUPLEX)
103                 return 1;                         103                 return 1;
104         return 0;                                 104         return 0;
105 }                                                 105 }
106                                                   106 
107 /**                                               107 /**
108  * ethtool_adv_to_mii_adv_t                       108  * ethtool_adv_to_mii_adv_t
109  * @ethadv: the ethtool advertisement settings    109  * @ethadv: the ethtool advertisement settings
110  *                                                110  *
111  * A small helper function that translates eth    111  * A small helper function that translates ethtool advertisement
112  * settings to phy autonegotiation advertiseme    112  * settings to phy autonegotiation advertisements for the
113  * MII_ADVERTISE register.                        113  * MII_ADVERTISE register.
114  */                                               114  */
115 static inline u32 ethtool_adv_to_mii_adv_t(u32    115 static inline u32 ethtool_adv_to_mii_adv_t(u32 ethadv)
116 {                                                 116 {
117         u32 result = 0;                           117         u32 result = 0;
118                                                   118 
119         if (ethadv & ADVERTISED_10baseT_Half)     119         if (ethadv & ADVERTISED_10baseT_Half)
120                 result |= ADVERTISE_10HALF;       120                 result |= ADVERTISE_10HALF;
121         if (ethadv & ADVERTISED_10baseT_Full)     121         if (ethadv & ADVERTISED_10baseT_Full)
122                 result |= ADVERTISE_10FULL;       122                 result |= ADVERTISE_10FULL;
123         if (ethadv & ADVERTISED_100baseT_Half)    123         if (ethadv & ADVERTISED_100baseT_Half)
124                 result |= ADVERTISE_100HALF;      124                 result |= ADVERTISE_100HALF;
125         if (ethadv & ADVERTISED_100baseT_Full)    125         if (ethadv & ADVERTISED_100baseT_Full)
126                 result |= ADVERTISE_100FULL;      126                 result |= ADVERTISE_100FULL;
127         if (ethadv & ADVERTISED_Pause)            127         if (ethadv & ADVERTISED_Pause)
128                 result |= ADVERTISE_PAUSE_CAP;    128                 result |= ADVERTISE_PAUSE_CAP;
129         if (ethadv & ADVERTISED_Asym_Pause)       129         if (ethadv & ADVERTISED_Asym_Pause)
130                 result |= ADVERTISE_PAUSE_ASYM    130                 result |= ADVERTISE_PAUSE_ASYM;
131                                                   131 
132         return result;                            132         return result;
133 }                                                 133 }
134                                                   134 
135 /**                                               135 /**
136  * linkmode_adv_to_mii_adv_t                      136  * linkmode_adv_to_mii_adv_t
137  * @advertising: the linkmode advertisement se    137  * @advertising: the linkmode advertisement settings
138  *                                                138  *
139  * A small helper function that translates lin    139  * A small helper function that translates linkmode advertisement
140  * settings to phy autonegotiation advertiseme    140  * settings to phy autonegotiation advertisements for the
141  * MII_ADVERTISE register.                        141  * MII_ADVERTISE register.
142  */                                               142  */
143 static inline u32 linkmode_adv_to_mii_adv_t(co    143 static inline u32 linkmode_adv_to_mii_adv_t(const unsigned long *advertising)
144 {                                                 144 {
145         u32 result = 0;                           145         u32 result = 0;
146                                                   146 
147         if (linkmode_test_bit(ETHTOOL_LINK_MOD    147         if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT, advertising))
148                 result |= ADVERTISE_10HALF;       148                 result |= ADVERTISE_10HALF;
149         if (linkmode_test_bit(ETHTOOL_LINK_MOD    149         if (linkmode_test_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT, advertising))
150                 result |= ADVERTISE_10FULL;       150                 result |= ADVERTISE_10FULL;
151         if (linkmode_test_bit(ETHTOOL_LINK_MOD    151         if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, advertising))
152                 result |= ADVERTISE_100HALF;      152                 result |= ADVERTISE_100HALF;
153         if (linkmode_test_bit(ETHTOOL_LINK_MOD    153         if (linkmode_test_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, advertising))
154                 result |= ADVERTISE_100FULL;      154                 result |= ADVERTISE_100FULL;
155         if (linkmode_test_bit(ETHTOOL_LINK_MOD    155         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertising))
156                 result |= ADVERTISE_PAUSE_CAP;    156                 result |= ADVERTISE_PAUSE_CAP;
157         if (linkmode_test_bit(ETHTOOL_LINK_MOD    157         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, advertising))
158                 result |= ADVERTISE_PAUSE_ASYM    158                 result |= ADVERTISE_PAUSE_ASYM;
159                                                   159 
160         return result;                            160         return result;
161 }                                                 161 }
162                                                   162 
163 /**                                               163 /**
164  * mii_adv_to_ethtool_adv_t                       164  * mii_adv_to_ethtool_adv_t
165  * @adv: value of the MII_ADVERTISE register      165  * @adv: value of the MII_ADVERTISE register
166  *                                                166  *
167  * A small helper function that translates MII    167  * A small helper function that translates MII_ADVERTISE bits
168  * to ethtool advertisement settings.             168  * to ethtool advertisement settings.
169  */                                               169  */
170 static inline u32 mii_adv_to_ethtool_adv_t(u32    170 static inline u32 mii_adv_to_ethtool_adv_t(u32 adv)
171 {                                                 171 {
172         u32 result = 0;                           172         u32 result = 0;
173                                                   173 
174         if (adv & ADVERTISE_10HALF)               174         if (adv & ADVERTISE_10HALF)
175                 result |= ADVERTISED_10baseT_H    175                 result |= ADVERTISED_10baseT_Half;
176         if (adv & ADVERTISE_10FULL)               176         if (adv & ADVERTISE_10FULL)
177                 result |= ADVERTISED_10baseT_F    177                 result |= ADVERTISED_10baseT_Full;
178         if (adv & ADVERTISE_100HALF)              178         if (adv & ADVERTISE_100HALF)
179                 result |= ADVERTISED_100baseT_    179                 result |= ADVERTISED_100baseT_Half;
180         if (adv & ADVERTISE_100FULL)              180         if (adv & ADVERTISE_100FULL)
181                 result |= ADVERTISED_100baseT_    181                 result |= ADVERTISED_100baseT_Full;
182         if (adv & ADVERTISE_PAUSE_CAP)            182         if (adv & ADVERTISE_PAUSE_CAP)
183                 result |= ADVERTISED_Pause;       183                 result |= ADVERTISED_Pause;
184         if (adv & ADVERTISE_PAUSE_ASYM)           184         if (adv & ADVERTISE_PAUSE_ASYM)
185                 result |= ADVERTISED_Asym_Paus    185                 result |= ADVERTISED_Asym_Pause;
186                                                   186 
187         return result;                            187         return result;
188 }                                                 188 }
189                                                   189 
190 /**                                               190 /**
191  * ethtool_adv_to_mii_ctrl1000_t                  191  * ethtool_adv_to_mii_ctrl1000_t
192  * @ethadv: the ethtool advertisement settings    192  * @ethadv: the ethtool advertisement settings
193  *                                                193  *
194  * A small helper function that translates eth    194  * A small helper function that translates ethtool advertisement
195  * settings to phy autonegotiation advertiseme    195  * settings to phy autonegotiation advertisements for the
196  * MII_CTRL1000 register when in 1000T mode.      196  * MII_CTRL1000 register when in 1000T mode.
197  */                                               197  */
198 static inline u32 ethtool_adv_to_mii_ctrl1000_    198 static inline u32 ethtool_adv_to_mii_ctrl1000_t(u32 ethadv)
199 {                                                 199 {
200         u32 result = 0;                           200         u32 result = 0;
201                                                   201 
202         if (ethadv & ADVERTISED_1000baseT_Half    202         if (ethadv & ADVERTISED_1000baseT_Half)
203                 result |= ADVERTISE_1000HALF;     203                 result |= ADVERTISE_1000HALF;
204         if (ethadv & ADVERTISED_1000baseT_Full    204         if (ethadv & ADVERTISED_1000baseT_Full)
205                 result |= ADVERTISE_1000FULL;     205                 result |= ADVERTISE_1000FULL;
206                                                   206 
207         return result;                            207         return result;
208 }                                                 208 }
209                                                   209 
210 /**                                               210 /**
211  * linkmode_adv_to_mii_ctrl1000_t                 211  * linkmode_adv_to_mii_ctrl1000_t
212  * @advertising: the linkmode advertisement se    212  * @advertising: the linkmode advertisement settings
213  *                                                213  *
214  * A small helper function that translates lin    214  * A small helper function that translates linkmode advertisement
215  * settings to phy autonegotiation advertiseme    215  * settings to phy autonegotiation advertisements for the
216  * MII_CTRL1000 register when in 1000T mode.      216  * MII_CTRL1000 register when in 1000T mode.
217  */                                               217  */
218 static inline u32                                 218 static inline u32
219 linkmode_adv_to_mii_ctrl1000_t(const unsigned     219 linkmode_adv_to_mii_ctrl1000_t(const unsigned long *advertising)
220 {                                                 220 {
221         u32 result = 0;                           221         u32 result = 0;
222                                                   222 
223         if (linkmode_test_bit(ETHTOOL_LINK_MOD    223         if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
224                               advertising))       224                               advertising))
225                 result |= ADVERTISE_1000HALF;     225                 result |= ADVERTISE_1000HALF;
226         if (linkmode_test_bit(ETHTOOL_LINK_MOD    226         if (linkmode_test_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
227                               advertising))       227                               advertising))
228                 result |= ADVERTISE_1000FULL;     228                 result |= ADVERTISE_1000FULL;
229                                                   229 
230         return result;                            230         return result;
231 }                                                 231 }
232                                                   232 
233 /**                                               233 /**
234  * mii_ctrl1000_to_ethtool_adv_t                  234  * mii_ctrl1000_to_ethtool_adv_t
235  * @adv: value of the MII_CTRL1000 register       235  * @adv: value of the MII_CTRL1000 register
236  *                                                236  *
237  * A small helper function that translates MII    237  * A small helper function that translates MII_CTRL1000
238  * bits, when in 1000Base-T mode, to ethtool      238  * bits, when in 1000Base-T mode, to ethtool
239  * advertisement settings.                        239  * advertisement settings.
240  */                                               240  */
241 static inline u32 mii_ctrl1000_to_ethtool_adv_    241 static inline u32 mii_ctrl1000_to_ethtool_adv_t(u32 adv)
242 {                                                 242 {
243         u32 result = 0;                           243         u32 result = 0;
244                                                   244 
245         if (adv & ADVERTISE_1000HALF)             245         if (adv & ADVERTISE_1000HALF)
246                 result |= ADVERTISED_1000baseT    246                 result |= ADVERTISED_1000baseT_Half;
247         if (adv & ADVERTISE_1000FULL)             247         if (adv & ADVERTISE_1000FULL)
248                 result |= ADVERTISED_1000baseT    248                 result |= ADVERTISED_1000baseT_Full;
249                                                   249 
250         return result;                            250         return result;
251 }                                                 251 }
252                                                   252 
253 /**                                               253 /**
254  * mii_lpa_to_ethtool_lpa_t                       254  * mii_lpa_to_ethtool_lpa_t
255  * @adv: value of the MII_LPA register            255  * @adv: value of the MII_LPA register
256  *                                                256  *
257  * A small helper function that translates MII    257  * A small helper function that translates MII_LPA
258  * bits, when in 1000Base-T mode, to ethtool      258  * bits, when in 1000Base-T mode, to ethtool
259  * LP advertisement settings.                     259  * LP advertisement settings.
260  */                                               260  */
261 static inline u32 mii_lpa_to_ethtool_lpa_t(u32    261 static inline u32 mii_lpa_to_ethtool_lpa_t(u32 lpa)
262 {                                                 262 {
263         u32 result = 0;                           263         u32 result = 0;
264                                                   264 
265         if (lpa & LPA_LPACK)                      265         if (lpa & LPA_LPACK)
266                 result |= ADVERTISED_Autoneg;     266                 result |= ADVERTISED_Autoneg;
267                                                   267 
268         return result | mii_adv_to_ethtool_adv    268         return result | mii_adv_to_ethtool_adv_t(lpa);
269 }                                                 269 }
270                                                   270 
271 /**                                               271 /**
272  * mii_stat1000_to_ethtool_lpa_t                  272  * mii_stat1000_to_ethtool_lpa_t
273  * @adv: value of the MII_STAT1000 register       273  * @adv: value of the MII_STAT1000 register
274  *                                                274  *
275  * A small helper function that translates MII    275  * A small helper function that translates MII_STAT1000
276  * bits, when in 1000Base-T mode, to ethtool      276  * bits, when in 1000Base-T mode, to ethtool
277  * advertisement settings.                        277  * advertisement settings.
278  */                                               278  */
279 static inline u32 mii_stat1000_to_ethtool_lpa_    279 static inline u32 mii_stat1000_to_ethtool_lpa_t(u32 lpa)
280 {                                                 280 {
281         u32 result = 0;                           281         u32 result = 0;
282                                                   282 
283         if (lpa & LPA_1000HALF)                   283         if (lpa & LPA_1000HALF)
284                 result |= ADVERTISED_1000baseT    284                 result |= ADVERTISED_1000baseT_Half;
285         if (lpa & LPA_1000FULL)                   285         if (lpa & LPA_1000FULL)
286                 result |= ADVERTISED_1000baseT    286                 result |= ADVERTISED_1000baseT_Full;
287                                                   287 
288         return result;                            288         return result;
289 }                                                 289 }
290                                                   290 
291 /**                                               291 /**
292  * mii_stat1000_mod_linkmode_lpa_t                292  * mii_stat1000_mod_linkmode_lpa_t
293  * @advertising: target the linkmode advertise    293  * @advertising: target the linkmode advertisement settings
294  * @adv: value of the MII_STAT1000 register       294  * @adv: value of the MII_STAT1000 register
295  *                                                295  *
296  * A small helper function that translates MII    296  * A small helper function that translates MII_STAT1000 bits, when in
297  * 1000Base-T mode, to linkmode advertisement     297  * 1000Base-T mode, to linkmode advertisement settings. Other bits in
298  * advertising are not changes.                   298  * advertising are not changes.
299  */                                               299  */
300 static inline void mii_stat1000_mod_linkmode_l    300 static inline void mii_stat1000_mod_linkmode_lpa_t(unsigned long *advertising,
301                                                   301                                                    u32 lpa)
302 {                                                 302 {
303         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    303         linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT,
304                          advertising, lpa & LP    304                          advertising, lpa & LPA_1000HALF);
305                                                   305 
306         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    306         linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
307                          advertising, lpa & LP    307                          advertising, lpa & LPA_1000FULL);
308 }                                                 308 }
309                                                   309 
310 /**                                               310 /**
311  * ethtool_adv_to_mii_adv_x                       311  * ethtool_adv_to_mii_adv_x
312  * @ethadv: the ethtool advertisement settings    312  * @ethadv: the ethtool advertisement settings
313  *                                                313  *
314  * A small helper function that translates eth    314  * A small helper function that translates ethtool advertisement
315  * settings to phy autonegotiation advertiseme    315  * settings to phy autonegotiation advertisements for the
316  * MII_CTRL1000 register when in 1000Base-X mo    316  * MII_CTRL1000 register when in 1000Base-X mode.
317  */                                               317  */
318 static inline u32 ethtool_adv_to_mii_adv_x(u32    318 static inline u32 ethtool_adv_to_mii_adv_x(u32 ethadv)
319 {                                                 319 {
320         u32 result = 0;                           320         u32 result = 0;
321                                                   321 
322         if (ethadv & ADVERTISED_1000baseT_Half    322         if (ethadv & ADVERTISED_1000baseT_Half)
323                 result |= ADVERTISE_1000XHALF;    323                 result |= ADVERTISE_1000XHALF;
324         if (ethadv & ADVERTISED_1000baseT_Full    324         if (ethadv & ADVERTISED_1000baseT_Full)
325                 result |= ADVERTISE_1000XFULL;    325                 result |= ADVERTISE_1000XFULL;
326         if (ethadv & ADVERTISED_Pause)            326         if (ethadv & ADVERTISED_Pause)
327                 result |= ADVERTISE_1000XPAUSE    327                 result |= ADVERTISE_1000XPAUSE;
328         if (ethadv & ADVERTISED_Asym_Pause)       328         if (ethadv & ADVERTISED_Asym_Pause)
329                 result |= ADVERTISE_1000XPSE_A    329                 result |= ADVERTISE_1000XPSE_ASYM;
330                                                   330 
331         return result;                            331         return result;
332 }                                                 332 }
333                                                   333 
334 /**                                               334 /**
335  * mii_adv_to_ethtool_adv_x                       335  * mii_adv_to_ethtool_adv_x
336  * @adv: value of the MII_CTRL1000 register       336  * @adv: value of the MII_CTRL1000 register
337  *                                                337  *
338  * A small helper function that translates MII    338  * A small helper function that translates MII_CTRL1000
339  * bits, when in 1000Base-X mode, to ethtool      339  * bits, when in 1000Base-X mode, to ethtool
340  * advertisement settings.                        340  * advertisement settings.
341  */                                               341  */
342 static inline u32 mii_adv_to_ethtool_adv_x(u32    342 static inline u32 mii_adv_to_ethtool_adv_x(u32 adv)
343 {                                                 343 {
344         u32 result = 0;                           344         u32 result = 0;
345                                                   345 
346         if (adv & ADVERTISE_1000XHALF)            346         if (adv & ADVERTISE_1000XHALF)
347                 result |= ADVERTISED_1000baseT    347                 result |= ADVERTISED_1000baseT_Half;
348         if (adv & ADVERTISE_1000XFULL)            348         if (adv & ADVERTISE_1000XFULL)
349                 result |= ADVERTISED_1000baseT    349                 result |= ADVERTISED_1000baseT_Full;
350         if (adv & ADVERTISE_1000XPAUSE)           350         if (adv & ADVERTISE_1000XPAUSE)
351                 result |= ADVERTISED_Pause;       351                 result |= ADVERTISED_Pause;
352         if (adv & ADVERTISE_1000XPSE_ASYM)        352         if (adv & ADVERTISE_1000XPSE_ASYM)
353                 result |= ADVERTISED_Asym_Paus    353                 result |= ADVERTISED_Asym_Pause;
354                                                   354 
355         return result;                            355         return result;
356 }                                                 356 }
357                                                   357 
358 /**                                               358 /**
359  * mii_adv_mod_linkmode_adv_t                     359  * mii_adv_mod_linkmode_adv_t
360  * @advertising:pointer to destination link mo    360  * @advertising:pointer to destination link mode.
361  * @adv: value of the MII_ADVERTISE register      361  * @adv: value of the MII_ADVERTISE register
362  *                                                362  *
363  * A small helper function that translates MII    363  * A small helper function that translates MII_ADVERTISE bits to
364  * linkmode advertisement settings. Leaves oth    364  * linkmode advertisement settings. Leaves other bits unchanged.
365  */                                               365  */
366 static inline void mii_adv_mod_linkmode_adv_t(    366 static inline void mii_adv_mod_linkmode_adv_t(unsigned long *advertising,
367                                                   367                                               u32 adv)
368 {                                                 368 {
369         linkmode_mod_bit(ETHTOOL_LINK_MODE_10b    369         linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Half_BIT,
370                          advertising, adv & AD    370                          advertising, adv & ADVERTISE_10HALF);
371                                                   371 
372         linkmode_mod_bit(ETHTOOL_LINK_MODE_10b    372         linkmode_mod_bit(ETHTOOL_LINK_MODE_10baseT_Full_BIT,
373                          advertising, adv & AD    373                          advertising, adv & ADVERTISE_10FULL);
374                                                   374 
375         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    375         linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT,
376                          advertising, adv & AD    376                          advertising, adv & ADVERTISE_100HALF);
377                                                   377 
378         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    378         linkmode_mod_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
379                          advertising, adv & AD    379                          advertising, adv & ADVERTISE_100FULL);
380                                                   380 
381         linkmode_mod_bit(ETHTOOL_LINK_MODE_Pau    381         linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, advertising,
382                          adv & ADVERTISE_PAUSE    382                          adv & ADVERTISE_PAUSE_CAP);
383                                                   383 
384         linkmode_mod_bit(ETHTOOL_LINK_MODE_Asy    384         linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
385                          advertising, adv & AD    385                          advertising, adv & ADVERTISE_PAUSE_ASYM);
386 }                                                 386 }
387                                                   387 
388 /**                                               388 /**
389  * mii_adv_to_linkmode_adv_t                      389  * mii_adv_to_linkmode_adv_t
390  * @advertising:pointer to destination link mo    390  * @advertising:pointer to destination link mode.
391  * @adv: value of the MII_ADVERTISE register      391  * @adv: value of the MII_ADVERTISE register
392  *                                                392  *
393  * A small helper function that translates MII    393  * A small helper function that translates MII_ADVERTISE bits
394  * to linkmode advertisement settings. Clears     394  * to linkmode advertisement settings. Clears the old value
395  * of advertising.                                395  * of advertising.
396  */                                               396  */
397 static inline void mii_adv_to_linkmode_adv_t(u    397 static inline void mii_adv_to_linkmode_adv_t(unsigned long *advertising,
398                                              u    398                                              u32 adv)
399 {                                                 399 {
400         linkmode_zero(advertising);               400         linkmode_zero(advertising);
401                                                   401 
402         mii_adv_mod_linkmode_adv_t(advertising    402         mii_adv_mod_linkmode_adv_t(advertising, adv);
403 }                                                 403 }
404                                                   404 
405 /**                                               405 /**
406  * mii_lpa_to_linkmode_lpa_t                      406  * mii_lpa_to_linkmode_lpa_t
407  * @adv: value of the MII_LPA register            407  * @adv: value of the MII_LPA register
408  *                                                408  *
409  * A small helper function that translates MII    409  * A small helper function that translates MII_LPA bits, when in
410  * 1000Base-T mode, to linkmode LP advertiseme    410  * 1000Base-T mode, to linkmode LP advertisement settings. Clears the
411  * old value of advertising                       411  * old value of advertising
412  */                                               412  */
413 static inline void mii_lpa_to_linkmode_lpa_t(u    413 static inline void mii_lpa_to_linkmode_lpa_t(unsigned long *lp_advertising,
414                                              u    414                                              u32 lpa)
415 {                                                 415 {
416         mii_adv_to_linkmode_adv_t(lp_advertisi    416         mii_adv_to_linkmode_adv_t(lp_advertising, lpa);
417                                                   417 
418         if (lpa & LPA_LPACK)                      418         if (lpa & LPA_LPACK)
419                 linkmode_set_bit(ETHTOOL_LINK_    419                 linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
420                                  lp_advertisin    420                                  lp_advertising);
421                                                   421 
422 }                                                 422 }
423                                                   423 
424 /**                                               424 /**
425  * mii_lpa_mod_linkmode_lpa_t                     425  * mii_lpa_mod_linkmode_lpa_t
426  * @adv: value of the MII_LPA register            426  * @adv: value of the MII_LPA register
427  *                                                427  *
428  * A small helper function that translates MII    428  * A small helper function that translates MII_LPA bits, when in
429  * 1000Base-T mode, to linkmode LP advertiseme    429  * 1000Base-T mode, to linkmode LP advertisement settings. Leaves
430  * other bits unchanged.                          430  * other bits unchanged.
431  */                                               431  */
432 static inline void mii_lpa_mod_linkmode_lpa_t(    432 static inline void mii_lpa_mod_linkmode_lpa_t(unsigned long *lp_advertising,
433                                                   433                                               u32 lpa)
434 {                                                 434 {
435         mii_adv_mod_linkmode_adv_t(lp_advertis    435         mii_adv_mod_linkmode_adv_t(lp_advertising, lpa);
436                                                   436 
437         linkmode_mod_bit(ETHTOOL_LINK_MODE_Aut    437         linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
438                          lp_advertising, lpa &    438                          lp_advertising, lpa & LPA_LPACK);
439 }                                                 439 }
440                                                   440 
441 static inline void mii_ctrl1000_mod_linkmode_a    441 static inline void mii_ctrl1000_mod_linkmode_adv_t(unsigned long *advertising,
442                                                   442                                                    u32 ctrl1000)
443 {                                                 443 {
444         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    444         linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Half_BIT, advertising,
445                          ctrl1000 & ADVERTISE_    445                          ctrl1000 & ADVERTISE_1000HALF);
446         linkmode_mod_bit(ETHTOOL_LINK_MODE_100    446         linkmode_mod_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, advertising,
447                          ctrl1000 & ADVERTISE_    447                          ctrl1000 & ADVERTISE_1000FULL);
448 }                                                 448 }
449                                                   449 
450 /**                                               450 /**
451  * linkmode_adv_to_lcl_adv_t                      451  * linkmode_adv_to_lcl_adv_t
452  * @advertising:pointer to linkmode advertisin    452  * @advertising:pointer to linkmode advertising
453  *                                                453  *
454  * A small helper function that translates lin    454  * A small helper function that translates linkmode advertising to LVL
455  * pause capabilities.                            455  * pause capabilities.
456  */                                               456  */
457 static inline u32 linkmode_adv_to_lcl_adv_t(co    457 static inline u32 linkmode_adv_to_lcl_adv_t(const unsigned long *advertising)
458 {                                                 458 {
459         u32 lcl_adv = 0;                          459         u32 lcl_adv = 0;
460                                                   460 
461         if (linkmode_test_bit(ETHTOOL_LINK_MOD    461         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT,
462                               advertising))       462                               advertising))
463                 lcl_adv |= ADVERTISE_PAUSE_CAP    463                 lcl_adv |= ADVERTISE_PAUSE_CAP;
464         if (linkmode_test_bit(ETHTOOL_LINK_MOD    464         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT,
465                               advertising))       465                               advertising))
466                 lcl_adv |= ADVERTISE_PAUSE_ASY    466                 lcl_adv |= ADVERTISE_PAUSE_ASYM;
467                                                   467 
468         return lcl_adv;                           468         return lcl_adv;
469 }                                                 469 }
470                                                   470 
471 /**                                               471 /**
472  * mii_lpa_mod_linkmode_x - decode the link pa    472  * mii_lpa_mod_linkmode_x - decode the link partner's config_reg to linkmodes
473  * @linkmodes: link modes array                   473  * @linkmodes: link modes array
474  * @lpa: config_reg word from link partner        474  * @lpa: config_reg word from link partner
475  * @fd_bit: link mode for 1000XFULL bit           475  * @fd_bit: link mode for 1000XFULL bit
476  */                                               476  */
477 static inline void mii_lpa_mod_linkmode_x(unsi    477 static inline void mii_lpa_mod_linkmode_x(unsigned long *linkmodes, u16 lpa,
478                                          int f    478                                          int fd_bit)
479 {                                                 479 {
480         linkmode_mod_bit(ETHTOOL_LINK_MODE_Aut    480         linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, linkmodes,
481                          lpa & LPA_LPACK);        481                          lpa & LPA_LPACK);
482         linkmode_mod_bit(ETHTOOL_LINK_MODE_Pau    482         linkmode_mod_bit(ETHTOOL_LINK_MODE_Pause_BIT, linkmodes,
483                          lpa & LPA_1000XPAUSE)    483                          lpa & LPA_1000XPAUSE);
484         linkmode_mod_bit(ETHTOOL_LINK_MODE_Asy    484         linkmode_mod_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, linkmodes,
485                          lpa & LPA_1000XPAUSE_    485                          lpa & LPA_1000XPAUSE_ASYM);
486         linkmode_mod_bit(fd_bit, linkmodes,       486         linkmode_mod_bit(fd_bit, linkmodes,
487                          lpa & LPA_1000XFULL);    487                          lpa & LPA_1000XFULL);
488 }                                                 488 }
489                                                   489 
490 /**                                               490 /**
491  * linkmode_adv_to_mii_adv_x - encode a linkmo    491  * linkmode_adv_to_mii_adv_x - encode a linkmode to config_reg
492  * @linkmodes: linkmodes                          492  * @linkmodes: linkmodes
493  * @fd_bit: full duplex bit                       493  * @fd_bit: full duplex bit
494  */                                               494  */
495 static inline u16 linkmode_adv_to_mii_adv_x(co    495 static inline u16 linkmode_adv_to_mii_adv_x(const unsigned long *linkmodes,
496                                             in    496                                             int fd_bit)
497 {                                                 497 {
498         u16 adv = 0;                              498         u16 adv = 0;
499                                                   499 
500         if (linkmode_test_bit(fd_bit, linkmode    500         if (linkmode_test_bit(fd_bit, linkmodes))
501                 adv |= ADVERTISE_1000XFULL;       501                 adv |= ADVERTISE_1000XFULL;
502         if (linkmode_test_bit(ETHTOOL_LINK_MOD    502         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Pause_BIT, linkmodes))
503                 adv |= ADVERTISE_1000XPAUSE;      503                 adv |= ADVERTISE_1000XPAUSE;
504         if (linkmode_test_bit(ETHTOOL_LINK_MOD    504         if (linkmode_test_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, linkmodes))
505                 adv |= ADVERTISE_1000XPSE_ASYM    505                 adv |= ADVERTISE_1000XPSE_ASYM;
506                                                   506 
507         return adv;                               507         return adv;
508 }                                                 508 }
509                                                   509 
510 /**                                               510 /**
511  * mii_advertise_flowctrl - get flow control a    511  * mii_advertise_flowctrl - get flow control advertisement flags
512  * @cap: Flow control capabilities (FLOW_CTRL_    512  * @cap: Flow control capabilities (FLOW_CTRL_RX, FLOW_CTRL_TX or both)
513  */                                               513  */
514 static inline u16 mii_advertise_flowctrl(int c    514 static inline u16 mii_advertise_flowctrl(int cap)
515 {                                                 515 {
516         u16 adv = 0;                              516         u16 adv = 0;
517                                                   517 
518         if (cap & FLOW_CTRL_RX)                   518         if (cap & FLOW_CTRL_RX)
519                 adv = ADVERTISE_PAUSE_CAP | AD    519                 adv = ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
520         if (cap & FLOW_CTRL_TX)                   520         if (cap & FLOW_CTRL_TX)
521                 adv ^= ADVERTISE_PAUSE_ASYM;      521                 adv ^= ADVERTISE_PAUSE_ASYM;
522                                                   522 
523         return adv;                               523         return adv;
524 }                                                 524 }
525                                                   525 
526 /**                                               526 /**
527  * mii_resolve_flowctrl_fdx                       527  * mii_resolve_flowctrl_fdx
528  * @lcladv: value of MII ADVERTISE register       528  * @lcladv: value of MII ADVERTISE register
529  * @rmtadv: value of MII LPA register             529  * @rmtadv: value of MII LPA register
530  *                                                530  *
531  * Resolve full duplex flow control as per IEE    531  * Resolve full duplex flow control as per IEEE 802.3-2005 table 28B-3
532  */                                               532  */
533 static inline u8 mii_resolve_flowctrl_fdx(u16     533 static inline u8 mii_resolve_flowctrl_fdx(u16 lcladv, u16 rmtadv)
534 {                                                 534 {
535         u8 cap = 0;                               535         u8 cap = 0;
536                                                   536 
537         if (lcladv & rmtadv & ADVERTISE_PAUSE_    537         if (lcladv & rmtadv & ADVERTISE_PAUSE_CAP) {
538                 cap = FLOW_CTRL_TX | FLOW_CTRL    538                 cap = FLOW_CTRL_TX | FLOW_CTRL_RX;
539         } else if (lcladv & rmtadv & ADVERTISE    539         } else if (lcladv & rmtadv & ADVERTISE_PAUSE_ASYM) {
540                 if (lcladv & ADVERTISE_PAUSE_C    540                 if (lcladv & ADVERTISE_PAUSE_CAP)
541                         cap = FLOW_CTRL_RX;       541                         cap = FLOW_CTRL_RX;
542                 else if (rmtadv & ADVERTISE_PA    542                 else if (rmtadv & ADVERTISE_PAUSE_CAP)
543                         cap = FLOW_CTRL_TX;       543                         cap = FLOW_CTRL_TX;
544         }                                         544         }
545                                                   545 
546         return cap;                               546         return cap;
547 }                                                 547 }
548                                                   548 
549 /**                                               549 /**
550  * mii_bmcr_encode_fixed - encode fixed speed/    550  * mii_bmcr_encode_fixed - encode fixed speed/duplex settings to a BMCR value
551  * @speed: a SPEED_* value                        551  * @speed: a SPEED_* value
552  * @duplex: a DUPLEX_* value                      552  * @duplex: a DUPLEX_* value
553  *                                                553  *
554  * Encode the speed and duplex to a BMCR value    554  * Encode the speed and duplex to a BMCR value. 2500, 1000, 100 and 10 Mbps are
555  * supported. 2500Mbps is encoded to 1000Mbps.    555  * supported. 2500Mbps is encoded to 1000Mbps. Other speeds are encoded as 10
556  * Mbps. Unknown duplex values are encoded to     556  * Mbps. Unknown duplex values are encoded to half-duplex.
557  */                                               557  */
558 static inline u16 mii_bmcr_encode_fixed(int sp    558 static inline u16 mii_bmcr_encode_fixed(int speed, int duplex)
559 {                                                 559 {
560         u16 bmcr;                                 560         u16 bmcr;
561                                                   561 
562         switch (speed) {                          562         switch (speed) {
563         case SPEED_2500:                          563         case SPEED_2500:
564         case SPEED_1000:                          564         case SPEED_1000:
565                 bmcr = BMCR_SPEED1000;            565                 bmcr = BMCR_SPEED1000;
566                 break;                            566                 break;
567                                                   567 
568         case SPEED_100:                           568         case SPEED_100:
569                 bmcr = BMCR_SPEED100;             569                 bmcr = BMCR_SPEED100;
570                 break;                            570                 break;
571                                                   571 
572         case SPEED_10:                            572         case SPEED_10:
573         default:                                  573         default:
574                 bmcr = BMCR_SPEED10;              574                 bmcr = BMCR_SPEED10;
575                 break;                            575                 break;
576         }                                         576         }
577                                                   577 
578         if (duplex == DUPLEX_FULL)                578         if (duplex == DUPLEX_FULL)
579                 bmcr |= BMCR_FULLDPLX;            579                 bmcr |= BMCR_FULLDPLX;
580                                                   580 
581         return bmcr;                              581         return bmcr;
582 }                                                 582 }
583                                                   583 
584 #endif /* __LINUX_MII_H__ */                      584 #endif /* __LINUX_MII_H__ */
585                                                   585 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php