1179 lines · 49.5 KB · C
RawDownload
/* * Char device interface. * * Copyright (C) 2005-2007  Kristian Hoegsberg <krh@bitplanet.net> * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef _LINUX_FIREWIRE_CDEV_H#define _LINUX_FIREWIRE_CDEV_H #include <linux/ioctl.h>#include <linux/types.h>#include <linux/firewire-constants.h> /* available since kernel version 2.6.22 */#define FW_CDEV_EVENT_BUS_RESET				0x00#define FW_CDEV_EVENT_RESPONSE				0x01#define FW_CDEV_EVENT_REQUEST				0x02#define FW_CDEV_EVENT_ISO_INTERRUPT			0x03 /* available since kernel version 2.6.30 */#define FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED		0x04#define FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED		0x05 /* available since kernel version 2.6.36 */#define FW_CDEV_EVENT_REQUEST2				0x06#define FW_CDEV_EVENT_PHY_PACKET_SENT			0x07#define FW_CDEV_EVENT_PHY_PACKET_RECEIVED		0x08#define FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL	0x09 /* available since kernel version 6.5 */#define FW_CDEV_EVENT_REQUEST3				0x0a#define FW_CDEV_EVENT_RESPONSE2				0x0b#define FW_CDEV_EVENT_PHY_PACKET_SENT2			0x0c#define FW_CDEV_EVENT_PHY_PACKET_RECEIVED2		0x0d /** * struct fw_cdev_event_common - Common part of all fw_cdev_event_* types * @closure:	For arbitrary use by userspace * @type:	Discriminates the fw_cdev_event_* types * * This struct may be used to access generic members of all fw_cdev_event_* * types regardless of the specific type. * * Data passed in the @closure field for a request will be returned in the * corresponding event.  It is big enough to hold a pointer on all platforms. * The ioctl used to set @closure depends on the @type of event. */struct fw_cdev_event_common {	__u64 closure;	__u32 type;}; /** * struct fw_cdev_event_bus_reset - Sent when a bus reset occurred * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_GET_INFO ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_BUS_RESET * @node_id:       New node ID of this node * @local_node_id: Node ID of the local node, i.e. of the controller * @bm_node_id:    Node ID of the bus manager * @irm_node_id:   Node ID of the iso resource manager * @root_node_id:  Node ID of the root node * @generation:    New bus generation * * This event is sent when the bus the device belongs to goes through a bus * reset.  It provides information about the new bus configuration, such as * new node ID for this device, new root ID, and others. * * If @bm_node_id is 0xffff right after bus reset it can be reread by an * %FW_CDEV_IOC_GET_INFO ioctl after bus manager selection was finished. * Kernels with ABI version < 4 do not set @bm_node_id. */struct fw_cdev_event_bus_reset {	__u64 closure;	__u32 type;	__u32 node_id;	__u32 local_node_id;	__u32 bm_node_id;	__u32 irm_node_id;	__u32 root_node_id;	__u32 generation;}; /** * struct fw_cdev_event_response - Sent when a response packet was received * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST *		or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST *		or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE * @rcode:	Response code returned by the remote node * @length:	Data length, i.e. the response's payload size in bytes * @data:	Payload data, if any * * This event is sent instead of &fw_cdev_event_response if the kernel or the client implements * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_response2. */struct fw_cdev_event_response {	__u64 closure;	__u32 type;	__u32 rcode;	__u32 length;	__u32 data[];}; /** * struct fw_cdev_event_response2 - Sent when a response packet was received * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_REQUEST *		or %FW_CDEV_IOC_SEND_BROADCAST_REQUEST *		or %FW_CDEV_IOC_SEND_STREAM_PACKET ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_RESPONSE * @rcode:	Response code returned by the remote node * @length:	Data length, i.e. the response's payload size in bytes * @request_tstamp:	The time stamp of isochronous cycle at which the request was sent. * @response_tstamp:	The time stamp of isochronous cycle at which the response was sent. * @padding:	Padding to keep the size of structure as multiples of 8 in various architectures *		since 4 byte alignment is used for 8 byte of object type in System V ABI for i386 *		architecture. * @data:	Payload data, if any * * This event is sent when the stack receives a response to an outgoing request * sent by %FW_CDEV_IOC_SEND_REQUEST ioctl.  The payload data for responses * carrying data (read and lock responses) follows immediately and can be * accessed through the @data field. * * The event is also generated after conclusions of transactions that do not * involve response packets.  This includes unified write transactions, * broadcast write transactions, and transmission of asynchronous stream * packets.  @rcode indicates success or failure of such transmissions. * * The value of @request_tstamp expresses the isochronous cycle at which the request was sent to * initiate the transaction. The value of @response_tstamp expresses the isochronous cycle at which * the response arrived to complete the transaction. Each value is unsigned 16 bit integer * containing three low order bits of second field and all 13 bits of cycle field in format of * CYCLE_TIMER register. */struct fw_cdev_event_response2 {	__u64 closure;	__u32 type;	__u32 rcode;	__u32 length;	__u32 request_tstamp;	__u32 response_tstamp;	__u32 padding;	__u32 data[];}; /** * struct fw_cdev_event_request - Old version of &fw_cdev_event_request2 * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST * @tcode:	Transaction code of the incoming request * @offset:	The offset into the 48-bit per-node address space * @handle:	Reference to the kernel-side pending request * @length:	Data length, i.e. the request's payload size in bytes * @data:	Incoming data, if any * * This event is sent instead of &fw_cdev_event_request2 if the kernel or * the client implements ABI version <= 3.  &fw_cdev_event_request lacks * essential information; use &fw_cdev_event_request2 instead. */struct fw_cdev_event_request {	__u64 closure;	__u32 type;	__u32 tcode;	__u64 offset;	__u32 handle;	__u32 length;	__u32 data[];}; /** * struct fw_cdev_event_request2 - Sent on incoming request to an address region * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2 * @tcode:	Transaction code of the incoming request * @offset:	The offset into the 48-bit per-node address space * @source_node_id: Sender node ID * @destination_node_id: Destination node ID * @card:	The index of the card from which the request came * @generation:	Bus generation in which the request is valid * @handle:	Reference to the kernel-side pending request * @length:	Data length, i.e. the request's payload size in bytes * @data:	Incoming data, if any * * This event is sent instead of &fw_cdev_event_request3 if the kernel or the client implements * ABI version <= 5. It has the lack of time stamp field comparing to &fw_cdev_event_request3. */struct fw_cdev_event_request2 {	__u64 closure;	__u32 type;	__u32 tcode;	__u64 offset;	__u32 source_node_id;	__u32 destination_node_id;	__u32 card;	__u32 generation;	__u32 handle;	__u32 length;	__u32 data[];}; /** * struct fw_cdev_event_request3 - Sent on incoming request to an address region * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_ALLOCATE ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_REQUEST2 * @tcode:	Transaction code of the incoming request * @offset:	The offset into the 48-bit per-node address space * @source_node_id: Sender node ID * @destination_node_id: Destination node ID * @card:	The index of the card from which the request came * @generation:	Bus generation in which the request is valid * @handle:	Reference to the kernel-side pending request * @length:	Data length, i.e. the request's payload size in bytes * @tstamp:	The time stamp of isochronous cycle at which the request arrived. * @padding:	Padding to keep the size of structure as multiples of 8 in various architectures *		since 4 byte alignment is used for 8 byte of object type in System V ABI for i386 *		architecture. * @data:	Incoming data, if any * * This event is sent when the stack receives an incoming request to an address * region registered using the %FW_CDEV_IOC_ALLOCATE ioctl.  The request is * guaranteed to be completely contained in the specified region.  Userspace is * responsible for sending the response by %FW_CDEV_IOC_SEND_RESPONSE ioctl, * using the same @handle. * * The payload data for requests carrying data (write and lock requests) * follows immediately and can be accessed through the @data field. * * Unlike &fw_cdev_event_request, @tcode of lock requests is one of the * firewire-core specific %TCODE_LOCK_MASK_SWAP...%TCODE_LOCK_VENDOR_DEPENDENT, * i.e. encodes the extended transaction code. * * @card may differ from &fw_cdev_get_info.card because requests are received * from all cards of the Linux host.  @source_node_id, @destination_node_id, and * @generation pertain to that card.  Destination node ID and bus generation may * therefore differ from the corresponding fields of the last * &fw_cdev_event_bus_reset. * * @destination_node_id may also differ from the current node ID because of a * non-local bus ID part or in case of a broadcast write request.  Note, a * client must call an %FW_CDEV_IOC_SEND_RESPONSE ioctl even in case of a * broadcast write request; the kernel will then release the kernel-side pending * request but will not actually send a response packet. * * In case of a write request to FCP_REQUEST or FCP_RESPONSE, the kernel already * sent a write response immediately after the request was received; in this * case the client must still call an %FW_CDEV_IOC_SEND_RESPONSE ioctl to * release the kernel-side pending request, though another response won't be * sent. * * If the client subsequently needs to initiate requests to the sender node of * an &fw_cdev_event_request3, it needs to use a device file with matching * card index, node ID, and generation for outbound requests. * * @tstamp is isochronous cycle at which the request arrived. It is 16 bit integer value and the * higher 3 bits expresses three low order bits of second field in the format of CYCLE_TIME * register and the rest 13 bits expresses cycle field. */struct fw_cdev_event_request3 {	__u64 closure;	__u32 type;	__u32 tcode;	__u64 offset;	__u32 source_node_id;	__u32 destination_node_id;	__u32 card;	__u32 generation;	__u32 handle;	__u32 length;	__u32 tstamp;	__u32 padding;	__u32 data[];}; /** * struct fw_cdev_event_iso_interrupt - Sent when an iso packet was completed * @closure:	See &fw_cdev_event_common; *		set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl * @type:	See &fw_cdev_event_common; always %FW_CDEV_EVENT_ISO_INTERRUPT * @cycle:	Cycle counter of the last completed packet * @header_length: Total length of following headers, in bytes * @header:	Stripped headers, if any * * This event is sent when the controller has completed an &fw_cdev_iso_packet * with the %FW_CDEV_ISO_INTERRUPT bit set, when explicitly requested with * %FW_CDEV_IOC_FLUSH_ISO, or when there have been so many completed packets * without the interrupt bit set that the kernel's internal buffer for @header * is about to overflow.  (In the last case, ABI versions < 5 drop header data * up to the next interrupt packet.) * * Isochronous transmit events (context type %FW_CDEV_ISO_CONTEXT_TRANSMIT): * * In version 3 and some implementations of version 2 of the ABI, &header_length * is a multiple of 4 and &header contains timestamps of all packets up until * the interrupt packet.  The format of the timestamps is as described below for * isochronous reception.  In version 1 of the ABI, &header_length was 0. * * Isochronous receive events (context type %FW_CDEV_ISO_CONTEXT_RECEIVE): * * The headers stripped of all packets up until and including the interrupt * packet are returned in the @header field.  The amount of header data per * packet is as specified at iso context creation by * &fw_cdev_create_iso_context.header_size. * * Hence, _interrupt.header_length / _context.header_size is the number of * packets received in this interrupt event.  The client can now iterate * through the mmap()'ed DMA buffer according to this number of packets and * to the buffer sizes as the client specified in &fw_cdev_queue_iso. * * Since version 2 of this ABI, the portion for each packet in _interrupt.header * consists of the 1394 isochronous packet header, followed by a timestamp * quadlet if &fw_cdev_create_iso_context.header_size > 4, followed by quadlets * from the packet payload if &fw_cdev_create_iso_context.header_size > 8. * * Format of 1394 iso packet header:  16 bits data_length, 2 bits tag, 6 bits * channel, 4 bits tcode, 4 bits sy, in big endian byte order. * data_length is the actual received size of the packet without the four * 1394 iso packet header bytes. * * Format of timestamp:  16 bits invalid, 3 bits cycleSeconds, 13 bits * cycleCount, in big endian byte order. * * In version 1 of the ABI, no timestamp quadlet was inserted; instead, payload * data followed directly after the 1394 is header if header_size > 4. * Behaviour of ver. 1 of this ABI is no longer available since ABI ver. 2. */struct fw_cdev_event_iso_interrupt {	__u64 closure;	__u32 type;	__u32 cycle;	__u32 header_length;	__u32 header[];}; /** * struct fw_cdev_event_iso_interrupt_mc - An iso buffer chunk was completed * @closure:	See &fw_cdev_event_common; *		set by %FW_CDEV_CREATE_ISO_CONTEXT ioctl * @type:	%FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL * @completed:	Offset into the receive buffer; data before this offset is valid * * This event is sent in multichannel contexts (context type * %FW_CDEV_ISO_CONTEXT_RECEIVE_MULTICHANNEL) for &fw_cdev_iso_packet buffer * chunks that have been completely filled and that have the * %FW_CDEV_ISO_INTERRUPT bit set, or when explicitly requested with * %FW_CDEV_IOC_FLUSH_ISO. * * The buffer is continuously filled with the following data, per packet: *  - the 1394 iso packet header as described at &fw_cdev_event_iso_interrupt, *    but in little endian byte order, *  - packet payload (as many bytes as specified in the data_length field of *    the 1394 iso packet header) in big endian byte order, *  - 0...3 padding bytes as needed to align the following trailer quadlet, *  - trailer quadlet, containing the reception timestamp as described at *    &fw_cdev_event_iso_interrupt, but in little endian byte order. * * Hence the per-packet size is data_length (rounded up to a multiple of 4) + 8. * When processing the data, stop before a packet that would cross the * @completed offset. * * A packet near the end of a buffer chunk will typically spill over into the * next queued buffer chunk.  It is the responsibility of the client to check * for this condition, assemble a broken-up packet from its parts, and not to * re-queue any buffer chunks in which as yet unread packet parts reside. */struct fw_cdev_event_iso_interrupt_mc {	__u64 closure;	__u32 type;	__u32 completed;}; /** * struct fw_cdev_event_iso_resource - Iso resources were allocated or freed * @closure:	See &fw_cdev_event_common; *		set by``FW_CDEV_IOC_(DE)ALLOCATE_ISO_RESOURCE(_ONCE)`` ioctl * @type:	%FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or *		%FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED * @handle:	Reference by which an allocated resource can be deallocated * @channel:	Isochronous channel which was (de)allocated, if any * @bandwidth:	Bandwidth allocation units which were (de)allocated, if any * * An %FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED event is sent after an isochronous * resource was allocated at the IRM.  The client has to check @channel and * @bandwidth for whether the allocation actually succeeded. * * An %FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED event is sent after an isochronous * resource was deallocated at the IRM.  It is also sent when automatic * reallocation after a bus reset failed. * * @channel is <0 if no channel was (de)allocated or if reallocation failed. * @bandwidth is 0 if no bandwidth was (de)allocated or if reallocation failed. */struct fw_cdev_event_iso_resource {	__u64 closure;	__u32 type;	__u32 handle;	__s32 channel;	__s32 bandwidth;}; /** * struct fw_cdev_event_phy_packet - A PHY packet was transmitted or received * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET *		or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl * @type:	%FW_CDEV_EVENT_PHY_PACKET_SENT or %..._RECEIVED * @rcode:	%RCODE_..., indicates success or failure of transmission * @length:	Data length in bytes * @data:	Incoming data for %FW_CDEV_IOC_RECEIVE_PHY_PACKETS. For %FW_CDEV_IOC_SEND_PHY_PACKET *		the field has the same data in the request, thus the length of 8 bytes. * * This event is sent instead of &fw_cdev_event_phy_packet2 if the kernel or * the client implements ABI version <= 5. It has the lack of time stamp field comparing to * &fw_cdev_event_phy_packet2. */struct fw_cdev_event_phy_packet {	__u64 closure;	__u32 type;	__u32 rcode;	__u32 length;	__u32 data[];}; /** * struct fw_cdev_event_phy_packet2 - A PHY packet was transmitted or received with time stamp. * @closure:	See &fw_cdev_event_common; set by %FW_CDEV_IOC_SEND_PHY_PACKET *		or %FW_CDEV_IOC_RECEIVE_PHY_PACKETS ioctl * @type:	%FW_CDEV_EVENT_PHY_PACKET_SENT2 or %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2 * @rcode:	%RCODE_..., indicates success or failure of transmission * @length:	Data length in bytes * @tstamp:	For %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, the time stamp of isochronous cycle at *		which the packet arrived. For %FW_CDEV_EVENT_PHY_PACKET_SENT2 and non-ping packet, *		the time stamp of isochronous cycle at which the packet was sent. For ping packet, *		the tick count for round-trip time measured by 1394 OHCI controller. * The time stamp of isochronous cycle at which either the response was sent for *		%FW_CDEV_EVENT_PHY_PACKET_SENT2 or the request arrived for *		%FW_CDEV_EVENT_PHY_PACKET_RECEIVED2. * @data:	Incoming data * * If @type is %FW_CDEV_EVENT_PHY_PACKET_SENT2, @length is 8 and @data consists of the two PHY * packet quadlets to be sent, in host byte order, * * If @type is %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, @length is 8 and @data consists of the two PHY * packet quadlets, in host byte order. * * For %FW_CDEV_EVENT_PHY_PACKET_RECEIVED2, the @tstamp is the isochronous cycle at which the * packet arrived. It is 16 bit integer value and the higher 3 bits expresses three low order bits * of second field and the rest 13 bits expresses cycle field in the format of CYCLE_TIME register. * * For %FW_CDEV_EVENT_PHY_PACKET_SENT2, the @tstamp has different meanings whether to sent the * packet for ping or not. If it's not for ping, the @tstamp is the isochronous cycle at which the * packet was sent, and use the same format as the case of %FW_CDEV_EVENT_PHY_PACKET_SENT2. If it's * for ping, the @tstamp is for round-trip time measured by 1394 OHCI controller with 42.195 MHz * resolution. */struct fw_cdev_event_phy_packet2 {	__u64 closure;	__u32 type;	__u32 rcode;	__u32 length;	__u32 tstamp;	__u32 data[];}; /** * union fw_cdev_event - Convenience union of fw_cdev_event_* types * @common:		Valid for all types * @bus_reset:		Valid if @common.type == %FW_CDEV_EVENT_BUS_RESET * @response:		Valid if @common.type == %FW_CDEV_EVENT_RESPONSE * @request:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST * @request2:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST2 * @iso_interrupt:	Valid if @common.type == %FW_CDEV_EVENT_ISO_INTERRUPT * @iso_interrupt_mc:	Valid if @common.type == *				%FW_CDEV_EVENT_ISO_INTERRUPT_MULTICHANNEL * @iso_resource:	Valid if @common.type == *				%FW_CDEV_EVENT_ISO_RESOURCE_ALLOCATED or *				%FW_CDEV_EVENT_ISO_RESOURCE_DEALLOCATED * @phy_packet:		Valid if @common.type == *				%FW_CDEV_EVENT_PHY_PACKET_SENT or *				%FW_CDEV_EVENT_PHY_PACKET_RECEIVED * * @request3:		Valid if @common.type == %FW_CDEV_EVENT_REQUEST3 * @response2:		Valid if @common.type == %FW_CDEV_EVENT_RESPONSE2

Lines 1–500 of 1179.