From patchwork Thu Mar 6 19:26:29 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005261 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oa1-f54.google.com (mail-oa1-f54.google.com [209.85.160.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C14382702B1; Thu, 6 Mar 2025 19:27:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289244; cv=none; b=EKl+cTa2Ec8TEpoyaHp/QlDXkzf4TS3d5VUkSG7K9IcZAaoc3EbegZoNklBGIgKIddLtfiUnSYuVvVoJ9oVhxjLnHouVC+kMbTqsbv1s1diZtOwy6R/WfMG1frP32SyY3iqAQokpW310PeBwB1u4VHzh4QMvIKL1VrhoYmRhTQc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289244; c=relaxed/simple; bh=9ENCTKeLEn1PJ1zMdgPRHmAQLdMXx0UFApLFQTECnSs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=C6b3iKsn6rTlmRHL4s0AoewkIAMEqi3LU9v4sZUzrpdTbvaTJTqFw/aTWwXBuTQFmeaRquXi8uYwXzNLOazgN9yfus4+jpyTYpptuGt5cZAuE3aCQi9cdIYDClw1Qdg7aEgXT15DtXl1bZLSgR/rGrWrhoHOCxbM4erv05vTPDo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=W6LWiE1P; arc=none smtp.client-ip=209.85.160.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="W6LWiE1P" Received: by mail-oa1-f54.google.com with SMTP id 586e51a60fabf-2c239771aeaso563547fac.0; Thu, 06 Mar 2025 11:27:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289242; x=1741894042; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eKwfTsEQw5Bi7D8464oJBTkyLsaylAPpitDMs+mgTDc=; b=W6LWiE1P7aLFsK/4tEbruCUDVidRDEoBvillmziije8Ecnb8V4SULD6ACGtqcXuhHy Xp78ab5+TAy3VhaTV+QejIhbCrV3rDCij8uC/nBom+N1ppceI8s5wIzRH5AXauwuWP7l 85O6RBptUCXRCtyUlJ4AAcLGAEo0+NWe7oxwEfsUWUtcoAV5YPATe1zq7YGbiX5+6uos 11jZbLcogGecDGLRTglqWV9vM+wwSl/zBCMQTc/YhQjVEj9yrQ4i+fkHLpsZOXwnca1r ZMg+aM89KyM/fYXafxDWSeiXHyM0g1FftOiI3Ycs267idncfnCtTLbl31t4UjLIDd0m0 JgRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289242; x=1741894042; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eKwfTsEQw5Bi7D8464oJBTkyLsaylAPpitDMs+mgTDc=; b=I4Ijt2vWGlSVf5tR3cVp+SaUjH48XnO/ZlPFRdVfY/H5e1UUxDIoFywWKk25pvIT2m Fam65BbNpk6nADMhTSuozdtHV8VA6Kl1gN95qU2WDvBtLd4SvHgZ7PAk16v8aKaHhNDU AkK6lOXYZfvSGZJIh0Fuy36XA4/52XzCFU13lr05JnmxQCGzlzPyKVskY7exFGhWxYaJ YokuzO4/KfQP/7YwxXkJustcCB79Iy3KSDW7Hjtf1wmlVs1jFvbhXLNoWIt0upMn5YLm S81J6YIRQu3NlZugKzIbGTd0h58vM9ZUw7J4gZQAlVQhQ3GiQjyMeD31SXU24hpYi6pW Ms8g== X-Forwarded-Encrypted: i=1; AJvYcCV7zqKO/A4D73dRkXjWxUIGoFLuZCgSsMmZmsdDVYUAnkuH6uwGFHEjNy9/XZDxQpKFhv8V1Sds@vger.kernel.org, AJvYcCWsWiMpdgyAvqx/QhyUtSc49ppyYeEqTYPHIwbUgHXVXjbZ+1eNtF3hQxjgd4uiNdVOJht9FmXtBnkjcfc=@vger.kernel.org X-Gm-Message-State: AOJu0Yxw9J30JJLaZ0UWZqnnMN61Z071jBSL6b8jOHvbUtCCQ/YhlzKY IA/v36doYBX3yjiXYh0WPVDUeMqK0mQbfb0SeD7p9BFrvaZQuDaz X-Gm-Gg: ASbGncuW2yR3uAcopZCGCpqWC5kB5i406HNEBfu4IKPW3ePJ0F9aRAxyOzntk6H9isy V7NiJEYAbQDo47KPIAuefT2LY2ByVHyi6G3wgPvrmWmUUOqL73xQIjjs46T2jU905acnAOwQuw9 2LZ9OG/3iiMNEETUiK4v2ChGmOFuuCZcO2VxcErKUcaaNZM77El7MuUkyawrvVDcXKtePDy8CsP ktEQsu0OmuijyTK1aFbZITDKYrIqAOI5sayLEj81Jjo2hDmFbA1qrJ5xBs+rP9BjF4niBQDtCHU 8onGGqyXooT0UeWEBvGoqBu3R5tqleh4B70LA+B4xOmrth3jCD9kuxkE7r4evOkmPgSTqn31uTE cwCIfd9Hgn+lm X-Google-Smtp-Source: AGHT+IGyH+Xdmhl/sdavZJd+xAXCyXcM0Rh4RDOkEnHuNVpvBoSSRnwp/JMa26joUyLsNPjQlXNOIg== X-Received: by 2002:a05:6871:e082:b0:2c2:2d0f:40a3 with SMTP id 586e51a60fabf-2c2612f7582mr357227fac.31.1741289241657; Thu, 06 Mar 2025 11:27:21 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:20 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 01/14] net: bcmgenet: bcmgenet_hw_params clean up Date: Thu, 6 Mar 2025 11:26:29 -0800 Message-Id: <20250306192643.2383632-2-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The entries of the bcmgenet_hw_params array are broken out to remove unused and duplicate entries and are made read only since they should not change for a specific version of the GENET hardware. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 183 ++++++++---------- .../net/ethernet/broadcom/genet/bcmgenet.h | 2 +- 2 files changed, 84 insertions(+), 101 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 3e93f957430b..0c717a724c4e 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2,7 +2,7 @@ /* * Broadcom GENET (Gigabit Ethernet) controller driver * - * Copyright (c) 2014-2024 Broadcom + * Copyright (c) 2014-2025 Broadcom */ #define pr_fmt(fmt) "bcmgenet: " fmt @@ -3726,123 +3726,106 @@ static const struct net_device_ops bcmgenet_netdev_ops = { .ndo_change_carrier = bcmgenet_change_carrier, }; -/* Array of GENET hardware parameters/characteristics */ -static struct bcmgenet_hw_params bcmgenet_hw_params[] = { - [GENET_V1] = { - .tx_queues = 0, - .tx_bds_per_q = 0, - .rx_queues = 0, - .rx_bds_per_q = 0, - .bp_in_en_shift = 16, - .bp_in_mask = 0xffff, - .hfb_filter_cnt = 16, - .qtag_mask = 0x1F, - .hfb_offset = 0x1000, - .rdma_offset = 0x2000, - .tdma_offset = 0x3000, - .words_per_bd = 2, - }, - [GENET_V2] = { - .tx_queues = 4, - .tx_bds_per_q = 32, - .rx_queues = 0, - .rx_bds_per_q = 0, - .bp_in_en_shift = 16, - .bp_in_mask = 0xffff, - .hfb_filter_cnt = 16, - .qtag_mask = 0x1F, - .tbuf_offset = 0x0600, - .hfb_offset = 0x1000, - .hfb_reg_offset = 0x2000, - .rdma_offset = 0x3000, - .tdma_offset = 0x4000, - .words_per_bd = 2, - .flags = GENET_HAS_EXT, - }, - [GENET_V3] = { - .tx_queues = 4, - .tx_bds_per_q = 32, - .rx_queues = 0, - .rx_bds_per_q = 0, - .bp_in_en_shift = 17, - .bp_in_mask = 0x1ffff, - .hfb_filter_cnt = 48, - .hfb_filter_size = 128, - .qtag_mask = 0x3F, - .tbuf_offset = 0x0600, - .hfb_offset = 0x8000, - .hfb_reg_offset = 0xfc00, - .rdma_offset = 0x10000, - .tdma_offset = 0x11000, - .words_per_bd = 2, - .flags = GENET_HAS_EXT | GENET_HAS_MDIO_INTR | - GENET_HAS_MOCA_LINK_DET, - }, - [GENET_V4] = { - .tx_queues = 4, - .tx_bds_per_q = 32, - .rx_queues = 0, - .rx_bds_per_q = 0, - .bp_in_en_shift = 17, - .bp_in_mask = 0x1ffff, - .hfb_filter_cnt = 48, - .hfb_filter_size = 128, - .qtag_mask = 0x3F, - .tbuf_offset = 0x0600, - .hfb_offset = 0x8000, - .hfb_reg_offset = 0xfc00, - .rdma_offset = 0x2000, - .tdma_offset = 0x4000, - .words_per_bd = 3, - .flags = GENET_HAS_40BITS | GENET_HAS_EXT | - GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, - }, - [GENET_V5] = { - .tx_queues = 4, - .tx_bds_per_q = 32, - .rx_queues = 0, - .rx_bds_per_q = 0, - .bp_in_en_shift = 17, - .bp_in_mask = 0x1ffff, - .hfb_filter_cnt = 48, - .hfb_filter_size = 128, - .qtag_mask = 0x3F, - .tbuf_offset = 0x0600, - .hfb_offset = 0x8000, - .hfb_reg_offset = 0xfc00, - .rdma_offset = 0x2000, - .tdma_offset = 0x4000, - .words_per_bd = 3, - .flags = GENET_HAS_40BITS | GENET_HAS_EXT | - GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, - }, +/* GENET hardware parameters/characteristics */ +static const struct bcmgenet_hw_params bcmgenet_hw_params_v1 = { + .tx_queues = 0, + .tx_bds_per_q = 0, + .rx_queues = 0, + .rx_bds_per_q = 0, + .bp_in_en_shift = 16, + .bp_in_mask = 0xffff, + .hfb_filter_cnt = 16, + .qtag_mask = 0x1F, + .hfb_offset = 0x1000, + .rdma_offset = 0x2000, + .tdma_offset = 0x3000, + .words_per_bd = 2, +}; + +static const struct bcmgenet_hw_params bcmgenet_hw_params_v2 = { + .tx_queues = 4, + .tx_bds_per_q = 32, + .rx_queues = 0, + .rx_bds_per_q = 0, + .bp_in_en_shift = 16, + .bp_in_mask = 0xffff, + .hfb_filter_cnt = 16, + .qtag_mask = 0x1F, + .tbuf_offset = 0x0600, + .hfb_offset = 0x1000, + .hfb_reg_offset = 0x2000, + .rdma_offset = 0x3000, + .tdma_offset = 0x4000, + .words_per_bd = 2, + .flags = GENET_HAS_EXT, +}; + +static const struct bcmgenet_hw_params bcmgenet_hw_params_v3 = { + .tx_queues = 4, + .tx_bds_per_q = 32, + .rx_queues = 0, + .rx_bds_per_q = 0, + .bp_in_en_shift = 17, + .bp_in_mask = 0x1ffff, + .hfb_filter_cnt = 48, + .hfb_filter_size = 128, + .qtag_mask = 0x3F, + .tbuf_offset = 0x0600, + .hfb_offset = 0x8000, + .hfb_reg_offset = 0xfc00, + .rdma_offset = 0x10000, + .tdma_offset = 0x11000, + .words_per_bd = 2, + .flags = GENET_HAS_EXT | GENET_HAS_MDIO_INTR | + GENET_HAS_MOCA_LINK_DET, +}; + +static const struct bcmgenet_hw_params bcmgenet_hw_params_v4 = { + .tx_queues = 4, + .tx_bds_per_q = 32, + .rx_queues = 0, + .rx_bds_per_q = 0, + .bp_in_en_shift = 17, + .bp_in_mask = 0x1ffff, + .hfb_filter_cnt = 48, + .hfb_filter_size = 128, + .qtag_mask = 0x3F, + .tbuf_offset = 0x0600, + .hfb_offset = 0x8000, + .hfb_reg_offset = 0xfc00, + .rdma_offset = 0x2000, + .tdma_offset = 0x4000, + .words_per_bd = 3, + .flags = GENET_HAS_40BITS | GENET_HAS_EXT | + GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, }; /* Infer hardware parameters from the detected GENET version */ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) { - struct bcmgenet_hw_params *params; + const struct bcmgenet_hw_params *params; u32 reg; u8 major; u16 gphy_rev; - if (GENET_IS_V5(priv) || GENET_IS_V4(priv)) { - bcmgenet_dma_regs = bcmgenet_dma_regs_v3plus; - genet_dma_ring_regs = genet_dma_ring_regs_v4; - } else if (GENET_IS_V3(priv)) { + /* default to latest values */ + params = &bcmgenet_hw_params_v4; + bcmgenet_dma_regs = bcmgenet_dma_regs_v3plus; + genet_dma_ring_regs = genet_dma_ring_regs_v4; + if (GENET_IS_V3(priv)) { + params = &bcmgenet_hw_params_v3; bcmgenet_dma_regs = bcmgenet_dma_regs_v3plus; genet_dma_ring_regs = genet_dma_ring_regs_v123; } else if (GENET_IS_V2(priv)) { + params = &bcmgenet_hw_params_v2; bcmgenet_dma_regs = bcmgenet_dma_regs_v2; genet_dma_ring_regs = genet_dma_ring_regs_v123; } else if (GENET_IS_V1(priv)) { + params = &bcmgenet_hw_params_v1; bcmgenet_dma_regs = bcmgenet_dma_regs_v1; genet_dma_ring_regs = genet_dma_ring_regs_v123; } - - /* enum genet_version starts at 1 */ - priv->hw_params = &bcmgenet_hw_params[priv->version]; - params = priv->hw_params; + priv->hw_params = params; /* Read GENET HW version */ reg = bcmgenet_sys_readl(priv, SYS_REV_CTRL); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 43b923c48b14..1078a31ac794 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -596,7 +596,7 @@ struct bcmgenet_priv { struct bcmgenet_rx_ring rx_rings[DESC_INDEX + 1]; /* other misc variables */ - struct bcmgenet_hw_params *hw_params; + const struct bcmgenet_hw_params *hw_params; unsigned autoneg_pause:1; unsigned tx_pause:1; unsigned rx_pause:1; From patchwork Thu Mar 6 19:26:30 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005262 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f42.google.com (mail-ot1-f42.google.com [209.85.210.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71A4C2702DC; Thu, 6 Mar 2025 19:27:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289246; cv=none; b=k6vdEQEyQvFShMDp9ncc8Ly1jjPT5pcDn8OPj7vwSB0ezW4hSYguCflWNy8oUFVXLWpkdpz3zfzTw0SftLq0i8CBmMc/qsAMR3KXXsmdo9H7Zr2yDvTvMoWooaLcAv4cxz2bbN2Bt/TXuZ1Z1LDTEAHlrX+JZyoHkKAm4nzCPHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289246; c=relaxed/simple; bh=qEllzekEq8IAT5Z4C/NYgdMx63iggK+4MAvrXHQtytw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=DJUSez4UFV0OOgIkff0mULjaTHkOsKZ0KwvfBjVaZQLDbzpBpJqG3YdtPGOkmFEfyTFWTyKzCNSQE2+NNDB0L39w4SOkJm5g3Cwh150NC/EquHPVtRZrvxjQmPN37fguQHGvbC/Q+ailrS9DffLbLk2hwj98bX3toYXmjqSvpO4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=UDelv4q+; arc=none smtp.client-ip=209.85.210.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="UDelv4q+" Received: by mail-ot1-f42.google.com with SMTP id 46e09a7af769-7273b01fe35so572559a34.2; Thu, 06 Mar 2025 11:27:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289243; x=1741894043; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uSucofxhEHh6y9zz8syxu2bQtsSf8MLDI4wztpQhvDg=; b=UDelv4q+iyfXS24ud73WgvCHgvavFCSpxgfk66Rh2JTWlDFhrDcmnAjjYkPSLBblYF cLTMmsJuoWSy0BonLJnJNQGmQKO+OhFgl5Z38HCtmmHeRfn9+Zqnz2bV1mNY/Ob+hasH ljrDbvqXa+r8cQCBQXUJ+OAz79KxmhrJ58bZbU/HtR20kdt8GJT6Ng+MTxId+13g2txC q586boWatxxmhFsG3Sqhf6xVH+s1sNtZRyiblGiGzJzVr41X26k4bkJnJJtQtO/Q7poR Jj1IlT280nJcqoIFMFZt6B5M2+M7lCuJFBlSGz6613ClTCqHUTKh4VZbddG+RiS6Ee9B yS+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289243; x=1741894043; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uSucofxhEHh6y9zz8syxu2bQtsSf8MLDI4wztpQhvDg=; b=BPpUAHFivEBoCaI+NxNy4ZgSKzMlMcagZuvHhQN6H4vljRJpyxfYAdegiNhE+WV1tJ xfRJ/FyJYWV+nXCk2XQW8eSWXUJhoxz5t/LRMGIi7CpT+o8yFwUuClgJcd4CuIfjhzEB 5pMbBE94WfQhIh8Ro7LKHEHIZIQmGUhTYZNey7EiaYQ4JIxFHhSL1paa431d/8H1dWUL ma5Wu7rNyh+bIyl7IL74/cx4PM5kzp1HU8xgSoLZcmDR4j34Nl3opxKgtyhdSAEZIlO3 +nA+WIBq//QOj3lPP97+1MD6DrLsqy3oM2OBMIaFHwVk0MbY70PLg4UDNkW6e9by49u8 Em0w== X-Forwarded-Encrypted: i=1; AJvYcCUn60Bb/ygJ7itIx166RFeKIsqW/m5x5fZxEf6CL0YRs+t7mPD6MGEspruHE0BbSVFDYl0ZHvE8@vger.kernel.org, AJvYcCVDW8Cy7LsJ/ueb67ErgPySzjctbbv03TJaUy/mI32GpIus/Oi+qXUV3LlC426y4j8Ls+npsLp1DVIIF3Q=@vger.kernel.org X-Gm-Message-State: AOJu0Ywf9+7QkMWz6eNZmWaHdFqhK5tFkwDKsdanOtnR09kM9fey19Lg CHY6bEGShVOvKNBDY6Ts/dUtlN92W7pvEs3OANzYfjSRT7L5CW7+ X-Gm-Gg: ASbGncs2VsImAMxauTU8brbDtTrz6cOupMRKktFqBG1aYeEQXaps1qALpGLOzsX8xv4 TfikKnXlLWYIPOMbnG7STvWn0OIyTiEHlingaq/89Ud5dmKIknj9+h7Ddp7Y5SZQHxm/Q3neQBT LmFutzlmlWWeBEaT05MjxczQwbEctzirZnb2XOCUYXQkxIlGxRTGdefdC55bINYQPXgCmdTSj56 /1OGHA7CmDv/h8CxewG2QTyTDR/usV6e6S8FtLZnv0dKLzHIDo01quMF6pVk0budJbTYaZvcYab xh5iiODq0pSuH26+ksOq0hUSp1fjyJM5brYM7hgTCXEy6NnzpzakE2UAmb8LIiHHgOaucW7mmiF ruYW8xsR5F/nJ X-Google-Smtp-Source: AGHT+IGgcYN8VKkWjnN+QgIkKZGabOX2FW67nvjEjdbo1vBDgxbKnR9+R3OxVhFbCiPhaCB9C6iQTw== X-Received: by 2002:a05:6830:3486:b0:72a:e65:e675 with SMTP id 46e09a7af769-72a37c64565mr287665a34.23.1741289243292; Thu, 06 Mar 2025 11:27:23 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:22 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 02/14] net: bcmgenet: add bcmgenet_has_* helpers Date: Thu, 6 Mar 2025 11:26:30 -0800 Message-Id: <20250306192643.2383632-3-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Introduce helper functions to indicate whether the driver should make use of a particular feature that it supports. These helpers abstract the implementation of how the feature availability is encoded. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 20 +++++++------- .../net/ethernet/broadcom/genet/bcmgenet.h | 27 ++++++++++++++++++- drivers/net/ethernet/broadcom/genet/bcmmii.c | 6 ++--- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 0c717a724c4e..769d920a0fc0 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -104,7 +104,7 @@ static inline void dmadesc_set_addr(struct bcmgenet_priv *priv, * the platform is explicitly configured for 64-bits/LPAE. */ #ifdef CONFIG_PHYS_ADDR_T_64BIT - if (priv->hw_params->flags & GENET_HAS_40BITS) + if (bcmgenet_has_40bits(priv)) bcmgenet_writel(upper_32_bits(addr), d + DMA_DESC_ADDRESS_HI); #endif } @@ -1651,9 +1651,9 @@ static int bcmgenet_power_down(struct bcmgenet_priv *priv, case GENET_POWER_PASSIVE: /* Power down LED */ - if (priv->hw_params->flags & GENET_HAS_EXT) { + if (bcmgenet_has_ext(priv)) { reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); - if (GENET_IS_V5(priv) && !priv->ephy_16nm) + if (GENET_IS_V5(priv) && !bcmgenet_has_ephy_16nm(priv)) reg |= EXT_PWR_DOWN_PHY_EN | EXT_PWR_DOWN_PHY_RD | EXT_PWR_DOWN_PHY_SD | @@ -1681,7 +1681,7 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv, { u32 reg; - if (!(priv->hw_params->flags & GENET_HAS_EXT)) + if (!bcmgenet_has_ext(priv)) return; reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); @@ -1690,7 +1690,7 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv, case GENET_POWER_PASSIVE: reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS | EXT_ENERGY_DET_MASK); - if (GENET_IS_V5(priv) && !priv->ephy_16nm) { + if (GENET_IS_V5(priv) && !bcmgenet_has_ephy_16nm(priv)) { reg &= ~(EXT_PWR_DOWN_PHY_EN | EXT_PWR_DOWN_PHY_RD | EXT_PWR_DOWN_PHY_SD | @@ -2523,7 +2523,7 @@ static void bcmgenet_link_intr_enable(struct bcmgenet_priv *priv) } else if (priv->ext_phy) { int0_enable |= UMAC_IRQ_LINK_EVENT; } else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) { - if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) + if (bcmgenet_has_moca_link_det(priv)) int0_enable |= UMAC_IRQ_LINK_EVENT; } bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR); @@ -2588,7 +2588,7 @@ static void init_umac(struct bcmgenet_priv *priv) } /* Enable MDIO interrupts on GENET v3+ */ - if (priv->hw_params->flags & GENET_HAS_MDIO_INTR) + if (bcmgenet_has_mdio_intr(priv)) int0_enable |= (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR); bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR); @@ -3228,7 +3228,7 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) } } - if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) && + if (bcmgenet_has_mdio_intr(priv) && status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { wake_up(&priv->wq); } @@ -3881,7 +3881,7 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) } #ifdef CONFIG_PHYS_ADDR_T_64BIT - if (!(params->flags & GENET_HAS_40BITS)) + if (!bcmgenet_has_40bits(priv)) pr_warn("GENET does not support 40-bits PA\n"); #endif @@ -4060,7 +4060,7 @@ static int bcmgenet_probe(struct platform_device *pdev) bcmgenet_set_hw_params(priv); err = -EIO; - if (priv->hw_params->flags & GENET_HAS_40BITS) + if (bcmgenet_has_40bits(priv)) err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40)); if (err) err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 1078a31ac794..9b73ae55c0d6 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2014-2024 Broadcom + * Copyright (c) 2014-2025 Broadcom */ #ifndef __BCMGENET_H__ @@ -650,6 +650,31 @@ struct bcmgenet_priv { struct ethtool_keee eee; }; +static inline bool bcmgenet_has_40bits(struct bcmgenet_priv *priv) +{ + return !!(priv->hw_params->flags & GENET_HAS_40BITS); +} + +static inline bool bcmgenet_has_ext(struct bcmgenet_priv *priv) +{ + return !!(priv->hw_params->flags & GENET_HAS_EXT); +} + +static inline bool bcmgenet_has_mdio_intr(struct bcmgenet_priv *priv) +{ + return !!(priv->hw_params->flags & GENET_HAS_MDIO_INTR); +} + +static inline bool bcmgenet_has_moca_link_det(struct bcmgenet_priv *priv) +{ + return !!(priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET); +} + +static inline bool bcmgenet_has_ephy_16nm(struct bcmgenet_priv *priv) +{ + return priv->ephy_16nm; +} + #define GENET_IO_MACRO(name, offset) \ static inline u32 bcmgenet_##name##_readl(struct bcmgenet_priv *priv, \ u32 off) \ diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c index c4a3698cef66..71c619d2bea5 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c @@ -2,7 +2,7 @@ /* * Broadcom GENET MDIO routines * - * Copyright (c) 2014-2024 Broadcom + * Copyright (c) 2014-2025 Broadcom */ #include @@ -154,7 +154,7 @@ void bcmgenet_phy_power_set(struct net_device *dev, bool enable) u32 reg = 0; /* EXT_GPHY_CTRL is only valid for GENETv4 and onward */ - if (GENET_IS_V4(priv) || priv->ephy_16nm) { + if (GENET_IS_V4(priv) || bcmgenet_has_ephy_16nm(priv)) { reg = bcmgenet_ext_readl(priv, EXT_GPHY_CTRL); if (enable) { reg &= ~EXT_CK25_DIS; @@ -184,7 +184,7 @@ void bcmgenet_phy_power_set(struct net_device *dev, bool enable) static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv) { - if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) + if (bcmgenet_has_moca_link_det(priv)) fixed_phy_set_link_update(priv->dev->phydev, bcmgenet_fixed_phy_link_update); } From patchwork Thu Mar 6 19:26:31 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005263 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 018622755E9; Thu, 6 Mar 2025 19:27:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289248; cv=none; b=Qf3fhTkcnbKsGdx9zoTecfjNGZqerWMgOz2R/GyxNETwyQbNY2+bdfsH7Ovp8O2db1/GJ9r4dh/30VhY6Gd+eUcMJANp++l16QKIPCkKQxQdHxrQFAtN99IGUQAdxqjTJZDSXr1ONBM7t/TKVHe+xaU/jNAALaFL+ScM2lN+rJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289248; c=relaxed/simple; bh=QL+jsvVNg7TrIfCIkfsOe+HXz5qFw1jD/1K+MsFFFFE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RThALTWuVsii8FQoDSiq8mLwWSMYGxFtH0qpJ0MUEKw6+lPCo5Mt9fW0uasqCns6CfpZmK2QpJpP5M9L+QFKpRuNv2GEl5C6+6mPXSk+EZHjlT4uoB9i+QpK9yiUsR4qrKsTWxaRz5kxTznTGRgCdciZtc7dbznBp+3AvPYZ1w0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IE2spfik; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IE2spfik" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-7273b0d4409so230080a34.1; Thu, 06 Mar 2025 11:27:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289246; x=1741894046; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=C9qAzhw3nxTctIXVbKox2jFYZtYHfe7xsGKs2tJQX2s=; b=IE2spfikcHbBQdNSH26/+Kg++gjV4YfzPxLToIz3+jwC4E2e8CfqvJuZOlNOAojaCS 1EsAousJ4hb4ic4ljNxsnGL2CQadiuP7T8I6aYc0onSXzn0aQ8IL3Kd/ybIY++0c7A0S F2SiUI1ASgr3sAXM6Sbh7RDpNyBM0LZxh0ax78IhZDMqcBQvPSbCbGEXMSBvza8EZeXg 9tYZ01PheUc5L9qzj/exGiwpHXB4twBnzkH4oSC2DnSFUFpkp6iJK90KGCGjNAIJszrA fnf3hrS5FW6lhoKgH4Mdi4zWM/XVuACMXbjYrpceBfWFYlY8AiBOoIv0P0wDNwrrWof6 fAOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289246; x=1741894046; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C9qAzhw3nxTctIXVbKox2jFYZtYHfe7xsGKs2tJQX2s=; b=F8MipETtI7QAHYXk50Sipi2afkYLbXr/U905Ev4gD+Go+3b5Q/fnOvjxMK1Hd+W1yE ydU4nKtqOObxe/JTNU+khLq5CogL87MnYeNr1Z3EyZhwjHly2inaEuJjoK4dG1Rzhn0U hTgsCNl738b6G6oFvPS7gEPooHVod3JPzjJYVzwu6uPlR1BMStDadjOghtVAjG1P4CKI r/PEqMUOOexVQRu3exQmnu0TA2arC9ezNsQCsuzdf0SKx2phE7nhCvQhaE+Rb5ikDpcd UQA9LfeyQfyA1D9IzM37oD9h8CYqB6F5CHKMX7hibbvoegSUx0lx3EsTmjwgBSd/wJMg Sc5w== X-Forwarded-Encrypted: i=1; AJvYcCURn0zbRwAZpNSAgE2ubIvxhLuXc3vE3hrMrJWh0LFG8J6SOj6EZdysNmXMfpS9ZZiZg/yEFHcsFPeNlAA=@vger.kernel.org, AJvYcCWvteTSpEm9i3S5mAW5/2AVT1VkZQOZqBoxLG8Z6b/VLGm/ZzyGKcBrs8AXS24dz+YKK6f3FqvC@vger.kernel.org X-Gm-Message-State: AOJu0YxY8tjUC8uYpR0SUp2uNytwr3x84GUS38BCN8orX4mROFJd0ZY+ pZIo5LUhg6LZ6vpr2Hy8RyYMlLxRQGK2Lxl1w4NcyjvQfsiZE2bJ X-Gm-Gg: ASbGnctiYBkjK0v/EmqwAs7BUNvyYCarg/JV4Y7ii7x5aRUE4l9INny9O/5lOxBDgtr UV6XgvAVHodcE7pYBkeRDbCnD+Q8pIA9eY5f3VVaHCwDvUH5M0JqHbbkwsirbpZFKREdE6pBbfz RPjA/Zf2LYK5UH4CZJKf90p868oozcq66cMlZPKsQco3w23MpMFgF8UNpKqnthNe09oX0dz+rz+ PrBarNoSe32P+RzTudD/7YlNBT8opAWjoMik7TF3LVXvZOA+PEjgkZ7gOxMKHLoJuiRn6Z9YgZz EUG8ktvA+xMMnrR/q20niZ/JxCc/AibT9QD1vdrVmB/rOY6ddoEV9filyjpEIdCrVcigyBdTd1C YTM7bbIf0/mIy X-Google-Smtp-Source: AGHT+IGSkfkwRtWCvRSiTb+A025eXnqhWYGHuVWDmexgQXrpWsIA9iIQA5BkdwyOSk9FwrgxfudzSg== X-Received: by 2002:a05:6830:2706:b0:72a:28f6:7ec8 with SMTP id 46e09a7af769-72a37b74970mr315902a34.8.1741289245815; Thu, 06 Mar 2025 11:27:25 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:24 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 03/14] net: bcmgenet: move feature flags to bcmgenet_priv Date: Thu, 6 Mar 2025 11:26:31 -0800 Message-Id: <20250306192643.2383632-4-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The feature flags are moved and consolidated to the primary private driver structure and are now initialized from the platform device data rather than the hardware parameters to allow finer control over which platforms use which features. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 22 ++++++++++++------- .../net/ethernet/broadcom/genet/bcmgenet.h | 14 ++++++------ 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 769d920a0fc0..48830942afa8 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -3757,7 +3757,6 @@ static const struct bcmgenet_hw_params bcmgenet_hw_params_v2 = { .rdma_offset = 0x3000, .tdma_offset = 0x4000, .words_per_bd = 2, - .flags = GENET_HAS_EXT, }; static const struct bcmgenet_hw_params bcmgenet_hw_params_v3 = { @@ -3776,8 +3775,6 @@ static const struct bcmgenet_hw_params bcmgenet_hw_params_v3 = { .rdma_offset = 0x10000, .tdma_offset = 0x11000, .words_per_bd = 2, - .flags = GENET_HAS_EXT | GENET_HAS_MDIO_INTR | - GENET_HAS_MOCA_LINK_DET, }; static const struct bcmgenet_hw_params bcmgenet_hw_params_v4 = { @@ -3796,8 +3793,6 @@ static const struct bcmgenet_hw_params bcmgenet_hw_params_v4 = { .rdma_offset = 0x2000, .tdma_offset = 0x4000, .words_per_bd = 3, - .flags = GENET_HAS_40BITS | GENET_HAS_EXT | - GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, }; /* Infer hardware parameters from the detected GENET version */ @@ -3906,7 +3901,7 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) struct bcmgenet_plat_data { enum bcmgenet_version version; u32 dma_max_burst_length; - bool ephy_16nm; + u32 flags; }; static const struct bcmgenet_plat_data v1_plat_data = { @@ -3917,32 +3912,43 @@ static const struct bcmgenet_plat_data v1_plat_data = { static const struct bcmgenet_plat_data v2_plat_data = { .version = GENET_V2, .dma_max_burst_length = DMA_MAX_BURST_LENGTH, + .flags = GENET_HAS_EXT, }; static const struct bcmgenet_plat_data v3_plat_data = { .version = GENET_V3, .dma_max_burst_length = DMA_MAX_BURST_LENGTH, + .flags = GENET_HAS_EXT | GENET_HAS_MDIO_INTR | + GENET_HAS_MOCA_LINK_DET, }; static const struct bcmgenet_plat_data v4_plat_data = { .version = GENET_V4, .dma_max_burst_length = DMA_MAX_BURST_LENGTH, + .flags = GENET_HAS_40BITS | GENET_HAS_EXT | + GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, }; static const struct bcmgenet_plat_data v5_plat_data = { .version = GENET_V5, .dma_max_burst_length = DMA_MAX_BURST_LENGTH, + .flags = GENET_HAS_40BITS | GENET_HAS_EXT | + GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, }; static const struct bcmgenet_plat_data bcm2711_plat_data = { .version = GENET_V5, .dma_max_burst_length = 0x08, + .flags = GENET_HAS_40BITS | GENET_HAS_EXT | + GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET, }; static const struct bcmgenet_plat_data bcm7712_plat_data = { .version = GENET_V5, .dma_max_burst_length = DMA_MAX_BURST_LENGTH, - .ephy_16nm = true, + .flags = GENET_HAS_40BITS | GENET_HAS_EXT | + GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET | + GENET_HAS_EPHY_16NM, }; static const struct of_device_id bcmgenet_match[] = { @@ -4040,7 +4046,7 @@ static int bcmgenet_probe(struct platform_device *pdev) if (pdata) { priv->version = pdata->version; priv->dma_max_burst_length = pdata->dma_max_burst_length; - priv->ephy_16nm = pdata->ephy_16nm; + priv->flags = pdata->flags; } else { priv->version = pd->genet_version; priv->dma_max_burst_length = DMA_MAX_BURST_LENGTH; diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 9b73ae55c0d6..a7f121503ffb 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -476,6 +476,7 @@ enum bcmgenet_version { #define GENET_HAS_EXT (1 << 1) #define GENET_HAS_MDIO_INTR (1 << 2) #define GENET_HAS_MOCA_LINK_DET (1 << 3) +#define GENET_HAS_EPHY_16NM (1 << 4) /* BCMGENET hardware parameters, keep this structure nicely aligned * since it is going to be used in hot paths @@ -496,7 +497,6 @@ struct bcmgenet_hw_params { u32 rdma_offset; u32 tdma_offset; u32 words_per_bd; - u32 flags; }; struct bcmgenet_skb_cb { @@ -597,6 +597,7 @@ struct bcmgenet_priv { /* other misc variables */ const struct bcmgenet_hw_params *hw_params; + u32 flags; unsigned autoneg_pause:1; unsigned tx_pause:1; unsigned rx_pause:1; @@ -615,7 +616,6 @@ struct bcmgenet_priv { phy_interface_t phy_interface; int phy_addr; int ext_phy; - bool ephy_16nm; /* Interrupt variables */ struct work_struct bcmgenet_irq_work; @@ -652,27 +652,27 @@ struct bcmgenet_priv { static inline bool bcmgenet_has_40bits(struct bcmgenet_priv *priv) { - return !!(priv->hw_params->flags & GENET_HAS_40BITS); + return !!(priv->flags & GENET_HAS_40BITS); } static inline bool bcmgenet_has_ext(struct bcmgenet_priv *priv) { - return !!(priv->hw_params->flags & GENET_HAS_EXT); + return !!(priv->flags & GENET_HAS_EXT); } static inline bool bcmgenet_has_mdio_intr(struct bcmgenet_priv *priv) { - return !!(priv->hw_params->flags & GENET_HAS_MDIO_INTR); + return !!(priv->flags & GENET_HAS_MDIO_INTR); } static inline bool bcmgenet_has_moca_link_det(struct bcmgenet_priv *priv) { - return !!(priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET); + return !!(priv->flags & GENET_HAS_MOCA_LINK_DET); } static inline bool bcmgenet_has_ephy_16nm(struct bcmgenet_priv *priv) { - return priv->ephy_16nm; + return !!(priv->flags & GENET_HAS_EPHY_16NM); } #define GENET_IO_MACRO(name, offset) \ From patchwork Thu Mar 6 19:26:32 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005264 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oo1-f51.google.com (mail-oo1-f51.google.com [209.85.161.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 42A06277029; Thu, 6 Mar 2025 19:27:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289251; cv=none; b=e2LgZOwWFc+jAcJudeEG+rMc2theWD9s/VqZ1xOtqMQOGlhCY2mb4l7nKZig/L+4pOWeWxQxmuSqzPpAGOE6l2tm34HAJ6GKCMZnpF3tVRhgm75McUdCdMlKYpcJfmbdctq5CAhItvjHEVS3Bg2R9H02Ell6pdh7AeVsAqL1GXs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289251; c=relaxed/simple; bh=x/5U11tfFOGkJjnZlOhXzeFUNNhCZdavOEif4Ham/8k=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qqa+9Wv/2OGlDyG0I3uDzsaO5n/mIoGJJkOBKaiymPfG9XB0YSbPT1O9YFiZrftKmFRBgmmrJL0lXFuwHqoYAlt/rZtaO7ccJWl+JqDYuOdhWVWND8X+ZS2f9WUUQhqUTwySHku4oe4guF3QKTzYWiHU74J1GrOc9jHoydghuNo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CCGr7WxH; arc=none smtp.client-ip=209.85.161.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CCGr7WxH" Received: by mail-oo1-f51.google.com with SMTP id 006d021491bc7-5f4d935084aso723147eaf.2; Thu, 06 Mar 2025 11:27:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289249; x=1741894049; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2utW+gDjzlNJ1wPa7OV1/6d7rlz+gUEUoG/flq259i8=; b=CCGr7WxHYVinS4aeabwm0nav+5Uascjby9nbqm3o+DoQfvs4uSTBA3jFI6oCOuuHB3 nJ5lXCb4OYucbkn5g0xTO2dJlvUFLkFixyvhDT7yfkgWe9U2pZmpYlGKLEXuRnyko6bl g2Kj21O0jOn016ONLVOK7UbPR4awyZOfGJzx8y5GwCfbUCK97W/GdK76KAW+zFdU722w d85x0XfakbIg8hVjFil3JRnaRPmAfNnZoSaKZ8vAHrC4ykzApLnnnMjZe729M1tBl77l NHFt4ljbGDSmwLTnzPqLHNsjt6p2nDrS62cYulrtzviUXLW5z7eW2lsjcxn/696HHt6V ggLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289249; x=1741894049; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2utW+gDjzlNJ1wPa7OV1/6d7rlz+gUEUoG/flq259i8=; b=V8EkhVphya3nsPIpvidjyVmiLLrCnz5tFjNsOGwS+moo158vvrwYVi/n1J1Re0V/eo qDXZ07SV4ZkmlUNjoNQpq0+ZV3PbABtAqRYU3ZkOGuIzVRa2p6n3pFNd3h01QwwKrQnM JkcN7WiePnRy/p3tI0HqfjlPdtrwlWAJGTIHw6CdOaB+7mc5/9dAenWDbKCi7MmPokeP Vxhnbh1G+eDKb5EbJFSTno1uaN4I1OZm5cFIn5XvYEPyD+0Z3SJHPIRUPf8UMVTWOETx KR4fOOUJ3zz2QWxj+6UQHcL12DAmz2sqRjixx9HMqaZvhxH5IRxGojtd0nec4yMoHoXk WKqg== X-Forwarded-Encrypted: i=1; AJvYcCUeJ1GncFNNLZisx+AhqLGzKcJCYKmCIjFA0oJ57JYgjZCXkEeu6emaw9AQZvYgd6lWccNh1w9c@vger.kernel.org, AJvYcCW77UY+OuEsmwwqQbp8RcNixBfoL1vT2oRNvVtvqO79gqFrbFleW61UCJvkyENlXryfjxpvRbxu1l4CTgk=@vger.kernel.org X-Gm-Message-State: AOJu0YzzOMs9a3TbfXnzMmurMsWK6XKKsyYFRYNK68QfMdIOmuS88L4G QE/TOWlbGjVgU6mwKXQr1SY0rbci1VejRQZp2dyEpOf8puIY3yEm X-Gm-Gg: ASbGncvZypbOEiejQLVnbyUfb9AAHnDiVJDBGr6LrsRnrMorLr9/MoPJSjErhqqS/N/ 1rDa0u7KRSlgpUREKPxEe9ERGUH1NTRvgJNmqyQIQhQw5CaT1KWMQAj0xtrX+1l0LrWycqNZBpS aCcd7gFCuiWHeOHFNpurHQnwPk9f39yY6GvNPU3q1n7U1S2PfeyORKuLjShVegxzNlkMPOHhFur AvTVdVPOZeDn7++aGeimEdQtf6w0Q+1v0IBJffXMhKZPvLYCgjyozSUl4hb4ESifWdMHj9xc88y fIE1Ir5qbpTDVqoELQT7M2Jj3swRddmQjnzF87qELVfn+X2b6Mzn/q9xL9Y7p3uTTvOwQqm2LYA pyO/rPzhaM+W5 X-Google-Smtp-Source: AGHT+IE63b/7W2iM5rV2HL+AaPUnINq8FG+IF90UwN/FOVscVF60nUfS1S+5hWdqrWyoGclqNnPSwA== X-Received: by 2002:a05:6871:889:b0:29e:1cd8:4a0f with SMTP id 586e51a60fabf-2c261145f02mr276725fac.17.1741289249200; Thu, 06 Mar 2025 11:27:29 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:27 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 04/14] net: bcmgenet: BCM7712 is GENETv5 compatible Date: Thu, 6 Mar 2025 11:26:32 -0800 Message-Id: <20250306192643.2383632-5-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The major revision of the GENET core in the BCM7712 SoC was bumped to 7 but it is compatible with the GENETv5 implementation. This commit maps the version accordingly to avoid a warning. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 48830942afa8..e6b2a0499edb 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -3825,7 +3825,7 @@ static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv) /* Read GENET HW version */ reg = bcmgenet_sys_readl(priv, SYS_REV_CTRL); major = (reg >> 24 & 0x0f); - if (major == 6) + if (major == 6 || major == 7) major = 5; else if (major == 5) major = 4; From patchwork Thu Mar 6 19:26:33 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005265 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 71C3727811B; Thu, 6 Mar 2025 19:27:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289255; cv=none; b=MzMj0TvC9u3DVsn7w0OssLiS7i4YEzaFPn749i6iMmH7BEONe9E6v93EKjkjsuascThrWCkP5TD/kCXlUOp3Spu8/ZP2ka0JMlipV0olnalfdHRu5EfDi00fyA0Tl3dTJlkcqlJfxQidMJPKnx7UPJ17dhUP0tgxzVMyscm22L4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289255; c=relaxed/simple; bh=kjA71fy6mh2ees/0jhzGlrJmXvW4XDk0l4lvY2vJHnA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uyfwNOr/EWJWBpYQfmB3OYM7Z7CH3vzOcqTQA5pb9aHlUVHjBl8nQ20TLMZiZp6m+TlJ1z24Zf77FAKhxndh5pC7ynOT0Nf8TAYIYaC2zSeOfFnfMr4Lhn6zyanetF54MuZu2RRvYnGAJSnlwrFlDYfBx87S+oQGcaXqwaIwvwU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=USmf5/S0; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="USmf5/S0" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-7272f9b4132so625867a34.0; Thu, 06 Mar 2025 11:27:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289253; x=1741894053; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=boA8fKjCvOM7DRAOKKbkjm2FTl7v7G66pyKNtHMRT0A=; b=USmf5/S08QPC2BjlXxokFm225k8W4DFgaObYAaWiGRl/aip96dzBaWOSC1bgOOIA8d Pi49YccUPY7vEGzlK9WeTos1By4gGf243QPr1A1JhSrR1zDFPvV8NegxbdTT9dz1DRUD 1JHant/gEfX3Dy1K2YYJPH/xVPGUhzVPhLDhwVlIjJC3q8QuZ8M76PEftXrWhUw24r0t ZQ2b0Eh7S16PxHtCx04w6FpfEDKwrXyc5IQOV/ebyMTPKB663JWjNWfNeIiL/diPSa17 9POtrASsJ4C/MEP7gkBc/9x/9R3nHT7bTdSUW7GaRnZB+Q0aeVwF0yNUmcdJ2p7lCcLV cnKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289253; x=1741894053; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=boA8fKjCvOM7DRAOKKbkjm2FTl7v7G66pyKNtHMRT0A=; b=AcERwz1qoBrOUY1l6HgFmiBxJ71cNSpicPuIOJtETDK08HUqTkZ+7MM+MjOIi3h3eC W4iuVDOTwSesBxQ1UyqAdFHZwQh6wEQadgrW+3MyCQD0EfKOT/M+VMIYalXK3nZwbLKo GHTaZfgUBchkn9StqQrQFLCx5hsXRoOz0FW9OJTLiA5xGls4AK3GA4rKA2FTtn6HQWCU iVvsTKyIXuKfgjrjELxgHB2Z4oKt1s/c8PrvZFCxsvYJ+YMfJkgcD/fxoznbGIUOivan yfL2yoFJb6Bz14jxBCHegykjXrUPCAijgnOFAwAlKQds3rQPMJMvtcL/oB17dEu8CKk5 l7Dg== X-Forwarded-Encrypted: i=1; AJvYcCXBIFuLLPZdIZbgPQWeEU6JW4QsGrcYPSnmIilBinNp03yPuh544gEDTwQ8uaGEQMVSNl9tanHZ7G/7KLI=@vger.kernel.org, AJvYcCXKl2kPCnhKEXiMNFmS6TQJqwheHLCAV6JLMVrep2vOZol02GHAYF8x2GL3oCx7ulZk+i0nVCnF@vger.kernel.org X-Gm-Message-State: AOJu0YxXg4B6aAy/Ty9Hg7nRoHdmVFq1l+X/ZpBMICRk/4FxrLCNegqT S58OquOgAfTjW4R21i02rl0QfIaH/L5Lq60k5wptSdjfRNUYfFVswZKe5g== X-Gm-Gg: ASbGnctvrPPrREZdNbYUYtKn/xEJGa5zaxSpWoFJLJogOyY/bBa7mI0YYrn/ghtggSX Idp/dUYXCppNxEJ1R926iKbs3dUZlGOksztXhxTE19BSRcdlSUJrGVxd90u3KzYdsFsEZbaJEXv bCDOYTn7kqdIYtF+SEvvwqfsHylMITAaqJohqlw0j4LhWVI0ZmHdx1Pxw4p22hx56LF0ch1KYMP 3CFx9693XYaZ7LRCrKOruviYsDR0QjJN8Z1FRSVbR/k5jptzLjEOlfZeTt+Kh45MBPj56mET/jI XSXTM0D1OttecYdONINhgju0O8Hw7GW+bA0s5F2MmSVemf3+3xlyxLBShDoR6O4b7w9v6C5c3up pUWYOWW3qELQL X-Google-Smtp-Source: AGHT+IHxEYyC3Ps1XhQT6cEiMwnDoomoATFDl752jNe5PbKrTBPR8pg/FjVYh01eW2ITw7L6v87WWA== X-Received: by 2002:a05:6830:dcb:b0:727:11be:f4ae with SMTP id 46e09a7af769-72a37b3eca3mr257271a34.3.1741289252513; Thu, 06 Mar 2025 11:27:32 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:31 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 05/14] net: bcmgenet: extend bcmgenet_hfb_* API Date: Thu, 6 Mar 2025 11:26:33 -0800 Message-Id: <20250306192643.2383632-6-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Extend the bcmgenet_hfb_* API to allow initialization and programming of the Hardware Filter Block on GENET v1 and GENET v2 hardware. Programming of ethtool flows is still not supported on this older hardware. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 94 +++++++++++-------- 1 file changed, 57 insertions(+), 37 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index e6b2a0499edb..9aeb1133ffa1 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -446,33 +446,48 @@ static void bcmgenet_hfb_enable_filter(struct bcmgenet_priv *priv, u32 f_index) u32 offset; u32 reg; - offset = HFB_FLT_ENABLE_V3PLUS + (f_index < 32) * sizeof(u32); - reg = bcmgenet_hfb_reg_readl(priv, offset); - reg |= (1 << (f_index % 32)); - bcmgenet_hfb_reg_writel(priv, reg, offset); - reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); - reg |= RBUF_HFB_EN; - bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); + if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) { + reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); + reg |= (1 << ((f_index % 32) + RBUF_HFB_FILTER_EN_SHIFT)) | + RBUF_HFB_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); + } else { + offset = HFB_FLT_ENABLE_V3PLUS + (f_index < 32) * sizeof(u32); + reg = bcmgenet_hfb_reg_readl(priv, offset); + reg |= (1 << (f_index % 32)); + bcmgenet_hfb_reg_writel(priv, reg, offset); + reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); + reg |= RBUF_HFB_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); + } } static void bcmgenet_hfb_disable_filter(struct bcmgenet_priv *priv, u32 f_index) { u32 offset, reg, reg1; - offset = HFB_FLT_ENABLE_V3PLUS; - reg = bcmgenet_hfb_reg_readl(priv, offset); - reg1 = bcmgenet_hfb_reg_readl(priv, offset + sizeof(u32)); - if (f_index < 32) { - reg1 &= ~(1 << (f_index % 32)); - bcmgenet_hfb_reg_writel(priv, reg1, offset + sizeof(u32)); - } else { - reg &= ~(1 << (f_index % 32)); - bcmgenet_hfb_reg_writel(priv, reg, offset); - } - if (!reg && !reg1) { + if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) { reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); - reg &= ~RBUF_HFB_EN; + reg &= ~(1 << ((f_index % 32) + RBUF_HFB_FILTER_EN_SHIFT)); + if (!(reg & RBUF_HFB_FILTER_EN_MASK)) + reg &= ~RBUF_HFB_EN; bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); + } else { + offset = HFB_FLT_ENABLE_V3PLUS; + reg = bcmgenet_hfb_reg_readl(priv, offset); + reg1 = bcmgenet_hfb_reg_readl(priv, offset + sizeof(u32)); + if (f_index < 32) { + reg1 &= ~(1 << (f_index % 32)); + bcmgenet_hfb_reg_writel(priv, reg1, offset + sizeof(u32)); + } else { + reg &= ~(1 << (f_index % 32)); + bcmgenet_hfb_reg_writel(priv, reg, offset); + } + if (!reg && !reg1) { + reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); + reg &= ~RBUF_HFB_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); + } } } @@ -482,6 +497,9 @@ static void bcmgenet_hfb_set_filter_rx_queue_mapping(struct bcmgenet_priv *priv, u32 offset; u32 reg; + if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) + return; + offset = f_index / 8; reg = bcmgenet_rdma_readl(priv, DMA_INDEX2RING_0 + offset); reg &= ~(0xF << (4 * (f_index % 8))); @@ -495,9 +513,13 @@ static void bcmgenet_hfb_set_filter_length(struct bcmgenet_priv *priv, u32 offset; u32 reg; - offset = HFB_FLT_LEN_V3PLUS + - ((priv->hw_params->hfb_filter_cnt - 1 - f_index) / 4) * - sizeof(u32); + if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) + offset = HFB_FLT_LEN_V2; + else + offset = HFB_FLT_LEN_V3PLUS; + + offset += sizeof(u32) * + ((priv->hw_params->hfb_filter_cnt - 1 - f_index) / 4); reg = bcmgenet_hfb_reg_readl(priv, offset); reg &= ~(0xFF << (8 * (f_index % 4))); reg |= ((f_length & 0xFF) << (8 * (f_index % 4))); @@ -690,6 +712,7 @@ static void bcmgenet_hfb_clear_filter(struct bcmgenet_priv *priv, u32 f_index) { u32 base, i; + bcmgenet_hfb_set_filter_length(priv, f_index, 0); base = f_index * priv->hw_params->hfb_filter_size; for (i = 0; i < priv->hw_params->hfb_filter_size; i++) bcmgenet_hfb_writel(priv, 0x0, (base + i) * sizeof(u32)); @@ -699,19 +722,16 @@ static void bcmgenet_hfb_clear(struct bcmgenet_priv *priv) { u32 i; - if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) - return; - - bcmgenet_hfb_reg_writel(priv, 0x0, HFB_CTRL); - bcmgenet_hfb_reg_writel(priv, 0x0, HFB_FLT_ENABLE_V3PLUS); - bcmgenet_hfb_reg_writel(priv, 0x0, HFB_FLT_ENABLE_V3PLUS + 4); - - for (i = DMA_INDEX2RING_0; i <= DMA_INDEX2RING_7; i++) - bcmgenet_rdma_writel(priv, 0x0, i); + bcmgenet_hfb_reg_writel(priv, 0, HFB_CTRL); - for (i = 0; i < (priv->hw_params->hfb_filter_cnt / 4); i++) - bcmgenet_hfb_reg_writel(priv, 0x0, - HFB_FLT_LEN_V3PLUS + i * sizeof(u32)); + if (!GENET_IS_V1(priv) && !GENET_IS_V2(priv)) { + bcmgenet_hfb_reg_writel(priv, 0, + HFB_FLT_ENABLE_V3PLUS); + bcmgenet_hfb_reg_writel(priv, 0, + HFB_FLT_ENABLE_V3PLUS + 4); + for (i = DMA_INDEX2RING_0; i <= DMA_INDEX2RING_7; i++) + bcmgenet_rdma_writel(priv, 0, i); + } for (i = 0; i < priv->hw_params->hfb_filter_cnt; i++) bcmgenet_hfb_clear_filter(priv, i); @@ -722,9 +742,6 @@ static void bcmgenet_hfb_init(struct bcmgenet_priv *priv) int i; INIT_LIST_HEAD(&priv->rxnfc_list); - if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) - return; - for (i = 0; i < MAX_NUM_OF_FS_RULES; i++) { INIT_LIST_HEAD(&priv->rxnfc_rules[i].list); priv->rxnfc_rules[i].state = BCMGENET_RXNFC_STATE_UNUSED; @@ -3735,8 +3752,10 @@ static const struct bcmgenet_hw_params bcmgenet_hw_params_v1 = { .bp_in_en_shift = 16, .bp_in_mask = 0xffff, .hfb_filter_cnt = 16, + .hfb_filter_size = 64, .qtag_mask = 0x1F, .hfb_offset = 0x1000, + .hfb_reg_offset = GENET_RBUF_OFF + RBUF_HFB_CTRL_V1, .rdma_offset = 0x2000, .tdma_offset = 0x3000, .words_per_bd = 2, @@ -3750,6 +3769,7 @@ static const struct bcmgenet_hw_params bcmgenet_hw_params_v2 = { .bp_in_en_shift = 16, .bp_in_mask = 0xffff, .hfb_filter_cnt = 16, + .hfb_filter_size = 64, .qtag_mask = 0x1F, .tbuf_offset = 0x0600, .hfb_offset = 0x1000, From patchwork Thu Mar 6 19:26:34 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005266 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oi1-f180.google.com (mail-oi1-f180.google.com [209.85.167.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 285AE278171; Thu, 6 Mar 2025 19:27:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289259; cv=none; b=KMHBbZ0I56UWWqc2Su3FlzAd25utGexvrmZwyZBMvu0gL6jJj/CP6CN3kWZik2oAhA/oQiuzmt8mFkHNtJW2j4CrN6gkqzjTGGCdThRhsVkDvLUw6f3piOxyldVyOidGcFajPV4PLSKXue36PiWBnqoXpZQ4iXtnRUJKdXRe8Cc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289259; c=relaxed/simple; bh=qBxrRbfa1jMDGB4iPLVEPAtBZ1DWZEQJvNicAcw5R5w=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=k/A40WoJ0ViUyGUgN0lcL9KUB98CPDsuMQO56yUYPEboQvyGMjmq5FAvRvTHBjIHnPCxqQ5s+E3mVKmFS/kaLd9GLp4WYKR7mSBz05KPMG2h0l1rrQjxdEPM7HeUVD3Gqrg5NPWMC8RR3PbWQZkduiNhkMDzwiOudw+K9YQcCjo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LGAlAAYU; arc=none smtp.client-ip=209.85.167.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LGAlAAYU" Received: by mail-oi1-f180.google.com with SMTP id 5614622812f47-3f3edbef7d2so361372b6e.2; Thu, 06 Mar 2025 11:27:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289256; x=1741894056; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=U+W4olOQhzQClIpRPGbOJDgouRi53lzaBdLg61HYuAU=; b=LGAlAAYUl5Ai+Vm8NybOq1tcCr3fxP9zem5vZDJls5N/9BH4ijHMwoBH9S1h0Or/29 qf5O3NPD20VS+da0x6sU52LZKdZRAzSQLb6siPK4QmOF5wWsTyx01nF+Q+S8yqTHRAYO GxX3d6FixORftPEUDPhcz6PBfhvlhR8/M6uK5Soa1bUH0LNIvsfGrpdWEnIwD8363pas yhj1De61RcludzTe75zwzsKo8okj/HNcwQAM1e/NpRSdZ9i4hUi4pTouvQE3lwf3V3sq rHcALREnuMEAL445IE2c9sMHHCj3kQJSped6jRDBRdA+Juww5IdOV3WeDfzLqdIiUVlK AitA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289256; x=1741894056; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=U+W4olOQhzQClIpRPGbOJDgouRi53lzaBdLg61HYuAU=; b=sIbCR/++vUpmP83X/5GTDlQLlXIFPWVF6VyMwTSeSACl3EtLh05/2BVGprteaBzRP8 IgOwGNJ/dj4ZOAdYO6mQFoJN/pJ9zUepQ1+4YFr8+mLdbjm6Zm3OT6io+V+b4wqlpQdd /tKRwA8UCSwjtWWAD/HpBBrnvCDqqbOxgQb8JqAH2UNP4C6waVwPackUVPFSIZzBBl6y E059gfHg1tk97esuRcb8levzulTxoKr+vqxfIxAPHhU/uU7U2TjSYXOHd86lJQkz0cNT IJEH1KS/9TpmUFZqyZP8hAUZRjOsudW6vi/NbvQMPU5OJs8mGEq9egqkWlk1tPU0yPmV yoxw== X-Forwarded-Encrypted: i=1; AJvYcCUBUiJH8NiPBDBD14rtDh1EU3H5F2kmRt1C3tdEVUYP4gAil7be22NCpSbAIKSISy+Z6K+lzfMeMYxNv2A=@vger.kernel.org, AJvYcCXh/4ZpoBnbFG9VSRbSZDV6gBtnsjsuYNnQ2J/K4chP+YZZ2pq7sGSovW/Ct/NFzC7vN5jDsAMl@vger.kernel.org X-Gm-Message-State: AOJu0YyjOKOEtzak0aRSqR+gzUShBujvAwLv5S3xqFhY0GRpBpTJkFzi oP+sVZHE+qewXRgRg9D4TgR60FdgtE3hv+KDKE0/eVgPaIksTuRg X-Gm-Gg: ASbGncuiHCAeTgg2U5UlJhSYO4RchheNCLi6awFV3lGtfjLog4kQbH5cs0zJPsllh5T jApI6CutYDcYf7GdDiot5HfRUfzoc4KSYFGhvnC+uIg9KSQxYT75P7ypgpxqjuFN8OK8SZKytK5 Sk63K2TmWRT7ru1N3SYPAGSGzDAaW0zN4sSpXFtBiCQhdIZABzv96U2aErl8udEsvx4n3IuPtGW B1eoQrX+G1mf6Sjxnv1RNuvzSLym4UCUipo3jBKTxsmPnFctckW58B1qvCrg5DtCSHyLEibF5Zj J/zcYUk3az274zFXl28RSVlprwhKK2TeoNIkIaYJ0i7IcrsxP+Ohm8ukA1TGgxxpgqDba6Sh5Tf Gj9uNbfMU7cnN X-Google-Smtp-Source: AGHT+IE8f0m7E2atODzAgr4dH6irh+ChuNSp+rYwZjTe40DEfIoy2pbxWkYzTr5hW8TSXvrnvw87PQ== X-Received: by 2002:a05:6808:10c6:b0:3f4:91d:2022 with SMTP id 5614622812f47-3f697b4e2a0mr562247b6e.13.1741289256009; Thu, 06 Mar 2025 11:27:36 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:34 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 06/14] net: bcmgenet: move DESC_INDEX flow to ring 0 Date: Thu, 6 Mar 2025 11:26:34 -0800 Message-Id: <20250306192643.2383632-7-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The default transmit and receive packet handling is moved from the DESC_INDEX (i.e. 16) descriptor rings to the Ring 0 queues. This saves a fair amount of special case code by unifying the handling. A default dummy filter is enabled in the Hardware Filter Block to route default receive packets to Ring 0. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 369 +++++------------- .../net/ethernet/broadcom/genet/bcmgenet.h | 12 +- .../ethernet/broadcom/genet/bcmgenet_wol.c | 4 +- 3 files changed, 110 insertions(+), 275 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 9aeb1133ffa1..356d100b729d 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -41,15 +41,13 @@ #include "bcmgenet.h" -/* Maximum number of hardware queues, downsized if needed */ -#define GENET_MAX_MQ_CNT 4 - /* Default highest priority queue for multi queue support */ -#define GENET_Q0_PRIORITY 0 +#define GENET_Q1_PRIORITY 0 +#define GENET_Q0_PRIORITY 1 -#define GENET_Q16_RX_BD_CNT \ +#define GENET_Q0_RX_BD_CNT \ (TOTAL_DESC - priv->hw_params->rx_queues * priv->hw_params->rx_bds_per_q) -#define GENET_Q16_TX_BD_CNT \ +#define GENET_Q0_TX_BD_CNT \ (TOTAL_DESC - priv->hw_params->tx_queues * priv->hw_params->tx_bds_per_q) #define RX_BUF_LENGTH 2048 @@ -607,7 +605,7 @@ static void bcmgenet_hfb_create_rxnfc_filter(struct bcmgenet_priv *priv, u16 mask_16; size_t size; - f = fs->location; + f = fs->location + 1; if (fs->flow_type & FLOW_MAC_EXT) { bcmgenet_hfb_insert_data(priv, f, 0, &fs->h_ext.h_dest, &fs->m_ext.h_dest, @@ -689,19 +687,14 @@ static void bcmgenet_hfb_create_rxnfc_filter(struct bcmgenet_priv *priv, } bcmgenet_hfb_set_filter_length(priv, f, 2 * f_length); - if (!fs->ring_cookie || fs->ring_cookie == RX_CLS_FLOW_WAKE) { - /* Ring 0 flows can be handled by the default Descriptor Ring - * We'll map them to ring 0, but don't enable the filter - */ + if (fs->ring_cookie == RX_CLS_FLOW_WAKE) bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, 0); - rule->state = BCMGENET_RXNFC_STATE_DISABLED; - } else { + else /* Other Rx rings are direct mapped here */ bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, fs->ring_cookie); - bcmgenet_hfb_enable_filter(priv, f); - rule->state = BCMGENET_RXNFC_STATE_ENABLED; - } + bcmgenet_hfb_enable_filter(priv, f); + rule->state = BCMGENET_RXNFC_STATE_ENABLED; } /* bcmgenet_hfb_clear @@ -735,6 +728,10 @@ static void bcmgenet_hfb_clear(struct bcmgenet_priv *priv) for (i = 0; i < priv->hw_params->hfb_filter_cnt; i++) bcmgenet_hfb_clear_filter(priv, i); + + /* Enable filter 0 to send default flow to ring 0 */ + bcmgenet_hfb_set_filter_length(priv, 0, 4); + bcmgenet_hfb_enable_filter(priv, 0); } static void bcmgenet_hfb_init(struct bcmgenet_priv *priv) @@ -836,20 +833,16 @@ static int bcmgenet_get_coalesce(struct net_device *dev, unsigned int i; ec->tx_max_coalesced_frames = - bcmgenet_tdma_ring_readl(priv, DESC_INDEX, - DMA_MBUF_DONE_THRESH); + bcmgenet_tdma_ring_readl(priv, 0, DMA_MBUF_DONE_THRESH); ec->rx_max_coalesced_frames = - bcmgenet_rdma_ring_readl(priv, DESC_INDEX, - DMA_MBUF_DONE_THRESH); + bcmgenet_rdma_ring_readl(priv, 0, DMA_MBUF_DONE_THRESH); ec->rx_coalesce_usecs = - bcmgenet_rdma_readl(priv, DMA_RING16_TIMEOUT) * 8192 / 1000; + bcmgenet_rdma_readl(priv, DMA_RING0_TIMEOUT) * 8192 / 1000; - for (i = 0; i < priv->hw_params->rx_queues; i++) { + for (i = 0; i <= priv->hw_params->rx_queues; i++) { ring = &priv->rx_rings[i]; ec->use_adaptive_rx_coalesce |= ring->dim.use_dim; } - ring = &priv->rx_rings[DESC_INDEX]; - ec->use_adaptive_rx_coalesce |= ring->dim.use_dim; return 0; } @@ -919,17 +912,13 @@ static int bcmgenet_set_coalesce(struct net_device *dev, /* Program all TX queues with the same values, as there is no * ethtool knob to do coalescing on a per-queue basis */ - for (i = 0; i < priv->hw_params->tx_queues; i++) + for (i = 0; i <= priv->hw_params->tx_queues; i++) bcmgenet_tdma_ring_writel(priv, i, ec->tx_max_coalesced_frames, DMA_MBUF_DONE_THRESH); - bcmgenet_tdma_ring_writel(priv, DESC_INDEX, - ec->tx_max_coalesced_frames, - DMA_MBUF_DONE_THRESH); - for (i = 0; i < priv->hw_params->rx_queues; i++) + for (i = 0; i <= priv->hw_params->rx_queues; i++) bcmgenet_set_ring_rx_coalesce(&priv->rx_rings[i], ec); - bcmgenet_set_ring_rx_coalesce(&priv->rx_rings[DESC_INDEX], ec); return 0; } @@ -1137,7 +1126,7 @@ static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = { STAT_GENET_Q(1), STAT_GENET_Q(2), STAT_GENET_Q(3), - STAT_GENET_Q(16), + STAT_GENET_Q(4), }; #define BCMGENET_STATS_LEN ARRAY_SIZE(bcmgenet_gstrings_stats) @@ -1489,10 +1478,10 @@ static int bcmgenet_insert_flow(struct net_device *dev, loc_rule = &priv->rxnfc_rules[cmd->fs.location]; } if (loc_rule->state == BCMGENET_RXNFC_STATE_ENABLED) - bcmgenet_hfb_disable_filter(priv, cmd->fs.location); + bcmgenet_hfb_disable_filter(priv, cmd->fs.location + 1); if (loc_rule->state != BCMGENET_RXNFC_STATE_UNUSED) { list_del(&loc_rule->list); - bcmgenet_hfb_clear_filter(priv, cmd->fs.location); + bcmgenet_hfb_clear_filter(priv, cmd->fs.location + 1); } loc_rule->state = BCMGENET_RXNFC_STATE_UNUSED; memcpy(&loc_rule->fs, &cmd->fs, @@ -1522,10 +1511,10 @@ static int bcmgenet_delete_flow(struct net_device *dev, } if (rule->state == BCMGENET_RXNFC_STATE_ENABLED) - bcmgenet_hfb_disable_filter(priv, cmd->fs.location); + bcmgenet_hfb_disable_filter(priv, cmd->fs.location + 1); if (rule->state != BCMGENET_RXNFC_STATE_UNUSED) { list_del(&rule->list); - bcmgenet_hfb_clear_filter(priv, cmd->fs.location); + bcmgenet_hfb_clear_filter(priv, cmd->fs.location + 1); } rule->state = BCMGENET_RXNFC_STATE_UNUSED; memset(&rule->fs, 0, sizeof(struct ethtool_rx_flow_spec)); @@ -1776,18 +1765,6 @@ static struct enet_cb *bcmgenet_put_txcb(struct bcmgenet_priv *priv, return tx_cb_ptr; } -static inline void bcmgenet_rx_ring16_int_disable(struct bcmgenet_rx_ring *ring) -{ - bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE, - INTRL2_CPU_MASK_SET); -} - -static inline void bcmgenet_rx_ring16_int_enable(struct bcmgenet_rx_ring *ring) -{ - bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE, - INTRL2_CPU_MASK_CLEAR); -} - static inline void bcmgenet_rx_ring_int_disable(struct bcmgenet_rx_ring *ring) { bcmgenet_intrl2_1_writel(ring->priv, @@ -1802,18 +1779,6 @@ static inline void bcmgenet_rx_ring_int_enable(struct bcmgenet_rx_ring *ring) INTRL2_CPU_MASK_CLEAR); } -static inline void bcmgenet_tx_ring16_int_disable(struct bcmgenet_tx_ring *ring) -{ - bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE, - INTRL2_CPU_MASK_SET); -} - -static inline void bcmgenet_tx_ring16_int_enable(struct bcmgenet_tx_ring *ring) -{ - bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE, - INTRL2_CPU_MASK_CLEAR); -} - static inline void bcmgenet_tx_ring_int_enable(struct bcmgenet_tx_ring *ring) { bcmgenet_intrl2_1_writel(ring->priv, 1 << ring->index, @@ -1894,12 +1859,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, struct sk_buff *skb; /* Clear status before servicing to reduce spurious interrupts */ - if (ring->index == DESC_INDEX) - bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_TXDMA_DONE, - INTRL2_CPU_CLEAR); - else - bcmgenet_intrl2_1_writel(priv, (1 << ring->index), - INTRL2_CPU_CLEAR); + bcmgenet_intrl2_1_writel(priv, (1 << ring->index), INTRL2_CPU_CLEAR); /* Compute how many buffers are transmitted since last xmit call */ c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX) @@ -1933,7 +1893,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, ring->packets += pkts_compl; ring->bytes += bytes_compl; - netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->queue), + netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->index), pkts_compl, bytes_compl); return txbds_processed; @@ -1961,14 +1921,14 @@ static int bcmgenet_tx_poll(struct napi_struct *napi, int budget) spin_lock(&ring->lock); work_done = __bcmgenet_tx_reclaim(ring->priv->dev, ring); if (ring->free_bds > (MAX_SKB_FRAGS + 1)) { - txq = netdev_get_tx_queue(ring->priv->dev, ring->queue); + txq = netdev_get_tx_queue(ring->priv->dev, ring->index); netif_tx_wake_queue(txq); } spin_unlock(&ring->lock); if (work_done == 0) { napi_complete(napi); - ring->int_enable(ring); + bcmgenet_tx_ring_int_enable(ring); return 0; } @@ -1979,14 +1939,11 @@ static int bcmgenet_tx_poll(struct napi_struct *napi, int budget) static void bcmgenet_tx_reclaim_all(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); - int i; - - if (netif_is_multiqueue(dev)) { - for (i = 0; i < priv->hw_params->tx_queues; i++) - bcmgenet_tx_reclaim(dev, &priv->tx_rings[i]); - } + int i = 0; - bcmgenet_tx_reclaim(dev, &priv->tx_rings[DESC_INDEX]); + do { + bcmgenet_tx_reclaim(dev, &priv->tx_rings[i++]); + } while (i <= priv->hw_params->tx_queues && netif_is_multiqueue(dev)); } /* Reallocate the SKB to put enough headroom in front of it and insert @@ -2074,19 +2031,14 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev) index = skb_get_queue_mapping(skb); /* Mapping strategy: - * queue_mapping = 0, unclassified, packet xmited through ring16 - * queue_mapping = 1, goes to ring 0. (highest priority queue - * queue_mapping = 2, goes to ring 1. - * queue_mapping = 3, goes to ring 2. - * queue_mapping = 4, goes to ring 3. + * queue_mapping = 0, unclassified, packet xmited through ring 0 + * queue_mapping = 1, goes to ring 1. (highest priority queue) + * queue_mapping = 2, goes to ring 2. + * queue_mapping = 3, goes to ring 3. + * queue_mapping = 4, goes to ring 4. */ - if (index == 0) - index = DESC_INDEX; - else - index -= 1; - ring = &priv->tx_rings[index]; - txq = netdev_get_tx_queue(dev, ring->queue); + txq = netdev_get_tx_queue(dev, index); nr_frags = skb_shinfo(skb)->nr_frags; @@ -2259,15 +2211,8 @@ static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring, unsigned int discards; /* Clear status before servicing to reduce spurious interrupts */ - if (ring->index == DESC_INDEX) { - bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_RXDMA_DONE, - INTRL2_CPU_CLEAR); - } else { - mask = 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index); - bcmgenet_intrl2_1_writel(priv, - mask, - INTRL2_CPU_CLEAR); - } + mask = 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index); + bcmgenet_intrl2_1_writel(priv, mask, INTRL2_CPU_CLEAR); p_index = bcmgenet_rdma_ring_readl(priv, ring->index, RDMA_PROD_INDEX); @@ -2416,7 +2361,7 @@ static int bcmgenet_rx_poll(struct napi_struct *napi, int budget) if (work_done < budget) { napi_complete_done(napi, work_done); - ring->int_enable(ring); + bcmgenet_rx_ring_int_enable(ring); } if (ring->dim.use_dim) { @@ -2656,15 +2601,6 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, spin_lock_init(&ring->lock); ring->priv = priv; ring->index = index; - if (index == DESC_INDEX) { - ring->queue = 0; - ring->int_enable = bcmgenet_tx_ring16_int_enable; - ring->int_disable = bcmgenet_tx_ring16_int_disable; - } else { - ring->queue = index + 1; - ring->int_enable = bcmgenet_tx_ring_int_enable; - ring->int_disable = bcmgenet_tx_ring_int_disable; - } ring->cbs = priv->tx_cbs + start_ptr; ring->size = size; ring->clean_ptr = start_ptr; @@ -2675,8 +2611,8 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, ring->end_ptr = end_ptr - 1; ring->prod_index = 0; - /* Set flow period for ring != 16 */ - if (index != DESC_INDEX) + /* Set flow period for ring != 0 */ + if (index) flow_period_val = ENET_MAX_MTU_SIZE << 16; bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX); @@ -2714,13 +2650,6 @@ static int bcmgenet_init_rx_ring(struct bcmgenet_priv *priv, ring->priv = priv; ring->index = index; - if (index == DESC_INDEX) { - ring->int_enable = bcmgenet_rx_ring16_int_enable; - ring->int_disable = bcmgenet_rx_ring16_int_disable; - } else { - ring->int_enable = bcmgenet_rx_ring_int_enable; - ring->int_disable = bcmgenet_rx_ring_int_disable; - } ring->cbs = priv->rx_cbs + start_ptr; ring->size = size; ring->c_index = 0; @@ -2766,15 +2695,11 @@ static void bcmgenet_enable_tx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_tx_ring *ring; - for (i = 0; i < priv->hw_params->tx_queues; ++i) { + for (i = 0; i <= priv->hw_params->tx_queues; ++i) { ring = &priv->tx_rings[i]; napi_enable(&ring->napi); - ring->int_enable(ring); + bcmgenet_tx_ring_int_enable(ring); } - - ring = &priv->tx_rings[DESC_INDEX]; - napi_enable(&ring->napi); - ring->int_enable(ring); } static void bcmgenet_disable_tx_napi(struct bcmgenet_priv *priv) @@ -2782,13 +2707,10 @@ static void bcmgenet_disable_tx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_tx_ring *ring; - for (i = 0; i < priv->hw_params->tx_queues; ++i) { + for (i = 0; i <= priv->hw_params->tx_queues; ++i) { ring = &priv->tx_rings[i]; napi_disable(&ring->napi); } - - ring = &priv->tx_rings[DESC_INDEX]; - napi_disable(&ring->napi); } static void bcmgenet_fini_tx_napi(struct bcmgenet_priv *priv) @@ -2796,33 +2718,31 @@ static void bcmgenet_fini_tx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_tx_ring *ring; - for (i = 0; i < priv->hw_params->tx_queues; ++i) { + for (i = 0; i <= priv->hw_params->tx_queues; ++i) { ring = &priv->tx_rings[i]; netif_napi_del(&ring->napi); } - - ring = &priv->tx_rings[DESC_INDEX]; - netif_napi_del(&ring->napi); } /* Initialize Tx queues * - * Queues 0-3 are priority-based, each one has 32 descriptors, - * with queue 0 being the highest priority queue. + * Queues 1-4 are priority-based, each one has 32 descriptors, + * with queue 1 being the highest priority queue. * - * Queue 16 is the default Tx queue with - * GENET_Q16_TX_BD_CNT = 256 - 4 * 32 = 128 descriptors. + * Queue 0 is the default Tx queue with + * GENET_Q0_TX_BD_CNT = 256 - 4 * 32 = 128 descriptors. * * The transmit control block pool is then partitioned as follows: - * - Tx queue 0 uses tx_cbs[0..31] - * - Tx queue 1 uses tx_cbs[32..63] - * - Tx queue 2 uses tx_cbs[64..95] - * - Tx queue 3 uses tx_cbs[96..127] - * - Tx queue 16 uses tx_cbs[128..255] + * - Tx queue 0 uses tx_cbs[0..127] + * - Tx queue 1 uses tx_cbs[128..159] + * - Tx queue 2 uses tx_cbs[160..191] + * - Tx queue 3 uses tx_cbs[192..223] + * - Tx queue 4 uses tx_cbs[224..255] */ static void bcmgenet_init_tx_queues(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); + unsigned int start = 0, end = GENET_Q0_TX_BD_CNT; u32 i, dma_enable; u32 dma_ctrl, ring_cfg; u32 dma_priority[3] = {0, 0, 0}; @@ -2839,27 +2759,17 @@ static void bcmgenet_init_tx_queues(struct net_device *dev) bcmgenet_tdma_writel(priv, DMA_ARBITER_SP, DMA_ARB_CTRL); /* Initialize Tx priority queues */ - for (i = 0; i < priv->hw_params->tx_queues; i++) { - bcmgenet_init_tx_ring(priv, i, priv->hw_params->tx_bds_per_q, - i * priv->hw_params->tx_bds_per_q, - (i + 1) * priv->hw_params->tx_bds_per_q); + for (i = 0; i <= priv->hw_params->tx_queues; i++) { + bcmgenet_init_tx_ring(priv, i, end - start, start, end); + start = end; + end += priv->hw_params->tx_bds_per_q; ring_cfg |= (1 << i); dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); dma_priority[DMA_PRIO_REG_INDEX(i)] |= - ((GENET_Q0_PRIORITY + i) << DMA_PRIO_REG_SHIFT(i)); + (i ? GENET_Q1_PRIORITY : GENET_Q0_PRIORITY) + << DMA_PRIO_REG_SHIFT(i); } - /* Initialize Tx default queue 16 */ - bcmgenet_init_tx_ring(priv, DESC_INDEX, GENET_Q16_TX_BD_CNT, - priv->hw_params->tx_queues * - priv->hw_params->tx_bds_per_q, - TOTAL_DESC); - ring_cfg |= (1 << DESC_INDEX); - dma_ctrl |= (1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT)); - dma_priority[DMA_PRIO_REG_INDEX(DESC_INDEX)] |= - ((GENET_Q0_PRIORITY + priv->hw_params->tx_queues) << - DMA_PRIO_REG_SHIFT(DESC_INDEX)); - /* Set Tx queue priorities */ bcmgenet_tdma_writel(priv, dma_priority[0], DMA_PRIORITY_0); bcmgenet_tdma_writel(priv, dma_priority[1], DMA_PRIORITY_1); @@ -2879,15 +2789,11 @@ static void bcmgenet_enable_rx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_rx_ring *ring; - for (i = 0; i < priv->hw_params->rx_queues; ++i) { + for (i = 0; i <= priv->hw_params->rx_queues; ++i) { ring = &priv->rx_rings[i]; napi_enable(&ring->napi); - ring->int_enable(ring); + bcmgenet_rx_ring_int_enable(ring); } - - ring = &priv->rx_rings[DESC_INDEX]; - napi_enable(&ring->napi); - ring->int_enable(ring); } static void bcmgenet_disable_rx_napi(struct bcmgenet_priv *priv) @@ -2895,15 +2801,11 @@ static void bcmgenet_disable_rx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_rx_ring *ring; - for (i = 0; i < priv->hw_params->rx_queues; ++i) { + for (i = 0; i <= priv->hw_params->rx_queues; ++i) { ring = &priv->rx_rings[i]; napi_disable(&ring->napi); cancel_work_sync(&ring->dim.dim.work); } - - ring = &priv->rx_rings[DESC_INDEX]; - napi_disable(&ring->napi); - cancel_work_sync(&ring->dim.dim.work); } static void bcmgenet_fini_rx_napi(struct bcmgenet_priv *priv) @@ -2911,13 +2813,10 @@ static void bcmgenet_fini_rx_napi(struct bcmgenet_priv *priv) unsigned int i; struct bcmgenet_rx_ring *ring; - for (i = 0; i < priv->hw_params->rx_queues; ++i) { + for (i = 0; i <= priv->hw_params->rx_queues; ++i) { ring = &priv->rx_rings[i]; netif_napi_del(&ring->napi); } - - ring = &priv->rx_rings[DESC_INDEX]; - netif_napi_del(&ring->napi); } /* Initialize Rx queues @@ -2925,15 +2824,13 @@ static void bcmgenet_fini_rx_napi(struct bcmgenet_priv *priv) * Queues 0-15 are priority queues. Hardware Filtering Block (HFB) can be * used to direct traffic to these queues. * - * Queue 16 is the default Rx queue with GENET_Q16_RX_BD_CNT descriptors. + * Queue 0 is also the default Rx queue with GENET_Q0_RX_BD_CNT descriptors. */ static int bcmgenet_init_rx_queues(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); - u32 i; - u32 dma_enable; - u32 dma_ctrl; - u32 ring_cfg; + unsigned int start = 0, end = GENET_Q0_RX_BD_CNT; + u32 i, dma_enable, dma_ctrl = 0, ring_cfg = 0; int ret; dma_ctrl = bcmgenet_rdma_readl(priv, DMA_CTRL); @@ -2945,34 +2842,21 @@ static int bcmgenet_init_rx_queues(struct net_device *dev) ring_cfg = 0; /* Initialize Rx priority queues */ - for (i = 0; i < priv->hw_params->rx_queues; i++) { - ret = bcmgenet_init_rx_ring(priv, i, - priv->hw_params->rx_bds_per_q, - i * priv->hw_params->rx_bds_per_q, - (i + 1) * - priv->hw_params->rx_bds_per_q); + for (i = 0; i <= priv->hw_params->rx_queues; i++) { + ret = bcmgenet_init_rx_ring(priv, i, end - start, start, end); if (ret) return ret; + start = end; + end += priv->hw_params->rx_bds_per_q; ring_cfg |= (1 << i); dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); } - /* Initialize Rx default queue 16 */ - ret = bcmgenet_init_rx_ring(priv, DESC_INDEX, GENET_Q16_RX_BD_CNT, - priv->hw_params->rx_queues * - priv->hw_params->rx_bds_per_q, - TOTAL_DESC); - if (ret) - return ret; - - ring_cfg |= (1 << DESC_INDEX); - dma_ctrl |= (1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT)); - - /* Enable rings */ + /* Configure Rx queues as descriptor rings */ bcmgenet_rdma_writel(priv, ring_cfg, DMA_RING_CFG); - /* Configure ring as descriptor ring and re-enable DMA if enabled */ + /* Enable Rx rings */ if (dma_enable) dma_ctrl |= DMA_EN; bcmgenet_rdma_writel(priv, dma_ctrl, DMA_CTRL); @@ -3031,14 +2915,14 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv) } dma_ctrl = 0; - for (i = 0; i < priv->hw_params->rx_queues; i++) + for (i = 0; i <= priv->hw_params->rx_queues; i++) dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); reg = bcmgenet_rdma_readl(priv, DMA_CTRL); reg &= ~dma_ctrl; bcmgenet_rdma_writel(priv, reg, DMA_CTRL); dma_ctrl = 0; - for (i = 0; i < priv->hw_params->tx_queues; i++) + for (i = 0; i <= priv->hw_params->tx_queues; i++) dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); reg = bcmgenet_tdma_readl(priv, DMA_CTRL); reg &= ~dma_ctrl; @@ -3059,14 +2943,11 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) dev_kfree_skb(bcmgenet_free_tx_cb(&priv->pdev->dev, priv->tx_cbs + i)); - for (i = 0; i < priv->hw_params->tx_queues; i++) { - txq = netdev_get_tx_queue(priv->dev, priv->tx_rings[i].queue); + for (i = 0; i <= priv->hw_params->tx_queues; i++) { + txq = netdev_get_tx_queue(priv->dev, i); netdev_tx_reset_queue(txq); } - txq = netdev_get_tx_queue(priv->dev, priv->tx_rings[DESC_INDEX].queue); - netdev_tx_reset_queue(txq); - bcmgenet_free_rx_buffers(priv); kfree(priv->rx_cbs); kfree(priv->tx_cbs); @@ -3159,7 +3040,7 @@ static void bcmgenet_irq_task(struct work_struct *work) } -/* bcmgenet_isr1: handle Rx and Tx priority queues */ +/* bcmgenet_isr1: handle Rx and Tx queues */ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) { struct bcmgenet_priv *priv = dev_id; @@ -3178,7 +3059,7 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) "%s: IRQ=0x%x\n", __func__, status); /* Check Rx priority queue interrupts */ - for (index = 0; index < priv->hw_params->rx_queues; index++) { + for (index = 0; index <= priv->hw_params->rx_queues; index++) { if (!(status & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index))) continue; @@ -3186,20 +3067,20 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) rx_ring->dim.event_ctr++; if (likely(napi_schedule_prep(&rx_ring->napi))) { - rx_ring->int_disable(rx_ring); + bcmgenet_rx_ring_int_disable(rx_ring); __napi_schedule_irqoff(&rx_ring->napi); } } /* Check Tx priority queue interrupts */ - for (index = 0; index < priv->hw_params->tx_queues; index++) { + for (index = 0; index <= priv->hw_params->tx_queues; index++) { if (!(status & BIT(index))) continue; tx_ring = &priv->tx_rings[index]; if (likely(napi_schedule_prep(&tx_ring->napi))) { - tx_ring->int_disable(tx_ring); + bcmgenet_tx_ring_int_disable(tx_ring); __napi_schedule_irqoff(&tx_ring->napi); } } @@ -3207,12 +3088,10 @@ static irqreturn_t bcmgenet_isr1(int irq, void *dev_id) return IRQ_HANDLED; } -/* bcmgenet_isr0: handle Rx and Tx default queues + other stuff */ +/* bcmgenet_isr0: handle other stuff */ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) { struct bcmgenet_priv *priv = dev_id; - struct bcmgenet_rx_ring *rx_ring; - struct bcmgenet_tx_ring *tx_ring; unsigned int status; unsigned long flags; @@ -3226,25 +3105,6 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) netif_dbg(priv, intr, priv->dev, "IRQ=0x%x\n", status); - if (status & UMAC_IRQ_RXDMA_DONE) { - rx_ring = &priv->rx_rings[DESC_INDEX]; - rx_ring->dim.event_ctr++; - - if (likely(napi_schedule_prep(&rx_ring->napi))) { - rx_ring->int_disable(rx_ring); - __napi_schedule_irqoff(&rx_ring->napi); - } - } - - if (status & UMAC_IRQ_TXDMA_DONE) { - tx_ring = &priv->tx_rings[DESC_INDEX]; - - if (likely(napi_schedule_prep(&tx_ring->napi))) { - tx_ring->int_disable(tx_ring); - __napi_schedule_irqoff(&tx_ring->napi); - } - } - if (bcmgenet_has_mdio_intr(priv) && status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { wake_up(&priv->wq); @@ -3310,15 +3170,15 @@ static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) u32 dma_ctrl; /* disable DMA */ - dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; - for (i = 0; i < priv->hw_params->tx_queues; i++) + dma_ctrl = DMA_EN; + for (i = 0; i <= priv->hw_params->tx_queues; i++) dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); reg = bcmgenet_tdma_readl(priv, DMA_CTRL); reg &= ~dma_ctrl; bcmgenet_tdma_writel(priv, reg, DMA_CTRL); - dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; - for (i = 0; i < priv->hw_params->rx_queues; i++) + dma_ctrl = DMA_EN; + for (i = 0; i <= priv->hw_params->rx_queues; i++) dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); reg = bcmgenet_rdma_readl(priv, DMA_CTRL); reg &= ~dma_ctrl; @@ -3401,6 +3261,9 @@ static int bcmgenet_open(struct net_device *dev) bcmgenet_set_hw_addr(priv, dev->dev_addr); + /* HFB init */ + bcmgenet_hfb_init(priv); + /* Disable RX/TX DMA and flush TX and RX queues */ dma_ctrl = bcmgenet_dma_disable(priv, true); @@ -3411,12 +3274,8 @@ static int bcmgenet_open(struct net_device *dev) goto err_clk_disable; } - /* Always enable ring 16 - descriptor ring */ bcmgenet_enable_dma(priv, dma_ctrl); - /* HFB init */ - bcmgenet_hfb_init(priv); - ret = request_irq(priv->irq0, bcmgenet_isr0, IRQF_SHARED, dev->name, priv); if (ret < 0) { @@ -3523,16 +3382,11 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) if (!netif_msg_tx_err(priv)) return; - txq = netdev_get_tx_queue(priv->dev, ring->queue); + txq = netdev_get_tx_queue(priv->dev, ring->index); spin_lock(&ring->lock); - if (ring->index == DESC_INDEX) { - intsts = ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS); - intmsk = UMAC_IRQ_TXDMA_DONE | UMAC_IRQ_TXDMA_MBDONE; - } else { - intsts = ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS); - intmsk = 1 << ring->index; - } + intsts = ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS); + intmsk = 1 << ring->index; c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX); p_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_PROD_INDEX); txq_stopped = netif_tx_queue_stopped(txq); @@ -3546,7 +3400,7 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) "(sw)c_index: %d (hw)c_index: %d\n" "(sw)clean_p: %d (sw)write_p: %d\n" "(sw)cb_ptr: %d (sw)end_ptr: %d\n", - ring->index, ring->queue, + ring->index, ring->index, txq_stopped ? "stopped" : "active", intsts & intmsk ? "enabled" : "disabled", free_bds, ring->size, @@ -3559,25 +3413,20 @@ static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring) static void bcmgenet_timeout(struct net_device *dev, unsigned int txqueue) { struct bcmgenet_priv *priv = netdev_priv(dev); - u32 int0_enable = 0; u32 int1_enable = 0; unsigned int q; netif_dbg(priv, tx_err, dev, "bcmgenet_timeout\n"); - for (q = 0; q < priv->hw_params->tx_queues; q++) + for (q = 0; q <= priv->hw_params->tx_queues; q++) bcmgenet_dump_tx_queue(&priv->tx_rings[q]); - bcmgenet_dump_tx_queue(&priv->tx_rings[DESC_INDEX]); bcmgenet_tx_reclaim_all(dev); - for (q = 0; q < priv->hw_params->tx_queues; q++) + for (q = 0; q <= priv->hw_params->tx_queues; q++) int1_enable |= (1 << q); - int0_enable = UMAC_IRQ_TXDMA_DONE; - /* Re-enable TX interrupts if disabled */ - bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR); bcmgenet_intrl2_1_writel(priv, int1_enable, INTRL2_CPU_MASK_CLEAR); netif_trans_update(dev); @@ -3681,16 +3530,13 @@ static struct net_device_stats *bcmgenet_get_stats(struct net_device *dev) struct bcmgenet_rx_ring *rx_ring; unsigned int q; - for (q = 0; q < priv->hw_params->tx_queues; q++) { + for (q = 0; q <= priv->hw_params->tx_queues; q++) { tx_ring = &priv->tx_rings[q]; tx_bytes += tx_ring->bytes; tx_packets += tx_ring->packets; } - tx_ring = &priv->tx_rings[DESC_INDEX]; - tx_bytes += tx_ring->bytes; - tx_packets += tx_ring->packets; - for (q = 0; q < priv->hw_params->rx_queues; q++) { + for (q = 0; q <= priv->hw_params->rx_queues; q++) { rx_ring = &priv->rx_rings[q]; rx_bytes += rx_ring->bytes; @@ -3698,11 +3544,6 @@ static struct net_device_stats *bcmgenet_get_stats(struct net_device *dev) rx_errors += rx_ring->errors; rx_dropped += rx_ring->dropped; } - rx_ring = &priv->rx_rings[DESC_INDEX]; - rx_bytes += rx_ring->bytes; - rx_packets += rx_ring->packets; - rx_errors += rx_ring->errors; - rx_dropped += rx_ring->dropped; dev->stats.tx_bytes = tx_bytes; dev->stats.tx_packets = tx_packets; @@ -4141,16 +3982,13 @@ static int bcmgenet_probe(struct platform_device *pdev) if (err) goto err_clk_disable; - /* setup number of real queues + 1 (GENET_V1 has 0 hardware queues - * just the ring 16 descriptor based TX - */ + /* setup number of real queues + 1 */ netif_set_real_num_tx_queues(priv->dev, priv->hw_params->tx_queues + 1); netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1); /* Set default coalescing parameters */ - for (i = 0; i < priv->hw_params->rx_queues; i++) + for (i = 0; i <= priv->hw_params->rx_queues; i++) priv->rx_rings[i].rx_max_coalesced_frames = 1; - priv->rx_rings[DESC_INDEX].rx_max_coalesced_frames = 1; /* libphy will determine the link state */ netif_carrier_off(dev); @@ -4273,7 +4111,6 @@ static int bcmgenet_resume(struct device *d) goto out_clk_disable; } - /* Always enable ring 16 - descriptor ring */ bcmgenet_enable_dma(priv, dma_ctrl); if (!device_may_wakeup(d)) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index a7f121503ffb..926523d019db 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -18,6 +18,9 @@ #include "../unimac.h" +/* Maximum number of hardware queues, downsized if needed */ +#define GENET_MAX_MQ_CNT 4 + /* total number of Buffer Descriptors, same for Rx/Tx */ #define TOTAL_DESC 256 @@ -513,7 +516,6 @@ struct bcmgenet_tx_ring { unsigned long packets; unsigned long bytes; unsigned int index; /* ring index */ - unsigned int queue; /* queue index */ struct enet_cb *cbs; /* tx ring buffer control block*/ unsigned int size; /* size of each tx ring */ unsigned int clean_ptr; /* Tx ring clean pointer */ @@ -523,8 +525,6 @@ struct bcmgenet_tx_ring { unsigned int prod_index; /* Tx ring producer index SW copy */ unsigned int cb_ptr; /* Tx ring initial CB ptr */ unsigned int end_ptr; /* Tx ring end CB ptr */ - void (*int_enable)(struct bcmgenet_tx_ring *); - void (*int_disable)(struct bcmgenet_tx_ring *); struct bcmgenet_priv *priv; }; @@ -553,8 +553,6 @@ struct bcmgenet_rx_ring { struct bcmgenet_net_dim dim; u32 rx_max_coalesced_frames; u32 rx_coalesce_usecs; - void (*int_enable)(struct bcmgenet_rx_ring *); - void (*int_disable)(struct bcmgenet_rx_ring *); struct bcmgenet_priv *priv; }; @@ -583,7 +581,7 @@ struct bcmgenet_priv { struct enet_cb *tx_cbs; unsigned int num_tx_bds; - struct bcmgenet_tx_ring tx_rings[DESC_INDEX + 1]; + struct bcmgenet_tx_ring tx_rings[GENET_MAX_MQ_CNT + 1]; /* receive variables */ void __iomem *rx_bds; @@ -593,7 +591,7 @@ struct bcmgenet_priv { struct bcmgenet_rxnfc_rule rxnfc_rules[MAX_NUM_OF_FS_RULES]; struct list_head rxnfc_list; - struct bcmgenet_rx_ring rx_rings[DESC_INDEX + 1]; + struct bcmgenet_rx_ring rx_rings[GENET_MAX_MQ_CNT + 1]; /* other misc variables */ const struct bcmgenet_hw_params *hw_params; diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c index 3b082114f2e5..f37665ce40cb 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c @@ -2,7 +2,7 @@ /* * Broadcom GENET (Gigabit Ethernet) Wake-on-LAN support * - * Copyright (c) 2014-2024 Broadcom + * Copyright (c) 2014-2025 Broadcom */ #define pr_fmt(fmt) "bcmgenet_wol: " fmt @@ -180,7 +180,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, if (priv->wolopts & WAKE_FILTER) { list_for_each_entry(rule, &priv->rxnfc_list, list) if (rule->fs.ring_cookie == RX_CLS_FLOW_WAKE) - hfb_enable |= (1 << rule->fs.location); + hfb_enable |= (1 << (rule->fs.location + 1)); reg = (hfb_ctrl_reg & ~RBUF_HFB_EN) | RBUF_ACPI_EN; bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); } From patchwork Thu Mar 6 19:26:35 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005267 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oi1-f176.google.com (mail-oi1-f176.google.com [209.85.167.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9981327817F; Thu, 6 Mar 2025 19:27:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289261; cv=none; b=CVgyh2ziQTHcqTV9aYF3E4OLsTYMtWtkdwmNTrifOzpuBILjzid439sRa6T7oN73dYiqU70Qpy603D6N3qBt6xYqTPUMedn3CgjJd5SP5mUiUPz29ZqxpVG+NfNNKaKqQYD/pDbI1sbgVh7TzAylh06a10GykiG8rVBXE67U8jg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289261; c=relaxed/simple; bh=Cm6vDyUbIrIQxat63MdKJ7WZRrhzlrOMj14ySEYOLYI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=A9y5RDjpXYMwiHydiwDzbd7BRfQeJtuZ8aWvDi4LZoRlSJdFpUS+IyH0Anep7Nm8G0fqH3V8ysUF+wRFJCx9ArCA24WjxbkqPhk0qpJIWGAbG8N2aYDYBgMr0kFNSImRS8tOCpdYgGscoRb6aiccZ9LViYdkPSrbkv6W6m9ZN9I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=kZ3oseEX; arc=none smtp.client-ip=209.85.167.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kZ3oseEX" Received: by mail-oi1-f176.google.com with SMTP id 5614622812f47-3f546cbf71cso582137b6e.0; Thu, 06 Mar 2025 11:27:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289258; x=1741894058; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ULS7Fd+mRkc1O4hEOntwhPuCIIRXdsFwT4SYy2nMfAg=; b=kZ3oseEXuPqujXsxT4zQ56MAsiPOUewPwNPvQTQ7SlPIkTvcDTKm7sVkh2Eff+dolo CZO/xJEV8k3fmm3Fihh1vrMOEs8HkH+NvWS9rNv3/ewEwfPYLL4tMsKXHOH6wSDksf29 xEup+kVfHiTaeVLKrc50ZHfO6IR8FOOMECxI7AgN0gbqneIGU4E8yRIsLhJZ/Z2MFK/4 qvB7uIH5yvf8JZNJe5yALDe9usErbHE5BLKVVzNzPcca+B9Rlubl77P9tUcA4j/zV1Qh hfPqJt1WBY2ZB9bEYBEaaQu1GtZlqmWCzQSAyUwec3CSMKUqeMwya2Cd4XPgItcIllHh 2UkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289258; x=1741894058; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ULS7Fd+mRkc1O4hEOntwhPuCIIRXdsFwT4SYy2nMfAg=; b=IFwkHTXPr/L2O+zVrYzv34HC+Imaq9fLwfvjjlbHgSztIR54Ilv6P2aLgewS58CLKL P44p0dZl5o0Iy6KOT6uc3dTZ9s4QuRLgVw7GnXRhi3CLvlOdgd+0vu1h6G2Hd4095buL GVsjAG8uzaoM1Pk3/8Kt2UHxpOtviCMlLTsnioIE1kEwlpKor3ykHL6rxDjtz5Y9pDFL GjIv6RdaZBk2mT7BW5bs52m7HoN3WHCAf6JFVXMWXw/f5o5tmXQFbLQN9wyCb0Lk1clA M9NuUN0GkPsToCblaHeQMpWoZ2OA8PEiQ/BGzWHRXC3avEYlta2vyJxhlTj0jiuGgqSE P1Qw== X-Forwarded-Encrypted: i=1; AJvYcCW/pRH3/sbuU/6p//w7WVTR42yDGN6FZrXnAiT8kr/Pm36EBMxLIUO9Dumr4cWjwnDSUS8K4Y+h@vger.kernel.org, AJvYcCXysGgG8AHfSOMfiZeOx7FKh5qhl0OAmVnAtbausVtsFZE2igNtQOP5RCrONbaJBPSDWHscdL+R1+5JDz8=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/Cu/hM7zArf2sK81sdzJ9jmXKFzt/TngDpwGBFkS98cmOeHs8 /n/E+0eDhubZhYAsvj0AKWjpl4ssQOVV6Usqnha+0euip3MAkzuP1/EcBA== X-Gm-Gg: ASbGncvw0OxjoeqZcyN2jThJOHzqe7k5yA+KpGeAw8yaanFiuYHbsgM8HvXw2D0HFg2 9AGHUi9gbI0W2zGX5hGBrHshPHn9+SNOXVYrdYy5cxV11chnIw9gndOkjMbdMc9RDNGYzd0EK1U +is7U47aE89wdaN9vJ97Nn6ZcHtaZN6jIebyZtRl7RDoWg14AAjfCbQFhIW9AQFLbMnGkvFmupq Vme9y9MukYcvBpZuJATfnOZpune5wnvkWawjb+NMrAdJvdhQUL00iwB4vZR4U+hAX2ywWCYmxX+ ItXH3/q7JJAGV2P4UdLtXrNtl6KFeo7M0W9TrEz3QWzJrZWe1b684Qx73aIoVTylnz9H/YTtGUy IZkpzCFucN/Xn X-Google-Smtp-Source: AGHT+IFvgnOmILvFKHnH8JqHLGeAQSPz8LbYx1PSwc+/4ej8LxCkVZZs39j2tc7OgMxg4YaV7oK63A== X-Received: by 2002:a05:6808:130e:b0:3f6:787d:69f5 with SMTP id 5614622812f47-3f697b61ac4mr460283b6e.23.1741289258507; Thu, 06 Mar 2025 11:27:38 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:37 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 07/14] net: bcmgenet: add support for RX_CLS_FLOW_DISC Date: Thu, 6 Mar 2025 11:26:35 -0800 Message-Id: <20250306192643.2383632-8-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Now that the DESC_INDEX ring descriptor is no longer used we can enable hardware discarding of flows by routing them to a queue that is not enabled. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 356d100b729d..ea575e5ae499 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -599,7 +599,7 @@ static void bcmgenet_hfb_create_rxnfc_filter(struct bcmgenet_priv *priv, struct bcmgenet_rxnfc_rule *rule) { struct ethtool_rx_flow_spec *fs = &rule->fs; - u32 offset = 0, f_length = 0, f; + u32 offset = 0, f_length = 0, f, q; u8 val_8, mask_8; __be16 val_16; u16 mask_16; @@ -688,11 +688,13 @@ static void bcmgenet_hfb_create_rxnfc_filter(struct bcmgenet_priv *priv, bcmgenet_hfb_set_filter_length(priv, f, 2 * f_length); if (fs->ring_cookie == RX_CLS_FLOW_WAKE) - bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, 0); + q = 0; + else if (fs->ring_cookie == RX_CLS_FLOW_DISC) + q = priv->hw_params->rx_queues + 1; else /* Other Rx rings are direct mapped here */ - bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, - fs->ring_cookie); + q = fs->ring_cookie; + bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, q); bcmgenet_hfb_enable_filter(priv, f); rule->state = BCMGENET_RXNFC_STATE_ENABLED; } @@ -1444,7 +1446,8 @@ static int bcmgenet_insert_flow(struct net_device *dev, } if (cmd->fs.ring_cookie > priv->hw_params->rx_queues && - cmd->fs.ring_cookie != RX_CLS_FLOW_WAKE) { + cmd->fs.ring_cookie != RX_CLS_FLOW_WAKE && + cmd->fs.ring_cookie != RX_CLS_FLOW_DISC) { netdev_err(dev, "rxnfc: Unsupported action (%llu)\n", cmd->fs.ring_cookie); return -EINVAL; From patchwork Thu Mar 6 19:26:36 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005268 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f53.google.com (mail-ot1-f53.google.com [209.85.210.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F087C27BF63; Thu, 6 Mar 2025 19:27:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289263; cv=none; b=NVaBMK6UC8O+3lSCxIOotCTgIzGLRAOwu3Z6FzmPJkOIsCjDnes8CWeSK0qzpWcxUf6MevOz4zpYJeGlMpXDn+sPNJOIkyDgsTRZsT95fKK8/5jH1Asm3ytHRvKuw80jozvYgyMRE4gb8IcgUhsXCzEuW5iwxdCv03PK+OKaKMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289263; c=relaxed/simple; bh=eAIRLUnMOIy1RnBtSNDWW2wc6RIAjYLBCvYCJxZGoJM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uJxAGGKqZtWW2ma/ti14Yz34ohGwZLWydsvMP1bruizfJrxFxkFNYBNBunGfFyBu8WePhiykEY2x5fUrlq/3hQKe/QzAZwI7ZvUCQiAQaDywJX/0h8a0WEd/QEFJ8+VLSkJYEQSKJQrJoTrBZK3qOXsEK/XlFejJ6v/x0QEGzqg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Fky3Yh7/; arc=none smtp.client-ip=209.85.210.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Fky3Yh7/" Received: by mail-ot1-f53.google.com with SMTP id 46e09a7af769-7273f35b201so549003a34.1; Thu, 06 Mar 2025 11:27:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289261; x=1741894061; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=uRanwQs724yOc2GriHumEsvu9jf1tyt+mqhjv2htax0=; b=Fky3Yh7/S1y1yEryo8G83urmu/e5cvEsFcSkw9GardjhnJ/wC4/icGWjE1J8IUZO7B EUIiy9F8DMGgvpCSGc45Ki+xBEjNolSXcMp7GFKiWmIrLrywuaZjjJvOzbwQSYlyqgW1 vyaSwDBlRKk/P11JQS2MvUEaeAbPV1LrDtyuWO7FVSyKnkfda0MKKQxDnjQ6FKTjwS+O xrWfaLNoqmNLj5fOka5pgf77WoQUI/7Yk0idrhjEsOpCBmBd5C3+7eOo+HQZ+I3M0Jea v+3jTd8wNZVohq4QexkgCZxE/vUIguuQkkFo+EyNiv6GuFlckoO+kIr8Wmo7i37Toy+B FRWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289261; x=1741894061; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uRanwQs724yOc2GriHumEsvu9jf1tyt+mqhjv2htax0=; b=LvWwpA9UI/jFliYTQONAZhPuONCKZknHQgwZiGm3n1Uqd8ER90/gr8WvghNWWxLP5O NkvJEd6x8CjYXMpUodQdjr5TSrXpRcnY0AYGgCQHIZE3r7O8j+RqrZfd5uNEjRj3obPM 6wLrLVqsVyshEQPakryHF+KutK48FgoT0x2S2WerSL0Xz8YzAATifFWw+ZqffWb+TEHg Y3tod6OldgjHls9LYVWJ5YFxDahB5mTaQJk2YN63XFIX9s0PDm7vfxGWOYkBxPJ7HDVd Bxmh1JETbwc9HBF5GVsdu2SbjW6EvpvFD8CI/esJ5GoEsf00vePG99nw2DNaIRfCnSyJ JSdQ== X-Forwarded-Encrypted: i=1; AJvYcCWfFxO2lzAwCs1706J2UiVzHwl2rAOxtYB9P2GlnvUN8Blld++u5nJJOOULLv/M5rrS1FX2ZLuvIQqBUp4=@vger.kernel.org, AJvYcCXHo00vp5dKtV6l4hkUFm10V6ZjxL0YtObiwPNRxrZi+GP/yii6vh61nnTFl5ADu3wX8AkHhjZR@vger.kernel.org X-Gm-Message-State: AOJu0Yxz3NnBXTi0xZOh9xecElRqAbUwaJZXE/sS28ZWNgfO3C+QVXyE Gb/P6uDVIFhB9C50HisI9j3sLGUR+Jx3GYRD/ImnjNa9Q8qIhDCu X-Gm-Gg: ASbGncsAiTI5mild9R1q4qv6PvaER4nhaJ9D65HH9khNm2WRDTubq4fEm0onvjQMiMs 3nOfRxveqRdoNDLSpgPj5U5ebDlgM/pJEue8Jkt3kUvTv7rTiBUk5jobciZg5nUlamYhn87+6Xx qfZUCOULjWNsULFw29s9ced/0vVsCJppmoWy8B88Khya6FDfuL98a94dp/iE/ZgARjr3bQz5jXu Oc0NrFKpA7JhMo5SkhhNWr+gCaedr8caabancBTCFHDzjjSzSjAX+P6VeVpwLQdUA8RBLG62JVC GPujdRMEMBhyrNKIZKnMxWP6ZIsccMqqcGLSl8e3dmQmdPJ2k+g6/4WbsR9Zl3HFYh5T/fCL79t PrUPAkBWfzab+ X-Google-Smtp-Source: AGHT+IFDrCQJLcQ967DjPI6NPCo2uO0jc2enNTfqg0NMgR1eMxSXFU7468V3Mt4rrM2gplQpW2HU7A== X-Received: by 2002:a05:6830:2aa8:b0:71f:c1df:121e with SMTP id 46e09a7af769-72a37b703c8mr357448a34.8.1741289261041; Thu, 06 Mar 2025 11:27:41 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:40 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 08/14] net: bcmgenet: remove dma_ctrl argument Date: Thu, 6 Mar 2025 11:26:36 -0800 Message-Id: <20250306192643.2383632-9-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org Since the individual queues manage their own DMA enables there is no need to return dma_ctrl from bcmgenet_dma_disable() and pass it back to bcmgenet_enable_dma(). Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index ea575e5ae499..56fe4526c479 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -3165,8 +3165,7 @@ static void bcmgenet_get_hw_addr(struct bcmgenet_priv *priv, put_unaligned_be16(addr_tmp, &addr[4]); } -/* Returns a reusable dma control register value */ -static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) +static void bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) { unsigned int i; u32 reg; @@ -3198,20 +3197,18 @@ static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) bcmgenet_rbuf_ctrl_set(priv, reg); udelay(10); } - - return dma_ctrl; } -static void bcmgenet_enable_dma(struct bcmgenet_priv *priv, u32 dma_ctrl) +static void bcmgenet_enable_dma(struct bcmgenet_priv *priv) { u32 reg; reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg |= dma_ctrl; + reg |= DMA_EN; bcmgenet_rdma_writel(priv, reg, DMA_CTRL); reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg |= dma_ctrl; + reg |= DMA_EN; bcmgenet_tdma_writel(priv, reg, DMA_CTRL); } @@ -3238,7 +3235,6 @@ static void bcmgenet_netif_start(struct net_device *dev) static int bcmgenet_open(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); - unsigned long dma_ctrl; int ret; netif_dbg(priv, ifup, dev, "bcmgenet_open\n"); @@ -3268,7 +3264,7 @@ static int bcmgenet_open(struct net_device *dev) bcmgenet_hfb_init(priv); /* Disable RX/TX DMA and flush TX and RX queues */ - dma_ctrl = bcmgenet_dma_disable(priv, true); + bcmgenet_dma_disable(priv, true); /* Reinitialize TDMA and RDMA and SW housekeeping */ ret = bcmgenet_init_dma(priv); @@ -3277,7 +3273,7 @@ static int bcmgenet_open(struct net_device *dev) goto err_clk_disable; } - bcmgenet_enable_dma(priv, dma_ctrl); + bcmgenet_enable_dma(priv); ret = request_irq(priv->irq0, bcmgenet_isr0, IRQF_SHARED, dev->name, priv); @@ -4067,7 +4063,6 @@ static int bcmgenet_resume(struct device *d) struct net_device *dev = dev_get_drvdata(d); struct bcmgenet_priv *priv = netdev_priv(dev); struct bcmgenet_rxnfc_rule *rule; - unsigned long dma_ctrl; int ret; if (!netif_running(dev)) @@ -4105,7 +4100,7 @@ static int bcmgenet_resume(struct device *d) bcmgenet_hfb_create_rxnfc_filter(priv, rule); /* Disable RX/TX DMA and flush TX queues */ - dma_ctrl = bcmgenet_dma_disable(priv, false); + bcmgenet_dma_disable(priv, false); /* Reinitialize TDMA and RDMA and SW housekeeping */ ret = bcmgenet_init_dma(priv); @@ -4114,7 +4109,7 @@ static int bcmgenet_resume(struct device *d) goto out_clk_disable; } - bcmgenet_enable_dma(priv, dma_ctrl); + bcmgenet_enable_dma(priv); if (!device_may_wakeup(d)) phy_resume(dev->phydev); From patchwork Thu Mar 6 19:26:37 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005269 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f42.google.com (mail-ot1-f42.google.com [209.85.210.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A83D327C15B; Thu, 6 Mar 2025 19:27:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289266; cv=none; b=brrtra8jTpWxHjcffpfPd3ziE1g5yqXMl4mNbeCEpY3vd0LE1dzgRGnw1rjpb8KmD4l/yfnSNomGaaC0XudtirTnPz4X6ZdphUhHG+E+oesKCCGzDhdsU3dMLcUWBDvt6twJ3pN8MjGvoKLXyXxMdcoz/tvQijYqD6yjzEqlV98= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289266; c=relaxed/simple; bh=cDQBUZ4vsh0uEqo//EJmBSnxR24vO41IdLmkwkJ3UEI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ITXdchb1+PDd3ifqlMM2Z+5TbokzndGI7f1wX0RX9T9M2bXVbdWR3WwMOwpPnzjkp3eZYuAn0bSiu2js1loPg6bdctXV/u4g8wiuwGfBTBZ/34yN7wC5fJRe8GbnpEn6AF1pZ0LqDyDgqZ+q5xzf2v8A5bEISAzSqYORMZkumcs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=k5sDdk+e; arc=none smtp.client-ip=209.85.210.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="k5sDdk+e" Received: by mail-ot1-f42.google.com with SMTP id 46e09a7af769-72a145521d6so693753a34.3; Thu, 06 Mar 2025 11:27:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289264; x=1741894064; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=YK0HGLfFBpaEaEqoY3z8srPfy6JhsjSNgjSfTR05B2A=; b=k5sDdk+ergmxYUnke1MpWqUgnfjFkEaqbow9s1GxBfU8KDLZP61AbzKVe6kF74Bv/Z e+1f1HBT/mExdvPqaT2DRAoDVrJjCEznV9snOHcenxjuprmPACUH8e4PNntR6Pvvs3Vx P8mRtvvUlj39zUhvD7OfuydGWM0mcoeFWv0IITWaN/DjiWoOIc9QWLjW8zGyilqmtuKv tUYI2Wxe9/qbSiSuUYdeRu4P3BJqIwCa/vlkptPF6NISXK6cpGckAV8mz+FoAdj8mwOr Ct2xr2I8Pmhfd13OpkIxadK/qrZDDfSonBRVUBo2N+RbXJeGHhEQbW0+h26U1UhK3h4S UBIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289264; x=1741894064; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YK0HGLfFBpaEaEqoY3z8srPfy6JhsjSNgjSfTR05B2A=; b=LhhrcZ6uwgRKvYsTgomZPzXRsaQV4i4fCQHXYdWSOrc9DXz0ssPVyq4fT3u/VlkKAy DZTU4LPCtkeI8PQ5D4hmIl9uq5JKzCrGC6RPx8ax99Ls/Ujjz3OW09ZAU5o+dKpYWlpv prHKSnEFFgTftn1mysPcFdT7WXerZ2DWPfx74T0IExFyZpwIwwCyDT60TFLnIk4NVlp+ MgYI55zD4lRLbZgLQH73+/0rXHr6bQ2YxlDzW3l3wtQcvDU+NKNdlGJtCu26NEIQ394K 6QVgE2c55b+mXwN9Gk6qL4c1Wibce7DtAEodmibwqHFpiOWwm43niB+hYhghc04qAytt cFnQ== X-Forwarded-Encrypted: i=1; AJvYcCVQav9P7YtaiVBTtZRtQTZYl+FhzePHhIbBTpXo3dosI7mH21iuvPTqgS2GVxoE1lXq2PtIg+Lb@vger.kernel.org, AJvYcCW3KXBXMindJ3LkEfRlIJs7r+8i3sjegmVSRapqhx4Ac8pd0UT2nq8qqUQyLbjOV7CbW93sMK5yZnxGHSo=@vger.kernel.org X-Gm-Message-State: AOJu0YzRSqInyiqqdcKQ2xLIIK5E7V9qIr4t/C65Iq5Wc47M6zTgW9GA Bk6dQssoyZvPWjfy9/a0OGeXg4eEzUx2M9JJJVk+P2dhg5WG+TdErOHGVg== X-Gm-Gg: ASbGncsQlmgw8Dn6WLZlRinqji9Uc/dlLvAoAAFlQMh3n7ZvUAu069hsyUJgvPr0MSo IYwBWD5bjuASiuNLIW4Wwv2cDp7Id7ktsWQ5M1+uk0O3BpE+PqWymlwbrmDGEOkLMp0Ak++KNND 2EW++1xLq6h6pB4uYLpjJX/MVx2FOCCaQiNEZB3EcBqfCbWOQ+ihStLhja57i2LuIolv1OL2TkF LudUDzTByG3jvGjr2DOBuGVRAqGy+fIcAnOHci0E9uIn6yJ3MNtnYkM8stptMJIJkWfHLOwz+Hl UQJvWO13NDbrZGje0rD3dKFp0b7UCEQS1TpjVi4xDdM07wylKnCv+tAPDOvSfq9wewR1YQ7rrSC 1qoQucPviFE0E X-Google-Smtp-Source: AGHT+IHj+nGMSb1hday2p6jieEvSWrklRXCokM4eW0XYruxL28Iw1APbNwm4atQxfoHuRG2uKpLnHA== X-Received: by 2002:a05:6830:6f42:b0:72a:1648:445b with SMTP id 46e09a7af769-72a37b3deabmr271693a34.1.1741289263655; Thu, 06 Mar 2025 11:27:43 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:42 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 09/14] net: bcmgenet: consolidate dma initialization Date: Thu, 6 Mar 2025 11:26:37 -0800 Message-Id: <20250306192643.2383632-10-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The functions bcmgenet_dma_disable and bcmgenet_enable_dma are only used as part of dma initialization. Their functionality is moved inside bcmgenet_init_dma and the functions are removed. Since the dma is always disabled inside of bcmgenet_init_dma, the initialization functions bcmgenet_init_rx_queues and bcmgenet_init_tx_queues no longer need to attempt to manage its state. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 150 +++++++----------- 1 file changed, 54 insertions(+), 96 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 56fe4526c479..ca936a7e7753 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2746,17 +2746,7 @@ static void bcmgenet_init_tx_queues(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); unsigned int start = 0, end = GENET_Q0_TX_BD_CNT; - u32 i, dma_enable; - u32 dma_ctrl, ring_cfg; - u32 dma_priority[3] = {0, 0, 0}; - - dma_ctrl = bcmgenet_tdma_readl(priv, DMA_CTRL); - dma_enable = dma_ctrl & DMA_EN; - dma_ctrl &= ~DMA_EN; - bcmgenet_tdma_writel(priv, dma_ctrl, DMA_CTRL); - - dma_ctrl = 0; - ring_cfg = 0; + u32 i, ring_mask, dma_priority[3] = {0, 0, 0}; /* Enable strict priority arbiter mode */ bcmgenet_tdma_writel(priv, DMA_ARBITER_SP, DMA_ARB_CTRL); @@ -2766,8 +2756,6 @@ static void bcmgenet_init_tx_queues(struct net_device *dev) bcmgenet_init_tx_ring(priv, i, end - start, start, end); start = end; end += priv->hw_params->tx_bds_per_q; - ring_cfg |= (1 << i); - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); dma_priority[DMA_PRIO_REG_INDEX(i)] |= (i ? GENET_Q1_PRIORITY : GENET_Q0_PRIORITY) << DMA_PRIO_REG_SHIFT(i); @@ -2778,13 +2766,13 @@ static void bcmgenet_init_tx_queues(struct net_device *dev) bcmgenet_tdma_writel(priv, dma_priority[1], DMA_PRIORITY_1); bcmgenet_tdma_writel(priv, dma_priority[2], DMA_PRIORITY_2); - /* Enable Tx queues */ - bcmgenet_tdma_writel(priv, ring_cfg, DMA_RING_CFG); + /* Configure Tx queues as descriptor rings */ + ring_mask = (1 << (priv->hw_params->tx_queues + 1)) - 1; + bcmgenet_tdma_writel(priv, ring_mask, DMA_RING_CFG); - /* Enable Tx DMA */ - if (dma_enable) - dma_ctrl |= DMA_EN; - bcmgenet_tdma_writel(priv, dma_ctrl, DMA_CTRL); + /* Enable Tx rings */ + ring_mask <<= DMA_RING_BUF_EN_SHIFT; + bcmgenet_tdma_writel(priv, ring_mask, DMA_CTRL); } static void bcmgenet_enable_rx_napi(struct bcmgenet_priv *priv) @@ -2833,17 +2821,9 @@ static int bcmgenet_init_rx_queues(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); unsigned int start = 0, end = GENET_Q0_RX_BD_CNT; - u32 i, dma_enable, dma_ctrl = 0, ring_cfg = 0; + u32 i, ring_mask; int ret; - dma_ctrl = bcmgenet_rdma_readl(priv, DMA_CTRL); - dma_enable = dma_ctrl & DMA_EN; - dma_ctrl &= ~DMA_EN; - bcmgenet_rdma_writel(priv, dma_ctrl, DMA_CTRL); - - dma_ctrl = 0; - ring_cfg = 0; - /* Initialize Rx priority queues */ for (i = 0; i <= priv->hw_params->rx_queues; i++) { ret = bcmgenet_init_rx_ring(priv, i, end - start, start, end); @@ -2852,17 +2832,15 @@ static int bcmgenet_init_rx_queues(struct net_device *dev) start = end; end += priv->hw_params->rx_bds_per_q; - ring_cfg |= (1 << i); - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); } /* Configure Rx queues as descriptor rings */ - bcmgenet_rdma_writel(priv, ring_cfg, DMA_RING_CFG); + ring_mask = (1 << (priv->hw_params->rx_queues + 1)) - 1; + bcmgenet_rdma_writel(priv, ring_mask, DMA_RING_CFG); /* Enable Rx rings */ - if (dma_enable) - dma_ctrl |= DMA_EN; - bcmgenet_rdma_writel(priv, dma_ctrl, DMA_CTRL); + ring_mask <<= DMA_RING_BUF_EN_SHIFT; + bcmgenet_rdma_writel(priv, ring_mask, DMA_CTRL); return 0; } @@ -2957,14 +2935,42 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) } /* init_edma: Initialize DMA control register */ -static int bcmgenet_init_dma(struct bcmgenet_priv *priv) +static int bcmgenet_init_dma(struct bcmgenet_priv *priv, bool flush_rx) { - int ret; - unsigned int i; struct enet_cb *cb; + u32 reg, dma_ctrl; + unsigned int i; + int ret; netif_dbg(priv, hw, priv->dev, "%s\n", __func__); + /* Disable RX/TX DMA and flush TX queues */ + dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; + for (i = 0; i < priv->hw_params->tx_queues; i++) + dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); + reg = bcmgenet_tdma_readl(priv, DMA_CTRL); + reg &= ~dma_ctrl; + bcmgenet_tdma_writel(priv, reg, DMA_CTRL); + + dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; + for (i = 0; i < priv->hw_params->rx_queues; i++) + dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); + reg = bcmgenet_rdma_readl(priv, DMA_CTRL); + reg &= ~dma_ctrl; + bcmgenet_rdma_writel(priv, reg, DMA_CTRL); + + bcmgenet_umac_writel(priv, 1, UMAC_TX_FLUSH); + udelay(10); + bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH); + + if (flush_rx) { + reg = bcmgenet_rbuf_ctrl_get(priv); + bcmgenet_rbuf_ctrl_set(priv, reg | BIT(0)); + udelay(10); + bcmgenet_rbuf_ctrl_set(priv, reg); + udelay(10); + } + /* Initialize common Rx ring structures */ priv->rx_bds = priv->base + priv->hw_params->rdma_offset; priv->num_rx_bds = TOTAL_DESC; @@ -3014,6 +3020,15 @@ static int bcmgenet_init_dma(struct bcmgenet_priv *priv) /* Initialize Tx queues */ bcmgenet_init_tx_queues(priv->dev); + /* Enable RX/TX DMA */ + reg = bcmgenet_rdma_readl(priv, DMA_CTRL); + reg |= DMA_EN; + bcmgenet_rdma_writel(priv, reg, DMA_CTRL); + + reg = bcmgenet_tdma_readl(priv, DMA_CTRL); + reg |= DMA_EN; + bcmgenet_tdma_writel(priv, reg, DMA_CTRL); + return 0; } @@ -3165,53 +3180,6 @@ static void bcmgenet_get_hw_addr(struct bcmgenet_priv *priv, put_unaligned_be16(addr_tmp, &addr[4]); } -static void bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) -{ - unsigned int i; - u32 reg; - u32 dma_ctrl; - - /* disable DMA */ - dma_ctrl = DMA_EN; - for (i = 0; i <= priv->hw_params->tx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_tdma_writel(priv, reg, DMA_CTRL); - - dma_ctrl = DMA_EN; - for (i = 0; i <= priv->hw_params->rx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_rdma_writel(priv, reg, DMA_CTRL); - - bcmgenet_umac_writel(priv, 1, UMAC_TX_FLUSH); - udelay(10); - bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH); - - if (flush_rx) { - reg = bcmgenet_rbuf_ctrl_get(priv); - bcmgenet_rbuf_ctrl_set(priv, reg | BIT(0)); - udelay(10); - bcmgenet_rbuf_ctrl_set(priv, reg); - udelay(10); - } -} - -static void bcmgenet_enable_dma(struct bcmgenet_priv *priv) -{ - u32 reg; - - reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg |= DMA_EN; - bcmgenet_rdma_writel(priv, reg, DMA_CTRL); - - reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg |= DMA_EN; - bcmgenet_tdma_writel(priv, reg, DMA_CTRL); -} - static void bcmgenet_netif_start(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); @@ -3263,18 +3231,13 @@ static int bcmgenet_open(struct net_device *dev) /* HFB init */ bcmgenet_hfb_init(priv); - /* Disable RX/TX DMA and flush TX and RX queues */ - bcmgenet_dma_disable(priv, true); - /* Reinitialize TDMA and RDMA and SW housekeeping */ - ret = bcmgenet_init_dma(priv); + ret = bcmgenet_init_dma(priv, true); if (ret) { netdev_err(dev, "failed to initialize DMA\n"); goto err_clk_disable; } - bcmgenet_enable_dma(priv); - ret = request_irq(priv->irq0, bcmgenet_isr0, IRQF_SHARED, dev->name, priv); if (ret < 0) { @@ -4099,18 +4062,13 @@ static int bcmgenet_resume(struct device *d) if (rule->state != BCMGENET_RXNFC_STATE_UNUSED) bcmgenet_hfb_create_rxnfc_filter(priv, rule); - /* Disable RX/TX DMA and flush TX queues */ - bcmgenet_dma_disable(priv, false); - /* Reinitialize TDMA and RDMA and SW housekeeping */ - ret = bcmgenet_init_dma(priv); + ret = bcmgenet_init_dma(priv, false); if (ret) { netdev_err(dev, "failed to initialize DMA\n"); goto out_clk_disable; } - bcmgenet_enable_dma(priv); - if (!device_may_wakeup(d)) phy_resume(dev->phydev); From patchwork Thu Mar 6 19:26:38 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005270 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DC6427C854; Thu, 6 Mar 2025 19:27:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289268; cv=none; b=eUfA41LY1ApQ6cFyMJpZKvbOMhDkwLwtUEuw7g+P90egYzMq+f1WZoQ4IkTq/gSnIxVPfpAGQn9H0Sok39lRdG2TlBT7CShp3B23cP5yTSlaIwkib0J9/BhlMVmjNKudoUS1BY+NA77pIAbmA7LZM5YRtC92tKTwjr1/TZbytZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289268; c=relaxed/simple; bh=Zj0mTbSprW1K20L9vTB5FmrkKE8hUoyePdrerKHxmYQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=m8F7PRq6M8xg98oWzG+ftVlmAT/hbYj2XYYYgGq+bsvQ2ZcW7Qc54KwuqMIV6sORo0SGaqOuDO66+XJPym20GBO6OeWpmpiEZsOEWFYpRF4mBggPq0vghTChjSnQQJfn7uOQRe4vfPBZhdZ97LePwQ0mB5BKcSIIKsf2EB7jMgM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Y9XT+Zua; arc=none smtp.client-ip=209.85.210.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Y9XT+Zua" Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-72a1011f3b9so425508a34.2; Thu, 06 Mar 2025 11:27:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289266; x=1741894066; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LgAj3WUGpPr6FmEt9R9RTKm4FaN9NGcDaNky1hr8/WE=; b=Y9XT+ZuakelyaQyIHL2er+h1TunFQXZh3OwU7jK0PMCH0T1e+FmYRmWf43mWvkcyI5 Jgc3zvOotCcLC5paAJ7dwcy7kouzOpBDXI9kd10AVGts9DZAcI5nj91NnVhMd5kjR6Ew Krhwwn/U7LKz0TiY/9YMOtrF5NdvCfOvILKeCRYvOt8rRwZUoxx4awVaaQQIiW19b67C 6PC0qQyBm1awyf1wR53ob8ty0OmYPTMCkPv3WI9Ty25kzBll8hadihZc7kejWL15ipmW dgXqbfKPJirE86npqFU9ah7VguDFMTyRNvi7WuPo/tQDpW0WY5DSE/M369ysnNOqcoN7 uBbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289266; x=1741894066; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LgAj3WUGpPr6FmEt9R9RTKm4FaN9NGcDaNky1hr8/WE=; b=iweNV/gYSi2X4BuS4dC3MgOrJXkdw+jhio0yfI2Wylcnn4UtRHlG8GF54pm9ntTPRm yKdek0duTMyKM8tQzCEsIjgdoStl3Pg0hiIHkS28enwiYU/WtO/RG6gnAqG9de+6h6se TSVymhNuU4t9cWJWFb5gejgFv5/aCfdVvVTKkj1ZpSVUckLVVNJ0YoIt7vdzZhT50Vca 0OxR6imkCfMXrvjEmmKgqokJh6bbhwRkp66X21nWQCBVNVFGOHh6zFFkqs/zFm4Zsbf9 NaWEK0HQCWdmaSSC85OEU+OoqfG4tNR1MjS+kyMmTczS952p7LXdTPZ9JjI17lTs9LJl LZuw== X-Forwarded-Encrypted: i=1; AJvYcCVDrpq0H0wQtEloFqazeA6ON7LW6jBHZouQqgnOW7twHv+5+0Y99WI9LzricB0UlAvoUczjjAqB@vger.kernel.org, AJvYcCVkl0agUErDb12Xa56LZQiKMVVjEl328KCM8pDprovK9YFc5OupuKv42Ii53TWfNnscsdg92ie9izoQwPM=@vger.kernel.org X-Gm-Message-State: AOJu0YwDBZGdb58pGePc1CeSQurZaGoaqwwekhs76t83ziKSpiTDBdB4 f48xl3itEpyYW4GAQFfQXVx+kNnQOMJ+QlyrSe+WvJ/MuYU9lG5N X-Gm-Gg: ASbGncvcWIaW2Ubo/M/ahVXCuadis+HqxUIzD1nyK5HjiVJF+5zbJGN45vMN7ClzUVw adl54mK2C5XDA9Ue1SCdYK4OQXs3bJI2FL9M6b57MlKlisWOmb0wdIv6b7DOx1cpzmp+siy41cb FLsv9GeoxY0Pny82tmDj2ZvHxXsUwWDFAQld7yP13ejM+DkZamC6QshHFAGTv2kXiO4pb+H1cmk TzKFK4El6jGOER7Efgt1IR60pFAD58h4BmBP1i1j+81u3rHj9ZTFrgak3wZVdS/oLb1aFbz9WFA LznIM6ioyGS51fyN3UlMrMbk/lKCTEsUjHkI9xubtBhmCHnh37DAZKoyXZwYaxORyMffdZvPPxH fbuMIadIM6GOR X-Google-Smtp-Source: AGHT+IG5Od6NL8OcZyuMy8Ppw+OPc6VCptaNnyQ7oUxFjsnSaSj3FRGFNaxY7iYy3D9cMoypzjizlg== X-Received: by 2002:a05:6830:6dc3:b0:727:3899:11e4 with SMTP id 46e09a7af769-72a37c64014mr286320a34.24.1741289266172; Thu, 06 Mar 2025 11:27:46 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:45 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 10/14] net: bcmgenet: introduce bcmgenet_[r|t]dma_disable Date: Thu, 6 Mar 2025 11:26:38 -0800 Message-Id: <20250306192643.2383632-11-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The bcmgenet_rdma_disable and bcmgenet_tdma_disable functions are introduced to provide a common method for disabling each dma and the code is simplified. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 123 +++++++++--------- 1 file changed, 62 insertions(+), 61 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index ca936a7e7753..38943bbc35b1 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2727,6 +2727,52 @@ static void bcmgenet_fini_tx_napi(struct bcmgenet_priv *priv) } } +static int bcmgenet_tdma_disable(struct bcmgenet_priv *priv) +{ + int timeout = 0; + u32 reg, mask; + + reg = bcmgenet_tdma_readl(priv, DMA_CTRL); + mask = (1 << (priv->hw_params->tx_queues + 1)) - 1; + mask = (mask << DMA_RING_BUF_EN_SHIFT) | DMA_EN; + reg &= ~mask; + bcmgenet_tdma_writel(priv, reg, DMA_CTRL); + + /* Check DMA status register to confirm DMA is disabled */ + while (timeout++ < DMA_TIMEOUT_VAL) { + reg = bcmgenet_tdma_readl(priv, DMA_STATUS); + if ((reg & mask) == mask) + return 0; + + udelay(1); + } + + return -ETIMEDOUT; +} + +static int bcmgenet_rdma_disable(struct bcmgenet_priv *priv) +{ + int timeout = 0; + u32 reg, mask; + + reg = bcmgenet_rdma_readl(priv, DMA_CTRL); + mask = (1 << (priv->hw_params->rx_queues + 1)) - 1; + mask = (mask << DMA_RING_BUF_EN_SHIFT) | DMA_EN; + reg &= ~mask; + bcmgenet_rdma_writel(priv, reg, DMA_CTRL); + + /* Check DMA status register to confirm DMA is disabled */ + while (timeout++ < DMA_TIMEOUT_VAL) { + reg = bcmgenet_rdma_readl(priv, DMA_STATUS); + if ((reg & mask) == mask) + return 0; + + udelay(1); + } + + return -ETIMEDOUT; +} + /* Initialize Tx queues * * Queues 1-4 are priority-based, each one has 32 descriptors, @@ -2848,26 +2894,9 @@ static int bcmgenet_init_rx_queues(struct net_device *dev) static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv) { int ret = 0; - int timeout = 0; - u32 reg; - u32 dma_ctrl; - int i; /* Disable TDMA to stop add more frames in TX DMA */ - reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg &= ~DMA_EN; - bcmgenet_tdma_writel(priv, reg, DMA_CTRL); - - /* Check TDMA status register to confirm TDMA is disabled */ - while (timeout++ < DMA_TIMEOUT_VAL) { - reg = bcmgenet_tdma_readl(priv, DMA_STATUS); - if (reg & DMA_DISABLED) - break; - - udelay(1); - } - - if (timeout == DMA_TIMEOUT_VAL) { + if (-ETIMEDOUT == bcmgenet_tdma_disable(priv)) { netdev_warn(priv->dev, "Timed out while disabling TX DMA\n"); ret = -ETIMEDOUT; } @@ -2876,39 +2905,11 @@ static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv) usleep_range(10000, 20000); /* Disable RDMA */ - reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg &= ~DMA_EN; - bcmgenet_rdma_writel(priv, reg, DMA_CTRL); - - timeout = 0; - /* Check RDMA status register to confirm RDMA is disabled */ - while (timeout++ < DMA_TIMEOUT_VAL) { - reg = bcmgenet_rdma_readl(priv, DMA_STATUS); - if (reg & DMA_DISABLED) - break; - - udelay(1); - } - - if (timeout == DMA_TIMEOUT_VAL) { + if (-ETIMEDOUT == bcmgenet_rdma_disable(priv)) { netdev_warn(priv->dev, "Timed out while disabling RX DMA\n"); ret = -ETIMEDOUT; } - dma_ctrl = 0; - for (i = 0; i <= priv->hw_params->rx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_rdma_writel(priv, reg, DMA_CTRL); - - dma_ctrl = 0; - for (i = 0; i <= priv->hw_params->tx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_tdma_writel(priv, reg, DMA_CTRL); - return ret; } @@ -2938,27 +2939,27 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) static int bcmgenet_init_dma(struct bcmgenet_priv *priv, bool flush_rx) { struct enet_cb *cb; - u32 reg, dma_ctrl; unsigned int i; int ret; + u32 reg; netif_dbg(priv, hw, priv->dev, "%s\n", __func__); - /* Disable RX/TX DMA and flush TX queues */ - dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; - for (i = 0; i < priv->hw_params->tx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_tdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_tdma_writel(priv, reg, DMA_CTRL); + /* Disable TX DMA */ + ret = bcmgenet_tdma_disable(priv); + if (ret) { + netdev_err(priv->dev, "failed to halt Tx DMA\n"); + return ret; + } - dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN; - for (i = 0; i < priv->hw_params->rx_queues; i++) - dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT)); - reg = bcmgenet_rdma_readl(priv, DMA_CTRL); - reg &= ~dma_ctrl; - bcmgenet_rdma_writel(priv, reg, DMA_CTRL); + /* Disable RX DMA */ + ret = bcmgenet_rdma_disable(priv); + if (ret) { + netdev_err(priv->dev, "failed to halt Rx DMA\n"); + return ret; + } + /* Flush TX queues */ bcmgenet_umac_writel(priv, 1, UMAC_TX_FLUSH); udelay(10); bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH); From patchwork Thu Mar 6 19:26:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005271 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oo1-f48.google.com (mail-oo1-f48.google.com [209.85.161.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 01C6E27C874; Thu, 6 Mar 2025 19:27:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289270; cv=none; b=fVWzndjWcEycfMURGuhtEZV4LxSm/0hENu/8j6hD3Xp/jEvquO69u66+HJhNjdeoEu4NCXD+QbUJYrHAZZEvLsjGUTXHUvlPaic9i1eV+ycwmpVs0bIhjm0TtIu12a1arpZFgQxfF8iQ4dKVGWofV0pnNQGfC+//Gk5UUe0Zr+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289270; c=relaxed/simple; bh=v28IfsUbQe0PXYxTI+G9B9X2cdtl27D6ZmFrLIzlBkQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=iNTH+OHhU7XyrvyaM3Pzsv+eRwYUOzb3br9+bJIyAzmqVta/CgrGUSCxuV9q8iACfZwQ02g/RbUELbgMnVKsMwDVTfiOVVMwzhm4OG/DmFmFApLSIRG8bAnSvP3KwPryh8sJ19axXA5WcmmGTBDwmqMS109GNX5vhp7raqLxAn0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HJZJtvdg; arc=none smtp.client-ip=209.85.161.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HJZJtvdg" Received: by mail-oo1-f48.google.com with SMTP id 006d021491bc7-60047980ffdso257012eaf.1; Thu, 06 Mar 2025 11:27:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289268; x=1741894068; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=m1okH526yzfViUdNUDUAPmmtKrqlkw9GmVS36CY/1Jo=; b=HJZJtvdgpVMi/YqBupr6QoEegc1bndwD30gGl3WZCTnu+aRfoORLTRRAiAkeIPcyDj zKKbEjbksdU7a5tZPtsMu3wmffGWm1GyQ8dI8T9QpJCZIuieuAAvEdkzHb474/QttJk5 D9a4+3qg2bt8C24OyMfUdJPAZLsQaDkG/NNmh0KLx4aetDv+tPGkzGVfdeOS6qyn7jlB sz/WkZydQVpX7sAUfryWXp9O/PRrKrYViP90IcBNgdkEBQ1tyWr/Orz4Ekd4EBeeEieL F/pFKcirvZniZjf2mSq2tVElELx5Uk9LVtW8+LBJzsIqY5arY79Ae6osXC+o9syQJ/fe 9BdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289268; x=1741894068; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=m1okH526yzfViUdNUDUAPmmtKrqlkw9GmVS36CY/1Jo=; b=w9yqqWuk3dcPD3MzJ/IXykxKohvvrv352ya8UkY8omce9bXOPRDZqw7SmTzHdXFoy5 lLwf/hiQSj6esrza4+1DUNO+CpkT9IP05I71kwKB1TG8nHDZ1OomhzYtP5b/f/ntV1wi MXyCX0oqovLA/RE3Rn/0ZfF48Qlr0p4a7qCDcjA7morta3kxn857Bjfwei+nDLxRazzA gdkvxlyQLuAAAFVpnv3L35EJHpZ15l9UPkrJFJzHZq7Eg5PJfR9MgZgr2AJJzn32vIP5 qM8JOq/oU/TJ0qV3iE5TRMWevPssWyX8MWzOypoQLoJEFOM74IwzT5b2yuB63HT3FI0z ZQkw== X-Forwarded-Encrypted: i=1; AJvYcCUX+oN9T9G5SEcFCEv+I1QmnPxd8C2rtKhVBpIQeY8bKKXXH8UHAx7dV/a8DXIT6CXxthpmKm2q59vzZ50=@vger.kernel.org, AJvYcCViO+sGltdpb5h7HvmVYLpNHrDIxSd662GNttybbNFRxwlhRzjSstQwz6AcUwoaQD/X/BwrXLhY@vger.kernel.org X-Gm-Message-State: AOJu0Yz4hP3IUsyuUsb0eEiqjIqlIGUjNUdgA7lwWtSybqa7wloY7+DZ Pz6WS79CumNMTLfdqx00IrTBWv60PSQrzgDakmgT8GVdfwQKsWre X-Gm-Gg: ASbGncv8/Nr7mAs4DWLBUsx66X/9wU7u4tiXs9QMVUzpcYLA2m+A42bmmCK1tp2J3az CYIo0iHMZ7PjyA5Pmg3QpLaWPavn/YHUkVdupZzG6BN6ypFp5IJev0lX+9BDUtVekHSsI7PWrTe CjGaGs84bjs/DcUM+2sWKBAjJ32d5m4o2w6dk/KYRhboODwYJ2R4iseAOUHkPOoyyUnpDGpFmPD vy40UbnJVDT3xu0VAlSXL6HVuClXhaY6CvofBSBSQuklSuteD4/zeLq3QYTEVrljZlxHwVrgSxi InVRISny4V1CIWHAPkKeIAgaMVkuTw6bvnIWY6qtD2KV6UNnUuVqeGcCenQOUtDovxe7VYQN1jL qT6wYKy0TLQMP X-Google-Smtp-Source: AGHT+IEGlVrIv2cxAvja+XwhqrL6JEIqxJ9E80Yk8l52wKaRlsW5aNWuz954DK97f5MwzpCAU4fiTg== X-Received: by 2002:a05:6871:7a11:b0:28c:8476:dd76 with SMTP id 586e51a60fabf-2c2614281aemr322759fac.29.1741289267891; Thu, 06 Mar 2025 11:27:47 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:47 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 11/14] net: bcmgenet: support reclaiming unsent Tx packets Date: Thu, 6 Mar 2025 11:26:39 -0800 Message-Id: <20250306192643.2383632-12-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org When disabling the transmitter any outstanding packets can now be reclaimed by bcmgenet_tx_reclaim_all() rather than by the bcmgenet_fini_dma() function. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 38943bbc35b1..0706c9635689 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1903,12 +1903,39 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, } static unsigned int bcmgenet_tx_reclaim(struct net_device *dev, - struct bcmgenet_tx_ring *ring) + struct bcmgenet_tx_ring *ring, + bool all) { - unsigned int released; + struct bcmgenet_priv *priv = netdev_priv(dev); + struct device *kdev = &priv->pdev->dev; + unsigned int released, drop, wr_ptr; + struct enet_cb *cb_ptr; + struct sk_buff *skb; spin_lock_bh(&ring->lock); released = __bcmgenet_tx_reclaim(dev, ring); + if (all) { + skb = NULL; + drop = (ring->prod_index - ring->c_index) & DMA_C_INDEX_MASK; + released += drop; + ring->prod_index = ring->c_index & DMA_C_INDEX_MASK; + while (drop--) { + cb_ptr = bcmgenet_put_txcb(priv, ring); + skb = cb_ptr->skb; + bcmgenet_free_tx_cb(kdev, cb_ptr); + if (skb && cb_ptr == GENET_CB(skb)->first_cb) { + dev_consume_skb_any(skb); + skb = NULL; + } + } + if (skb) + dev_consume_skb_any(skb); + bcmgenet_tdma_ring_writel(priv, ring->index, + ring->prod_index, TDMA_PROD_INDEX); + wr_ptr = ring->write_ptr * WORDS_PER_BD(priv); + bcmgenet_tdma_ring_writel(priv, ring->index, wr_ptr, + TDMA_WRITE_PTR); + } spin_unlock_bh(&ring->lock); return released; @@ -1945,7 +1972,7 @@ static void bcmgenet_tx_reclaim_all(struct net_device *dev) int i = 0; do { - bcmgenet_tx_reclaim(dev, &priv->tx_rings[i++]); + bcmgenet_tx_reclaim(dev, &priv->tx_rings[i++], true); } while (i <= priv->hw_params->tx_queues && netif_is_multiqueue(dev)); } @@ -2921,10 +2948,6 @@ static void bcmgenet_fini_dma(struct bcmgenet_priv *priv) bcmgenet_fini_rx_napi(priv); bcmgenet_fini_tx_napi(priv); - for (i = 0; i < priv->num_tx_bds; i++) - dev_kfree_skb(bcmgenet_free_tx_cb(&priv->pdev->dev, - priv->tx_cbs + i)); - for (i = 0; i <= priv->hw_params->tx_queues; i++) { txq = netdev_get_tx_queue(priv->dev, i); netdev_tx_reset_queue(txq); From patchwork Thu Mar 6 19:26:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005272 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-oo1-f41.google.com (mail-oo1-f41.google.com [209.85.161.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 20FD127CCDD; Thu, 6 Mar 2025 19:27:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289273; cv=none; b=ZF5vFvMynANtAl5LfxdJTYbp+PttAnWP2cUFHC7fb8IAAAWXAEohoJ3JGIP5P14WARkSvbGDQARPs4E3WPRw8jwGhq0+AsABgBuAArGa6/AllFLmho6WEzUMa66O0NP7ev3029scCnurea+bpIbMuB0TBugBS+XvWQOm/8cEtoo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289273; c=relaxed/simple; bh=+ALVKpFaGbWCPa8D1dUiOybrhmpqK3ttQCn6gXDje2Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ol76EKrz1FtTLt/hsXJqB3hrSGsK6euKTJyJEqvg+L4zj17CiVlTRqprugwLSDQFouB2OZGq4Llw42AI2XFAkL07zh2G+14BVATXvMq8rw20cqe5DYLgOWC4eK2BPvET6KEzlUFbTLoW34OhvNvssSJ7kLdxYtV/qbotqqm69bw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hYTSDKYN; arc=none smtp.client-ip=209.85.161.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hYTSDKYN" Received: by mail-oo1-f41.google.com with SMTP id 006d021491bc7-600250a14f4so1173104eaf.1; Thu, 06 Mar 2025 11:27:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289271; x=1741894071; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hGYIb4APztVRi2uQBXHOjlH1/u9S5ghE64JrkMZiZD0=; b=hYTSDKYNsKOAebuKn9lLn6bIdTx2I7CpxwKMxCpEhg0ggEckBulHUu02yhOgEbpKRb m04oZYW4zYxnpTIObGtc+6yvW0hjyFdva52gifqlpgDR8UNAcT2mE5l9qA8HaOKmbl5N IwSenJnqJq70tvBWfJb6NQ/6b58bY7fVb/eI0y77AWFA90DQ89blK8Ps4/F/EUlsV1J2 UBH72fUfjfw4WHvAWtrBMMrN0K/PfsQ2KBdArpu4DhKQajpG2qAz+bRze4eHbxxNVrvE s7Uu3VCRG8gjQQvWEtGe47r9bYvxM8LEsJdOSwACwo8uiAnPZ+7TzJ9Uyo3rd9tr8IXA Mwiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289271; x=1741894071; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hGYIb4APztVRi2uQBXHOjlH1/u9S5ghE64JrkMZiZD0=; b=dksxFx7GHG1R4C+r8ghfFKRXRyqRXIEUWXUMT+7Iiazk987cEJWZBSSwqPOsEOCByq lmjKS+9Td8PXhGsHCY+5D1uCkkFnazo2wFBb7lzAlaaZryBwgawxZ+BCcSW/YT3yIgRR aj1/TqM1o+wpB5EinHOWc1rr9u1Plh/r1WSbn2oG6XlZ92pCoT3Ed/FXKLud5xosfCbX giRlufS4wrLCBUKUKbo8UT28RwFMkQ9msILsf8qK0Wbj2D/bXd36o5VyNunEBGT0FsUS xYyT+ivx0wPheGN9TC/Gpkz3hNa1PhfhokPLWwoBgZX2mkXd8noOHKrN1HJ7BcVbVFBK uIoQ== X-Forwarded-Encrypted: i=1; AJvYcCU9DVBfpCXEd3fJLD1PZoId8Dz/8+bSg/1TnPB5HW733pAlT+/mEWp2OVceGgiaAY7TlAK8EqSQ@vger.kernel.org, AJvYcCX1A1N5pKLk7c3e3j/J3Pp5m+mXqWqVTX3yWS2uNdSGmvbhdpRUUvsRkk+VadmE1n6B+wRFMMug5/u7EpU=@vger.kernel.org X-Gm-Message-State: AOJu0Yw++TNoSHA3SqPJ+WByElylk4hUVCZCv1R/PskWzK2A7V83Pyd0 YZqp1cjA2nwT8JyS63/Wk9unHEZeDgvGtov+xpL8V1M24qtMT6g1 X-Gm-Gg: ASbGncseJD9ajBId4B1VVU3+u2JnMiUdxJfNZzT7gWT02WXS3hAIUBVboPv2pB6PZG8 kmwukK3E7voVbAiQlVf3IeMznuzqF1eXoywbdMeF3ir/BY7DktB72JAWiLTH5phImz6skJkJzOL 9s6XT6N+ojzsLdi1K/GNpyZZ83Vnsv85o+UEr4iitD4ULzJ0OGLN9Kxkt/JeWXQddYj75N1iUr8 OAwuvbow6Q7fzukV2fNLzzPBof7r1DtT5QHomId3lD91L4gn0XrR3tIP71WSEORPD57lgUA6mmP 2f7lCwZTN1Dm5QHIaHsHsJd3FolmEwDlTy6HD/tj0SLTwn+iyrqG+mv/l7JB+jnoijfuhw7OYSQ bx518f4EPXHz2 X-Google-Smtp-Source: AGHT+IEqKRVdNgBFczfviaBWvJPGXMKgQVLDQWujYTynNmLVeuFkPbWs3u4MpREK9ldGifPzAU83vw== X-Received: by 2002:a05:6870:5b92:b0:29f:d993:a4cb with SMTP id 586e51a60fabf-2c23ebac690mr2734501fac.14.1741289271061; Thu, 06 Mar 2025 11:27:51 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:49 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 12/14] net: bcmgenet: move bcmgenet_power_up into resume_noirq Date: Thu, 6 Mar 2025 11:26:40 -0800 Message-Id: <20250306192643.2383632-13-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org The bcmgenet_power_up() function is moved from the resume method to the resume_noirq method for symmetry with the suspend_noirq method. This allows the wol_active flag to be removed. The UMAC_IRQ_WAKE_EVENT interrupts that can be unmasked by the bcmgenet_wol_power_down_cfg() function are now re-masked by the bcmgenet_wol_power_up_cfg() function at the resume_noirq level as well. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 24 +++++++++---------- .../net/ethernet/broadcom/genet/bcmgenet.h | 1 - .../ethernet/broadcom/genet/bcmgenet_wol.c | 8 +++---- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 0706c9635689..8aecf56578cb 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -4038,8 +4038,20 @@ static int bcmgenet_resume_noirq(struct device *d) reg = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT); if (reg & UMAC_IRQ_WAKE_EVENT) pm_wakeup_event(&priv->pdev->dev, 0); + + /* From WOL-enabled suspend, switch to regular clock */ + bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC); } + /* If this is an internal GPHY, power it back on now, before UniMAC is + * brought out of reset as absolutely no UniMAC activity is allowed + */ + if (priv->internal_phy) + bcmgenet_power_up(priv, GENET_POWER_PASSIVE); + + /* take MAC out of reset */ + bcmgenet_umac_reset(priv); + bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_WAKE_EVENT, INTRL2_CPU_CLEAR); return 0; @@ -4055,18 +4067,6 @@ static int bcmgenet_resume(struct device *d) if (!netif_running(dev)) return 0; - /* From WOL-enabled suspend, switch to regular clock */ - if (device_may_wakeup(d) && priv->wolopts) - bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC); - - /* If this is an internal GPHY, power it back on now, before UniMAC is - * brought out of reset as absolutely no UniMAC activity is allowed - */ - if (priv->internal_phy) - bcmgenet_power_up(priv, GENET_POWER_PASSIVE); - - bcmgenet_umac_reset(priv); - init_umac(priv); phy_init_hw(dev->phydev); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 926523d019db..633fa9aa0726 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -641,7 +641,6 @@ struct bcmgenet_priv { struct clk *clk_wol; u32 wolopts; u8 sopass[SOPASS_MAX]; - bool wol_active; struct bcmgenet_mib_counters mib; diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c index f37665ce40cb..5246214aebc9 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c @@ -199,7 +199,6 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, retries); clk_prepare_enable(priv->clk_wol); - priv->wol_active = 1; if (hfb_enable) { bcmgenet_hfb_reg_writel(priv, hfb_enable, @@ -238,13 +237,12 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, return; } - if (!priv->wol_active) - return; /* failed to suspend so skip the rest */ - - priv->wol_active = 0; clk_disable_unprepare(priv->clk_wol); priv->crc_fwd_en = 0; + bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_WAKE_EVENT, + INTRL2_CPU_MASK_SET); + /* Disable Magic Packet Detection */ if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL); From patchwork Thu Mar 6 19:26:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005273 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8829A27D78D; Thu, 6 Mar 2025 19:27:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289276; cv=none; b=tRUBovm95+lFzzkEwmGnCS177DnvjSt4Ik97YXq/ztafPGXkA6rejEtOhPpLK+cwcmRc/TxomiKTM2B+bRCjl1e09KrPhSFFY/Sk23tVHhUagPbrjredK/3zK6L1LeeBlPXHLMZL2LGb6Ye91itppNePpl6xsyaAq7B3A/k/jJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289276; c=relaxed/simple; bh=EyZxcuqZS9qZx7JZeAMWGEFb7GLBvRG5vXwLKnz2vQI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=b0esj/FJ9CfbTDzY49MSNQjgIlTOXSwE1eKK390tv/3Wa3U/wrXqvHye1CGhrnuPcg4H0qYcZZenuHRwwiC2k57WZKU91Vi1S8znj3jG346jGRXZMI0fpodxPn2F/uBBzUnQwDu/1R2t6/fXIM3N0DDfbL4CAa96usu7WI5wvLY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GNOeT6fO; arc=none smtp.client-ip=209.85.210.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GNOeT6fO" Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-7272cc739f7so1241838a34.1; Thu, 06 Mar 2025 11:27:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289273; x=1741894073; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gUMKuDs1LjlTbGCPBNfl702G3vkInr9aiyYjYPRma7w=; b=GNOeT6fOMVKHZ+6KEUIqd9bSukPia5o9UWf7SP2q2sts6WB4sLtWe73uwY1qt0PL+X dsC7FZRKPkb+Q78mImmBRy7vBfFOT8qQB2HZfiuLmHNdL05sa1q3bXgD0dbaGKooUkpi MKO8U9KRybkLCyu/s97w0wZrXZui5GU+FsulxoEYGGAW2fptbhPkisZhZ6LhcCpL/iSe 3XlAzSN835+g6EMB1jeLR6+e8ZR8hTp2o75jPiku58H7gnRIXJEa2B8Bg1oHv/Pe8nZs XsBqACY/QBI7dxmexRiIpGADolgfgBpf/zQ3S1Mknys/qsDP1aOQikXA8eSbuNF6u8yP B0+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289273; x=1741894073; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gUMKuDs1LjlTbGCPBNfl702G3vkInr9aiyYjYPRma7w=; b=vDx46BcBTUoBgbzekSzkuQIOGefHqFqh2dHz67ZKFl5r3i3mNQTcp1mkRa4F8XIefQ i24YHCKf+2/dE7anOSVs/Z0cMDs+UZ6OrYKEXcf2ZYbTbMDCQQzpcU182a2NiUexMR/f 9X3d7AcgFskmXpEoZIoYhwnH9ddI4Oixqtwc6xOe8/dCQHeZOPg8OaEn7MFoLOBb4urT JbzxhVcfBh/tsdFTG+0dew9JuN5L4Jx6FDCWFs1UPJeKf91IfEyeEWoSmSqCvuKYpqZB HyKoXZHvKOTfojIuYmgMgGcxKpi/Qo9AC2OP8jowopxAnAVT52wt6su4j0yvQPGqoYHs 9aVQ== X-Forwarded-Encrypted: i=1; AJvYcCVqTFGuZ/OruEQTfSz3vHb8PlLwLjgjbTXv7gybpvfdLQb2DDi3dxutmdx5Eockuz0FvtAlPGOmWa1F3Ns=@vger.kernel.org, AJvYcCWER+wWJhnFXBNg2ReyPewuUKfzXxVekDxbabPbLR4OOhjBX+nxe415Dp2Q0QZEIRTTJcV/HEcp@vger.kernel.org X-Gm-Message-State: AOJu0YzGTFPAObuKz7UNyrUz0gL8zPsVs9Ql5MaA9TUfKmlfkKxn78Po eHT8EUircsrGrdGOYCQNM9AIPO0Q40pPIQD4bhNtOq5zttCf0Za5 X-Gm-Gg: ASbGncvSJ/dwFwf9EluS1mGxRnAwdDyIH2Aq2qtxP4dZ1DqH9KAsCcrdzGlFJitJzhK JMBDQAvcH1vNxsCzQusngRMWpxBkaZ8e/0KJCfWkppMalCCFC0vFiskvG9sg50oyl5fJ01+Heyl SUKrtFZmBAmBqsiKENajK6RxHQUt+zco1TbY0fPZ6VLlR6w2Nb5NeT/gMz/xLKigJ7i48pbk9QD +vnHqur+gbvs+t5mHdFlamav2QKUBWGNyC3Fun7BlRcjHEBjcgFBTovOGVoajfIMKOQ1DGBrEt7 4gvghVBZ8M6tXOy3EmM+0QBCKjP2BEs/qSbWGUsjc5JHrtlZbmr5pI87WDQNRwsw2olTUR7oA+n yh3iAWr2XxUeb X-Google-Smtp-Source: AGHT+IFRpQZKwWsJCLNnmSmMjUVA5i7QhfLawOyDX4NpCVmOHL5QDWRO1G3TxvP9MwpWU/gYW9gAoA== X-Received: by 2002:a05:6830:a8f:b0:728:a42c:a503 with SMTP id 46e09a7af769-72a2b7e8bfbmr3354189a34.14.1741289273469; Thu, 06 Mar 2025 11:27:53 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:52 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 13/14] net: bcmgenet: allow return of power up status Date: Thu, 6 Mar 2025 11:26:41 -0800 Message-Id: <20250306192643.2383632-14-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org It is possible for a WoL power up to fail due to the GENET being reset while in the suspend state. Allow these failures to be returned as error codes to allow different recovery behavior when necessary. Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 13 ++++++++----- drivers/net/ethernet/broadcom/genet/bcmgenet.h | 4 ++-- drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c | 12 +++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 8aecf56578cb..8aa575b93e56 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -1685,13 +1685,14 @@ static int bcmgenet_power_down(struct bcmgenet_priv *priv, return ret; } -static void bcmgenet_power_up(struct bcmgenet_priv *priv, - enum bcmgenet_power_mode mode) +static int bcmgenet_power_up(struct bcmgenet_priv *priv, + enum bcmgenet_power_mode mode) { + int ret = 0; u32 reg; if (!bcmgenet_has_ext(priv)) - return; + return ret; reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); @@ -1727,11 +1728,13 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv, } break; case GENET_POWER_WOL_MAGIC: - bcmgenet_wol_power_up_cfg(priv, mode); - return; + ret = bcmgenet_wol_power_up_cfg(priv, mode); + break; default: break; } + + return ret; } static struct enet_cb *bcmgenet_get_txcb(struct bcmgenet_priv *priv, diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index 633fa9aa0726..c95601898bd4 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -724,8 +724,8 @@ void bcmgenet_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol); int bcmgenet_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol); int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, enum bcmgenet_power_mode mode); -void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, - enum bcmgenet_power_mode mode); +int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, + enum bcmgenet_power_mode mode); void bcmgenet_eee_enable_set(struct net_device *dev, bool enable, bool tx_lpi_enabled); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c index 5246214aebc9..d0f1fa702917 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c @@ -227,14 +227,14 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, return 0; } -void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, - enum bcmgenet_power_mode mode) +int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, + enum bcmgenet_power_mode mode) { u32 reg; if (mode != GENET_POWER_WOL_MAGIC) { netif_err(priv, wol, priv->dev, "invalid mode: %d\n", mode); - return; + return -EINVAL; } clk_disable_unprepare(priv->clk_wol); @@ -247,7 +247,7 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL); if (!(reg & MPD_EN)) - return; /* already reset so skip the rest */ + return -EPERM; /* already reset so skip the rest */ reg &= ~(MPD_EN | MPD_PW_EN); bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL); } @@ -256,7 +256,7 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, if (priv->wolopts & WAKE_FILTER) { reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); if (!(reg & RBUF_ACPI_EN)) - return; /* already reset so skip the rest */ + return -EPERM; /* already reset so skip the rest */ reg &= ~(RBUF_HFB_EN | RBUF_ACPI_EN); bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); } @@ -267,4 +267,6 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, reg &= ~CMD_CRC_FWD; bcmgenet_umac_writel(priv, reg, UMAC_CMD); spin_unlock_bh(&priv->reg_lock); + + return 0; } From patchwork Thu Mar 6 19:26:42 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Berger X-Patchwork-Id: 14005274 X-Patchwork-Delegate: kuba@kernel.org Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12CCA27EC6F; Thu, 6 Mar 2025 19:27:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289278; cv=none; b=W6FZtuztv3gQrHjvI4svs9ex6g8GL4w/Ax8Tf/zq4zc4aYDNPzFmLA5i8YzI3xWwupsgCwC1NaL3Fc7UJUfvnuWifH3mVPaOnH5Gkf7g3ikvoKyB8xfe8W2mMir+uVRygRA/c7gt4baIwqQB+buPp9xX+QtAEA7ILyLgVy6XYzM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741289278; c=relaxed/simple; bh=UwUiJTjD8Gk4hPFTq+6lGnY8RHO8A+gFVxZXVZvvk2M=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WxPOD3rJysNAqu2jtSCerA7nsUxJ/AZYwLfumQIc3ti85zz02yyz0GRDrL28oRXVIqPeUACo96+9fHPGWwIQLORzUxzKR8sWN8HvBaj90d4AQyW22RBXyQxbYXrp7ldlHQU2AShe8Zit0dARQ+WV8GFGf7a5Y18EALFMlUiHKcg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=a0GodrnQ; arc=none smtp.client-ip=209.85.210.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="a0GodrnQ" Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-71fbb0d035dso494287a34.2; Thu, 06 Mar 2025 11:27:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741289276; x=1741894076; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kc7jX9qtPYDjRxcz+4Coy64UTqRzxhOB9wDk1hO9HmQ=; b=a0GodrnQPDfdpdw7aiMARSstLQmCto8OuJZNQCzeXzakrEB2N5Hae+AzF06+JRj9Mq FeSo1Gdy2MxxSl74U84gPozAgzA97SqbzyozMooR7CtzCdvYRmE3ydfN7j9HxnQUrgYj HBverOOWyxZ0T/4Umm1ykdQzY4lljvif9BQLaxIH4AJ6LxdfVLXLvgLHm8PcLQg00xzm kRqA2FXigKo0cr7uTR35RGAWyWnzR45hZeFimuy0m2hv6mdw5afIL6axY1BbbMbtrFOf jztubrN3yRPe3P1C1R5nHEJt479/217avyc5yR1toxHSAIG5rGZMeuCNgbGTthOVyOa+ xSbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741289276; x=1741894076; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kc7jX9qtPYDjRxcz+4Coy64UTqRzxhOB9wDk1hO9HmQ=; b=LBoTBIf19TOpJdHy+Ao2+LmBaCfQGp0bmPUZWjkNk3Llo743IPdBpLTG2TJgmwPgFF 19Pgzpn/u7F1w0x4kDOv6fsWjOnGTmaJpR8J7FdMUCUT6lSxmVyrpfM7/paeZ9lhIFZG 6lFLm7sEfAFipO8qObdLgT/jeqfoeddS+C5we3m/0D4PkLD9N55sE0dgY2e5Xgs442pS o3YhkQPaDFocviwfXEBcPtKXknMFMWKbA73ncIY6nD5IPTYzIw8LLre5OcjMYNf9hPyD QiD7nCcHeo1espf8mAcryUYf8QftnTKUayjL1dtrBw2LLKccSpk6+6cRhnAvKXnO09l8 trRw== X-Forwarded-Encrypted: i=1; AJvYcCUzCsO6Ow6YeltPTSwxKIVDgHD/mBQCXxr1Tla0eHy5jfz05QvNqvWRRDzuVVPVPcb/TraDuoG7poG1Yl8=@vger.kernel.org, AJvYcCWj84/hZe13j8ZO1XySg9hLLEzMRSjh6p+yI8rnGwm4a5bVWdiawtF9T78eksEpTvQ3YkU528Si@vger.kernel.org X-Gm-Message-State: AOJu0Yw6ZA/1/VzEHwJqKWcU75J+1ootIErrlnkiM305sfH3kbaPvvIK hNjKNoR2QpLVICGrvY09k2sGU2sqtmJBigx4geCFviiTlLZ4v9it X-Gm-Gg: ASbGncuD5Pr+fb7s/c57nzcZWLv3QoX3cNBqnKQPatg8oG8cNWnAwQIysGZHKbr0NCf 7e4NTYlRw4Csnk6iGVjJnZ67AQB3+DqoNsxjWDNEp2gPjR95CWtURMLGl7LVpbGiXa43kLhBDa/ LwqXV3Hc1bNWhoBb1Npkh2EOeyhYiF62i2jE9ZJ+BVEA4JGFf/XOhXQPjbBJ4gvRRFTQJ9Jve9i iztoopaUid8TDAJctEnIzKWqS0YoEteg6VcHxNg23kXlMUHSVAUzB6ykCTO0KlbZcsqpdo5Rel1 THhWhFqVyyvRX0vdUj/9XSSdHaqCtY3NN6P7GiauMXk1loPbKTdLF55BgC/NZB2zia7+tN0k8hO rjVQn/bNfs7fC X-Google-Smtp-Source: AGHT+IHFCm8xw5wiFGK5E7Ccz6cZHMm5SzXYU2T1YwRgRbtfma6K9g+rAw2inSQq5rXkIeHBIM8aSA== X-Received: by 2002:a05:6830:3490:b0:72a:1a9f:7dde with SMTP id 46e09a7af769-72a37b978d4mr323332a34.9.1741289276076; Thu, 06 Mar 2025 11:27:56 -0800 (PST) Received: from stbirv-lnx-1.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-72a2dac3887sm366338a34.7.2025.03.06.11.27.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 06 Mar 2025 11:27:55 -0800 (PST) From: Doug Berger To: Florian Fainelli , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Broadcom internal kernel review list , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Doug Berger Subject: [PATCH net-next 14/14] net: bcmgenet: revise suspend/resume Date: Thu, 6 Mar 2025 11:26:42 -0800 Message-Id: <20250306192643.2383632-15-opendmb@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250306192643.2383632-1-opendmb@gmail.com> References: <20250306192643.2383632-1-opendmb@gmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: kuba@kernel.org If the network interface is configured for Wake-on-LAN we should avoid bringing the interface down and up since it slows the time to reestablish network traffic on resume. Redundant calls to phy_suspend() and phy_resume() are removed since they are already invoked from within phy_stop() and phy_start() called from bcmgenet_netif_stop() and bcmgenet_netif_start(). Signed-off-by: Doug Berger Reviewed-by: Florian Fainelli --- .../net/ethernet/broadcom/genet/bcmgenet.c | 100 +++++++++++++++--- .../net/ethernet/broadcom/genet/bcmgenet.h | 2 + .../ethernet/broadcom/genet/bcmgenet_wol.c | 69 ++++++------ 3 files changed, 119 insertions(+), 52 deletions(-) diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c index 8aa575b93e56..73d78dcb774d 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -2584,7 +2584,7 @@ static void init_umac(struct bcmgenet_priv *priv) /* Enable MDIO interrupts on GENET v3+ */ if (bcmgenet_has_mdio_intr(priv)) - int0_enable |= (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR); + int0_enable |= UMAC_IRQ_MDIO_EVENT; bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR); @@ -3150,10 +3150,8 @@ static irqreturn_t bcmgenet_isr0(int irq, void *dev_id) netif_dbg(priv, intr, priv->dev, "IRQ=0x%x\n", status); - if (bcmgenet_has_mdio_intr(priv) && - status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) { + if (bcmgenet_has_mdio_intr(priv) && status & UMAC_IRQ_MDIO_EVENT) wake_up(&priv->wq); - } /* all other interested interrupts handled in bottom half */ status &= (UMAC_IRQ_LINK_EVENT | UMAC_IRQ_PHY_DET_R); @@ -3311,19 +3309,21 @@ static void bcmgenet_netif_stop(struct net_device *dev, bool stop_phy) { struct bcmgenet_priv *priv = netdev_priv(dev); - bcmgenet_disable_tx_napi(priv); netif_tx_disable(dev); /* Disable MAC receive */ + bcmgenet_hfb_reg_writel(priv, 0, HFB_CTRL); umac_enable_set(priv, CMD_RX_EN, false); + if (stop_phy) + phy_stop(dev->phydev); + bcmgenet_dma_teardown(priv); /* Disable MAC transmit. TX DMA disabled must be done before this */ umac_enable_set(priv, CMD_TX_EN, false); - if (stop_phy) - phy_stop(dev->phydev); + bcmgenet_disable_tx_napi(priv); bcmgenet_disable_rx_napi(priv); bcmgenet_intr_disable(priv); @@ -4043,7 +4043,10 @@ static int bcmgenet_resume_noirq(struct device *d) pm_wakeup_event(&priv->pdev->dev, 0); /* From WOL-enabled suspend, switch to regular clock */ - bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC); + if (!bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC)) + return 0; + + /* Failed so fall through to reset MAC */ } /* If this is an internal GPHY, power it back on now, before UniMAC is @@ -4055,8 +4058,6 @@ static int bcmgenet_resume_noirq(struct device *d) /* take MAC out of reset */ bcmgenet_umac_reset(priv); - bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_WAKE_EVENT, INTRL2_CPU_CLEAR); - return 0; } @@ -4066,10 +4067,46 @@ static int bcmgenet_resume(struct device *d) struct bcmgenet_priv *priv = netdev_priv(dev); struct bcmgenet_rxnfc_rule *rule; int ret; + u32 reg; if (!netif_running(dev)) return 0; + if (device_may_wakeup(d) && priv->wolopts) { + reg = bcmgenet_umac_readl(priv, UMAC_CMD); + if (reg & CMD_RX_EN) { + /* Successfully exited WoL, just resume data flows */ + list_for_each_entry(rule, &priv->rxnfc_list, list) + if (rule->state == BCMGENET_RXNFC_STATE_ENABLED) + bcmgenet_hfb_enable_filter(priv, + rule->fs.location + 1); + bcmgenet_hfb_enable_filter(priv, 0); + bcmgenet_set_rx_mode(dev); + bcmgenet_enable_rx_napi(priv); + + /* Reinitialize Tx flows */ + bcmgenet_tdma_disable(priv); + bcmgenet_init_tx_queues(priv->dev); + reg = bcmgenet_tdma_readl(priv, DMA_CTRL); + reg |= DMA_EN; + bcmgenet_tdma_writel(priv, reg, DMA_CTRL); + bcmgenet_enable_tx_napi(priv); + + bcmgenet_link_intr_enable(priv); + phy_start_machine(dev->phydev); + + netif_device_attach(dev); + enable_irq(priv->irq1); + return 0; + } + /* MAC was reset so complete bcmgenet_netif_stop() */ + umac_enable_set(priv, CMD_RX_EN | CMD_TX_EN, false); + bcmgenet_rdma_disable(priv); + bcmgenet_intr_disable(priv); + bcmgenet_fini_dma(priv); + enable_irq(priv->irq1); + } + init_umac(priv); phy_init_hw(dev->phydev); @@ -4116,19 +4153,52 @@ static int bcmgenet_suspend(struct device *d) { struct net_device *dev = dev_get_drvdata(d); struct bcmgenet_priv *priv = netdev_priv(dev); + struct bcmgenet_rxnfc_rule *rule; + u32 reg, hfb_enable = 0; if (!netif_running(dev)) return 0; netif_device_detach(dev); - bcmgenet_netif_stop(dev, true); + if (device_may_wakeup(d) && priv->wolopts) { + netif_tx_disable(dev); + + /* Suspend non-wake Rx data flows */ + if (priv->wolopts & WAKE_FILTER) + list_for_each_entry(rule, &priv->rxnfc_list, list) + if (rule->fs.ring_cookie == RX_CLS_FLOW_WAKE && + rule->state == BCMGENET_RXNFC_STATE_ENABLED) + hfb_enable |= 1 << rule->fs.location; + reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); + if (GENET_IS_V1(priv) || GENET_IS_V2(priv)) { + reg &= ~RBUF_HFB_FILTER_EN_MASK; + reg |= hfb_enable << (RBUF_HFB_FILTER_EN_SHIFT + 1); + } else { + bcmgenet_hfb_reg_writel(priv, hfb_enable << 1, + HFB_FLT_ENABLE_V3PLUS + 4); + } + if (!hfb_enable) + reg &= ~RBUF_HFB_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); - if (!device_may_wakeup(d)) - phy_suspend(dev->phydev); + /* Clear any old filter matches so only new matches wake */ + bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET); + bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR); - /* Disable filtering */ - bcmgenet_hfb_reg_writel(priv, 0, HFB_CTRL); + if (-ETIMEDOUT == bcmgenet_tdma_disable(priv)) + netdev_warn(priv->dev, + "Timed out while disabling TX DMA\n"); + + bcmgenet_disable_tx_napi(priv); + bcmgenet_disable_rx_napi(priv); + disable_irq(priv->irq1); + bcmgenet_tx_reclaim_all(dev); + bcmgenet_fini_tx_napi(priv); + } else { + /* Teardown the interface */ + bcmgenet_netif_stop(dev, true); + } return 0; } diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h index c95601898bd4..10c631bbe964 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -274,6 +274,8 @@ struct bcmgenet_mib_counters { /* Only valid for GENETv3+ */ #define UMAC_IRQ_MDIO_DONE (1 << 23) #define UMAC_IRQ_MDIO_ERROR (1 << 24) +#define UMAC_IRQ_MDIO_EVENT (UMAC_IRQ_MDIO_DONE | \ + UMAC_IRQ_MDIO_ERROR) /* INTRL2 instance 1 definitions */ #define UMAC_IRQ1_TX_INTR_MASK 0xFFFF diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c index d0f1fa702917..8fb551288298 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c @@ -145,8 +145,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, enum bcmgenet_power_mode mode) { struct net_device *dev = priv->dev; - struct bcmgenet_rxnfc_rule *rule; - u32 reg, hfb_ctrl_reg, hfb_enable = 0; + u32 reg, hfb_ctrl_reg; int retries = 0; if (mode != GENET_POWER_WOL_MAGIC) { @@ -154,18 +153,6 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, return -EINVAL; } - /* Can't suspend with WoL if MAC is still in reset */ - spin_lock_bh(&priv->reg_lock); - reg = bcmgenet_umac_readl(priv, UMAC_CMD); - if (reg & CMD_SW_RESET) - reg &= ~CMD_SW_RESET; - - /* disable RX */ - reg &= ~CMD_RX_EN; - bcmgenet_umac_writel(priv, reg, UMAC_CMD); - spin_unlock_bh(&priv->reg_lock); - mdelay(10); - if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { reg = bcmgenet_umac_readl(priv, UMAC_MPD_CTRL); reg |= MPD_EN; @@ -177,13 +164,8 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, } hfb_ctrl_reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); - if (priv->wolopts & WAKE_FILTER) { - list_for_each_entry(rule, &priv->rxnfc_list, list) - if (rule->fs.ring_cookie == RX_CLS_FLOW_WAKE) - hfb_enable |= (1 << (rule->fs.location + 1)); - reg = (hfb_ctrl_reg & ~RBUF_HFB_EN) | RBUF_ACPI_EN; - bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); - } + reg = hfb_ctrl_reg | RBUF_ACPI_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); /* Do not leave UniMAC in MPD mode only */ retries = bcmgenet_poll_wol_status(priv); @@ -198,14 +180,12 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, netif_dbg(priv, wol, dev, "MPD WOL-ready status set after %d msec\n", retries); - clk_prepare_enable(priv->clk_wol); + /* Disable phy status updates while suspending */ + mutex_lock(&dev->phydev->lock); + dev->phydev->state = PHY_READY; + mutex_unlock(&dev->phydev->lock); - if (hfb_enable) { - bcmgenet_hfb_reg_writel(priv, hfb_enable, - HFB_FLT_ENABLE_V3PLUS + 4); - hfb_ctrl_reg = RBUF_HFB_EN | RBUF_ACPI_EN; - bcmgenet_hfb_reg_writel(priv, hfb_ctrl_reg, HFB_CTRL); - } + clk_prepare_enable(priv->clk_wol); /* Enable CRC forward */ spin_lock_bh(&priv->reg_lock); @@ -213,13 +193,17 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, priv->crc_fwd_en = 1; reg |= CMD_CRC_FWD; + /* Can't suspend with WoL if MAC is still in reset */ + if (reg & CMD_SW_RESET) + reg &= ~CMD_SW_RESET; + /* Receiver must be enabled for WOL MP detection */ reg |= CMD_RX_EN; bcmgenet_umac_writel(priv, reg, UMAC_CMD); spin_unlock_bh(&priv->reg_lock); reg = UMAC_IRQ_MPD_R; - if (hfb_enable) + if (hfb_ctrl_reg & RBUF_HFB_EN) reg |= UMAC_IRQ_HFB_SM | UMAC_IRQ_HFB_MM; bcmgenet_intrl2_0_writel(priv, reg, INTRL2_CPU_MASK_CLEAR); @@ -230,6 +214,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, enum bcmgenet_power_mode mode) { + struct net_device *dev = priv->dev; u32 reg; if (mode != GENET_POWER_WOL_MAGIC) { @@ -242,6 +227,10 @@ int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_WAKE_EVENT, INTRL2_CPU_MASK_SET); + if (bcmgenet_has_mdio_intr(priv)) + bcmgenet_intrl2_0_writel(priv, + UMAC_IRQ_MDIO_EVENT, + INTRL2_CPU_MASK_CLEAR); /* Disable Magic Packet Detection */ if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) { @@ -252,14 +241,12 @@ int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, bcmgenet_umac_writel(priv, reg, UMAC_MPD_CTRL); } - /* Disable WAKE_FILTER Detection */ - if (priv->wolopts & WAKE_FILTER) { - reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); - if (!(reg & RBUF_ACPI_EN)) - return -EPERM; /* already reset so skip the rest */ - reg &= ~(RBUF_HFB_EN | RBUF_ACPI_EN); - bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); - } + /* Disable ACPI mode */ + reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL); + if (!(reg & RBUF_ACPI_EN)) + return -EPERM; /* already reset so skip the rest */ + reg &= ~RBUF_ACPI_EN; + bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL); /* Disable CRC Forward */ spin_lock_bh(&priv->reg_lock); @@ -268,5 +255,13 @@ int bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, bcmgenet_umac_writel(priv, reg, UMAC_CMD); spin_unlock_bh(&priv->reg_lock); + /* Resume link status tracking */ + mutex_lock(&dev->phydev->lock); + if (dev->phydev->link) + dev->phydev->state = PHY_RUNNING; + else + dev->phydev->state = PHY_NOLINK; + mutex_unlock(&dev->phydev->lock); + return 0; }