diff options
Diffstat (limited to 'include/linux/phylink.h')
| -rw-r--r-- | include/linux/phylink.h | 42 | 
1 files changed, 42 insertions, 0 deletions
diff --git a/include/linux/phylink.h b/include/linux/phylink.h index 9a57deefcb07..5ea6b2ad2396 100644 --- a/include/linux/phylink.h +++ b/include/linux/phylink.h @@ -138,6 +138,9 @@ enum phylink_op_type {   * @poll_fixed_state: if true, starts link_poll,   *		      if MAC link is at %MLO_AN_FIXED mode.   * @mac_managed_pm: if true, indicate the MAC driver is responsible for PHY PM. + * @mac_requires_rxc: if true, the MAC always requires a receive clock from PHY. + *                    The PHY driver should start the clock signal as soon as + *                    possible and avoid stopping it during suspend events.   * @ovr_an_inband: if true, override PCS to MLO_AN_INBAND   * @get_fixed_state: callback to execute to determine the fixed link state,   *		     if MAC link is at %MLO_AN_FIXED mode. @@ -150,6 +153,7 @@ struct phylink_config {  	enum phylink_op_type type;  	bool poll_fixed_state;  	bool mac_managed_pm; +	bool mac_requires_rxc;  	bool ovr_an_inband;  	void (*get_fixed_state)(struct phylink_config *config,  				struct phylink_link_state *state); @@ -392,6 +396,10 @@ struct phylink_pcs_ops;   * @phylink: pointer to &struct phylink_config   * @neg_mode: provide PCS neg mode via "mode" argument   * @poll: poll the PCS for link changes + * @rxc_always_on: The MAC driver requires the reference clock + *                 to always be on. Standalone PCS drivers which + *                 do not have access to a PHY device can check + *                 this instead of PHY_F_RXC_ALWAYS_ON.   *   * This structure is designed to be embedded within the PCS private data,   * and will be passed between phylink and the PCS. @@ -404,6 +412,7 @@ struct phylink_pcs {  	struct phylink *phylink;  	bool neg_mode;  	bool poll; +	bool rxc_always_on;  };  /** @@ -418,6 +427,8 @@ struct phylink_pcs {   * @pcs_an_restart: restart 802.3z BaseX autonegotiation.   * @pcs_link_up: program the PCS for the resolved link configuration   *               (where necessary). + * @pcs_pre_init: configure PCS components necessary for MAC hardware + *                initialization e.g. RX clock for stmmac.   */  struct phylink_pcs_ops {  	int (*pcs_validate)(struct phylink_pcs *pcs, unsigned long *supported, @@ -437,6 +448,7 @@ struct phylink_pcs_ops {  	void (*pcs_an_restart)(struct phylink_pcs *pcs);  	void (*pcs_link_up)(struct phylink_pcs *pcs, unsigned int neg_mode,  			    phy_interface_t interface, int speed, int duplex); +	int (*pcs_pre_init)(struct phylink_pcs *pcs);  };  #if 0 /* For kernel-doc purposes only. */ @@ -542,6 +554,34 @@ void pcs_an_restart(struct phylink_pcs *pcs);   */  void pcs_link_up(struct phylink_pcs *pcs, unsigned int neg_mode,  		 phy_interface_t interface, int speed, int duplex); + +/** + * pcs_pre_init() - Configure PCS components necessary for MAC initialization + * @pcs: a pointer to a &struct phylink_pcs. + * + * This function can be called by MAC drivers through the + * phylink_pcs_pre_init() wrapper, before their hardware is initialized. It + * should not be called after the link is brought up, as reconfiguring the PCS + * at this point could break the link. + * + * Some MAC devices require specific hardware initialization to be performed by + * their associated PCS device before they can properly initialize their own + * hardware. An example of this is the initialization of stmmac controllers, + * which requires an active REF_CLK signal to be provided by the PHY/PCS. + * + * By calling phylink_pcs_pre_init(), MAC drivers can ensure that the PCS is + * setup in a way that allows for successful hardware initialization. + * + * The specific configuration performed by pcs_pre_init() is dependent on the + * model of PCS and the requirements of the MAC device attached to it. PCS + * driver authors should consider whether their target device is to be used in + * conjunction with a MAC device whose driver calls phylink_pcs_pre_init(). MAC + * driver authors should document their requirements for the PCS + * pre-initialization. + * + */ +int pcs_pre_init(struct phylink_pcs *pcs); +  #endif  struct phylink *phylink_create(struct phylink_config *, @@ -561,6 +601,8 @@ void phylink_disconnect_phy(struct phylink *);  void phylink_mac_change(struct phylink *, bool up);  void phylink_pcs_change(struct phylink_pcs *, bool up); +int phylink_pcs_pre_init(struct phylink *pl, struct phylink_pcs *pcs); +  void phylink_start(struct phylink *);  void phylink_stop(struct phylink *);  |