From nobody Sat Feb 7 08:53:45 2026 Received: from mail-qt1-f228.google.com (mail-qt1-f228.google.com [209.85.160.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 28F1531282B for ; Thu, 28 Aug 2025 13:19:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756387175; cv=none; b=RPQ6A55rDT0Fa0KdSegI2he/pwWAG3qKtEbV30g8+6wTd3X8Bb9hSVUfozNm2A9X0IgH2kLMaVl/Lnroei5uqe2XnZa42L2yrUOMgrjG3cL/rnJUe96/odhv0XyWbrrJCtvzzUZV7vSKFnmCw1cfj6mHgi5JBTt7GnW176x16MU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1756387175; c=relaxed/simple; bh=E09FRASXFN18x/+6O7101d41CuiViuGqROHAARceE7w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ezbB8FqEkdawS23JOnRErIrKgtZicjF+KGF0KrGiTpsyClic88URTHStCfUetcfxaZA/ShBiVkKsE4pFQa+zCs9AL9MPcn4ol7Vw9nc5a5Io5Q0gdv6LbDlUUAlZItcVKS39jp9YuzegflGBnRi4Ib3zW5CO3OOYNOkzMAxYZ+8= 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=f87PkCoC; arc=none smtp.client-ip=209.85.160.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="f87PkCoC" Received: by mail-qt1-f228.google.com with SMTP id d75a77b69052e-4b109c6b9fcso9775161cf.3 for ; Thu, 28 Aug 2025 06:19:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756387172; x=1756991972; 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=QjzGiesoPeELHTG9hKv/eX1cbMY/2J6zIwLy7FSAnDI=; b=WpOCGGwAKgjhy6COEV0WAMpQrnKl2ZTNW0fbChTrsBKr2wiGvXTvAAYP57psqaC6x2 5EuhwjkTxKhDe3dPNmik7FU5TUGgwm20z+F9sJitFCShbOLJMacWtV0IEETKCGoZU35v DNyoCNHAo9cTLCYC8U/u70ky/nvUQZKsOTXlpWpz08GZXJG9OKqQ4L5V3qVOGC/iDg4J GNrAvPwW///hgg4/WusBPdndL7zCA8jMN2AVlJUjCFh4W9720y6GUuHOe//d+Af2ekbT RC+grhXBlRcV4z4seFkxuoMenuBQZWtpQvxMJmWLtRhibGAdE3YtC+qTKIDWJFXXmjr0 OdcA== X-Forwarded-Encrypted: i=1; AJvYcCWU3qjV8fmW8QeL/j48LdVRfP+yStIy7121q9vS61vLzYjtdedWHdUyZ/Pab0PSWNrKzrqnDDRzDEIBNvQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yxt7Donc2WLFvKE5RKUYDoprfIRNU1/RAYmcHWbyYxi5nt68NoI fN7QHfsiL2y2tqEh5W7/yKP/c6BVWpn9i1WqQZq0EkkSXqW/d+dO25btIiyNwjTDpe1qbyIzUQs xXLcXLqeLINJyWJMwZfWjL5Ayn58pJ6ba0lXtG5IeC88zdv22eHLlSuICdFWeezhRvU8rU1Fb6E xVrFL/F7E7S/eLPY7PC8QH7n2GlBkuA++5zRwcFMh/Om0nkegiHMAEUHj9+lUQ6ceGNcZb4v+jM W2exaGubrh5ExWeTeNZO0POgw== X-Gm-Gg: ASbGnctkoWGEti5VzWeAVyPAfqjcQPgn49/V6HrvzBmQS22y5YC2NIXyCKw/fxRJ3Au QPYOc5sBdCWl1sRLwYi+6Hiu0kROgGhGGfQoiXk7icqpM+I2TePuFowhresK31ZoOyDrTzR61eN 69QfQiXBAFyGwva7GejMik5X0H9iH5jwWs4Rs0c2GKE5FhF+tWwY+RpKoqUyFSwnUubED3WLYty 17MRfoLD9340xUaWXeTQ15oeSTKtAmMPoQkE2EWyWXW0qFF0NnDHqmOWyI7jwe16VPShb3t24x9 c2Ipvt8sJmZIRuSITbOaw1hEuN41ZJ2oMz41btvRAWxSdoXI/2OKaUL4GmVNJQhx0bQyV75x7PY WFGw2YeMB9B1J6uXdU/MfH08sbImgtODzR6TESrZnLus1Typ46vC2WEfr51gAZkZzPmYQz3cb1X 0KTDlJHQ== X-Google-Smtp-Source: AGHT+IFLenJBoWwGPVQRQQjm628ubqxoXCUwuuYnSw0RidrGGIjY1jqZr7IR5bW4ZPWSpzXOJD8nlA4ZQkbr X-Received: by 2002:a05:622a:1a16:b0:4b2:8ac4:ef58 with SMTP id d75a77b69052e-4b2aab438b4mr306603371cf.79.1756387171917; Thu, 28 Aug 2025 06:19:31 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-16.dlp.protect.broadcom.com. [144.49.247.16]) by smtp-relay.gmail.com with ESMTPS id d75a77b69052e-4b2b8c4587dsm5411471cf.2.2025.08.28.06.19.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Aug 2025 06:19:31 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-b471757d82fso784102a12.3 for ; Thu, 28 Aug 2025 06:19:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1756387170; x=1756991970; 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=QjzGiesoPeELHTG9hKv/eX1cbMY/2J6zIwLy7FSAnDI=; b=f87PkCoCRudszha6kvmZbz6/AolTghC5J0jyXn5NILMGPBfHW+qUtWHDrFLiBaLVGj aax+jGtVTLENmdbs+sDZUEniVKyF9FgE9L7av4pT7pdGPfullKTS0OHF5I1PPO82jIo4 qPuZW3xjTRK5gA0hQQhBj3j6ugVRp/QRiRJcE= X-Forwarded-Encrypted: i=1; AJvYcCXBVLfxk3y6tnXfM55TgJEanSyGuDnAtoy1ByYn57lB1AL++msYjt38lZyuMjE/PLG1pJILcm2U3FFAdMU=@vger.kernel.org X-Received: by 2002:a17:902:e888:b0:240:a54e:21a0 with SMTP id d9443c01a7336-2462ee13154mr318314825ad.19.1756387170416; Thu, 28 Aug 2025 06:19:30 -0700 (PDT) X-Received: by 2002:a17:902:e888:b0:240:a54e:21a0 with SMTP id d9443c01a7336-2462ee13154mr318314295ad.19.1756387169831; Thu, 28 Aug 2025 06:19:29 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-248b6a16ae3sm36468705ad.137.2025.08.28.06.19.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 28 Aug 2025 06:19:29 -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: [v5, net-next 8/9] bng_en: Register default VNIC Date: Thu, 28 Aug 2025 18:45:46 +0000 Message-ID: <20250828184547.242496-9-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250828184547.242496-1-bhargava.marreddy@broadcom.com> References: <20250828184547.242496-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 58e4f42830b0..04635ade94ea 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -1432,6 +1432,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) @@ -1592,6 +1703,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); } @@ -1639,6 +1751,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 @@ -1657,6 +1771,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); @@ -1810,11 +1936,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