aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2022-05-08 15:33:32 +0900
committer坂本 貴史 <o-takashi@sakamocchi.jp>2022-05-08 15:36:32 +0900
commit69e521f3dccad945baaa0ce1c8b11fef5c456124 (patch)
treef31d906bd6735e9e152650f2786de6d9822d4aaf
parent5bd9aac7914af335eeb9ff5cc52b3cf5d857c3a5 (diff)
downloadlibhinoko-69e521f3dccad945baaa0ce1c8b11fef5c456124.tar.gz
fw_iso_ctx_private: add helper function for control of isoc packet
Linux FireWire subsystem forces userspace application to compute control field of fw_cdev_iso_packet structure before system call. This commit adds helper function for the purpose. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-rw-r--r--src/fw_iso_ctx_private.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/fw_iso_ctx_private.c b/src/fw_iso_ctx_private.c
index dde99a8..0a8bfc1 100644
--- a/src/fw_iso_ctx_private.c
+++ b/src/fw_iso_ctx_private.c
@@ -343,6 +343,21 @@ gboolean fw_iso_ctx_state_register_chunk(struct fw_iso_ctx_state *state, gboolea
return TRUE;
}
+#define FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_MASK 0xff000000
+#define FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_SHIFT 24
+#define FW_CDEV_ISO_PACKET_CONTROL_PAYLOAD_MASK 0x0000ffff
+
+static guint fw_cdev_iso_packet_control_to_header_length(guint control)
+{
+ return (control & FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_MASK) >>
+ FW_CDEV_ISO_PACKET_CONTROL_HEADER_LENGTH_SHIFT;
+}
+
+static guint fw_cdev_iso_packet_control_to_payload_length(guint control)
+{
+ return (control & FW_CDEV_ISO_PACKET_CONTROL_PAYLOAD_MASK);
+}
+
/**
* fw_iso_ctx_state_queue_chunks:
* @state: A [struct@FwIsoCtxState].
@@ -374,8 +389,8 @@ gboolean fw_iso_ctx_state_queue_chunks(struct fw_iso_ctx_state *state, GError **
datum = (struct fw_cdev_iso_packet *)
(state->data + data_offset + data_length);
- payload_length = datum->control & 0x0000ffff;
- header_length = (datum->control & 0xff000000) >> 24;
+ payload_length = fw_cdev_iso_packet_control_to_payload_length(datum->control);
+ header_length = fw_cdev_iso_packet_control_to_header_length(datum->control);
if (buf_offset + buf_length + payload_length >
bytes_per_buffer) {