Skip to content

Commit 446216b

Browse files
committed
firewire: core: expose kernel API to schedule work item to process isochronous context
In packet-per-buffer mode for isochronous context of 1394 OHCI, software can schedule hardIRQ to the buffer in which the content of isochronous packet is processed. The actual behaviour is different between isochronous receive (IR) and transmit (IT) contexts in respect to isochronous cycle in which the hardIRQ occurs. In IR context, the hardIRQ occurs when the buffer is filled actually by the content of received packet. If there are any isochronous cycles in which the packet transmission is skipped, it is postponed to generate the hardIRQ in respect to the isochronous cycle. In IT context, software can schedule the content of packet every isochronous cycle including skipping, therefore the hardIRQ occurs in the isochronous cycle to which the software scheduled. ALSA firewire stack uses the packet-per-buffer mode for both IR/IT contexts. To process time stamp per packet (or per sample in some cases) steadily for media clock recovery against unexpected transmission skips, it uses an IT context to operate all of isochronous contexts by calls of fw_iso_context_flush_completions() in the bottom-half of hardIRQ for the IT context. Although it looks well to handle all of isochronous contexts in a single bottom-half context, it relatively takes longer time. In the future code integration (not yet), it is possible to apply parallelism method to process these context. In the case, it is useful to allow unit drivers to schedule work items to process these isochronous contexts. As a preparation, this commit exposes fw_iso_context_schedule_flush_completions() as a kernel API available by unit drivers. It is renamed from fw_iso_context_queue_work() since it is a counter part of fw_iso_context_flush_completions(). Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Sakamoto <[email protected]>
1 parent 7519033 commit 446216b

File tree

4 files changed

+21
-7
lines changed

4 files changed

+21
-7
lines changed

Documentation/driver-api/firewire.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ Firewire core transaction interfaces
4343
Firewire Isochronous I/O interfaces
4444
===================================
4545

46+
.. kernel-doc:: include/linux/firewire.h
47+
:functions: fw_iso_context_schedule_flush_completions
4648
.. kernel-doc:: drivers/firewire/core-iso.c
4749
:export:
4850

drivers/firewire/core.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,6 @@ static inline void fw_iso_context_init_work(struct fw_iso_context *ctx, work_fun
164164
INIT_WORK(&ctx->work, func);
165165
}
166166

167-
static inline void fw_iso_context_queue_work(struct fw_iso_context *ctx)
168-
{
169-
queue_work(ctx->card->isoc_wq, &ctx->work);
170-
}
171-
172167

173168
/* -topology */
174169

drivers/firewire/ohci.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,7 +2283,7 @@ static irqreturn_t irq_handler(int irq, void *data)
22832283

22842284
while (iso_event) {
22852285
i = ffs(iso_event) - 1;
2286-
fw_iso_context_queue_work(&ohci->ir_context_list[i].base);
2286+
fw_iso_context_schedule_flush_completions(&ohci->ir_context_list[i].base);
22872287
iso_event &= ~(1 << i);
22882288
}
22892289
}
@@ -2294,7 +2294,7 @@ static irqreturn_t irq_handler(int irq, void *data)
22942294

22952295
while (iso_event) {
22962296
i = ffs(iso_event) - 1;
2297-
fw_iso_context_queue_work(&ohci->it_context_list[i].base);
2297+
fw_iso_context_schedule_flush_completions(&ohci->it_context_list[i].base);
22982298
iso_event &= ~(1 << i);
22992299
}
23002300
}

include/linux/firewire.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,23 @@ int fw_iso_context_queue(struct fw_iso_context *ctx,
531531
unsigned long payload);
532532
void fw_iso_context_queue_flush(struct fw_iso_context *ctx);
533533
int fw_iso_context_flush_completions(struct fw_iso_context *ctx);
534+
535+
/**
536+
* fw_iso_context_schedule_flush_completions() - schedule work item to process isochronous context.
537+
* @ctx: the isochronous context
538+
*
539+
* Schedule a work item on workqueue to process the isochronous context. The registered callback
540+
* function is called in the worker if some packets have been already transferred since the last
541+
* time. If it is required to process the context in the current context,
542+
* fw_iso_context_flush_completions() is available instead.
543+
*
544+
* Context: Any context.
545+
*/
546+
static inline void fw_iso_context_schedule_flush_completions(struct fw_iso_context *ctx)
547+
{
548+
queue_work(ctx->card->isoc_wq, &ctx->work);
549+
}
550+
534551
int fw_iso_context_start(struct fw_iso_context *ctx,
535552
int cycle, int sync, int tags);
536553
int fw_iso_context_stop(struct fw_iso_context *ctx);

0 commit comments

Comments
 (0)