# SPDX-License-Identifier: GPL-2.0-only
#
# Broadcom device configuration
#

config NET_VENDOR_BROADCOM
	bool "Broadcom devices"
	default y
	depends on (SSB_POSSIBLE && HAS_DMA) || PCI || BCM63XX || \
		   SIBYTE_SB1xxx_SOC
	help
	  If you have a network (Ethernet) chipset belonging to this class,
	  say Y.

	  Note that the answer to this question does not directly affect
	  the kernel: saying N will just cause the configurator to skip all
	  the questions regarding Broadcom chipsets. If you say Y, you will
	  be asked for your specific chipset/driver in the following questions.

if NET_VENDOR_BROADCOM

config B44
	tristate "Broadcom 440x/47xx ethernet support"
	depends on SSB_POSSIBLE && HAS_DMA
	select SSB
	select MII
	select PHYLIB
	help
	  If you have a network (Ethernet) controller of this type, say Y
	  or M here.

	  To compile this driver as a module, choose M here. The module
	  will be called b44.

# Auto-select SSB PCI-HOST support, if possible
config B44_PCI_AUTOSELECT
	bool
	depends on B44 && SSB_PCIHOST_POSSIBLE
	select SSB_PCIHOST
	default y

# Auto-select SSB PCICORE driver, if possible
config B44_PCICORE_AUTOSELECT
	bool
	depends on B44 && SSB_DRIVER_PCICORE_POSSIBLE
	select SSB_DRIVER_PCICORE
	default y

config B44_PCI
	bool
	depends on B44_PCI_AUTOSELECT && B44_PCICORE_AUTOSELECT
	default y

config BCM4908_ENET
	tristate "Broadcom BCM4908 internal mac support"
	depends on ARCH_BCMBCA || COMPILE_TEST
	default y if ARCH_BCMBCA
	help
	  This driver supports Ethernet controller integrated into Broadcom
	  BCM4908 family SoCs.

config BCM63XX_ENET
	tristate "Broadcom 63xx internal mac support"
	depends on BCM63XX
	select MII
	select PHYLIB
	help
	  This driver supports the ethernet MACs in the Broadcom 63xx
	  MIPS chipset family (BCM63XX).

config BCMGENET
	tristate "Broadcom GENET internal MAC support"
	depends on HAS_IOMEM
	depends on PTP_1588_CLOCK_OPTIONAL || !ARCH_BCM2835
	select MII
	select PHYLIB
	select FIXED_PHY
	select BCM7XXX_PHY
	select MDIO_BCM_UNIMAC
	select DIMLIB
	select BROADCOM_PHY if ARCH_BCM2835
	help
	  This driver supports the built-in Ethernet MACs found in the
	  Broadcom BCM7xxx Set Top Box family chipset.

config BNX2
	tristate "QLogic bnx2 support"
	depends on PCI
	select CRC32
	select FW_LOADER
	help
	  This driver supports QLogic bnx2 gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called bnx2.  This is recommended.

config CNIC
	tristate "QLogic CNIC support"
	depends on PCI && (IPV6 || IPV6=n)
	depends on MMU
	select BNX2
	select UIO
	help
	  This driver supports offload features of QLogic bnx2 gigabit
	  Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called cnic.  This is recommended.

config SB1250_MAC
	tristate "SB1250 Gigabit Ethernet support"
	depends on SIBYTE_SB1xxx_SOC
	select PHYLIB
	help
	  This driver supports Gigabit Ethernet interfaces based on the
	  Broadcom SiByte family of System-On-a-Chip parts.  They include
	  the BCM1120, BCM1125, BCM1125H, BCM1250, BCM1255, BCM1280, BCM1455
	  and BCM1480 chips.

	  To compile this driver as a module, choose M here: the module
	  will be called sb1250-mac.

config TIGON3
	tristate "Broadcom Tigon3 support"
	depends on PCI
	depends on PTP_1588_CLOCK_OPTIONAL
	select PHYLIB
	help
	  This driver supports Broadcom Tigon3 based gigabit Ethernet cards.

	  To compile this driver as a module, choose M here: the module
	  will be called tg3.  This is recommended.

config TIGON3_HWMON
	bool "Broadcom Tigon3 HWMON support"
	default y
	depends on TIGON3 && HWMON && !(TIGON3=y && HWMON=m)
	help
	  Say Y if you want to expose the thermal sensor on Tigon3 devices.

