linux/include/linux/firewire-cdev.h
<<
>>
Prefs
   1/*
   2 * Char device interface.
   3 *
   4 * Copyright (C) 2005-2006  Kristian Hoegsberg <krh@bitplanet.net>
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License as published by
   8 * the Free Software Foundation; either version 2 of the License, or
   9 * (at your option) any later version.
  10 *
  11 * This program is distributed in the hope that it will be useful,
  12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 * GNU General Public License for more details.
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * along with this program; if not, write to the Free Software Foundation,
  18 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19 */
  20
  21#ifndef _LINUX_FIREWIRE_CDEV_H
  22#define _LINUX_FIREWIRE_CDEV_H
  23
  24#include <linux/ioctl.h>
  25#include <linux/types.h>
  26#include <linux/firewire-constants.h>
  27
  28#define FW_CDEV_EVENT_BUS_RESET                 0x00
  29#define FW_CDEV_EVENT_RESPONSE                  0x01
  30#define FW_CDEV_EVENT_REQUEST                   0x02
  31#define FW_CDEV_EVENT_ISO_INTERRUPT             0x03
  32#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED    0x04
  33#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED  0x05
  34
  35/**
  36 * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types
  37 * @closure:    For arbitrary use by userspace
  38 * @type:       Discriminates the fw_cdev_event_ types
  39 *
  40 * This struct may be used to access generic members of all fw_cdev_event_
  41 * types regardless of the specific type.
  42 *
  43 * Data passed in the @closure field for a request will be returned in the
  44 * corresponding event.  It is big enough to hold a pointer on all platforms.
  45 * The ioctl used to set @closure depends on the @type of event.
  46 */
  47struct fw_cdev_event_common {
  48        __u64 closure;
  49        __u32 type;
  50};
  51
  52/**
  53 * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred
  54 * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl
  55 * @type:       See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET
  56 * @node_id:       New node ID of this node
  57 * @local_node_id: Node ID of the local node, i.e. of the controller
  58 * @bm_node_id:    Node ID of the bus manager
  59 * @irm_node_id:   Node ID of the iso resource manager
  60 * @root_node_id:  Node ID of the root node
  61 * @generation:    New bus generation
  62 *
  63 * This event is sent when the bus the device belongs to goes through a bus
  64 * reset.  It provides information about the new bus configuration, such as
  65 * new node ID for this device, new root ID, and others.
  66 */
  67struct fw_cdev_event_bus_reset {
  68        __u64 closure;
  69        __u32 type;
  70        __u32 node_id;
  71        __u32 local_node_id;
  72        __u32 bm_node_id;
  73        __u32 irm_node_id;
  74        __u32 root_node_id;
  75        __u32 generation;
  76};
  77
  78/**
  79 * struct fw_cdev_event_response - Sent when a response packet was received
  80 * @closure:    See &fw_cdev_event_common;
  81 *              set by %FW_CDEV_IOC_SEND_REQUEST ioctl
  82 * @type:       See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE
  83 * @rcode:      Response code returned by the remote node
  84 * @length:     Data length, i.e. the response's payload size in bytes
  85 * @data:       Payload data, if any
  86 *
  87 * This event is sent when the stack receives a response to an outgoing request
  88 * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses
  89 * carrying data (read and lock responses) follows immediately and can be
  90 * accessed through the @data field.
  91 */
  92struct fw_cdev_event_response {
  93        __u64 closure;
  94        __u32 type;
  95        __u32 rcode;
  96        __u32 length;
  97        __u32 data[0];
  98};
  99
 100/**
 101 * struct fw_cdev_event_request - Sent on incoming request to an address region
 102 * @closure:    See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl
 103 * @type:       See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST
 104 * @tcode:      Transaction code of the incoming request
 105 * @offset:     The offset into the 48-bit per-node address space
 106 * @handle:     Reference to the kernel-side pending request
 107 * @length:     Data length, i.e. the request's payload size in bytes
 108 * @data:       Incoming data, if any
 109 *
 110 * This event is sent when the stack receives an incoming request to an address
 111 * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is
 112 * guaranteed to be completely contained in the specified region.  Userspace is
 113 * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl,
 114 * using the same @handle.
 115 *
 116 * The payload data for requests carrying data (write and lock requests)
 117 * follows immediately and can be accessed through the @data field.
 118 */
 119struct fw_cdev_event_request {
 120        __u64 closure;
 121        __u32 type;
 122        __u32 tcode;
 123        __u64 offset;
 124        __u32 handle;
 125        __u32 length;
 126        __u32 data[0];
 127};
 128
 129/**
 130 * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed
 131 * @closure:    See &fw_cdev_event_common;
 132 *              set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl
 133 * @type:       See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT
 134 * @cycle:      Cycle counter of the interrupt packet
 135 * @header_length: Total length of following headers, in bytes
 136 * @header:     Stripped headers, if any
 137 *
 138 * This event is sent when the controller has completed an &fw_cdev_iso_packet
 139 * with the %FW_CDEV_ISO_INTERRUPT bit set.  In the receive case, the headers
 140 * stripped of all packets up until and including the interrupt packet are
 141 * returned in the @header field.  The amount of header data per packet is as
 142 * specified at iso context creation by &fw_cdev_create_iso_context.header_size.
 143 *
 144 * In version 1 of this ABI, header data consisted of the 1394 isochronous
 145 * packet header, followed by quadlets from the packet payload if
 146 * &fw_cdev_create_iso_context.header_size > 4.
 147 *
 148 * In version 2 of this ABI, header data consist of the 1394 isochronous
 149 * packet header, followed by a timestamp quadlet if
 150 * &fw_cdev_create_iso_context.header_size > 4, followed by quadlets from the
 151 * packet payload if &fw_cdev_create_iso_context.header_size > 8.
 152 *
 153 * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2.
 154 *
 155 * Format of 1394 iso packet header: 16 bits len, 2 bits tag, 6 bits channel,
 156 * 4 bits tcode, 4 bits sy, in big endian byte order.  Format of timestamp:
 157 * 16 bits invalid, 3 bits cycleSeconds, 13 bits cycleCount, in big endian byte
 158 * order.
 159 */
 160struct fw_cdev_event_iso_interrupt {
 161        __u64 closure;
 162        __u32 type;
 163        __u32 cycle;
 164        __u32 header_length;
 165        __u32 header[0];
 166};
 167
 168/**
 169 * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed
 170 * @closure:    See &fw_cdev_event_common;
 171 *              set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl
 172 * @type:       %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
 173 *              %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
 174 * @handle:     Reference by which an allocated resource can be deallocated
 175 * @channel:    Isochronous channel which was (de)allocated, if any
 176 * @bandwidth:  Bandwidth allocation units which were (de)allocated, if any
 177 *
 178 * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous
 179 * resource was allocated at the IRM.  The client has to check @channel and
 180 * @bandwidth for whether the allocation actually succeeded.
 181 *
 182 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous
 183 * resource was deallocated at the IRM.  It is also sent when automatic
 184 * reallocation after a bus reset failed.
 185 *
 186 * @channel is <0 if no channel was (de)allocated or if reallocation failed.
 187 * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed.
 188 */
 189struct fw_cdev_event_iso_resource {
 190        __u64 closure;
 191        __u32 type;
 192        __u32 handle;
 193        __s32 channel;
 194        __s32 bandwidth;
 195};
 196
 197/**
 198 * union fw_cdev_event - Convenience union of fw_cdev_event_ types
 199 * @common:        Valid for all types
 200 * @bus_reset:     Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET
 201 * @response:      Valid if @common.type == %FW_CDEV_EVENT_RESPONSE
 202 * @request:       Valid if @common.type == %FW_CDEV_EVENT_REQUEST
 203 * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT
 204 * @iso_resource:  Valid if @common.type ==
 205 *                              %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or
 206 *                              %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED
 207 *
 208 * Convenience union for userspace use.  Events could be read(2) into an
 209 * appropriately aligned char buffer and then cast to this union for further
 210 * processing.  Note that for a request, response or iso_interrupt event,
 211 * the data[] or header[] may make the size of the full event larger than
 212 * sizeof(union fw_cdev_event).  Also note that if you attempt to read(2)
 213 * an event into a buffer that is not large enough for it, the data that does
 214 * not fit will be discarded so that the next read(2) will return a new event.
 215 */
 216union fw_cdev_event {
 217        struct fw_cdev_event_common             common;
 218        struct fw_cdev_event_bus_reset          bus_reset;
 219        struct fw_cdev_event_response           response;
 220        struct fw_cdev_event_request            request;
 221        struct fw_cdev_event_iso_interrupt      iso_interrupt;
 222        struct fw_cdev_event_iso_resource       iso_resource;
 223};
 224
 225/* available since kernel version 2.6.22 */
 226#define FW_CDEV_IOC_GET_INFO           _IOWR('#', 0x00, struct fw_cdev_get_info)
 227#define FW_CDEV_IOC_SEND_REQUEST        _IOW('#', 0x01, struct fw_cdev_send_request)
 228#define FW_CDEV_IOC_ALLOCATE           _IOWR('#', 0x02, struct fw_cdev_allocate)
 229#define FW_CDEV_IOC_DEALLOCATE          _IOW('#', 0x03, struct fw_cdev_deallocate)
 230#define FW_CDEV_IOC_SEND_RESPONSE       _IOW('#', 0x04, struct fw_cdev_send_response)
 231#define FW_CDEV_IOC_INITIATE_BUS_RESET  _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset)
 232#define FW_CDEV_IOC_ADD_DESCRIPTOR     _IOWR('#', 0x06, struct fw_cdev_add_descriptor)
 233#define FW_CDEV_IOC_REMOVE_DESCRIPTOR   _IOW('#', 0x07, struct fw_cdev_remove_descriptor)
 234#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context)
 235#define FW_CDEV_IOC_QUEUE_ISO          _IOWR('#', 0x09, struct fw_cdev_queue_iso)
 236#define FW_CDEV_IOC_START_ISO           _IOW('#', 0x0a, struct fw_cdev_start_iso)
 237#define FW_CDEV_IOC_STOP_ISO            _IOW('#', 0x0b, struct fw_cdev_stop_iso)
 238
 239/* available since kernel version 2.6.24 */
 240#define FW_CDEV_IOC_GET_CYCLE_TIMER     _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer)
 241
 242/* available since kernel version 2.6.30 */
 243#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE       _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource)
 244#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE      _IOW('#', 0x0e, struct fw_cdev_deallocate)
 245#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE   _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource)
 246#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource)
 247#define FW_CDEV_IOC_GET_SPEED                     _IO('#', 0x11) /* returns speed code */
 248#define FW_CDEV_IOC_SEND_BROADCAST_REQUEST       _IOW('#', 0x12, struct fw_cdev_send_request)
 249#define FW_CDEV_IOC_SEND_STREAM_PACKET           _IOW('#', 0x13, struct fw_cdev_send_stream_packet)
 250
 251/*
 252 * FW_CDEV_VERSION History
 253 *  1  (2.6.22)  - initial version
 254 *  2  (2.6.30)  - changed &fw_cdev_event_iso_interrupt.header if
 255 *                 &fw_cdev_create_iso_context.header_size is 8 or more
 256 */
 257#define FW_CDEV_VERSION 2
 258
 259/**
 260 * struct fw_cdev_get_info - General purpose information ioctl
 261 * @version:    The version field is just a running serial number.
 262 *              We never break backwards compatibility, but may add more
 263 *              structs and ioctls in later revisions.
 264 * @rom_length: If @rom is non-zero, at most rom_length bytes of configuration
 265 *              ROM will be copied into that user space address.  In either
 266 *              case, @rom_length is updated with the actual length of the
 267 *              configuration ROM.
 268 * @rom:        If non-zero, address of a buffer to be filled by a copy of the
 269 *              device's configuration ROM
 270 * @bus_reset:  If non-zero, address of a buffer to be filled by a
 271 *              &struct fw_cdev_event_bus_reset with the current state
 272 *              of the bus.  This does not cause a bus reset to happen.
 273 * @bus_reset_closure: Value of &closure in this and subsequent bus reset events
 274 * @card:       The index of the card this device belongs to
 275 */
 276struct fw_cdev_get_info {
 277        __u32 version;
 278        __u32 rom_length;
 279        __u64 rom;
 280        __u64 bus_reset;
 281        __u64 bus_reset_closure;
 282        __u32 card;
 283};
 284
 285/**
 286 * struct fw_cdev_send_request - Send an asynchronous request packet
 287 * @tcode:      Transaction code of the request
 288 * @length:     Length of outgoing payload, in bytes
 289 * @offset:     48-bit offset at destination node
 290 * @closure:    Passed back to userspace in the response event
 291 * @data:       Userspace pointer to payload
 292 * @generation: The bus generation where packet is valid
 293 *
 294 * Send a request to the device.  This ioctl implements all outgoing requests.
 295 * Both quadlet and block request specify the payload as a pointer to the data
 296 * in the @data field.  Once the transaction completes, the kernel writes an
 297 * &fw_cdev_event_response event back.  The @closure field is passed back to
 298 * user space in the response event.
 299 */
 300struct fw_cdev_send_request {
 301        __u32 tcode;
 302        __u32 length;
 303        __u64 offset;
 304        __u64 closure;
 305        __u64 data;
 306        __u32 generation;
 307};
 308
 309/**
 310 * struct fw_cdev_send_response - Send an asynchronous response packet
 311 * @rcode:      Response code as determined by the userspace handler
 312 * @length:     Length of outgoing payload, in bytes
 313 * @data:       Userspace pointer to payload
 314 * @handle:     The handle from the &fw_cdev_event_request
 315 *
 316 * Send a response to an incoming request.  By setting up an address range using
 317 * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests.  An
 318 * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must
 319 * send a reply using this ioctl.  The event has a handle to the kernel-side
 320 * pending transaction, which should be used with this ioctl.
 321 */
 322struct fw_cdev_send_response {
 323        __u32 rcode;
 324        __u32 length;
 325        __u64 data;
 326        __u32 handle;
 327};
 328
 329/**
 330 * struct fw_cdev_allocate - Allocate a CSR address range
 331 * @offset:     Start offset of the address range
 332 * @closure:    To be passed back to userspace in request events
 333 * @length:     Length of the address range, in bytes
 334 * @handle:     Handle to the allocation, written by the kernel
 335 *
 336 * Allocate an address range in the 48-bit address space on the local node
 337 * (the controller).  This allows userspace to listen for requests with an
 338 * offset within that address range.  When the kernel receives a request
 339 * within the range, an &fw_cdev_event_request event will be written back.
 340 * The @closure field is passed back to userspace in the response event.
 341 * The @handle field is an out parameter, returning a handle to the allocated
 342 * range to be used for later deallocation of the range.
 343 */
 344struct fw_cdev_allocate {
 345        __u64 offset;
 346        __u64 closure;
 347        __u32 length;
 348        __u32 handle;
 349};
 350
 351/**
 352 * struct fw_cdev_deallocate - Free a CSR address range or isochronous resource
 353 * @handle:     Handle to the address range or iso resource, as returned by the
 354 *              kernel when the range or resource was allocated
 355 */
 356struct fw_cdev_deallocate {
 357        __u32 handle;
 358};
 359
 360#define FW_CDEV_LONG_RESET      0
 361#define FW_CDEV_SHORT_RESET     1
 362
 363/**
 364 * struct fw_cdev_initiate_bus_reset - Initiate a bus reset
 365 * @type:       %FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET
 366 *
 367 * Initiate a bus reset for the bus this device is on.  The bus reset can be
 368 * either the original (long) bus reset or the arbitrated (short) bus reset
 369 * introduced in 1394a-2000.
 370 */
 371struct fw_cdev_initiate_bus_reset {
 372        __u32 type;     /* FW_CDEV_SHORT_RESET or FW_CDEV_LONG_RESET */
 373};
 374
 375/**
 376 * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM
 377 * @immediate:  If non-zero, immediate key to insert before pointer
 378 * @key:        Upper 8 bits of root directory pointer
 379 * @data:       Userspace pointer to contents of descriptor block
 380 * @length:     Length of descriptor block data, in bytes
 381 * @handle:     Handle to the descriptor, written by the kernel
 382 *
 383 * Add a descriptor block and optionally a preceding immediate key to the local
 384 * node's configuration ROM.
 385 *
 386 * The @key field specifies the upper 8 bits of the descriptor root directory
 387 * pointer and the @data and @length fields specify the contents. The @key
 388 * should be of the form 0xXX000000. The offset part of the root directory entry
 389 * will be filled in by the kernel.
 390 *
 391 * If not 0, the @immediate field specifies an immediate key which will be
 392 * inserted before the root directory pointer.
 393 *
 394 * If successful, the kernel adds the descriptor and writes back a handle to the
 395 * kernel-side object to be used for later removal of the descriptor block and
 396 * immediate key.
 397 *
 398 * This ioctl affects the configuration ROMs of all local nodes.
 399 * The ioctl only succeeds on device files which represent a local node.
 400 */
 401struct fw_cdev_add_descriptor {
 402        __u32 immediate;
 403        __u32 key;
 404        __u64 data;
 405        __u32 length;
 406        __u32 handle;
 407};
 408
 409/**
 410 * struct fw_cdev_remove_descriptor - Remove contents from the configuration ROM
 411 * @handle:     Handle to the descriptor, as returned by the kernel when the
 412 *              descriptor was added
 413 *
 414 * Remove a descriptor block and accompanying immediate key from the local
 415 * nodes' configuration ROMs.
 416 */
 417struct fw_cdev_remove_descriptor {
 418        __u32 handle;
 419};
 420
 421#define FW_CDEV_ISO_CONTEXT_TRANSMIT    0
 422#define FW_CDEV_ISO_CONTEXT_RECEIVE     1
 423
 424/**
 425 * struct fw_cdev_create_iso_context - Create a context for isochronous IO
 426 * @type:       %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE
 427 * @header_size: Header size to strip for receive contexts
 428 * @channel:    Channel to bind to
 429 * @speed:      Speed to transmit at
 430 * @closure:    To be returned in &fw_cdev_event_iso_interrupt
 431 * @handle:     Handle to context, written back by kernel
 432 *
 433 * Prior to sending or receiving isochronous I/O, a context must be created.
 434 * The context records information about the transmit or receive configuration
 435 * and typically maps to an underlying hardware resource.  A context is set up
 436 * for either sending or receiving.  It is bound to a specific isochronous
 437 * channel.
 438 *
 439 * If a context was successfully created, the kernel writes back a handle to the
 440 * context, which must be passed in for subsequent operations on that context.
 441 *
 442 * Note that the effect of a @header_size > 4 depends on
 443 * &fw_cdev_get_info.version, as documented at &fw_cdev_event_iso_interrupt.
 444 */
 445struct fw_cdev_create_iso_context {
 446        __u32 type;
 447        __u32 header_size;
 448        __u32 channel;
 449        __u32 speed;
 450        __u64 closure;
 451        __u32 handle;
 452};
 453
 454#define FW_CDEV_ISO_PAYLOAD_LENGTH(v)   (v)
 455#define FW_CDEV_ISO_INTERRUPT           (1 << 16)
 456#define FW_CDEV_ISO_SKIP                (1 << 17)
 457#define FW_CDEV_ISO_SYNC                (1 << 17)
 458#define FW_CDEV_ISO_TAG(v)              ((v) << 18)
 459#define FW_CDEV_ISO_SY(v)               ((v) << 20)
 460#define FW_CDEV_ISO_HEADER_LENGTH(v)    ((v) << 24)
 461
 462/**
 463 * struct fw_cdev_iso_packet - Isochronous packet
 464 * @control:    Contains the header length (8 uppermost bits), the sy field
 465 *              (4 bits), the tag field (2 bits), a sync flag (1 bit),
 466 *              a skip flag (1 bit), an interrupt flag (1 bit), and the
 467 *              payload length (16 lowermost bits)
 468 * @header:     Header and payload
 469 *
 470 * &struct fw_cdev_iso_packet is used to describe isochronous packet queues.
 471 *
 472 * Use the FW_CDEV_ISO_ macros to fill in @control.  The sy and tag fields are
 473 * specified by IEEE 1394a and IEC 61883.
 474 *
 475 * FIXME - finish this documentation
 476 */
 477struct fw_cdev_iso_packet {
 478        __u32 control;
 479        __u32 header[0];
 480};
 481
 482/**
 483 * struct fw_cdev_queue_iso - Queue isochronous packets for I/O
 484 * @packets:    Userspace pointer to packet data
 485 * @data:       Pointer into mmap()'ed payload buffer
 486 * @size:       Size of packet data in bytes
 487 * @handle:     Isochronous context handle
 488 *
 489 * Queue a number of isochronous packets for reception or transmission.
 490 * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs,
 491 * which describe how to transmit from or receive into a contiguous region
 492 * of a mmap()'ed payload buffer.  As part of the packet descriptors,
 493 * a series of headers can be supplied, which will be prepended to the
 494 * payload during DMA.
 495 *
 496 * The kernel may or may not queue all packets, but will write back updated
 497 * values of the @packets, @data and @size fields, so the ioctl can be
 498 * resubmitted easily.
 499 */
 500struct fw_cdev_queue_iso {
 501        __u64 packets;
 502        __u64 data;
 503        __u32 size;
 504        __u32 handle;
 505};
 506
 507#define FW_CDEV_ISO_CONTEXT_MATCH_TAG0           1
 508#define FW_CDEV_ISO_CONTEXT_MATCH_TAG1           2
 509#define FW_CDEV_ISO_CONTEXT_MATCH_TAG2           4
 510#define FW_CDEV_ISO_CONTEXT_MATCH_TAG3           8
 511#define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS      15
 512
 513/**
 514 * struct fw_cdev_start_iso - Start an isochronous transmission or reception
 515 * @cycle:      Cycle in which to start I/O.  If @cycle is greater than or
 516 *              equal to 0, the I/O will start on that cycle.
 517 * @sync:       Determines the value to wait for for receive packets that have
 518 *              the %FW_CDEV_ISO_SYNC bit set
 519 * @tags:       Tag filter bit mask.  Only valid for isochronous reception.
 520 *              Determines the tag values for which packets will be accepted.
 521 *              Use FW_CDEV_ISO_CONTEXT_MATCH_ macros to set @tags.
 522 * @handle:     Isochronous context handle within which to transmit or receive
 523 */
 524struct fw_cdev_start_iso {
 525        __s32 cycle;
 526        __u32 sync;
 527        __u32 tags;
 528        __u32 handle;
 529};
 530
 531/**
 532 * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception
 533 * @handle:     Handle of isochronous context to stop
 534 */
 535struct fw_cdev_stop_iso {
 536        __u32 handle;
 537};
 538
 539/**
 540 * struct fw_cdev_get_cycle_timer - read cycle timer register
 541 * @local_time:   system time, in microseconds since the Epoch
 542 * @cycle_timer:  isochronous cycle timer, as per OHCI 1.1 clause 5.13
 543 *
 544 * The %FW_CDEV_IOC_GET_CYCLE_TIMER ioctl reads the isochronous cycle timer
 545 * and also the system clock.  This allows to express the receive time of an
 546 * isochronous packet as a system time with microsecond accuracy.
 547 *
 548 * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and
 549 * 12 bits cycleOffset, in host byte order.
 550 */
 551struct fw_cdev_get_cycle_timer {
 552        __u64 local_time;
 553        __u32 cycle_timer;
 554};
 555
 556/**
 557 * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth
 558 * @closure:    Passed back to userspace in correponding iso resource events
 559 * @channels:   Isochronous channels of which one is to be (de)allocated
 560 * @bandwidth:  Isochronous bandwidth units to be (de)allocated
 561 * @handle:     Handle to the allocation, written by the kernel (only valid in
 562 *              case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls)
 563 *
 564 * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an
 565 * isochronous channel and/or of isochronous bandwidth at the isochronous
 566 * resource manager (IRM).  Only one of the channels specified in @channels is
 567 * allocated.  An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after
 568 * communication with the IRM, indicating success or failure in the event data.
 569 * The kernel will automatically reallocate the resources after bus resets.
 570 * Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event
 571 * will be sent.  The kernel will also automatically deallocate the resources
 572 * when the file descriptor is closed.
 573 *
 574 * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate
 575 * deallocation of resources which were allocated as described above.
 576 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
 577 *
 578 * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation
 579 * without automatic re- or deallocation.
 580 * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation,
 581 * indicating success or failure in its data.
 582 *
 583 * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like
 584 * %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed
 585 * instead of allocated.
 586 * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation.
 587 *
 588 * To summarize, %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE allocates iso resources
 589 * for the lifetime of the fd or handle.
 590 * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources
 591 * for the duration of a bus generation.
 592 *
 593 * @channels is a host-endian bitfield with the least significant bit
 594 * representing channel 0 and the most significant bit representing channel 63:
 595 * 1ULL << c for each channel c that is a candidate for (de)allocation.
 596 *
 597 * @bandwidth is expressed in bandwidth allocation units, i.e. the time to send
 598 * one quadlet of data (payload or header data) at speed S1600.
 599 */
 600struct fw_cdev_allocate_iso_resource {
 601        __u64 closure;
 602        __u64 channels;
 603        __u32 bandwidth;
 604        __u32 handle;
 605};
 606
 607/**
 608 * struct fw_cdev_send_stream_packet - send an asynchronous stream packet
 609 * @length:     Length of outgoing payload, in bytes
 610 * @tag:        Data format tag
 611 * @channel:    Isochronous channel to transmit to
 612 * @sy:         Synchronization code
 613 * @closure:    Passed back to userspace in the response event
 614 * @data:       Userspace pointer to payload
 615 * @generation: The bus generation where packet is valid
 616 * @speed:      Speed to transmit at
 617 *
 618 * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet
 619 * to every device which is listening to the specified channel.  The kernel
 620 * writes an &fw_cdev_event_response event which indicates success or failure of
 621 * the transmission.
 622 */
 623struct fw_cdev_send_stream_packet {
 624        __u32 length;
 625        __u32 tag;
 626        __u32 channel;
 627        __u32 sy;
 628        __u64 closure;
 629        __u64 data;
 630        __u32 generation;
 631        __u32 speed;
 632};
 633
 634#endif /* _LINUX_FIREWIRE_CDEV_H */
 635