[package] madwifi: remove cruft from madwifi.sh introduced by r15954, thanks Vasilis...
[openwrt.git] / package / madwifi / patches / 352-ani_fix.patch
1 --- a/ath/if_ath.c
2 +++ b/ath/if_ath.c
3 @@ -1014,9 +1014,7 @@ ath_attach(u_int16_t devid, struct net_d
4          */
5         sc->sc_hasveol = ath_hal_hasveol(ah);
6  
7 -       /* Interference mitigation/ambient noise immunity (ANI).
8 -        * In modes other than HAL_M_STA, it causes receive sensitivity
9 -        * problems for OFDM. */
10 +       /* Interference mitigation/ambient noise immunity (ANI). */
11         sc->sc_hasintmit = ath_hal_hasintmit(ah);
12  
13         /* get mac address from hardware */
14 @@ -1144,6 +1142,11 @@ ath_attach(u_int16_t devid, struct net_d
15         sc->sc_rp_lasttsf       = 0;
16         sc->sc_last_tsf         = 0;
17  
18 +       /* set all 3 to auto */
19 +       sc->sc_intmit = -1;
20 +       sc->sc_noise_immunity = -1;
21 +       sc->sc_ofdm_weak_det = -1;
22 +
23         return 0;
24  bad3:
25         ieee80211_ifdetach(ic);
26 @@ -2428,6 +2431,43 @@ ath_chan2flags(struct ieee80211_channel 
27         return flags;
28  }
29  
30 +static int ath_setintmit(struct ath_softc *sc)
31 +{
32 +       struct ath_hal *ah = sc->sc_ah;
33 +       int ret;
34 +       int val;
35 +
36 +       if (!sc->sc_hasintmit)
37 +               return 0;
38 +
39 +       switch(sc->sc_intmit) {
40 +               case -1:
41 +                       if (sc->sc_opmode != IEEE80211_M_MONITOR)
42 +                               val = 1;
43 +                       else
44 +                               val = 0;
45 +                       break;
46 +               case 0: /* disabled */
47 +               case 1: /* enabled */
48 +                       val = sc->sc_intmit;
49 +                       break;
50 +               default:
51 +                       return 0;
52 +       }
53 +       ret = ath_hal_setintmit(ah, val);
54 +       if (val)
55 +               goto done;
56 +
57 +       /* manual settings */
58 +       if ((sc->sc_noise_immunity >= 0) && (sc->sc_noise_immunity <= 5))
59 +               ath_hal_setcapability(ah, HAL_CAP_INTMIT, 2, sc->sc_noise_immunity, NULL);
60 +       if ((sc->sc_ofdm_weak_det == 0) || (sc->sc_ofdm_weak_det == 1))
61 +               ath_hal_setcapability(ah, HAL_CAP_INTMIT, 3, sc->sc_ofdm_weak_det, NULL);
62 +
63 +done:
64 +       return ret;
65 +}
66 +
67  /*
68   * Context: process context
69   */
70 @@ -2493,8 +2533,7 @@ ath_init(struct net_device *dev)
71         if (sc->sc_softled)
72                 ath_hal_gpioCfgOutput(ah, sc->sc_ledpin);
73  
74 -       if ((sc->sc_opmode != HAL_M_STA) && sc->sc_hasintmit)
75 -               ath_hal_setintmit(ah, 0);
76 +       ath_setintmit(sc);
77  
78         /*
79          * This is needed only to setup initial state
80 @@ -2530,7 +2569,7 @@ ath_init(struct net_device *dev)
81          * Enable MIB interrupts when there are hardware phy counters.
82          * Note we only do this (at the moment) for station mode.
83          */
84 -       if (sc->sc_needmib && ic->ic_opmode == IEEE80211_M_STA)
85 +       if (sc->sc_needmib && ath_hal_getintmit(ah, NULL))
86                 sc->sc_imask |= HAL_INT_MIB;
87         ath_hal_intrset(ah, sc->sc_imask);
88  
89 @@ -2787,9 +2826,7 @@ ath_reset(struct net_device *dev)
90                 EPRINTF(sc, "Unable to reset hardware: '%s' (HAL status %u)\n",
91                         ath_get_hal_status_desc(status), status);
92  
93 -       if ((sc->sc_opmode != HAL_M_STA) && sc->sc_hasintmit)
94 -               ath_hal_setintmit(ah, 0);
95 -
96 +       ath_setintmit(sc);
97         ath_update_txpow(sc);           /* update tx power state */
98         ath_radar_update(sc);
99         ath_setdefantenna(sc, sc->sc_defant);
100 @@ -4174,6 +4211,8 @@ ath_calcrxfilter(struct ath_softc *sc)
101         if (sc->sc_nmonvaps > 0)
102                 rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON |
103                           HAL_RX_FILTER_PROBEREQ | HAL_RX_FILTER_PROM);
104 +       if (sc->sc_hasintmit && !sc->sc_needmib && ath_hal_getintmit(ah, NULL))
105 +               rfilt |= HAL_RX_FILTER_PHYERR;
106         if (sc->sc_curchan.privFlags & CHANNEL_DFS)
107                 rfilt |= (HAL_RX_FILTER_PHYERR | HAL_RX_FILTER_PHYRADAR);
108         return rfilt;
109 @@ -6526,9 +6565,6 @@ process_rx_again:
110                         rs->rs_rssi = 0;
111  
112                 len = rs->rs_datalen;
113 -               /* DMA sync. dies spectacularly if len == 0 */
114 -               if (len == 0)
115 -                       goto rx_next;
116  
117                 if (rs->rs_more) {
118                         /*
119 @@ -8876,9 +8912,7 @@ ath_chan_set(struct ath_softc *sc, struc
120                 if (sc->sc_softled)
121                         ath_hal_gpioCfgOutput(ah, sc->sc_ledpin);
122  
123 -               if ((sc->sc_opmode != HAL_M_STA) && sc->sc_hasintmit)
124 -                       ath_hal_setintmit(ah, 0);
125 -
126 +               ath_setintmit(sc);
127                 sc->sc_curchan = hchan;
128                 ath_update_txpow(sc);           /* update tx power state */
129                 ath_radar_update(sc);
130 @@ -10655,9 +10689,54 @@ enum {
131         ATH_RP_IGNORED          = 24,
132         ATH_RADAR_IGNORED       = 25,
133         ATH_MAXVAPS             = 26,
134 +       ATH_INTMIT                      = 27,
135 +       ATH_NOISE_IMMUNITY      = 28,
136 +       ATH_OFDM_WEAK_DET       = 29
137  };
138  
139  static int
140 +ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val)
141 +{
142 +       int ret;
143 +
144 +       switch(ctl) {
145 +       case ATH_INTMIT:
146 +               sc->sc_intmit = val;
147 +               break;
148 +       case ATH_NOISE_IMMUNITY:
149 +               sc->sc_noise_immunity = val;
150 +               break;
151 +       case ATH_OFDM_WEAK_DET:
152 +               sc->sc_ofdm_weak_det = val;
153 +               break;
154 +       default:
155 +               return -EINVAL;
156 +       }
157 +       ret = ath_setintmit(sc);
158 +       ath_calcrxfilter(sc);
159 +       return ret;
160 +}
161 +
162 +static int
163 +ath_sysctl_get_intmit(struct ath_softc *sc, long ctl, u_int *val)
164 +{
165 +       struct ath_hal *ah = sc->sc_ah;
166 +
167 +       switch(ctl) {
168 +       case ATH_INTMIT:
169 +               *val = (ath_hal_getcapability(ah, HAL_CAP_INTMIT, 1, NULL) == HAL_OK);
170 +               break;
171 +       case ATH_NOISE_IMMUNITY:
172 +               return ath_hal_getcapability(ah, HAL_CAP_INTMIT, 2, val);
173 +       case ATH_OFDM_WEAK_DET:
174 +               return ath_hal_getcapability(ah, HAL_CAP_INTMIT, 3, val);
175 +       default:
176 +               return -EINVAL;
177 +       }
178 +       return 0;
179 +}
180 +
181 +static int
182  ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos)
183  {
184         struct ath_softc *sc = ctl->extra1;
185 @@ -10843,6 +10922,11 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
186                         case ATH_RADAR_IGNORED:
187                                 sc->sc_radar_ignored = val;
188                                 break;
189 +                       case ATH_INTMIT:
190 +                       case ATH_NOISE_IMMUNITY:
191 +                       case ATH_OFDM_WEAK_DET:
192 +                               ret = ath_sysctl_set_intmit(sc, (long)ctl->extra2, val);
193 +                               break;
194                         default:
195                                 ret = -EINVAL;
196                                 break;
197 @@ -10909,6 +10993,11 @@ ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl
198                 case ATH_RADAR_IGNORED:
199                         val = sc->sc_radar_ignored;
200                         break;
201 +               case ATH_INTMIT:
202 +               case ATH_NOISE_IMMUNITY:
203 +               case ATH_OFDM_WEAK_DET:
204 +                       ret = ath_sysctl_get_intmit(sc, (long)ctl->extra2, &val);
205 +                       break;
206                 default:
207                         ret = -EINVAL;
208                         break;
209 @@ -11086,6 +11175,24 @@ static const ctl_table ath_sysctl_templa
210           .proc_handler = ath_sysctl_halparam,
211           .extra2       = (void *)ATH_RADAR_IGNORED,
212         },
213 +       { .ctl_name     = CTL_AUTO,
214 +         .procname     = "intmit",
215 +         .mode         = 0644,
216 +         .proc_handler = ath_sysctl_halparam,
217 +         .extra2       = (void *)ATH_INTMIT,
218 +       },
219 +       { .ctl_name     = CTL_AUTO,
220 +         .procname     = "noise_immunity",
221 +         .mode         = 0644,
222 +         .proc_handler = ath_sysctl_halparam,
223 +         .extra2       = (void *)ATH_NOISE_IMMUNITY,
224 +       },
225 +       { .ctl_name     = CTL_AUTO,
226 +         .procname     = "ofdm_weak_det",
227 +         .mode         = 0644,
228 +         .proc_handler = ath_sysctl_halparam,
229 +         .extra2       = (void *)ATH_OFDM_WEAK_DET,
230 +       },
231         { 0 }
232  };
233  
234 --- a/ath/if_athvar.h
235 +++ b/ath/if_athvar.h
236 @@ -693,6 +693,10 @@ struct ath_softc {
237         unsigned int sc_txcont_power; /* Continuous transmit power in 0.5dBm units */
238         unsigned int sc_txcont_rate;  /* Continuous transmit rate in Mbps */
239  
240 +       int8_t sc_intmit; /* Interference mitigation enabled, -1 = auto, based on mode, 0/1 = off/on */
241 +       int8_t sc_noise_immunity; /* Noise immunity level, 0-4, -1 == auto) */
242 +       int8_t sc_ofdm_weak_det; /* OFDM weak frames detection, -1 == auto */
243 +
244         /* rate tables */
245         const HAL_RATE_TABLE *sc_rates[IEEE80211_MODE_MAX];
246         const HAL_RATE_TABLE *sc_currates;      /* current rate table */
247 --- a/ath/if_ath_hal.h
248 +++ b/ath/if_ath_hal.h
249 @@ -67,14 +67,14 @@ static inline HAL_POWER_MODE ath_hal_get
250  
251  static inline HAL_BOOL ath_hal_getdiagstate(struct ath_hal *ah, int request,
252                                             const void *args, u_int32_t argsize,
253 -                                           void **result,
254 +                                           void *result,
255                                             u_int32_t *resultsize)
256  {
257         HAL_BOOL ret;
258         ATH_HAL_LOCK_IRQ(ah->ah_sc);
259         ath_hal_set_function(__func__);
260         ret =
261 -           ah->ah_getDiagState(ah, request, args, argsize, *result,
262 +           ah->ah_getDiagState(ah, request, args, argsize, result,
263                                 resultsize);
264         ath_hal_set_function(NULL);
265         ATH_HAL_UNLOCK_IRQ(ah->ah_sc);