From nobody Wed Oct 8 16:39:44 2025 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (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 8546729B797 for ; Thu, 26 Jun 2025 08:46:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750927595; cv=none; b=c7Kq9jGeNGPimWZyD2s87nEWox8v31dY54UxHliuGmuSJjViKJcQ8BR40wye+tyHc3imYB3hGE0JmjzQg08kgqljfbY/wkCgFe7qSwa0ezpUWCGkj7EyrE2VBE1cEpa/6/7jcx2NUY7ztFv1j3hOuTTsaiUWlEbANpB6xkZ/US4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750927595; c=relaxed/simple; bh=dwswPPn85QE/WevGYEd3ymDW5D2V7xQ1H9WJ3DFHJlY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ffqXjOtX1gDYLVfozWtZEUitZzBGzzWC6dfZ/TTECHiU4wLly/hjI3FlmJ1R89bMt9t7VNtPPfHbgOVBWSFPIOWZuXvqxSrpcXBhDxUm8DN/D5oNrhxUIVRweEoXIGlBpjV0rocdZHUzDbsLJx+yqKoOhMbq1j3raq0ps+nt+zg= 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=ZpSbsDhQ; arc=none smtp.client-ip=209.85.210.174 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="ZpSbsDhQ" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-747fc77bb2aso768320b3a.3 for ; Thu, 26 Jun 2025 01:46:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1750927593; x=1751532393; 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=OVg7xdRH0OHkyVegi5mo3IlVjjrCkzZj5ynXXGjit7A=; b=ZpSbsDhQUhI2PkQfevv0erCImES20WUjhVVhtc5Jnp2SgwZw64py3NmLqX0T0eb3PQ 1PtxpyOqfOAGpCLxPvRhMrz8BkC7W6yQPVForLoP1JUVo+y2//Nnd5nJWAHMfzjnhvoE Q2DSDb867rWmNTNKE/1sJS6AODNqWvnRWsxqA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750927593; x=1751532393; 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=OVg7xdRH0OHkyVegi5mo3IlVjjrCkzZj5ynXXGjit7A=; b=Son1VcsL91vEo00cDrEV0YVEcgF1kbJ8fQ8fAW2/02i3sLr0Nl8hW8oplmWDozEHke +Bs5Y94MyngYM/G+y0MX//s7tTRCi96LLlRIypsZObmblG0tGJB84tKZVwPCNv4YZS3l XjKWdK9awY93WG0QnbldiLzZ52PEpsSm/LoENP2RD9axLk+tOZjC+a9QCqp3I2NWZUXd 8QwZiZzLsezs89vsx3k7grrMmILalijSuAVtKYMgVrDUfqfOqgDFC1VyutKpLzVsKpyN R3Osi3rFvxguMzLv9No5efrgvMEuDWxLEv+ik1soDnIg+tly7xRdtDDAJdst5rynTWS+ 9DBQ== X-Forwarded-Encrypted: i=1; AJvYcCVZLGBrtHUhXtaBLddgM+Da4blkWLa4a9xhTZ9OCVaORxCwV90RgR1vD7XAo0RIKMQ6n7yFdS1k/mtGPn0=@vger.kernel.org X-Gm-Message-State: AOJu0YySz/WQwFDEerDT31vaGHJGqNQJt1JH+lD8j1BJM8quhBqF3NHa bpM+q0WCmUkd3QFFXZZ18OfB0+SrXEiz8oFF+URtHvdlTQnudKFRCbbmRC2qJGrTow== X-Gm-Gg: ASbGnctrTNWaFG+WDrxez1m0KlHjAyO2tV2K40xK4h5ItpCsRFkd55Lb6X89VESpJBD gbINnukpNmbouLJRuYul7wg3WNyewS6V842WocOPARrS9WkMVA1btp/3LkxW5TF3bOOhUdqySyP NaY0STnMbbhfZ0I2nL5aYxPfYjcBnvCrvt6VJh1XD0nuiPQz1EV3svuKJK8bakP7B6T9N69mwiT tkc5jsZiP1OM7EYBhQWDo2p1YxhPAM05Kybjp4INQr8r5eAiK1GFNYqb51vYJykFvYxvo42E2bB irayfYAFIw/AhxWK+WncLWLcnfdVy5me3aQ4oKuR/qdqGB4NqVBskYoD9T59O/pV4TEMEs8rV7o ccpiiv8Qu16ch0lnHaGmnSFRmvxsBPS95yr47yTM= X-Google-Smtp-Source: AGHT+IGiqQtrfITv5h+HOv0VNYktVelAVN6EvR/SXRvoAvqVov6x56Wmbr0Cbkz1anDUUmXAiEKVAA== X-Received: by 2002:a17:903:1110:b0:234:bca7:2926 with SMTP id d9443c01a7336-2382402e575mr96048445ad.27.1750927592885; Thu, 26 Jun 2025 01:46:32 -0700 (PDT) Received: from localhost.localdomain ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-237d83fbe94sm152524875ad.86.2025.06.26.01.46.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jun 2025 01:46:32 -0700 (PDT) From: Vikas Gupta 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, Vikas Gupta , Bhargava Chenna Marreddy , Rajashekar Hudumula Subject: [net-next, v2 09/10] bng_en: Initialize default configuration Date: Thu, 26 Jun 2025 14:08:18 +0000 Message-ID: <20250626140844.266456-10-vikas.gupta@broadcom.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250626140844.266456-1-vikas.gupta@broadcom.com> References: <20250626140844.266456-1-vikas.gupta@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 Content-Type: text/plain; charset="utf-8" Query resources from the firmware and, based on the availability of resources, initialize the default settings. The default settings include: 1. Rings and other resource reservations with the firmware. This ensures that resources are reserved before network and auxiliary devices are created. 2. Mapping the BAR, which helps access doorbells since its size is known after querying the firmware. 3. Retrieving the TCs and hardware CoS queue mappings. Signed-off-by: Vikas Gupta Reviewed-by: Bhargava Chenna Marreddy Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge.h | 14 ++ .../net/ethernet/broadcom/bnge/bnge_core.c | 122 ++++++++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 54 +++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 1 + .../net/ethernet/broadcom/bnge/bnge_resc.c | 208 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_resc.h | 3 + 6 files changed, 402 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index 3c161b1a9b62..cef66c1e9006 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -80,6 +80,12 @@ enum { BNGE_RSS_CAP_ESP_V6_RSS_CAP =3D BIT(7), }; =20 +#define BNGE_MAX_QUEUE 8 +struct bnge_queue_info { + u8 queue_id; + u8 queue_profile; +}; + struct bnge_dev { struct device *dev; struct pci_dev *pdev; @@ -89,6 +95,7 @@ struct bnge_dev { char board_serialno[BNGE_VPD_FLD_LEN]; =20 void __iomem *bar0; + void __iomem *bar1; =20 u16 chip_num; u8 chip_rev; @@ -172,6 +179,13 @@ struct bnge_dev { #define BNGE_SUPPORTS_TPA(bd) ((bd)->max_tpa_v2) =20 u8 num_tc; + u8 max_tc; + u8 max_lltc; /* lossless TCs */ + struct bnge_queue_info q_info[BNGE_MAX_QUEUE]; + u8 tc_to_qidx[BNGE_MAX_QUEUE]; + u8 q_ids[BNGE_MAX_QUEUE]; + u8 max_q; + u8 port_count; =20 struct bnge_irq *irq_tbl; u16 irqs_acquired; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_core.c b/drivers/net/e= thernet/broadcom/bnge/bnge_core.c index 47d56f7c28af..22df6836dab9 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_core.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_core.c @@ -54,9 +54,46 @@ static void bnge_nvm_cfg_ver_get(struct bnge_dev *bd) nvm_info.nvm_cfg_ver_upd); } =20 +static int bnge_func_qcaps(struct bnge_dev *bd) +{ + int rc; + + rc =3D bnge_hwrm_func_qcaps(bd); + if (rc) + return rc; + + rc =3D bnge_hwrm_queue_qportcfg(bd); + if (rc) { + dev_err(bd->dev, "query qportcfg failure rc: %d\n", rc); + return rc; + } + + rc =3D bnge_hwrm_func_resc_qcaps(bd); + if (rc) { + dev_err(bd->dev, "query resc caps failure rc: %d\n", rc); + return rc; + } + + rc =3D bnge_hwrm_func_qcfg(bd); + if (rc) { + dev_err(bd->dev, "query config failure rc: %d\n", rc); + return rc; + } + + rc =3D bnge_hwrm_vnic_qcaps(bd); + if (rc) { + dev_err(bd->dev, "vnic caps failure rc: %d\n", rc); + return rc; + } + + return 0; +} + static void bnge_fw_unregister_dev(struct bnge_dev *bd) { + /* ctx mem free after unrgtr only */ bnge_hwrm_func_drv_unrgtr(bd); + bnge_free_ctx_mem(bd); } =20 static int bnge_fw_register_dev(struct bnge_dev *bd) @@ -86,7 +123,25 @@ static int bnge_fw_register_dev(struct bnge_dev *bd) return rc; } =20 + rc =3D bnge_alloc_ctx_mem(bd); + if (rc) { + dev_err(bd->dev, "Failed to allocate ctx mem rc: %d\n", rc); + goto err_func_unrgtr; + } + + /* Get the resources and configuration from firmware */ + rc =3D bnge_func_qcaps(bd); + if (rc) { + dev_err(bd->dev, "Failed initial configuration rc: %d\n", rc); + rc =3D -ENODEV; + goto err_func_unrgtr; + } + return 0; + +err_func_unrgtr: + bnge_fw_unregister_dev(bd); + return rc; } =20 static void bnge_pci_disable(struct pci_dev *pdev) @@ -134,14 +189,46 @@ static void bnge_unmap_bars(struct pci_dev *pdev) { struct bnge_dev *bd =3D pci_get_drvdata(pdev); =20 + if (bd->bar1) { + pci_iounmap(pdev, bd->bar1); + bd->bar1 =3D NULL; + } + if (bd->bar0) { pci_iounmap(pdev, bd->bar0); bd->bar0 =3D NULL; } } =20 +static void bnge_set_max_func_irqs(struct bnge_dev *bd, + unsigned int max_irqs) +{ + bd->hw_resc.max_irqs =3D max_irqs; +} + +static int bnge_get_max_irq(struct pci_dev *pdev) +{ + u16 ctrl; + + pci_read_config_word(pdev, pdev->msix_cap + PCI_MSIX_FLAGS, &ctrl); + return (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1; +} + +static int bnge_map_db_bar(struct bnge_dev *bd) +{ + if (!bd->db_size) + return -ENODEV; + + bd->bar1 =3D pci_iomap(bd->pdev, 2, bd->db_size); + if (!bd->bar1) + return -ENOMEM; + + return 0; +} + static int bnge_probe_one(struct pci_dev *pdev, const struct pci_device_id= *ent) { + unsigned int max_irqs; struct bnge_dev *bd; int rc; =20 @@ -190,10 +277,41 @@ static int bnge_probe_one(struct pci_dev *pdev, const= struct pci_device_id *ent) goto err_hwrm_cleanup; } =20 + max_irqs =3D bnge_get_max_irq(pdev); + bnge_set_max_func_irqs(bd, max_irqs); + + bnge_aux_init_dflt_config(bd); + + rc =3D bnge_net_init_dflt_config(bd); + if (rc) { + dev_err(&pdev->dev, "Error setting up default cfg to netdev rc =3D %d\n", + rc); + goto err_fw_reg; + } + + rc =3D bnge_map_db_bar(bd); + if (rc) { + dev_err(&pdev->dev, "Failed mapping doorbell BAR rc =3D %d, aborting\n", + rc); + goto err_config_uninit; + } + + rc =3D bnge_alloc_irqs(bd); + if (rc) { + dev_err(&pdev->dev, "Error IRQ allocation rc =3D %d\n", rc); + goto err_config_uninit; + } + pci_save_state(pdev); =20 return 0; =20 +err_config_uninit: + bnge_net_uninit_dflt_config(bd); + +err_fw_reg: + bnge_fw_unregister_dev(bd); + err_hwrm_cleanup: bnge_cleanup_hwrm_resources(bd); =20 @@ -213,6 +331,10 @@ static void bnge_remove_one(struct pci_dev *pdev) { struct bnge_dev *bd =3D pci_get_drvdata(pdev); =20 + bnge_free_irqs(bd); + + bnge_net_uninit_dflt_config(bd); + bnge_fw_unregister_dev(bd); =20 bnge_cleanup_hwrm_resources(bd); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index ee2675776c14..19091318cfdd 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -647,3 +647,57 @@ int bnge_hwrm_vnic_qcaps(struct bnge_dev *bd) =20 return rc; } + +#define BNGE_CNPQ(q_profile) \ + ((q_profile) =3D=3D \ + QUEUE_QPORTCFG_RESP_QUEUE_ID0_SERVICE_PROFILE_LOSSY_ROCE_CNP) + +int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd) +{ + struct hwrm_queue_qportcfg_output *resp; + struct hwrm_queue_qportcfg_input *req; + u8 i, j, *qptr; + bool no_rdma; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_QUEUE_QPORTCFG); + if (rc) + return rc; + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (rc) + goto qportcfg_exit; + + if (!resp->max_configurable_queues) { + rc =3D -EINVAL; + goto qportcfg_exit; + } + bd->max_tc =3D resp->max_configurable_queues; + bd->max_lltc =3D resp->max_configurable_lossless_queues; + if (bd->max_tc > BNGE_MAX_QUEUE) + bd->max_tc =3D BNGE_MAX_QUEUE; + + no_rdma =3D !bnge_is_roce_en(bd); + qptr =3D &resp->queue_id0; + for (i =3D 0, j =3D 0; i < bd->max_tc; i++) { + bd->q_info[j].queue_id =3D *qptr; + bd->q_ids[i] =3D *qptr++; + bd->q_info[j].queue_profile =3D *qptr++; + bd->tc_to_qidx[j] =3D j; + if (!BNGE_CNPQ(bd->q_info[j].queue_profile) || no_rdma) + j++; + } + bd->max_q =3D bd->max_tc; + bd->max_tc =3D max_t(u8, j, 1); + + if (resp->queue_cfg_info & QUEUE_QPORTCFG_RESP_QUEUE_CFG_INFO_ASYM_CFG) + bd->max_tc =3D 1; + + if (bd->max_lltc > bd->max_tc) + bd->max_lltc =3D bd->max_tc; + +qportcfg_exit: + bnge_hwrm_req_drop(bd, req); + return rc; +} diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index 59ec1899879a..6c03923eb559 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -22,5 +22,6 @@ int bnge_hwrm_func_qcaps(struct bnge_dev *bd); int bnge_hwrm_vnic_qcaps(struct bnge_dev *bd); 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 #endif /* _BNGE_HWRM_LIB_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.c index 0e67a0001677..c79a3607a1b7 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -5,6 +5,7 @@ #include #include #include +#include =20 #include "bnge.h" #include "bnge_hwrm.h" @@ -28,6 +29,16 @@ static u16 bnge_get_max_func_irqs(struct bnge_dev *bd) return min_t(u16, hw_resc->max_irqs, hw_resc->max_nqs); } =20 +static unsigned int bnge_get_max_func_stat_ctxs(struct bnge_dev *bd) +{ + return bd->hw_resc.max_stat_ctxs; +} + +static unsigned int bnge_get_max_func_cp_rings(struct bnge_dev *bd) +{ + return bd->hw_resc.max_cp_rings; +} + static int bnge_aux_get_dflt_msix(struct bnge_dev *bd) { int roce_msix =3D BNGE_MAX_ROCE_MSIX; @@ -68,6 +79,20 @@ static u16 bnge_func_stat_ctxs_demand(struct bnge_dev *b= d) return bd->nq_nr_rings + bnge_aux_get_stat_ctxs(bd); } =20 +static int bnge_get_dflt_aux_stat_ctxs(struct bnge_dev *bd) +{ + int stat_ctx =3D 0; + + if (bnge_is_roce_en(bd)) { + stat_ctx =3D BNGE_MIN_ROCE_STAT_CTXS; + + if (!bd->pf.port_id && bd->port_count > 1) + stat_ctx++; + } + + return stat_ctx; +} + static u16 bnge_nqs_demand(struct bnge_dev *bd) { return bd->nq_nr_rings + bnge_aux_get_msix(bd); @@ -395,3 +420,186 @@ void bnge_free_irqs(struct bnge_dev *bd) kfree(bd->irq_tbl); bd->irq_tbl =3D NULL; } + +static void _bnge_get_max_rings(struct bnge_dev *bd, u16 *max_rx, + u16 *max_tx, u16 *max_nq) +{ + struct bnge_hw_resc *hw_resc =3D &bd->hw_resc; + u16 max_ring_grps =3D 0, max_cp; + int rc; + + *max_tx =3D hw_resc->max_tx_rings; + *max_rx =3D hw_resc->max_rx_rings; + *max_nq =3D min_t(int, bnge_get_max_func_irqs(bd), + hw_resc->max_stat_ctxs); + max_ring_grps =3D hw_resc->max_hw_ring_grps; + if (bnge_is_agg_reqd(bd)) + *max_rx >>=3D 1; + + max_cp =3D bnge_get_max_func_cp_rings(bd); + + /* Fix RX and TX rings according to number of CPs available */ + rc =3D bnge_fix_rings_count(max_rx, max_tx, max_cp, false); + if (rc) { + *max_rx =3D 0; + *max_tx =3D 0; + } + + *max_rx =3D min_t(int, *max_rx, max_ring_grps); +} + +static int bnge_get_max_rings(struct bnge_dev *bd, u16 *max_rx, + u16 *max_tx, bool shared) +{ + u16 rx, tx, nq; + + _bnge_get_max_rings(bd, &rx, &tx, &nq); + *max_rx =3D rx; + *max_tx =3D tx; + if (!rx || !tx || !nq) + return -ENOMEM; + + return bnge_fix_rings_count(max_rx, max_tx, nq, shared); +} + +static int bnge_get_dflt_rings(struct bnge_dev *bd, u16 *max_rx, u16 *max_= tx, + bool shared) +{ + int rc; + + rc =3D bnge_get_max_rings(bd, max_rx, max_tx, shared); + if (rc) { + dev_info(bd->dev, "Not enough rings available\n"); + return rc; + } + + if (bnge_is_roce_en(bd)) { + int max_cp, max_stat, max_irq; + + /* Reserve minimum resources for RoCE */ + max_cp =3D bnge_get_max_func_cp_rings(bd); + max_stat =3D bnge_get_max_func_stat_ctxs(bd); + max_irq =3D bnge_get_max_func_irqs(bd); + if (max_cp <=3D BNGE_MIN_ROCE_CP_RINGS || + max_irq <=3D BNGE_MIN_ROCE_CP_RINGS || + max_stat <=3D BNGE_MIN_ROCE_STAT_CTXS) + return 0; + + max_cp -=3D BNGE_MIN_ROCE_CP_RINGS; + max_irq -=3D BNGE_MIN_ROCE_CP_RINGS; + max_stat -=3D BNGE_MIN_ROCE_STAT_CTXS; + max_cp =3D min_t(u16, max_cp, max_irq); + max_cp =3D min_t(u16, max_cp, max_stat); + rc =3D bnge_adjust_rings(bd, max_rx, max_tx, max_cp, shared); + if (rc) + rc =3D 0; + } + + return rc; +} + +/* In initial default shared ring setting, each shared ring must have a + * RX/TX ring pair. + */ +static void bnge_trim_dflt_sh_rings(struct bnge_dev *bd) +{ + bd->nq_nr_rings =3D min_t(u16, bd->tx_nr_rings_per_tc, bd->rx_nr_rings); + bd->rx_nr_rings =3D bd->nq_nr_rings; + bd->tx_nr_rings_per_tc =3D bd->nq_nr_rings; + bd->tx_nr_rings =3D bd->tx_nr_rings_per_tc; +} + +static int bnge_net_init_dflt_rings(struct bnge_dev *bd, bool sh) +{ + u16 dflt_rings, max_rx_rings, max_tx_rings; + int rc; + + if (sh) + bd->flags |=3D BNGE_EN_SHARED_CHNL; + + dflt_rings =3D netif_get_num_default_rss_queues(); + + rc =3D bnge_get_dflt_rings(bd, &max_rx_rings, &max_tx_rings, sh); + if (rc) + return rc; + bd->rx_nr_rings =3D min_t(u16, dflt_rings, max_rx_rings); + bd->tx_nr_rings_per_tc =3D min_t(u16, dflt_rings, max_tx_rings); + if (sh) + bnge_trim_dflt_sh_rings(bd); + else + bd->nq_nr_rings =3D bd->tx_nr_rings_per_tc + bd->rx_nr_rings; + bd->tx_nr_rings =3D bd->tx_nr_rings_per_tc; + + rc =3D bnge_reserve_rings(bd); + if (rc && rc !=3D -ENODEV) + dev_warn(bd->dev, "Unable to reserve tx rings\n"); + bd->tx_nr_rings_per_tc =3D bd->tx_nr_rings; + if (sh) + bnge_trim_dflt_sh_rings(bd); + + /* Rings may have been reduced, re-reserve them again */ + if (bnge_need_reserve_rings(bd)) { + rc =3D bnge_reserve_rings(bd); + if (rc && rc !=3D -ENODEV) + dev_warn(bd->dev, "Fewer rings reservation failed\n"); + bd->tx_nr_rings_per_tc =3D bd->tx_nr_rings; + } + if (rc) { + bd->tx_nr_rings =3D 0; + bd->rx_nr_rings =3D 0; + } + + return rc; +} + +static int bnge_alloc_rss_indir_tbl(struct bnge_dev *bd) +{ + u16 entries; + + entries =3D BNGE_MAX_RSS_TABLE_ENTRIES; + + bd->rss_indir_tbl_entries =3D entries; + bd->rss_indir_tbl =3D + kmalloc_array(entries, sizeof(*bd->rss_indir_tbl), GFP_KERNEL); + if (!bd->rss_indir_tbl) + return -ENOMEM; + + return 0; +} + +int bnge_net_init_dflt_config(struct bnge_dev *bd) +{ + struct bnge_hw_resc *hw_resc; + int rc; + + rc =3D bnge_alloc_rss_indir_tbl(bd); + if (rc) + return rc; + + rc =3D bnge_net_init_dflt_rings(bd, true); + if (rc) + goto err_free_tbl; + + hw_resc =3D &bd->hw_resc; + bd->max_fltr =3D hw_resc->max_rx_em_flows + hw_resc->max_rx_wm_flows + + BNGE_L2_FLTR_MAX_FLTR; + + return 0; + +err_free_tbl: + kfree(bd->rss_indir_tbl); + bd->rss_indir_tbl =3D NULL; + return rc; +} + +void bnge_net_uninit_dflt_config(struct bnge_dev *bd) +{ + kfree(bd->rss_indir_tbl); + bd->rss_indir_tbl =3D NULL; +} + +void bnge_aux_init_dflt_config(struct bnge_dev *bd) +{ + bd->aux_num_msix =3D bnge_aux_get_dflt_msix(bd); + bd->aux_num_stat_ctxs =3D bnge_get_dflt_aux_stat_ctxs(bd); +} diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.h index 23db93e03787..b39fd1a7a81b 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.h @@ -66,6 +66,9 @@ int bnge_reserve_rings(struct bnge_dev *bd); int bnge_fix_rings_count(u16 *rx, u16 *tx, u16 max, bool shared); int bnge_alloc_irqs(struct bnge_dev *bd); 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); =20 static inline u32 bnge_adjust_pow_two(u32 total_ent, u16 ent_per_blk) --=20 2.47.1