KUNIT_EXPECT_EQ(test, 20, offsetof(struct fw_cdev_event_response, data));
 }
 
+// Added at v6.5.
+static void structure_layout_event_request3(struct kunit *test)
+{
+       KUNIT_EXPECT_EQ(test, 56, sizeof(struct fw_cdev_event_request3));
+
+       KUNIT_EXPECT_EQ(test, 0, offsetof(struct fw_cdev_event_request3, closure));
+       KUNIT_EXPECT_EQ(test, 8, offsetof(struct fw_cdev_event_request3, type));
+       KUNIT_EXPECT_EQ(test, 12, offsetof(struct fw_cdev_event_request3, tcode));
+       KUNIT_EXPECT_EQ(test, 16, offsetof(struct fw_cdev_event_request3, offset));
+       KUNIT_EXPECT_EQ(test, 24, offsetof(struct fw_cdev_event_request3, source_node_id));
+       KUNIT_EXPECT_EQ(test, 28, offsetof(struct fw_cdev_event_request3, destination_node_id));
+       KUNIT_EXPECT_EQ(test, 32, offsetof(struct fw_cdev_event_request3, card));
+       KUNIT_EXPECT_EQ(test, 36, offsetof(struct fw_cdev_event_request3, generation));
+       KUNIT_EXPECT_EQ(test, 40, offsetof(struct fw_cdev_event_request3, handle));
+       KUNIT_EXPECT_EQ(test, 44, offsetof(struct fw_cdev_event_request3, length));
+       KUNIT_EXPECT_EQ(test, 48, offsetof(struct fw_cdev_event_request3, tstamp));
+       KUNIT_EXPECT_EQ(test, 56, offsetof(struct fw_cdev_event_request3, data));
+}
+
 static struct kunit_case structure_layout_test_cases[] = {
        KUNIT_CASE(structure_layout_event_response),
+       KUNIT_CASE(structure_layout_event_request3),
        {}
 };
 
 
 #define FW_CDEV_EVENT_PHY_PACKET_RECEIVED              0x08
 #define FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL       0x09
 
+/* available since kernel version 6.5 */
+#define FW_CDEV_EVENT_REQUEST3                         0x0a
+
 /**
  * struct fw_cdev_event_common - Common part of all fw_cdev_event_* types
  * @closure:   For arbitrary use by userspace
  * @length:    Data length, i.e. the request's payload size in bytes
  * @data:      Incoming data, if any
  *
+ * This event is sent instead of &fw_cdev_event_request3 if the kernel or the client implements
+ * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_request3.
+ */
+struct fw_cdev_event_request2 {
+       __u64 closure;
+       __u32 type;
+       __u32 tcode;
+       __u64 offset;
+       __u32 source_node_id;
+       __u32 destination_node_id;
+       __u32 card;
+       __u32 generation;
+       __u32 handle;
+       __u32 length;
+       __u32 data[];
+};
+
+/**
+ * struct fw_cdev_event_request3 - Sent on incoming request to an address region
+ * @closure:   See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
+ * @type:      See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2
+ * @tcode:     Transaction code of the incoming request
+ * @offset:    The offset into the 48-bit per-node address space
+ * @source_node_id: Sender node ID
+ * @destination_node_id: Destination node ID
+ * @card:      The index of the card from which the request came
+ * @generation:        Bus generation in which the request is valid
+ * @handle:    Reference to the kernel-side pending request
+ * @length:    Data length, i.e. the request's payload size in bytes
+ * @tstamp:    The time stamp of isochronous cycle at which the request arrived.
+ * @data:      Incoming data, if any
+ *
  * This event is sent when the stack receives an incoming request to an address
  * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
  * guaranteed to be completely contained in the specified region.  Userspace is
  * sent.
  *
  * If the client subsequently needs to initiate requests to the sender node of
- * an &fw_cdev_event_request2, it needs to use a device file with matching
+ * an &fw_cdev_event_request3, it needs to use a device file with matching
  * card index, node ID, and generation for outbound requests.
+ *
+ * @tstamp is isochronous cycle at which the request arrived. It is 16 bit integer value and the
+ * higher 3 bits expresses three low order bits of second field in the format of CYCLE_TIME
+ * register and the rest 13 bits expresses cycle field.
  */
-struct fw_cdev_event_request2 {
+struct fw_cdev_event_request3 {
        __u64 closure;
        __u32 type;
        __u32 tcode;
        __u32 generation;
        __u32 handle;
        __u32 length;
+       __u32 tstamp;
+       /*
+        * Padding to keep the size of structure as multiples of 8 in various architectures since
+        * 4 byte alignment is used for 8 byte of object type in System V ABI for i386 architecture.
+        */
+       __u32 padding;
        __u32 data[];
 };
 
  *                             %FW_CDEV_EVENT_PHY_PACKET_SENT or
  *                             %FW_CDEV_EVENT_PHY_PACKET_RECEIVED
  *
+ * @request3:          Valid if @common.type == %FW_CDEV_EVENT_REQUEST3
+ *
  * Convenience union for userspace use.  Events could be read(2) into an
  * appropriately aligned char buffer and then cast to this union for further
  * processing.  Note that for a request, response or iso_interrupt event,
        struct fw_cdev_event_iso_interrupt_mc   iso_interrupt_mc;       /* added in 2.6.36 */
        struct fw_cdev_event_iso_resource       iso_resource;           /* added in 2.6.30 */
        struct fw_cdev_event_phy_packet         phy_packet;             /* added in 2.6.36 */
+       struct fw_cdev_event_request3           request3;               /* added in 6.5 */
 };
 
 /* available since kernel version 2.6.22 */
  *                 avoid dropping data
  *               - added %FW_CDEV_IOC_FLUSH_ISO
  *  6  (6.5)     - added some event for subactions of asynchronous transaction with time stamp
+ *                   - %FW_CDEV_EVENT_REQUEST3
  */
 
 /**