net: dsa: realtek: provide own phylink MAC operations
Convert realtek to provide its own phylink MAC operations, thus avoiding the shim layer in DSA's port.c. We need to provide a stub for the mandatory mac_config() method for rtl8366rb. Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Link: https://lore.kernel.org/r/E1s11qJ-00AHi0-Kk@rmk-PC.armlinux.org.uk Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
16e6592cd5
commit
8aec5b10bc
@ -17,6 +17,7 @@
|
||||
#define REALTEK_HW_STOP_DELAY 25 /* msecs */
|
||||
#define REALTEK_HW_START_DELAY 100 /* msecs */
|
||||
|
||||
struct phylink_mac_ops;
|
||||
struct realtek_ops;
|
||||
struct dentry;
|
||||
struct inode;
|
||||
@ -117,6 +118,7 @@ struct realtek_ops {
|
||||
struct realtek_variant {
|
||||
const struct dsa_switch_ops *ds_ops;
|
||||
const struct realtek_ops *ops;
|
||||
const struct phylink_mac_ops *phylink_mac_ops;
|
||||
unsigned int clk_delay;
|
||||
u8 cmd_read;
|
||||
u8 cmd_write;
|
||||
|
@ -1048,11 +1048,13 @@ static void rtl8365mb_phylink_get_caps(struct dsa_switch *ds, int port,
|
||||
phy_interface_set_rgmii(config->supported_interfaces);
|
||||
}
|
||||
|
||||
static void rtl8365mb_phylink_mac_config(struct dsa_switch *ds, int port,
|
||||
static void rtl8365mb_phylink_mac_config(struct phylink_config *config,
|
||||
unsigned int mode,
|
||||
const struct phylink_link_state *state)
|
||||
{
|
||||
struct realtek_priv *priv = ds->priv;
|
||||
struct dsa_port *dp = dsa_phylink_to_port(config);
|
||||
struct realtek_priv *priv = dp->ds->priv;
|
||||
u8 port = dp->index;
|
||||
int ret;
|
||||
|
||||
if (mode != MLO_AN_PHY && mode != MLO_AN_FIXED) {
|
||||
@ -1076,13 +1078,15 @@ static void rtl8365mb_phylink_mac_config(struct dsa_switch *ds, int port,
|
||||
*/
|
||||
}
|
||||
|
||||
static void rtl8365mb_phylink_mac_link_down(struct dsa_switch *ds, int port,
|
||||
static void rtl8365mb_phylink_mac_link_down(struct phylink_config *config,
|
||||
unsigned int mode,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct realtek_priv *priv = ds->priv;
|
||||
struct dsa_port *dp = dsa_phylink_to_port(config);
|
||||
struct realtek_priv *priv = dp->ds->priv;
|
||||
struct rtl8365mb_port *p;
|
||||
struct rtl8365mb *mb;
|
||||
u8 port = dp->index;
|
||||
int ret;
|
||||
|
||||
mb = priv->chip_data;
|
||||
@ -1101,16 +1105,18 @@ static void rtl8365mb_phylink_mac_link_down(struct dsa_switch *ds, int port,
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl8365mb_phylink_mac_link_up(struct dsa_switch *ds, int port,
|
||||
static void rtl8365mb_phylink_mac_link_up(struct phylink_config *config,
|
||||
struct phy_device *phydev,
|
||||
unsigned int mode,
|
||||
phy_interface_t interface,
|
||||
struct phy_device *phydev, int speed,
|
||||
int duplex, bool tx_pause,
|
||||
int speed, int duplex, bool tx_pause,
|
||||
bool rx_pause)
|
||||
{
|
||||
struct realtek_priv *priv = ds->priv;
|
||||
struct dsa_port *dp = dsa_phylink_to_port(config);
|
||||
struct realtek_priv *priv = dp->ds->priv;
|
||||
struct rtl8365mb_port *p;
|
||||
struct rtl8365mb *mb;
|
||||
u8 port = dp->index;
|
||||
int ret;
|
||||
|
||||
mb = priv->chip_data;
|
||||
@ -2106,15 +2112,18 @@ static int rtl8365mb_detect(struct realtek_priv *priv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct phylink_mac_ops rtl8365mb_phylink_mac_ops = {
|
||||
.mac_config = rtl8365mb_phylink_mac_config,
|
||||
.mac_link_down = rtl8365mb_phylink_mac_link_down,
|
||||
.mac_link_up = rtl8365mb_phylink_mac_link_up,
|
||||
};
|
||||
|
||||
static const struct dsa_switch_ops rtl8365mb_switch_ops = {
|
||||
.get_tag_protocol = rtl8365mb_get_tag_protocol,
|
||||
.change_tag_protocol = rtl8365mb_change_tag_protocol,
|
||||
.setup = rtl8365mb_setup,
|
||||
.teardown = rtl8365mb_teardown,
|
||||
.phylink_get_caps = rtl8365mb_phylink_get_caps,
|
||||
.phylink_mac_config = rtl8365mb_phylink_mac_config,
|
||||
.phylink_mac_link_down = rtl8365mb_phylink_mac_link_down,
|
||||
.phylink_mac_link_up = rtl8365mb_phylink_mac_link_up,
|
||||
.port_stp_state_set = rtl8365mb_port_stp_state_set,
|
||||
.get_strings = rtl8365mb_get_strings,
|
||||
.get_ethtool_stats = rtl8365mb_get_ethtool_stats,
|
||||
@ -2136,6 +2145,7 @@ static const struct realtek_ops rtl8365mb_ops = {
|
||||
const struct realtek_variant rtl8365mb_variant = {
|
||||
.ds_ops = &rtl8365mb_switch_ops,
|
||||
.ops = &rtl8365mb_ops,
|
||||
.phylink_mac_ops = &rtl8365mb_phylink_mac_ops,
|
||||
.clk_delay = 10,
|
||||
.cmd_read = 0xb9,
|
||||
.cmd_write = 0xb8,
|
||||
|
@ -1305,11 +1305,19 @@ static void rtl8366rb_phylink_get_caps(struct dsa_switch *ds, int port,
|
||||
}
|
||||
|
||||
static void
|
||||
rtl8366rb_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode,
|
||||
phy_interface_t interface, struct phy_device *phydev,
|
||||
rtl8366rb_mac_config(struct phylink_config *config, unsigned int mode,
|
||||
const struct phylink_link_state *state)
|
||||
{
|
||||
}
|
||||
|
||||
static void
|
||||
rtl8366rb_mac_link_up(struct phylink_config *config, struct phy_device *phydev,
|
||||
unsigned int mode, phy_interface_t interface,
|
||||
int speed, int duplex, bool tx_pause, bool rx_pause)
|
||||
{
|
||||
struct realtek_priv *priv = ds->priv;
|
||||
struct dsa_port *dp = dsa_phylink_to_port(config);
|
||||
struct realtek_priv *priv = dp->ds->priv;
|
||||
int port = dp->index;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
|
||||
@ -1375,10 +1383,12 @@ rtl8366rb_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode,
|
||||
}
|
||||
|
||||
static void
|
||||
rtl8366rb_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode,
|
||||
rtl8366rb_mac_link_down(struct phylink_config *config, unsigned int mode,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct realtek_priv *priv = ds->priv;
|
||||
struct dsa_port *dp = dsa_phylink_to_port(config);
|
||||
struct realtek_priv *priv = dp->ds->priv;
|
||||
int port = dp->index;
|
||||
int ret;
|
||||
|
||||
if (port != priv->cpu_port)
|
||||
@ -2028,12 +2038,16 @@ static int rtl8366rb_detect(struct realtek_priv *priv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct phylink_mac_ops rtl8366rb_phylink_mac_ops = {
|
||||
.mac_config = rtl8366rb_mac_config,
|
||||
.mac_link_down = rtl8366rb_mac_link_down,
|
||||
.mac_link_up = rtl8366rb_mac_link_up,
|
||||
};
|
||||
|
||||
static const struct dsa_switch_ops rtl8366rb_switch_ops = {
|
||||
.get_tag_protocol = rtl8366_get_tag_protocol,
|
||||
.setup = rtl8366rb_setup,
|
||||
.phylink_get_caps = rtl8366rb_phylink_get_caps,
|
||||
.phylink_mac_link_up = rtl8366rb_mac_link_up,
|
||||
.phylink_mac_link_down = rtl8366rb_mac_link_down,
|
||||
.get_strings = rtl8366_get_strings,
|
||||
.get_ethtool_stats = rtl8366_get_ethtool_stats,
|
||||
.get_sset_count = rtl8366_get_sset_count,
|
||||
@ -2071,6 +2085,7 @@ static const struct realtek_ops rtl8366rb_ops = {
|
||||
const struct realtek_variant rtl8366rb_variant = {
|
||||
.ds_ops = &rtl8366rb_switch_ops,
|
||||
.ops = &rtl8366rb_ops,
|
||||
.phylink_mac_ops = &rtl8366rb_phylink_mac_ops,
|
||||
.clk_delay = 10,
|
||||
.cmd_read = 0xa9,
|
||||
.cmd_write = 0xa8,
|
||||
|
@ -236,6 +236,7 @@ int rtl83xx_register_switch(struct realtek_priv *priv)
|
||||
ds->priv = priv;
|
||||
ds->dev = priv->dev;
|
||||
ds->ops = priv->variant->ds_ops;
|
||||
ds->phylink_mac_ops = priv->variant->phylink_mac_ops;
|
||||
ds->num_ports = priv->num_ports;
|
||||
|
||||
ret = dsa_register_switch(ds);
|
||||
|
Loading…
x
Reference in New Issue
Block a user