History

firewire: cdev: add new event to notify response subaction with time stamp

This commit adds new event to notify event of response subaction with time stamp field. Current compiler implementation of System V ABI selects one of structure members which has the maximum alignment size in the structure to decide the size of structure. In the case of fw_cdev_event_request3 structure, it is closure member which has 8 byte storage. The size of alignment for the type of 8 byte storage differs depending on architectures; 4 byte for i386 architecture and 8 byte for the others including x32 architecture. It is inconvenient to device driver developer to use structure layout which varies between architectures since the developer takes care of ioctl compat layer. This commit adds 32 bit member for padding to keep the size of structure as multiples of 8.

Takashi Sakamoto committed 3 years ago

Commit fc2b52c1 parent 147e9d32 files · +64 −10Browse files

Showing the changes to include/uapi/linux/firewire-cdev.h (1 of 2 files). Show all

Unified · Split

include/uapi/linux/firewire-cdev.h+49−10
@@ -48,6 +48,7 @@ · 47 unmodified lines
48 48
49/* available since kernel version 6.5 */49/* available since kernel version 6.5 */
50#define FW_CDEV_EVENT_REQUEST3 0x0a50#define FW_CDEV_EVENT_REQUEST3 0x0a
51#define FW_CDEV_EVENT_RESPONSE2 0x0b
51 52
52/**53/**
53 * struct fw_cdev_event_common - Common part of all fw_cdev_event_* types54 * struct fw_cdev_event_common - Common part of all fw_cdev_event_* types
@@ -106,6 +107,29 @@ struct fw_cdev_event_bus_reset { · 52 unmodified lines
106 * @length: Data length, i.e. the response's payload size in bytes107 * @length: Data length, i.e. the response's payload size in bytes
107 * @data: Payload data, if any108 * @data: Payload data, if any
108 *109 *
110 * This event is sent instead of &fw_cdev_event_response if the kernel or the client implements
111 * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_response2.
112 */
113struct fw_cdev_event_response {
114 __u64 closure;
115 __u32 type;
116 __u32 rcode;
117 __u32 length;
118 __u32 data[];
119};
120
121/**
122 * struct fw_cdev_event_response2 - Sent when a response packet was received
123 * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST
124 * or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST
125 * or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl
126 * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
127 * @rcode: Response code returned by the remote node
128 * @length: Data length, i.e. the response's payload size in bytes
129 * @request_tstamp: The time stamp of isochronous cycle at which the request was sent.
130 * @response_tstamp: The time stamp of isochronous cycle at which the response was sent.
131 * @data: Payload data, if any
132 *
109 * This event is sent when the stack receives a response to an outgoing request133 * This event is sent when the stack receives a response to an outgoing request
110 * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl. The payload data for responses134 * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl. The payload data for responses
111 * carrying data (read and lock responses) follows immediately and can be135 * carrying data (read and lock responses) follows immediately and can be
@@ -115,12 +139,25 @@ struct fw_cdev_event_bus_reset { · 3 unmodified lines
115 * involve response packets. This includes unified write transactions,139 * involve response packets. This includes unified write transactions,
116 * broadcast write transactions, and transmission of asynchronous stream140 * broadcast write transactions, and transmission of asynchronous stream
117 * packets. @rcode indicates success or failure of such transmissions.141 * packets. @rcode indicates success or failure of such transmissions.
142 *
143 * The value of @request_tstamp expresses the isochronous cycle at which the request was sent to
144 * initiate the transaction. The value of @response_tstamp expresses the isochronous cycle at which
145 * the response arrived to complete the transaction. Each value is unsigned 16 bit integer
146 * containing three low order bits of second field and all 13 bits of cycle field in format of
147 * CYCLE_TIMER register.
118 */148 */
119struct fw_cdev_event_response {149struct fw_cdev_event_response2 {
120 __u64 closure;150 __u64 closure;
121 __u32 type;151 __u32 type;
122 __u32 rcode;152 __u32 rcode;
123 __u32 length;153 __u32 length;
154 __u32 request_tstamp;
155 __u32 response_tstamp;
156 /*
157 * Padding to keep the size of structure as multiples of 8 in various architectures since
158 * 4 byte alignment is used for 8 byte of object type in System V ABI for i386 architecture.
159 */
160 __u32 padding;
124 __u32 data[];161 __u32 data[];
125};162};
126 163
@@ -421,6 +458,7 @@ struct fw_cdev_event_phy_packet { · 294 unmodified lines
421 * %FW_CDEV_EVENT_PHY_PACKET_RECEIVED458 * %FW_CDEV_EVENT_PHY_PACKET_RECEIVED
422 *459 *
423 * @request3: Valid if @common.type == %FW_CDEV_EVENT_REQUEST3460 * @request3: Valid if @common.type == %FW_CDEV_EVENT_REQUEST3
461 * @response2: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE2
424 *462 *
425 * Convenience union for userspace use. Events could be read(2) into an463 * Convenience union for userspace use. Events could be read(2) into an
426 * appropriately aligned char buffer and then cast to this union for further464 * appropriately aligned char buffer and then cast to this union for further
@@ -441,6 +479,7 @@ union fw_cdev_event { · 14 unmodified lines
441 struct fw_cdev_event_iso_resource iso_resource; /* added in 2.6.30 */479 struct fw_cdev_event_iso_resource iso_resource; /* added in 2.6.30 */
442 struct fw_cdev_event_phy_packet phy_packet; /* added in 2.6.36 */480 struct fw_cdev_event_phy_packet phy_packet; /* added in 2.6.36 */
443 struct fw_cdev_event_request3 request3; /* added in 6.5 */481 struct fw_cdev_event_request3 request3; /* added in 6.5 */
482 struct fw_cdev_event_response2 response2; /* added in 6.5 */
444};483};
445 484
446/* available since kernel version 2.6.22 */485/* available since kernel version 2.6.22 */
@@ -507,6 +546,7 @@ union fw_cdev_event { · 60 unmodified lines
507 * - added %FW_CDEV_IOC_FLUSH_ISO546 * - added %FW_CDEV_IOC_FLUSH_ISO
508 * 6 (6.5) - added some event for subactions of asynchronous transaction with time stamp547 * 6 (6.5) - added some event for subactions of asynchronous transaction with time stamp
509 * - %FW_CDEV_EVENT_REQUEST3548 * - %FW_CDEV_EVENT_REQUEST3
549 * - %FW_CDEV_EVENT_RESPONSE2
510 */550 */
511 551
512/**552/**
@@ -552,11 +592,11 @@ struct fw_cdev_get_info { · 39 unmodified lines
552 * @data: Userspace pointer to payload592 * @data: Userspace pointer to payload
553 * @generation: The bus generation where packet is valid593 * @generation: The bus generation where packet is valid
554 *594 *
555 * Send a request to the device. This ioctl implements all outgoing requests.595 * Send a request to the device. This ioctl implements all outgoing requests. Both quadlet and
556 * Both quadlet and block request specify the payload as a pointer to the data596 * block request specify the payload as a pointer to the data in the @data field. Once the
557 * in the @data field. Once the transaction completes, the kernel writes an597 * transaction completes, the kernel writes either &fw_cdev_event_response event or
558 * &fw_cdev_event_response event back. The @closure field is passed back to598 * &fw_cdev_event_response event back. The @closure field is passed back to user space in the
559 * user space in the response event.599 * response event.
560 */600 */
561struct fw_cdev_send_request {601struct fw_cdev_send_request {
562 __u32 tcode;602 __u32 tcode;
@@ -1039,10 +1079,9 @@ struct fw_cdev_allocate_iso_resource { · 476 unmodified lines
1039 * @generation: The bus generation where packet is valid1079 * @generation: The bus generation where packet is valid
1040 * @speed: Speed to transmit at1080 * @speed: Speed to transmit at
1041 *1081 *
1042 * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet1082 * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet to every device
1043 * to every device which is listening to the specified channel. The kernel1083 * which is listening to the specified channel. The kernel writes either &fw_cdev_event_response
1044 * writes an &fw_cdev_event_response event which indicates success or failure of1084 * event or &fw_cdev_event_response2 event which indicates success or failure of the transmission.
1045 * the transmission.
1046 */1085 */
1047struct fw_cdev_send_stream_packet {1086struct fw_cdev_send_stream_packet {
1048 __u32 length;1087 __u32 length;