29
29
#include <linux/module.h>
30
30
#include <linux/mii.h>
31
31
#include <linux/ethtool.h>
32
+ #include <linux/bitmap.h>
32
33
#include <linux/phy.h>
33
34
#include <linux/phy_led_triggers.h>
34
35
#include <linux/mdio.h>
@@ -42,6 +43,149 @@ MODULE_DESCRIPTION("PHY library");
42
43
MODULE_AUTHOR ("Andy Fleming" );
43
44
MODULE_LICENSE ("GPL" );
44
45
46
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_basic_features ) __ro_after_init ;
47
+ EXPORT_SYMBOL_GPL (phy_basic_features );
48
+
49
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_basic_t1_features ) __ro_after_init ;
50
+ EXPORT_SYMBOL_GPL (phy_basic_t1_features );
51
+
52
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_gbit_features ) __ro_after_init ;
53
+ EXPORT_SYMBOL_GPL (phy_gbit_features );
54
+
55
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_gbit_fibre_features ) __ro_after_init ;
56
+ EXPORT_SYMBOL_GPL (phy_gbit_fibre_features );
57
+
58
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_gbit_all_ports_features ) __ro_after_init ;
59
+ EXPORT_SYMBOL_GPL (phy_gbit_all_ports_features );
60
+
61
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_10gbit_features ) __ro_after_init ;
62
+ EXPORT_SYMBOL_GPL (phy_10gbit_features );
63
+
64
+ static const int phy_basic_ports_array [] = {
65
+ ETHTOOL_LINK_MODE_Autoneg_BIT ,
66
+ ETHTOOL_LINK_MODE_TP_BIT ,
67
+ ETHTOOL_LINK_MODE_MII_BIT ,
68
+ };
69
+
70
+ static const int phy_fibre_port_array [] = {
71
+ ETHTOOL_LINK_MODE_FIBRE_BIT ,
72
+ };
73
+
74
+ static const int phy_all_ports_features_array [] = {
75
+ ETHTOOL_LINK_MODE_Autoneg_BIT ,
76
+ ETHTOOL_LINK_MODE_TP_BIT ,
77
+ ETHTOOL_LINK_MODE_MII_BIT ,
78
+ ETHTOOL_LINK_MODE_FIBRE_BIT ,
79
+ ETHTOOL_LINK_MODE_AUI_BIT ,
80
+ ETHTOOL_LINK_MODE_BNC_BIT ,
81
+ ETHTOOL_LINK_MODE_Backplane_BIT ,
82
+ };
83
+
84
+ static const int phy_10_100_features_array [] = {
85
+ ETHTOOL_LINK_MODE_10baseT_Half_BIT ,
86
+ ETHTOOL_LINK_MODE_10baseT_Full_BIT ,
87
+ ETHTOOL_LINK_MODE_100baseT_Half_BIT ,
88
+ ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
89
+ };
90
+
91
+ static const int phy_basic_t1_features_array [] = {
92
+ ETHTOOL_LINK_MODE_TP_BIT ,
93
+ ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
94
+ };
95
+
96
+ static const int phy_gbit_features_array [] = {
97
+ ETHTOOL_LINK_MODE_1000baseT_Half_BIT ,
98
+ ETHTOOL_LINK_MODE_1000baseT_Full_BIT ,
99
+ };
100
+
101
+ static const int phy_10gbit_features_array [] = {
102
+ ETHTOOL_LINK_MODE_10000baseT_Full_BIT ,
103
+ };
104
+
105
+ __ETHTOOL_DECLARE_LINK_MODE_MASK (phy_10gbit_full_features ) __ro_after_init ;
106
+ EXPORT_SYMBOL_GPL (phy_10gbit_full_features );
107
+
108
+ static const int phy_10gbit_full_features_array [] = {
109
+ ETHTOOL_LINK_MODE_10baseT_Full_BIT ,
110
+ ETHTOOL_LINK_MODE_100baseT_Full_BIT ,
111
+ ETHTOOL_LINK_MODE_1000baseT_Full_BIT ,
112
+ ETHTOOL_LINK_MODE_10000baseT_Full_BIT ,
113
+ };
114
+
115
+ static void features_init (void )
116
+ {
117
+ /* 10/100 half/full*/
118
+ linkmode_set_bit_array (phy_basic_ports_array ,
119
+ ARRAY_SIZE (phy_basic_ports_array ),
120
+ phy_basic_features );
121
+ linkmode_set_bit_array (phy_10_100_features_array ,
122
+ ARRAY_SIZE (phy_10_100_features_array ),
123
+ phy_basic_features );
124
+
125
+ /* 100 full, TP */
126
+ linkmode_set_bit_array (phy_basic_t1_features_array ,
127
+ ARRAY_SIZE (phy_basic_t1_features_array ),
128
+ phy_basic_t1_features );
129
+
130
+ /* 10/100 half/full + 1000 half/full */
131
+ linkmode_set_bit_array (phy_basic_ports_array ,
132
+ ARRAY_SIZE (phy_basic_ports_array ),
133
+ phy_gbit_features );
134
+ linkmode_set_bit_array (phy_10_100_features_array ,
135
+ ARRAY_SIZE (phy_10_100_features_array ),
136
+ phy_gbit_features );
137
+ linkmode_set_bit_array (phy_gbit_features_array ,
138
+ ARRAY_SIZE (phy_gbit_features_array ),
139
+ phy_gbit_features );
140
+
141
+ /* 10/100 half/full + 1000 half/full + fibre*/
142
+ linkmode_set_bit_array (phy_basic_ports_array ,
143
+ ARRAY_SIZE (phy_basic_ports_array ),
144
+ phy_gbit_fibre_features );
145
+ linkmode_set_bit_array (phy_10_100_features_array ,
146
+ ARRAY_SIZE (phy_10_100_features_array ),
147
+ phy_gbit_fibre_features );
148
+ linkmode_set_bit_array (phy_gbit_features_array ,
149
+ ARRAY_SIZE (phy_gbit_features_array ),
150
+ phy_gbit_fibre_features );
151
+ linkmode_set_bit_array (phy_fibre_port_array ,
152
+ ARRAY_SIZE (phy_fibre_port_array ),
153
+ phy_gbit_fibre_features );
154
+
155
+ /* 10/100 half/full + 1000 half/full + TP/MII/FIBRE/AUI/BNC/Backplane*/
156
+ linkmode_set_bit_array (phy_all_ports_features_array ,
157
+ ARRAY_SIZE (phy_all_ports_features_array ),
158
+ phy_gbit_all_ports_features );
159
+ linkmode_set_bit_array (phy_10_100_features_array ,
160
+ ARRAY_SIZE (phy_10_100_features_array ),
161
+ phy_gbit_all_ports_features );
162
+ linkmode_set_bit_array (phy_gbit_features_array ,
163
+ ARRAY_SIZE (phy_gbit_features_array ),
164
+ phy_gbit_all_ports_features );
165
+
166
+ /* 10/100 half/full + 1000 half/full + 10G full*/
167
+ linkmode_set_bit_array (phy_all_ports_features_array ,
168
+ ARRAY_SIZE (phy_all_ports_features_array ),
169
+ phy_10gbit_features );
170
+ linkmode_set_bit_array (phy_10_100_features_array ,
171
+ ARRAY_SIZE (phy_10_100_features_array ),
172
+ phy_10gbit_features );
173
+ linkmode_set_bit_array (phy_gbit_features_array ,
174
+ ARRAY_SIZE (phy_gbit_features_array ),
175
+ phy_10gbit_features );
176
+ linkmode_set_bit_array (phy_10gbit_features_array ,
177
+ ARRAY_SIZE (phy_10gbit_features_array ),
178
+ phy_10gbit_features );
179
+
180
+ /* 10/100/1000/10G full */
181
+ linkmode_set_bit_array (phy_all_ports_features_array ,
182
+ ARRAY_SIZE (phy_all_ports_features_array ),
183
+ phy_10gbit_full_features );
184
+ linkmode_set_bit_array (phy_10gbit_full_features_array ,
185
+ ARRAY_SIZE (phy_10gbit_full_features_array ),
186
+ phy_10gbit_full_features );
187
+ }
188
+
45
189
void phy_device_free (struct phy_device * phydev )
46
190
{
47
191
put_device (& phydev -> mdio .dev );
@@ -1936,6 +2080,7 @@ static int phy_probe(struct device *dev)
1936
2080
struct phy_device * phydev = to_phy_device (dev );
1937
2081
struct device_driver * drv = phydev -> mdio .dev .driver ;
1938
2082
struct phy_driver * phydrv = to_phy_driver (drv );
2083
+ u32 features ;
1939
2084
int err = 0 ;
1940
2085
1941
2086
phydev -> drv = phydrv ;
@@ -1956,7 +2101,8 @@ static int phy_probe(struct device *dev)
1956
2101
* a controller will attach, and may modify one
1957
2102
* or both of these values
1958
2103
*/
1959
- phydev -> supported = phydrv -> features ;
2104
+ ethtool_convert_link_mode_to_legacy_u32 (& features , phydrv -> features );
2105
+ phydev -> supported = features ;
1960
2106
of_set_phy_supported (phydev );
1961
2107
phydev -> advertising = phydev -> supported ;
1962
2108
@@ -1976,10 +2122,14 @@ static int phy_probe(struct device *dev)
1976
2122
* (e.g. hardware erratum) where the driver wants to set only one
1977
2123
* of these bits.
1978
2124
*/
1979
- if (phydrv -> features & (SUPPORTED_Pause | SUPPORTED_Asym_Pause )) {
2125
+ if (test_bit (ETHTOOL_LINK_MODE_Pause_BIT , phydrv -> features ) ||
2126
+ test_bit (ETHTOOL_LINK_MODE_Asym_Pause_BIT , phydrv -> features )) {
1980
2127
phydev -> supported &= ~(SUPPORTED_Pause | SUPPORTED_Asym_Pause );
1981
- phydev -> supported |= phydrv -> features &
1982
- (SUPPORTED_Pause | SUPPORTED_Asym_Pause );
2128
+ if (test_bit (ETHTOOL_LINK_MODE_Pause_BIT , phydrv -> features ))
2129
+ phydev -> supported |= SUPPORTED_Pause ;
2130
+ if (test_bit (ETHTOOL_LINK_MODE_Asym_Pause_BIT ,
2131
+ phydrv -> features ))
2132
+ phydev -> supported |= SUPPORTED_Asym_Pause ;
1983
2133
} else {
1984
2134
phydev -> supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause ;
1985
2135
}
@@ -2092,9 +2242,7 @@ static struct phy_driver genphy_driver = {
2092
2242
.name = "Generic PHY" ,
2093
2243
.soft_reset = genphy_no_soft_reset ,
2094
2244
.config_init = genphy_config_init ,
2095
- .features = PHY_GBIT_FEATURES | SUPPORTED_MII |
2096
- SUPPORTED_AUI | SUPPORTED_FIBRE |
2097
- SUPPORTED_BNC ,
2245
+ .features = PHY_GBIT_ALL_PORTS_FEATURES ,
2098
2246
.aneg_done = genphy_aneg_done ,
2099
2247
.suspend = genphy_suspend ,
2100
2248
.resume = genphy_resume ,
@@ -2109,6 +2257,8 @@ static int __init phy_init(void)
2109
2257
if (rc )
2110
2258
return rc ;
2111
2259
2260
+ features_init ();
2261
+
2112
2262
rc = phy_driver_register (& genphy_10g_driver , THIS_MODULE );
2113
2263
if (rc )
2114
2264
goto err_10g ;
0 commit comments