diff options
Diffstat (limited to 'drivers/net/phy/phy_device.c')
-rw-r--r-- | drivers/net/phy/phy_device.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 51990002d495..46c86725a693 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c | |||
@@ -61,6 +61,9 @@ EXPORT_SYMBOL_GPL(phy_gbit_all_ports_features); | |||
61 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init; | 61 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init; |
62 | EXPORT_SYMBOL_GPL(phy_10gbit_features); | 62 | EXPORT_SYMBOL_GPL(phy_10gbit_features); |
63 | 63 | ||
64 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init; | ||
65 | EXPORT_SYMBOL_GPL(phy_10gbit_fec_features); | ||
66 | |||
64 | static const int phy_basic_ports_array[] = { | 67 | static const int phy_basic_ports_array[] = { |
65 | ETHTOOL_LINK_MODE_Autoneg_BIT, | 68 | ETHTOOL_LINK_MODE_Autoneg_BIT, |
66 | ETHTOOL_LINK_MODE_TP_BIT, | 69 | ETHTOOL_LINK_MODE_TP_BIT, |
@@ -109,6 +112,11 @@ const int phy_10gbit_features_array[1] = { | |||
109 | }; | 112 | }; |
110 | EXPORT_SYMBOL_GPL(phy_10gbit_features_array); | 113 | EXPORT_SYMBOL_GPL(phy_10gbit_features_array); |
111 | 114 | ||
115 | const int phy_10gbit_fec_features_array[1] = { | ||
116 | ETHTOOL_LINK_MODE_10000baseR_FEC_BIT, | ||
117 | }; | ||
118 | EXPORT_SYMBOL_GPL(phy_10gbit_fec_features_array); | ||
119 | |||
112 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; | 120 | __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; |
113 | EXPORT_SYMBOL_GPL(phy_10gbit_full_features); | 121 | EXPORT_SYMBOL_GPL(phy_10gbit_full_features); |
114 | 122 | ||
@@ -191,6 +199,10 @@ static void features_init(void) | |||
191 | linkmode_set_bit_array(phy_10gbit_full_features_array, | 199 | linkmode_set_bit_array(phy_10gbit_full_features_array, |
192 | ARRAY_SIZE(phy_10gbit_full_features_array), | 200 | ARRAY_SIZE(phy_10gbit_full_features_array), |
193 | phy_10gbit_full_features); | 201 | phy_10gbit_full_features); |
202 | /* 10G FEC only */ | ||
203 | linkmode_set_bit_array(phy_10gbit_fec_features_array, | ||
204 | ARRAY_SIZE(phy_10gbit_fec_features_array), | ||
205 | phy_10gbit_fec_features); | ||
194 | } | 206 | } |
195 | 207 | ||
196 | void phy_device_free(struct phy_device *phydev) | 208 | void phy_device_free(struct phy_device *phydev) |
@@ -2243,6 +2255,11 @@ int phy_driver_register(struct phy_driver *new_driver, struct module *owner) | |||
2243 | { | 2255 | { |
2244 | int retval; | 2256 | int retval; |
2245 | 2257 | ||
2258 | if (WARN_ON(!new_driver->features)) { | ||
2259 | pr_err("%s: Driver features are missing\n", new_driver->name); | ||
2260 | return -EINVAL; | ||
2261 | } | ||
2262 | |||
2246 | new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY; | 2263 | new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY; |
2247 | new_driver->mdiodrv.driver.name = new_driver->name; | 2264 | new_driver->mdiodrv.driver.name = new_driver->name; |
2248 | new_driver->mdiodrv.driver.bus = &mdio_bus_type; | 2265 | new_driver->mdiodrv.driver.bus = &mdio_bus_type; |