From nobody Sat Feb 7 09:30:12 2026 Received: from mail-yw1-f228.google.com (mail-yw1-f228.google.com [209.85.128.228]) (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 CE3332BF3D7 for ; Tue, 26 Aug 2025 11:18:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756207085; cv=none; b=Cem4KK3Z/rwrqdfLvrC0j+UwqCmCIAsZbOYX1svJf3U1L6T7ZdP9312EjAXfeffkWHpNM+b4z6sofHI+9S0s+duYJ4UeecB6znZHpxazPO50b5i6GthX0toAwb7IhWCm2spOZbQ72B9GR0kyXhVJup6XRk17xM4dUJoKNGePrhQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756207085; c=relaxed/simple; bh=yuCQW35VCn5Mfjnf5UY/8rS5iZApftj+Cj8ez528CIA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nav0MlPIWFmpoXUC5VujeR8gIxqW9eASC4xaYbFgYaVE8BgJLQRoajVNVMjt2BPv4YkIpnJUVGbUPSb8q0wW91HyQmkMam/QDGZUWUch60uXaddcpdgTcfyBpOSi7dKfSh3VTyi6db6t4JC4BOBOnt1osVTZBgmUeRiMgaD3U0k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=IgkiIM2c; arc=none smtp.client-ip=209.85.128.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="IgkiIM2c" Received: by mail-yw1-f228.google.com with SMTP id 00721157ae682-71d71bcac45so43149417b3.0 for ; Tue, 26 Aug 2025 04:18:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756207083; x=1756811883; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=1EjIQuaPFKIuGLbugDdugNJOHSl9PeJMisU1sGa+1ZQ=; b=OUMz+wQuGaxVly9aXSLyWC/BlxYg7L0g+qf2PRNE3jAI1U4i4wYFK1Cn8zAVXvtCTg E6iDEfhV2aeb2wsBE6M1wXst/DqPoVMAEiVbflTLQv2+GYXJvjHz88dcl/FoifhoQO5o quJXBrCaa0Uc52E6eKdB2vacoDZJ2StGmLPufvScJk0WArPjXvBhDm5lg0cX7MEs/jaF dK5n0uupHE5AiDJyIGH8bCN4LEKWXJ88AESzrrv+Mrc0MSmsG+INM6iMWVCM4RDwDfSw xjAFF65FuLiJweoxhGl4MisC59O4pEZNrq4xyl715mTEbel+T50OdFiVCP3dee3lN/C8 LrZA== X-Forwarded-Encrypted: i=1; AJvYcCXDt9wZa6xn21WxCqy6ueFRSP92xHaxMozdCAS84eKWS7P4xbJWNq1NCcp1SmrDsKXtEowe+4JS4t+LFeM=@vger.kernel.org X-Gm-Message-State: AOJu0Yzem5ngBG9RbjY25fwqWsTfKjWyxOZRdBi8WOBbrzpYYXVHuASW 4IEo3KzDoajqxYslR9sRS41irDuxHhcbenfEMO9Let4loOfJmko5Er2TEIZMjP7zx8h/hxtgfjw oifbYNK+XJn7Ia7nS55ImeXOAhBoVnoUTiptxDtPmSMzm8W/xs0OAd9GtP97oYd3m3LYPgRk908 J3YGTWlfwwELeza+V99ffCHPYz6gSm422/RPZU+sjojN9wg+itEKOdHr31+M4f1YSTsW7hI/0Fa tnL2hIblRyPimSYpGW8i71NXBqj X-Gm-Gg: ASbGncvDeUi38FCBV0I4X/PRth2jyZiPOfig9eZyzI2Ctqu/evoVF8cTCAQ5xQixaWL vQXmV6DlpcWiJ7v2ZvOiZ4kQZKDSbyz2B9bHSAasz0dqlcvMfKM2RZUwK2XFX0sr/Og49EYn70T RmWTaEHtGDuJJIh8aSAokVvRW4m7MmrtlmBgLcaJYGU19KdZYb8Socdjq+Me7CP6xv4VJAsUlwO DJez0G6deylJYZ0lPmIhmcVdaFJJvjsZOiHdq+ubrqIii1meKAaW/tZg3R7B35orrfPEH1/uc3K 6LiT6DFFYiJIqBz5JgjsobsqKeFenz2KFy5SrpjjFoTAR5nY7RKzN6sTKyYzZ7pTdQ31kflBOhq 2ULMzQuEWLzFoyxFyVQokvsScO1s/V0nG/JZWdS/ISZI2hfYdbpi284aA6uFvmAavGbByaFsJcO Um7KSKQg== X-Google-Smtp-Source: AGHT+IHWe5vWX44c9sAPfjNv4HdUuxS+flaeRGcOAqdLnC1wlDeup+V0L8NAnM6kJVr+kLa/lSAnhS7bUTI8 X-Received: by 2002:a05:690c:fca:b0:721:248b:97a4 with SMTP id 00721157ae682-721248bab83mr39940997b3.37.1756207082789; Tue, 26 Aug 2025 04:18:02 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-11.dlp.protect.broadcom.com. [144.49.247.11]) by smtp-relay.gmail.com with ESMTPS id 00721157ae682-71ff16f6c06sm5129537b3.16.2025.08.26.04.18.02 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 26 Aug 2025 04:18:02 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-77053dd5eecso4881267b3a.3 for ; Tue, 26 Aug 2025 04:18:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1756207081; x=1756811881; 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=1EjIQuaPFKIuGLbugDdugNJOHSl9PeJMisU1sGa+1ZQ=; b=IgkiIM2ch18BIVeQFu2pQ4qJSLT1pM53xG/t7UQAFnrMg0KIrjmwFymx6qWzu5+Cyy fDE4FGHFyo6PHbdd06XsooU9U6fMz8FwC0sPcJ+LNi0HXhzMuzCv83xwdA7azUPgN4lp BVplOjLLYSU0mG1UmRQL29ZnRSecnU2/pVHaU= X-Forwarded-Encrypted: i=1; AJvYcCXQVzQmh59mGOYp7wPnB4K9Ckj/OsGS2QG1FcdU0dnkz7cdEwKGvCILHV0E/JqXKbvzw1vzNGhnKtD+Kqc=@vger.kernel.org X-Received: by 2002:a05:6a00:1a94:b0:771:e8be:8390 with SMTP id d2e1a72fcca58-771e8be87b2mr7649107b3a.14.1756207081303; Tue, 26 Aug 2025 04:18:01 -0700 (PDT) X-Received: by 2002:a05:6a00:1a94:b0:771:e8be:8390 with SMTP id d2e1a72fcca58-771e8be87b2mr7649062b3a.14.1756207080770; Tue, 26 Aug 2025 04:18:00 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-77054bb0c46sm7280339b3a.41.2025.08.26.04.17.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Aug 2025 04:18:00 -0700 (PDT) From: Bhargava Marreddy To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, vsrama-krishna.nemani@broadcom.com, Bhargava Marreddy , Vikas Gupta , Rajashekar Hudumula Subject: [v4, net-next 8/9] bng_en: Register default VNIC Date: Tue, 26 Aug 2025 16:44:11 +0000 Message-ID: <20250826164412.220565-9-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250826164412.220565-1-bhargava.marreddy@broadcom.com> References: <20250826164412.220565-1-bhargava.marreddy@broadcom.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Allocate the default VNIC with the firmware and configure its RSS, HDS, and Jumbo parameters. Add related functions to support VNIC configuration for these parameters. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge.h | 1 + .../net/ethernet/broadcom/bnge/bnge_core.c | 12 + .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 207 ++++++++++++++++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 19 ++ .../net/ethernet/broadcom/bnge/bnge_netdev.c | 134 ++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 4 + .../net/ethernet/broadcom/bnge/bnge_resc.c | 2 +- .../net/ethernet/broadcom/bnge/bnge_resc.h | 1 + 8 files changed, 379 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index 642e16f511d5..d4c05688fc2e 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -164,6 +164,7 @@ struct bnge_dev { u16 rss_indir_tbl_entries; =20 u32 rss_cap; + u32 rss_hash_cfg; =20 u16 rx_nr_rings; u16 tx_nr_rings; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_core.c b/drivers/net/e= thernet/broadcom/bnge/bnge_core.c index 56a3dd2a23ee..b3524db56115 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_core.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_core.c @@ -102,6 +102,16 @@ static void bnge_fw_unregister_dev(struct bnge_dev *bd) bnge_free_ctx_mem(bd); } =20 +static void bnge_set_dflt_rss_hash_type(struct bnge_dev *bd) +{ + bd->rss_hash_cfg =3D VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 | + VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6 | + VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6; +} + static int bnge_fw_register_dev(struct bnge_dev *bd) { int rc; @@ -143,6 +153,8 @@ static int bnge_fw_register_dev(struct bnge_dev *bd) goto err_func_unrgtr; } =20 + bnge_set_dflt_rss_hash_type(bd); + return 0; =20 err_func_unrgtr: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index a7c18a57fbca..fd54c72b0ad0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include =20 #include "bnge.h" #include "bnge_hwrm.h" @@ -702,6 +704,211 @@ int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd) return rc; } =20 +int bnge_hwrm_vnic_set_hds(struct bnge_net *bn, struct bnge_vnic_info *vni= c) +{ + u16 hds_thresh =3D (u16)bn->netdev->cfg_pending->hds_thresh; + struct hwrm_vnic_plcmodes_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_PLCMODES_CFG); + if (rc) + return rc; + + req->flags =3D cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_JUMBO_PLACEMENT); + req->enables =3D cpu_to_le32(BNGE_PLC_EN_JUMBO_THRES_VALID); + req->jumbo_thresh =3D cpu_to_le16(bn->rx_buf_use_size); + + if (bnge_is_agg_reqd(bd)) { + req->flags |=3D cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 | + VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6); + req->enables |=3D + cpu_to_le32(BNGE_PLC_EN_HDS_THRES_VALID); + req->hds_threshold =3D cpu_to_le16(hds_thresh); + } + req->vnic_id =3D cpu_to_le32(vnic->fw_vnic_id); + return bnge_hwrm_req_send(bd, req); +} + +int bnge_hwrm_vnic_ctx_alloc(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx) +{ + struct hwrm_vnic_rss_cos_lb_ctx_alloc_output *resp; + struct hwrm_vnic_rss_cos_lb_ctx_alloc_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_COS_LB_CTX_ALLOC); + if (rc) + return rc; + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (!rc) + vnic->fw_rss_cos_lb_ctx[ctx_idx] =3D + le16_to_cpu(resp->rss_cos_lb_ctx_id); + bnge_hwrm_req_drop(bd, req); + + return rc; +} + +static void +__bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct hwrm_vnic_rss_cfg_input *req, + struct bnge_vnic_info *vnic) +{ + struct bnge_dev *bd =3D bn->bd; + + bnge_fill_hw_rss_tbl(bn, vnic); + req->flags |=3D VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT; + + req->hash_type =3D cpu_to_le32(bd->rss_hash_cfg); + req->hash_mode_flags =3D VNIC_RSS_CFG_REQ_HASH_MODE_FLAGS_DEFAULT; + req->ring_grp_tbl_addr =3D cpu_to_le64(vnic->rss_table_dma_addr); + req->hash_key_tbl_addr =3D cpu_to_le64(vnic->rss_hash_key_dma_addr); +} + +int bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct bnge_vnic_info *vnic, bool set_rss) +{ + struct hwrm_vnic_rss_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + dma_addr_t ring_tbl_map; + u32 i, nr_ctxs; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_CFG); + if (rc) + return rc; + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + if (!set_rss) + return bnge_hwrm_req_send(bd, req); + + __bnge_hwrm_vnic_set_rss(bn, req, vnic); + ring_tbl_map =3D vnic->rss_table_dma_addr; + nr_ctxs =3D bnge_get_nr_rss_ctxs(bd->rx_nr_rings); + + bnge_hwrm_req_hold(bd, req); + for (i =3D 0; i < nr_ctxs; ring_tbl_map +=3D BNGE_RSS_TABLE_SIZE, i++) { + req->ring_grp_tbl_addr =3D cpu_to_le64(ring_tbl_map); + req->ring_table_pair_index =3D i; + req->rss_ctx_idx =3D cpu_to_le16(vnic->fw_rss_cos_lb_ctx[i]); + rc =3D bnge_hwrm_req_send(bd, req); + if (rc) + goto exit; + } + +exit: + bnge_hwrm_req_drop(bd, req); + return rc; +} + +int bnge_hwrm_vnic_cfg(struct bnge_net *bn, struct bnge_vnic_info *vnic) +{ + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[0]; + struct hwrm_vnic_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_CFG); + if (rc) + return rc; + + req->default_rx_ring_id =3D + cpu_to_le16(rxr->rx_ring_struct.fw_ring_id); + req->default_cmpl_ring_id =3D + cpu_to_le16(bnge_cp_ring_for_rx(rxr)); + req->enables =3D + cpu_to_le32(VNIC_CFG_REQ_ENABLES_DEFAULT_RX_RING_ID | + VNIC_CFG_REQ_ENABLES_DEFAULT_CMPL_RING_ID); + vnic->mru =3D bd->netdev->mtu + ETH_HLEN + VLAN_HLEN; + req->mru =3D cpu_to_le16(vnic->mru); + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + + if (bd->flags & BNGE_EN_STRIP_VLAN) + req->flags |=3D cpu_to_le32(VNIC_CFG_REQ_FLAGS_VLAN_STRIP_MODE); + if (vnic->vnic_id =3D=3D BNGE_VNIC_DEFAULT && bnge_aux_registered(bd)) + req->flags |=3D cpu_to_le32(BNGE_VNIC_CFG_ROCE_DUAL_MODE); + + return bnge_hwrm_req_send(bd, req); +} + +void bnge_hwrm_update_rss_hash_cfg(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct hwrm_vnic_rss_qcfg_output *resp; + struct hwrm_vnic_rss_qcfg_input *req; + struct bnge_dev *bd =3D bn->bd; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_QCFG)) + return; + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + /* all contexts configured to same hash_type, zero always exists */ + req->rss_ctx_idx =3D cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]); + resp =3D bnge_hwrm_req_hold(bd, req); + if (!bnge_hwrm_req_send(bd, req)) + bd->rss_hash_cfg =3D + le32_to_cpu(resp->hash_type) ?: bd->rss_hash_cfg; + bnge_hwrm_req_drop(bd, req); +} + +int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bnge_vnic_info *vnic, + unsigned int nr_rings) +{ + struct hwrm_vnic_alloc_output *resp; + struct hwrm_vnic_alloc_input *req; + unsigned int i; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_ALLOC); + if (rc) + return rc; + + for (i =3D 0; i < BNGE_MAX_CTX_PER_VNIC; i++) + vnic->fw_rss_cos_lb_ctx[i] =3D INVALID_HW_RING_ID; + if (vnic->vnic_id =3D=3D BNGE_VNIC_DEFAULT) + req->flags =3D cpu_to_le32(VNIC_ALLOC_REQ_FLAGS_DEFAULT); + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (!rc) + vnic->fw_vnic_id =3D le32_to_cpu(resp->vnic_id); + bnge_hwrm_req_drop(bd, req); + return rc; +} + +void bnge_hwrm_vnic_free_one(struct bnge_dev *bd, struct bnge_vnic_info *v= nic) +{ + if (vnic->fw_vnic_id !=3D INVALID_HW_RING_ID) { + struct hwrm_vnic_free_input *req; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_FREE)) + return; + + req->vnic_id =3D cpu_to_le32(vnic->fw_vnic_id); + + bnge_hwrm_req_send(bd, req); + vnic->fw_vnic_id =3D INVALID_HW_RING_ID; + } +} + +void bnge_hwrm_vnic_ctx_free_one(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx) +{ + struct hwrm_vnic_rss_cos_lb_ctx_free_input *req; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_COS_LB_CTX_FREE)) + return; + + req->rss_cos_lb_ctx_id =3D + cpu_to_le16(vnic->fw_rss_cos_lb_ctx[ctx_idx]); + + bnge_hwrm_req_send(bd, req); + vnic->fw_rss_cos_lb_ctx[ctx_idx] =3D INVALID_HW_RING_ID; +} + void bnge_hwrm_stat_ctx_free(struct bnge_net *bn) { struct hwrm_stat_ctx_free_input *req; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index b2e2ec47be2e..09517ffb1a21 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -4,6 +4,13 @@ #ifndef _BNGE_HWRM_LIB_H_ #define _BNGE_HWRM_LIB_H_ =20 +#define BNGE_PLC_EN_JUMBO_THRES_VALID \ + VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID +#define BNGE_PLC_EN_HDS_THRES_VALID \ + VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID +#define BNGE_VNIC_CFG_ROCE_DUAL_MODE \ + VNIC_CFG_REQ_FLAGS_ROCE_DUAL_VNIC_MODE + int bnge_hwrm_ver_get(struct bnge_dev *bd); int bnge_hwrm_func_reset(struct bnge_dev *bd); int bnge_hwrm_fw_set_time(struct bnge_dev *bd); @@ -24,6 +31,18 @@ int bnge_hwrm_func_qcfg(struct bnge_dev *bd); int bnge_hwrm_func_resc_qcaps(struct bnge_dev *bd); int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd); =20 +int bnge_hwrm_vnic_set_hds(struct bnge_net *bn, struct bnge_vnic_info *vni= c); +int bnge_hwrm_vnic_ctx_alloc(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx); +int bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct bnge_vnic_info *vnic, bool set_rss); +int bnge_hwrm_vnic_cfg(struct bnge_net *bn, struct bnge_vnic_info *vnic); +void bnge_hwrm_update_rss_hash_cfg(struct bnge_net *bn); +int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bnge_vnic_info *vnic, + unsigned int nr_rings); +void bnge_hwrm_vnic_free_one(struct bnge_dev *bd, struct bnge_vnic_info *v= nic); +void bnge_hwrm_vnic_ctx_free_one(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx); void bnge_hwrm_stat_ctx_free(struct bnge_net *bn); int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn); int hwrm_ring_free_send_msg(struct bnge_net *bn, struct bnge_ring_struct *= ring, diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 5b56a1d0e8d5..30381d9a0734 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -1433,6 +1433,117 @@ static int bnge_hwrm_ring_alloc(struct bnge_net *bn) return rc; } =20 +int bnge_get_nr_rss_ctxs(int rx_rings) +{ + if (!rx_rings) + return 0; + return bnge_adjust_pow_two(rx_rings - 1, BNGE_RSS_TABLE_ENTRIES); +} + +void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic) +{ + __le16 *ring_tbl =3D vnic->rss_table; + struct bnge_rx_ring_info *rxr; + struct bnge_dev *bd =3D bn->bd; + u16 tbl_size, i; + + tbl_size =3D bnge_get_rxfh_indir_size(bd); + + for (i =3D 0; i < tbl_size; i++) { + u16 ring_id, j; + + j =3D bd->rss_indir_tbl[i]; + rxr =3D &bn->rx_ring[j]; + + ring_id =3D rxr->rx_ring_struct.fw_ring_id; + *ring_tbl++ =3D cpu_to_le16(ring_id); + ring_id =3D bnge_cp_ring_for_rx(rxr); + *ring_tbl++ =3D cpu_to_le16(ring_id); + } +} + +static int bnge_hwrm_vnic_rss_cfg(struct bnge_net *bn, + struct bnge_vnic_info *vnic) +{ + int rc; + + rc =3D bnge_hwrm_vnic_set_rss(bn, vnic, true); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic %d set rss failure rc: %d\n", + vnic->vnic_id, rc); + return rc; + } + rc =3D bnge_hwrm_vnic_cfg(bn, vnic); + if (rc) + netdev_err(bn->netdev, "hwrm vnic %d cfg failure rc: %d\n", + vnic->vnic_id, rc); + return rc; +} + +static int bnge_setup_vnic(struct bnge_net *bn, struct bnge_vnic_info *vni= c) +{ + struct bnge_dev *bd =3D bn->bd; + int rc, i, nr_ctxs; + + nr_ctxs =3D bnge_get_nr_rss_ctxs(bd->rx_nr_rings); + for (i =3D 0; i < nr_ctxs; i++) { + rc =3D bnge_hwrm_vnic_ctx_alloc(bd, vnic, i); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic %d ctx %d alloc failure rc: %d\n", + vnic->vnic_id, i, rc); + break; + } + bn->rsscos_nr_ctxs++; + } + if (i < nr_ctxs) + return -ENOMEM; + + rc =3D bnge_hwrm_vnic_rss_cfg(bn, vnic); + if (rc) + return rc; + + if (bnge_is_agg_reqd(bd)) { + rc =3D bnge_hwrm_vnic_set_hds(bn, vnic); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic %d set hds failure rc: %d\n", + vnic->vnic_id, rc); + } + } + return rc; +} + +static void bnge_hwrm_vnic_free(struct bnge_net *bn) +{ + int i; + + for (i =3D 0; i < bn->nr_vnics; i++) + bnge_hwrm_vnic_free_one(bn->bd, &bn->vnic_info[i]); +} + +static void bnge_hwrm_vnic_ctx_free(struct bnge_net *bn) +{ + int i, j; + + for (i =3D 0; i < bn->nr_vnics; i++) { + struct bnge_vnic_info *vnic =3D &bn->vnic_info[i]; + + for (j =3D 0; j < BNGE_MAX_CTX_PER_VNIC; j++) { + if (vnic->fw_rss_cos_lb_ctx[j] !=3D INVALID_HW_RING_ID) + bnge_hwrm_vnic_ctx_free_one(bn->bd, vnic, j); + } + } + bn->rsscos_nr_ctxs =3D 0; +} + +static void bnge_clear_vnic(struct bnge_net *bn) +{ + if (!bn->vnic_info) + return; + + bnge_hwrm_vnic_free(bn); + bnge_hwrm_vnic_ctx_free(bn); +} + static void bnge_hwrm_rx_ring_free(struct bnge_net *bn, struct bnge_rx_ring_info *rxr, bool close_path) @@ -1593,6 +1704,7 @@ static int bnge_setup_interrupts(struct bnge_net *bn) =20 static void bnge_hwrm_resource_free(struct bnge_net *bn, bool close_path) { + bnge_clear_vnic(bn); bnge_hwrm_ring_free(bn, close_path); bnge_hwrm_stat_ctx_free(bn); } @@ -1640,6 +1752,8 @@ static int bnge_request_irq(struct bnge_net *bn) =20 static int bnge_init_chip(struct bnge_net *bn) { + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct bnge_dev *bd =3D bn->bd; int rc =3D 0; =20 #define BNGE_DEF_STATS_COAL_TICKS 1000000 @@ -1658,6 +1772,18 @@ static int bnge_init_chip(struct bnge_net *bn) goto err_out; } =20 + rc =3D bnge_hwrm_vnic_alloc(bd, vnic, bd->rx_nr_rings); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic alloc failure rc: %d\n", rc); + goto err_out; + } + + rc =3D bnge_setup_vnic(bn, vnic); + if (rc) + goto err_out; + if (bd->rss_cap & BNGE_RSS_CAP_RSS_HASH_TYPE_DELTA) + bnge_hwrm_update_rss_hash_cfg(bn); + return 0; err_out: bnge_hwrm_resource_free(bn, 0); @@ -1811,11 +1937,19 @@ static int bnge_open(struct net_device *dev) return rc; } =20 +static int bnge_shutdown_nic(struct bnge_net *bn) +{ + /* TODO: close_path =3D 0 until we make NAPI functional */ + bnge_hwrm_resource_free(bn, 0); + return 0; +} + static void bnge_close_core(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; =20 clear_bit(BNGE_STATE_OPEN, &bd->state); + bnge_shutdown_nic(bn); bnge_free_pkts_mem(bn); bnge_free_irq(bn); bnge_del_napi(bn); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index ba0dd2202fb6..f5b1a6360f50 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -228,6 +228,7 @@ struct bnge_net { u8 rss_hash_key[HW_HASH_KEY_SIZE]; u8 rss_hash_key_valid:1; u8 rss_hash_key_updated:1; + int rsscos_nr_ctxs; u32 stats_coal_ticks; }; =20 @@ -381,6 +382,7 @@ struct bnge_vnic_info { u16 fw_vnic_id; #define BNGE_MAX_CTX_PER_VNIC 8 u16 fw_rss_cos_lb_ctx[BNGE_MAX_CTX_PER_VNIC]; + u16 mru; u8 *uc_list; dma_addr_t rss_table_dma_addr; __le16 *rss_table; @@ -408,4 +410,6 @@ struct bnge_vnic_info { =20 u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr); u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr); +int bnge_get_nr_rss_ctxs(int rx_rings); +void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic= ); #endif /* _BNGE_NETDEV_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.c index 5597af1b3b7c..e05560975938 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -184,7 +184,7 @@ static u16 bnge_get_total_vnics(struct bnge_dev *bd, u1= 6 rx_rings) return 1; } =20 -static u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd) +u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd) { return bnge_cal_nr_rss_ctxs(bd->rx_nr_rings) * BNGE_RSS_TABLE_ENTRIES; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.h index 54ef1c7d8822..ad429fe65744 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.h @@ -72,6 +72,7 @@ void bnge_free_irqs(struct bnge_dev *bd); int bnge_net_init_dflt_config(struct bnge_dev *bd); void bnge_net_uninit_dflt_config(struct bnge_dev *bd); void bnge_aux_init_dflt_config(struct bnge_dev *bd); +u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd); =20 static inline u32 bnge_adjust_pow_two(u32 total_ent, u16 ent_per_blk) --=20 2.47.3