| From foo@baz Sat Jan 26 10:22:50 CET 2019 |
| From: Camelia Groza <camelia.groza@nxp.com> |
| Date: Thu, 17 Jan 2019 14:22:36 +0200 |
| Subject: net: phy: phy driver features are mandatory |
| |
| From: Camelia Groza <camelia.groza@nxp.com> |
| |
| [ Upstream commit 3e64cf7a435ed0500e3adaa8aada2272d3ae8abc ] |
| |
| Since phy driver features became a link_mode bitmap, phy drivers that |
| don't have a list of features configured will cause the kernel to crash |
| when probed. |
| |
| Prevent the phy driver from registering if the features field is missing. |
| |
| Fixes: 719655a14971 ("net: phy: Replace phy driver features u32 with link_mode bitmap") |
| Reported-by: Scott Wood <oss@buserror.net> |
| Signed-off-by: Camelia Groza <camelia.groza@nxp.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/phy/phy_device.c | 5 +++++ |
| include/linux/phy.h | 4 ++-- |
| 2 files changed, 7 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/phy/phy_device.c |
| +++ b/drivers/net/phy/phy_device.c |
| @@ -2196,6 +2196,11 @@ int phy_driver_register(struct phy_drive |
| { |
| int retval; |
| |
| + if (WARN_ON(!new_driver->features)) { |
| + pr_err("%s: Driver features are missing\n", new_driver->name); |
| + return -EINVAL; |
| + } |
| + |
| new_driver->mdiodrv.flags |= MDIO_DEVICE_IS_PHY; |
| new_driver->mdiodrv.driver.name = new_driver->name; |
| new_driver->mdiodrv.driver.bus = &mdio_bus_type; |
| --- a/include/linux/phy.h |
| +++ b/include/linux/phy.h |
| @@ -502,8 +502,8 @@ struct phy_device { |
| * only works for PHYs with IDs which match this field |
| * name: The friendly name of this PHY type |
| * phy_id_mask: Defines the important bits of the phy_id |
| - * features: A list of features (speed, duplex, etc) supported |
| - * by this PHY |
| + * features: A mandatory list of features (speed, duplex, etc) |
| + * supported by this PHY |
| * flags: A bitfield defining certain other features this PHY |
| * supports (like interrupts) |
| * |