allow larger beacon interval values - useful for big mesh networks (patch by sven...
[openwrt.git] / package / madwifi / patches / 354-ifxmips_eeprom.patch
1 --- a/ath_hal/ah_os.c
2 +++ b/ath_hal/ah_os.c
3 @@ -343,6 +343,46 @@
4 * NB: see the comments in ah_osdep.h about byte-swapping register
5 * reads and writes to understand what's going on below.
6 */
7 +
8 +#ifdef CONFIG_IFXMIPS
9 +extern int ifxmips_has_brn_block(void);
10 +static int ifxmips_emulate = 0;
11 +#define EEPROM_EMULATION 1
12 +#endif
13 +
14 +#ifdef EEPROM_EMULATION
15 +static int ath_hal_eeprom(struct ath_hal *ah, unsigned long addr, int val, int write)
16 +{
17 + static int addrsel = 0;
18 + static int rc = 0;
19 +
20 + if (write) {
21 + if(addr == 0x6000) {
22 + addrsel = val * 2;
23 + rc = 0;
24 + }
25 + } else {
26 + switch(addr)
27 + {
28 + case 0x600c:
29 + if(rc++ < 2)
30 + val = 0x00000000;
31 + else
32 + val = 0x00000002;
33 + break;
34 + case 0x6004:
35 + val = cpu_to_le16(__raw_readw((u16 *) KSEG1ADDR(0xb07f0400 + addrsel)));
36 + /* this forces the regdomain to 0x00 (worldwide), as the original setting
37 + * causes issues with the HAL */
38 + if (addrsel == 0x17e)
39 + val = 0;
40 + break;
41 + }
42 + }
43 + return val;
44 +}
45 +#endif
46 +
47 void __ahdecl
48 ath_hal_reg_write(struct ath_hal *ah, u_int reg, u_int32_t val)
49 {
50 @@ -351,20 +391,33 @@
51 ath_hal_printf(ah, "%s: WRITE 0x%x <= 0x%x\n",
52 (ath_hal_func ?: "unknown"), reg, val);
53 #endif
54 - _OS_REG_WRITE(ah, reg, val);
55 +#ifdef EEPROM_EMULATION
56 + if((reg >= 0x6000) && (reg <= 0x6010) && ifxmips_emulate)
57 + {
58 + val = ath_hal_eeprom(ah, reg, val, 1);
59 + } else
60 +#endif
61 + _OS_REG_WRITE(ah, reg, val);
62 }
63 EXPORT_SYMBOL(ath_hal_reg_write);
64
65 +
66 /* This should only be called while holding the lock, sc->sc_hal_lock. */
67 u_int32_t __ahdecl
68 ath_hal_reg_read(struct ath_hal *ah, u_int reg)
69 {
70 - u_int32_t val;
71 + u_int32_t val;
72 +#ifdef EEPROM_EMULATION
73 + if((reg >= 0x6000) && (reg <= 0x6010) && ifxmips_emulate)
74 + {
75 + val = ath_hal_eeprom(ah, reg, 0, 0);
76 + } else
77 +#endif
78 + val = _OS_REG_READ(ah, reg);
79
80 - val = _OS_REG_READ(ah, reg);
81 #ifdef AH_DEBUG
82 if (ath_hal_debug > 1)
83 - ath_hal_printf(ah, "%s: READ 0x%x => 0x%x\n",
84 + ath_hal_printf(ah, "%s: READ 0x%x => 0x%x\n",
85 (ath_hal_func ?: "unknown"), reg, val);
86 #endif
87 return val;
88 @@ -581,7 +634,9 @@
89 {
90 const char *sep;
91 int i;
92 -
93 +#ifdef CONFIG_IFXMIPS
94 + ifxmips_emulate = ifxmips_has_brn_block();
95 +#endif
96 printk(KERN_INFO "%s: %s (", dev_info, ath_hal_version);
97 sep = "";
98 for (i = 0; ath_hal_buildopts[i] != NULL; i++) {
This page took 0.051977 seconds and 5 git commands to generate.