wifi: iwlwifi: add kunit test for devinfo ordering
authorJohannes Berg <johannes.berg@intel.com>
Tue, 23 Jan 2024 18:08:09 +0000 (20:08 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 26 Jan 2024 08:47:11 +0000 (09:47 +0100)
We used to have a test built into the code for this internally,
but now we can put that into kunit and let everyone run it, to
verify the devinfo table ordering if it's changed.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240123200528.a4a8af7c091f.I0fb09083317b331168b99b8db39656a126a5cc4d@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/Kconfig
drivers/net/wireless/intel/iwlwifi/Makefile
drivers/net/wireless/intel/iwlwifi/iwl-config.h
drivers/net/wireless/intel/iwlwifi/iwl-drv.h
drivers/net/wireless/intel/iwlwifi/pcie/drv.c
drivers/net/wireless/intel/iwlwifi/tests/Makefile [new file with mode: 0644]
drivers/net/wireless/intel/iwlwifi/tests/devinfo.c [new file with mode: 0644]
drivers/net/wireless/intel/iwlwifi/tests/module.c [new file with mode: 0644]

index 20971304fdef451be1f94fd2c5f96652fd11bfb6..4b04865fc2c9e1e543bb050d8a454dca8fe04658 100644 (file)
@@ -46,6 +46,15 @@ config IWLWIFI
 
 if IWLWIFI
 
+config IWLWIFI_KUNIT_TESTS
+       tristate
+       depends on KUNIT
+       default KUNIT_ALL_TESTS
+       help
+         Enable this option for iwlwifi kunit tests.
+
+         If unsure, say N.
+
 config IWLWIFI_LEDS
        bool
        depends on LEDS_CLASS=y || LEDS_CLASS=MAC80211
index b983982aee454c1795b27a3926f91fde23d21083..3a2a25333d3639ac26766115ae6167836a963754 100644 (file)
@@ -33,4 +33,6 @@ obj-$(CONFIG_IWLDVM)  += dvm/
 obj-$(CONFIG_IWLMVM)   += mvm/
 obj-$(CONFIG_IWLMEI)   += mei/
 
+obj-$(CONFIG_IWLWIFI_KUNIT_TESTS) += tests/
+
 CFLAGS_iwl-devtrace.o := -I$(src)
index ae6f1cd4d66050499c50c8dd8645f227a3b70528..b3c6847cccf189f713599c431fdd836f39ee84f8 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/ieee80211.h>
 #include <linux/nl80211.h>
 #include "iwl-csr.h"
+#include "iwl-drv.h"
 
 enum iwl_device_family {
        IWL_DEVICE_FAMILY_UNDEFINED,
@@ -471,6 +472,15 @@ struct iwl_dev_info {
        const char *name;
 };
 
+#if IS_ENABLED(CONFIG_IWLWIFI_KUNIT_TESTS)
+extern const struct iwl_dev_info iwl_dev_info_table[];
+extern const unsigned int iwl_dev_info_table_size;
+const struct iwl_dev_info *
+iwl_pci_find_dev_info(u16 device, u16 subsystem_device,
+                     u16 mac_type, u8 mac_step, u16 rf_type, u8 cdb,
+                     u8 jacket, u8 rf_id, u8 no_160, u8 cores, u8 rf_step);
+#endif
+
 /*
  * This list declares the config structures for all devices.
  */
index 3d1a27ba35c6b574732f4dc19202cd11f668cedc..6a1d31892417b45fa24859b7ba7e133a5b8944cf 100644 (file)
@@ -6,6 +6,7 @@
 #ifndef __iwl_drv_h__
 #define __iwl_drv_h__
 #include <linux/export.h>
+#include <kunit/visibility.h>
 
 /* for all modules */
 #define DRV_NAME        "iwlwifi"
@@ -89,6 +90,14 @@ void iwl_drv_stop(struct iwl_drv *drv);
 #define IWL_EXPORT_SYMBOL(sym)
 #endif
 
+#if IS_ENABLED(CONFIG_IWLWIFI_KUNIT_TESTS)
+#define EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(sym)    EXPORT_SYMBOL_IF_KUNIT(sym)
+#define VISIBLE_IF_IWLWIFI_KUNIT
+#else
+#define EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(sym)
+#define VISIBLE_IF_IWLWIFI_KUNIT static
+#endif
+
 /* max retry for init flow */
 #define IWL_MAX_INIT_RETRY 2
 
index 2c9b98c8184b527363dca6aaf4aa7bb0d6cb51e3..cbae9503f4ba3bc2490ae8f1219e2a857748cd6e 100644 (file)
@@ -526,7 +526,7 @@ MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
                      IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY, IWL_CFG_ANY,  \
                      IWL_CFG_ANY, _cfg, _name)
 
-static const struct iwl_dev_info iwl_dev_info_table[] = {
+VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
 #if IS_ENABLED(CONFIG_IWLMVM)
 /* 9000 */
        IWL_DEV_INFO(0x2526, 0x1550, iwl9260_2ac_cfg, iwl9260_killer_1550_name),
@@ -1117,6 +1117,12 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
                      iwl_cfg_sc, iwl_sc_name),
 #endif /* CONFIG_IWLMVM */
 };
+EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(iwl_dev_info_table);
+
+#if IS_ENABLED(CONFIG_IWLWIFI_KUNIT_TESTS)
+const unsigned int iwl_dev_info_table_size = ARRAY_SIZE(iwl_dev_info_table);
+EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(iwl_dev_info_table_size);
+#endif
 
 /*
  * Read rf id and cdb info from prph register and store it
@@ -1236,7 +1242,7 @@ out:
 /* PCI registers */
 #define PCI_CFG_RETRY_TIMEOUT  0x041
 
-static const struct iwl_dev_info *
+VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info *
 iwl_pci_find_dev_info(u16 device, u16 subsystem_device,
                      u16 mac_type, u8 mac_step, u16 rf_type, u8 cdb,
                      u8 jacket, u8 rf_id, u8 no_160, u8 cores, u8 rf_step)
@@ -1299,6 +1305,7 @@ iwl_pci_find_dev_info(u16 device, u16 subsystem_device,
 
        return NULL;
 }
+EXPORT_SYMBOL_IF_IWLWIFI_KUNIT(iwl_pci_find_dev_info);
 
 static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 {
diff --git a/drivers/net/wireless/intel/iwlwifi/tests/Makefile b/drivers/net/wireless/intel/iwlwifi/tests/Makefile
new file mode 100644 (file)
index 0000000..5658471
--- /dev/null
@@ -0,0 +1,7 @@
+# SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+
+iwlwifi-tests-y += module.o devinfo.o
+
+ccflags-y += -I$(srctree)/$(src)/../
+
+obj-$(CONFIG_IWLWIFI_KUNIT_TESTS) += iwlwifi-tests.o
diff --git a/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c b/drivers/net/wireless/intel/iwlwifi/tests/devinfo.c
new file mode 100644 (file)
index 0000000..7aa47fc
--- /dev/null
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * KUnit tests for the iwlwifi device info table
+ *
+ * Copyright (C) 2023 Intel Corporation
+ */
+#include <kunit/test.h>
+#include "iwl-drv.h"
+#include "iwl-config.h"
+
+MODULE_IMPORT_NS(EXPORTED_FOR_KUNIT_TESTING);
+
+static void iwl_pci_print_dev_info(const char *pfx, const struct iwl_dev_info *di)
+{
+       printk(KERN_DEBUG "%sdev=%.4x,subdev=%.4x,mac_type=%.4x,mac_step=%.4x,rf_type=%.4x,cdb=%d,jacket=%d,rf_id=%.2x,no_160=%d,cores=%.2x\n",
+              pfx, di->device, di->subdevice, di->mac_type, di->mac_step,
+              di->rf_type, di->cdb, di->jacket, di->rf_id, di->no_160,
+              di->cores);
+}
+
+static void devinfo_table_order(struct kunit *test)
+{
+       int idx;
+
+       for (idx = 0; idx < iwl_dev_info_table_size; idx++) {
+               const struct iwl_dev_info *di = &iwl_dev_info_table[idx];
+               const struct iwl_dev_info *ret;
+
+               ret = iwl_pci_find_dev_info(di->device, di->subdevice,
+                                           di->mac_type, di->mac_step,
+                                           di->rf_type, di->cdb,
+                                           di->jacket, di->rf_id,
+                                           di->no_160, di->cores, di->rf_step);
+               if (ret != di) {
+                       iwl_pci_print_dev_info("searched: ", di);
+                       iwl_pci_print_dev_info("found:    ", ret);
+                       KUNIT_FAIL(test,
+                                  "unusable entry at index %d (found index %d instead)\n",
+                                  idx, (int)(ret - iwl_dev_info_table));
+               }
+       }
+}
+
+static struct kunit_case devinfo_test_cases[] = {
+       KUNIT_CASE(devinfo_table_order),
+       {}
+};
+
+static struct kunit_suite iwlwifi_devinfo = {
+       .name = "iwlwifi-devinfo",
+       .test_cases = devinfo_test_cases,
+};
+
+kunit_test_suite(iwlwifi_devinfo);
diff --git a/drivers/net/wireless/intel/iwlwifi/tests/module.c b/drivers/net/wireless/intel/iwlwifi/tests/module.c
new file mode 100644 (file)
index 0000000..0c54f81
--- /dev/null
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Module boilerplate for the iwlwifi kunit module.
+ *
+ * Copyright (C) 2023 Intel Corporation
+ */
+#include <linux/module.h>
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("kunit tests for iwlwifi");