From patchwork Fri Aug 16 15:08:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 1148287 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nic.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=nic.cz header.i=@nic.cz header.b="qXvo9Xh0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4696Cg1HFYz9sNC for ; Sat, 17 Aug 2019 01:08:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727388AbfHPPIk (ORCPT ); Fri, 16 Aug 2019 11:08:40 -0400 Received: from mail.nic.cz ([217.31.204.67]:32854 "EHLO mail.nic.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727324AbfHPPIk (ORCPT ); Fri, 16 Aug 2019 11:08:40 -0400 Received: from dellmb.labs.office.nic.cz (unknown [IPv6:2001:1488:fffe:6:cac7:3539:7f1f:463]) by mail.nic.cz (Postfix) with ESMTP id B23C2140CB0; Fri, 16 Aug 2019 17:08:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nic.cz; s=default; t=1565968118; bh=8DF58wQ/NBbU8KWt+7T6HG9zZof54j8WmIdUCzlFNjY=; h=From:To:Date; b=qXvo9Xh0DyMl5feyDnEZxq0hxPbOrqIypEnj7zJUrjLt5t0LfJg1lGEdEjxO5FCpE ov+4qg6pqLtNFTReWG6mzxjM2TIwu2syExp4L1N/crW0TeI7O5oif9J8723rum0CF5 btqlb4uqkfqKI+w8VTwOffwwiW4trxe6NZar6sQk= From: =?utf-8?q?Marek_Beh=C3=BAn?= To: netdev@vger.kernel.org Cc: Andrew Lunn , Vivien Didelot , Vladimir Oltean , Florian Fainelli , =?utf-8?q?Marek_Beh?= =?utf-8?b?w7pu?= Subject: [PATCH RFC net-next 1/3] net: dsa: mv88e6xxx: support 2500base-x in SGMII IRQ handler Date: Fri, 16 Aug 2019 17:08:32 +0200 Message-Id: <20190816150834.26939-2-marek.behun@nic.cz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816150834.26939-1-marek.behun@nic.cz> References: <20190816150834.26939-1-marek.behun@nic.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.100.3 at mail.nic.cz X-Virus-Status: Clean X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT shortcircuit=ham autolearn=disabled version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.nic.cz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The mv88e6390_serdes_irq_link_sgmii IRQ handler reads the SERDES PHY status register to determine speed, among other things. If cmode of the port is set to 2500base-x, though, the PHY still reports 1000 Mbps (the PHY register itself does not differentiate between 1000 Mbps and 2500 Mbps - it thinks it is running at 1000 Mbps, although clock is 2.5x faster). Look at the cmode and set SPEED_2500 if cmode is set to 2500base-x. Signed-off-by: Marek Behún Cc: Andrew Lunn Cc: Florian Fainelli Cc: Vladimir Oltean Cc: Vivien Didelot --- drivers/net/dsa/mv88e6xxx/serdes.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/mv88e6xxx/serdes.c b/drivers/net/dsa/mv88e6xxx/serdes.c index 20c526c2a9ee..17bb4a705d44 100644 --- a/drivers/net/dsa/mv88e6xxx/serdes.c +++ b/drivers/net/dsa/mv88e6xxx/serdes.c @@ -506,6 +506,7 @@ static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip, int port, int lane) { struct dsa_switch *ds = chip->ds; + u8 cmode = chip->ports[port].cmode; int duplex = DUPLEX_UNKNOWN; int speed = SPEED_UNKNOWN; int link, err; @@ -527,7 +528,10 @@ static void mv88e6390_serdes_irq_link_sgmii(struct mv88e6xxx_chip *chip, switch (status & MV88E6390_SGMII_PHY_STATUS_SPEED_MASK) { case MV88E6390_SGMII_PHY_STATUS_SPEED_1000: - speed = SPEED_1000; + if (cmode == MV88E6XXX_PORT_STS_CMODE_2500BASEX) + speed = SPEED_2500; + else + speed = SPEED_1000; break; case MV88E6390_SGMII_PHY_STATUS_SPEED_100: speed = SPEED_100; From patchwork Fri Aug 16 15:08:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 1148286 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nic.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=nic.cz header.i=@nic.cz header.b="V8lgn2hv"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4696CZ3Gt3z9sND for ; Sat, 17 Aug 2019 01:08:41 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727446AbfHPPIl (ORCPT ); Fri, 16 Aug 2019 11:08:41 -0400 Received: from mail.nic.cz ([217.31.204.67]:32864 "EHLO mail.nic.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727326AbfHPPIk (ORCPT ); Fri, 16 Aug 2019 11:08:40 -0400 Received: from dellmb.labs.office.nic.cz (unknown [IPv6:2001:1488:fffe:6:cac7:3539:7f1f:463]) by mail.nic.cz (Postfix) with ESMTP id CC6AA140CDD; Fri, 16 Aug 2019 17:08:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nic.cz; s=default; t=1565968118; bh=vRUZH/gOa1T/0u+NCfdx4Pvdwhu91i7kAAljJm1hyBQ=; h=From:To:Date; b=V8lgn2hv777vs2mA6Ot9kUWiO4KNUg/0D2YoK0C2cy55VFuUxtLuQKo3T8qbDbSrM YWxcAvJ0/Nh/ov109gSQjJo/UuuOHmHeiDB7sSUmhoAuZt9Of6LieW1I2xPAyrt96C 29EI8TfEEcZ3JTMyRiWWRCVvXswYWZgRH/0e3ARI= From: =?utf-8?q?Marek_Beh=C3=BAn?= To: netdev@vger.kernel.org Cc: Andrew Lunn , Vivien Didelot , Vladimir Oltean , Florian Fainelli , =?utf-8?q?Marek_Beh?= =?utf-8?b?w7pu?= Subject: [PATCH RFC net-next 2/3] net: dsa: add port_setup/port_teardown methods to DSA ops Date: Fri, 16 Aug 2019 17:08:33 +0200 Message-Id: <20190816150834.26939-3-marek.behun@nic.cz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816150834.26939-1-marek.behun@nic.cz> References: <20190816150834.26939-1-marek.behun@nic.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.100.3 at mail.nic.cz X-Virus-Status: Clean X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT shortcircuit=ham autolearn=disabled version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.nic.cz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add two new methods into the DSA operations structure: - port_setup(), called from dsa_port_setup() after the DSA port already registered - port_teardown(), called from dsa_port_teardown() before the port is unregistered Signed-off-by: Marek Behún Cc: Andrew Lunn Cc: Florian Fainelli Cc: Vladimir Oltean Cc: Vivien Didelot --- include/net/dsa.h | 2 ++ net/dsa/dsa2.c | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index 147b757ef8ea..848898e5d7c5 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -360,6 +360,8 @@ struct dsa_switch_ops { int (*setup)(struct dsa_switch *ds); void (*teardown)(struct dsa_switch *ds); + int (*port_setup)(struct dsa_switch *ds, int port); + void (*port_teardown)(struct dsa_switch *ds, int port); u32 (*get_phy_flags)(struct dsa_switch *ds, int port); /* diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c index 3abd173ebacb..c891300a6d2c 100644 --- a/net/dsa/dsa2.c +++ b/net/dsa/dsa2.c @@ -315,6 +315,9 @@ static int dsa_port_setup(struct dsa_port *dp) break; } + if (!err && ds->ops->port_setup) + err = ds->ops->port_setup(ds, dp->index); + if (err) devlink_port_unregister(&dp->devlink_port); @@ -323,8 +326,13 @@ static int dsa_port_setup(struct dsa_port *dp) static void dsa_port_teardown(struct dsa_port *dp) { - if (dp->type != DSA_PORT_TYPE_UNUSED) + struct dsa_switch *ds = dp->ds; + + if (dp->type != DSA_PORT_TYPE_UNUSED) { devlink_port_unregister(&dp->devlink_port); + if (ds->ops->port_teardown) + ds->ops->port_teardown(ds, dp->index); + } switch (dp->type) { case DSA_PORT_TYPE_UNUSED: From patchwork Fri Aug 16 15:08:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 1148289 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=nic.cz Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=nic.cz header.i=@nic.cz header.b="oP15WurO"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 4696Cj3kKcz9sNC for ; Sat, 17 Aug 2019 01:08:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727509AbfHPPIo (ORCPT ); Fri, 16 Aug 2019 11:08:44 -0400 Received: from mail.nic.cz ([217.31.204.67]:32870 "EHLO mail.nic.cz" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727337AbfHPPIm (ORCPT ); Fri, 16 Aug 2019 11:08:42 -0400 Received: from dellmb.labs.office.nic.cz (unknown [IPv6:2001:1488:fffe:6:cac7:3539:7f1f:463]) by mail.nic.cz (Postfix) with ESMTP id F1B8A140CDF; Fri, 16 Aug 2019 17:08:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=nic.cz; s=default; t=1565968119; bh=WP7vOSOuRP24DU4xBBueR+LHlsNyCSHZfsqHpMThghI=; h=From:To:Date; b=oP15WurON/mn1NSPwC+LrjwEQIoPOr9BMw5CY7qPgadn+CVhgnyX54Ry9n0vqicPV 30RGKbc8wF+U3dddJsae3+PxXrInWjbduw+O8reBwgUluw1EJ7GYD1Se02ggAOZEDp JljVRrDZmgYfT2GiAM8nt2CqR8jWLBkajojfAu5g= From: =?utf-8?q?Marek_Beh=C3=BAn?= To: netdev@vger.kernel.org Cc: Andrew Lunn , Vivien Didelot , Vladimir Oltean , Florian Fainelli , =?utf-8?q?Marek_Beh?= =?utf-8?b?w7pu?= Subject: [PATCH RFC net-next 3/3] net: dsa: mv88e6xxx: setup SERDES irq also for CPU/DSA ports Date: Fri, 16 Aug 2019 17:08:34 +0200 Message-Id: <20190816150834.26939-4-marek.behun@nic.cz> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190816150834.26939-1-marek.behun@nic.cz> References: <20190816150834.26939-1-marek.behun@nic.cz> MIME-Version: 1.0 X-Virus-Scanned: clamav-milter 0.100.3 at mail.nic.cz X-Virus-Status: Clean X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,SHORTCIRCUIT shortcircuit=ham autolearn=disabled version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.nic.cz Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When CPU/DSA port is put into for example into 2500base-x mode, the SERDES irq has to be enabled so that port's MAC is configured properly after autonegotiation. When SERDES irq is being enabled, the port's phylink structure already has to exist. Otherwise if the IRQ fires immediately, the IRQ routine's access to the nonexistent phylink structure results in an exception. We therefore enable SERDES irqs for CPU/DSA ports in the .port_setup() method, which is called by DSA from dsa_setup_port after the port is registered and phylink structures exist. We also move SERDES powering on for CPU/DSA ports to this method. We also free the IRQ and power off SERDESes for these ports in the .port_teardown() method. Signed-off-by: Marek Behún Cc: Andrew Lunn Cc: Florian Fainelli Cc: Vladimir Oltean Cc: Vivien Didelot --- drivers/net/dsa/mv88e6xxx/chip.c | 54 ++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index 9b3ad22a5b98..23d3e39d2b9c 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -2151,16 +2151,6 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) if (err) return err; - /* Enable the SERDES interface for DSA and CPU ports. Normal - * ports SERDES are enabled when the port is enabled, thus - * saving a bit of power. - */ - if ((dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))) { - err = mv88e6xxx_serdes_power(chip, port, true); - if (err) - return err; - } - /* Port Control 2: don't force a good FCS, set the maximum frame size to * 10240 bytes, disable 802.1q tags checking, don't discard tagged or * untagged frames on this port, do a destination address lookup on all @@ -2557,6 +2547,48 @@ static int mv88e6xxx_setup(struct dsa_switch *ds) return err; } +static int mv88e6xxx_port_setup(struct dsa_switch *ds, int port) +{ + struct mv88e6xxx_chip *chip = ds->priv; + int err; + + /* Enable the SERDES interface for DSA and CPU ports. Normal + * ports SERDES are enabled when the port is enabled, thus + * saving a bit of power. + */ + if ((dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))) { + mv88e6xxx_reg_lock(chip); + + err = mv88e6xxx_serdes_power(chip, port, true); + + if (!err && chip->info->ops->serdes_irq_setup) + err = chip->info->ops->serdes_irq_setup(chip, port); + + mv88e6xxx_reg_unlock(chip); + + return err; + } + + return 0; +} + +static void mv88e6xxx_port_teardown(struct dsa_switch *ds, int port) +{ + struct mv88e6xxx_chip *chip = ds->priv; + + if ((dsa_is_cpu_port(ds, port) || dsa_is_dsa_port(ds, port))) { + mv88e6xxx_reg_lock(chip); + + if (chip->info->ops->serdes_irq_free) + chip->info->ops->serdes_irq_free(chip, port); + + if (mv88e6xxx_serdes_power(chip, port, false)) + dev_err(chip->dev, "failed to power off SERDES\n"); + + mv88e6xxx_reg_unlock(chip); + } +} + static int mv88e6xxx_mdio_read(struct mii_bus *bus, int phy, int reg) { struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; @@ -4692,6 +4724,8 @@ static int mv88e6xxx_port_egress_floods(struct dsa_switch *ds, int port, static const struct dsa_switch_ops mv88e6xxx_switch_ops = { .get_tag_protocol = mv88e6xxx_get_tag_protocol, .setup = mv88e6xxx_setup, + .port_setup = mv88e6xxx_port_setup, + .port_teardown = mv88e6xxx_port_teardown, .phylink_validate = mv88e6xxx_validate, .phylink_mac_link_state = mv88e6xxx_link_state, .phylink_mac_config = mv88e6xxx_mac_config,