Commit 9bb2289f authored by Michal Vokáč's avatar Michal Vokáč Committed by David S. Miller

net: dsa: qca8k: Allow overwriting CPU port setting

Implement adjust_link function that allows to overwrite default CPU port
setting using fixed-link device tree subnode.
Signed-off-by: default avatarMichal Vokáč <michal.vokac@ysoft.com>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 79a4ed4f
...@@ -587,6 +587,47 @@ qca8k_setup(struct dsa_switch *ds) ...@@ -587,6 +587,47 @@ qca8k_setup(struct dsa_switch *ds)
return 0; return 0;
} }
static void
qca8k_adjust_link(struct dsa_switch *ds, int port, struct phy_device *phy)
{
struct qca8k_priv *priv = ds->priv;
u32 reg;
/* Force fixed-link setting for CPU port, skip others. */
if (!phy_is_pseudo_fixed_link(phy))
return;
/* Set port speed */
switch (phy->speed) {
case 10:
reg = QCA8K_PORT_STATUS_SPEED_10;
break;
case 100:
reg = QCA8K_PORT_STATUS_SPEED_100;
break;
case 1000:
reg = QCA8K_PORT_STATUS_SPEED_1000;
break;
default:
dev_dbg(priv->dev, "port%d link speed %dMbps not supported.\n",
port, phy->speed);
return;
}
/* Set duplex mode */
if (phy->duplex == DUPLEX_FULL)
reg |= QCA8K_PORT_STATUS_DUPLEX;
/* Force flow control */
if (dsa_is_cpu_port(ds, port))
reg |= QCA8K_PORT_STATUS_RXFLOW | QCA8K_PORT_STATUS_TXFLOW;
/* Force link down before changing MAC options */
qca8k_port_set_status(priv, port, 0);
qca8k_write(priv, QCA8K_REG_PORT_STATUS(port), reg);
qca8k_port_set_status(priv, port, 1);
}
static int static int
qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum) qca8k_phy_read(struct dsa_switch *ds, int phy, int regnum)
{ {
...@@ -841,6 +882,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds, int port) ...@@ -841,6 +882,7 @@ qca8k_get_tag_protocol(struct dsa_switch *ds, int port)
static const struct dsa_switch_ops qca8k_switch_ops = { static const struct dsa_switch_ops qca8k_switch_ops = {
.get_tag_protocol = qca8k_get_tag_protocol, .get_tag_protocol = qca8k_get_tag_protocol,
.setup = qca8k_setup, .setup = qca8k_setup,
.adjust_link = qca8k_adjust_link,
.get_strings = qca8k_get_strings, .get_strings = qca8k_get_strings,
.phy_read = qca8k_phy_read, .phy_read = qca8k_phy_read,
.phy_write = qca8k_phy_write, .phy_write = qca8k_phy_write,
...@@ -872,6 +914,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev) ...@@ -872,6 +914,7 @@ qca8k_sw_probe(struct mdio_device *mdiodev)
return -ENOMEM; return -ENOMEM;
priv->bus = mdiodev->bus; priv->bus = mdiodev->bus;
priv->dev = &mdiodev->dev;
/* read the switches ID register */ /* read the switches ID register */
id = qca8k_read(priv, QCA8K_REG_MASK_CTRL); id = qca8k_read(priv, QCA8K_REG_MASK_CTRL);
......
...@@ -167,6 +167,7 @@ struct qca8k_priv { ...@@ -167,6 +167,7 @@ struct qca8k_priv {
struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS]; struct ar8xxx_port_status port_sts[QCA8K_NUM_PORTS];
struct dsa_switch *ds; struct dsa_switch *ds;
struct mutex reg_mutex; struct mutex reg_mutex;
struct device *dev;
}; };
struct qca8k_mib_desc { struct qca8k_mib_desc {
......
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