aboutsummaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches-r3776/318-ifxmips_eeprom.patch
blob: 412ceadeb6f94cc99a2b673ab6589587876abf75 (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
--- a/ath_hal/ah_os.c
+++ b/ath_hal/ah_os.c
@@ -917,9 +917,56 @@
  * 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 address, u_int32_t value)
 {
+#ifdef EEPROM_EMULATION
+	if((address >= 0x6000) && (address <= 0x6010) && ifxmips_emulate) {
+		ath_hal_eeprom(ah, address, value, 1);
+		return;
+	}
+#endif
+
 	_trace_regop(ah, REGOP_WRITE, address, value);
 	_OS_REG_WRITE(ah, address, value);
 }
@@ -929,7 +976,14 @@
 u_int32_t __ahdecl
 ath_hal_reg_read(struct ath_hal *ah, u_int address)
 {
- 	u_int32_t val = _OS_REG_READ(ah, address);
+	u_int32_t val;
+
+#ifdef EEPROM_EMULATION
+	if((address >= 0x6000) && (address <= 0x6010) && ifxmips_emulate)
+		val = ath_hal_eeprom(ah, address, 0, 0);
+	else
+#endif
+		val = _OS_REG_READ(ah, address);
 	_trace_regop(ah, REGOP_READ, address, val);
 	return val;
 }
@@ -1123,6 +1177,9 @@
 #ifdef MMIOTRACE
 	kmmio_logmsg = _kmmio_logmsg;
 #endif
+#ifdef CONFIG_IFXMIPS
+	ifxmips_emulate = ifxmips_has_brn_block();
+#endif
 
 	sep = "";
 	for (i = 0; ath_hal_buildopts[i] != NULL; i++) {