From patchwork Wed Apr 19 07:32:17 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gaetano Catalli X-Patchwork-Id: 752111 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3w7DJ90CNSz9s2x for ; Wed, 19 Apr 2017 17:33:29 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="tbpeeS+I"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="BEJirOks"; dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Subject:To:Message-ID:Date:From: References:In-Reply-To:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=WNZaz2kb4UxUFsac5kgNuaNm48wTiMKiKyj5XcWAdt8=; b=tbpeeS+IwLMdNS uEZIPVTpd22AsgX+HIt74Rk6pH/PSwMvdnZyBljUn+JnyvHdN2pcmEeJ0cJKazFhXhEL2W4mKzSmp K9lmDN45o7+Uqzri1Vu/7dmk/PxNC208wirls6lNOkybMBGRfZk6RqF+5J29a1L1IYYpeewXlFJhw ME7I6AxY0fJP2A/CyzUTmvFIo5sI8UDnMhQJev3HQTRnUKLVTZhVOAGlIKhSLFsYrEjFHIF0CIwfy laEMpx4aGpAZrul8P0w6Hyr/UP5BpJDWHN+6tqfoMUBwYtESwRCShp368Tmt803YMLP9QX7S0GPhL XahE/uaC8X566mS5nOLw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1d0k6z-0003uO-AZ; Wed, 19 Apr 2017 07:33:13 +0000 Received: from mail-it0-x242.google.com ([2607:f8b0:4001:c0b::242]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1d0k6v-0003rW-8n for lede-dev@lists.infradead.org; Wed, 19 Apr 2017 07:33:11 +0000 Received: by mail-it0-x242.google.com with SMTP id z67so1532095itb.0 for ; Wed, 19 Apr 2017 00:32:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=Ov1cempQ7FH0CFwQb6lojFXw4yEeIHeBLMrqnXckgPk=; b=BEJirOkspU/FJ/ZqKJl8ixt+0M23KVjOh4zNKttvRZAA5yluqWyOIk+lKqvgrNAdAt hUAReok6mASHiGJtFpGSjUgJfVGN2H/Jwd+Kr8AFoupiyxZYdy6+ZilayzXJKtWgwxAP Cy3yBVEWsY6cazHPktr0LKgbNQaCSxLtbzYSpNIbVRSNDxcBCRsdnThHkKv4mnSY+3Gl scSMmVKMhBtdLm/wrH1TSOoI0wXsl+tFqpLyK4SzzJ5rml7dNsnCXHaxGudDo5YJ4Vc1 GCM9wnM8mqszNDUareB0ZMLPwaiXhoigqGTR/+tJIOvpkHq8tEhfzybcMB1QziYtVzbY YHBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=Ov1cempQ7FH0CFwQb6lojFXw4yEeIHeBLMrqnXckgPk=; b=T2Dmdy86VDq+fIIE/+RrdGAr96YRsfkHdTh/iHcby5pqMV/EaEmwVUZSyTmM+TTXdy AlWR+cmuAeX6biZ5GjVHJ0lk9RbGBrdpFxCwChBnFAY+YdpawlsiapZPHyqFwa6HRwrQ gh55DQLt03Gay5OiVL4C5lSxB0ynMFw4NRWXzytjeCENShMX+vyYyuINJT/ptU++forD nRnxDzS5SE1q50c7RibFwVwwjcKTQZzJOHeE6M9FNGSo9MtxBy1CG6fH8H4ABkU9MVd8 mFiSoy3OkbBUG1sPnrLx75Sbg4TYxNJ4cRHHq/klOqyDOWYN5n+3HZLy7Xa3Sj/O8h+5 TCrw== X-Gm-Message-State: AN3rC/4OEkaR5d9uUH3+/cr309ydvcr9dbhSPhAb7k0yH2Ov/Z35EBI7 qI8+9+a/zxptRM/0QzDI64cE0cR5XRmf3Fk= X-Received: by 10.36.137.4 with SMTP id s4mr18180751itd.63.1492587167613; Wed, 19 Apr 2017 00:32:47 -0700 (PDT) MIME-Version: 1.0 Received: by 10.79.162.25 with HTTP; Wed, 19 Apr 2017 00:32:17 -0700 (PDT) In-Reply-To: References: <1491782800.1972.1.camel@localhost> From: Gaetano Catalli Date: Wed, 19 Apr 2017 09:32:17 +0200 Message-ID: To: Jaap Buurman X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170419_003309_389267_6C44BD7F X-CRM114-Status: GOOD ( 29.48 ) X-Spam-Score: -2.0 (--) X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary: Content analysis details: (-2.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2607:f8b0:4001:c0b:0:0:0:242 listed in] [list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (gaetano.catalli[at]gmail.com) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature Subject: Re: [LEDE-DEV] MT7621 support Jumbo frames X-BeenThere: lede-dev@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: LEDE Development List , Rosen Penev , =?UTF-8?Q?Milan_Ko=C4=8Dvara?= Sender: "Lede-dev" Errors-To: lede-dev-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org I've been working on this for a while. Apparently the embedded 5-port gigabit switch is able to handle packets with size up to 15KB. On the contrary, the GMAC, to which the switch is attached, has a limit of 2KB. The following is a patch that changes the max recv frame length to 2KB and allows to set the MTU up to that value. It is based on kernel 4.4.7. Signed-off-by: Gaetano Catalli --- drivers/net/ethernet/mediatek/gsw_mt7620.h | 6 +++++ drivers/net/ethernet/mediatek/gsw_mt7621.c | 13 +++++++---- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 36 ++++++++++++++++++----------- drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 + drivers/net/ethernet/mediatek/soc_mt7621.c | 2 +- 5 files changed, 39 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/mediatek/gsw_mt7620.h b/drivers/net/ethernet/mediatek/gsw_mt7620.h index dcef9a8..ce3cd10 100644 --- a/drivers/net/ethernet/mediatek/gsw_mt7620.h +++ b/drivers/net/ethernet/mediatek/gsw_mt7620.h @@ -45,6 +45,12 @@ #define GSW_REG_ISR 0x700c #define GSW_REG_GPC1 0x7014 +#define GSW_REG_MAC_P0_MCR 0x100 +#define GSW_REG_MAC_P1_MCR 0x200 + +// Global MAC control register +#define GSW_REG_GMACCR 0x30E0 + #define SYSC_REG_CHIP_REV_ID 0x0c #define SYSC_REG_CFG1 0x14 #define RST_CTRL_MCM BIT(2) diff --git a/drivers/net/ethernet/mediatek/gsw_mt7621.c b/drivers/net/ethernet/mediatek/gsw_mt7621.c index 96280b4..db5d56d 100644 --- a/drivers/net/ethernet/mediatek/gsw_mt7621.c +++ b/drivers/net/ethernet/mediatek/gsw_mt7621.c @@ -99,17 +99,20 @@ static void mt7621_hw_init(struct mt7620_gsw *gsw, struct device_node *np) usleep_range(10, 20); if ((rt_sysc_r32(SYSC_REG_CHIP_REV_ID) & 0xFFFF) == 0x0101) { - /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */ - mtk_switch_w32(gsw, 0x2105e30b, 0x100); + /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 2k) */ + mtk_switch_w32(gsw, 0x2305e30b, GSW_REG_MAC_P0_MCR); mt7530_mdio_w32(gsw, 0x3600, 0x5e30b); } else { - /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 1536) */ - mtk_switch_w32(gsw, 0x2105e33b, 0x100); + /* (GE1, Force 1000M/FD, FC ON, MAX_RX_LENGTH 2k) */ + mtk_switch_w32(gsw, 0x2305e33b, GSW_REG_MAC_P0_MCR); mt7530_mdio_w32(gsw, 0x3600, 0x5e33b); } /* (GE2, Link down) */ - mtk_switch_w32(gsw, 0x8000, 0x200); + mtk_switch_w32(gsw, 0x8000, GSW_REG_MAC_P1_MCR); + + /* Set switch max RX frame length to 2k */ + mt7530_mdio_w32(gsw, GSW_REG_GMACCR, 0x3F0B); /* Enable Port 6, P5 as GMAC5, P5 disable */ val = mt7530_mdio_r32(gsw, 0x7804); diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 48eda44..5edafa6 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -37,7 +37,7 @@ #include "mdio.h" #include "ethtool.h" -#define MAX_RX_LENGTH 1536 +#define MAX_RX_LENGTH 2048 #define FE_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN) #define FE_RX_HLEN (NET_SKB_PAD + FE_RX_ETH_HLEN + NET_IP_ALIGN) #define DMA_DUMMY_DESC 0xffffffff @@ -1358,11 +1358,29 @@ static int fe_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) return -EOPNOTSUPP; } +static int fe_set_mtu(struct fe_priv* priv, int new_mtu) +{ + int frag_size = fe_max_frag_size(new_mtu); + u32 fwd_cfg; + + fe_stop(priv->netdev); + fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG); + if (new_mtu <= ETH_DATA_LEN) { + fwd_cfg &= ~FE_GDM1_JMB_EN; + } else { + fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT); + fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) << + FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN; + } + fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG); + + return fe_open(priv->netdev); +} + static int fe_change_mtu(struct net_device *dev, int new_mtu) { struct fe_priv *priv = netdev_priv(dev); int frag_size, old_mtu; - u32 fwd_cfg; if (!(priv->flags & FE_FLAG_JUMBO_FRAME)) return eth_change_mtu(dev, new_mtu); @@ -1389,18 +1407,10 @@ static int fe_change_mtu(struct net_device *dev, int new_mtu) if (!netif_running(dev)) return 0; - fe_stop(dev); - fwd_cfg = fe_r32(FE_GDMA1_FWD_CFG); - if (new_mtu <= ETH_DATA_LEN) { - fwd_cfg &= ~FE_GDM1_JMB_EN; - } else { - fwd_cfg &= ~(FE_GDM1_JMB_LEN_MASK << FE_GDM1_JMB_LEN_SHIFT); - fwd_cfg |= (DIV_ROUND_UP(frag_size, 1024) << - FE_GDM1_JMB_LEN_SHIFT) | FE_GDM1_JMB_EN; - } - fe_w32(fwd_cfg, FE_GDMA1_FWD_CFG); + if (priv->soc->set_mtu) + return priv->soc->set_mtu(priv, new_mtu); - return fe_open(dev); + return fe_set_mtu(priv, new_mtu); } static const struct net_device_ops fe_netdev_ops = { diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h index d5f8b87..3acc2c1 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -381,6 +381,7 @@ struct fe_soc_data { void (*reset_fe)(void); void (*set_mac)(struct fe_priv *priv, unsigned char *mac); int (*fwd_config)(struct fe_priv *priv); + int (*set_mtu)(struct fe_priv *priv, int new_mtu); void (*tx_dma)(struct fe_tx_dma *txd); int (*switch_init)(struct fe_priv *priv); int (*switch_config)(struct fe_priv *priv); diff --git a/drivers/net/ethernet/mediatek/soc_mt7621.c b/drivers/net/ethernet/mediatek/soc_mt7621.c index 1609a3e..f95c354 100644 --- a/drivers/net/ethernet/mediatek/soc_mt7621.c +++ b/drivers/net/ethernet/mediatek/soc_mt7621.c @@ -140,7 +140,7 @@ static void mt7621_init_data(struct fe_soc_data *data, priv->flags = FE_FLAG_PADDING_64B | FE_FLAG_RX_2B_OFFSET | FE_FLAG_RX_SG_DMA | FE_FLAG_NAPI_WEIGHT | - FE_FLAG_HAS_SWITCH; + FE_FLAG_HAS_SWITCH | FE_FLAG_JUMBO_FRAME; netdev->hw_features = NETIF_F_IP_CSUM | NETIF_F_RXCSUM | NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_SG | NETIF_F_TSO |