[PATCH 1/3] firewire: core: refactor invoking transaction callback

From: Takashi Sakamoto

Date: Sun Sep 20 2026 - 23:19:44 EST


Two types of transaction callbacks are defined. There are many places
where the transaction callback is invoked with conditional branches.

Add a helper function to simplify invoking the callback.

Signed-off-by: Takashi Sakamoto <o-takashi@xxxxxxxxxxxxx>
---
drivers/firewire/core-transaction.c | 69 ++++++++++++-----------------
1 file changed, 28 insertions(+), 41 deletions(-)

diff --git a/drivers/firewire/core-transaction.c b/drivers/firewire/core-transaction.c
index a2a8d755ad0a..0cad55763a3e 100644
--- a/drivers/firewire/core-transaction.c
+++ b/drivers/firewire/core-transaction.c
@@ -52,6 +52,17 @@ static void remove_transaction_entry(struct fw_card *card, struct fw_transaction
card->transactions.tlabel_mask &= ~(1ULL << entry->tlabel);
}

+static void invoke_callback(struct fw_transaction *t, int rcode, u32 response_tstamp, void *data,
+ size_t data_length)
+{
+ if (!t->with_tstamp) {
+ t->callback.without_tstamp(t->card, rcode, data, data_length, t->callback_data);
+ } else {
+ t->callback.with_tstamp(t->card, rcode, t->packet.timestamp, response_tstamp,
+ data, data_length, t->callback_data);
+ }
+}
+
// Must be called without holding card->transactions.lock.
void fw_cancel_pending_transactions(struct fw_card *card)
{
@@ -69,14 +80,7 @@ void fw_cancel_pending_transactions(struct fw_card *card)

list_for_each_entry_safe(t, tmp, &pending_list, link) {
list_del(&t->link);
-
- if (!t->with_tstamp) {
- t->callback.without_tstamp(card, RCODE_CANCELLED, NULL, 0,
- t->callback_data);
- } else {
- t->callback.with_tstamp(card, RCODE_CANCELLED, t->packet.timestamp, 0,
- NULL, 0, t->callback_data);
- }
+ invoke_callback(t, RCODE_CANCELLED, 0, NULL, 0);
}
}

@@ -108,12 +112,7 @@ static int close_transaction(struct fw_transaction *transaction, struct fw_card
return -ENOENT;
}

- if (!t->with_tstamp) {
- t->callback.without_tstamp(card, rcode, NULL, 0, t->callback_data);
- } else {
- t->callback.with_tstamp(card, rcode, t->packet.timestamp, response_tstamp, NULL, 0,
- t->callback_data);
- }
+ invoke_callback(t, rcode, response_tstamp, NULL, 0);

return 0;
}
@@ -166,12 +165,7 @@ static void split_transaction_timeout_callback(struct timer_list *timer)
remove_transaction_entry(card, t);
}

- if (!t->with_tstamp) {
- t->callback.without_tstamp(card, RCODE_CANCELLED, NULL, 0, t->callback_data);
- } else {
- t->callback.with_tstamp(card, RCODE_CANCELLED, t->packet.timestamp,
- t->split_timeout_cycle, NULL, 0, t->callback_data);
- }
+ invoke_callback(t, RCODE_CANCELLED, t->split_timeout_cycle, NULL, 0);
}

// card->transactions.lock should be acquired in advance for the linked list.
@@ -385,6 +379,11 @@ void __fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode
{
int tlabel;

+ t->card = card;
+ t->callback = callback;
+ t->with_tstamp = with_tstamp;
+ t->callback_data = callback_data;
+
/*
* Allocate tlabel from the bitmap and put the transaction on
* the list while holding the card spinlock.
@@ -395,30 +394,23 @@ void __fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode
scoped_guard(spinlock_irqsave, &card->transactions.lock)
tlabel = allocate_tlabel(card);
if (tlabel < 0) {
- if (!with_tstamp) {
- callback.without_tstamp(card, RCODE_SEND_ERROR, NULL, 0, callback_data);
- } else {
- // Timestamping on behalf of hardware.
- u32 curr_cycle_time = 0;
- u32 tstamp;
+ // Timestamping on behalf of hardware.
+ u32 curr_cycle_time = 0;
+ u32 tstamp;

- (void)fw_card_read_cycle_time(card, &curr_cycle_time);
- tstamp = cycle_time_to_ohci_tstamp(curr_cycle_time);
+ (void)fw_card_read_cycle_time(card, &curr_cycle_time);
+ tstamp = cycle_time_to_ohci_tstamp(curr_cycle_time);
+
+ t->packet.timestamp = tstamp;
+ invoke_callback(t, RCODE_SEND_ERROR, tstamp, NULL, 0);

- callback.with_tstamp(card, RCODE_SEND_ERROR, tstamp, tstamp, NULL, 0,
- callback_data);
- }
return;
}

t->node_id = destination_id;
t->tlabel = tlabel;
- t->card = card;
t->is_split_transaction = false;
timer_setup(&t->split_timeout_timer, split_transaction_timeout_callback, 0);
- t->callback = callback;
- t->with_tstamp = with_tstamp;
- t->callback_data = callback_data;
t->packet.callback = transmit_complete_callback;

// NOTE: This can be without irqsave when we can guarantee that __fw_send_request() for
@@ -1198,12 +1190,7 @@ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
*/
card->driver->cancel_packet(card, &t->packet);

- if (!t->with_tstamp) {
- t->callback.without_tstamp(card, rcode, data, data_length, t->callback_data);
- } else {
- t->callback.with_tstamp(card, rcode, t->packet.timestamp, p->timestamp, data,
- data_length, t->callback_data);
- }
+ invoke_callback(t, rcode, p->timestamp, data, data_length);
}
EXPORT_SYMBOL(fw_core_handle_response);

--
2.53.0