#
# For a description of the syntax of this configuration file,
# see docs/Kconfig-language.txt.
#

menu "Linux Module Utilities"

config MODPROBE_SMALL
	bool "Simplified modutils"
	default y
	help
	Build smaller (~1.5 kbytes), simplified module tools.

	This option by itself does not enable any applets -
	you need to select applets individually below.

	With this option modprobe does not require modules.dep file
	and does not use /etc/modules.conf file.
	It scans module files in /lib/modules/`uname -r` and
	determines dependencies and module alias names on the fly.
	This may make module loading slower, most notably
	when one needs to load module by alias (this requires
	scanning through module _bodies_).

	At the first attempt to load a module by alias modprobe
	will try to generate modules.dep.bb file in order to speed up
	future loads by alias. Failure to do so (read-only /lib/modules,
	etc) is not reported, and future modprobes will be slow too.

	NB: modules.dep.bb file format is not compatible
	with modules.dep file as created/used by standard module tools.

	Additional module parameters can be stored in
	/etc/modules/$module_name files.

INSERT

comment "Options common to multiple modutils"

config FEATURE_CMDLINE_MODULE_OPTIONS
	bool "Accept module options on modprobe command line"
	default y
	depends on INSMOD || MODPROBE
	help
	Allow insmod and modprobe take module options from the applets'
	command line.

config FEATURE_MODPROBE_SMALL_CHECK_ALREADY_LOADED
	bool "Skip loading of already loaded modules"
	default y
	depends on MODPROBE_SMALL && (DEPMOD || INSMOD || MODPROBE)
	help
	Check if the module is already loaded.

config FEATURE_2_4_MODULES
	bool "Support version 2.2/2.4 Linux kernels"
	default n
	depends on (INSMOD || LSMOD || MODPROBE || RMMOD) && !MODPROBE_SMALL
	help
	Support module loading for 2.2.x and 2.4.x Linux kernels.
	This increases size considerably. Say N unless you plan
	to run ancient kernels.

config FEATURE_INSMOD_VERSION_CHECKING
	bool "Enable module version checking"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	help
	Support checking of versions for modules. This is used to
	ensure that the kernel and module are made for each other.

config FEATURE_INSMOD_KSYMOOPS_SYMBOLS
	bool "Add module symbols to kernel symbol table"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	help
	By adding module symbols to the kernel symbol table, Oops messages
	occurring within kernel modules can be properly debugged. By enabling
	this feature, module symbols will always be added to the kernel symbol
	table for proper debugging support. If you are not interested in
	Oops messages from kernel modules, say N.

config FEATURE_INSMOD_LOADINKMEM
	bool "In kernel memory optimization (uClinux only)"
	default n
	depends on FEATURE_2_4_MODULES && (INSMOD || MODPROBE)
	help
	This is a special uClinux only memory optimization that lets insmod
	load the specified kernel module directly into kernel space, reducing
	memory usage by preventing the need for two copies of the module
	being loaded into memory.

config FEATURE_INSMOD_LOAD_MAP
	bool "Enable insmod load map (-m) option"
	default n
	depends on FEATURE_2_4_MODULES && INSMOD
	help
	Enabling this, one would be able to get a load map
	output on stdout. This makes kernel module debugging
	easier.
	If you don't plan to debug kernel modules, you
	don't need this option.

config FEATURE_INSMOD_LOAD_MAP_FULL
	bool "Symbols in load map"
	default y
	depends on FEATURE_INSMOD_LOAD_MAP
	help
	Without this option, -m will only output section
	load map. With this option, -m will also output
	symbols load map.

config FEATURE_CHECK_TAINTED_MODULE
	bool "Support tainted module checking with new kernels"
	default y
	depends on (LSMOD || FEATURE_2_4_MODULES) && !MODPROBE_SMALL
	help
	Support checking for tainted modules. These are usually binary
	only modules that will make the linux-kernel list ignore your
	support request.
	This option is required to support GPLONLY modules.

config FEATURE_INSMOD_TRY_MMAP
	bool "Try to load module from a mmap'ed area"
	default n
	depends on (INSMOD || MODPROBE) && !MODPROBE_SMALL
	help
	This option causes module loading code to try to mmap
	module first. If it does not work (for example,
	it does not work for compressed modules), module will be read
	(and unpacked if needed) into a memory block allocated by malloc.

	The only case when mmap works but malloc does not is when
	you are trying to load a big module on a very memory-constrained
	machine. Malloc will momentarily need 2x as much memory as mmap.

	Choosing N saves about 250 bytes of code (on 32-bit x86).

config FEATURE_MODUTILS_ALIAS
	bool "Support module.aliases file"
	default y
	depends on (DEPMOD || MODPROBE) && !MODPROBE_SMALL
	help
	Generate and parse modules.alias containing aliases for bus
	identifiers:
		alias pcmcia:m*c*f03fn*pfn*pa*pb*pc*pd* parport_cs

	and aliases for logical modules names e.g.:
		alias padlock_aes aes
		alias aes_i586 aes
		alias aes_generic aes

	Say Y if unsure.

config FEATURE_MODUTILS_SYMBOLS
	bool "Support module.symbols file"
	default y
	depends on (DEPMOD || MODPROBE) && !MODPROBE_SMALL
	help
	Generate and parse modules.symbols containing aliases for
	symbol_request() kernel calls, such as:
		alias symbol:usb_sg_init usbcore

	Say Y if unsure.

config DEFAULT_MODULES_DIR
	string "Default directory containing modules"
	default "/lib/modules"
	depends on DEPMOD || MODPROBE || MODINFO
	help
	Directory that contains kernel modules.
	Defaults to "/lib/modules"

config DEFAULT_DEPMOD_FILE
	string "Default name of modules.dep"
	default "modules.dep"
	depends on DEPMOD || MODPROBE || MODINFO
	help
	Filename that contains kernel modules dependencies.
	Defaults to "modules.dep".
	If you configured the "simplified modutils" (MODPROBE_SMALL), a
	".bb" suffix will be added after this name. Do not specify ".bb"
	here unless you intend your depmod or modprobe to work on
	"modules.dep.bb.bb" or such.

endmenu
