diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-10-15 19:01:48 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-11-09 16:13:25 -0500 |
commit | ada9f1cacb66b74a68254521bb5e3ca4eb8fa871 (patch) | |
tree | b8a256f5f4bd42c9ec37102638cc49e1a11eb242 | |
parent | f0e94b479c987abef17eb18e5c8e0ed178d00cd4 (diff) |
ath9k_hw: optimize all descriptor access functions
Because all of the descriptor data structures are marked as __packed, GCC
assumes the worst case wrt. alignment and generates unaligned load/store
instructions on MIPS for access to all fields.
Since descriptors always have to be 4-byte-aligned, we can just mark the
data structures with __aligned(4), which allows GCC to generate much more
efficient code.
Verified through disassembly and OProfile comparisons.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.h | 4 |
2 files changed, 5 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.h b/drivers/net/wireless/ath/ath9k/ar9003_mac.h index 9f2cea70a840..45cc7e80436c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.h | |||
@@ -65,7 +65,7 @@ struct ar9003_rxs { | |||
65 | u32 status9; | 65 | u32 status9; |
66 | u32 status10; | 66 | u32 status10; |
67 | u32 status11; | 67 | u32 status11; |
68 | } __packed; | 68 | } __packed __aligned(4); |
69 | 69 | ||
70 | /* Transmit Control Descriptor */ | 70 | /* Transmit Control Descriptor */ |
71 | struct ar9003_txc { | 71 | struct ar9003_txc { |
@@ -93,7 +93,7 @@ struct ar9003_txc { | |||
93 | u32 ctl21; /* DMA control 21 */ | 93 | u32 ctl21; /* DMA control 21 */ |
94 | u32 ctl22; /* DMA control 22 */ | 94 | u32 ctl22; /* DMA control 22 */ |
95 | u32 pad[9]; /* pad to cache line (128 bytes/32 dwords) */ | 95 | u32 pad[9]; /* pad to cache line (128 bytes/32 dwords) */ |
96 | } __packed; | 96 | } __packed __aligned(4); |
97 | 97 | ||
98 | struct ar9003_txs { | 98 | struct ar9003_txs { |
99 | u32 ds_info; | 99 | u32 ds_info; |
@@ -105,7 +105,7 @@ struct ar9003_txs { | |||
105 | u32 status6; | 105 | u32 status6; |
106 | u32 status7; | 106 | u32 status7; |
107 | u32 status8; | 107 | u32 status8; |
108 | } __packed; | 108 | } __packed __aligned(4); |
109 | 109 | ||
110 | void ar9003_hw_attach_mac_ops(struct ath_hw *hw); | 110 | void ar9003_hw_attach_mac_ops(struct ath_hw *hw); |
111 | void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size); | 111 | void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size); |
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index fdc25074ca1f..22907e21cc46 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h | |||
@@ -237,7 +237,7 @@ struct ath_desc { | |||
237 | u32 ds_ctl1; | 237 | u32 ds_ctl1; |
238 | u32 ds_hw[20]; | 238 | u32 ds_hw[20]; |
239 | void *ds_vdata; | 239 | void *ds_vdata; |
240 | } __packed; | 240 | } __packed __aligned(4); |
241 | 241 | ||
242 | #define ATH9K_TXDESC_CLRDMASK 0x0001 | 242 | #define ATH9K_TXDESC_CLRDMASK 0x0001 |
243 | #define ATH9K_TXDESC_NOACK 0x0002 | 243 | #define ATH9K_TXDESC_NOACK 0x0002 |
@@ -307,7 +307,7 @@ struct ar5416_desc { | |||
307 | u32 status8; | 307 | u32 status8; |
308 | } rx; | 308 | } rx; |
309 | } u; | 309 | } u; |
310 | } __packed; | 310 | } __packed __aligned(4); |
311 | 311 | ||
312 | #define AR5416DESC(_ds) ((struct ar5416_desc *)(_ds)) | 312 | #define AR5416DESC(_ds) ((struct ar5416_desc *)(_ds)) |
313 | #define AR5416DESC_CONST(_ds) ((const struct ar5416_desc *)(_ds)) | 313 | #define AR5416DESC_CONST(_ds) ((const struct ar5416_desc *)(_ds)) |