From: Marcin Wojtas <mw@semihalf.com>
To: Antoine Tenart <antoine.tenart@free-electrons.com>
Cc: "David S. Miller" <davem@davemloft.net>,
"Jason Cooper" <jason@lakedaemon.net>,
"Andrew Lunn" <andrew@lunn.ch>,
"Gregory Clément" <gregory.clement@free-electrons.com>,
"Sebastian Hesselbarth" <sebastian.hesselbarth@gmail.com>,
"Thomas Petazzoni" <thomas.petazzoni@free-electrons.com>,
nadavh@marvell.com,
"Russell King - ARM Linux" <linux@armlinux.org.uk>,
"Stefan Chulski" <stefanc@marvell.com>,
netdev@vger.kernel.org,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH net-next 10/18] net: mvpp2: use the GoP interrupt for link status changes
Date: Tue, 25 Jul 2017 00:58:20 +0200 [thread overview]
Message-ID: <CAPv3WKcHtAKPKcfdC7xE-duhwMSRgSRW9_2B33Ru3KNfczZzMA@mail.gmail.com> (raw)
In-Reply-To: <20170724134848.19330-11-antoine.tenart@free-electrons.com>
Hi Antoine,
This patch requires also:
diff --git a/drivers/net/ethernet/marvell/mvpp2.c
b/drivers/net/ethernet/marvell/mvpp2.c
index 4694d4f..369819f 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -6625,6 +6625,7 @@ static int mvpp2_stop(struct net_device *dev)
{
struct mvpp2_port *port = netdev_priv(dev);
struct mvpp2_port_pcpu *port_pcpu;
+ struct mvpp2 *priv = port->priv;
int cpu;
mvpp2_stop_dev(port);
@@ -6633,6 +6634,10 @@ static int mvpp2_stop(struct net_device *dev)
/* Mask interrupts on all CPUs */
on_each_cpu(mvpp2_interrupts_mask, port, 1);
+ if (priv->hw_version == MVPP22 && !port->phy_node && port->link_irq) {
+ free_irq(port->link_irq, port);
+ }
+
free_irq(port->irq, port);
for_each_present_cpu(cpu) {
port_pcpu = per_cpu_ptr(port->pcpu, cpu);
Otherwise a sequence: ifconfig up/down/up results in faults.
Best regards,
Marcin
2017-07-24 15:48 GMT+02:00 Antoine Tenart <antoine.tenart@free-electrons.com>:
> This patch adds the GoP link interrupt support for when a port isn't
> connected to a PHY. Because of this the phylib callback is never called
> and the link status management isn't done. This patch use the GoP link
> interrupt in such cases to still have a minimal link management. Without
> this patch ports not connected to a PHY cannot work.
>
> Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
> ---
> drivers/net/ethernet/marvell/mvpp2.c | 157 ++++++++++++++++++++++++++++++++++-
> 1 file changed, 154 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
> index 77eef2cc40a1..33a7eb834855 100644
> --- a/drivers/net/ethernet/marvell/mvpp2.c
> +++ b/drivers/net/ethernet/marvell/mvpp2.c
> @@ -339,16 +339,24 @@
> #define MVPP2_GMAC_FLOW_CTRL_AUTONEG BIT(11)
> #define MVPP2_GMAC_CONFIG_FULL_DUPLEX BIT(12)
> #define MVPP2_GMAC_AN_DUPLEX_EN BIT(13)
> +#define MVPP2_GMAC_STATUS0 0x10
> +#define MVPP2_GMAC_STATUS0_LINK_UP BIT(0)
> #define MVPP2_GMAC_PORT_FIFO_CFG_1_REG 0x1c
> #define MVPP2_GMAC_TX_FIFO_MIN_TH_OFFS 6
> #define MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK 0x1fc0
> #define MVPP2_GMAC_TX_FIFO_MIN_TH_MASK(v) (((v) << 6) & \
> MVPP2_GMAC_TX_FIFO_MIN_TH_ALL_MASK)
> +#define MVPP22_GMAC_INT_STAT 0x20
> +#define MVPP22_GMAC_INT_STAT_LINK BIT(1)
> +#define MVPP22_GMAC_INT_MASK 0x24
> +#define MVPP22_GMAC_INT_MASK_LINK_STAT BIT(1)
> #define MVPP22_GMAC_CTRL_4_REG 0x90
> #define MVPP22_CTRL4_EXT_PIN_GMII_SEL BIT(0)
> #define MVPP22_CTRL4_DP_CLK_SEL BIT(5)
> #define MVPP22_CTRL4_SYNC_BYPASS_DIS BIT(6)
> #define MVPP22_CTRL4_QSGMII_BYPASS_ACTIVE BIT(7)
> +#define MVPP22_GMAC_INT_SUM_MASK 0xa4
> +#define MVPP22_GMAC_INT_SUM_MASK_LINK_STAT BIT(1)
>
> /* Per-port XGMAC registers. PPv2.2 only, only for GOP port 0,
> * relative to port->base.
> @@ -358,12 +366,19 @@
> #define MVPP22_XLG_CTRL0_MAC_RESET_DIS BIT(1)
> #define MVPP22_XLG_CTRL0_RX_FLOW_CTRL_EN BIT(7)
> #define MVPP22_XLG_CTRL0_MIB_CNT_DIS BIT(14)
> -
> +#define MVPP22_XLG_STATUS 0x10c
> +#define MVPP22_XLG_STATUS_LINK_UP BIT(0)
> +#define MVPP22_XLG_INT_STAT 0x114
> +#define MVPP22_XLG_INT_STAT_LINK BIT(1)
> +#define MVPP22_XLG_INT_MASK 0x118
> +#define MVPP22_XLG_INT_MASK_LINK BIT(1)
> #define MVPP22_XLG_CTRL3_REG 0x11c
> #define MVPP22_XLG_CTRL3_MACMODESELECT_MASK (7 << 13)
> #define MVPP22_XLG_CTRL3_MACMODESELECT_GMAC (0 << 13)
> #define MVPP22_XLG_CTRL3_MACMODESELECT_10G (1 << 13)
> -
> +#define MVPP22_XLG_EXT_INT_MASK 0x15c
> +#define MVPP22_XLG_EXT_INT_MASK_XLG BIT(1)
> +#define MVPP22_XLG_EXT_INT_MASK_GIG BIT(2)
> #define MVPP22_XLG_CTRL4_REG 0x184
> #define MVPP22_XLG_CTRL4_FWD_FC BIT(5)
> #define MVPP22_XLG_CTRL4_FWD_PFC BIT(6)
> @@ -814,6 +829,7 @@ struct mvpp2_port {
> int gop_id;
>
> int irq;
> + int link_irq;
>
> struct mvpp2 *priv;
>
> @@ -4330,6 +4346,63 @@ static int mvpp22_gop_init(struct mvpp2_port *port)
> return -EINVAL;
> }
>
> +static void mvpp22_gop_unmask_irq(struct mvpp2_port *port)
> +{
> + u32 val;
> +
> + if (port->phy_interface == PHY_INTERFACE_MODE_RGMII ||
> + port->phy_interface == PHY_INTERFACE_MODE_SGMII) {
> + /* Enable the GMAC link status irq for this port */
> + val = readl(port->base + MVPP22_GMAC_INT_SUM_MASK);
> + val |= MVPP22_GMAC_INT_SUM_MASK_LINK_STAT;
> + writel(val, port->base + MVPP22_GMAC_INT_SUM_MASK);
> + }
> +
> + /* Enable the XLG/GIG irqs for this port */
> + val = readl(port->base + MVPP22_XLG_EXT_INT_MASK);
> + if (port->gop_id == 0 &&
> + port->phy_interface == PHY_INTERFACE_MODE_10GKR)
> + val |= MVPP22_XLG_EXT_INT_MASK_XLG;
> + else
> + val |= MVPP22_XLG_EXT_INT_MASK_GIG;
> + writel(val, port->base + MVPP22_XLG_EXT_INT_MASK);
> +}
> +
> +static void mvpp22_gop_mask_irq(struct mvpp2_port *port)
> +{
> + u32 val;
> +
> + val = readl(port->base + MVPP22_XLG_EXT_INT_MASK);
> + val &= ~(MVPP22_XLG_EXT_INT_MASK_XLG |
> + MVPP22_XLG_EXT_INT_MASK_GIG);
> + writel(val, port->base + MVPP22_XLG_EXT_INT_MASK);
> +
> + if (port->phy_interface == PHY_INTERFACE_MODE_RGMII ||
> + port->phy_interface == PHY_INTERFACE_MODE_SGMII) {
> + val = readl(port->base + MVPP22_GMAC_INT_SUM_MASK);
> + val &= ~MVPP22_GMAC_INT_SUM_MASK_LINK_STAT;
> + writel(val, port->base + MVPP22_GMAC_INT_SUM_MASK);
> + }
> +}
> +
> +static void mvpp22_gop_setup_irq(struct mvpp2_port *port)
> +{
> + u32 val;
> +
> + if (port->phy_interface == PHY_INTERFACE_MODE_RGMII ||
> + port->phy_interface == PHY_INTERFACE_MODE_SGMII) {
> + val = readl(port->base + MVPP22_GMAC_INT_MASK);
> + val |= MVPP22_GMAC_INT_MASK_LINK_STAT;
> + writel(val, port->base + MVPP22_GMAC_INT_MASK);
> + }
> +
> + val = readl(port->base + MVPP22_XLG_INT_MASK);
> + val |= MVPP22_XLG_INT_MASK_LINK;
> + writel(val, port->base + MVPP22_XLG_INT_MASK);
> +
> + mvpp22_gop_unmask_irq(port);
> +}
> +
> static void mvpp2_port_mii_gmac_configure_mode(struct mvpp2_port *port)
> {
> u32 val;
> @@ -5529,6 +5602,60 @@ static irqreturn_t mvpp2_isr(int irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> +/* Per-port interrupt for link status changes */
> +static irqreturn_t mvpp2_link_status_isr(int irq, void *dev_id)
> +{
> + struct mvpp2_port *port = (struct mvpp2_port *)dev_id;
> + struct net_device *dev = port->dev;
> + bool event = false, link = false;
> + u32 val;
> +
> + mvpp22_gop_mask_irq(port);
> +
> + if (port->gop_id == 0 &&
> + port->phy_interface == PHY_INTERFACE_MODE_10GKR) {
> + val = readl(port->base + MVPP22_XLG_INT_STAT);
> + if (val & MVPP22_XLG_INT_STAT_LINK) {
> + event = true;
> + val = readl(port->base + MVPP22_XLG_STATUS);
> + if (val & MVPP22_XLG_STATUS_LINK_UP)
> + link = true;
> + }
> + } else if (port->phy_interface == PHY_INTERFACE_MODE_RGMII ||
> + port->phy_interface == PHY_INTERFACE_MODE_SGMII) {
> + val = readl(port->base + MVPP22_GMAC_INT_STAT);
> + if (val & MVPP22_GMAC_INT_STAT_LINK) {
> + event = true;
> + val = readl(port->base + MVPP2_GMAC_STATUS0);
> + if (val & MVPP2_GMAC_STATUS0_LINK_UP)
> + link = true;
> + }
> + }
> +
> + if (!netif_running(dev) || !event)
> + goto handled;
> +
> + if (link) {
> + mvpp2_interrupts_enable(port);
> +
> + mvpp2_egress_enable(port);
> + mvpp2_ingress_enable(port);
> + netif_carrier_on(dev);
> + netif_tx_wake_all_queues(dev);
> + } else {
> + netif_tx_stop_all_queues(dev);
> + netif_carrier_off(dev);
> + mvpp2_ingress_disable(port);
> + mvpp2_egress_disable(port);
> +
> + mvpp2_interrupts_disable(port);
> + }
> +
> +handled:
> + mvpp22_gop_unmask_irq(port);
> + return IRQ_HANDLED;
> +}
> +
> /* Adjust link */
> static void mvpp2_link_event(struct net_device *dev)
> {
> @@ -6221,6 +6348,7 @@ static void mvpp2_phy_disconnect(struct mvpp2_port *port)
> static int mvpp2_open(struct net_device *dev)
> {
> struct mvpp2_port *port = netdev_priv(dev);
> + struct mvpp2 *priv = port->priv;
> unsigned char mac_bcast[ETH_ALEN] = {
> 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
> int err;
> @@ -6266,12 +6394,24 @@ static int mvpp2_open(struct net_device *dev)
> goto err_cleanup_txqs;
> }
>
> + if (priv->hw_version == MVPP22 && !port->phy_node && port->link_irq) {
> + err = request_irq(port->link_irq, mvpp2_link_status_isr, 0,
> + dev->name, port);
> + if (err) {
> + netdev_err(port->dev, "cannot request link IRQ %d\n",
> + port->link_irq);
> + goto err_free_irq;
> + }
> +
> + mvpp22_gop_setup_irq(port);
> + }
> +
> /* In default link is down */
> netif_carrier_off(port->dev);
>
> err = mvpp2_phy_connect(port);
> if (err < 0)
> - goto err_free_irq;
> + goto err_free_link_irq;
>
> /* Unmask interrupts on all CPUs */
> on_each_cpu(mvpp2_interrupts_unmask, port, 1);
> @@ -6280,6 +6420,8 @@ static int mvpp2_open(struct net_device *dev)
>
> return 0;
>
> +err_free_link_irq:
> + free_irq(port->link_irq, port);
> err_free_irq:
> free_irq(port->irq, port);
> err_cleanup_txqs:
> @@ -6796,6 +6938,15 @@ static int mvpp2_port_probe(struct platform_device *pdev,
> -EPROBE_DEFER : -EINVAL;
> goto err_free_netdev;
> }
> +
> + port->link_irq = of_irq_get_byname(port_node, "link");
> + if (port->link_irq == -EPROBE_DEFER) {
> + err = -EPROBE_DEFER;
> + goto err_free_irq;
> + }
> + if (port->link_irq <= 0)
> + /* the link irq is optional */
> + port->link_irq = 0;
> } else {
> /* kept for dt compatibility */
> port->irq = irq_of_parse_and_map(port_node, 0);
> --
> 2.13.3
>
next prev parent reply other threads:[~2017-07-24 22:58 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-24 13:48 [PATCH net-next 00/18] net: mvpp2: MAC/GoP configuration and optional PHYs Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 01/18] net: mvpp2: unify register definitions coding style Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 02/18] net: mvpp2: fix the synchronization module bypass macro name Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 03/18] net: mvpp2: set the SMI PHY address when connecting to the PHY Antoine Tenart
2017-07-24 16:40 ` Sergei Shtylyov
2017-07-25 8:42 ` Antoine Tenart
2017-07-26 16:08 ` Andrew Lunn
2017-07-28 1:49 ` Antoine Tenart
2017-07-28 4:21 ` Andrew Lunn
2017-08-22 14:41 ` Antoine Tenart
2017-08-22 14:50 ` Andrew Lunn
2017-08-23 10:40 ` [EXT] " Stefan Chulski
2017-08-23 12:34 ` Andrew Lunn
2017-08-23 13:30 ` Stefan Chulski
2017-08-23 13:34 ` Andrew Lunn
2017-07-24 13:48 ` [PATCH net-next 04/18] net: mvpp2: move the mii configuration in the ndo_open path Antoine Tenart
2017-07-26 16:11 ` Andrew Lunn
2017-07-28 1:44 ` Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 05/18] net: mvpp2: initialize the GMAC when using a port Antoine Tenart
2017-07-26 16:14 ` Andrew Lunn
2017-07-24 13:48 ` [PATCH net-next 06/18] net: mvpp2: initialize the XLG MAC " Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 07/18] net: mvpp2: initialize the GoP Antoine Tenart
2017-07-26 16:16 ` Andrew Lunn
2017-07-24 13:48 ` [PATCH net-next 08/18] net: mvpp2: make the phy optional Antoine Tenart
2017-07-26 16:20 ` Andrew Lunn
2017-07-28 1:50 ` Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 09/18] net: mvpp2: use named interrupts Antoine Tenart
2017-07-24 16:49 ` Sergei Shtylyov
2017-07-25 8:45 ` Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 10/18] net: mvpp2: use the GoP interrupt for link status changes Antoine Tenart
2017-07-24 22:58 ` Marcin Wojtas [this message]
2017-07-25 8:47 ` Antoine Tenart
2017-07-25 13:17 ` Thomas Petazzoni
2017-07-26 0:07 ` Antoine Tenart
2017-07-26 16:26 ` Andrew Lunn
2017-07-26 19:38 ` Russell King - ARM Linux
2017-08-23 8:25 ` Antoine Tenart
2017-08-23 15:24 ` [EXT] " Stefan Chulski
2017-08-23 16:04 ` Antoine Tenart
2017-08-23 21:05 ` Marcin Wojtas
2017-08-24 10:59 ` Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 11/18] Documentation/bindings: net: marvell-pp2: add the system controller Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 12/18] Documentation/bindings: net: marvell-pp2: add the interrupt-names Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 13/18] arm64: dts: marvell: cp110: use named interrupts for the Ethernet ports Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 14/18] arm64: dts: marvell: cp110: add PPv2 port interrupts Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 15/18] arm64: dts: marvell: add a reference to the sysctrl syscon in the ppv2 node Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 16/18] arm64: dts: marvell: mcbin: enable more networking ports Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 17/18] arm64: dts: marvell: 7040-db: enable the SFP port Antoine Tenart
2017-07-24 13:48 ` [PATCH net-next 18/18] arm64: dts: marvell: 8040-db: enable the SFP ports Antoine Tenart
2017-07-24 23:56 ` [PATCH net-next 00/18] net: mvpp2: MAC/GoP configuration and optional PHYs Marcin Wojtas
2017-07-25 8:48 ` Antoine Tenart
2017-07-25 10:45 ` Marcin Wojtas
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAPv3WKcHtAKPKcfdC7xE-duhwMSRgSRW9_2B33Ru3KNfczZzMA@mail.gmail.com \
--to=mw@semihalf.com \
--cc=andrew@lunn.ch \
--cc=antoine.tenart@free-electrons.com \
--cc=davem@davemloft.net \
--cc=gregory.clement@free-electrons.com \
--cc=jason@lakedaemon.net \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=nadavh@marvell.com \
--cc=netdev@vger.kernel.org \
--cc=sebastian.hesselbarth@gmail.com \
--cc=stefanc@marvell.com \
--cc=thomas.petazzoni@free-electrons.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).