diff options
author | Roland Dreier <rolandd@cisco.com> | 2007-10-14 23:40:27 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-10-15 23:17:27 -0400 |
commit | ab8403c424a35364a3a2c753f7c5917fcbb4d809 (patch) | |
tree | 9cbcfbc4ae9f15b05272be1fbdc7e028b86f297e /drivers/infiniband/hw/mthca/mthca_doorbell.h | |
parent | 744ea922c901b6557bffe8bff7af1ef18181f370 (diff) |
IB/mthca: Avoid alignment traps when writing doorbells
Architectures such as ia64 see alignment traps when doing a 64-bit
read from __be32 doorbell[2] arrays to do doorbell writes in
mthca_write64(). Fix this by just passing the two halves of the
doorbell value into mthca_write64(). This actually improves the
generated code by allowing the compiler to see what's going on better.
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_doorbell.h')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_doorbell.h | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_doorbell.h b/drivers/infiniband/hw/mthca/mthca_doorbell.h index dd9a44d170c9..b374dc395be1 100644 --- a/drivers/infiniband/hw/mthca/mthca_doorbell.h +++ b/drivers/infiniband/hw/mthca/mthca_doorbell.h | |||
@@ -58,10 +58,10 @@ static inline void mthca_write64_raw(__be64 val, void __iomem *dest) | |||
58 | __raw_writeq((__force u64) val, dest); | 58 | __raw_writeq((__force u64) val, dest); |
59 | } | 59 | } |
60 | 60 | ||
61 | static inline void mthca_write64(__be32 val[2], void __iomem *dest, | 61 | static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest, |
62 | spinlock_t *doorbell_lock) | 62 | spinlock_t *doorbell_lock) |
63 | { | 63 | { |
64 | __raw_writeq(*(u64 *) val, dest); | 64 | __raw_writeq((__force u64) cpu_to_be64((u64) hi << 32 | lo), dest); |
65 | } | 65 | } |
66 | 66 | ||
67 | static inline void mthca_write_db_rec(__be32 val[2], __be32 *db) | 67 | static inline void mthca_write_db_rec(__be32 val[2], __be32 *db) |
@@ -87,14 +87,17 @@ static inline void mthca_write64_raw(__be64 val, void __iomem *dest) | |||
87 | __raw_writel(((__force u32 *) &val)[1], dest + 4); | 87 | __raw_writel(((__force u32 *) &val)[1], dest + 4); |
88 | } | 88 | } |
89 | 89 | ||
90 | static inline void mthca_write64(__be32 val[2], void __iomem *dest, | 90 | static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest, |
91 | spinlock_t *doorbell_lock) | 91 | spinlock_t *doorbell_lock) |
92 | { | 92 | { |
93 | unsigned long flags; | 93 | unsigned long flags; |
94 | 94 | ||
95 | hi = (__force u32) cpu_to_be32(hi); | ||
96 | lo = (__force u32) cpu_to_be32(lo); | ||
97 | |||
95 | spin_lock_irqsave(doorbell_lock, flags); | 98 | spin_lock_irqsave(doorbell_lock, flags); |
96 | __raw_writel((__force u32) val[0], dest); | 99 | __raw_writel(hi, dest); |
97 | __raw_writel((__force u32) val[1], dest + 4); | 100 | __raw_writel(lo, dest + 4); |
98 | spin_unlock_irqrestore(doorbell_lock, flags); | 101 | spin_unlock_irqrestore(doorbell_lock, flags); |
99 | } | 102 | } |
100 | 103 | ||