Hi Arend, > Subject: [PATCH] iwlwifi: work around reverse dependency on MEI > > From: Arnd Bergmann <arnd@xxxxxxxx> > > If the iwlmei code is a loadable module, the main iwlwifi driver cannot be > built-in: > > x86_64-linux-ld: drivers/net/wireless/intel/iwlwifi/pcie/trans.o: in function > `iwl_pcie_prepare_card_hw': > trans.c:(.text+0x4158): undefined reference to `iwl_mei_is_connected' > > Unfortunately, Kconfig enforces the opposite, forcing the MEI driver to not > be built-in if iwlwifi is a module. > > There is no easy way to express the correct dependency in Kconfig, this is the > best workaround I could come up with, turning CONFIG_IWLMEI into a 'bool' > symbol, and spelling out the exact conditions under which it may be enabled, > and then using Makefile logic to ensure it is built-in when iwlwifi is. > > A better option would be change iwl_mei_is_connected() so it could be > called from iwlwifi regardless of whether the mei driver is reachable, but that > requires a larger rework in the driver. I can try to do that but I don't really see how.. I can't really make a function that would behave differently based on whether the symbol is available or not. > > Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx> > --- > drivers/net/wireless/intel/iwlwifi/Kconfig | 6 +++--- > drivers/net/wireless/intel/iwlwifi/Makefile | 3 +-- > drivers/net/wireless/intel/iwlwifi/mei/Makefile | 4 +++- > 3 files changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/wireless/intel/iwlwifi/Kconfig > b/drivers/net/wireless/intel/iwlwifi/Kconfig > index cf1125d84929..474afc6f82a8 100644 > --- a/drivers/net/wireless/intel/iwlwifi/Kconfig > +++ b/drivers/net/wireless/intel/iwlwifi/Kconfig > @@ -93,10 +93,10 @@ config IWLWIFI_BCAST_FILTERING > expect incoming broadcasts for their normal operations. > > config IWLMEI > - tristate "Intel Management Engine communication over WLAN" > - depends on INTEL_MEI > + bool "Intel Management Engine communication over WLAN" > + depends on INTEL_MEI=y || INTEL_MEI=IWLMVM > + depends on IWLMVM=y || IWLWIFI=m > depends on PM > - depends on IWLMVM > help > Enables the iwlmei kernel module. Johannes suggested to make IWLMVM depend on IWLMEI || !IWLMEI That worked as well, I just had issues with this in our internal backport based tree. I need to spend a bit more time on this, but I admit my total ignorance in Kconfig's dialect. > > diff --git a/drivers/net/wireless/intel/iwlwifi/Makefile > b/drivers/net/wireless/intel/iwlwifi/Makefile > index 75a703eb1bdf..c117e105fe5c 100644 > --- a/drivers/net/wireless/intel/iwlwifi/Makefile > +++ b/drivers/net/wireless/intel/iwlwifi/Makefile > @@ -29,7 +29,6 @@ iwlwifi-$(CONFIG_IWLWIFI_DEVICE_TRACING) += iwl- > devtrace.o ccflags-y += -I$(src) > > obj-$(CONFIG_IWLDVM) += dvm/ > -obj-$(CONFIG_IWLMVM) += mvm/ > -obj-$(CONFIG_IWLMEI) += mei/ > +obj-$(CONFIG_IWLMVM) += mvm/ mei/ > > CFLAGS_iwl-devtrace.o := -I$(src) > diff --git a/drivers/net/wireless/intel/iwlwifi/mei/Makefile > b/drivers/net/wireless/intel/iwlwifi/mei/Makefile > index 8e3ef0347db7..98b561c3820f 100644 > --- a/drivers/net/wireless/intel/iwlwifi/mei/Makefile > +++ b/drivers/net/wireless/intel/iwlwifi/mei/Makefile > @@ -1,5 +1,7 @@ > # SPDX-License-Identifier: GPL-2.0-only > -obj-$(CONFIG_IWLMEI) += iwlmei.o > +ifdef CONFIG_IWLMEI > +obj-$(CONFIG_IWLWIFI) += iwlmei.o > +endif > iwlmei-y += main.o > iwlmei-y += net.o > iwlmei-$(CONFIG_IWLWIFI_DEVICE_TRACING) += trace.o > -- > 2.29.2