aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2022-05-05 11:37:24 +0900
committer坂本 貴史 <o-takashi@sakamocchi.jp>2022-05-05 16:09:50 +0900
commit2df2c1875b9cc59eab87f443278163c5ca79292c (patch)
tree89208d753b59ad67c7b0bd70a5b0571754a07f56
parentf0362d6820570d68b9b0f271901202ace481108a (diff)
downloadlibhinoko-2df2c1875b9cc59eab87f443278163c5ca79292c.tar.gz
fw_iso_ctx: code refactoring to move chunk queueing function
It's convenient to put private implementation into the same file. This commit moves the function to queue chunk into such file. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-rw-r--r--src/fw_iso_ctx.c95
-rw-r--r--src/fw_iso_ctx_private.c91
-rw-r--r--src/fw_iso_ctx_private.h1
3 files changed, 96 insertions, 91 deletions
diff --git a/src/fw_iso_ctx.c b/src/fw_iso_ctx.c
index 55d438b..5cd9ae7 100644
--- a/src/fw_iso_ctx.c
+++ b/src/fw_iso_ctx.c
@@ -342,93 +342,6 @@ void hinoko_fw_iso_ctx_register_chunk(HinokoFwIsoCtx *self, gboolean skip,
payload_length, schedule_interrupt, error);
}
-static void fw_iso_ctx_queue_chunks(HinokoFwIsoCtx *self, GError **error)
-{
- HinokoFwIsoCtxPrivate *priv;
- guint data_offset = 0;
- int chunk_count = 0;
- unsigned int bytes_per_buffer;
- guint buf_offset;
-
- g_return_if_fail(HINOKO_IS_FW_ISO_CTX(self));
- priv = hinoko_fw_iso_ctx_get_instance_private(self);
-
- bytes_per_buffer = priv->bytes_per_chunk * priv->chunks_per_buffer;
- buf_offset = priv->curr_offset;
-
- while (data_offset < priv->data_length) {
- struct fw_cdev_queue_iso arg = {0};
- guint buf_length = 0;
- guint data_length = 0;
-
- while (buf_offset + buf_length < bytes_per_buffer &&
- data_offset + data_length < priv->data_length) {
- struct fw_cdev_iso_packet *datum;
- guint payload_length;
- guint header_length;
- guint datum_length;
-
- datum = (struct fw_cdev_iso_packet *)
- (priv->data + data_offset + data_length);
- payload_length = datum->control & 0x0000ffff;
- header_length = (datum->control & 0xff000000) >> 24;
-
- if (buf_offset + buf_length + payload_length >
- bytes_per_buffer) {
- buf_offset = 0;
- break;
- }
-
- datum_length = sizeof(*datum);
- if (priv->mode == HINOKO_FW_ISO_CTX_MODE_TX)
- datum_length += header_length;
-
- g_debug("%3d: %3d-%3d/%3d: %6d-%6d/%6d: %d",
- chunk_count,
- data_offset + data_length,
- data_offset + data_length + datum_length,
- priv->alloc_data_length,
- buf_offset + buf_length,
- buf_offset + buf_length + payload_length,
- bytes_per_buffer,
- !!(datum->control & FW_CDEV_ISO_INTERRUPT));
-
- buf_length += payload_length;
- data_length += datum_length;
- ++chunk_count;
- }
-
- arg.packets = (__u64)(priv->data + data_offset);
- arg.size = data_length;
- arg.data = (__u64)(priv->addr + buf_offset);
- arg.handle = priv->handle;
- if (ioctl(priv->fd, FW_CDEV_IOC_QUEUE_ISO, &arg) < 0) {
- generate_syscall_error(error, errno,
- "ioctl(%s)", "FW_CDEV_IOC_QUEUE_ISO");
- return;
- }
-
- g_debug("%3d: %3d-%3d/%3d: %6d-%6d/%6d",
- chunk_count,
- data_offset, data_offset + data_length,
- priv->alloc_data_length,
- buf_offset, buf_offset + buf_length,
- bytes_per_buffer);
-
- buf_offset += buf_length;
- buf_offset %= bytes_per_buffer;
-
- data_offset += data_length;
- }
-
- g_warn_if_fail(chunk_count == priv->registered_chunk_count);
-
- priv->curr_offset = buf_offset;
-
- priv->data_length = 0;
- priv->registered_chunk_count = 0;
-}
-
static void fw_iso_ctx_stop(HinokoFwIsoCtx *self)
{
struct fw_cdev_stop_iso arg = {0};
@@ -460,6 +373,7 @@ static gboolean check_src(GSource *source)
static gboolean dispatch_src(GSource *source, GSourceFunc cb, gpointer user_data)
{
FwIsoCtxSource *src = (FwIsoCtxSource *)source;
+ HinokoFwIsoCtxPrivate *priv;
GIOCondition condition;
GError *error = NULL;
int len;
@@ -484,8 +398,8 @@ static gboolean dispatch_src(GSource *source, GSourceFunc cb, gpointer user_data
if (!src->handle_event(src->self, event, &error))
goto error;
- fw_iso_ctx_queue_chunks(src->self, &error);
- if (error != NULL)
+ priv = hinoko_fw_iso_ctx_get_instance_private(src->self);
+ if (!fw_iso_ctx_state_queue_chunks(priv, &error))
goto error;
// Just be sure to continue to process this source.
@@ -628,8 +542,7 @@ void hinoko_fw_iso_ctx_start(HinokoFwIsoCtx *self, const guint16 *cycle_match, g
return;
}
- fw_iso_ctx_queue_chunks(self, error);
- if (*error != NULL)
+ if (!fw_iso_ctx_state_queue_chunks(priv, error))
return;
arg.sync = sync;
diff --git a/src/fw_iso_ctx_private.c b/src/fw_iso_ctx_private.c
index fdf5392..5597e0f 100644
--- a/src/fw_iso_ctx_private.c
+++ b/src/fw_iso_ctx_private.c
@@ -283,3 +283,94 @@ gboolean fw_iso_ctx_state_register_chunk(struct fw_iso_ctx_state *state, gboolea
return TRUE;
}
+
+/**
+ * fw_iso_ctx_state_queue_chunks:
+ * @state: A [struct@FwIsoCtxState].
+ * @error: A [struct@GLib.Error].
+ *
+ * Queue registered chunks to 1394 OHCI controller.
+ */
+gboolean fw_iso_ctx_state_queue_chunks(struct fw_iso_ctx_state *state, GError **error)
+{
+ guint data_offset = 0;
+ int chunk_count = 0;
+ unsigned int bytes_per_buffer;
+ guint buf_offset;
+
+ bytes_per_buffer = state->bytes_per_chunk * state->chunks_per_buffer;
+ buf_offset = state->curr_offset;
+
+ while (data_offset < state->data_length) {
+ struct fw_cdev_queue_iso arg = {0};
+ guint buf_length = 0;
+ guint data_length = 0;
+
+ while (buf_offset + buf_length < bytes_per_buffer &&
+ data_offset + data_length < state->data_length) {
+ struct fw_cdev_iso_packet *datum;
+ guint payload_length;
+ guint header_length;
+ guint datum_length;
+
+ datum = (struct fw_cdev_iso_packet *)
+ (state->data + data_offset + data_length);
+ payload_length = datum->control & 0x0000ffff;
+ header_length = (datum->control & 0xff000000) >> 24;
+
+ if (buf_offset + buf_length + payload_length >
+ bytes_per_buffer) {
+ buf_offset = 0;
+ break;
+ }
+
+ datum_length = sizeof(*datum);
+ if (state->mode == HINOKO_FW_ISO_CTX_MODE_TX)
+ datum_length += header_length;
+
+ g_debug("%3d: %3d-%3d/%3d: %6d-%6d/%6d: %d",
+ chunk_count,
+ data_offset + data_length,
+ data_offset + data_length + datum_length,
+ state->alloc_data_length,
+ buf_offset + buf_length,
+ buf_offset + buf_length + payload_length,
+ bytes_per_buffer,
+ !!(datum->control & FW_CDEV_ISO_INTERRUPT));
+
+ buf_length += payload_length;
+ data_length += datum_length;
+ ++chunk_count;
+ }
+
+ arg.packets = (__u64)(state->data + data_offset);
+ arg.size = data_length;
+ arg.data = (__u64)(state->addr + buf_offset);
+ arg.handle = state->handle;
+ if (ioctl(state->fd, FW_CDEV_IOC_QUEUE_ISO, &arg) < 0) {
+ generate_syscall_error(error, errno, "ioctl(%s)", "FW_CDEV_IOC_QUEUE_ISO");
+ return FALSE;
+ }
+
+ g_debug("%3d: %3d-%3d/%3d: %6d-%6d/%6d",
+ chunk_count,
+ data_offset, data_offset + data_length,
+ state->alloc_data_length,
+ buf_offset, buf_offset + buf_length,
+ bytes_per_buffer);
+
+ buf_offset += buf_length;
+ buf_offset %= bytes_per_buffer;
+
+ data_offset += data_length;
+ }
+
+ g_warn_if_fail(chunk_count == state->registered_chunk_count);
+
+ state->curr_offset = buf_offset;
+
+ state->data_length = 0;
+ state->registered_chunk_count = 0;
+
+ return TRUE;
+}
diff --git a/src/fw_iso_ctx_private.h b/src/fw_iso_ctx_private.h
index e8203fb..afb387a 100644
--- a/src/fw_iso_ctx_private.h
+++ b/src/fw_iso_ctx_private.h
@@ -57,6 +57,7 @@ gboolean fw_iso_ctx_state_register_chunk(struct fw_iso_ctx_state *state, gboolea
const guint8 *header, guint header_length,
guint payload_length, gboolean schedule_interrupt,
GError **error);
+gboolean fw_iso_ctx_state_queue_chunks(struct fw_iso_ctx_state *state, GError **error);
void hinoko_fw_iso_ctx_allocate(HinokoFwIsoCtx *self, const char *path,
HinokoFwIsoCtxMode mode, HinokoFwScode scode,