master
   1/*
   2 * Char device interface.
   3 *
   4 * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net>
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the "Software"),
   8 * to deal in the Software without restriction, including without limitation
   9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10 * and/or sell copies of the Software, and to permit persons to whom the
  11 * Software is furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice (including the next
  14 * paragraph) shall be included in all copies or substantial portions of the
  15 * Software.
  16 *
  17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  23 * DEALINGS IN THE SOFTWARE.
  24 */
  25
  26#ifndef _LINUX_FIREWIRE_CDEV_H
  27#define _LINUX_FIREWIRE_CDEV_H
  28
  29#include <linux/ioctl.h>
  30#include <linux/types.h>
  31#include <linux/firewire-constants.h>
  32
  33/* available since kernel version 2.6.22 */
  34#define FW_CDEV_EVENT_BUS_RESET				0x00
  35#define FW_CDEV_EVENT_RESPONSE				0x01
  36#define FW_CDEV_EVENT_REQUEST				0x02
  37#define FW_CDEV_EVENT_ISO_INTERRUPT			0x03
  38
  39/* available since kernel version 2.6.30 */
  40#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED		0x04
  41#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED		0x05
  42
  43/* available since kernel version 2.6.36 */
  44#define FW_CDEV_EVENT_REQUEST2				0x06
  45#define FW_CDEV_EVENT_PHY_PACKET_SENT			0x07
  46#define FW_CDEV_EVENT_PHY_PACKET_RECEIVED		0x08
  47#define FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL	0x09
  48
  49/* available since kernel version 6.5 */
  50#define FW_CDEV_EVENT_REQUEST3				0x0a
  51#define FW_CDEV_EVENT_RESPONSE2				0x0b
  52#define FW_CDEV_EVENT_PHY_PACKET_SENT2			0x0c
  53#define FW_CDEV_EVENT_PHY_PACKET_RECEIVED2		0x0d
  54
  55/**
  56 * struct fw_cdev_event_common - Common part of all fw_cdev_event_* types
  57 * @closure:	For arbitrary use by userspace
  58 * @type:	Discriminates the fw_cdev_event_* types
  59 *
  60 * This struct may be used to access generic members of all fw_cdev_event_*
  61 * types regardless of the specific type.
  62 *
  63 * Data passed in the @closure field for a request will be returned in the
  64 * corresponding event.  It is big enough to hold a pointer on all platforms.
  65 * The ioctl used to set @closure depends on the @type of event.
  66 */
  67struct fw_cdev_event_common {
  68	__u64 closure;
  69	__u32 type;
  70};
  71
  72/**
  73 * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred
  74 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl
  75 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET
  76 * @node_id:       New node ID of this node
  77 * @local_node_id: Node ID of the local node, i.e. of the controller
  78 * @bm_node_id:    Node ID of the bus manager
  79 * @irm_node_id:   Node ID of the iso resource manager
  80 * @root_node_id:  Node ID of the root node
  81 * @generation:    New bus generation
  82 *
  83 * This event is sent when the bus the device belongs to goes through a bus
  84 * reset.  It provides information about the new bus configuration, such as
  85 * new node ID for this device, new root ID, and others.
  86 *
  87 * If @bm_node_id is 0xffff right after bus reset it can be reread by an
  88 * %FW_CDEV_IOC_GET_INFO ioctl after bus manager selection was finished.
  89 * Kernels with ABI version < 4 do not set @bm_node_id.
  90 */
  91struct fw_cdev_event_bus_reset {
  92	__u64 closure;
  93	__u32 type;
  94	__u32 node_id;
  95	__u32 local_node_id;
  96	__u32 bm_node_id;
  97	__u32 irm_node_id;
  98	__u32 root_node_id;
  99	__u32 generation;
 100};
 101
 102/**
 103 * struct fw_cdev_event_response - Sent when a response packet was received
 104 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST
 105 *		or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST
 106 *		or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl
 107 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
 108 * @rcode:	Response code returned by the remote node
 109 * @length:	Data length, i.e. the response's payload size in bytes
 110 * @data:	Payload data, if any
 111 *
 112 * This event is sent instead of &fw_cdev_event_response if the kernel or the client implements
 113 * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_response2.
 114 */
 115struct fw_cdev_event_response {
 116	__u64 closure;
 117	__u32 type;
 118	__u32 rcode;
 119	__u32 length;
 120	__u32 data[];
 121};
 122
 123/**
 124 * struct fw_cdev_event_response2 - Sent when a response packet was received
 125 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST
 126 *		or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST
 127 *		or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl
 128 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
 129 * @rcode:	Response code returned by the remote node
 130 * @length:	Data length, i.e. the response's payload size in bytes
 131 * @request_tstamp:	The time stamp of isochronous cycle at which the request was sent.
 132 * @response_tstamp:	The time stamp of isochronous cycle at which the response was sent.
 133 * @padding:	Padding to keep the size of structure as multiples of 8 in various architectures
 134 *		since 4 byte alignment is used for 8 byte of object type in System V ABI for i386
 135 *		architecture.
 136 * @data:	Payload data, if any
 137 *
 138 * This event is sent when the stack receives a response to an outgoing request
 139 * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses
 140 * carrying data (read and lock responses) follows immediately and can be
 141 * accessed through the @data field.
 142 *
 143 * The event is also generated after conclusions of transactions that do not
 144 * involve response packets.  This includes unified write transactions,
 145 * broadcast write transactions, and transmission of asynchronous stream
 146 * packets.  @rcode indicates success or failure of such transmissions.
 147 *
 148 * The value of @request_tstamp expresses the isochronous cycle at which the request was sent to
 149 * initiate the transaction. The value of @response_tstamp expresses the isochronous cycle at which
 150 * the response arrived to complete the transaction. Each value is unsigned 16 bit integer
 151 * containing three low order bits of second field and all 13 bits of cycle field in format of
 152 * CYCLE_TIMER register.
 153 */
 154struct fw_cdev_event_response2 {
 155	__u64 closure;
 156	__u32 type;
 157	__u32 rcode;
 158	__u32 length;
 159	__u32 request_tstamp;
 160	__u32 response_tstamp;
 161	__u32 padding;
 162	__u32 data[];
 163};
 164
 165/**
 166 * struct fw_cdev_event_request - Old version of &fw_cdev_event_request2
 167 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
 168 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST
 169 * @tcode:	Transaction code of the incoming request
 170 * @offset:	The offset into the 48-bit per-node address space
 171 * @handle:	Reference to the kernel-side pending request
 172 * @length:	Data length, i.e. the request's payload size in bytes
 173 * @data:	Incoming data, if any
 174 *
 175 * This event is sent instead of &fw_cdev_event_request2 if the kernel or
 176 * the client implements ABI version <= 3.  &fw_cdev_event_request lacks
 177 * essential information; use &fw_cdev_event_request2 instead.
 178 */
 179struct fw_cdev_event_request {
 180	__u64 closure;
 181	__u32 type;
 182	__u32 tcode;
 183	__u64 offset;
 184	__u32 handle;
 185	__u32 length;
 186	__u32 data[];
 187};
 188
 189/**
 190 * struct fw_cdev_event_request2 - Sent on incoming request to an address region
 191 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
 192 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2
 193 * @tcode:	Transaction code of the incoming request
 194 * @offset:	The offset into the 48-bit per-node address space
 195 * @source_node_id: Sender node ID
 196 * @destination_node_id: Destination node ID
 197 * @card:	The index of the card from which the request came
 198 * @generation:	Bus generation in which the request is valid
 199 * @handle:	Reference to the kernel-side pending request
 200 * @length:	Data length, i.e. the request's payload size in bytes
 201 * @data:	Incoming data, if any
 202 *
 203 * This event is sent instead of &fw_cdev_event_request3 if the kernel or the client implements
 204 * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_request3.
 205 */
 206struct fw_cdev_event_request2 {
 207	__u64 closure;
 208	__u32 type;
 209	__u32 tcode;
 210	__u64 offset;
 211	__u32 source_node_id;
 212	__u32 destination_node_id;
 213	__u32 card;
 214	__u32 generation;
 215	__u32 handle;
 216	__u32 length;
 217	__u32 data[];
 218};
 219
 220/**
 221 * struct fw_cdev_event_request3 - Sent on incoming request to an address region
 222 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
 223 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2
 224 * @tcode:	Transaction code of the incoming request
 225 * @offset:	The offset into the 48-bit per-node address space
 226 * @source_node_id: Sender node ID
 227 * @destination_node_id: Destination node ID
 228 * @card:	The index of the card from which the request came
 229 * @generation:	Bus generation in which the request is valid
 230 * @handle:	Reference to the kernel-side pending request
 231 * @length:	Data length, i.e. the request's payload size in bytes
 232 * @tstamp:	The time stamp of isochronous cycle at which the request arrived.
 233 * @padding:	Padding to keep the size of structure as multiples of 8 in various architectures
 234 *		since 4 byte alignment is used for 8 byte of object type in System V ABI for i386
 235 *		architecture.
 236 * @data:	Incoming data, if any
 237 *
 238 * This event is sent when the stack receives an incoming request to an address
 239 * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
 240 * guaranteed to be completely contained in the specified region.  Userspace is
 241 * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl,
 242 * using the same @handle.
 243 *
 244 * The payload data for requests carrying data (write and lock requests)
 245 * follows immediately and can be accessed through the @data field.
 246 *
 247 * Unlike &fw_cdev_event_request, @tcode of lock requests is one of the
 248 * firewire-core specific %TCODE_LOCK_MASK_SWAP...%TCODE_LOCK_VENDOR_DEPENDENT,
 249 * i.e. encodes the extended transaction code.
 250 *
 251 * @card may differ from &fw_cdev_get_info.card because requests are received
 252 * from all cards of the Linux host.  @source_node_id, @destination_node_id, and
 253 * @generation pertain to that card.  Destination node ID and bus generation may
 254 * therefore differ from the corresponding fields of the last
 255 * &fw_cdev_event_bus_reset.
 256 *
 257 * @destination_node_id may also differ from the current node ID because of a
 258 * non-local bus ID part or in case of a broadcast write request.  Note, a
 259 * client must call an %FW_CDEV_IOC_SEND_RESPONSE ioctl even in case of a
 260 * broadcast write request; the kernel will then release the kernel-side pending
 261 * request but will not actually send a response packet.
 262 *
 263 * In case of a write request to FCP_REQUEST or FCP_RESPONSE, the kernel already
 264 * sent a write response immediately after the request was received; in this
 265 * case the client must still call an %FW_CDEV_IOC_SEND_RESPONSE ioctl to
 266 * release the kernel-side pending request, though another response won't be
 267 * sent.
 268 *
 269 * If the client subsequently needs to initiate requests to the sender node of
 270 * an &fw_cdev_event_request3, it needs to use a device file with matching
 271 * card index, node ID, and generation for outbound requests.
 272 *
 273 * @tstamp is isochronous cycle at which the request arrived. It is 16 bit integer value and the
 274 * higher 3 bits expresses three low order bits of second field in the format of CYCLE_TIME
 275 * register and the rest 13 bits expresses cycle field.
 276 */
 277struct fw_cdev_event_request3 {
 278	__u64 closure;
 279	__u32 type;
 280	__u32 tcode;
 281	__u64 offset;
 282	__u32 source_node_id;
 283	__u32 destination_node_id;
 284	__u32 card;
 285	__u32 generation;
 286	__u32 handle;
 287	__u32 length;
 288	__u32 tstamp;
 289	__u32 padding;
 290	__u32 data[];
 291};
 292
 293/**
 294 * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed
 295 * @closure:	See &fw_cdev_event_common;
 296 *		set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
 297 * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
 298 * @cycle:	Cycle counter of the last completed packet
 299 * @header_length: Total length of following headers, in bytes
 300 * @header:	Stripped headers, if any
 301 *
 302 * This event is sent when the controller has completed an &fw_cdev_iso_packet
 303 * with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with
 304 * %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets
 305 * without the interrupt bit set that the kernel's internal buffer for @header
 306 * is about to overflow.  (In the last case, ABI versions < 5 drop header data
 307 * up to the next interrupt packet.)
 308 *
 309 * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT):
 310 *
 311 * In version 3 and some implementations of version 2 of the ABI, &header_length
 312 * is a multiple of 4 and &header contains timestamps of all packets up until
 313 * the interrupt packet.  The format of the timestamps is as described below for
 314 * isochronous reception.  In version 1 of the ABI, &header_length was 0.
 315 *
 316 * Isochronous receive events (context type %FW_CDEV_ISO_CONTEXT_RECEIVE):
 317 *
 318 * The headers stripped of all packets up until and including the interrupt
 319 * packet are returned in the @header field.  The amount of header data per
 320 * packet is as specified at iso context creation by
 321 * &fw_cdev_create_iso_context.header_size.
 322 *
 323 * Hence, _interrupt.header_length / _context.header_size is the number of
 324 * packets received in this interrupt event.  The client can now iterate
 325 * through the mmap()'ed DMA buffer according to this number of packets and
 326 * to the buffer sizes as the client specified in &fw_cdev_queue_iso.
 327 *
 328 * Since version 2 of this ABI, the portion for each packet in _interrupt.header
 329 * consists of the 1394 isochronous packet header, followed by a timestamp
 330 * quadlet if &fw_cdev_create_iso_context.header_size > 4, followed by quadlets
 331 * from the packet payload if &fw_cdev_create_iso_context.header_size > 8.
 332 *
 333 * Format of 1394 iso packet header:  16 bits data_length, 2 bits tag, 6 bits
 334 * channel, 4 bits tcode, 4 bits sy, in big endian byte order.
 335 * data_length is the actual received size of the packet without the four
 336 * 1394 iso packet header bytes.
 337 *
 338 * Format of timestamp:  16 bits invalid, 3 bits cycleSeconds, 13 bits
 339 * cycleCount, in big endian byte order.
 340 *
 341 * In version 1 of the ABI, no timestamp quadlet was inserted; instead, payload
 342 * data followed directly after the 1394 is header if header_size > 4.
 343 * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2.
 344 */
 345struct fw_cdev_event_iso_interrupt {
 346	__u64 closure;
 347	__u32 type;
 348	__u32 cycle;
 349	__u32 header_length;
 350	__u32 header[];
 351};
 352
 353/**
 354 * struct fw_cdev_event_iso_interrupt_mc - An iso buffer chunk was completed
 355 * @closure:	See &fw_cdev_event_common;
 356 *		set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
 357 * @type:	%FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL
 358 * @completed:	Offset into the receive buffer; data before this offset is valid
 359 *
 360 * This event is sent in multichannel contexts (context type
 361 * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL) for &fw_cdev_iso_packet buffer
 362 * chunks that have been completely filled and that have the
 363 * %FW_CDEV_ISO_INTERRUPT bit set, or when explicitly requested with
 364 * %FW_CDEV_IOC_FLUSH_ISO.
 365 *
 366 * The buffer is continuously filled with the following data, per packet:
 367 *  - the 1394 iso packet header as described at &fw_cdev_event_iso_interrupt,
 368 *    but in little endian byte order,
 369 *  - packet payload (as many bytes as specified in the data_length field of
 370 *    the 1394 iso packet header) in big endian byte order,
 371 *  - 0...3 padding bytes as needed to align the following trailer quadlet,
 372 *  - trailer quadlet, containing the reception timestamp as described at
 373 *    &fw_cdev_event_iso_interrupt, but in little endian byte order.
 374 *
 375 * Hence the per-packet size is data_length (rounded up to a multiple of 4) + 8.
 376 * When processing the data, stop before a packet that would cross the
 377 * @completed offset.
 378 *
 379 * A packet near the end of a buffer chunk will typically spill over into the
 380 * next queued buffer chunk.  It is the responsibility of the client to check
 381 * for this condition, assemble a broken-up packet from its parts, and not to
 382 * re-queue any buffer chunks in which as yet unread packet parts reside.
 383 */
 384struct fw_cdev_event_iso_interrupt_mc {
 385	__u64 closure;
 386	__u32 type;
 387	__u32 completed;
 388};
 389
 390/**
 391 * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed
 392 * @closure:	See &fw_cdev_event_common;
 393 *		set by``FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE)`` ioctl
 394 * @type:	%FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
 395 *		%FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
 396 * @handle:	Reference by which an allocated resource can be deallocated
 397 * @channel:	Isochronous channel which was (de)allocated, if any
 398 * @bandwidth:	Bandwidth allocation units which were (de)allocated, if any
 399 *
 400 * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous
 401 * resource was allocated at the IRM.  The client has to check @channel and
 402 * @bandwidth for whether the allocation actually succeeded.
 403 *
 404 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous
 405 * resource was deallocated at the IRM.  It is also sent when automatic
 406 * reallocation after a bus reset failed.
 407 *
 408 * @channel is <0 if no channel was (de)allocated or if reallocation failed.
 409 * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed.
 410 */
 411struct fw_cdev_event_iso_resource {
 412	__u64 closure;
 413	__u32 type;
 414	__u32 handle;
 415	__s32 channel;
 416	__s32 bandwidth;
 417};
 418
 419/**
 420 * struct fw_cdev_event_phy_packet - A PHY packet was transmitted or received
 421 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET
 422 *		or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl
 423 * @type:	%FW_CDEV_EVENT_PHY_PACKET_SENT or %..._RECEIVED
 424 * @rcode:	%RCODE_..., indicates success or failure of transmission
 425 * @length:	Data length in bytes
 426 * @data:	Incoming data for %FW_CDEV_IOC_RECEIVE_PHY_PACKETS. For %FW_CDEV_IOC_SEND_PHY_PACKET
 427 *		the field has the same data in the request, thus the length of 8 bytes.
 428 *
 429 * This event is sent instead of &fw_cdev_event_phy_packet2 if the kernel or
 430 * the client implements ABI version <= 5. It has the lack of time stamp field comparing to
 431 * &fw_cdev_event_phy_packet2.
 432 */
 433struct fw_cdev_event_phy_packet {
 434	__u64 closure;
 435	__u32 type;
 436	__u32 rcode;
 437	__u32 length;
 438	__u32 data[];
 439};
 440
 441/**
 442 * struct fw_cdev_event_phy_packet2 - A PHY packet was transmitted or received with time stamp.
 443 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET
 444 *		or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl
 445 * @type:	%FW_CDEV_EVENT_PHY_PACKET_SENT2 or %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2
 446 * @rcode:	%RCODE_..., indicates success or failure of transmission
 447 * @length:	Data length in bytes
 448 * @tstamp:	For %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, the time stamp of isochronous cycle at
 449 *		which the packet arrived. For %FW_CDEV_EVENT_PHY_PACKET_SENT2 and non-ping packet,
 450 *		the time stamp of isochronous cycle at which the packet was sent. For ping packet,
 451 *		the tick count for round-trip time measured by 1394 OHCI controller.
 452 *
 453 *		The time stamp of isochronous cycle at which either the response was sent for
 454 *		%FW_CDEV_EVENT_PHY_PACKET_SENT2 or the request arrived for
 455 *		%FW_CDEV_EVENT_PHY_PACKET_RECEIVED2.
 456 * @data:	Incoming data
 457 *
 458 * If @type is %FW_CDEV_EVENT_PHY_PACKET_SENT2, @length is 8 and @data consists of the two PHY
 459 * packet quadlets to be sent, in host byte order,
 460 *
 461 * If @type is %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, @length is 8 and @data consists of the two PHY
 462 * packet quadlets, in host byte order.
 463 *
 464 * For %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, the @tstamp is the isochronous cycle at which the
 465 * packet arrived. It is 16 bit integer value and the higher 3 bits expresses three low order bits
 466 * of second field and the rest 13 bits expresses cycle field in the format of CYCLE_TIME register.
 467 *
 468 * For %FW_CDEV_EVENT_PHY_PACKET_SENT2, the @tstamp has different meanings whether to sent the
 469 * packet for ping or not. If it's not for ping, the @tstamp is the isochronous cycle at which the
 470 * packet was sent, and use the same format as the case of %FW_CDEV_EVENT_PHY_PACKET_SENT2. If it's
 471 * for ping, the @tstamp is for round-trip time measured by 1394 OHCI controller with 42.195 MHz
 472 * resolution.
 473 */
 474struct fw_cdev_event_phy_packet2 {
 475	__u64 closure;
 476	__u32 type;
 477	__u32 rcode;
 478	__u32 length;
 479	__u32 tstamp;
 480	__u32 data[];
 481};
 482
 483/**
 484 * union fw_cdev_event - Convenience union of fw_cdev_event_* types
 485 * @common:		Valid for all types
 486 * @bus_reset:		Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
 487 * @response:		Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
 488 * @request:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST
 489 * @request2:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST2
 490 * @iso_interrupt:	Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
 491 * @iso_interrupt_mc:	Valid if @common.type ==
 492 *				%FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL
 493 * @iso_resource:	Valid if @common.type ==
 494 *				%FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
 495 *				%FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
 496 * @phy_packet:		Valid if @common.type ==
 497 *				%FW_CDEV_EVENT_PHY_PACKET_SENT or
 498 *				%FW_CDEV_EVENT_PHY_PACKET_RECEIVED
 499 *
 500 * @request3:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST3
 501 * @response2:		Valid if @common.type == %FW_CDEV_EVENT_RESPONSE2
 502 * @phy_packet2:	Valid if @common.type == %FW_CDEV_EVENT_PHY_PACKET_SENT2 or
 503 *				%FW_CDEV_EVENT_PHY_PACKET_RECEIVED2
 504 *
 505 * Convenience union for userspace use.  Events could be read(2) into an
 506 * appropriately aligned char buffer and then cast to this union for further
 507 * processing.  Note that for a request, response or iso_interrupt event,
 508 * the data[] or header[] may make the size of the full event larger than
 509 * sizeof(union fw_cdev_event).  Also note that if you attempt to read(2)
 510 * an event into a buffer that is not large enough for it, the data that does
 511 * not fit will be discarded so that the next read(2) will return a new event.
 512 */
 513union fw_cdev_event {
 514	struct fw_cdev_event_common		common;
 515	struct fw_cdev_event_bus_reset		bus_reset;
 516	struct fw_cdev_event_response		response;
 517	struct fw_cdev_event_request		request;
 518	struct fw_cdev_event_request2		request2;		/* added in 2.6.36 */
 519	struct fw_cdev_event_iso_interrupt	iso_interrupt;
 520	struct fw_cdev_event_iso_interrupt_mc	iso_interrupt_mc;	/* added in 2.6.36 */
 521	struct fw_cdev_event_iso_resource	iso_resource;		/* added in 2.6.30 */
 522	struct fw_cdev_event_phy_packet		phy_packet;		/* added in 2.6.36 */
 523	struct fw_cdev_event_request3		request3;		/* added in 6.5 */
 524	struct fw_cdev_event_response2		response2;		/* added in 6.5 */
 525	struct fw_cdev_event_phy_packet2	phy_packet2;		/* added in 6.5 */
 526};
 527
 528/* available since kernel version 2.6.22 */
 529#define FW_CDEV_IOC_GET_INFO           _IOWR('#', 0x00, struct fw_cdev_get_info)
 530#define FW_CDEV_IOC_SEND_REQUEST        _IOW('#', 0x01, struct fw_cdev_send_request)
 531#define FW_CDEV_IOC_ALLOCATE           _IOWR('#', 0x02, struct fw_cdev_allocate)
 532#define FW_CDEV_IOC_DEALLOCATE          _IOW('#', 0x03, struct fw_cdev_deallocate)
 533#define FW_CDEV_IOC_SEND_RESPONSE       _IOW('#', 0x04, struct fw_cdev_send_response)
 534#define FW_CDEV_IOC_INITIATE_BUS_RESET  _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
 535#define FW_CDEV_IOC_ADD_DESCRIPTOR     _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
 536#define FW_CDEV_IOC_REMOVE_DESCRIPTOR   _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
 537#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
 538#define FW_CDEV_IOC_QUEUE_ISO          _IOWR('#', 0x09, struct fw_cdev_queue_iso)
 539#define FW_CDEV_IOC_START_ISO           _IOW('#', 0x0a, struct fw_cdev_start_iso)
 540#define FW_CDEV_IOC_STOP_ISO            _IOW('#', 0x0b, struct fw_cdev_stop_iso)
 541
 542/* available since kernel version 2.6.24 */
 543#define FW_CDEV_IOC_GET_CYCLE_TIMER     _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
 544
 545/* available since kernel version 2.6.30 */
 546#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE       _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource)
 547#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE      _IOW('#', 0x0e, struct fw_cdev_deallocate)
 548#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE   _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource)
 549#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource)
 550#define FW_CDEV_IOC_GET_SPEED                     _IO('#', 0x11) /* returns speed code */
 551#define FW_CDEV_IOC_SEND_BROADCAST_REQUEST       _IOW('#', 0x12, struct fw_cdev_send_request)
 552#define FW_CDEV_IOC_SEND_STREAM_PACKET           _IOW('#', 0x13, struct fw_cdev_send_stream_packet)
 553
 554/* available since kernel version 2.6.34 */
 555#define FW_CDEV_IOC_GET_CYCLE_TIMER2   _IOWR('#', 0x14, struct fw_cdev_get_cycle_timer2)
 556
 557/* available since kernel version 2.6.36 */
 558#define FW_CDEV_IOC_SEND_PHY_PACKET    _IOWR('#', 0x15, struct fw_cdev_send_phy_packet)
 559#define FW_CDEV_IOC_RECEIVE_PHY_PACKETS _IOW('#', 0x16, struct fw_cdev_receive_phy_packets)
 560#define FW_CDEV_IOC_SET_ISO_CHANNELS    _IOW('#', 0x17, struct fw_cdev_set_iso_channels)
 561
 562/* available since kernel version 3.4 */
 563#define FW_CDEV_IOC_FLUSH_ISO           _IOW('#', 0x18, struct fw_cdev_flush_iso)
 564
 565/*
 566 * ABI version history
 567 *  1  (2.6.22)  - initial version
 568 *     (2.6.24)  - added %FW_CDEV_IOC_GET_CYCLE_TIMER
 569 *  2  (2.6.30)  - changed &fw_cdev_event_iso_interrupt.header if
 570 *                 &fw_cdev_create_iso_context.header_size is 8 or more
 571 *               - added %FW_CDEV_IOC_*_ISO_RESOURCE*,
 572 *                 %FW_CDEV_IOC_GET_SPEED, %FW_CDEV_IOC_SEND_BROADCAST_REQUEST,
 573 *                 %FW_CDEV_IOC_SEND_STREAM_PACKET
 574 *     (2.6.32)  - added time stamp to xmit &fw_cdev_event_iso_interrupt
 575 *     (2.6.33)  - IR has always packet-per-buffer semantics now, not one of
 576 *                 dual-buffer or packet-per-buffer depending on hardware
 577 *               - shared use and auto-response for FCP registers
 578 *  3  (2.6.34)  - made &fw_cdev_get_cycle_timer reliable
 579 *               - added %FW_CDEV_IOC_GET_CYCLE_TIMER2
 580 *  4  (2.6.36)  - added %FW_CDEV_EVENT_REQUEST2, %FW_CDEV_EVENT_PHY_PACKET_*,
 581 *                 and &fw_cdev_allocate.region_end
 582 *               - implemented &fw_cdev_event_bus_reset.bm_node_id
 583 *               - added %FW_CDEV_IOC_SEND_PHY_PACKET, _RECEIVE_PHY_PACKETS
 584 *               - added %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL,
 585 *                 %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL, and
 586 *                 %FW_CDEV_IOC_SET_ISO_CHANNELS
 587 *  5  (3.4)     - send %FW_CDEV_EVENT_ISO_INTERRUPT events when needed to
 588 *                 avoid dropping data
 589 *               - added %FW_CDEV_IOC_FLUSH_ISO
 590 *  6  (6.5)     - added some event for subactions of asynchronous transaction with time stamp
 591 *                   - %FW_CDEV_EVENT_REQUEST3
 592 *                   - %FW_CDEV_EVENT_RESPONSE2
 593 *                   - %FW_CDEV_EVENT_PHY_PACKET_SENT2
 594 *                   - %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2
 595 */
 596
 597/**
 598 * struct fw_cdev_get_info - General purpose information ioctl
 599 * @version:	The version field is just a running serial number.  Both an
 600 *		input parameter (ABI version implemented by the client) and
 601 *		output parameter (ABI version implemented by the kernel).
 602 *		A client shall fill in the ABI @version for which the client
 603 *		was implemented.  This is necessary for forward compatibility.
 604 * @rom_length:	If @rom is non-zero, up to @rom_length bytes of Configuration
 605 *		ROM will be copied into that user space address.  In either
 606 *		case, @rom_length is updated with the actual length of the
 607 *		Configuration ROM.
 608 * @rom:	If non-zero, address of a buffer to be filled by a copy of the
 609 *		device's Configuration ROM
 610 * @bus_reset:	If non-zero, address of a buffer to be filled by a
 611 *		&struct fw_cdev_event_bus_reset with the current state
 612 *		of the bus.  This does not cause a bus reset to happen.
 613 * @bus_reset_closure: Value of &closure in this and subsequent bus reset events
 614 * @card:	The index of the card this device belongs to
 615 *
 616 * The %FW_CDEV_IOC_GET_INFO ioctl is usually the very first one which a client
 617 * performs right after it opened a /dev/fw* file.
 618 *
 619 * As a side effect, reception of %FW_CDEV_EVENT_BUS_RESET events to be read(2)
 620 * is started by this ioctl.
 621 */
 622struct fw_cdev_get_info {
 623	__u32 version;
 624	__u32 rom_length;
 625	__u64 rom;
 626	__u64 bus_reset;
 627	__u64 bus_reset_closure;
 628	__u32 card;
 629};
 630
 631/**
 632 * struct fw_cdev_send_request - Send an asynchronous request packet
 633 * @tcode:	Transaction code of the request
 634 * @length:	Length of outgoing payload, in bytes
 635 * @offset:	48-bit offset at destination node
 636 * @closure:	Passed back to userspace in the response event
 637 * @data:	Userspace pointer to payload
 638 * @generation:	The bus generation where packet is valid
 639 *
 640 * Send a request to the device.  This ioctl implements all outgoing requests. Both quadlet and
 641 * block request specify the payload as a pointer to the data in the @data field. Once the
 642 * transaction completes, the kernel writes either &fw_cdev_event_response event or
 643 * &fw_cdev_event_response event back. The @closure field is passed back to user space in the
 644 * response event.
 645 */
 646struct fw_cdev_send_request {
 647	__u32 tcode;
 648	__u32 length;
 649	__u64 offset;
 650	__u64 closure;
 651	__u64 data;
 652	__u32 generation;
 653};
 654
 655/**
 656 * struct fw_cdev_send_response - Send an asynchronous response packet
 657 * @rcode:	Response code as determined by the userspace handler
 658 * @length:	Length of outgoing payload, in bytes
 659 * @data:	Userspace pointer to payload
 660 * @handle:	The handle from the &fw_cdev_event_request
 661 *
 662 * Send a response to an incoming request.  By setting up an address range using
 663 * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests.  An
 664 * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must
 665 * send a reply using this ioctl.  The event has a handle to the kernel-side
 666 * pending transaction, which should be used with this ioctl.
 667 */
 668struct fw_cdev_send_response {
 669	__u32 rcode;
 670	__u32 length;
 671	__u64 data;
 672	__u32 handle;
 673};
 674
 675/**
 676 * struct fw_cdev_allocate - Allocate a CSR in an address range
 677 * @offset:	Start offset of the address range
 678 * @closure:	To be passed back to userspace in request events
 679 * @length:	Length of the CSR, in bytes
 680 * @handle:	Handle to the allocation, written by the kernel
 681 * @region_end:	First address above the address range (added in ABI v4, 2.6.36)
 682 *
 683 * Allocate an address range in the 48-bit address space on the local node
 684 * (the controller).  This allows userspace to listen for requests with an
 685 * offset within that address range.  Every time when the kernel receives a
 686 * request within the range, an &fw_cdev_event_request2 event will be emitted.
 687 * (If the kernel or the client implements ABI version <= 3, an
 688 * &fw_cdev_event_request will be generated instead.)
 689 *
 690 * The @closure field is passed back to userspace in these request events.
 691 * The @handle field is an out parameter, returning a handle to the allocated
 692 * range to be used for later deallocation of the range.
 693 *
 694 * The address range is allocated on all local nodes.  The address allocation
 695 * is exclusive except for the FCP command and response registers.  If an
 696 * exclusive address region is already in use, the ioctl fails with errno set
 697 * to %EBUSY.
 698 *
 699 * If kernel and client implement ABI version >= 4, the kernel looks up a free
 700 * spot of size @length inside [@offset..@region_end) and, if found, writes
 701 * the start address of the new CSR back in @offset.  I.e. @offset is an
 702 * in and out parameter.  If this automatic placement of a CSR in a bigger
 703 * address range is not desired, the client simply needs to set @region_end
 704 * = @offset + @length.
 705 *
 706 * If the kernel or the client implements ABI version <= 3, @region_end is
 707 * ignored and effectively assumed to be @offset + @length.
 708 *
 709 * @region_end is only present in a kernel header >= 2.6.36.  If necessary,
 710 * this can for example be tested by #ifdef FW_CDEV_EVENT_REQUEST2.
 711 */
 712struct fw_cdev_allocate {
 713	__u64 offset;
 714	__u64 closure;
 715	__u32 length;
 716	__u32 handle;
 717	__u64 region_end;	/* available since kernel version 2.6.36 */
 718};
 719
 720/**
 721 * struct fw_cdev_deallocate - Free a CSR address range or isochronous resource
 722 * @handle:	Handle to the address range or iso resource, as returned by the
 723 *		kernel when the range or resource was allocated
 724 */
 725struct fw_cdev_deallocate {
 726	__u32 handle;
 727};
 728
 729#define FW_CDEV_LONG_RESET	0
 730#define FW_CDEV_SHORT_RESET	1
 731
 732/**
 733 * struct fw_cdev_initiate_bus_reset - Initiate a bus reset
 734 * @type:	%FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET
 735 *
 736 * Initiate a bus reset for the bus this device is on.  The bus reset can be
 737 * either the original (long) bus reset or the arbitrated (short) bus reset
 738 * introduced in 1394a-2000.
 739 *
 740 * The ioctl returns immediately.  A subsequent &fw_cdev_event_bus_reset
 741 * indicates when the reset actually happened.  Since ABI v4, this may be
 742 * considerably later than the ioctl because the kernel ensures a grace period
 743 * between subsequent bus resets as per IEEE 1394 bus management specification.
 744 */
 745struct fw_cdev_initiate_bus_reset {
 746	__u32 type;
 747};
 748
 749/**
 750 * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM
 751 * @immediate:	If non-zero, immediate key to insert before pointer
 752 * @key:	Upper 8 bits of root directory pointer
 753 * @data:	Userspace pointer to contents of descriptor block
 754 * @length:	Length of descriptor block data, in quadlets
 755 * @handle:	Handle to the descriptor, written by the kernel
 756 *
 757 * Add a descriptor block and optionally a preceding immediate key to the local
 758 * node's Configuration ROM.
 759 *
 760 * The @key field specifies the upper 8 bits of the descriptor root directory
 761 * pointer and the @data and @length fields specify the contents. The @key
 762 * should be of the form 0xXX000000. The offset part of the root directory entry
 763 * will be filled in by the kernel.
 764 *
 765 * If not 0, the @immediate field specifies an immediate key which will be
 766 * inserted before the root directory pointer.
 767 *
 768 * @immediate, @key, and @data array elements are CPU-endian quadlets.
 769 *
 770 * If successful, the kernel adds the descriptor and writes back a @handle to
 771 * the kernel-side object to be used for later removal of the descriptor block
 772 * and immediate key.  The kernel will also generate a bus reset to signal the
 773 * change of the Configuration ROM to other nodes.
 774 *
 775 * This ioctl affects the Configuration ROMs of all local nodes.
 776 * The ioctl only succeeds on device files which represent a local node.
 777 */
 778struct fw_cdev_add_descriptor {
 779	__u32 immediate;
 780	__u32 key;
 781	__u64 data;
 782	__u32 length;
 783	__u32 handle;
 784};
 785
 786/**
 787 * struct fw_cdev_remove_descriptor - Remove contents from the Configuration ROM
 788 * @handle:	Handle to the descriptor, as returned by the kernel when the
 789 *		descriptor was added
 790 *
 791 * Remove a descriptor block and accompanying immediate key from the local
 792 * nodes' Configuration ROMs.  The kernel will also generate a bus reset to
 793 * signal the change of the Configuration ROM to other nodes.
 794 */
 795struct fw_cdev_remove_descriptor {
 796	__u32 handle;
 797};
 798
 799#define FW_CDEV_ISO_CONTEXT_TRANSMIT			0
 800#define FW_CDEV_ISO_CONTEXT_RECEIVE			1
 801#define FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL	2 /* added in 2.6.36 */
 802
 803/**
 804 * struct fw_cdev_create_iso_context - Create a context for isochronous I/O
 805 * @type:	%FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE or
 806 *		%FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL
 807 * @header_size: Header size to strip in single-channel reception
 808 * @channel:	Channel to bind to in single-channel reception or transmission
 809 * @speed:	Transmission speed
 810 * @closure:	To be returned in &fw_cdev_event_iso_interrupt or
 811 *		&fw_cdev_event_iso_interrupt_multichannel
 812 * @handle:	Handle to context, written back by kernel
 813 *
 814 * Prior to sending or receiving isochronous I/O, a context must be created.
 815 * The context records information about the transmit or receive configuration
 816 * and typically maps to an underlying hardware resource.  A context is set up
 817 * for either sending or receiving.  It is bound to a specific isochronous
 818 * @channel.
 819 *
 820 * In case of multichannel reception, @header_size and @channel are ignored
 821 * and the channels are selected by %FW_CDEV_IOC_SET_ISO_CHANNELS.
 822 *
 823 * For %FW_CDEV_ISO_CONTEXT_RECEIVE contexts, @header_size must be at least 4
 824 * and must be a multiple of 4.  It is ignored in other context types.
 825 *
 826 * @speed is ignored in receive context types.
 827 *
 828 * If a context was successfully created, the kernel writes back a handle to the
 829 * context, which must be passed in for subsequent operations on that context.
 830 *
 831 * Limitations:
 832 * No more than one iso context can be created per fd.
 833 * The total number of contexts that all userspace and kernelspace drivers can
 834 * create on a card at a time is a hardware limit, typically 4 or 8 contexts per
 835 * direction, and of them at most one multichannel receive context.
 836 */
 837struct fw_cdev_create_iso_context {
 838	__u32 type;
 839	__u32 header_size;
 840	__u32 channel;
 841	__u32 speed;
 842	__u64 closure;
 843	__u32 handle;
 844};
 845
 846/**
 847 * struct fw_cdev_set_iso_channels - Select channels in multichannel reception
 848 * @channels:	Bitmask of channels to listen to
 849 * @handle:	Handle of the mutichannel receive context
 850 *
 851 * @channels is the bitwise or of 1ULL << n for each channel n to listen to.
 852 *
 853 * The ioctl fails with errno %EBUSY if there is already another receive context
 854 * on a channel in @channels.  In that case, the bitmask of all unoccupied
 855 * channels is returned in @channels.
 856 */
 857struct fw_cdev_set_iso_channels {
 858	__u64 channels;
 859	__u32 handle;
 860};
 861
 862#define FW_CDEV_ISO_PAYLOAD_LENGTH(v)	(v)
 863#define FW_CDEV_ISO_INTERRUPT		(1 << 16)
 864#define FW_CDEV_ISO_SKIP		(1 << 17)
 865#define FW_CDEV_ISO_SYNC		(1 << 17)
 866#define FW_CDEV_ISO_TAG(v)		((v) << 18)
 867#define FW_CDEV_ISO_SY(v)		((v) << 20)
 868#define FW_CDEV_ISO_HEADER_LENGTH(v)	((v) << 24)
 869
 870/**
 871 * struct fw_cdev_iso_packet - Isochronous packet
 872 * @control:	Contains the header length (8 uppermost bits),
 873 *		the sy field (4 bits), the tag field (2 bits), a sync flag
 874 *		or a skip flag (1 bit), an interrupt flag (1 bit), and the
 875 *		payload length (16 lowermost bits)
 876 * @header:	Header and payload in case of a transmit context.
 877 *
 878 * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.
 879 * Use the FW_CDEV_ISO_* macros to fill in @control.
 880 * The @header array is empty in case of receive contexts.
 881 *
 882 * Context type %FW_CDEV_ISO_CONTEXT_TRANSMIT:
 883 *
 884 * @control.HEADER_LENGTH must be a multiple of 4.  It specifies the numbers of
 885 * bytes in @header that will be prepended to the packet's payload.  These bytes
 886 * are copied into the kernel and will not be accessed after the ioctl has
 887 * returned.
 888 *
 889 * The @control.SY and TAG fields are copied to the iso packet header.  These
 890 * fields are specified by IEEE 1394a and IEC 61883-1.
 891 *
 892 * The @control.SKIP flag specifies that no packet is to be sent in a frame.
 893 * When using this, all other fields except @control.INTERRUPT must be zero.
 894 *
 895 * When a packet with the @control.INTERRUPT flag set has been completed, an
 896 * &fw_cdev_event_iso_interrupt event will be sent.
 897 *
 898 * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE:
 899 *
 900 * @control.HEADER_LENGTH must be a multiple of the context's header_size.
 901 * If the HEADER_LENGTH is larger than the context's header_size, multiple
 902 * packets are queued for this entry.
 903 *
 904 * The @control.SY and TAG fields are ignored.
 905 *
 906 * If the @control.SYNC flag is set, the context drops all packets until a
 907 * packet with a sy field is received which matches &fw_cdev_start_iso.sync.
 908 *
 909 * @control.PAYLOAD_LENGTH defines how many payload bytes can be received for
 910 * one packet (in addition to payload quadlets that have been defined as headers
 911 * and are stripped and returned in the &fw_cdev_event_iso_interrupt structure).
 912 * If more bytes are received, the additional bytes are dropped.  If less bytes
 913 * are received, the remaining bytes in this part of the payload buffer will not
 914 * be written to, not even by the next packet.  I.e., packets received in
 915 * consecutive frames will not necessarily be consecutive in memory.  If an
 916 * entry has queued multiple packets, the PAYLOAD_LENGTH is divided equally
 917 * among them.
 918 *
 919 * When a packet with the @control.INTERRUPT flag set has been completed, an
 920 * &fw_cdev_event_iso_interrupt event will be sent.  An entry that has queued
 921 * multiple receive packets is completed when its last packet is completed.
 922 *
 923 * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL:
 924 *
 925 * Here, &fw_cdev_iso_packet would be more aptly named _iso_buffer_chunk since
 926 * it specifies a chunk of the mmap()'ed buffer, while the number and alignment
 927 * of packets to be placed into the buffer chunk is not known beforehand.
 928 *
 929 * @control.PAYLOAD_LENGTH is the size of the buffer chunk and specifies room
 930 * for header, payload, padding, and trailer bytes of one or more packets.
 931 * It must be a multiple of 4.
 932 *
 933 * @control.HEADER_LENGTH, TAG and SY are ignored.  SYNC is treated as described
 934 * for single-channel reception.
 935 *
 936 * When a buffer chunk with the @control.INTERRUPT flag set has been filled
 937 * entirely, an &fw_cdev_event_iso_interrupt_mc event will be sent.
 938 */
 939struct fw_cdev_iso_packet {
 940	__u32 control;
 941	__u32 header[];
 942};
 943
 944/**
 945 * struct fw_cdev_queue_iso - Queue isochronous packets for I/O
 946 * @packets:	Userspace pointer to an array of &fw_cdev_iso_packet
 947 * @data:	Pointer into mmap()'ed payload buffer
 948 * @size:	Size of the @packets array, in bytes
 949 * @handle:	Isochronous context handle
 950 *
 951 * Queue a number of isochronous packets for reception or transmission.
 952 * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,
 953 * which describe how to transmit from or receive into a contiguous region
 954 * of a mmap()'ed payload buffer.  As part of transmit packet descriptors,
 955 * a series of headers can be supplied, which will be prepended to the
 956 * payload during DMA.
 957 *
 958 * The kernel may or may not queue all packets, but will write back updated
 959 * values of the @packets, @data and @size fields, so the ioctl can be
 960 * resubmitted easily.
 961 *
 962 * In case of a multichannel receive context, @data must be quadlet-aligned
 963 * relative to the buffer start.
 964 */
 965struct fw_cdev_queue_iso {
 966	__u64 packets;
 967	__u64 data;
 968	__u32 size;
 969	__u32 handle;
 970};
 971
 972#define FW_CDEV_ISO_CONTEXT_MATCH_TAG0		 1
 973#define FW_CDEV_ISO_CONTEXT_MATCH_TAG1		 2
 974#define FW_CDEV_ISO_CONTEXT_MATCH_TAG2		 4
 975#define FW_CDEV_ISO_CONTEXT_MATCH_TAG3		 8
 976#define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS	15
 977
 978/**
 979 * struct fw_cdev_start_iso - Start an isochronous transmission or reception
 980 * @cycle:	Cycle in which to start I/O.  If @cycle is greater than or
 981 *		equal to 0, the I/O will start on that cycle.
 982 * @sync:	Determines the value to wait for receive packets that have
 983 *		the %FW_CDEV_ISO_SYNC bit set
 984 * @tags:	Tag filter bit mask.  Only valid for isochronous reception.
 985 *		Determines the tag values for which packets will be accepted.
 986 *		Use FW_CDEV_ISO_CONTEXT_MATCH_* macros to set @tags.
 987 * @handle:	Isochronous context handle within which to transmit or receive
 988 */
 989struct fw_cdev_start_iso {
 990	__s32 cycle;
 991	__u32 sync;
 992	__u32 tags;
 993	__u32 handle;
 994};
 995
 996/**
 997 * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception
 998 * @handle:	Handle of isochronous context to stop
 999 */