config BNX2X
	tristate "Broadcom NetXtremeII 10Gb support"
	depends on PCI
	depends on PTP_1588_CLOCK_OPTIONAL
	select FW_LOADER
	select ZLIB_INFLATE
	select LIBCRC32C
	select MDIO
	help
	  This driver supports Broadcom NetXtremeII 10 gigabit Ethernet cards.
	  To compile this driver as a module, choose M here: the module
	  will be called bnx2x.  This is recommended.

config BNX2X_SRIOV
	bool "Broadcom 578xx and 57712 SR-IOV support"
	depends on BNX2X && PCI_IOV
	default y
	help
	  This configuration parameter enables Single Root Input Output
	  Virtualization support in the 578xx and 57712 products. This
	  allows for virtual function acceleration in virtual environments.

config BGMAC
	tristate
	help
	  This enables the integrated ethernet controller support for many
	  Broadcom (mostly iProc) SoCs. An appropriate bus interface driver
	  needs to be enabled to select this.

config BGMAC_BCMA
	tristate "Broadcom iProc GBit BCMA support"
	depends on BCMA && BCMA_HOST_SOC
	depends on BCM47XX || ARCH_BCM_5301X || COMPILE_TEST
	select BGMAC
	select PHYLIB
	select FIXED_PHY
	help
	  This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus.
	  They can be found on BCM47xx SoCs and provide gigabit ethernet.
	  In case of using this driver on BCM4706 it's also requires to enable
	  BCMA_DRIVER_GMAC_CMN to make it work.

config BGMAC_PLATFORM
	tristate "Broadcom iProc GBit platform support"
	depends on ARCH_BCM_IPROC || COMPILE_TEST
	select BGMAC
	select PHYLIB
	select FIXED_PHY
	default ARCH_BCM_IPROC
	help
	  Say Y here if you want to use the Broadcom iProc Gigabit Ethernet
	  controller through the generic platform interface

config SYSTEMPORT
	tristate "Broadcom SYSTEMPORT internal MAC support"
	depends on HAS_IOMEM
	depends on NET_DSA || !NET_DSA
	select MII
	select PHYLIB
	select FIXED_PHY
	select DIMLIB
	help
	  This driver supports the built-in Ethernet MACs found in the
	  Broadcom BCM7xxx Set Top Box family chipset using an internal
	  Ethernet switch.

config BNXT
	tristate "Broadcom NetXtreme-C/E support"
	depends on PCI
	depends on PTP_1588_CLOCK_OPTIONAL
	select FW_LOADER
	select LIBCRC32C
	select NET_DEVLINK
	select PAGE_POOL
	select DIMLIB
	select AUXILIARY_BUS
	help
	  This driver supports Broadcom NetXtreme-C/E 10/25/40/50 gigabit
	  Ethernet cards.  To compile this driver as a module, choose M here:
	  the module will be called bnxt_en.  This is recommended.

config BNXT_SRIOV
	bool "Broadcom NetXtreme-C/E SR-IOV support"
	depends on BNXT && PCI_IOV
	default y
	help
	  This configuration parameter enables Single Root Input Output
	  Virtualization support in the NetXtreme-C/E products. This
	  allows for virtual function acceleration in virtual environments.

config BNXT_FLOWER_OFFLOAD
	bool "TC Flower offload support for NetXtreme-C/E"
	depends on BNXT
	default y
	help
	  This configuration parameter enables TC Flower packet classifier
	  offload for eswitch.  This option enables SR-IOV switchdev eswitch
	  offload.

config BNXT_DCB
	bool "Data Center Bridging (DCB) Support"
	default n
	depends on BNXT && DCB
	help
	  Say Y here if you want to use Data Center Bridging (DCB) in the
	  driver.

	  If unsure, say N.

config BNXT_HWMON
	bool "Broadcom NetXtreme-C/E HWMON support"
	default y
	depends on BNXT && HWMON && !(BNXT=y && HWMON=m)
	help
	  Say Y if you want to expose the thermal sensor data on NetXtreme-C/E
	  devices, via the hwmon sysfs interface.

config BCMASP
	tristate "Broadcom ASP 2.0 Ethernet support"
	depends on ARCH_BRCMSTB || COMPILE_TEST
	default ARCH_BRCMSTB
	depends on OF
	select MII
	select PHYLIB
	select MDIO_BCM_UNIMAC
	help
	  This configuration enables the Broadcom ASP 2.0 Ethernet controller
	  driver which is present in Broadcom STB SoCs such as 72165.

endif # NET_VENDOR_BROADCOM
