Commit 57f15912 authored by Paolo Abeni's avatar Paolo Abeni

Merge branch 'net-stmmac-fix-mac-capabilities-procedure'

Serge Semin says:

====================
net: stmmac: Fix MAC-capabilities procedure

The series got born as a result of the discussions around the recent
Yanteng' series adding the Loongson LS7A1000, LS2K1000, LS7A2000, LS2K2000
MACs support:
Link: https://lore.kernel.org/netdev/fu3f6uoakylnb6eijllakeu5i4okcyqq7sfafhp5efaocbsrwe@w74xe7gb6x7p

In particular the Yanteng' patchset needed to implement the Loongson
MAC-specific constraints applied to the link speed and link duplex mode.
As a result of the discussion with Russel the next preliminary patch was
born:
Link: https://lore.kernel.org/netdev/df31e8bcf74b3b4ddb7ddf5a1c371390f16a2ad5.1712917541.git.siyanteng@loongson.cn

The patch above was a temporal solution utilized by Yanteng for further
developments and to move on with the on-going review. This patchset is a
refactored version of that single patch with formatting required for the
fixes patches.

The main part of the series has already been merged in on v1 stage. The
leftover is the cleanup patches which rename
stmmac_ops::phylink_get_caps() callback to stmmac_ops::update_caps() and
move the MAC-capabilities init/re-init to the phylink MAC-capabilities
getter.

Link: https://lore.kernel.org/netdev/20240412180340.7965-1-fancer.lancer@gmail.com/
Changelog v2:
- Add a new patch (Romain):
  [PATCH net-next v2 1/2] net: stmmac: Rename phylink_get_caps() callback to update_caps()
- Resubmit the leftover patches to net-next tree (Paolo).

Link: https://lore.kernel.org/netdev/20240417140013.12575-1-fancer.lancer@gmail.com/
Changelog v3:
- Just resubmit (Jakub).
Signed-off-by: default avatarSerge Semin <fancer.lancer@gmail.com>
====================