1000struct fw_cdev_stop_iso {
1001	__u32 handle;
1002};
1003
1004/**
1005 * struct fw_cdev_flush_iso - flush completed iso packets
1006 * @handle:	handle of isochronous context to flush
1007 *
1008 * For %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE contexts,
1009 * report any completed packets.
1010 *
1011 * For %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL contexts, report the current
1012 * offset in the receive buffer, if it has changed; this is typically in the
1013 * middle of some buffer chunk.
1014 *
1015 * Any %FW_CDEV_EVENT_ISO_INTERRUPT or %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL
1016 * events generated by this ioctl are sent synchronously, i.e., are available
1017 * for reading from the file descriptor when this ioctl returns.
1018 */
1019struct fw_cdev_flush_iso {
1020	__u32 handle;
1021};
1022
1023/**
1024 * struct fw_cdev_get_cycle_timer - read cycle timer register
1025 * @local_time:   system time, in microseconds since the Epoch
1026 * @cycle_timer:  Cycle Time register contents
1027 *
1028 * Same as %FW_CDEV_IOC_GET_CYCLE_TIMER2, but fixed to use %CLOCK_REALTIME
1029 * and only with microseconds resolution.
1030 *
1031 * In version 1 and 2 of the ABI, this ioctl returned unreliable (non-
1032 * monotonic) @cycle_timer values on certain controllers.
1033 */
1034struct fw_cdev_get_cycle_timer {
1035	__u64 local_time;
1036	__u32 cycle_timer;
1037};
1038
1039/**
1040 * struct fw_cdev_get_cycle_timer2 - read cycle timer register
1041 * @tv_sec:       system time, seconds
1042 * @tv_nsec:      system time, sub-seconds part in nanoseconds
1043 * @clk_id:       input parameter, clock from which to get the system time
1044 * @cycle_timer:  Cycle Time register contents
1045 *
1046 * The %FW_CDEV_IOC_GET_CYCLE_TIMER2 ioctl reads the isochronous cycle timer
1047 * and also the system clock.  This allows to correlate reception time of
1048 * isochronous packets with system time.
1049 *
1050 * @clk_id lets you choose a clock like with POSIX' clock_gettime function.
1051 * Supported @clk_id values are POSIX' %CLOCK_REALTIME and %CLOCK_MONOTONIC
1052 * and Linux' %CLOCK_MONOTONIC_RAW.
1053 *
1054 * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and
1055 * 12 bits cycleOffset, in host byte order.  Cf. the Cycle Time register
1056 * per IEEE 1394 or Isochronous Cycle Timer register per OHCI-1394.
1057 */
1058struct fw_cdev_get_cycle_timer2 {
1059	__s64 tv_sec;
1060	__s32 tv_nsec;
1061	__s32 clk_id;
1062	__u32 cycle_timer;
1063};
1064
1065/**
1066 * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth
1067 * @closure:	Passed back to userspace in corresponding iso resource events
1068 * @channels:	Isochronous channels of which one is to be (de)allocated
1069 * @bandwidth:	Isochronous bandwidth units to be (de)allocated
1070 * @handle:	Handle to the allocation, written by the kernel (only valid in
1071 *		case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls)
1072 *
1073 * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an
1074 * isochronous channel and/or of isochronous bandwidth at the isochronous
1075 * resource manager (IRM).  Only one of the channels specified in @channels is
1076 * allocated.  An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after
1077 * communication with the IRM, indicating success or failure in the event data.
1078 * The kernel will automatically reallocate the resources after bus resets.
1079 * Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event
1080 * will be sent.  The kernel will also automatically deallocate the resources
1081 * when the file descriptor is closed.
1082 *
1083 * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate
1084 * deallocation of resources which were allocated as described above.
1085 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
1086 *
1087 * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation
1088 * without automatic re- or deallocation.
1089 * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation,
1090 * indicating success or failure in its data.
1091 *
1092 * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like
1093 * %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed
1094 * instead of allocated.
1095 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
1096 *
1097 * To summarize, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE allocates iso resources
1098 * for the lifetime of the fd or @handle.
1099 * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources
1100 * for the duration of a bus generation.
1101 *
1102 * @channels is a host-endian bitfield with the least significant bit
1103 * representing channel 0 and the most significant bit representing channel 63:
1104 * 1ULL << c for each channel c that is a candidate for (de)allocation.
1105 *
1106 * @bandwidth is expressed in bandwidth allocation units, i.e. the time to send
1107 * one quadlet of data (payload or header data) at speed S1600.
1108 */
1109struct fw_cdev_allocate_iso_resource {
1110	__u64 closure;
1111	__u64 channels;
1112	__u32 bandwidth;
1113	__u32 handle;
1114};
1115
1116/**
1117 * struct fw_cdev_send_stream_packet - send an asynchronous stream packet
1118 * @length:	Length of outgoing payload, in bytes
1119 * @tag:	Data format tag
1120 * @channel:	Isochronous channel to transmit to
1121 * @sy:		Synchronization code
1122 * @closure:	Passed back to userspace in the response event
1123 * @data:	Userspace pointer to payload
1124 * @generation:	The bus generation where packet is valid
1125 * @speed:	Speed to transmit at
1126 *
1127 * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet to every device
1128 * which is listening to the specified channel. The kernel writes either &fw_cdev_event_response
1129 * event or &fw_cdev_event_response2 event which indicates success or failure of the transmission.
1130 */
1131struct fw_cdev_send_stream_packet {
1132	__u32 length;
1133	__u32 tag;
1134	__u32 channel;
1135	__u32 sy;
1136	__u64 closure;
1137	__u64 data;
1138	__u32 generation;
1139	__u32 speed;
1140};
1141
1142/**
1143 * struct fw_cdev_send_phy_packet - send a PHY packet
1144 * @closure:	Passed back to userspace in the PHY-packet-sent event
1145 * @data:	First and second quadlet of the PHY packet
1146 * @generation:	The bus generation where packet is valid
1147 *
1148 * The %FW_CDEV_IOC_SEND_PHY_PACKET ioctl sends a PHY packet to all nodes on the same card as this
1149 * device.  After transmission, either %FW_CDEV_EVENT_PHY_PACKET_SENT event or
1150 * %FW_CDEV_EVENT_PHY_PACKET_SENT event is generated.
1151 *
1152 * The payload @data\[\] shall be specified in host byte order.  Usually,
1153 * @data\[1\] needs to be the bitwise inverse of @data\[0\].  VersaPHY packets
1154 * are an exception to this rule.
1155 *
1156 * The ioctl is only permitted on device files which represent a local node.
1157 */
1158struct fw_cdev_send_phy_packet {
1159	__u64 closure;
1160	__u32 data[2];
1161	__u32 generation;
1162};
1163
1164/**
1165 * struct fw_cdev_receive_phy_packets - start reception of PHY packets
1166 * @closure: Passed back to userspace in phy packet events
1167 *
1168 * This ioctl activates issuing of either %FW_CDEV_EVENT_PHY_PACKET_RECEIVED or
1169 * %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2 due to incoming PHY packets from any node on the same bus
1170 * as the device.
1171 *
1172 * The ioctl is only permitted on device files which represent a local node.
1173 */
1174struct fw_cdev_receive_phy_packets {
1175	__u64 closure;
1176};
1177
1178#define FW_CDEV_VERSION 3 /* Meaningless legacy macro; don't use it. */
1179
1180#endif /* _LINUX_FIREWIRE_CDEV_H */