From nobody Mon Apr 6 09:18:51 2026 Received: from relay.smtp-ext.broadcom.com (lpdvsmtp09.broadcom.com [192.19.166.228]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B16AF31AF31; Thu, 2 Apr 2026 21:47:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.19.166.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775166432; cv=none; b=FM6o+n8YNlRMFCKEjlKchOEMoDYniJs5rTUTCCjg7wpRs1peAwJUiSAcrGWYrpEXksJcmP4rydH4M0DPcwIgSw5daBMX+0SOHm/PyQzU9LBAORvSkDbIs2dLllgk8yAhP90gGYBK+SaZfAQh/6spGDOTpvUbmxno/dZb3ee+JLk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775166432; c=relaxed/simple; bh=/JcEL2aEGcxeVMe/m0fHS2YNiAO0KRQJPQdKHaWHBgw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Lz/7Ikvoa4VFTR+OmYQqBZXGz9XMDufd0zubpMf8XP36dMytTCdddY9EMG+Du2OIgl/iGNBkzfLAw0ae7z+8GYyI3DWGAXQYgctpCEVltBxlpTMUzHFI39wRurwVz2rVVgRn1qnFPot7NtpZk1b/Nv5vr36cNo6FkqrJQte2MUU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject 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=chNxxj3K; arc=none smtp.client-ip=192.19.166.228 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject 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="chNxxj3K" Received: from mail-acc-it-01.broadcom.com (mail-acc-it-01.acc.broadcom.net [10.35.36.83]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id 330DDC00033C; Thu, 2 Apr 2026 14:36:48 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com 330DDC00033C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1775165808; bh=/JcEL2aEGcxeVMe/m0fHS2YNiAO0KRQJPQdKHaWHBgw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=chNxxj3K3s2HYLJSjlRFZi562FxwTaEB6sD7xUdQwLmrW42QNFUR+yr9/O7VhuiQL fnBEqv9zvGZLEYm1wvdULR+0nhDDZ5JnFcbpEediJp9EWt6KRCy4JFMuCUS1QyBSl+ ACTA+QB6xj70L0jvTsGcAprmQEET/tfYNPrWPV+Q= Received: from lvnvdb8054.lvn.broadcom.net (lvnvdb8054.lvn.broadcom.net [10.17.214.29]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail-acc-it-01.broadcom.com (Postfix) with ESMTPSA id A6A6BAE81; Thu, 2 Apr 2026 17:36:45 -0400 (EDT) From: "Jitendra Vegiraju" To: netdev@vger.kernel.org Cc: alexandre.torgue@foss.st.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, mcoquelin.stm32@gmail.com, jitendra.vegiraju@broadcom.com, bcm-kernel-feedback-list@broadcom.com, richardcochran@gmail.com, ast@kernel.org, daniel@iogearbox.net, hawk@kernel.org, john.fastabend@gmail.com, rmk+kernel@armlinux.org.uk, rohan.g.thomas@altera.com, linux-kernel@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, bpf@vger.kernel.org, andrew+netdev@lunn.ch, horms@kernel.org, sdf@fomichev.me, me@ziyao.cc, siyanteng@cqsoftware.com.cn, prabhakar.mahadev-lad.rj@bp.renesas.com, weishangjuan@eswincomputing.com, wens@kernel.org, vladimir.oltean@nxp.com, lizhi2@eswincomputing.com, boon.khai.ng@altera.com, maxime.chevallier@bootlin.com, chenchuangyu@xiaomi.com, yangtiezhu@loongson.cn, ovidiu.panait.rb@renesas.com, chenhuacai@kernel.org, florian.fainelli@broadcom.com, quic_abchauha@quicinc.com, Russell King Subject: [PATCH net-next v9 3/4] net: stmmac: Add PCI glue driver for BCM8958x Date: Thu, 2 Apr 2026 14:36:28 -0700 Message-ID: <20260402213629.1996133-4-jitendra.vegiraju@broadcom.com> X-Mailer: git-send-email 2.45.4 In-Reply-To: <20260402213629.1996133-1-jitendra.vegiraju@broadcom.com> References: <20260402213629.1996133-1-jitendra.vegiraju@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" From: Jitendra Vegiraju Add PCI ethernet driver support for Broadcom BCM8958x SoC devices used in automotive applications. This SoC device has PCIe ethernet MAC attached to an integrated ethernet switch using XGMII interface. The PCIe ethernet controller is presented to the Linux host as PCI network device. The following block diagram gives an overview of the application. +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ | Host CPU/Linux | +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ || PCIe || +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ | +--------------+ | | | PCIE Endpoint| | | | Ethernet | | | | Controller | | | | DMA | | | +--------------+ | | | MAC | BCM8958X | | +--------------+ SoC | | || XGMII | | || | | +--------------+ | | | Ethernet | | | | switch | | | +--------------+ | | || || || || | +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ || || || || More external interfaces The MAC IP block on BCM8958x is based on Synopsis XGMAC 4.00a core. This driver uses common dwxgmac2 code where applicable. Driver functionality specific to this MAC is implemented in dw25gmac.c. Management of integrated ethernet switch on this SoC is not handled via the PCIe interface. This SoC device has PCIe ethernet MAC directly attached to an integrated ethernet switch using XGMII interface. Since device tree support is not available on this platform, a software node is created to enable fixed-link support using phylink driver. Suggested-by: Russell King (Oracle) Signed-off-by: Jitendra Vegiraju --- .../net/ethernet/stmicro/stmmac/dwmac-brcm.c | 360 ++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 drivers/net/ethernet/stmicro/stmmac/dwmac-brcm.c diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-brcm.c b/drivers/net= /ethernet/stmicro/stmmac/dwmac-brcm.c new file mode 100644 index 000000000000..e8c6b4b618ac --- /dev/null +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-brcm.c @@ -0,0 +1,360 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright (c) 2024-2026 Broadcom Corporation + * + * PCI driver for ethernet interface of BCM8958X automotive switch chip. + * + * High level block diagram of the device. + * +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ + * | Host CPU/Linux | + * +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ + * || PCIe + * || + * +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ + * | +--------------+ | + * | | PCIE Endpoint| | + * | | Ethernet | | + * | | Controller | | + * | | DMA | | + * | +--------------+ | + * | | MAC | BCM8958X | + * | +--------------+ SoC | + * | || XGMII | + * | || | + * | +--------------+ | + * | | Ethernet | | + * | | switch | | + * | +--------------+ | + * | || || || || | + * +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D+ + * || || || || More external interfaces + * + * This SoC device has PCIe ethernet MAC directly attached to an integrated + * ethernet switch using XGMII interface. Since devicetree support is not + * available on this platform, a software node is created to enable + * fixed-link support using phylink driver. + */ + +#include +#include +#include +#include +#include +#include "stmmac.h" +#include "stmmac_libpci.h" +#include "dwxgmac2.h" +#include "dw25gmac.h" + +#define PCI_DEVICE_ID_BCM8958X 0xa00d +#define BRCM_MAX_MTU 1500 + +/* TX and RX Queue counts */ +#define BRCM_TX_Q_COUNT 4 +#define BRCM_RX_Q_COUNT 4 + +#define BRCM_XGMAC_BAR0_MASK BIT(0) + +#define BRCM_XGMAC_IOMEM_MISC_REG_OFFSET 0x0 +#define BRCM_XGMAC_IOMEM_MBOX_REG_OFFSET 0x1000 +#define BRCM_XGMAC_IOMEM_CFG_REG_OFFSET 0x3000 + +#define XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_LOW 0x940 +#define XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_LO_VALUE 0x00000001 +#define XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_HIGH 0x944 +#define XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_HI_VALUE 0x88000000 + +#define XGMAC_PCIE_MISC_MII_CTRL_OFFSET 0x4 +#define XGMAC_PCIE_MISC_MII_CTRL_PAUSE_RX BIT(0) +#define XGMAC_PCIE_MISC_MII_CTRL_PAUSE_TX BIT(1) +#define XGMAC_PCIE_MISC_MII_CTRL_LINK_UP BIT(2) +#define XGMAC_PCIE_MISC_PCIESS_CTRL_OFFSET 0x8 +#define XGMAC_PCIE_MISC_PCIESS_CTRL_EN_MSI_MSIX BIT(9) +#define XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_LO_OFFSET 0x90 +#define XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_LO_VALUE 0x00000001 +#define XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_HI_OFFSET 0x94 +#define XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_HI_VALUE 0x88000000 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST0_OFFSET 0x700 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST0_VALUE 1 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST1_OFFSET 0x704 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST1_VALUE 1 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST_DBELL_OFFSET 0x728 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST_DBELL_VALUE 1 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_SBD_ALL_OFFSET 0x740 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_SBD_ALL_VALUE 0 + +/* MSIX Vector map register starting offsets */ +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_RX0_PF0_OFFSET 0x840 +#define XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_TX0_PF0_OFFSET 0x890 +#define BRCM_XGMAC_MSI_MAC_VECTOR 0 +#define BRCM_PER_CH_INT_VECTOR_START 1 +#define BRCM_VECTOR_MAX (BRCM_RX_Q_COUNT + BRCM_TX_Q_COUNT + 1) + +static const struct property_entry fixed_link_properties[] =3D { + PROPERTY_ENTRY_U32("speed", 10000), + PROPERTY_ENTRY_BOOL("full-duplex"), + PROPERTY_ENTRY_BOOL("pause"), + { } +}; + +static const struct software_node parent_swnode =3D { + .name =3D "ethernet", +}; + +static const struct software_node fixed_link_swnode =3D { + .name =3D "fixed-link", /* MUST be named "fixed-link" */ + .parent =3D &parent_swnode, + .properties =3D fixed_link_properties, +}; + +static const struct software_node *brcm_swnodes[] =3D { + &parent_swnode, + &fixed_link_swnode, + NULL +}; + +struct brcm_priv_data { + void __iomem *misc_regs; /* MISC Registers*/ +}; + +static void misc_iowrite(struct brcm_priv_data *brcm_priv, + u32 reg, u32 val) +{ + iowrite32(val, brcm_priv->misc_regs + reg); +} + +static void brcm_free_irq_vectors(void *data) +{ + struct pci_dev *pdev =3D data; + + pci_free_irq_vectors(pdev); +} + +static int brcm_config_multi_msi(struct pci_dev *pdev, + struct plat_stmmacenet_data *plat, + struct stmmac_resources *res) +{ + int vector; + int ret; + int i; + + ret =3D pci_alloc_irq_vectors(pdev, BRCM_VECTOR_MAX, BRCM_VECTOR_MAX, + PCI_IRQ_MSI | PCI_IRQ_MSIX); + if (ret < 0) { + dev_err(&pdev->dev, "%s: multi MSI enablement failed\n", + __func__); + return ret; + } + + vector =3D BRCM_XGMAC_MSI_MAC_VECTOR; + res->irq =3D pci_irq_vector(pdev, vector++); + for (i =3D 0; i < BRCM_RX_Q_COUNT; i++, vector++) + res->rx_irq[i] =3D pci_irq_vector(pdev, vector); + for (i =3D 0; i < BRCM_TX_Q_COUNT; i++, vector++) + res->tx_irq[i] =3D pci_irq_vector(pdev, vector); + + plat->flags |=3D STMMAC_FLAG_MULTI_MSI_EN; + plat->flags |=3D STMMAC_FLAG_TSO_EN; + plat->flags |=3D STMMAC_FLAG_SPH_DISABLE; + + return devm_add_action_or_reset(&pdev->dev, + brcm_free_irq_vectors, pdev); +} + +static int brcm_drv_init(struct device *dev, void *bsp_priv) +{ + struct brcm_priv_data *brcm_priv =3D (struct brcm_priv_data *)bsp_priv; + struct pci_dev *pdev =3D to_pci_dev(dev); + int vector; + int ret; + + /* This device is directly attached to the switch chip internal to the + * SoC using XGMII interface. Since no MDIO is present, register + * fixed-link software_node to create phylink. + */ + ret =3D software_node_register_node_group(brcm_swnodes); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "failed to register software_node\n"); + device_set_node(dev, software_node_fwnode(&parent_swnode)); + + pci_write_config_dword(pdev, XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_LOW, + XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_LO_VALUE); + pci_write_config_dword(pdev, XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_HIGH, + XGMAC_PCIE_CFG_MSIX_ADDR_MATCH_HI_VALUE); + + misc_iowrite(brcm_priv, XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_LO_OFFSET, + XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_LO_VALUE); + misc_iowrite(brcm_priv, XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_HI_OFFSET, + XGMAC_PCIE_MISC_MSIX_ADDR_MATCH_HI_VALUE); + + /* SBD Interrupt */ + misc_iowrite(brcm_priv, XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_SBD_ALL_OFFSET, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_SBD_ALL_VALUE); + /* EP_DOORBELL Interrupt */ + misc_iowrite(brcm_priv, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST_DBELL_OFFSET, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST_DBELL_VALUE); + /* EP_H0 Interrupt */ + misc_iowrite(brcm_priv, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST0_OFFSET, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST0_VALUE); + /* EP_H1 Interrupt */ + misc_iowrite(brcm_priv, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST1_OFFSET, + XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_EP2HOST1_VALUE); + + vector =3D BRCM_PER_CH_INT_VECTOR_START; + for (int i =3D 0, offset =3D XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_RX0_PF0_OFFS= ET; + i < BRCM_RX_Q_COUNT; i++, vector++, offset +=3D 4) + misc_iowrite(brcm_priv, offset, vector); + for (int i =3D 0, offset =3D XGMAC_PCIE_MISC_MSIX_VECTOR_MAP_TX0_PF0_OFFS= ET; + i < BRCM_TX_Q_COUNT; i++, vector++, offset +=3D 4) + misc_iowrite(brcm_priv, offset, vector); + + /* Enable Switch Link */ + misc_iowrite(brcm_priv, XGMAC_PCIE_MISC_MII_CTRL_OFFSET, + XGMAC_PCIE_MISC_MII_CTRL_PAUSE_RX | + XGMAC_PCIE_MISC_MII_CTRL_PAUSE_TX | + XGMAC_PCIE_MISC_MII_CTRL_LINK_UP); + /* Enable MSI-X */ + misc_iowrite(brcm_priv, XGMAC_PCIE_MISC_PCIESS_CTRL_OFFSET, + XGMAC_PCIE_MISC_PCIESS_CTRL_EN_MSI_MSIX); + return 0; +} + +static void brcm_drv_exit_cleanup(struct device *dev, void *bsp_priv) +{ + struct pci_dev *pdev =3D to_pci_dev(dev); + + device_set_node(&pdev->dev, NULL); + software_node_unregister_node_group(brcm_swnodes); +} + +static int brcm_pci_resume(struct device *dev, void *bsp_priv) +{ + /* Enable Switch Link */ + misc_iowrite(bsp_priv, XGMAC_PCIE_MISC_MII_CTRL_OFFSET, + XGMAC_PCIE_MISC_MII_CTRL_PAUSE_RX | + XGMAC_PCIE_MISC_MII_CTRL_PAUSE_TX | + XGMAC_PCIE_MISC_MII_CTRL_LINK_UP); + + return stmmac_pci_plat_resume(dev, bsp_priv); +} + +static struct plat_stmmacenet_data * +brcm_plat_data_setup(struct pci_dev *pdev) +{ + struct plat_stmmacenet_data *plat; + + plat =3D stmmac_plat_dat_alloc(&pdev->dev); + if (!plat) + return NULL; + + plat->axi =3D devm_kzalloc(&pdev->dev, sizeof(*plat->axi), GFP_KERNEL); + if (!plat->axi) + return NULL; + + plat->core_type =3D DWMAC_CORE_25GMAC; + plat->phy_interface =3D PHY_INTERFACE_MODE_XGMII; + + plat->dma_cfg->pbl =3D DEFAULT_DMA_PBL; + plat->dma_cfg->pblx8 =3D true; + plat->dma_cfg->eame =3D true; + + plat->axi->axi_wr_osr_lmt =3D 31; + plat->axi->axi_rd_osr_lmt =3D 31; + plat->axi->axi_blen_regval =3D DMA_AXI_BLEN64; + plat->force_sf_dma_mode =3D true; + plat->mac_port_sel_speed =3D SPEED_10000; + plat->clk_ptp_rate =3D 125000000; + plat->clk_ref_rate =3D 250000000; + plat->tx_coe =3D true; + plat->rx_coe =3D STMMAC_RX_COE_TYPE1; + plat->rss_en =3D 1; + plat->max_speed =3D SPEED_10000; + plat->maxmtu =3D BRCM_MAX_MTU; + + plat->tx_queues_to_use =3D BRCM_TX_Q_COUNT; + plat->rx_queues_to_use =3D BRCM_RX_Q_COUNT; + plat->tx_sched_algorithm =3D MTL_TX_ALGORITHM_SP; + plat->rx_sched_algorithm =3D MTL_RX_ALGORITHM_SP; + + plat->init =3D brcm_drv_init; + plat->exit =3D brcm_drv_exit_cleanup; + plat->suspend =3D stmmac_pci_plat_suspend; + plat->resume =3D brcm_pci_resume; + + return plat; +} + +static int dwxgmac_brcm_pci_probe(struct pci_dev *pdev, + const struct pci_device_id *id) +{ + struct plat_stmmacenet_data *plat; + struct brcm_priv_data *brcm_priv; + struct stmmac_resources res; + int ret; + + brcm_priv =3D devm_kzalloc(&pdev->dev, sizeof(*brcm_priv), GFP_KERNEL); + if (!brcm_priv) + return -ENOMEM; + + plat =3D brcm_plat_data_setup(pdev); + if (!plat) + return -ENOMEM; + plat->bsp_priv =3D brcm_priv; + + /* Disable D3COLD as our device does not support it */ + pci_d3cold_disable(pdev); + + /* Enable PCI device */ + ret =3D pcim_enable_device(pdev); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "failed to enable device\n"); + + pci_set_master(pdev); + + memset(&res, 0, sizeof(res)); + res.addr =3D pcim_iomap_region(pdev, 0, pci_name(pdev)); + if (IS_ERR(res.addr)) + return dev_err_probe(&pdev->dev, PTR_ERR(res.addr), + "failed to map IO region\n"); + + /* MISC Regs */ + brcm_priv->misc_regs =3D res.addr + BRCM_XGMAC_IOMEM_MISC_REG_OFFSET; + res.addr +=3D BRCM_XGMAC_IOMEM_CFG_REG_OFFSET; + + ret =3D brcm_config_multi_msi(pdev, plat, &res); + if (ret) + return dev_err_probe(&pdev->dev, ret, + "failed to configure IRQ\n"); + + return stmmac_dvr_probe(&pdev->dev, plat, &res); +} + +static void dwxgmac_brcm_pci_remove(struct pci_dev *pdev) +{ + stmmac_dvr_remove(&pdev->dev); +} + +static const struct pci_device_id dwxgmac_brcm_id_table[] =3D { + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, PCI_DEVICE_ID_BCM8958X) }, + {} +}; + +MODULE_DEVICE_TABLE(pci, dwxgmac_brcm_id_table); + +static struct pci_driver dwxgmac_brcm_pci_driver =3D { + .name =3D "brcm-bcm8958x", + .id_table =3D dwxgmac_brcm_id_table, + .probe =3D dwxgmac_brcm_pci_probe, + .remove =3D dwxgmac_brcm_pci_remove, + .driver =3D { + .pm =3D &stmmac_simple_pm_ops, + }, +}; + +module_pci_driver(dwxgmac_brcm_pci_driver); + +MODULE_DESCRIPTION("Broadcom 10G Automotive Ethernet PCIe driver"); +MODULE_LICENSE("GPL"); --=20 2.34.1