Commit 9fe1450f authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-remove-last-of-the-phylink-validate-methods-and-clean-up'

Russell King says:

====================
net: remove last of the phylink validate methods and clean up

This four patch series removes the last of the phylink MAC .validate
methods which can be found in the Freescale fman driver. fman has a
requirement that half duplex may not be supported in RGMII mode,
which is currently handled in its .validate method.

In order to keep this functionality when removing the .validate method,
we need to replace that with equivalent functionality, for which I
propose the optional .mac_get_caps method in the first patch.

The advantage of this approach over the .validate callback is that MAC
drivers only have to deal with the MAC_* capabilities, and don't need
to call back into phylink functions to do the masking of the ethtool
linkmodes etc - which then becomes internal to phylink. This can be
seen in the fourth patch where we make a load of these methods static.
====================

Link: https://lore.kernel.org/r/ZS1Z5DDfHyjMryYu@shell.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 73b24e7c 743f6397
...@@ -200,10 +200,12 @@ this documentation. ...@@ -200,10 +200,12 @@ this documentation.
when the in-band link state changes - otherwise the link will never when the in-band link state changes - otherwise the link will never
come up. come up.
The :c:func:`validate` method should mask the supplied supported mask, The :c:func:`mac_get_caps` method is optional, and if provided should
and ``state->advertising`` with the supported ethtool link modes. return the phylink MAC capabilities that are supported for the passed
These are the new ethtool link modes, so bitmask operations must be ``interface`` mode. In general, there is no need to implement this method.
used. For an example, see ``drivers/net/ethernet/marvell/mvneta.c``. Phylink will use these capabilities in combination with permissible
capabilities for ``interface`` to determine the allowable ethtool link
modes.
The :c:func:`mac_link_state` method is used to read the link state The :c:func:`mac_link_state` method is used to read the link state
from the MAC, and report back the settings that the MAC is currently from the MAC, and report back the settings that the MAC is currently
......
...@@ -618,18 +618,17 @@ static int memac_accept_rx_pause_frames(struct fman_mac *memac, bool en) ...@@ -618,18 +618,17 @@ static int memac_accept_rx_pause_frames(struct fman_mac *memac, bool en)
return 0; return 0;
} }
static void memac_validate(struct phylink_config *config, static unsigned long memac_get_caps(struct phylink_config *config,
unsigned long *supported, phy_interface_t interface)
struct phylink_link_state *state)
{ {
struct fman_mac *memac = fman_config_to_mac(config)->fman_mac; struct fman_mac *memac = fman_config_to_mac(config)->fman_mac;
unsigned long caps = config->mac_capabilities; unsigned long caps = config->mac_capabilities;
if (phy_interface_mode_is_rgmii(state->interface) && if (phy_interface_mode_is_rgmii(interface) &&
memac->rgmii_no_half_duplex) memac->rgmii_no_half_duplex)
caps &= ~(MAC_10HD | MAC_100HD); caps &= ~(MAC_10HD | MAC_100HD);
phylink_validate_mask_caps(supported, state, caps); return caps;
} }
/** /**
...@@ -776,7 +775,7 @@ static void memac_link_down(struct phylink_config *config, unsigned int mode, ...@@ -776,7 +775,7 @@ static void memac_link_down(struct phylink_config *config, unsigned int mode,
} }
static const struct phylink_mac_ops memac_mac_ops = { static const struct phylink_mac_ops memac_mac_ops = {
.validate = memac_validate, .mac_get_caps = memac_get_caps,
.mac_select_pcs = memac_select_pcs, .mac_select_pcs = memac_select_pcs,
.mac_prepare = memac_prepare, .mac_prepare = memac_prepare,
.mac_config = memac_mac_config, .mac_config = memac_mac_config,
......
...@@ -257,7 +257,8 @@ static int phylink_interface_max_speed(phy_interface_t interface) ...@@ -257,7 +257,8 @@ static int phylink_interface_max_speed(phy_interface_t interface)
* Set all possible pause, speed and duplex linkmodes in @linkmodes that are * Set all possible pause, speed and duplex linkmodes in @linkmodes that are
* supported by the @caps. @linkmodes must have been initialised previously. * supported by the @caps. @linkmodes must have been initialised previously.
*/ */
void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps) static void phylink_caps_to_linkmodes(unsigned long *linkmodes,
unsigned long caps)
{ {
if (caps & MAC_SYM_PAUSE) if (caps & MAC_SYM_PAUSE)
__set_bit(ETHTOOL_LINK_MODE_Pause_BIT, linkmodes); __set_bit(ETHTOOL_LINK_MODE_Pause_BIT, linkmodes);
...@@ -400,7 +401,6 @@ void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps) ...@@ -400,7 +401,6 @@ void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps)
__set_bit(ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT, linkmodes); __set_bit(ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT, linkmodes);
} }
} }
EXPORT_SYMBOL_GPL(phylink_caps_to_linkmodes);
static struct { static struct {
unsigned long mask; unsigned long mask;
...@@ -477,7 +477,7 @@ static unsigned long phylink_cap_from_speed_duplex(int speed, ...@@ -477,7 +477,7 @@ static unsigned long phylink_cap_from_speed_duplex(int speed,
* Get the MAC capabilities that are supported by the @interface mode and * Get the MAC capabilities that are supported by the @interface mode and
* @mac_capabilities. * @mac_capabilities.
*/ */
unsigned long phylink_get_capabilities(phy_interface_t interface, static unsigned long phylink_get_capabilities(phy_interface_t interface,
unsigned long mac_capabilities, unsigned long mac_capabilities,
int rate_matching) int rate_matching)
{ {
...@@ -606,7 +606,6 @@ unsigned long phylink_get_capabilities(phy_interface_t interface, ...@@ -606,7 +606,6 @@ unsigned long phylink_get_capabilities(phy_interface_t interface,
return (caps & mac_capabilities) | matched_caps; return (caps & mac_capabilities) | matched_caps;
} }
EXPORT_SYMBOL_GPL(phylink_get_capabilities);
/** /**
* phylink_validate_mask_caps() - Restrict link modes based on caps * phylink_validate_mask_caps() - Restrict link modes based on caps
...@@ -618,7 +617,7 @@ EXPORT_SYMBOL_GPL(phylink_get_capabilities); ...@@ -618,7 +617,7 @@ EXPORT_SYMBOL_GPL(phylink_get_capabilities);
* @supported and @state based on that. Use this function if your capabiliies * @supported and @state based on that. Use this function if your capabiliies
* aren't constant, such as if they vary depending on the interface. * aren't constant, such as if they vary depending on the interface.
*/ */
void phylink_validate_mask_caps(unsigned long *supported, static void phylink_validate_mask_caps(unsigned long *supported,
struct phylink_link_state *state, struct phylink_link_state *state,
unsigned long mac_capabilities) unsigned long mac_capabilities)
{ {
...@@ -634,29 +633,12 @@ void phylink_validate_mask_caps(unsigned long *supported, ...@@ -634,29 +633,12 @@ void phylink_validate_mask_caps(unsigned long *supported,
linkmode_and(supported, supported, mask); linkmode_and(supported, supported, mask);
linkmode_and(state->advertising, state->advertising, mask); linkmode_and(state->advertising, state->advertising, mask);
} }
EXPORT_SYMBOL_GPL(phylink_validate_mask_caps);
/**
* phylink_generic_validate() - generic validate() callback implementation
* @config: a pointer to a &struct phylink_config.
* @supported: ethtool bitmask for supported link modes.
* @state: a pointer to a &struct phylink_link_state.
*
* Generic implementation of the validate() callback that MAC drivers can
* use when they pass the range of supported interfaces and MAC capabilities.
*/
void phylink_generic_validate(struct phylink_config *config,
unsigned long *supported,
struct phylink_link_state *state)
{
phylink_validate_mask_caps(supported, state, config->mac_capabilities);
}
EXPORT_SYMBOL_GPL(phylink_generic_validate);
static int phylink_validate_mac_and_pcs(struct phylink *pl, static int phylink_validate_mac_and_pcs(struct phylink *pl,
unsigned long *supported, unsigned long *supported,
struct phylink_link_state *state) struct phylink_link_state *state)
{ {
unsigned long capabilities;
struct phylink_pcs *pcs; struct phylink_pcs *pcs;
int ret; int ret;
...@@ -696,10 +678,13 @@ static int phylink_validate_mac_and_pcs(struct phylink *pl, ...@@ -696,10 +678,13 @@ static int phylink_validate_mac_and_pcs(struct phylink *pl,
} }
/* Then validate the link parameters with the MAC */ /* Then validate the link parameters with the MAC */
if (pl->mac_ops->validate) if (pl->mac_ops->mac_get_caps)
pl->mac_ops->validate(pl->config, supported, state); capabilities = pl->mac_ops->mac_get_caps(pl->config,
state->interface);
else else
phylink_generic_validate(pl->config, supported, state); capabilities = pl->config->mac_capabilities;
phylink_validate_mask_caps(supported, state, capabilities);
return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; return phylink_is_empty_linkmode(supported) ? -EINVAL : 0;
} }
......
...@@ -227,7 +227,7 @@ void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed); ...@@ -227,7 +227,7 @@ void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed);
/** /**
* struct phylink_mac_ops - MAC operations structure. * struct phylink_mac_ops - MAC operations structure.
* @validate: Validate and update the link configuration. * @mac_get_caps: Get MAC capabilities for interface mode.
* @mac_select_pcs: Select a PCS for the interface mode. * @mac_select_pcs: Select a PCS for the interface mode.
* @mac_prepare: prepare for a major reconfiguration of the interface. * @mac_prepare: prepare for a major reconfiguration of the interface.
* @mac_config: configure the MAC for the selected mode and state. * @mac_config: configure the MAC for the selected mode and state.
...@@ -238,9 +238,8 @@ void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed); ...@@ -238,9 +238,8 @@ void phylink_limit_mac_speed(struct phylink_config *config, u32 max_speed);
* The individual methods are described more fully below. * The individual methods are described more fully below.
*/ */
struct phylink_mac_ops { struct phylink_mac_ops {
void (*validate)(struct phylink_config *config, unsigned long (*mac_get_caps)(struct phylink_config *config,
unsigned long *supported, phy_interface_t interface);
struct phylink_link_state *state);
struct phylink_pcs *(*mac_select_pcs)(struct phylink_config *config, struct phylink_pcs *(*mac_select_pcs)(struct phylink_config *config,
phy_interface_t interface); phy_interface_t interface);
int (*mac_prepare)(struct phylink_config *config, unsigned int mode, int (*mac_prepare)(struct phylink_config *config, unsigned int mode,
...@@ -259,39 +258,17 @@ struct phylink_mac_ops { ...@@ -259,39 +258,17 @@ struct phylink_mac_ops {
#if 0 /* For kernel-doc purposes only. */ #if 0 /* For kernel-doc purposes only. */
/** /**
* validate - Validate and update the link configuration * mac_get_caps: Get MAC capabilities for interface mode.
* @config: a pointer to a &struct phylink_config. * @config: a pointer to a &struct phylink_config.
* @supported: ethtool bitmask for supported link modes. * @interface: PHY interface mode.
* @state: a pointer to a &struct phylink_link_state.
*
* Clear bits in the @supported and @state->advertising masks that
* are not supportable by the MAC.
*
* Note that the PHY may be able to transform from one connection
* technology to another, so, eg, don't clear 1000BaseX just
* because the MAC is unable to BaseX mode. This is more about
* clearing unsupported speeds and duplex settings. The port modes
* should not be cleared; phylink_set_port_modes() will help with this.
*
* When @config->supported_interfaces has been set, phylink will iterate
* over the supported interfaces to determine the full capability of the
* MAC. The validation function must not print errors if @state->interface
* is set to an unexpected value.
* *
* When @config->supported_interfaces is empty, phylink will call this * Optional method. When not provided, config->mac_capabilities will be used.
* function with @state->interface set to %PHY_INTERFACE_MODE_NA, and * When implemented, this returns the MAC capabilities for the specified
* expects the MAC driver to return all supported link modes. * interface mode where there is some special handling required by the MAC
* * driver (e.g. not supporting half-duplex in certain interface modes.)
* If the @state->interface mode is not supported, then the @supported
* mask must be cleared.
*
* This member is optional; if not set, the generic validator will be
* used making use of @config->mac_capabilities and
* @config->supported_interfaces to determine which link modes are
* supported.
*/ */
void validate(struct phylink_config *config, unsigned long *supported, unsigned long mac_get_caps(struct phylink_config *config,
struct phylink_link_state *state); phy_interface_t interface);
/** /**
* mac_select_pcs: Select a PCS for the interface mode. * mac_select_pcs: Select a PCS for the interface mode.
* @config: a pointer to a &struct phylink_config. * @config: a pointer to a &struct phylink_config.
...@@ -636,17 +613,6 @@ void pcs_link_up(struct phylink_pcs *pcs, unsigned int neg_mode, ...@@ -636,17 +613,6 @@ void pcs_link_up(struct phylink_pcs *pcs, unsigned int neg_mode,
phy_interface_t interface, int speed, int duplex); phy_interface_t interface, int speed, int duplex);
#endif #endif
void phylink_caps_to_linkmodes(unsigned long *linkmodes, unsigned long caps);
unsigned long phylink_get_capabilities(phy_interface_t interface,
unsigned long mac_capabilities,
int rate_matching);
void phylink_validate_mask_caps(unsigned long *supported,
struct phylink_link_state *state,
unsigned long caps);
void phylink_generic_validate(struct phylink_config *config,
unsigned long *supported,
struct phylink_link_state *state);
struct phylink *phylink_create(struct phylink_config *, struct phylink *phylink_create(struct phylink_config *,
const struct fwnode_handle *, const struct fwnode_handle *,
phy_interface_t, phy_interface_t,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment