From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B81EC4338F for ; Thu, 29 Jul 2021 23:46:45 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 34C7C60720 for ; Thu, 29 Jul 2021 23:46:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 34C7C60720 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=cisco.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=CJcbpgAGGzHcGtBb7lOxLXcupyf9G5hk2u3Ss27Iffc=; b=V3YMhSNwIcDq3p G/wM50RILMkDXieUf5ef5xPMWZBGIedP5PyFNKUf4qlJkBqwMmgy8P0w7qSoZIf/uCl8FcB1E7I+S kcHhTzQRVWgFtoUnTesP+AFQ43PYWzsFKG204CSZ2zNEhWm6sSpUPBLJe82Oc54++ZWjENQGMrESB aV1HGWs9fgsxcOCan/2VTv8YIpgdotBhpqoDmXl1woNDDPUADw/5BSFBU9n04PwEcWlhTMqrPev8z K9Egla72sd8OcZrCmos2XR3sESxaC3jpo+C7vBWkacsHs4N0ZTAG3JeP72nmUBdREOelPL7IZ+z/a /RJPNBS1XvlKcyoi6KCQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m9Fht-006RfX-D5; Thu, 29 Jul 2021 23:44:53 +0000 Received: from rcdn-iport-7.cisco.com ([173.37.86.78]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m9Fho-006RfB-AL for linux-arm-kernel@lists.infradead.org; Thu, 29 Jul 2021 23:44:50 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=7288; q=dns/txt; s=iport; t=1627602288; x=1628811888; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=/Ap9mbPXpL2l+I0gCWzJlCwjSQrqoLRXRbu/ViyjT8A=; b=lu04kw2NAZEqcqK078pvE4hCMsalxjfT4S9Y/eYRIeomC1hr085UJTrs LM0uUgrUzxfOhvTb05VOJvcB4iK3hy61BjpGSb9QaZ9h9Ie6xTWaPhe4D RKcuhdzYDMz8euv19F+o3ExRk25o8CjWInh4RvbW6OHKUDb71UlFzlkD5 0=; X-IronPort-AV: E=Sophos;i="5.84,280,1620691200"; d="scan'208";a="899786753" Received: from rcdn-core-6.cisco.com ([173.37.93.157]) by rcdn-iport-7.cisco.com with ESMTP/TLS/DHE-RSA-SEED-SHA; 29 Jul 2021 23:44:44 +0000 Received: from zorba.cisco.com ([10.24.25.127]) by rcdn-core-6.cisco.com (8.15.2/8.15.2) with ESMTP id 16TNihvU032246; Thu, 29 Jul 2021 23:44:43 GMT From: Daniel Walker To: Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , Maxime Coquelin , Russell King Cc: Balamurugan Selvarajan , xe-linux-external@cisco.com, "David S. Miller" , Jakub Kicinski , netdev@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [RFC-PATCH] net: stmmac: Add KR port support. Date: Thu, 29 Jul 2021 16:44:42 -0700 Message-Id: <20210729234443.1713722-1-danielwa@cisco.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-Auto-Response-Suppress: DR, OOF, AutoReply X-Outbound-SMTP-Client: 10.24.25.127, [10.24.25.127] X-Outbound-Node: rcdn-core-6.cisco.com X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210729_164448_539232_5DB858CD X-CRM114-Status: GOOD ( 19.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Balamurugan Selvarajan For KR port the mii interface is a chip-to-chip interface without a mechanical connector. So PHY inits are not applicable. In this case MAC is configured to operate at forced speed(1000Mbps) and full duplex. Modified driver to accommodate PHY and NON-PHY mode. Cc: xe-linux-external@cisco.com Signed-off-by: Balamurugan Selvarajan Signed-off-by: Daniel Walker --- drivers/net/ethernet/stmicro/stmmac/common.h | 2 + .../net/ethernet/stmicro/stmmac/stmmac_main.c | 89 +++++++++++++------ 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index 5fecc83f175b..6458ce5ec0bd 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h @@ -435,6 +435,8 @@ struct dma_features { #define MAC_CTRL_REG 0x00000000 /* MAC Control */ #define MAC_ENABLE_TX 0x00000008 /* Transmitter Enable */ #define MAC_ENABLE_RX 0x00000004 /* Receiver Enable */ +#define MAC_FULL_DUPLEX 0x00000800 +#define MAC_PORT_SELECT 0x00008000 /* Default LPI timers */ #define STMMAC_DEFAULT_LIT_LS 0x3E8 diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 7b8404a21544..0b31aae65f3a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3212,6 +3212,7 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) bool sph_en; u32 chan; int ret; + int speed; /* DMA initialization and SW reset */ ret = stmmac_init_dma_engine(priv); @@ -3226,7 +3227,9 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) /* PS and related bits will be programmed according to the speed */ if (priv->hw->pcs) { - int speed = priv->plat->mac_port_sel_speed; + speed = priv->plat->mac_port_sel_speed; + if (priv->plat->phy_interface == PHY_INTERFACE_MODE_NA) + speed = SPEED_1000; if ((speed == SPEED_10) || (speed == SPEED_100) || (speed == SPEED_1000)) { @@ -3256,6 +3259,17 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) /* Enable the MAC Rx/Tx */ stmmac_mac_set(priv, priv->ioaddr, true); + if (priv->plat->phy_interface == PHY_INTERFACE_MODE_NA) { + /* + * Force MAC PORT SPEED to 1000Mbps and Full Duplex. + */ + u32 ctrl = readl(priv->ioaddr + MAC_CTRL_REG); + ctrl |= MAC_FULL_DUPLEX; + ctrl &= ~(MAC_PORT_SELECT); + writel(ctrl, priv->ioaddr + MAC_CTRL_REG); + } + + /* Set the HW DMA mode and the COE */ stmmac_dma_operation_mode(priv); @@ -3291,8 +3305,14 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp) } } - if (priv->hw->pcs) - stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0); + if (priv->hw->pcs) { + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) { + stmmac_pcs_ctrl_ane(priv, priv->ioaddr, 1, priv->hw->ps, 0); + } else { + /* Disable Autoneg */ + writel(0x0, priv->ioaddr + GMAC_PCS_BASE); + } + } /* set TX and RX rings length */ stmmac_set_rings_length(priv); @@ -3644,12 +3664,14 @@ int stmmac_open(struct net_device *dev) priv->hw->pcs != STMMAC_PCS_RTBI && (!priv->hw->xpcs || xpcs_get_an_mode(priv->hw->xpcs, mode) != DW_AN_C73)) { - ret = stmmac_init_phy(dev); - if (ret) { - netdev_err(priv->dev, - "%s: Cannot attach to PHY (error: %d)\n", - __func__, ret); - goto init_phy_error; + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) { + ret = stmmac_init_phy(dev); + if (ret) { + netdev_err(priv->dev, + "%s: Cannot attach to PHY (error: %d)\n", + __func__, ret); + goto init_phy_error; + } } } @@ -3705,7 +3727,8 @@ int stmmac_open(struct net_device *dev) stmmac_init_coalesce(priv); - phylink_start(priv->phylink); + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) + phylink_start(priv->phylink); /* We may have called phylink_speed_down before */ phylink_speed_up(priv->phylink); @@ -3716,10 +3739,14 @@ int stmmac_open(struct net_device *dev) stmmac_enable_all_queues(priv); netif_tx_start_all_queues(priv->dev); + if (priv->plat->phy_interface == PHY_INTERFACE_MODE_NA) + netif_carrier_on(dev); + return 0; irq_error: - phylink_stop(priv->phylink); + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) + phylink_stop(priv->phylink); for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) hrtimer_cancel(&priv->tx_queue[chan].txtimer); @@ -3728,7 +3755,8 @@ int stmmac_open(struct net_device *dev) init_error: free_dma_desc_resources(priv); dma_desc_error: - phylink_disconnect_phy(priv->phylink); + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) + phylink_disconnect_phy(priv->phylink); init_phy_error: pm_runtime_put(priv->device); return ret; @@ -3758,8 +3786,10 @@ int stmmac_release(struct net_device *dev) if (device_may_wakeup(priv->device)) phylink_speed_down(priv->phylink, false); /* Stop and disconnect the PHY */ - phylink_stop(priv->phylink); - phylink_disconnect_phy(priv->phylink); + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) { + phylink_stop(priv->phylink); + phylink_disconnect_phy(priv->phylink); + } stmmac_disable_all_queues(priv); @@ -6986,12 +7016,15 @@ int stmmac_dvr_probe(struct device *device, if (priv->hw->pcs != STMMAC_PCS_TBI && priv->hw->pcs != STMMAC_PCS_RTBI) { /* MDIO bus Registration */ - ret = stmmac_mdio_register(ndev); - if (ret < 0) { - dev_err(priv->device, - "%s: MDIO bus (id: %d) registration failed", - __func__, priv->plat->bus_id); - goto error_mdio_register; + + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) { + ret = stmmac_mdio_register(ndev); + if (ret < 0) { + dev_err(priv->device, + "%s: MDIO bus (id: %d) registration failed", + __func__, priv->plat->bus_id); + goto error_mdio_register; + } } } @@ -7004,10 +7037,12 @@ int stmmac_dvr_probe(struct device *device, goto error_xpcs_setup; } - ret = stmmac_phy_setup(priv); - if (ret) { - netdev_err(ndev, "failed to setup phy (%d)\n", ret); - goto error_phy_setup; + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) { + ret = stmmac_phy_setup(priv); + if (ret) { + netdev_err(ndev, "failed to setup phy (%d)\n", ret); + goto error_phy_setup; + } } ret = register_netdev(ndev); @@ -7039,11 +7074,13 @@ int stmmac_dvr_probe(struct device *device, error_serdes_powerup: unregister_netdev(ndev); error_netdev_register: - phylink_destroy(priv->phylink); + if (priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) + phylink_destroy(priv->phylink); error_xpcs_setup: error_phy_setup: if (priv->hw->pcs != STMMAC_PCS_TBI && - priv->hw->pcs != STMMAC_PCS_RTBI) + priv->hw->pcs != STMMAC_PCS_RTBI && + priv->plat->phy_interface != PHY_INTERFACE_MODE_NA) stmmac_mdio_unregister(ndev); error_mdio_register: stmmac_napi_del(ndev); -- 2.25.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel