--- a/ath_hal/ah_os.c
+++ b/ath_hal/ah_os.c
@@ -343,6 +343,45 @@
  * NB: see the comments in ah_osdep.h about byte-swapping register
  *     reads and writes to understand what's going on below.
  */
+
+#ifdef CONFIG_LANTIQ
+extern int lantiq_emulate_madwifi_eep;
+#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 +390,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) && lantiq_emulate_madwifi_eep)
+	{
+		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) && lantiq_emulate_madwifi_eep)
+	{
+		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 +633,6 @@
 {
 	const char *sep;
 	int i;
-
 	printk(KERN_INFO "%s: %s (", dev_info, ath_hal_version);
 	sep = "";
 	for (i = 0; ath_hal_buildopts[i] != NULL; i++) {
