summaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches/450-new_hal.patch
blob: 324f7dd6b301ede397a364d950687e89c24bab5a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
--- a/ath_hal/ah_os.h
+++ b/ath_hal/ah_os.h
@@ -156,80 +156,23 @@ extern u_int32_t __ahdecl ath_hal_getupt
 #endif
 #endif				/* AH_BYTE_ORDER */
 
-/*
- * Some big-endian architectures don't set CONFIG_GENERIC_IOMAP, but fail to
- * implement iowrite32be and ioread32be.  Provide compatibility macros when
- * it's needed.
- *
- * As of Linux 2.6.24, only MIPS, PARISC and PowerPC implement iowrite32be and
- * ioread32be as functions.
- *
- * The downside or the replacement macros it that we may be byte-swapping data
- * for the second time, so the native implementations should be preferred.
- */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)) && \
-	!defined(CONFIG_GENERIC_IOMAP) && (AH_BYTE_ORDER == AH_BIG_ENDIAN) && \
-	!defined(__mips__) && !defined(__hppa__) && !defined(__powerpc__)
-# ifndef iowrite32be
-#  define iowrite32be(_val, _addr) iowrite32(swab32((_val)), (_addr))
-# endif
-# ifndef ioread32be
-#  define ioread32be(_addr) swab32(ioread32((_addr)))
-# endif
-#endif
+#define IS_SWAPPED(_ah, _reg) \
+	((_ah)->ah_swapped && \
+		(((0x4000 <= (_reg)) && ((_reg) < 0x5000)) || \
+		 ((0x7000 <= (_reg)) && ((_reg) < 0x8000))))
+
+#define SWAPREG(_ah, _reg, _val) \
+	(IS_SWAPPED(_ah, _reg) ? cpu_to_le32(_val) : (_val))
 
 /*
  * The register accesses are done using target-specific functions when
  * debugging is enabled (AH_DEBUG) or it's explicitly requested for the target.
- *
- * The hardware registers use little-endian byte order natively.  Big-endian
- * systems are configured by HAL to enable hardware byte-swap of register reads
- * and writes at reset.  This avoid the need to byte-swap the data in software.
- * However, the registers in a certain area from 0x4000 to 0x4fff (PCI clock
- * domain registers) are not byte swapped!
- *
- * Since Linux I/O primitives default to little-endian operations, we only
- * need to suppress byte-swapping on big-endian systems outside the area used
- * by the PCI clock domain registers.
  */
-#if (AH_BYTE_ORDER == AH_BIG_ENDIAN)
-#define is_reg_le(__reg) ((0x4000 <= (__reg) && (__reg) < 0x5000))
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-#define _OS_REG_WRITE(_ah, _reg, _val) do {			\
-	 is_reg_le(_reg) ?					\
-	 iowrite32((_val), (_ah)->ah_sh + (_reg)) :		\
-	 iowrite32be((_val), (_ah)->ah_sh + (_reg));		\
-	} while (0)
-#define _OS_REG_READ(_ah, _reg)					\
-	(is_reg_le(_reg) ?					\
-	 ioread32((_ah)->ah_sh + (_reg)) :			\
-	 ioread32be((_ah)->ah_sh + (_reg)))
-#else
-#define _OS_REG_WRITE(_ah, _reg, _val) do {			\
-	 writel(is_reg_le(_reg) ? 				\
-	 	(_val) : cpu_to_le32(_val), 			\
-		(_ah)->ah_sh + (_reg));				\
-	} while (0)
-#define _OS_REG_READ(_ah, _reg)					\
-	(is_reg_le(_reg) ?					\
-	 readl((_ah)->ah_sh + (_reg)) :				\
-	 cpu_to_le32(readl((_ah)->ah_sh + (_reg))))
-#endif				/* KERNEL_VERSION(2,6,12) */
-#else				/* AH_BYTE_ORDER != AH_BIG_ENDIAN */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-#define _OS_REG_WRITE(_ah, _reg, _val) do {			\
-	 iowrite32((_val), (_ah)->ah_sh + (_reg));		\
-	} while (0)
-#define _OS_REG_READ(_ah, _reg)					\
-	ioread32((_ah)->ah_sh + (_reg))
-#else
 #define _OS_REG_WRITE(_ah, _reg, _val) do {			\
-	 writel((_val), (_ah)->ah_sh + (_reg));			\
-	} while (0)
+	 __raw_writel(SWAPREG(_ah, _reg, _val), (_ah)->ah_sh + (_reg));		\
+} while (0)
 #define _OS_REG_READ(_ah, _reg)					\
-	readl((_ah)->ah_sh + (_reg))
-#endif				/* KERNEL_VERSION(2,6,12) */
-#endif				/* AH_BYTE_ORDER != AH_BIG_ENDIAN */
+	 SWAPREG(_ah, _reg, __raw_readl((_ah)->ah_sh + (_reg)))
 
 /*
  * The functions in this section are not intended to be invoked by MadWifi
--- a/ath/if_ath.c
+++ b/ath/if_ath.c
@@ -606,6 +606,14 @@ ath_attach(u_int16_t devid, struct net_d
 	}
 	sc->sc_ah = ah;
 
+	/* WAR for AR7100 PCI bug */
+#ifdef CONFIG_ATHEROS_AR71XX
+	if ((ar_device(sc->devid) >= 5210) && (ar_device(sc->devid) < 5416)) {
+		ath_hal_setcapability(ah, HAL_CAP_DMABURST_RX, 0, HAL_DMABURST_4B, NULL);
+		ath_hal_setcapability(ah, HAL_CAP_DMABURST_TX, 0, HAL_DMABURST_4B, NULL);
+	}
+#endif
+
 	/*
 	 * Check if the MAC has multi-rate retry support.
 	 * We do this by trying to setup a fake extended
@@ -7524,7 +7532,7 @@ ath_txq_setup(struct ath_softc *sc, int 
 	if (qtype == HAL_TX_QUEUE_UAPSD)
 		qi.tqi_qflags = HAL_TXQ_TXDESCINT_ENABLE;
 	else
-		qi.tqi_qflags = HAL_TXQ_TXEOLINT_ENABLE | 
+		qi.tqi_qflags = HAL_TXQ_TXEOLINT_ENABLE | HAL_TXQ_TXOKINT_ENABLE |
 			HAL_TXQ_TXDESCINT_ENABLE;
 	qnum = ath_hal_setuptxqueue(ah, qtype, &qi);
 	if (qnum == -1) {
--- a/ath_hal/ah_os.c
+++ b/ath_hal/ah_os.c
@@ -126,6 +126,13 @@ ath_hal_printf(struct ath_hal *ah, const
 }
 EXPORT_SYMBOL(ath_hal_printf);
 
+void __ahdecl
+ath_hal_printstr(struct ath_hal *ah, const char *str)
+{
+	printk("%s", str);
+}
+EXPORT_SYMBOL(ath_hal_printstr);
+
 /*
  * Format an Ethernet MAC for printing.
  */