Conversation

Takashi Sakamoto (坂本 貴史)

I realized to write stub functions for KUnit tests. Great!

diff --git a/drivers/firewire/.kunitconfig b/drivers/firewire/.kunitconfig
index 7406acb00478..4f58bbb2ac5a 100644
--- a/drivers/firewire/.kunitconfig
+++ b/drivers/firewire/.kunitconfig
@@ -7,3 +7,4 @@ CONFIG_FIREWIRE_KUNIT_PACKET_SERDES_TEST=y
 CONFIG_FIREWIRE_KUNIT_SELF_ID_SEQUENCE_HELPER_TEST=y
 CONFIG_FIREWIRE_KUNIT_OHCI_SERDES_TEST=y
 CONFIG_FIREWIRE_KUNIT_NODE_TREE_TEST=y
+CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_READER_TEST=y
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig
index b5abe00accc9..ccdaa0920bf6 100644
--- a/drivers/firewire/Kconfig
+++ b/drivers/firewire/Kconfig
@@ -96,6 +96,21 @@ config FIREWIRE_KUNIT_NODE_TREE_TEST
 	  For more information on KUnit and unit tests in general, refer
 	  to the KUnit documentation in Documentation/dev-tools/kunit/.
 
+config FIREWIRE_KUNIT_CONFIG_ROM_READER_TEST
+	tristate "KUnit tests for node tree" if !KUNIT_ALL_TESTS
+	depends on FIREWIRE && KUNIT
+	default KUNIT_ALL_TESTS
+	help
+	  This builds the KUnit tests for configuration ROM reader.
+
+	  KUnit tests run during boot and output the results to the debug
+	  log in TAP format (https://testanything.org/). Only useful for
+	  kernel devs running KUnit test harness and are not for inclusion
+	  into a production build.
+
+	  For more information on KUnit and unit tests in general, refer
+	  to the KUnit documentation in Documentation/dev-tools/kunit/.
+
 config FIREWIRE_OHCI
 	tristate "OHCI-1394 controllers"
 	depends on PCI && FIREWIRE
diff --git a/drivers/firewire/configuration-rom-reader-test.c b/drivers/firewire/configuration-rom-reader-test.c
new file mode 100644
index 000000000000..953d65edd717
--- /dev/null
+++ b/drivers/firewire/configuration-rom-reader-test.c
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// configuration-rom-reader-test.c - An application of Kunit to test configuration ROM reader.
+//
+// Copyright (c) 2026 Takashi Sakamoto
+//
+// This file can not be built independently since it is intentionally included in core-device.c.
+
+#include <kunit/test.h>
+#include <kunit/static_stub.h>
+
+static int stub_fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
+				   int generation, int speed, unsigned long long offset,
+				   void *payload, size_t length)
+{
+	return RCODE_CONFLICT_ERROR;
+}
+
+static void config_rom_reader_test(struct kunit *test)
+{
+	kunit_activate_static_stub(test, fw_run_transaction, stub_fw_run_transaction);
+
+	struct fw_device device;
+	int generation = 0;
+	int speed = SCODE_100;
+	int index = 0;
+	u32 data;
+	int err;
+
+	err = read_rom(&device, generation, speed, index, &data);
+	KUNIT_EXPECT_EQ(test, err, RCODE_CONFLICT_ERROR);
+
+	kunit_deactivate_static_stub(test, fw_run_transaction);
+}
+
+static struct kunit_case config_rom_reader_test_cases[] = {
+	{}
+};
+
+static struct kunit_suite config_rom_reader_test_suite = {
+	.name = "firewire-configuration-rom-reader",
+	.test_cases = config_rom_reader_test_cases,
+};
+kunit_test_suite(config_rom_reader_test_suite);
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index cbac66916240..3472b44a8501 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -1442,3 +1442,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event)
 #ifdef CONFIG_FIREWIRE_KUNIT_DEVICE_ATTRIBUTE_TEST
 #include "device-attribute-test.c"
 #endif
+
+#ifdef CONFIG_FIREWIRE_KUNIT_CONFIG_ROM_READER_TEST
+#include "configuration-rom-reader-test.c"
+#endif
diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c
index 22ae387ae03c..2162e1daa447 100644
--- a/drivers/firewire/core-transaction.c
+++ b/drivers/firewire/core-transaction.c
@@ -24,6 +24,7 @@
 #include <linux/timer.h>
 #include <linux/types.h>
 #include <linux/workqueue.h>
+#include <kunit/static_stub.h>
 
 #include <asm/byteorder.h>
 
@@ -481,6 +482,9 @@ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
 		       int generation, int speed, unsigned long long offset,
 		       void *payload, size_t length)
 {
+        KUNIT_STATIC_STUB_REDIRECT(fw_run_transaction, card, tcode, destination_id, generation,
+				   speed, offset, payload, length);
+
 	struct transaction_callback_data d;
 	struct fw_transaction t;
 
0
0
1