wifipineapple-openwrt/package/madwifi/patches-testing/318-ifxmips_eeprom.patch

86 lines
1.9 KiB
Diff

--- 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++) {