summaryrefslogtreecommitdiff
path: root/package/madwifi/patches/354-ifxmips_eeprom.patch
blob: f4c8f73102c0469cf107ba95051d34c12eaf1344 (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
Index: madwifi-trunk-r3314/ath_hal/ah_os.c
===================================================================
--- madwifi-trunk-r3314.orig/ath_hal/ah_os.c	2008-07-06 02:42:52.000000000 +0200
+++ madwifi-trunk-r3314/ath_hal/ah_os.c	2008-07-06 02:51:53.000000000 +0200
@@ -343,6 +343,46 @@
  * NB: see the comments in ah_osdep.h about byte-swapping register
  *     reads and writes to understand what's going on below.
  */
+
+#ifdef CONFIG_IFXMIPS
+extern int ifxmips_has_brn_block(void);
+static int ifxmips_emulate = 0;
+#define EEPROM_EMULATION 1
+#endif
+
+#ifdef EEPROM_EMULATION
+static int ath_hal_eeprom(struct ath_hal *ah, unsigned long addr, int val, int write)
+{
+	static int addrsel = 0;
+	static int rc = 0;
+
+	if (write) {
+		if(addr == 0x6000) {
+			addrsel = val * 2;
+			rc = 0;
+		}
+	} else {
+		switch(addr)
+		{
+		case 0x600c:
+			if(rc++ < 2)
+				val = 0x00000000;
+			else
+				val = 0x00000002;
+			break;
+		case 0x6004:
+			val = cpu_to_le16(__raw_readw((u16 *) KSEG1ADDR(0xb07f0400 + addrsel)));
+			/* this forces the regdomain to 0x00 (worldwide), as the original setting
+			 * causes issues with the HAL */
+			if (addrsel == 0x17e)
+				val = 0;
+			break;
+		}
+	}
+	return val;
+}
+#endif
+
 void __ahdecl
 ath_hal_reg_write(struct ath_hal *ah, u_int reg, u_int32_t val)
 {
@@ -351,20 +391,33 @@
 		ath_hal_printf(ah, "%s: WRITE 0x%x <= 0x%x\n", 
 				(ath_hal_func ?: "unknown"), reg, val);
 #endif
-	_OS_REG_WRITE(ah, reg, val);
+#ifdef EEPROM_EMULATION
+	if((reg >= 0x6000) && (reg <= 0x6010) && ifxmips_emulate)
+	{
+		val = ath_hal_eeprom(ah, reg, val, 1);
+	} else
+#endif
+		_OS_REG_WRITE(ah, reg, val);
 }
 EXPORT_SYMBOL(ath_hal_reg_write);
 
+
 /* This should only be called while holding the lock, sc->sc_hal_lock. */
 u_int32_t __ahdecl
 ath_hal_reg_read(struct ath_hal *ah, u_int reg)
 {
- 	u_int32_t val;
+	u_int32_t val;
+#ifdef EEPROM_EMULATION
+	if((reg >= 0x6000) && (reg <= 0x6010) && ifxmips_emulate)
+	{
+		val = ath_hal_eeprom(ah, reg, 0, 0);
+	} else
+#endif
+		val = _OS_REG_READ(ah, reg);
 
-	val = _OS_REG_READ(ah, reg);
 #ifdef AH_DEBUG
 	if (ath_hal_debug > 1)
-		ath_hal_printf(ah, "%s: READ 0x%x => 0x%x\n", 
+		ath_hal_printf(ah, "%s: READ 0x%x => 0x%x\n",
 				(ath_hal_func ?: "unknown"), reg, val);
 #endif
 	return val;
@@ -581,7 +634,9 @@
 {
 	const char *sep;
 	int i;
-
+#ifdef CONFIG_IFXMIPS
+	ifxmips_emulate = ifxmips_has_brn_block();
+#endif
 	printk(KERN_INFO "%s: %s (", dev_info, ath_hal_version);
 	sep = "";
 	for (i = 0; ath_hal_buildopts[i] != NULL; i++) {