diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-20 16:24:43 -0500 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2010-02-20 16:33:13 -0500 |
commit | 4a9bde9b8ab55a2bb51b57cad215a97bcf80bae2 (patch) | |
tree | e36282d7ed7e39f499e93f413cad57897477c53f /drivers/firewire/core-cdev.c | |
parent | 1c1517efe173599ca2f1526ce7a04521cd424a9f (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.c | 16 |
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 | ||