aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/firewire-cdev.h
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2010-07-23 07:05:39 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2010-07-23 07:36:28 -0400
commit8e2b2b46ea4ca5ef790dddf78b360ed736a62d7c (patch)
tree35fb2be1225c5a4733d4be8c03bc5725f79b43c2 /include/linux/firewire-cdev.h
parent0c9ae701ae1caf657326db22d61074b40a747c9d (diff)
firewire: cdev: improve FW_CDEV_IOC_ALLOCATE
In both the ieee1394 stack and the firewire stack, the core treats kernelspace drivers better than userspace drivers when it comes to CSR address range allocation: The former may request a register to be placed automatically at a free spot anywhere inside a specified address range. The latter may only request a register at a fixed offset. Hence, userspace drivers which do not require a fixed offset potentially need to implement a retry loop with incremented offset in each retry until the kernel does not fail allocation with EBUSY. This awkward procedure is not fundamentally necessary as the core already provides a superior allocation API to kernelspace drivers. Therefore change the ioctl() ABI by addition of a region_end member in the existing struct fw_cdev_allocate. Userspace and kernelspace APIs work the same way now. There is a small cost to pay by clients though: If client source code is required to compile with older kernel headers too, then any use of the new member fw_cdev_allocate.region_end needs to be enclosed by #ifdef/#endif directives. However, any client program that seriously wants to use address range allocations will require a kernel of cdev ABI version >= 4 at runtime and a linux/firewire-cdev.h header of >= 4 anyway. This is because v4 brings FW_CDEV_EVENT_REQUEST2. The only client program in which build-time compatibility with struct fw_cdev_allocate as found in older kernel headers makes sense is libraw1394. (libraw1394 uses the older broken FW_CDEV_EVENT_REQUEST to implement a makeshift, incorrect transaction responder that does at least work somewhat in many simple scenarios, relying on guesswork by libraw1394 and by libraw1394 based applications. Plus, address range allocation and transaction responder is only one of many features that libraw1394 needs to provide, and these other features need to work with kernel and kernel-headers as old as possible. Any new linux/firewire-cdev.h based client that implements a transaction responder should never attempt to do it like libraw1394; instead it should make a header and kernel of v4 or later a hard requirement.) While we are at it, update the struct fw_cdev_allocate documentation to better reflect the recent fw_cdev_event_request2 ABI addition. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'include/linux/firewire-cdev.h')
-rw-r--r--include/linux/firewire-cdev.h29
1 files changed, 24 insertions, 5 deletions
diff --git a/include/linux/firewire-cdev.h b/include/linux/firewire-cdev.h
index da0fec7e8dc0..14831119ff71 100644
--- a/include/linux/firewire-cdev.h
+++ b/include/linux/firewire-cdev.h
@@ -394,6 +394,7 @@ union fw_cdev_event {
394 * 4 (2.6.36) - added %FW_CDEV_EVENT_REQUEST2, %FW_CDEV_EVENT_PHY_PACKET_* 394 * 4 (2.6.36) - added %FW_CDEV_EVENT_REQUEST2, %FW_CDEV_EVENT_PHY_PACKET_*
395 * - implemented &fw_cdev_event_bus_reset.bm_node_id 395 * - implemented &fw_cdev_event_bus_reset.bm_node_id
396 * - added %FW_CDEV_IOC_SEND_PHY_PACKET, _RECEIVE_PHY_PACKETS 396 * - added %FW_CDEV_IOC_SEND_PHY_PACKET, _RECEIVE_PHY_PACKETS
397 * - added &fw_cdev_allocate.region_end
397 */ 398 */
398#define FW_CDEV_VERSION 3 /* Meaningless; don't use this macro. */ 399#define FW_CDEV_VERSION 3 /* Meaningless; don't use this macro. */
399 400
@@ -473,17 +474,21 @@ struct fw_cdev_send_response {
473}; 474};
474 475
475/** 476/**
476 * struct fw_cdev_allocate - Allocate a CSR address range 477 * struct fw_cdev_allocate - Allocate a CSR in an address range
477 * @offset: Start offset of the address range 478 * @offset: Start offset of the address range
478 * @closure: To be passed back to userspace in request events 479 * @closure: To be passed back to userspace in request events
479 * @length: Length of the address range, in bytes 480 * @length: Length of the CSR, in bytes
480 * @handle: Handle to the allocation, written by the kernel 481 * @handle: Handle to the allocation, written by the kernel
482 * @region_end: First address above the address range (added in ABI v4, 2.6.36)
481 * 483 *
482 * Allocate an address range in the 48-bit address space on the local node 484 * Allocate an address range in the 48-bit address space on the local node
483 * (the controller). This allows userspace to listen for requests with an 485 * (the controller). This allows userspace to listen for requests with an
484 * offset within that address range. When the kernel receives a request 486 * offset within that address range. Every time when the kernel receives a
485 * within the range, an &fw_cdev_event_request event will be written back. 487 * request within the range, an &fw_cdev_event_request2 event will be emitted.
486 * The @closure field is passed back to userspace in the response event. 488 * (If the kernel or the client implements ABI version <= 3, an
489 * &fw_cdev_event_request will be generated instead.)
490 *
491 * The @closure field is passed back to userspace in these request events.
487 * The @handle field is an out parameter, returning a handle to the allocated 492 * The @handle field is an out parameter, returning a handle to the allocated
488 * range to be used for later deallocation of the range. 493 * range to be used for later deallocation of the range.
489 * 494 *
@@ -491,12 +496,26 @@ struct fw_cdev_send_response {
491 * is exclusive except for the FCP command and response registers. If an 496 * is exclusive except for the FCP command and response registers. If an
492 * exclusive address region is already in use, the ioctl fails with errno set 497 * exclusive address region is already in use, the ioctl fails with errno set
493 * to %EBUSY. 498 * to %EBUSY.
499 *
500 * If kernel and client implement ABI version >= 4, the kernel looks up a free
501 * spot of size @length inside [@offset..@region_end) and, if found, writes
502 * the start address of the new CSR back in @offset. I.e. @offset is an
503 * in and out parameter. If this automatic placement of a CSR in a bigger
504 * address range is not desired, the client simply needs to set @region_end
505 * = @offset + @length.
506 *
507 * If the kernel or the client implements ABI version <= 3, @region_end is
508 * ignored and effectively assumed to be @offset + @length.
509 *
510 * @region_end is only present in a kernel header >= 2.6.36. If necessary,
511 * this can for example be tested by #ifdef FW_CDEV_EVENT_REQUEST2.
494 */ 512 */
495struct fw_cdev_allocate { 513struct fw_cdev_allocate {
496 __u64 offset; 514 __u64 offset;
497 __u64 closure; 515 __u64 closure;
498 __u32 length; 516 __u32 length;
499 __u32 handle; 517 __u32 handle;
518 __u64 region_end; /* available since kernel version 2.6.36 */
500}; 519};
501 520
502/** 521/**