diff options
Diffstat (limited to 'include/linux/phy.h')
| -rw-r--r-- | include/linux/phy.h | 55 | 
1 files changed, 47 insertions, 8 deletions
| diff --git a/include/linux/phy.h b/include/linux/phy.h index 6478838405a0..11c1e91563d4 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -86,6 +86,7 @@ extern const int phy_10gbit_features_array[1];  #define PHY_IS_INTERNAL		0x00000001  #define PHY_RST_AFTER_CLK_EN	0x00000002  #define PHY_POLL_CABLE_TEST	0x00000004 +#define PHY_ALWAYS_CALL_SUSPEND	0x00000008  #define MDIO_DEVICE_IS_PHY	0x80000000  /** @@ -496,14 +497,17 @@ struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr);   * Once complete, move to UP to restart the PHY.   * - phy_stop aborts the running test and moves to @PHY_HALTED   * - * @PHY_HALTED: PHY is up, but no polling or interrupts are done. Or - * PHY is in an error state. + * @PHY_HALTED: PHY is up, but no polling or interrupts are done.   * - phy_start moves to @PHY_UP + * + * @PHY_ERROR: PHY is up, but is in an error state. + * - phy_stop moves to @PHY_HALTED   */  enum phy_state {  	PHY_DOWN = 0,  	PHY_READY,  	PHY_HALTED, +	PHY_ERROR,  	PHY_UP,  	PHY_RUNNING,  	PHY_NOLINK, @@ -548,6 +552,8 @@ struct macsec_ops;   * @downshifted_rate: Set true if link speed has been downshifted.   * @is_on_sfp_module: Set true if PHY is located on an SFP module.   * @mac_managed_pm: Set true if MAC driver takes of suspending/resuming PHY + * @wol_enabled: Set to true if the PHY or the attached MAC have Wake-on-LAN + * 		 enabled.   * @state: State of the PHY for management purposes   * @dev_flags: Device-specific flags used by the PHY driver.   * @@ -644,6 +650,7 @@ struct phy_device {  	unsigned downshifted_rate:1;  	unsigned is_on_sfp_module:1;  	unsigned mac_managed_pm:1; +	unsigned wol_enabled:1;  	unsigned autoneg:1;  	/* The most recently read link state */ @@ -1108,6 +1115,34 @@ struct phy_driver {  #define PHY_ID_MATCH_MODEL(id) .phy_id = (id), .phy_id_mask = GENMASK(31, 4)  #define PHY_ID_MATCH_VENDOR(id) .phy_id = (id), .phy_id_mask = GENMASK(31, 10) +/** + * phy_id_compare - compare @id1 with @id2 taking account of @mask + * @id1: first PHY ID + * @id2: second PHY ID + * @mask: the PHY ID mask, set bits are significant in matching + * + * Return true if the bits from @id1 and @id2 specified by @mask match. + * This uses an equivalent test to (@id & @mask) == (@phy_id & @mask). + */ +static inline bool phy_id_compare(u32 id1, u32 id2, u32 mask) +{ +	return !((id1 ^ id2) & mask); +} + +/** + * phydev_id_compare - compare @id with the PHY's Clause 22 ID + * @phydev: the PHY device + * @id: the PHY ID to be matched + * + * Compare the @phydev clause 22 ID with the provided @id and return true or + * false depending whether it matches, using the bound driver mask. The + * @phydev must be bound to a driver. + */ +static inline bool phydev_id_compare(struct phy_device *phydev, u32 id) +{ +	return phy_id_compare(id, phydev->phy_id, phydev->drv->phy_id_mask); +} +  /* A Structure for boards to register fixups with the PHY Lib */  struct phy_fixup {  	struct list_head list; @@ -1171,10 +1206,12 @@ static inline int phy_read(struct phy_device *phydev, u32 regnum)  #define phy_read_poll_timeout(phydev, regnum, val, cond, sleep_us, \  				timeout_us, sleep_before_read) \  ({ \ -	int __ret = read_poll_timeout(phy_read, val, val < 0 || (cond), \ +	int __ret, __val; \ +	__ret = read_poll_timeout(__val = phy_read, val, \ +				  __val < 0 || (cond), \  		sleep_us, timeout_us, sleep_before_read, phydev, regnum); \ -	if (val < 0) \ -		__ret = val; \ +	if (__val < 0) \ +		__ret = __val; \  	if (__ret) \  		phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \  	__ret; \ @@ -1267,11 +1304,13 @@ int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum);  #define phy_read_mmd_poll_timeout(phydev, devaddr, regnum, val, cond, \  				  sleep_us, timeout_us, sleep_before_read) \  ({ \ -	int __ret = read_poll_timeout(phy_read_mmd, val, (cond) || val < 0, \ +	int __ret, __val; \ +	__ret = read_poll_timeout(__val = phy_read_mmd, val, \ +				  __val < 0 || (cond), \  				  sleep_us, timeout_us, sleep_before_read, \  				  phydev, devaddr, regnum); \ -	if (val <  0) \ -		__ret = val; \ +	if (__val < 0) \ +		__ret = __val; \  	if (__ret) \  		phydev_err(phydev, "%s failed: %d\n", __func__, __ret); \  	__ret; \ |