1224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* 2224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Char device interface. 3224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 4224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Copyright (C) 2005-2007 Kristian Hoegsberg <krh@bitplanet.net> 5224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 6224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Permission is hereby granted, free of charge, to any person obtaining a 7224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * copy of this software and associated documentation files (the "Software"), 8224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * to deal in the Software without restriction, including without limitation 9224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and/or sell copies of the Software, and to permit persons to whom the 11224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Software is furnished to do so, subject to the following conditions: 12224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 13224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The above copyright notice and this permission notice (including the next 14224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * paragraph) shall be included in all copies or substantial portions of the 15224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Software. 16224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 17224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * DEALINGS IN THE SOFTWARE. 24224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 25224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 26224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#ifndef _LINUX_FIREWIRE_CDEV_H 27224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define _LINUX_FIREWIRE_CDEV_H 28224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 29224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/ioctl.h> 30224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/types.h> 31224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#include <linux/firewire-constants.h> 32224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 33224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.22 */ 34224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_BUS_RESET 0x00 35224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_RESPONSE 0x01 36224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_REQUEST 0x02 37224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_ISO_INTERRUPT 0x03 38224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 39224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.30 */ 40224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED 0x04 41224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 0x05 42224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 43224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.36 */ 44224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_REQUEST2 0x06 45224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_PHY_PACKET_SENT 0x07 46224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_PHY_PACKET_RECEIVED 0x08 47224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL 0x09 48224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 49224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 50224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_common - Common part of all fw_cdev_event_ types 51224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: For arbitrary use by userspace 52224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: Discriminates the fw_cdev_event_ types 53224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 54224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This struct may be used to access generic members of all fw_cdev_event_ 55224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * types regardless of the specific type. 56224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 57224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Data passed in the @closure field for a request will be returned in the 58224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * corresponding event. It is big enough to hold a pointer on all platforms. 59224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl used to set @closure depends on the @type of event. 60224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 61224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_common { 62224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 63224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 64224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 65224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 66224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 67224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred 68224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl 69224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET 70224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @node_id: New node ID of this node 71224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @local_node_id: Node ID of the local node, i.e. of the controller 72224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bm_node_id: Node ID of the bus manager 73224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @irm_node_id: Node ID of the iso resource manager 74224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @root_node_id: Node ID of the root node 75224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation: New bus generation 76224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 77224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent when the bus the device belongs to goes through a bus 78224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * reset. It provides information about the new bus configuration, such as 79224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * new node ID for this device, new root ID, and others. 80224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 81224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If @bm_node_id is 0xffff right after bus reset it can be reread by an 82224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_GET_INFO ioctl after bus manager selection was finished. 83224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Kernels with ABI version < 4 do not set @bm_node_id. 84224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 85224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_bus_reset { 86224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 87224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 88224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 node_id; 89224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 local_node_id; 90224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 bm_node_id; 91224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 irm_node_id; 92224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 root_node_id; 93224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 generation; 94224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 95224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 96224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 97224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_response - Sent when a response packet was received 98224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST 99224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST 100224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl 101224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE 102224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @rcode: Response code returned by the remote node 103224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Data length, i.e. the response's payload size in bytes 104224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Payload data, if any 105224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 106224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent when the stack receives a response to an outgoing request 107224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl. The payload data for responses 108224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * carrying data (read and lock responses) follows immediately and can be 109224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * accessed through the @data field. 110224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 111224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The event is also generated after conclusions of transactions that do not 112224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * involve response packets. This includes unified write transactions, 113224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * broadcast write transactions, and transmission of asynchronous stream 114224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packets. @rcode indicates success or failure of such transmissions. 115224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 116224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_response { 117224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 118224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 119224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 rcode; 120224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 121224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 data[0]; 122224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 123224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 124224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 125224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_request - Old version of &fw_cdev_event_request2 126224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST 127224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 128224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent instead of &fw_cdev_event_request2 if the kernel or 129224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the client implements ABI version <= 3. &fw_cdev_event_request lacks 130224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * essential information; use &fw_cdev_event_request2 instead. 131224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 132224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_request { 133224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 134224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 135224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 tcode; 136224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 offset; 137224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 138224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 139224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 data[0]; 140224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 141224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 142224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 143224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_request2 - Sent on incoming request to an address region 144224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl 145224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2 146224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tcode: Transaction code of the incoming request 147224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @offset: The offset into the 48-bit per-node address space 148224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @source_node_id: Sender node ID 149224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @destination_node_id: Destination node ID 150224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @card: The index of the card from which the request came 151224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation: Bus generation in which the request is valid 152224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Reference to the kernel-side pending request 153224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Data length, i.e. the request's payload size in bytes 154224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Incoming data, if any 155224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 156224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent when the stack receives an incoming request to an address 157224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl. The request is 158224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * guaranteed to be completely contained in the specified region. Userspace is 159224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl, 160224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * using the same @handle. 161224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 162224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The payload data for requests carrying data (write and lock requests) 163224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * follows immediately and can be accessed through the @data field. 164224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 165224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Unlike &fw_cdev_event_request, @tcode of lock requests is one of the 166224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * firewire-core specific %TCODE_LOCK_MASK_SWAP...%TCODE_LOCK_VENDOR_DEPENDENT, 167224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * i.e. encodes the extended transaction code. 168224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 169224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @card may differ from &fw_cdev_get_info.card because requests are received 170224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * from all cards of the Linux host. @source_node_id, @destination_node_id, and 171224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation pertain to that card. Destination node ID and bus generation may 172224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * therefore differ from the corresponding fields of the last 173224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_bus_reset. 174224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 175224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @destination_node_id may also differ from the current node ID because of a 176224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * non-local bus ID part or in case of a broadcast write request. Note, a 177224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * client must call an %FW_CDEV_IOC_SEND_RESPONSE ioctl even in case of a 178224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * broadcast write request; the kernel will then release the kernel-side pending 179224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * request but will not actually send a response packet. 180224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 181224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In case of a write request to FCP_REQUEST or FCP_RESPONSE, the kernel already 182224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * sent a write response immediately after the request was received; in this 183224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * case the client must still call an %FW_CDEV_IOC_SEND_RESPONSE ioctl to 184224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * release the kernel-side pending request, though another response won't be 185224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * sent. 186224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 187224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If the client subsequently needs to initiate requests to the sender node of 188224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * an &fw_cdev_event_request2, it needs to use a device file with matching 189224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * card index, node ID, and generation for outbound requests. 190224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 191224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_request2 { 192224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 193224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 194224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 tcode; 195224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 offset; 196224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 source_node_id; 197224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 destination_node_id; 198224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 card; 199224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 generation; 200224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 201224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 202224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 data[0]; 203224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 204224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 205224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 206224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed 207224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; 208224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl 209224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT 210224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @cycle: Cycle counter of the last completed packet 211224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @header_length: Total length of following headers, in bytes 212224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @header: Stripped headers, if any 213224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 214224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent when the controller has completed an &fw_cdev_iso_packet 215224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with 216224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets 217224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * without the interrupt bit set that the kernel's internal buffer for @header 218e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * is about to overflow. (In the last case, ABI versions < 5 drop header data 219e084501669a4e4931c9d648351ecd7d595b81b79Christopher Ferris * up to the next interrupt packet.) 220224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 221224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): 222224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 223224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In version 3 and some implementations of version 2 of the ABI, &header_length 224224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * is a multiple of 4 and &header contains timestamps of all packets up until 225224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the interrupt packet. The format of the timestamps is as described below for 226224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * isochronous reception. In version 1 of the ABI, &header_length was 0. 227224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 228224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Isochronous receive events (context type %FW_CDEV_ISO_CONTEXT_RECEIVE): 229224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 230224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The headers stripped of all packets up until and including the interrupt 231224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packet are returned in the @header field. The amount of header data per 232224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packet is as specified at iso context creation by 233224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_create_iso_context.header_size. 234224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 235224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Hence, _interrupt.header_length / _context.header_size is the number of 236224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packets received in this interrupt event. The client can now iterate 237224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * through the mmap()'ed DMA buffer according to this number of packets and 238224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * to the buffer sizes as the client specified in &fw_cdev_queue_iso. 239224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 240224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Since version 2 of this ABI, the portion for each packet in _interrupt.header 241224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * consists of the 1394 isochronous packet header, followed by a timestamp 242224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * quadlet if &fw_cdev_create_iso_context.header_size > 4, followed by quadlets 243224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * from the packet payload if &fw_cdev_create_iso_context.header_size > 8. 244224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 245224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Format of 1394 iso packet header: 16 bits data_length, 2 bits tag, 6 bits 246224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * channel, 4 bits tcode, 4 bits sy, in big endian byte order. 247224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * data_length is the actual received size of the packet without the four 248224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1394 iso packet header bytes. 249224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 250224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Format of timestamp: 16 bits invalid, 3 bits cycleSeconds, 13 bits 251224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * cycleCount, in big endian byte order. 252224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 253224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In version 1 of the ABI, no timestamp quadlet was inserted; instead, payload 254224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * data followed directly after the 1394 is header if header_size > 4. 255224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2. 256224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 257224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_iso_interrupt { 258224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 259224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 260224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 cycle; 261224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 header_length; 262224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 header[0]; 263224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 264224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 265224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 266224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_iso_interrupt_mc - An iso buffer chunk was completed 267224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; 268224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl 269224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL 270224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @completed: Offset into the receive buffer; data before this offset is valid 271224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 272224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This event is sent in multichannel contexts (context type 273224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL) for &fw_cdev_iso_packet buffer 274224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * chunks that have been completely filled and that have the 275224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_ISO_INTERRUPT bit set, or when explicitly requested with 276224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_FLUSH_ISO. 277224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 278224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The buffer is continuously filled with the following data, per packet: 279224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - the 1394 iso packet header as described at &fw_cdev_event_iso_interrupt, 280224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * but in little endian byte order, 281224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - packet payload (as many bytes as specified in the data_length field of 282224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the 1394 iso packet header) in big endian byte order, 283224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - 0...3 padding bytes as needed to align the following trailer quadlet, 284224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - trailer quadlet, containing the reception timestamp as described at 285224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_iso_interrupt, but in little endian byte order. 286224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 287224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Hence the per-packet size is data_length (rounded up to a multiple of 4) + 8. 288224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * When processing the data, stop before a packet that would cross the 289224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @completed offset. 290224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 291224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * A packet near the end of a buffer chunk will typically spill over into the 292224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * next queued buffer chunk. It is the responsibility of the client to check 293224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for this condition, assemble a broken-up packet from its parts, and not to 294224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * re-queue any buffer chunks in which as yet unread packet parts reside. 295224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 296224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_iso_interrupt_mc { 297224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 298224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 299224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 completed; 300224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 301224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 302224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 303224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed 304224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; 305224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * set by %FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE) ioctl 306224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or 307224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 308224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Reference by which an allocated resource can be deallocated 309224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channel: Isochronous channel which was (de)allocated, if any 310224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bandwidth: Bandwidth allocation units which were (de)allocated, if any 311224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 312224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous 313224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * resource was allocated at the IRM. The client has to check @channel and 314224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bandwidth for whether the allocation actually succeeded. 315224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 316224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous 317224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * resource was deallocated at the IRM. It is also sent when automatic 318224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * reallocation after a bus reset failed. 319224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 320224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channel is <0 if no channel was (de)allocated or if reallocation failed. 321224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed. 322224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 323224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_iso_resource { 324224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 325224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 326224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 327224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s32 channel; 328224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s32 bandwidth; 329224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 330224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 331224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 332224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_event_phy_packet - A PHY packet was transmitted or received 333224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET 334224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl 335224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: %FW_CDEV_EVENT_PHY_PACKET_SENT or %..._RECEIVED 336224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @rcode: %RCODE_..., indicates success or failure of transmission 337224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Data length in bytes 338224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Incoming data 339224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 340224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If @type is %FW_CDEV_EVENT_PHY_PACKET_SENT, @length is 0 and @data empty, 341224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * except in case of a ping packet: Then, @length is 4, and @data[0] is the 342224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ping time in 49.152MHz clocks if @rcode is %RCODE_COMPLETE. 343224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 344224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If @type is %FW_CDEV_EVENT_PHY_PACKET_RECEIVED, @length is 8 and @data 345224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * consists of the two PHY packet quadlets, in host byte order. 346224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 347224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_event_phy_packet { 348224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 349224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 350224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 rcode; 351224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 352224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 data[0]; 353224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 354224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 355224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 356224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * union fw_cdev_event - Convenience union of fw_cdev_event_ types 357224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @common: Valid for all types 358224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bus_reset: Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET 359224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @response: Valid if @common.type == %FW_CDEV_EVENT_RESPONSE 360224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @request: Valid if @common.type == %FW_CDEV_EVENT_REQUEST 361224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @request2: Valid if @common.type == %FW_CDEV_EVENT_REQUEST2 362224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @iso_interrupt: Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT 363224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @iso_interrupt_mc: Valid if @common.type == 364224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL 365224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @iso_resource: Valid if @common.type == 366224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or 367224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED 368224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @phy_packet: Valid if @common.type == 369224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_PHY_PACKET_SENT or 370224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_PHY_PACKET_RECEIVED 371224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 372224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Convenience union for userspace use. Events could be read(2) into an 373224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * appropriately aligned char buffer and then cast to this union for further 374224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * processing. Note that for a request, response or iso_interrupt event, 375224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the data[] or header[] may make the size of the full event larger than 376224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * sizeof(union fw_cdev_event). Also note that if you attempt to read(2) 377224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * an event into a buffer that is not large enough for it, the data that does 378224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * not fit will be discarded so that the next read(2) will return a new event. 379224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 380224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengunion fw_cdev_event { 381224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_common common; 382224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_bus_reset bus_reset; 383224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_response response; 384224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_request request; 385224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_request2 request2; /* added in 2.6.36 */ 386224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_iso_interrupt iso_interrupt; 387224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_iso_interrupt_mc iso_interrupt_mc; /* added in 2.6.36 */ 388224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_iso_resource iso_resource; /* added in 2.6.30 */ 389224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng struct fw_cdev_event_phy_packet phy_packet; /* added in 2.6.36 */ 390224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 391224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 392224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.22 */ 393224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_GET_INFO _IOWR('#', 0x00, struct fw_cdev_get_info) 394224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SEND_REQUEST _IOW('#', 0x01, struct fw_cdev_send_request) 395224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_ALLOCATE _IOWR('#', 0x02, struct fw_cdev_allocate) 396224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_DEALLOCATE _IOW('#', 0x03, struct fw_cdev_deallocate) 397224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SEND_RESPONSE _IOW('#', 0x04, struct fw_cdev_send_response) 398224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_INITIATE_BUS_RESET _IOW('#', 0x05, struct fw_cdev_initiate_bus_reset) 399224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_ADD_DESCRIPTOR _IOWR('#', 0x06, struct fw_cdev_add_descriptor) 400224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_REMOVE_DESCRIPTOR _IOW('#', 0x07, struct fw_cdev_remove_descriptor) 401224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_CREATE_ISO_CONTEXT _IOWR('#', 0x08, struct fw_cdev_create_iso_context) 402224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_QUEUE_ISO _IOWR('#', 0x09, struct fw_cdev_queue_iso) 403224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_START_ISO _IOW('#', 0x0a, struct fw_cdev_start_iso) 404224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_STOP_ISO _IOW('#', 0x0b, struct fw_cdev_stop_iso) 405224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 406224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.24 */ 407224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_GET_CYCLE_TIMER _IOR('#', 0x0c, struct fw_cdev_get_cycle_timer) 408224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 409224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.30 */ 410224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE _IOWR('#', 0x0d, struct fw_cdev_allocate_iso_resource) 411224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE _IOW('#', 0x0e, struct fw_cdev_deallocate) 412224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x0f, struct fw_cdev_allocate_iso_resource) 413224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE _IOW('#', 0x10, struct fw_cdev_allocate_iso_resource) 414224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_GET_SPEED _IO('#', 0x11) /* returns speed code */ 415224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SEND_BROADCAST_REQUEST _IOW('#', 0x12, struct fw_cdev_send_request) 416224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SEND_STREAM_PACKET _IOW('#', 0x13, struct fw_cdev_send_stream_packet) 417224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 418224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.34 */ 419224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_GET_CYCLE_TIMER2 _IOWR('#', 0x14, struct fw_cdev_get_cycle_timer2) 420224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 421224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 2.6.36 */ 422224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SEND_PHY_PACKET _IOWR('#', 0x15, struct fw_cdev_send_phy_packet) 423224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_RECEIVE_PHY_PACKETS _IOW('#', 0x16, struct fw_cdev_receive_phy_packets) 424224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_SET_ISO_CHANNELS _IOW('#', 0x17, struct fw_cdev_set_iso_channels) 425224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 426224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* available since kernel version 3.4 */ 427224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_IOC_FLUSH_ISO _IOW('#', 0x18, struct fw_cdev_flush_iso) 428224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 429224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/* 430224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ABI version history 431224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1 (2.6.22) - initial version 432224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (2.6.24) - added %FW_CDEV_IOC_GET_CYCLE_TIMER 433224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 2 (2.6.30) - changed &fw_cdev_event_iso_interrupt.header if 434224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_create_iso_context.header_size is 8 or more 435224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - added %FW_CDEV_IOC_*_ISO_RESOURCE*, 436224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_GET_SPEED, %FW_CDEV_IOC_SEND_BROADCAST_REQUEST, 437224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_SEND_STREAM_PACKET 438224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (2.6.32) - added time stamp to xmit &fw_cdev_event_iso_interrupt 439224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (2.6.33) - IR has always packet-per-buffer semantics now, not one of 440224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * dual-buffer or packet-per-buffer depending on hardware 441224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - shared use and auto-response for FCP registers 442224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 3 (2.6.34) - made &fw_cdev_get_cycle_timer reliable 443224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - added %FW_CDEV_IOC_GET_CYCLE_TIMER2 444224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 4 (2.6.36) - added %FW_CDEV_EVENT_REQUEST2, %FW_CDEV_EVENT_PHY_PACKET_*, 445224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and &fw_cdev_allocate.region_end 446224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - implemented &fw_cdev_event_bus_reset.bm_node_id 447224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - added %FW_CDEV_IOC_SEND_PHY_PACKET, _RECEIVE_PHY_PACKETS 448224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - added %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL, 449224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL, and 450224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_SET_ISO_CHANNELS 451224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 5 (3.4) - send %FW_CDEV_EVENT_ISO_INTERRUPT events when needed to 452224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * avoid dropping data 453224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * - added %FW_CDEV_IOC_FLUSH_ISO 454224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 455224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 456224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 457224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_get_info - General purpose information ioctl 458224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @version: The version field is just a running serial number. Both an 459224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * input parameter (ABI version implemented by the client) and 460224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * output parameter (ABI version implemented by the kernel). 461224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * A client shall fill in the ABI @version for which the client 462224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * was implemented. This is necessary for forward compatibility. 463224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @rom_length: If @rom is non-zero, up to @rom_length bytes of Configuration 464224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ROM will be copied into that user space address. In either 465224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * case, @rom_length is updated with the actual length of the 466224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Configuration ROM. 467224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @rom: If non-zero, address of a buffer to be filled by a copy of the 468224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * device's Configuration ROM 469224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bus_reset: If non-zero, address of a buffer to be filled by a 470224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &struct fw_cdev_event_bus_reset with the current state 471224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * of the bus. This does not cause a bus reset to happen. 472224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bus_reset_closure: Value of &closure in this and subsequent bus reset events 473224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @card: The index of the card this device belongs to 474224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 475224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_GET_INFO ioctl is usually the very first one which a client 476224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * performs right after it opened a /dev/fw* file. 477224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 478224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * As a side effect, reception of %FW_CDEV_EVENT_BUS_RESET events to be read(2) 479224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * is started by this ioctl. 480224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 481224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_get_info { 482224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 version; 483224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 rom_length; 484224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 rom; 485224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 bus_reset; 486224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 bus_reset_closure; 487224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 card; 488224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 489224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 490224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 491224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_send_request - Send an asynchronous request packet 492224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tcode: Transaction code of the request 493224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Length of outgoing payload, in bytes 494224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @offset: 48-bit offset at destination node 495224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: Passed back to userspace in the response event 496224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Userspace pointer to payload 497224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation: The bus generation where packet is valid 498224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 499224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Send a request to the device. This ioctl implements all outgoing requests. 500224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Both quadlet and block request specify the payload as a pointer to the data 501224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * in the @data field. Once the transaction completes, the kernel writes an 502224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_response event back. The @closure field is passed back to 503224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * user space in the response event. 504224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 505224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_send_request { 506224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 tcode; 507224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 508224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 offset; 509224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 510224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 data; 511224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 generation; 512224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 513224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 514224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 515224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_send_response - Send an asynchronous response packet 516224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @rcode: Response code as determined by the userspace handler 517224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Length of outgoing payload, in bytes 518224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Userspace pointer to payload 519224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: The handle from the &fw_cdev_event_request 520224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 521224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Send a response to an incoming request. By setting up an address range using 522224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the %FW_CDEV_IOC_ALLOCATE ioctl, userspace can listen for incoming requests. An 523224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * incoming request will generate an %FW_CDEV_EVENT_REQUEST, and userspace must 524224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * send a reply using this ioctl. The event has a handle to the kernel-side 525224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * pending transaction, which should be used with this ioctl. 526224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 527224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_send_response { 528224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 rcode; 529224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 530224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 data; 531224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 532224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 533224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 534224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 535224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_allocate - Allocate a CSR in an address range 536224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @offset: Start offset of the address range 537224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: To be passed back to userspace in request events 538224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Length of the CSR, in bytes 539224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to the allocation, written by the kernel 540224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @region_end: First address above the address range (added in ABI v4, 2.6.36) 541224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 542224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Allocate an address range in the 48-bit address space on the local node 543224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (the controller). This allows userspace to listen for requests with an 544224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * offset within that address range. Every time when the kernel receives a 545224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * request within the range, an &fw_cdev_event_request2 event will be emitted. 546224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * (If the kernel or the client implements ABI version <= 3, an 547224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_request will be generated instead.) 548224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 549224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @closure field is passed back to userspace in these request events. 550224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @handle field is an out parameter, returning a handle to the allocated 551224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * range to be used for later deallocation of the range. 552224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 553224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The address range is allocated on all local nodes. The address allocation 554224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * is exclusive except for the FCP command and response registers. If an 555224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * exclusive address region is already in use, the ioctl fails with errno set 556224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * to %EBUSY. 557224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 558224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If kernel and client implement ABI version >= 4, the kernel looks up a free 559224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * spot of size @length inside [@offset..@region_end) and, if found, writes 560224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the start address of the new CSR back in @offset. I.e. @offset is an 561224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * in and out parameter. If this automatic placement of a CSR in a bigger 562224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * address range is not desired, the client simply needs to set @region_end 563224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * = @offset + @length. 564224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 565224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If the kernel or the client implements ABI version <= 3, @region_end is 566224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * ignored and effectively assumed to be @offset + @length. 567224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 568224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @region_end is only present in a kernel header >= 2.6.36. If necessary, 569224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * this can for example be tested by #ifdef FW_CDEV_EVENT_REQUEST2. 570224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 571224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_allocate { 572224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 offset; 573224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 574224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 575224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 576224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 region_end; /* available since kernel version 2.6.36 */ 577224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 578224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 579224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 580224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_deallocate - Free a CSR address range or isochronous resource 581224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to the address range or iso resource, as returned by the 582224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * kernel when the range or resource was allocated 583224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 584224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_deallocate { 585224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 586224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 587224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 588224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_LONG_RESET 0 589224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_SHORT_RESET 1 590224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 591224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 592224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_initiate_bus_reset - Initiate a bus reset 593224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: %FW_CDEV_SHORT_RESET or %FW_CDEV_LONG_RESET 594224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 595224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Initiate a bus reset for the bus this device is on. The bus reset can be 596224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * either the original (long) bus reset or the arbitrated (short) bus reset 597224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * introduced in 1394a-2000. 598224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 599224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl returns immediately. A subsequent &fw_cdev_event_bus_reset 600224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * indicates when the reset actually happened. Since ABI v4, this may be 601224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * considerably later than the ioctl because the kernel ensures a grace period 602224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * between subsequent bus resets as per IEEE 1394 bus management specification. 603224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 604224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_initiate_bus_reset { 605224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 606224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 607224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 608224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 609224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_add_descriptor - Add contents to the local node's config ROM 610224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @immediate: If non-zero, immediate key to insert before pointer 611224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @key: Upper 8 bits of root directory pointer 612224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Userspace pointer to contents of descriptor block 613224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Length of descriptor block data, in quadlets 614224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to the descriptor, written by the kernel 615224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 616224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Add a descriptor block and optionally a preceding immediate key to the local 617224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * node's Configuration ROM. 618224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 619224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @key field specifies the upper 8 bits of the descriptor root directory 620224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * pointer and the @data and @length fields specify the contents. The @key 621224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * should be of the form 0xXX000000. The offset part of the root directory entry 622224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * will be filled in by the kernel. 623224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 624224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If not 0, the @immediate field specifies an immediate key which will be 625224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * inserted before the root directory pointer. 626224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 627224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @immediate, @key, and @data array elements are CPU-endian quadlets. 628224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 629224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If successful, the kernel adds the descriptor and writes back a @handle to 630224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the kernel-side object to be used for later removal of the descriptor block 631224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and immediate key. The kernel will also generate a bus reset to signal the 632224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * change of the Configuration ROM to other nodes. 633224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 634224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This ioctl affects the Configuration ROMs of all local nodes. 635224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl only succeeds on device files which represent a local node. 636224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 637224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_add_descriptor { 638224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 immediate; 639224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 key; 640224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 data; 641224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 642224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 643224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 644224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 645224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 646224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_remove_descriptor - Remove contents from the Configuration ROM 647224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to the descriptor, as returned by the kernel when the 648224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * descriptor was added 649224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 650224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Remove a descriptor block and accompanying immediate key from the local 651224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * nodes' Configuration ROMs. The kernel will also generate a bus reset to 652224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * signal the change of the Configuration ROM to other nodes. 653224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 654224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_remove_descriptor { 655224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 656224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 657224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 658224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_TRANSMIT 0 659224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_RECEIVE 1 660224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL 2 /* added in 2.6.36 */ 661224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 662224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 663224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_create_iso_context - Create a context for isochronous I/O 664224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @type: %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE or 665224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL 666224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @header_size: Header size to strip in single-channel reception 667224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channel: Channel to bind to in single-channel reception or transmission 668224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @speed: Transmission speed 669224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: To be returned in &fw_cdev_event_iso_interrupt or 670224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_iso_interrupt_multichannel 671224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to context, written back by kernel 672224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 673224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Prior to sending or receiving isochronous I/O, a context must be created. 674224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The context records information about the transmit or receive configuration 675224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and typically maps to an underlying hardware resource. A context is set up 676224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for either sending or receiving. It is bound to a specific isochronous 677224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channel. 678224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 679224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In case of multichannel reception, @header_size and @channel are ignored 680224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and the channels are selected by %FW_CDEV_IOC_SET_ISO_CHANNELS. 681224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 682224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * For %FW_CDEV_ISO_CONTEXT_RECEIVE contexts, @header_size must be at least 4 683224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and must be a multiple of 4. It is ignored in other context types. 684224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 685224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @speed is ignored in receive context types. 686224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 687224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If a context was successfully created, the kernel writes back a handle to the 688224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * context, which must be passed in for subsequent operations on that context. 689224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 690224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Limitations: 691224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * No more than one iso context can be created per fd. 692224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The total number of contexts that all userspace and kernelspace drivers can 693224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * create on a card at a time is a hardware limit, typically 4 or 8 contexts per 694224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * direction, and of them at most one multichannel receive context. 695224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 696224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_create_iso_context { 697224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 type; 698224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 header_size; 699224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 channel; 700224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 speed; 701224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 702224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 703224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 704224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 705224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 706224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_set_iso_channels - Select channels in multichannel reception 707224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channels: Bitmask of channels to listen to 708224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle of the mutichannel receive context 709224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 710224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channels is the bitwise or of 1ULL << n for each channel n to listen to. 711224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 712224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl fails with errno %EBUSY if there is already another receive context 713224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * on a channel in @channels. In that case, the bitmask of all unoccupied 714224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * channels is returned in @channels. 715224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 716224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_set_iso_channels { 717224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 channels; 718224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 719224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 720224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 721224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_PAYLOAD_LENGTH(v) (v) 722224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_INTERRUPT (1 << 16) 723224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_SKIP (1 << 17) 724224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_SYNC (1 << 17) 725224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_TAG(v) ((v) << 18) 726224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_SY(v) ((v) << 20) 727224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_HEADER_LENGTH(v) ((v) << 24) 728224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 729224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 730224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_iso_packet - Isochronous packet 731224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control: Contains the header length (8 uppermost bits), 732224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the sy field (4 bits), the tag field (2 bits), a sync flag 733224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * or a skip flag (1 bit), an interrupt flag (1 bit), and the 734224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * payload length (16 lowermost bits) 735224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @header: Header and payload in case of a transmit context. 736224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 737224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &struct fw_cdev_iso_packet is used to describe isochronous packet queues. 738224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Use the FW_CDEV_ISO_ macros to fill in @control. 739224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @header array is empty in case of receive contexts. 740224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 741224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Context type %FW_CDEV_ISO_CONTEXT_TRANSMIT: 742224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 743224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control.HEADER_LENGTH must be a multiple of 4. It specifies the numbers of 744224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * bytes in @header that will be prepended to the packet's payload. These bytes 745224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * are copied into the kernel and will not be accessed after the ioctl has 746224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * returned. 747224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 748224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @control.SY and TAG fields are copied to the iso packet header. These 749224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * fields are specified by IEEE 1394a and IEC 61883-1. 750224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 751224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @control.SKIP flag specifies that no packet is to be sent in a frame. 752224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * When using this, all other fields except @control.INTERRUPT must be zero. 753224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 754224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * When a packet with the @control.INTERRUPT flag set has been completed, an 755224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_iso_interrupt event will be sent. 756224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 757224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE: 758224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 759224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control.HEADER_LENGTH must be a multiple of the context's header_size. 760224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If the HEADER_LENGTH is larger than the context's header_size, multiple 761224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packets are queued for this entry. 762224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 763224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The @control.SY and TAG fields are ignored. 764224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 765224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If the @control.SYNC flag is set, the context drops all packets until a 766224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * packet with a sy field is received which matches &fw_cdev_start_iso.sync. 767224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 768224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control.PAYLOAD_LENGTH defines how many payload bytes can be received for 769224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * one packet (in addition to payload quadlets that have been defined as headers 770224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and are stripped and returned in the &fw_cdev_event_iso_interrupt structure). 771224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * If more bytes are received, the additional bytes are dropped. If less bytes 772224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * are received, the remaining bytes in this part of the payload buffer will not 773224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * be written to, not even by the next packet. I.e., packets received in 774224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * consecutive frames will not necessarily be consecutive in memory. If an 775224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * entry has queued multiple packets, the PAYLOAD_LENGTH is divided equally 776224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * among them. 777224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 778224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * When a packet with the @control.INTERRUPT flag set has been completed, an 779224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * &fw_cdev_event_iso_interrupt event will be sent. An entry that has queued 780224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * multiple receive packets is completed when its last packet is completed. 781224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 782224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Context type %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL: 783224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 784224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Here, &fw_cdev_iso_packet would be more aptly named _iso_buffer_chunk since 785224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * it specifies a chunk of the mmap()'ed buffer, while the number and alignment 786224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * of packets to be placed into the buffer chunk is not known beforehand. 787224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 788224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control.PAYLOAD_LENGTH is the size of the buffer chunk and specifies room 789224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for header, payload, padding, and trailer bytes of one or more packets. 790224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * It must be a multiple of 4. 791224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 792224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @control.HEADER_LENGTH, TAG and SY are ignored. SYNC is treated as described 793224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for single-channel reception. 794224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 795224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * When a buffer chunk with the @control.INTERRUPT flag set has been filled 796224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * entirely, an &fw_cdev_event_iso_interrupt_mc event will be sent. 797224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 798224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_iso_packet { 799224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 control; 800224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 header[0]; 801224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 802224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 803224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 804224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_queue_iso - Queue isochronous packets for I/O 805224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @packets: Userspace pointer to an array of &fw_cdev_iso_packet 806224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Pointer into mmap()'ed payload buffer 807224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @size: Size of the @packets array, in bytes 808224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Isochronous context handle 809224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 810224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Queue a number of isochronous packets for reception or transmission. 811224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This ioctl takes a pointer to an array of &fw_cdev_iso_packet structs, 812224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * which describe how to transmit from or receive into a contiguous region 813224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * of a mmap()'ed payload buffer. As part of transmit packet descriptors, 814224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * a series of headers can be supplied, which will be prepended to the 815224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * payload during DMA. 816224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 817224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The kernel may or may not queue all packets, but will write back updated 818224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * values of the @packets, @data and @size fields, so the ioctl can be 819224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * resubmitted easily. 820224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 821224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In case of a multichannel receive context, @data must be quadlet-aligned 822224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * relative to the buffer start. 823224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 824224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_queue_iso { 825224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 packets; 826224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 data; 827224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 size; 828224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 829224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 830224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 831224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_MATCH_TAG0 1 832224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_MATCH_TAG1 2 833224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_MATCH_TAG2 4 834224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_MATCH_TAG3 8 835224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_ISO_CONTEXT_MATCH_ALL_TAGS 15 836224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 837224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 838224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_start_iso - Start an isochronous transmission or reception 839224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @cycle: Cycle in which to start I/O. If @cycle is greater than or 840224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * equal to 0, the I/O will start on that cycle. 841224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @sync: Determines the value to wait for for receive packets that have 842224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the %FW_CDEV_ISO_SYNC bit set 843224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tags: Tag filter bit mask. Only valid for isochronous reception. 844224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Determines the tag values for which packets will be accepted. 845224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Use FW_CDEV_ISO_CONTEXT_MATCH_ macros to set @tags. 846224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Isochronous context handle within which to transmit or receive 847224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 848224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_start_iso { 849224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s32 cycle; 850224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 sync; 851224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 tags; 852224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 853224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 854224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 855224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 856224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_stop_iso - Stop an isochronous transmission or reception 857224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle of isochronous context to stop 858224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 859224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_stop_iso { 860224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 861224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 862224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 863224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 864224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_flush_iso - flush completed iso packets 865224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: handle of isochronous context to flush 866224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 867224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * For %FW_CDEV_ISO_CONTEXT_TRANSMIT or %FW_CDEV_ISO_CONTEXT_RECEIVE contexts, 868224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * report any completed packets. 869224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 870224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * For %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL contexts, report the current 871224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * offset in the receive buffer, if it has changed; this is typically in the 872224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * middle of some buffer chunk. 873224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 874224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Any %FW_CDEV_EVENT_ISO_INTERRUPT or %FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL 875224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * events generated by this ioctl are sent synchronously, i.e., are available 876224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for reading from the file descriptor when this ioctl returns. 877224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 878224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_flush_iso { 879224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 880224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 881224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 882224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 883224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_get_cycle_timer - read cycle timer register 884224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @local_time: system time, in microseconds since the Epoch 885224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @cycle_timer: Cycle Time register contents 886224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 887224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Same as %FW_CDEV_IOC_GET_CYCLE_TIMER2, but fixed to use %CLOCK_REALTIME 888224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and only with microseconds resolution. 889224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 890224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In version 1 and 2 of the ABI, this ioctl returned unreliable (non- 891224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * monotonic) @cycle_timer values on certain controllers. 892224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 893224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_get_cycle_timer { 894224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 local_time; 895224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 cycle_timer; 896224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 897224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 898224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 899224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_get_cycle_timer2 - read cycle timer register 900224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tv_sec: system time, seconds 901224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tv_nsec: system time, sub-seconds part in nanoseconds 902224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @clk_id: input parameter, clock from which to get the system time 903224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @cycle_timer: Cycle Time register contents 904224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 905224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_GET_CYCLE_TIMER2 ioctl reads the isochronous cycle timer 906224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and also the system clock. This allows to correlate reception time of 907224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * isochronous packets with system time. 908224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 909224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @clk_id lets you choose a clock like with POSIX' clock_gettime function. 910224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Supported @clk_id values are POSIX' %CLOCK_REALTIME and %CLOCK_MONOTONIC 911224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * and Linux' %CLOCK_MONOTONIC_RAW. 912224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 913224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @cycle_timer consists of 7 bits cycleSeconds, 13 bits cycleCount, and 914224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 12 bits cycleOffset, in host byte order. Cf. the Cycle Time register 915224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * per IEEE 1394 or Isochronous Cycle Timer register per OHCI-1394. 916224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 917224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_get_cycle_timer2 { 918224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s64 tv_sec; 919224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s32 tv_nsec; 920224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __s32 clk_id; 921224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 cycle_timer; 922224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 923224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 924224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 925224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_allocate_iso_resource - (De)allocate a channel or bandwidth 926224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: Passed back to userspace in corresponding iso resource events 927224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channels: Isochronous channels of which one is to be (de)allocated 928224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bandwidth: Isochronous bandwidth units to be (de)allocated 929224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @handle: Handle to the allocation, written by the kernel (only valid in 930224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * case of %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctls) 931224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 932224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE ioctl initiates allocation of an 933224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * isochronous channel and/or of isochronous bandwidth at the isochronous 934224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * resource manager (IRM). Only one of the channels specified in @channels is 935224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * allocated. An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED is sent after 936224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * communication with the IRM, indicating success or failure in the event data. 937224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The kernel will automatically reallocate the resources after bus resets. 938224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * Should a reallocation fail, an %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event 939224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * will be sent. The kernel will also automatically deallocate the resources 940224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * when the file descriptor is closed. 941224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 942224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE ioctl can be used to initiate 943224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * deallocation of resources which were allocated as described above. 944224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation. 945224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 946224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE ioctl is a variant of allocation 947224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * without automatic re- or deallocation. 948224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event concludes this operation, 949224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * indicating success or failure in its data. 950224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 951224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_DEALLOCATE_ISO_RESOURCE_ONCE ioctl works like 952224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE except that resources are freed 953224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * instead of allocated. 954224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event concludes this operation. 955224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 956224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * To summarize, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE allocates iso resources 957224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for the lifetime of the fd or @handle. 958224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * In contrast, %FW_CDEV_IOC_ALLOCATE_ISO_RESOURCE_ONCE allocates iso resources 959224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * for the duration of a bus generation. 960224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 961224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channels is a host-endian bitfield with the least significant bit 962224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * representing channel 0 and the most significant bit representing channel 63: 963224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1ULL << c for each channel c that is a candidate for (de)allocation. 964224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 965224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @bandwidth is expressed in bandwidth allocation units, i.e. the time to send 966224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * one quadlet of data (payload or header data) at speed S1600. 967224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 968224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_allocate_iso_resource { 969224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 970224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 channels; 971224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 bandwidth; 972224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 handle; 973224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 974224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 975224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 976224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_send_stream_packet - send an asynchronous stream packet 977224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @length: Length of outgoing payload, in bytes 978224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @tag: Data format tag 979224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @channel: Isochronous channel to transmit to 980224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @sy: Synchronization code 981224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: Passed back to userspace in the response event 982224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: Userspace pointer to payload 983224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation: The bus generation where packet is valid 984224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @speed: Speed to transmit at 985224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 986224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl sends an asynchronous stream packet 987224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * to every device which is listening to the specified channel. The kernel 988224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * writes an &fw_cdev_event_response event which indicates success or failure of 989224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * the transmission. 990224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 991224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_send_stream_packet { 992224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 length; 993224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 tag; 994224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 channel; 995224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 sy; 996224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 997224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 data; 998224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 generation; 999224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 speed; 1000224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 1001224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 1002224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 1003224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_send_phy_packet - send a PHY packet 1004224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: Passed back to userspace in the PHY-packet-sent event 1005224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data: First and second quadlet of the PHY packet 1006224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @generation: The bus generation where packet is valid 1007224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1008224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The %FW_CDEV_IOC_SEND_PHY_PACKET ioctl sends a PHY packet to all nodes 1009224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * on the same card as this device. After transmission, an 1010224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * %FW_CDEV_EVENT_PHY_PACKET_SENT event is generated. 1011224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1012224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The payload @data[] shall be specified in host byte order. Usually, 1013224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @data[1] needs to be the bitwise inverse of @data[0]. VersaPHY packets 1014224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * are an exception to this rule. 1015224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1016224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl is only permitted on device files which represent a local node. 1017224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 1018224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_send_phy_packet { 1019224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 1020224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 data[2]; 1021224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u32 generation; 1022224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 1023224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 1024224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng/** 1025224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * struct fw_cdev_receive_phy_packets - start reception of PHY packets 1026224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * @closure: Passed back to userspace in phy packet events 1027224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1028224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * This ioctl activates issuing of %FW_CDEV_EVENT_PHY_PACKET_RECEIVED due to 1029224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * incoming PHY packets from any node on the same bus as the device. 1030224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * 1031224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng * The ioctl is only permitted on device files which represent a local node. 1032224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng */ 1033224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Chengstruct fw_cdev_receive_phy_packets { 1034224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng __u64 closure; 1035224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng}; 1036224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 1037224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#define FW_CDEV_VERSION 3 /* Meaningless legacy macro; don't use it. */ 1038224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng 1039224b54f69543a5c0ec18f99bd717d2b724582eb6Ben Cheng#endif /* _LINUX_FIREWIRE_CDEV_H */ 1040