ath9k_hw: optimize all descriptor access functions
authorFelix Fietkau <nbd@openwrt.org>
Fri, 15 Oct 2010 23:01:48 +0000 (01:01 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 9 Nov 2010 21:13:25 +0000 (16:13 -0500)
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>
drivers/net/wireless/ath/ath9k/ar9003_mac.h
drivers/net/wireless/ath/ath9k/mac.h

index 9f2cea70a840801dc1f767993a83b02fa4c29eb1..45cc7e80436c067430e140dd5dfb36b671afe62f 100644 (file)
@@ -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);
index fdc25074ca1ff45459e6db18e16e6d12fabb04a5..22907e21cc46fd68c15b566a09846e87c5f6982c 100644 (file)
@@ -237,7 +237,7 @@ struct ath_desc {
        u32 ds_ctl1;
        u32 ds_hw[20];
        void *ds_vdata;
-} __packed;
+} __packed __aligned(4);
 
 #define ATH9K_TXDESC_CLRDMASK          0x0001
 #define ATH9K_TXDESC_NOACK             0x0002
@@ -307,7 +307,7 @@ struct ar5416_desc {
                        u32 status8;
                } rx;
        } u;
-} __packed;
+} __packed __aligned(4);
 
 #define AR5416DESC(_ds)         ((struct ar5416_desc *)(_ds))
 #define AR5416DESC_CONST(_ds)   ((const struct ar5416_desc *)(_ds))