aboutsummaryrefslogtreecommitdiff
path: root/drivers/firewire
AgeCommit message (Collapse)AuthorFilesLines
2009-03-24firewire: cdev: secure add_descriptor ioctlStefan Richter1-0/+8
The access permissions and ownership or ACL of /dev/fw* character device files will typically be set based on the device type of the respective nodes, as obtained by firewire-core from descriptors in the device's configuration ROM. An example policy is to deny write permission by default but grant write permission to files of AV/C video and audio devices and IIDC video devices. The FW_CDEV_IOC_ADD_DESCRIPTOR ioctl could be used to partly subvert such a policy: Find a device file with relaxed permissions, use the ioctl to add a descriptor with AV/C marker to the local node's ROM, thus gain access to the local node's character device file. (This is only possible if there are udev scripts installed which actively relax permissions for known device types and if there is a device of such a type connected.) Accessibility of the local node's device file is relevant to host security if the host contains two or more IEEE 1394 link layer controllers which are plugged into a single bus. Therefore change the ABI to deny FW_CDEV_IOC_ADD_DESCRIPTOR if the file belongs to a remote node. (This change has no impact on known implementers of the ABI: None of them uses the ioctl yet.) Also clarify the documentation: The ioctl affects all local nodes, not just one local node. Cc: [email protected] Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: amendment to "add ioctl to query maximum transmission speed"Stefan Richter1-5/+6
The as yet unreleased FW_CDEV_IOC_GET_SPEED ioctl puts only a single integer into the parameter buffer. We can use ioctl()'s return value instead. (Also: Some whitespace change in firewire-cdev.h.) Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: broadcast channel supportJay Fenlason3-6/+177
This patch adds the ISO broadcast channel support that is required of a 1394a IRM. In specific, if the local device the IRM, it allocates ISO channel 31 and sets the broadcast channel register of all devices on the local bus to BROADCAST_CHANNEL_INITIAL | BROADCAST_CHANNEL_VALID to indicate that channel 31 can be use for broadcast messages. One minor complication is that on startup the local device may become IRM before all the devices on the bus have been enumerated by the stack. Therefore we have to keep a "the local device is IRM" flag and possibly set the broadcast channel register of new devices at enumeration time. Signed-off-by: Jay Fenlason <[email protected]> Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: implement asynchronous stream transmissionJay Fenlason4-2/+81
Allow userspace and other firewire drivers (fw-ipv4 I'm looking at you!) to send Asynchronous Transmit Streams as described in 7.8.3 of release 1.1 of the 1394 Open Host Controller Interface Specification. Signed-off-by: Jay Fenlason <[email protected]> Signed-off-by: Stefan Richter <[email protected]> (tweaks)
2009-03-24firewire: core: normalize a function argument nameStefan Richter2-5/+5
It's called "payload" rather than "data" almost everywhere in fw-transaction.c. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: normalize a variable nameStefan Richter4-12/+16
Standardize on if (err) handle_error; and if (ret < 0) handle_error; Don't call a variable err if we store values in it which mean success. Also, offset some return statements by a blank line since this how we do it in drivers/firewire. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: remove condition which is always falseStefan Richter1-1/+1
reread_bus_info_block() only gets to see devices whose config_rom_length is at least 6 (ROM header, bus info block, root directory header). Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: move some functionsStefan Richter1-46/+44
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: clean up includesStefan Richter2-11/+22
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: simplify a schedule_delayed_work wrapperStefan Richter1-12/+6
The kernel API documentation says that queue_delayed_work() returns 0 (only) if the work was already queued. The return codes of schedule_delayed_work() are not documented but the same. In init_iso_resource(), the work has never been queued yet, hence we can assume schedule_delayed_work() to be a guaranteed success there. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: add ioctls for iso resource management, amendmentStefan Richter2-17/+23
Some fixes: - Remove stale documentation. - Fix a != vs. == thinko that got in the way of channel management. - Try bandwidth deallocation even if channel deallocation failed. A simplification: - fw_cdev_allocate_iso_resource.channels is now ordered like libdc1394's dc1394_iso_allocate_channel() channels_allowed argument. By the way, I looked closer at cards from NEC, TI, and VIA, and noticed that they all don't implement IEEE 1394a behaviour which is meant to deviate from IEEE 1212's notion of lock compare-swap. This means that we have to do two lock transactions instead of one in many cases where one transaction would already succeed on a fully 1394a compliant IRM. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: shut down iso context before freeing the bufferStefan Richter1-3/+3
DMA must be halted before we DMA-unmap and free the DMA buffer. Since we cannot rely on the client to stop the context before it closes the fd, we have to reorder fw_iso_buffer_destroy vs. fw_iso_context_destroy. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: replace some spin_lock_irqsave by spin_lock_irqStefan Richter1-12/+8
All of these functions are entered with IRQs enabled. Hence the unconditional spin_unlock_irq can be used. Function: Caller context: dequeue_event() client process, via read(2) fill_bus_reset_event() fw-device.c update worqueue job release_client_resource() client process, via ioctl(2) fw_device_op_release() client process, via close(2) Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: extend transaction payload size checkStefan Richter1-3/+2
Make the size check of ioctl_send_request and ioctl_send_broadcast_request speed dependent. Also change the error return code from -EINVAL to -EIO to distinguish this from other errors concerning the ioctl parameters. Another payload size limit for which we don't check here though is the remote node's Bus_Info_Block.max_rec. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: restrict broadcast write requests to Units SpaceStefan Richter1-0/+4
We don't want random users write to Memory Space (e.g. PCs with physical DMA filters down) or to core CSRs like Reset_Start. This does not protect SBP-2 target CSRs. But properly behaving SBP-2 targets ignore broadcast write requests to these registers, and the maximum damage which can happen with laxer targets is DOS. But there are ways to create DOS situations anyway if there are devices with weak device file permissions (like audio/video devices) present at the same bus as an SBP-2 target. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: add ioctl for broadcast write requestsJay Fenlason, Stefan Richter1-27/+47
Write transactions to the broadcast node ID are a convenient way to trigger functions of multiple nodes at once. IIDC is a protocol which can make use of this if multiple cameras with same command_regs_base are connected at the same bus. Based on Date: Wed, 10 Sep 2008 11:32:16 -0400 From: Jay Fenlason <[email protected]> Subject: [patch] SEND_BROADCAST_REQUEST Changes: ioctl_send_request() and ioctl_send_broadcast_request() now share code. Broadcast speed corrected to S100. Check for proper tcode. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: add ioctl to query maximum transmission speedStefan Richter1-0/+10
While the speed of asynchronous transactions is automatically chosen by the kernel, the speed of isochronous streams has to be chosen by the initiating client. In case of 1394a bus topologies, the maximum possible speed could be figured out with some effort by evaluation of the remote node's link speed field in the config ROM, the local node's link speed field, and the PHY speeds and topologic information in the local node's or IRM's topology map CSR. However, this does not work in case of 1394b buses. Hence add an ioctl to export the maximum speed which the kernel already determined. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: add ioctls for manual iso resource managementStefan Richter1-13/+54
This adds ioctls for allocation and deallocation of a channel or/and bandwidth without auto-reallocation and without auto-deallocation. The benefit of these ioctls is that libraw1394-style isochronous resource management can be implemented without write access to the IRM's character device file. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: add ioctls for isochronous resource managementJay Fenlason, Stefan Richter3-7/+388
Based on Date: Tue, 18 Nov 2008 11:41:27 -0500 From: Jay Fenlason <[email protected]> Subject: [Patch V4] Add ISO resource management support with several changes to the ABI and implementation. Only the part of the ABI which enables auto-reallocation and auto-deallocation is included here. This implements ioctls for kernel-assisted allocation of isochronous channels and isochronous bandwidth. The benefits are: - The client does not have to have write access to the /dev/fw* device corresponding to the IRM. - The client does not have to perform reallocation after bus resets. - Channel and bandwidth are deallocated by the kernel if the file is closed before the client deallocated the resources. Thus resources are released even if the client crashes. It is anticipated that future in-kernel code (firewire-core IRM code; the firewire port of firedtv), will use the fw-iso.c portions of this code too. Signed-off-by: Stefan Richter <[email protected]> Tested-by: David Moore <[email protected]>
2009-03-24firewire: core: topology header fixStefan Richter1-0/+6
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: sort includesStefan Richter1-13/+15
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: unify names of struct types and of their instancesStefan Richter1-168/+169
to indicate that they are specializations of struct event or of struct client_resource, respectively. struct response was both an event and a client_resource; it is now split into struct outbound_transaction_resource and ~_event in order to document more explicitly which types of client resources exist. struct request and struct_request_event are renamed to struct inbound_transaction_resource and ~_event because requests and responses occur in outbound and in inbound transactions. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: reference-count client instancesStefan Richter1-9/+46
The lifetime of struct client instances must be longer than the lifetime of any client resource. This fixes a possible race between fw_device_op_release and transaction completions. It also prepares for new ioctls for isochronous resource management which will involve delayed processing of client resources. Signed-off-by: Stefan Richter <[email protected]> Reviewed-by: David Moore <[email protected]>
2009-03-24firewire: prevent creation of multiple IR DMA contexts for the same channelStefan Richter3-5/+14
OHCI-1394 1.1 clause 10.4.3 says: "If more than one IR DMA context specifies receives for packets from the same isochronous channel, the context destination for that channel's packets is undefined." Any userspace client and in the future also kernelspace clients can allocate IR DMA contexts for any channel. We don't want them to interfere with each other, hence it is preferable to return -EBUSY if allocation of a second context for a channel is attempted. Notes: - This limitation is OHCI-1394 specific, therefore its proper place of implementation is down in the low-level driver. - Since the <linux/firewire-cdev.h> ABI simply maps one userspace iso client context to one hardware iso context, this OHCI-1394 limitation alas requires userspace to implement its own multiplexing of iso reception from the same channel and card to multiple clients when needed. - The limitation is independent of channel allocation at the IRM; the latter is really only important for the initiation of iso transmission but not of iso reception. - We don't need to do the same for IT DMA because OHCI-1394 does not have any ties between IT contexts and channels. Only the voluntary channel allocation protocol via the IRM, globally to the FireWire bus, can ensure proper isochronous transmit behaviour anyway. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: use list_first_entryStefan Richter1-1/+1
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: remove unused definitionsStefan Richter1-12/+0
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: remove line breaks before function namesStefan Richter11-377/+249
type function_name(parameters); is nice to look at but was not used consistently. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: standardize a variable nameStefan Richter4-58/+57
"ret" is the new "retval". Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: remove obsolete assertionsStefan Richter1-13/+4
This code never changes. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: core: remove outdated commentStefan Richter1-6/+1
Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: address handler input validationStefan Richter2-11/+21
Like before my commit 1415d9189e8c59aa9c77a3bba419dcea062c145f, fw_core_add_address_handler() does not align the address region now. Instead the caller is required to pass valid parameters. Since one of the callers of fw_core_add_address_handler() is the cdev userspace interface, we now check for valid input. If the client is buggy, we give it a hint with -EINVAL. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: use an idr rather than a linked list for resourcesJay Fenlason1-51/+114
The current code uses a linked list and a counter for storing resources and the corresponding handle numbers. By changing to an idr we can be safe from counter wrap-around giving two resources the same handle. Furthermore, the deallocation ioctls now check whether the resource to be freed is of the intended type. Signed-off-by: Jay Fenlason <[email protected]> Some rework by Stefan R: - The idr API documentation says we get an ID within 0...0x7fffffff. Hence we can rest assured that idr handles fit into cdev handles. - Fix some races. Add a client->in_shutdown flag for this purpose. - Add allocation retry to add_client_resource(). - It is possible to use idr_for_each() in fw_device_op_release(). - Fix ioctl_send_response() regression. - Small style changes. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: fix race of fw_device_op_release with bus resetStefan Richter1-4/+4
Unlink the client from the fw_device earlier in order to prevent bus reset events being added to client->event_list during shutdown. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: cdev: tcodes input validationStefan Richter1-2/+25
The behaviour of fw-transaction.c::fw_send_request is ill-defined for any other tcodes than read/ write/ lock request tcodes. Therefore prevent requests with wrong tcodes from entering the transaction layer. Maybe fw_send_request should check them itself, but I am not inclined to change it and fw_fill_request from void-valued functions to ones which return error codes and pass those up. Besides, maybe fw_send_request is going to support one more tcode than ioctl_send_request in the future (TCODE_STREAM_DATA). Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: convert client_list_lock to mutexStefan Richter3-16/+14
So far it is only taken in non-atomic contexts. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: add a client_list_lockJay Fenlason3-15/+18
This adds a client_list_lock, which only protects the device's client_list, so that future versions of the driver can call code that takes the card->lock while holding the client_list_lock. Adding this lock is much simpler than adding __ versions of all the functions that the future version may need. The one ordering issue is to make sure code never takes the client_list_lock with card->lock held. Since client_list_lock is only used in three places, that isn't hard. Signed-off-by: Jay Fenlason <[email protected]> Update fill_bus_reset_event() accordingly. Include linux/spinlock.h. Signed-off-by: Stefan Richter <[email protected]>
2009-03-24firewire: Include iso timestamp in headers when header_size > 4David Moore1-38/+35
Previously, when an iso context had header_size > 4, the iso header (len/tag/channel/tcode/sy) was passed to userspace followed by quadlets stripped from the payload. This patch changes the behavior: header_size = 8 now passes the header quadlet followed by the timestamp quadlet. When header_size > 8, quadlets are stripped from the payload. The header_size = 4 case remains identical. Since this alters the semantics of the API, the firewire API version needs to be bumped concurrently with this change. This change also refactors the header copying code slightly to be much easier to read. Signed-off-by: David Moore <[email protected]> Signed-off-by: Stefan Richter <[email protected]>
2009-02-01firewire: core: Remove card from list of cards when enable failsPetr Vandrovec1-1/+8
Signed-off-by: Petr Vandrovec <[email protected]> After a controller initialization failure, addition of another card got stuck due to card_list corruption. Signed-off-by: Stefan Richter <[email protected]>
2009-01-29firewire: sbp2: add workarounds for 2nd and 3rd generation iPodsStefan Richter1-7/+9
According to https://bugs.launchpad.net/bugs/294391 - 3rd generation iPods need the "fix capacity" workaround after all (apparently they crash after the last sector was accessed), - 2nd generation iPods need the "128 kB maximum request size" workaround. Alas both iPod generations feature the same model ID in the config ROM, hence we can only define a shared quirks list entry for them. Luckily the fix capacity workaround did not show a negative effect in Jarod's tests with 2nd gen. iPod. A side note: Apple computers in target mode (or at least an x86 Mac mini) don't have firmware_version and model_id, hence none of the iPod quirks list entries is active for them. Tested-by: Jarod Wilson <[email protected]> Acked-by: Jarod Wilson <[email protected]> Signed-off-by: Stefan Richter <[email protected]>
2009-01-28firewire: sbp2: fix DMA mapping leak on the failure pathStefan Richter1-10/+17
Reported-by: FUJITA Tomonori <[email protected]> who also provided a first version of the fix. Signed-off-by: Stefan Richter <[email protected]>
2009-01-28firewire: sbp2: define some magic numbers as macrosStefan Richter1-11/+12
Signed-off-by: Stefan Richter <[email protected]>
2009-01-28firewire: sbp2: fix payload limit at S1600 and S3200Stefan Richter1-11/+12
1394-2008 clause 16.3.4.1 (1394b-2002 clause 16.3.1.1) defines tighter limits than 1394-2008 clause 6.2.2.3 (1394a-2000 clause 6.2.2.3). Our previously too large limit doesn't matter though if the controller reports its max_receive correctly. Signed-off-by: Stefan Richter <[email protected]>
2009-01-24firewire: core: optimize card shutdownStefan Richter2-3/+5
This fixes a regression by "firewire: keep highlevel drivers attached during brief connection loss": There were 2 seconds unnecessary waiting added to the shutdown procedure of each controller. We use card->link as status flag to signal the device handler that there is no use to wait for a come-back. Signed-off-by: Stefan Richter <[email protected]>
2009-01-24firewire: ohci: increase AT req. retries, fix ack_busy_X from Panasonic ↵Stefan Richter1-1/+1
camcorders and others Camcorders have a tendency to fail read requests to their config ROM and write request to their FCP command register with ack_busy_X. This has become a problem with newer kernels and especially Panasonic camcorders, causing AV/C in dvgrab and kino to fail. Dvgrab for example frequently logs "send oops"; kino reports loss of AV/C control. I suspect that lower CPU scheduling latencies in newer kernels made this issue more prominent now. According to https://sourceforge.net/tracker/?func=detail&atid=114103&aid=2492640&group_id=14103 this can be fixed by configuring the FireWire controller for more hardware retries for request transmission; these retries are evidently more successful than libavc1394's own retry loop (typically 3 tries on top of hardware retries). Presumably the same issue has been reported at https://bugzilla.redhat.com/show_bug.cgi?id=449252 and https://bugzilla.redhat.com/show_bug.cgi?id=477279 . In a quick test with a JVC camcorder (which didn't malfunction like the reported camcorders), this change decreased the number of ack_busy_X from 16 in three runs of dvgrab to 4 in three runs of the same capture duration. Signed-off-by: Stefan Richter <[email protected]>
2009-01-24firewire: ohci: change "context_stop: still active" log messageStefan Richter1-2/+2
The present message is mostly just noise. We only need to be notified if the "active" flag does not go off before the retry loop terminates. Signed-off-by: Stefan Richter <[email protected]>
2009-01-20firewire: keep highlevel drivers attached during brief connection lossStefan Richter2-22/+100
There are situations when nodes vanish from the bus and come back quickly thereafter: - When certain bus-powered hubs are plugged in, - when certain devices are plugged into 6-port hubs, - when certain disk enclosures are switched from self-power to bus power or vice versa and break the daisy chain during the transition, - when the user plugs a cable out and quickly plugs it back in, e.g. to reorder a daisy chain (works on Mac OS X if done quickly enough), - when certain hubs temporarily malfunction during high bus traffic. Until now, firewire-core reported affected nodes as lost to the highlevel drivers (firewire-sbp2 and userspace drivers). We now delay the destruction of device representations until after at least two seconds after the last bus reset. If a "new" device is detected in this period whose bus information block and root directory header match that of a device which is pending for deletion, we resurrect that device and send update calls to highlevel drivers. Signed-off-by: Stefan Richter <[email protected]>
2009-01-20firewire: unnecessary BM delay after generation rolloverStefan Richter3-2/+11
Noticed by Jarod Wilson: The bus manager work was unnecessarily delayed each time the bus generation counter rolled over. Signed-off-by: Stefan Richter <[email protected]> Signed-off-by: Jarod Wilson <[email protected]>
2009-01-20firewire: insist on successive self ID complete eventsStefan Richter1-0/+12
The whole topology code only works if the old and new topologies which are compared come from immediately successive self ID complete events. If there happened bus resets without self ID complete events in the meantime, or self ID complete events with invalid selfIDs, the topology comparison could identify nodes wrongly, or more likely just corrupt kernel memory or panic right away. We now discard all nodes of the old topology and treat all current nodes as new ones if the current self ID generation is not the previous one plus 1. Signed-off-by: Stefan Richter <[email protected]> Signed-off-by: Jarod Wilson <[email protected]>
2009-01-09firewire: core: fix sleep in atomic context due to driver core changeStefan Richter2-16/+20
Due to commit 2831fe6f9cc4e16c103504ee09a47a084297c0f3, "driver core: create a private portion of struct device", device_initialize() can no longer be called from atomic contexts. We now defer it until after config ROM probing. This requires changes to the bus manager code because this may use a device before it was probed. Reported-by: Jay Fenlason <[email protected]> Signed-off-by: Stefan Richter <[email protected]>
2009-01-04firewire: reorder struct fw_card for better cache efficiencyStefan Richter1-7/+3
topology_map is by far the largest member in struct fw_card. Move it to the very end of the struct so that card pointer dereferences have better chances to hit the CPU cache. This requires to increase the topology_map backing store to the size specified in IEEE 1394, i.e. 256 rather than 255 quadlets. Otherwise the topology_map response handler may access invalid memory. Signed-off-by: Stefan Richter <[email protected]>