aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire/core-cdev.c
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2010-02-20 16:24:43 -0500
committerStefan Richter <stefanr@s5r6.in-berlin.de>2010-02-20 16:33:13 -0500
commit4a9bde9b8ab55a2bb51b57cad215a97bcf80bae2 (patch)
treee36282d7ed7e39f499e93f413cad57897477c53f /drivers/firewire/core-cdev.c
parent1c1517efe173599ca2f1526ce7a04521cd424a9f (diff)
firewire: get_cycle_timer optimization and cleanup
ohci: Break out of the retry loop if too many attempts were necessary. This may theoretically happen if the chip is fatally defective or if the get_cycle_timer ioctl was performed after a CardBus controller was ejected. Also micro-optimize the loop by re-using the last two register reads in the next iteration, remove a questionable inline keyword, and shuffle a comment around. core: ioctl_get_cycle_timer() is always called with interrupts on, therefore local_irq_save() can be replaced by local_irq_disable(). Disabled local IRQs imply disabled preemption, hence preempt_disable() can be removed. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire/core-cdev.c')
-rw-r--r--drivers/firewire/core-cdev.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
index e6d63849e78e..ecd0a4d81abf 100644
--- a/drivers/firewire/core-cdev.c
+++ b/drivers/firewire/core-cdev.c
@@ -25,6 +25,7 @@
25#include <linux/firewire.h> 25#include <linux/firewire.h>
26#include <linux/firewire-cdev.h> 26#include <linux/firewire-cdev.h>
27#include <linux/idr.h> 27#include <linux/idr.h>
28#include <linux/irqflags.h>
28#include <linux/jiffies.h> 29#include <linux/jiffies.h>
29#include <linux/kernel.h> 30#include <linux/kernel.h>
30#include <linux/kref.h> 31#include <linux/kref.h>
@@ -32,7 +33,6 @@
32#include <linux/module.h> 33#include <linux/module.h>
33#include <linux/mutex.h> 34#include <linux/mutex.h>
34#include <linux/poll.h> 35#include <linux/poll.h>
35#include <linux/preempt.h>
36#include <linux/sched.h> 36#include <linux/sched.h>
37#include <linux/spinlock.h> 37#include <linux/spinlock.h>
38#include <linux/time.h> 38#include <linux/time.h>
@@ -1013,21 +1013,19 @@ static int ioctl_get_cycle_timer(struct client *client, void *buffer)
1013{ 1013{
1014 struct fw_cdev_get_cycle_timer *request = buffer; 1014 struct fw_cdev_get_cycle_timer *request = buffer;
1015 struct fw_card *card = client->device->card; 1015 struct fw_card *card = client->device->card;
1016 unsigned long long bus_time;
1017 struct timeval tv; 1016 struct timeval tv;
1018 unsigned long flags; 1017 u32 cycle_time;
1019 1018
1020 preempt_disable(); 1019 local_irq_disable();
1021 local_irq_save(flags);
1022 1020
1023 bus_time = card->driver->get_bus_time(card); 1021 cycle_time = card->driver->get_bus_time(card);
1024 do_gettimeofday(&tv); 1022 do_gettimeofday(&tv);
1025 1023
1026 local_irq_restore(flags); 1024 local_irq_enable();
1027 preempt_enable();
1028 1025
1029 request->local_time = tv.tv_sec * 1000000ULL + tv.tv_usec; 1026 request->local_time = tv.tv_sec * 1000000ULL + tv.tv_usec;
1030 request->cycle_timer = bus_time & 0xffffffff; 1027 request->cycle_timer = cycle_time;
1028
1031 return 0; 1029 return 0;
1032} 1030}
1033 1031