mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-18 10:34:24 +08:00
net: phy: allow driver to implement their own aneg_done
Some PHYs out there can be very quirky with respect to how they would report the auto-negotiation is completed. Allow drivers to override the generic aneg_done() implementation by providing their own. Since not all drivers have been updated yet to use genphy_aneg_done() as aneg_done() callback, we explicitely check that this callback is valid before calling into it. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a9fa6e6ac2
commit
76a423a3f8
@ -114,12 +114,15 @@ static int phy_config_interrupt(struct phy_device *phydev, u32 interrupts)
|
||||
* phy_aneg_done - return auto-negotiation status
|
||||
* @phydev: target phy_device struct
|
||||
*
|
||||
* Description: Reads the status register and returns 0 either if
|
||||
* auto-negotiation is incomplete, or if there was an error.
|
||||
* Returns BMSR_ANEGCOMPLETE if auto-negotiation is done.
|
||||
* Description: Return the auto-negotiation status from this @phydev
|
||||
* Returns > 0 on success or < 0 on error. 0 means that auto-negotiation
|
||||
* is still pending.
|
||||
*/
|
||||
static inline int phy_aneg_done(struct phy_device *phydev)
|
||||
{
|
||||
if (phydev->drv->aneg_done)
|
||||
return phydev->drv->aneg_done(phydev);
|
||||
|
||||
return genphy_aneg_done(phydev);
|
||||
}
|
||||
|
||||
|
@ -1267,6 +1267,7 @@ static struct phy_driver genphy_driver[] = {
|
||||
.config_init = genphy_config_init,
|
||||
.features = 0,
|
||||
.config_aneg = genphy_config_aneg,
|
||||
.aneg_done = genphy_aneg_done,
|
||||
.read_status = genphy_read_status,
|
||||
.suspend = genphy_suspend,
|
||||
.resume = genphy_resume,
|
||||
|
@ -417,6 +417,9 @@ struct phy_driver {
|
||||
*/
|
||||
int (*config_aneg)(struct phy_device *phydev);
|
||||
|
||||
/* Determines the auto negotiation result */
|
||||
int (*aneg_done)(struct phy_device *phydev);
|
||||
|
||||
/* Determines the negotiated speed and duplex */
|
||||
int (*read_status)(struct phy_device *phydev);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user