diff options
Diffstat (limited to 'drivers/net/phy/mdio_bus.c')
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 095ef3fe369a..46a14cbb0215 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c | |||
@@ -421,6 +421,8 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) | |||
421 | { | 421 | { |
422 | struct phy_device *phydev = to_phy_device(dev); | 422 | struct phy_device *phydev = to_phy_device(dev); |
423 | struct phy_driver *phydrv = to_phy_driver(drv); | 423 | struct phy_driver *phydrv = to_phy_driver(drv); |
424 | const int num_ids = ARRAY_SIZE(phydev->c45_ids.device_ids); | ||
425 | int i; | ||
424 | 426 | ||
425 | if (of_driver_match_device(dev, drv)) | 427 | if (of_driver_match_device(dev, drv)) |
426 | return 1; | 428 | return 1; |
@@ -428,8 +430,21 @@ static int mdio_bus_match(struct device *dev, struct device_driver *drv) | |||
428 | if (phydrv->match_phy_device) | 430 | if (phydrv->match_phy_device) |
429 | return phydrv->match_phy_device(phydev); | 431 | return phydrv->match_phy_device(phydev); |
430 | 432 | ||
431 | return (phydrv->phy_id & phydrv->phy_id_mask) == | 433 | if (phydev->is_c45) { |
432 | (phydev->phy_id & phydrv->phy_id_mask); | 434 | for (i = 1; i < num_ids; i++) { |
435 | if (!(phydev->c45_ids.devices_in_package & (1 << i))) | ||
436 | continue; | ||
437 | |||
438 | if ((phydrv->phy_id & phydrv->phy_id_mask) == | ||
439 | (phydev->c45_ids.device_ids[i] & | ||
440 | phydrv->phy_id_mask)) | ||
441 | return 1; | ||
442 | } | ||
443 | return 0; | ||
444 | } else { | ||
445 | return (phydrv->phy_id & phydrv->phy_id_mask) == | ||
446 | (phydev->phy_id & phydrv->phy_id_mask); | ||
447 | } | ||
433 | } | 448 | } |
434 | 449 | ||
435 | #ifdef CONFIG_PM | 450 | #ifdef CONFIG_PM |