Link: https://lore.kernel.org/r/20240419090357.5547-1-fancer.lancer@gmail.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 30b3fe06 f951a649
...@@ -68,7 +68,7 @@ static void dwmac4_core_init(struct mac_device_info *hw, ...@@ -68,7 +68,7 @@ static void dwmac4_core_init(struct mac_device_info *hw,
init_waitqueue_head(&priv->tstamp_busy_wait); init_waitqueue_head(&priv->tstamp_busy_wait);
} }
static void dwmac4_phylink_get_caps(struct stmmac_priv *priv) static void dwmac4_update_caps(struct stmmac_priv *priv)
{ {
if (priv->plat->tx_queues_to_use > 1) if (priv->plat->tx_queues_to_use > 1)
priv->hw->link.caps &= ~(MAC_10HD | MAC_100HD | MAC_1000HD); priv->hw->link.caps &= ~(MAC_10HD | MAC_100HD | MAC_1000HD);
...@@ -1190,7 +1190,7 @@ static void dwmac4_set_hw_vlan_mode(struct mac_device_info *hw) ...@@ -1190,7 +1190,7 @@ static void dwmac4_set_hw_vlan_mode(struct mac_device_info *hw)
const struct stmmac_ops dwmac4_ops = { const struct stmmac_ops dwmac4_ops = {
.core_init = dwmac4_core_init, .core_init = dwmac4_core_init,
.phylink_get_caps = dwmac4_phylink_get_caps, .update_caps = dwmac4_update_caps,
.set_mac = stmmac_set_mac, .set_mac = stmmac_set_mac,
.rx_ipc = dwmac4_rx_ipc_enable, .rx_ipc = dwmac4_rx_ipc_enable,
.rx_queue_enable = dwmac4_rx_queue_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
...@@ -1235,7 +1235,7 @@ const struct stmmac_ops dwmac4_ops = { ...@@ -1235,7 +1235,7 @@ const struct stmmac_ops dwmac4_ops = {
const struct stmmac_ops dwmac410_ops = { const struct stmmac_ops dwmac410_ops = {
.core_init = dwmac4_core_init, .core_init = dwmac4_core_init,
.phylink_get_caps = dwmac4_phylink_get_caps, .update_caps = dwmac4_update_caps,
.set_mac = stmmac_dwmac4_set_mac, .set_mac = stmmac_dwmac4_set_mac,
.rx_ipc = dwmac4_rx_ipc_enable, .rx_ipc = dwmac4_rx_ipc_enable,
.rx_queue_enable = dwmac4_rx_queue_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
...@@ -1284,7 +1284,7 @@ const struct stmmac_ops dwmac410_ops = { ...@@ -1284,7 +1284,7 @@ const struct stmmac_ops dwmac410_ops = {
const struct stmmac_ops dwmac510_ops = { const struct stmmac_ops dwmac510_ops = {
.core_init = dwmac4_core_init, .core_init = dwmac4_core_init,
.phylink_get_caps = dwmac4_phylink_get_caps, .update_caps = dwmac4_update_caps,
.set_mac = stmmac_dwmac4_set_mac, .set_mac = stmmac_dwmac4_set_mac,
.rx_ipc = dwmac4_rx_ipc_enable, .rx_ipc = dwmac4_rx_ipc_enable,
.rx_queue_enable = dwmac4_rx_queue_enable, .rx_queue_enable = dwmac4_rx_queue_enable,
......
...@@ -308,8 +308,8 @@ struct stmmac_est; ...@@ -308,8 +308,8 @@ struct stmmac_est;
struct stmmac_ops { struct stmmac_ops {
/* MAC core initialization */ /* MAC core initialization */
void (*core_init)(struct mac_device_info *hw, struct net_device *dev); void (*core_init)(struct mac_device_info *hw, struct net_device *dev);
/* Get phylink capabilities */ /* Update MAC capabilities */
void (*phylink_get_caps)(struct stmmac_priv *priv); void (*update_caps)(struct stmmac_priv *priv);
/* Enable the MAC RX/TX */ /* Enable the MAC RX/TX */
void (*set_mac)(void __iomem *ioaddr, bool enable); void (*set_mac)(void __iomem *ioaddr, bool enable);
/* Enable and verify that the IPC module is supported */ /* Enable and verify that the IPC module is supported */
...@@ -430,8 +430,8 @@ struct stmmac_ops { ...@@ -430,8 +430,8 @@ struct stmmac_ops {
#define stmmac_core_init(__priv, __args...) \ #define stmmac_core_init(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, core_init, __args) stmmac_do_void_callback(__priv, mac, core_init, __args)
#define stmmac_mac_phylink_get_caps(__priv) \ #define stmmac_mac_update_caps(__priv) \
stmmac_do_void_callback(__priv, mac, phylink_get_caps, __priv) stmmac_do_void_callback(__priv, mac, update_caps, __priv)
#define stmmac_mac_set(__priv, __args...) \ #define stmmac_mac_set(__priv, __args...) \
stmmac_do_void_callback(__priv, mac, set_mac, __args) stmmac_do_void_callback(__priv, mac, set_mac, __args)
#define stmmac_rx_ipc(__priv, __args...) \ #define stmmac_rx_ipc(__priv, __args...) \
......
...@@ -936,6 +936,22 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex) ...@@ -936,6 +936,22 @@ static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
priv->pause, tx_cnt); priv->pause, tx_cnt);
} }
static unsigned long stmmac_mac_get_caps(struct phylink_config *config,
phy_interface_t interface)
{
struct stmmac_priv *priv = netdev_priv(to_net_dev(config->dev));
/* Refresh the MAC-specific capabilities */
stmmac_mac_update_caps(priv);
config->mac_capabilities = priv->hw->link.caps;
if (priv->plat->max_speed)
phylink_limit_mac_speed(config, priv->plat->max_speed);
return config->mac_capabilities;
}
static struct phylink_pcs *stmmac_mac_select_pcs(struct phylink_config *config, static struct phylink_pcs *stmmac_mac_select_pcs(struct phylink_config *config,
phy_interface_t interface) phy_interface_t interface)
{ {
...@@ -1102,6 +1118,7 @@ static void stmmac_mac_link_up(struct phylink_config *config, ...@@ -1102,6 +1118,7 @@ static void stmmac_mac_link_up(struct phylink_config *config,
} }
static const struct phylink_mac_ops stmmac_phylink_mac_ops = { static const struct phylink_mac_ops stmmac_phylink_mac_ops = {
.mac_get_caps = stmmac_mac_get_caps,
.mac_select_pcs = stmmac_mac_select_pcs, .mac_select_pcs = stmmac_mac_select_pcs,
.mac_config = stmmac_mac_config, .mac_config = stmmac_mac_config,
.mac_link_down = stmmac_mac_link_down, .mac_link_down = stmmac_mac_link_down,
...@@ -1201,7 +1218,6 @@ static int stmmac_phy_setup(struct stmmac_priv *priv) ...@@ -1201,7 +1218,6 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)
int mode = priv->plat->phy_interface; int mode = priv->plat->phy_interface;
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode;
struct phylink *phylink; struct phylink *phylink;
int max_speed;
priv->phylink_config.dev = &priv->dev->dev; priv->phylink_config.dev = &priv->dev->dev;
priv->phylink_config.type = PHYLINK_NETDEV; priv->phylink_config.type = PHYLINK_NETDEV;
...@@ -1225,15 +1241,6 @@ static int stmmac_phy_setup(struct stmmac_priv *priv) ...@@ -1225,15 +1241,6 @@ static int stmmac_phy_setup(struct stmmac_priv *priv)
xpcs_get_interfaces(priv->hw->xpcs, xpcs_get_interfaces(priv->hw->xpcs,
priv->phylink_config.supported_interfaces); priv->phylink_config.supported_interfaces);
/* Get the MAC specific capabilities */
stmmac_mac_phylink_get_caps(priv);
priv->phylink_config.mac_capabilities = priv->hw->link.caps;
max_speed = priv->plat->max_speed;
if (max_speed)
phylink_limit_mac_speed(&priv->phylink_config, max_speed);
fwnode = priv->plat->port_node; fwnode = priv->plat->port_node;
if (!fwnode) if (!fwnode)
fwnode = dev_fwnode(priv->device); fwnode = dev_fwnode(priv->device);
...@@ -7329,7 +7336,6 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt) ...@@ -7329,7 +7336,6 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt)
{ {
struct stmmac_priv *priv = netdev_priv(dev); struct stmmac_priv *priv = netdev_priv(dev);
int ret = 0, i; int ret = 0, i;
int max_speed;
if (netif_running(dev)) if (netif_running(dev))
stmmac_release(dev); stmmac_release(dev);
...@@ -7343,14 +7349,6 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt) ...@@ -7343,14 +7349,6 @@ int stmmac_reinit_queues(struct net_device *dev, u32 rx_cnt, u32 tx_cnt)
priv->rss.table[i] = ethtool_rxfh_indir_default(i, priv->rss.table[i] = ethtool_rxfh_indir_default(i,
rx_cnt); rx_cnt);
stmmac_mac_phylink_get_caps(priv);
priv->phylink_config.mac_capabilities = priv->hw->link.caps;
max_speed = priv->plat->max_speed;
if (max_speed)
phylink_limit_mac_speed(&priv->phylink_config, max_speed);
stmmac_napi_add(dev); stmmac_napi_add(dev);
if (netif_running(dev)) if (netif_running(dev))
......
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