diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-05-01 15:20:08 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2023-05-01 15:20:08 -0700 | 
| commit | 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e (patch) | |
| tree | d57f3a63479a07b4e0cece029886e76e04feb984 /include/linux/phy.h | |
| parent | 5dc63e56a9cf8df0b59c234a505a1653f1bdf885 (diff) | |
| parent | 53bea86b5712c7491bb3dae12e271666df0a308c (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.4 merge window.
Diffstat (limited to 'include/linux/phy.h')
| -rw-r--r-- | include/linux/phy.h | 122 | 
1 files changed, 113 insertions, 9 deletions
diff --git a/include/linux/phy.h b/include/linux/phy.h index 6378c997ded5..36bf0bbc8efa 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -45,27 +45,32 @@  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1_features) __ro_after_init; +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_basic_t1s_p2mp_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_fibre_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_gbit_all_ports_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_fec_features) __ro_after_init;  extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_10gbit_full_features) __ro_after_init; +extern __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_eee_cap1_features) __ro_after_init;  #define PHY_BASIC_FEATURES ((unsigned long *)&phy_basic_features)  #define PHY_BASIC_T1_FEATURES ((unsigned long *)&phy_basic_t1_features) +#define PHY_BASIC_T1S_P2MP_FEATURES ((unsigned long *)&phy_basic_t1s_p2mp_features)  #define PHY_GBIT_FEATURES ((unsigned long *)&phy_gbit_features)  #define PHY_GBIT_FIBRE_FEATURES ((unsigned long *)&phy_gbit_fibre_features)  #define PHY_GBIT_ALL_PORTS_FEATURES ((unsigned long *)&phy_gbit_all_ports_features)  #define PHY_10GBIT_FEATURES ((unsigned long *)&phy_10gbit_features)  #define PHY_10GBIT_FEC_FEATURES ((unsigned long *)&phy_10gbit_fec_features)  #define PHY_10GBIT_FULL_FEATURES ((unsigned long *)&phy_10gbit_full_features) +#define PHY_EEE_CAP1_FEATURES ((unsigned long *)&phy_eee_cap1_features)  extern const int phy_basic_ports_array[3];  extern const int phy_fibre_port_array[1];  extern const int phy_all_ports_features_array[7];  extern const int phy_10_100_features_array[4];  extern const int phy_basic_t1_features_array[3]; +extern const int phy_basic_t1s_p2mp_features_array[2];  extern const int phy_gbit_features_array[2];  extern const int phy_10gbit_features_array[1]; @@ -364,6 +369,11 @@ struct mii_bus {  	int (*read)(struct mii_bus *bus, int addr, int regnum);  	/** @write: Perform a write transfer on the bus */  	int (*write)(struct mii_bus *bus, int addr, int regnum, u16 val); +	/** @read_c45: Perform a C45 read transfer on the bus */ +	int (*read_c45)(struct mii_bus *bus, int addr, int devnum, int regnum); +	/** @write_c45: Perform a C45 write transfer on the bus */ +	int (*write_c45)(struct mii_bus *bus, int addr, int devnum, +			 int regnum, u16 val);  	/** @reset: Perform a reset of the bus */  	int (*reset)(struct mii_bus *bus); @@ -411,14 +421,6 @@ struct mii_bus {  	/** @reset_gpiod: Reset GPIO descriptor pointer */  	struct gpio_desc *reset_gpiod; -	/** @probe_capabilities: bus capabilities, used for probing */ -	enum { -		MDIOBUS_NO_CAP = 0, -		MDIOBUS_C22, -		MDIOBUS_C45, -		MDIOBUS_C22_C45, -	} probe_capabilities; -  	/** @shared_lock: protect access to the shared element */  	struct mutex shared_lock; @@ -456,7 +458,7 @@ static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev)  }  struct mii_bus *mdio_find_bus(const char *mdio_name); -struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); +struct phy_device *mdiobus_scan_c22(struct mii_bus *bus, int addr);  #define PHY_INTERRUPT_DISABLED	false  #define PHY_INTERRUPT_ENABLED	true @@ -572,6 +574,9 @@ struct macsec_ops;   * @supported: Combined MAC/PHY supported linkmodes   * @advertising: Currently advertised linkmodes   * @adv_old: Saved advertised while power saving for WoL + * @supported_eee: supported PHY EEE linkmodes + * @advertising_eee: Currently advertised EEE linkmodes + * @eee_enabled: Flag indicating whether the EEE feature is enabled   * @lp_advertising: Current link partner advertised linkmodes   * @host_interfaces: PHY interface modes supported by host   * @eee_broken_modes: Energy efficient ethernet modes which should be prohibited @@ -676,6 +681,10 @@ struct phy_device {  	__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertising);  	/* used with phy_speed_down */  	__ETHTOOL_DECLARE_LINK_MODE_MASK(adv_old); +	/* used for eee validation */ +	__ETHTOOL_DECLARE_LINK_MODE_MASK(supported_eee); +	__ETHTOOL_DECLARE_LINK_MODE_MASK(advertising_eee); +	bool eee_enabled;  	/* Host supported PHY interface types. Should be ignored if empty. */  	DECLARE_PHY_INTERFACE_MASK(host_interfaces); @@ -739,6 +748,9 @@ struct phy_device {  #endif  }; +/* Generic phy_device::dev_flags */ +#define PHY_F_NO_IRQ		0x80000000 +  static inline struct phy_device *to_phy_device(const struct device *dev)  {  	return container_of(to_mdio_device(dev), struct phy_device, mdio); @@ -766,6 +778,63 @@ struct phy_tdr_config {  #define PHY_PAIR_ALL -1  /** + * struct phy_plca_cfg - Configuration of the PLCA (Physical Layer Collision + * Avoidance) Reconciliation Sublayer. + * + * @version: read-only PLCA register map version. -1 = not available. Ignored + *   when setting the configuration. Format is the same as reported by the PLCA + *   IDVER register (31.CA00). -1 = not available. + * @enabled: PLCA configured mode (enabled/disabled). -1 = not available / don't + *   set. 0 = disabled, anything else = enabled. + * @node_id: the PLCA local node identifier. -1 = not available / don't set. + *   Allowed values [0 .. 254]. 255 = node disabled. + * @node_cnt: the PLCA node count (maximum number of nodes having a TO). Only + *   meaningful for the coordinator (node_id = 0). -1 = not available / don't + *   set. Allowed values [1 .. 255]. + * @to_tmr: The value of the PLCA to_timer in bit-times, which determines the + *   PLCA transmit opportunity window opening. See IEEE802.3 Clause 148 for + *   more details. The to_timer shall be set equal over all nodes. + *   -1 = not available / don't set. Allowed values [0 .. 255]. + * @burst_cnt: controls how many additional frames a node is allowed to send in + *   single transmit opportunity (TO). The default value of 0 means that the + *   node is allowed exactly one frame per TO. A value of 1 allows two frames + *   per TO, and so on. -1 = not available / don't set. + *   Allowed values [0 .. 255]. + * @burst_tmr: controls how many bit times to wait for the MAC to send a new + *   frame before interrupting the burst. This value should be set to a value + *   greater than the MAC inter-packet gap (which is typically 96 bits). + *   -1 = not available / don't set. Allowed values [0 .. 255]. + * + * A structure containing configuration parameters for setting/getting the PLCA + * RS configuration. The driver does not need to implement all the parameters, + * but should report what is actually used. + */ +struct phy_plca_cfg { +	int version; +	int enabled; +	int node_id; +	int node_cnt; +	int to_tmr; +	int burst_cnt; +	int burst_tmr; +}; + +/** + * struct phy_plca_status - Status of the PLCA (Physical Layer Collision + * Avoidance) Reconciliation Sublayer. + * + * @pst: The PLCA status as reported by the PST bit in the PLCA STATUS + *	register(31.CA03), indicating BEACON activity. + * + * A structure containing status information of the PLCA RS configuration. + * The driver does not need to implement all the parameters, but should report + * what is actually used. + */ +struct phy_plca_status { +	bool pst; +}; + +/**   * struct phy_driver - Driver structure for a particular PHY type   *   * @mdiodrv: Data common to all MDIO devices @@ -976,6 +1045,17 @@ struct phy_driver {  	int (*get_sqi)(struct phy_device *dev);  	/** @get_sqi_max: Get the maximum signal quality indication */  	int (*get_sqi_max)(struct phy_device *dev); + +	/* PLCA RS interface */ +	/** @get_plca_cfg: Return the current PLCA configuration */ +	int (*get_plca_cfg)(struct phy_device *dev, +			    struct phy_plca_cfg *plca_cfg); +	/** @set_plca_cfg: Set the PLCA configuration */ +	int (*set_plca_cfg)(struct phy_device *dev, +			    const struct phy_plca_cfg *plca_cfg); +	/** @get_plca_status: Return the current PLCA status info */ +	int (*get_plca_status)(struct phy_device *dev, +			       struct phy_plca_status *plca_st);  };  #define to_phy_driver(d) container_of(to_mdio_common_driver(d),		\  				      struct phy_driver, mdiodrv) @@ -1543,6 +1623,7 @@ int phy_start_aneg(struct phy_device *phydev);  int phy_aneg_done(struct phy_device *phydev);  int phy_speed_down(struct phy_device *phydev, bool sync);  int phy_speed_up(struct phy_device *phydev); +bool phy_check_valid(int speed, int duplex, unsigned long *features);  int phy_restart_aneg(struct phy_device *phydev);  int phy_reset_after_clk_enable(struct phy_device *phydev); @@ -1666,6 +1747,7 @@ int genphy_c45_an_config_aneg(struct phy_device *phydev);  int genphy_c45_an_disable_aneg(struct phy_device *phydev);  int genphy_c45_read_mdix(struct phy_device *phydev);  int genphy_c45_pma_read_abilities(struct phy_device *phydev); +int genphy_c45_read_eee_abilities(struct phy_device *phydev);  int genphy_c45_pma_baset1_read_master_slave(struct phy_device *phydev);  int genphy_c45_read_status(struct phy_device *phydev);  int genphy_c45_baset1_read_status(struct phy_device *phydev); @@ -1674,6 +1756,21 @@ int genphy_c45_loopback(struct phy_device *phydev, bool enable);  int genphy_c45_pma_resume(struct phy_device *phydev);  int genphy_c45_pma_suspend(struct phy_device *phydev);  int genphy_c45_fast_retrain(struct phy_device *phydev, bool enable); +int genphy_c45_plca_get_cfg(struct phy_device *phydev, +			    struct phy_plca_cfg *plca_cfg); +int genphy_c45_plca_set_cfg(struct phy_device *phydev, +			    const struct phy_plca_cfg *plca_cfg); +int genphy_c45_plca_get_status(struct phy_device *phydev, +			       struct phy_plca_status *plca_st); +int genphy_c45_eee_is_active(struct phy_device *phydev, unsigned long *adv, +			     unsigned long *lp, bool *is_enabled); +int genphy_c45_ethtool_get_eee(struct phy_device *phydev, +			       struct ethtool_eee *data); +int genphy_c45_ethtool_set_eee(struct phy_device *phydev, +			       struct ethtool_eee *data); +int genphy_c45_write_eee_adv(struct phy_device *phydev, unsigned long *adv); +int genphy_c45_an_config_eee_aneg(struct phy_device *phydev); +int genphy_c45_read_eee_adv(struct phy_device *phydev, unsigned long *adv);  /* Generic C45 PHY driver */  extern struct phy_driver genphy_c45_driver; @@ -1772,6 +1869,13 @@ int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data);  int phy_ethtool_get_sset_count(struct phy_device *phydev);  int phy_ethtool_get_stats(struct phy_device *phydev,  			  struct ethtool_stats *stats, u64 *data); +int phy_ethtool_get_plca_cfg(struct phy_device *phydev, +			     struct phy_plca_cfg *plca_cfg); +int phy_ethtool_set_plca_cfg(struct phy_device *phydev, +			     const struct phy_plca_cfg *plca_cfg, +			     struct netlink_ext_ack *extack); +int phy_ethtool_get_plca_status(struct phy_device *phydev, +				struct phy_plca_status *plca_st);  static inline int phy_package_read(struct phy_device *phydev, u32 regnum)  {  | 
