#
# Marvell device configuration
#

config NET_VENDOR_MARVELL
	bool "Marvell devices"
	default y
	depends on PCI || CPU_PXA168 || MV64X60 || PPC32 || PLAT_ORION || INET || COMPILE_TEST
	---help---
	  If you have a network (Ethernet) card belonging to this class, say Y.

	  Note that the answer to this question doesn't directly affect the
	  kernel: saying N will just cause the configurator to skip all
	  the questions about Marvell devices. If you say Y, you will be
	  asked for your specific card in the following questions.

if NET_VENDOR_MARVELL

config MV643XX_ETH
	tristate "Marvell Discovery (643XX) and Orion ethernet support"
	depends on (MV64X60 || PPC32 || PLAT_ORION || COMPILE_TEST) && INET
	depends on HAS_DMA
	select PHYLIB
	select MVMDIO
	---help---
	  This driver supports the gigabit ethernet MACs in the
	  Marvell Discovery PPC/MIPS chipset family (MV643XX) and
	  in the Marvell Orion ARM SoC family.

	  Some boards that use the Discovery chipset are the Momenco
	  Ocelot C and Jaguar ATX and Pegasos II.

config MVMDIO
	tristate "Marvell MDIO interface support"
	depends on HAS_IOMEM
	select PHYLIB
	---help---
	  This driver supports the MDIO interface found in the network
	  interface units of the Marvell EBU SoCs (Kirkwood, Orion5x,
	  Dove, Armada 370 and Armada XP).

	  This driver is used by the MV643XX_ETH and MVNETA drivers.

config MVNETA_BM_ENABLE
	tristate "Marvell Armada 38x/XP network interface BM support"
	depends on MVNETA
	depends on !64BIT
	---help---
	  This driver supports auxiliary block of the network
	  interface units in the Marvell ARMADA XP and ARMADA 38x SoC
	  family, which is called buffer manager.

	  This driver, when enabled, strictly cooperates with mvneta
	  driver and is common for all network ports of the devices,
	  even for Armada 370 SoC, which doesn't support hardware
	  buffer management.

config MVNETA
	tristate "Marvell Armada 370/38x/XP/37xx network interface support"
	depends on ARCH_MVEBU || COMPILE_TEST
	depends on HAS_DMA
	select MVMDIO
	select FIXED_PHY
	---help---
	  This driver supports the network interface units in the
	  Marvell ARMADA XP, ARMADA 370, ARMADA 38x and
	  ARMADA 37xx SoC family.

	  Note that this driver is distinct from the mv643xx_eth
	  driver, which should be used for the older Marvell SoCs
	  (Dove, Orion, Discovery, Kirkwood).

config MVNETA_BM
	tristate
	depends on !64BIT
	default y if MVNETA=y && MVNETA_BM_ENABLE!=n
	default MVNETA_BM_ENABLE
	select HWBM
	select GENERIC_ALLOCATOR
	help
	  MVNETA_BM must not be 'm' if MVNETA=y, so this symbol ensures
	  that all dependencies are met.

config MVPP2
	tristate "Marvell Armada 375/7K/8K network interface support"
	depends on ARCH_MVEBU || COMPILE_TEST
	depends on HAS_DMA
	select MVMDIO
	---help---
	  This driver supports the network interface units in the
	  Marvell ARMADA 375, 7K and 8K SoCs.

config PXA168_ETH
	tristate "Marvell pxa168 ethernet support"
	depends on HAS_IOMEM && HAS_DMA
	depends on CPU_PXA168 || ARCH_BERLIN || COMPILE_TEST
	select PHYLIB
	---help---
	  This driver supports the pxa168 Ethernet ports.

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

config SKGE
	tristate "Marvell Yukon Gigabit Ethernet support"
	depends on PCI
	select CRC32
	---help---
	  This driver support the Marvell Yukon or SysKonnect SK-98xx/SK-95xx
	  and related Gigabit Ethernet adapters. It is a new smaller driver
	  with better performance and more complete ethtool support.

	  It does not support the link failover and network management
	  features that "portable" vendor supplied sk98lin driver does.

	  This driver supports adapters based on the original Yukon chipset:
	  Marvell 88E8001, Belkin F5D5005, CNet GigaCard, DLink DGE-530T,
	  Linksys EG1032/EG1064, 3Com 3C940/3C940B, SysKonnect SK-9871/9872.

	  It does not support the newer Yukon2 chipset: a separate driver,
	  sky2, is provided for these adapters.

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

config SKGE_DEBUG
	bool "Debugging interface"
	depends on SKGE && DEBUG_FS
	---help---
	  This option adds the ability to dump driver state for debugging.
	  The file /sys/kernel/debug/skge/ethX displays the state of the internal
	  transmit and receive rings.

	  If unsure, say N.

config SKGE_GENESIS
	bool "Support for older SysKonnect Genesis boards"
	depends on SKGE
	---help---
	 This enables support for the older and uncommon SysKonnect Genesis
	 chips, which support MII via an external transceiver, instead of
	 an internal one. Disabling this option will save some memory
	 by making code smaller. If unsure say Y.

config SKY2
	tristate "Marvell Yukon 2 support"
	depends on PCI
	select CRC32
	---help---
	  This driver supports Gigabit Ethernet adapters based on the
	  Marvell Yukon 2 chipset:
	  Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/
	  88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21

	  There is companion driver for the older Marvell Yukon and
	  SysKonnect Genesis based adapters: skge.

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

config SKY2_DEBUG
	bool "Debugging interface"
	depends on SKY2 && DEBUG_FS
	---help---
	  This option adds the ability to dump driver state for debugging.
	  The file /sys/kernel/debug/sky2/ethX displays the state of the internal
	  transmit and receive rings.

	  If unsure, say N.

endif # NET_VENDOR_MARVELL
