diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-10-16 03:01:48 +0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-11-10 00:13:25 +0300 |
commit | ada9f1cacb66b74a68254521bb5e3ca4eb8fa871 (patch) | |
tree | b8a256f5f4bd42c9ec37102638cc49e1a11eb242 /drivers/net/wireless/ath/ath9k/ar9003_mac.h | |
parent | f0e94b479c987abef17eb18e5c8e0ed178d00cd4 (diff) | |
download | linux-ada9f1cacb66b74a68254521bb5e3ca4eb8fa871.tar.xz |
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>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar9003_mac.h')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_mac.h | 6 |
1 files changed, 3 insertions, 3 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 { u32 status9; u32 status10; u32 status11; -} __packed; +} __packed __aligned(4); /* Transmit Control Descriptor */ struct ar9003_txc { @@ -93,7 +93,7 @@ struct ar9003_txc { u32 ctl21; /* DMA control 21 */ u32 ctl22; /* DMA control 22 */ u32 pad[9]; /* pad to cache line (128 bytes/32 dwords) */ -} __packed; +} __packed __aligned(4); struct ar9003_txs { u32 ds_info; @@ -105,7 +105,7 @@ struct ar9003_txs { u32 status6; u32 status7; u32 status8; -} __packed; +} __packed __aligned(4); void ar9003_hw_attach_mac_ops(struct ath_hw *hw); void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size); |