1216ca234SAdrian Chadd /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni *
4216ca234SAdrian Chadd * Copyright (c) 2013 Adrian Chadd <adrian@FreeBSD.org>
5216ca234SAdrian Chadd * All rights reserved.
6216ca234SAdrian Chadd *
7216ca234SAdrian Chadd * Redistribution and use in source and binary forms, with or without
8216ca234SAdrian Chadd * modification, are permitted provided that the following conditions
9216ca234SAdrian Chadd * are met:
10216ca234SAdrian Chadd * 1. Redistributions of source code must retain the above copyright
11216ca234SAdrian Chadd * notice, this list of conditions and the following disclaimer,
12216ca234SAdrian Chadd * without modification.
13216ca234SAdrian Chadd * 2. Redistributions in binary form must reproduce at minimum a disclaimer
14216ca234SAdrian Chadd * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
15216ca234SAdrian Chadd * redistribution must be conditioned upon including a substantially
16216ca234SAdrian Chadd * similar Disclaimer requirement for further binary redistribution.
17216ca234SAdrian Chadd *
18216ca234SAdrian Chadd * NO WARRANTY
19216ca234SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20216ca234SAdrian Chadd * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21216ca234SAdrian Chadd * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
22216ca234SAdrian Chadd * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23216ca234SAdrian Chadd * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
24216ca234SAdrian Chadd * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25216ca234SAdrian Chadd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26216ca234SAdrian Chadd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
27216ca234SAdrian Chadd * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28216ca234SAdrian Chadd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
29216ca234SAdrian Chadd * THE POSSIBILITY OF SUCH DAMAGES.
30216ca234SAdrian Chadd */
31216ca234SAdrian Chadd #include <sys/cdefs.h>
32216ca234SAdrian Chadd /*
33216ca234SAdrian Chadd * This module handles LNA diversity for those chips which implement LNA
34216ca234SAdrian Chadd * mixing (AR9285/AR9485.)
35216ca234SAdrian Chadd */
36216ca234SAdrian Chadd #include "opt_ath.h"
37216ca234SAdrian Chadd #include "opt_inet.h"
38216ca234SAdrian Chadd #include "opt_wlan.h"
39216ca234SAdrian Chadd
40216ca234SAdrian Chadd #include <sys/param.h>
41216ca234SAdrian Chadd #include <sys/systm.h>
42216ca234SAdrian Chadd #include <sys/sysctl.h>
43216ca234SAdrian Chadd #include <sys/kernel.h>
44216ca234SAdrian Chadd #include <sys/lock.h>
4576039bc8SGleb Smirnoff #include <sys/malloc.h>
46216ca234SAdrian Chadd #include <sys/mutex.h>
47216ca234SAdrian Chadd #include <sys/errno.h>
48216ca234SAdrian Chadd
49216ca234SAdrian Chadd #include <machine/bus.h>
50216ca234SAdrian Chadd #include <machine/resource.h>
51216ca234SAdrian Chadd #include <sys/bus.h>
52216ca234SAdrian Chadd
53216ca234SAdrian Chadd #include <sys/socket.h>
54216ca234SAdrian Chadd
55216ca234SAdrian Chadd #include <net/if.h>
5676039bc8SGleb Smirnoff #include <net/if_var.h>
57216ca234SAdrian Chadd #include <net/if_media.h>
58216ca234SAdrian Chadd #include <net/if_arp.h>
59216ca234SAdrian Chadd #include <net/ethernet.h> /* XXX for ether_sprintf */
60216ca234SAdrian Chadd
61216ca234SAdrian Chadd #include <net80211/ieee80211_var.h>
62216ca234SAdrian Chadd
63216ca234SAdrian Chadd #include <net/bpf.h>
64216ca234SAdrian Chadd
65216ca234SAdrian Chadd #ifdef INET
66216ca234SAdrian Chadd #include <netinet/in.h>
67216ca234SAdrian Chadd #include <netinet/if_ether.h>
68216ca234SAdrian Chadd #endif
69216ca234SAdrian Chadd
70216ca234SAdrian Chadd #include <dev/ath/if_athvar.h>
71216ca234SAdrian Chadd #include <dev/ath/if_ath_debug.h>
72216ca234SAdrian Chadd #include <dev/ath/if_ath_lna_div.h>
73216ca234SAdrian Chadd
74f6b6084bSPedro F. Giffuni /* Linux compatibility macros */
75216ca234SAdrian Chadd /*
76216ca234SAdrian Chadd * XXX these don't handle rounding, underflow, overflow, wrapping!
77216ca234SAdrian Chadd */
78216ca234SAdrian Chadd #define msecs_to_jiffies(a) ( (a) * hz / 1000 )
79216ca234SAdrian Chadd
80216ca234SAdrian Chadd /*
81216ca234SAdrian Chadd * Methods which are required
82216ca234SAdrian Chadd */
83216ca234SAdrian Chadd
84216ca234SAdrian Chadd /*
85216ca234SAdrian Chadd * Attach the LNA diversity to the given interface
86216ca234SAdrian Chadd */
87216ca234SAdrian Chadd int
ath_lna_div_attach(struct ath_softc * sc)88216ca234SAdrian Chadd ath_lna_div_attach(struct ath_softc *sc)
89216ca234SAdrian Chadd {
90216ca234SAdrian Chadd struct if_ath_ant_comb_state *ss;
910f0eebe7SAdrian Chadd HAL_ANT_COMB_CONFIG div_ant_conf;
92216ca234SAdrian Chadd
93216ca234SAdrian Chadd /* Only do this if diversity is enabled */
94216ca234SAdrian Chadd if (! ath_hal_hasdivantcomb(sc->sc_ah))
95216ca234SAdrian Chadd return (0);
96216ca234SAdrian Chadd
97216ca234SAdrian Chadd ss = malloc(sizeof(struct if_ath_ant_comb_state),
98216ca234SAdrian Chadd M_TEMP, M_WAITOK | M_ZERO);
99216ca234SAdrian Chadd
1000f0eebe7SAdrian Chadd /* Fetch the hardware configuration */
1010f0eebe7SAdrian Chadd OS_MEMZERO(&div_ant_conf, sizeof(div_ant_conf));
1020f0eebe7SAdrian Chadd ath_hal_div_comb_conf_get(sc->sc_ah, &div_ant_conf);
1030f0eebe7SAdrian Chadd
1040f0eebe7SAdrian Chadd /* Figure out what the hardware specific bits should be */
1050f0eebe7SAdrian Chadd if ((div_ant_conf.antdiv_configgroup == HAL_ANTDIV_CONFIG_GROUP_1) ||
1060f0eebe7SAdrian Chadd (div_ant_conf.antdiv_configgroup == HAL_ANTDIV_CONFIG_GROUP_2)) {
1070f0eebe7SAdrian Chadd ss->lna1_lna2_delta = -9;
1080f0eebe7SAdrian Chadd } else {
1090f0eebe7SAdrian Chadd ss->lna1_lna2_delta = -3;
1100f0eebe7SAdrian Chadd }
1110f0eebe7SAdrian Chadd
112216ca234SAdrian Chadd /* Let's flip this on */
113216ca234SAdrian Chadd sc->sc_lna_div = ss;
114216ca234SAdrian Chadd sc->sc_dolnadiv = 1;
115216ca234SAdrian Chadd
116216ca234SAdrian Chadd return (0);
117216ca234SAdrian Chadd }
118216ca234SAdrian Chadd
119216ca234SAdrian Chadd /*
120216ca234SAdrian Chadd * Detach the LNA diversity state from the given interface
121216ca234SAdrian Chadd */
122216ca234SAdrian Chadd int
ath_lna_div_detach(struct ath_softc * sc)123216ca234SAdrian Chadd ath_lna_div_detach(struct ath_softc *sc)
124216ca234SAdrian Chadd {
125216ca234SAdrian Chadd if (sc->sc_lna_div != NULL) {
126216ca234SAdrian Chadd free(sc->sc_lna_div, M_TEMP);
127216ca234SAdrian Chadd sc->sc_lna_div = NULL;
128216ca234SAdrian Chadd }
129216ca234SAdrian Chadd sc->sc_dolnadiv = 0;
130216ca234SAdrian Chadd return (0);
131216ca234SAdrian Chadd }
132216ca234SAdrian Chadd
133216ca234SAdrian Chadd /*
134216ca234SAdrian Chadd * Enable LNA diversity on the current channel if it's required.
135216ca234SAdrian Chadd */
136216ca234SAdrian Chadd int
ath_lna_div_enable(struct ath_softc * sc,const struct ieee80211_channel * chan)137216ca234SAdrian Chadd ath_lna_div_enable(struct ath_softc *sc, const struct ieee80211_channel *chan)
138216ca234SAdrian Chadd {
139216ca234SAdrian Chadd
140216ca234SAdrian Chadd return (0);
141216ca234SAdrian Chadd }
142216ca234SAdrian Chadd
143216ca234SAdrian Chadd /*
144216ca234SAdrian Chadd * Handle ioctl requests from the diagnostic interface.
145216ca234SAdrian Chadd *
146216ca234SAdrian Chadd * The initial part of this code resembles ath_ioctl_diag();
147216ca234SAdrian Chadd * it's likely a good idea to reduce duplication between
148216ca234SAdrian Chadd * these two routines.
149216ca234SAdrian Chadd */
150216ca234SAdrian Chadd int
ath_lna_div_ioctl(struct ath_softc * sc,struct ath_diag * ad)151216ca234SAdrian Chadd ath_lna_div_ioctl(struct ath_softc *sc, struct ath_diag *ad)
152216ca234SAdrian Chadd {
153216ca234SAdrian Chadd unsigned int id = ad->ad_id & ATH_DIAG_ID;
154216ca234SAdrian Chadd void *indata = NULL;
155216ca234SAdrian Chadd void *outdata = NULL;
156216ca234SAdrian Chadd u_int32_t insize = ad->ad_in_size;
157216ca234SAdrian Chadd u_int32_t outsize = ad->ad_out_size;
158216ca234SAdrian Chadd int error = 0;
159216ca234SAdrian Chadd // int val;
160216ca234SAdrian Chadd
161216ca234SAdrian Chadd if (ad->ad_id & ATH_DIAG_IN) {
162216ca234SAdrian Chadd /*
163216ca234SAdrian Chadd * Copy in data.
164216ca234SAdrian Chadd */
165216ca234SAdrian Chadd indata = malloc(insize, M_TEMP, M_NOWAIT);
166216ca234SAdrian Chadd if (indata == NULL) {
167216ca234SAdrian Chadd error = ENOMEM;
168216ca234SAdrian Chadd goto bad;
169216ca234SAdrian Chadd }
170216ca234SAdrian Chadd error = copyin(ad->ad_in_data, indata, insize);
171216ca234SAdrian Chadd if (error)
172216ca234SAdrian Chadd goto bad;
173216ca234SAdrian Chadd }
174216ca234SAdrian Chadd if (ad->ad_id & ATH_DIAG_DYN) {
175216ca234SAdrian Chadd /*
176216ca234SAdrian Chadd * Allocate a buffer for the results (otherwise the HAL
177216ca234SAdrian Chadd * returns a pointer to a buffer where we can read the
178216ca234SAdrian Chadd * results). Note that we depend on the HAL leaving this
179216ca234SAdrian Chadd * pointer for us to use below in reclaiming the buffer;
180216ca234SAdrian Chadd * may want to be more defensive.
181216ca234SAdrian Chadd */
182c2497245SEd Maste outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO);
183216ca234SAdrian Chadd if (outdata == NULL) {
184216ca234SAdrian Chadd error = ENOMEM;
185216ca234SAdrian Chadd goto bad;
186216ca234SAdrian Chadd }
187216ca234SAdrian Chadd }
188216ca234SAdrian Chadd switch (id) {
189216ca234SAdrian Chadd default:
190216ca234SAdrian Chadd error = EINVAL;
191c2497245SEd Maste goto bad;
192216ca234SAdrian Chadd }
193216ca234SAdrian Chadd if (outsize < ad->ad_out_size)
194216ca234SAdrian Chadd ad->ad_out_size = outsize;
195216ca234SAdrian Chadd if (outdata && copyout(outdata, ad->ad_out_data, ad->ad_out_size))
196216ca234SAdrian Chadd error = EFAULT;
197216ca234SAdrian Chadd bad:
198216ca234SAdrian Chadd if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL)
199216ca234SAdrian Chadd free(indata, M_TEMP);
200216ca234SAdrian Chadd if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL)
201216ca234SAdrian Chadd free(outdata, M_TEMP);
202216ca234SAdrian Chadd return (error);
203216ca234SAdrian Chadd }
204216ca234SAdrian Chadd
2059389d5a9SAdrian Chadd /*
2069389d5a9SAdrian Chadd * XXX need to low_rssi_thresh config from ath9k, to support CUS198
2079389d5a9SAdrian Chadd * antenna diversity correctly.
2089389d5a9SAdrian Chadd */
209216ca234SAdrian Chadd static HAL_BOOL
ath_is_alt_ant_ratio_better(int alt_ratio,int maxdelta,int mindelta,int main_rssi_avg,int alt_rssi_avg,int pkt_count)210216ca234SAdrian Chadd ath_is_alt_ant_ratio_better(int alt_ratio, int maxdelta, int mindelta,
211216ca234SAdrian Chadd int main_rssi_avg, int alt_rssi_avg, int pkt_count)
212216ca234SAdrian Chadd {
213216ca234SAdrian Chadd return (((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) &&
214216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg + maxdelta)) ||
215216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
216216ca234SAdrian Chadd }
217216ca234SAdrian Chadd
218216ca234SAdrian Chadd static void
ath_lnaconf_alt_good_scan(struct if_ath_ant_comb_state * antcomb,HAL_ANT_COMB_CONFIG * ant_conf,int main_rssi_avg)219216ca234SAdrian Chadd ath_lnaconf_alt_good_scan(struct if_ath_ant_comb_state *antcomb,
220216ca234SAdrian Chadd HAL_ANT_COMB_CONFIG *ant_conf, int main_rssi_avg)
221216ca234SAdrian Chadd {
222216ca234SAdrian Chadd antcomb->quick_scan_cnt = 0;
223216ca234SAdrian Chadd
224216ca234SAdrian Chadd if (ant_conf->main_lna_conf == HAL_ANT_DIV_COMB_LNA2)
225216ca234SAdrian Chadd antcomb->rssi_lna2 = main_rssi_avg;
226216ca234SAdrian Chadd else if (ant_conf->main_lna_conf == HAL_ANT_DIV_COMB_LNA1)
227216ca234SAdrian Chadd antcomb->rssi_lna1 = main_rssi_avg;
228216ca234SAdrian Chadd
229216ca234SAdrian Chadd switch ((ant_conf->main_lna_conf << 4) | ant_conf->alt_lna_conf) {
230216ca234SAdrian Chadd case (0x10): /* LNA2 A-B */
231216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
232216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
233216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
234216ca234SAdrian Chadd antcomb->second_quick_scan_conf = HAL_ANT_DIV_COMB_LNA1;
235216ca234SAdrian Chadd break;
236216ca234SAdrian Chadd case (0x20): /* LNA1 A-B */
237216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
238216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
239216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
240216ca234SAdrian Chadd antcomb->second_quick_scan_conf = HAL_ANT_DIV_COMB_LNA2;
241216ca234SAdrian Chadd break;
242216ca234SAdrian Chadd case (0x21): /* LNA1 LNA2 */
243216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA2;
244216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
245216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
246216ca234SAdrian Chadd antcomb->second_quick_scan_conf =
247216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
248216ca234SAdrian Chadd break;
249216ca234SAdrian Chadd case (0x12): /* LNA2 LNA1 */
250216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA1;
251216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
252216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
253216ca234SAdrian Chadd antcomb->second_quick_scan_conf =
254216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
255216ca234SAdrian Chadd break;
256216ca234SAdrian Chadd case (0x13): /* LNA2 A+B */
257216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
258216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
259216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
260216ca234SAdrian Chadd antcomb->second_quick_scan_conf = HAL_ANT_DIV_COMB_LNA1;
261216ca234SAdrian Chadd break;
262216ca234SAdrian Chadd case (0x23): /* LNA1 A+B */
263216ca234SAdrian Chadd antcomb->main_conf = HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
264216ca234SAdrian Chadd antcomb->first_quick_scan_conf =
265216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
266216ca234SAdrian Chadd antcomb->second_quick_scan_conf = HAL_ANT_DIV_COMB_LNA2;
267216ca234SAdrian Chadd break;
268216ca234SAdrian Chadd default:
269216ca234SAdrian Chadd break;
270216ca234SAdrian Chadd }
271216ca234SAdrian Chadd }
272216ca234SAdrian Chadd
273216ca234SAdrian Chadd static void
ath_select_ant_div_from_quick_scan(struct if_ath_ant_comb_state * antcomb,HAL_ANT_COMB_CONFIG * div_ant_conf,int main_rssi_avg,int alt_rssi_avg,int alt_ratio)274216ca234SAdrian Chadd ath_select_ant_div_from_quick_scan(struct if_ath_ant_comb_state *antcomb,
275216ca234SAdrian Chadd HAL_ANT_COMB_CONFIG *div_ant_conf, int main_rssi_avg,
276216ca234SAdrian Chadd int alt_rssi_avg, int alt_ratio)
277216ca234SAdrian Chadd {
278216ca234SAdrian Chadd /* alt_good */
279216ca234SAdrian Chadd switch (antcomb->quick_scan_cnt) {
280216ca234SAdrian Chadd case 0:
281216ca234SAdrian Chadd /* set alt to main, and alt to first conf */
282216ca234SAdrian Chadd div_ant_conf->main_lna_conf = antcomb->main_conf;
283216ca234SAdrian Chadd div_ant_conf->alt_lna_conf = antcomb->first_quick_scan_conf;
284216ca234SAdrian Chadd break;
285216ca234SAdrian Chadd case 1:
286216ca234SAdrian Chadd /* set alt to main, and alt to first conf */
287216ca234SAdrian Chadd div_ant_conf->main_lna_conf = antcomb->main_conf;
288216ca234SAdrian Chadd div_ant_conf->alt_lna_conf = antcomb->second_quick_scan_conf;
289216ca234SAdrian Chadd antcomb->rssi_first = main_rssi_avg;
290216ca234SAdrian Chadd antcomb->rssi_second = alt_rssi_avg;
291216ca234SAdrian Chadd
292216ca234SAdrian Chadd if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA1) {
293216ca234SAdrian Chadd /* main is LNA1 */
294216ca234SAdrian Chadd if (ath_is_alt_ant_ratio_better(alt_ratio,
295216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_HI,
296216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_LOW,
297216ca234SAdrian Chadd main_rssi_avg, alt_rssi_avg,
298216ca234SAdrian Chadd antcomb->total_pkt_count))
299216ca234SAdrian Chadd antcomb->first_ratio = AH_TRUE;
300216ca234SAdrian Chadd else
301216ca234SAdrian Chadd antcomb->first_ratio = AH_FALSE;
302216ca234SAdrian Chadd } else if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA2) {
303216ca234SAdrian Chadd if (ath_is_alt_ant_ratio_better(alt_ratio,
304216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_MID,
305216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_LOW,
306216ca234SAdrian Chadd main_rssi_avg, alt_rssi_avg,
307216ca234SAdrian Chadd antcomb->total_pkt_count))
308216ca234SAdrian Chadd antcomb->first_ratio = AH_TRUE;
309216ca234SAdrian Chadd else
310216ca234SAdrian Chadd antcomb->first_ratio = AH_FALSE;
311216ca234SAdrian Chadd } else {
312216ca234SAdrian Chadd if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) &&
313216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg +
314216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) ||
315216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg)) &&
316216ca234SAdrian Chadd (antcomb->total_pkt_count > 50))
317216ca234SAdrian Chadd antcomb->first_ratio = AH_TRUE;
318216ca234SAdrian Chadd else
319216ca234SAdrian Chadd antcomb->first_ratio = AH_FALSE;
320216ca234SAdrian Chadd }
321216ca234SAdrian Chadd break;
322216ca234SAdrian Chadd case 2:
323216ca234SAdrian Chadd antcomb->alt_good = AH_FALSE;
324216ca234SAdrian Chadd antcomb->scan_not_start = AH_FALSE;
325216ca234SAdrian Chadd antcomb->scan = AH_FALSE;
326216ca234SAdrian Chadd antcomb->rssi_first = main_rssi_avg;
327216ca234SAdrian Chadd antcomb->rssi_third = alt_rssi_avg;
328216ca234SAdrian Chadd
329216ca234SAdrian Chadd if (antcomb->second_quick_scan_conf == HAL_ANT_DIV_COMB_LNA1)
330216ca234SAdrian Chadd antcomb->rssi_lna1 = alt_rssi_avg;
331216ca234SAdrian Chadd else if (antcomb->second_quick_scan_conf ==
332216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
333216ca234SAdrian Chadd antcomb->rssi_lna2 = alt_rssi_avg;
334216ca234SAdrian Chadd else if (antcomb->second_quick_scan_conf ==
335216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2) {
336216ca234SAdrian Chadd if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA2)
337216ca234SAdrian Chadd antcomb->rssi_lna2 = main_rssi_avg;
338216ca234SAdrian Chadd else if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA1)
339216ca234SAdrian Chadd antcomb->rssi_lna1 = main_rssi_avg;
340216ca234SAdrian Chadd }
341216ca234SAdrian Chadd
342216ca234SAdrian Chadd if (antcomb->rssi_lna2 > antcomb->rssi_lna1 +
343216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA)
344216ca234SAdrian Chadd div_ant_conf->main_lna_conf = HAL_ANT_DIV_COMB_LNA2;
345216ca234SAdrian Chadd else
346216ca234SAdrian Chadd div_ant_conf->main_lna_conf = HAL_ANT_DIV_COMB_LNA1;
347216ca234SAdrian Chadd
348216ca234SAdrian Chadd if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA1) {
349216ca234SAdrian Chadd if (ath_is_alt_ant_ratio_better(alt_ratio,
350216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_HI,
351216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_LOW,
352216ca234SAdrian Chadd main_rssi_avg, alt_rssi_avg,
353216ca234SAdrian Chadd antcomb->total_pkt_count))
354216ca234SAdrian Chadd antcomb->second_ratio = AH_TRUE;
355216ca234SAdrian Chadd else
356216ca234SAdrian Chadd antcomb->second_ratio = AH_FALSE;
357216ca234SAdrian Chadd } else if (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA2) {
358216ca234SAdrian Chadd if (ath_is_alt_ant_ratio_better(alt_ratio,
359216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_MID,
360216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_LOW,
361216ca234SAdrian Chadd main_rssi_avg, alt_rssi_avg,
362216ca234SAdrian Chadd antcomb->total_pkt_count))
363216ca234SAdrian Chadd antcomb->second_ratio = AH_TRUE;
364216ca234SAdrian Chadd else
365216ca234SAdrian Chadd antcomb->second_ratio = AH_FALSE;
366216ca234SAdrian Chadd } else {
367216ca234SAdrian Chadd if ((((alt_ratio >= ATH_ANT_DIV_COMB_ALT_ANT_RATIO2) &&
368216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg +
369216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_DELTA_HI)) ||
370216ca234SAdrian Chadd (alt_rssi_avg > main_rssi_avg)) &&
371216ca234SAdrian Chadd (antcomb->total_pkt_count > 50))
372216ca234SAdrian Chadd antcomb->second_ratio = AH_TRUE;
373216ca234SAdrian Chadd else
374216ca234SAdrian Chadd antcomb->second_ratio = AH_FALSE;
375216ca234SAdrian Chadd }
376216ca234SAdrian Chadd
377216ca234SAdrian Chadd /* set alt to the conf with maximun ratio */
378216ca234SAdrian Chadd if (antcomb->first_ratio && antcomb->second_ratio) {
379216ca234SAdrian Chadd if (antcomb->rssi_second > antcomb->rssi_third) {
380216ca234SAdrian Chadd /* first alt*/
381216ca234SAdrian Chadd if ((antcomb->first_quick_scan_conf ==
382216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1) ||
383216ca234SAdrian Chadd (antcomb->first_quick_scan_conf ==
384216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2))
385216ca234SAdrian Chadd /* Set alt LNA1 or LNA2*/
386216ca234SAdrian Chadd if (div_ant_conf->main_lna_conf ==
387216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
388216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
389216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
390216ca234SAdrian Chadd else
391216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
392216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
393216ca234SAdrian Chadd else
394216ca234SAdrian Chadd /* Set alt to A+B or A-B */
395216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
396216ca234SAdrian Chadd antcomb->first_quick_scan_conf;
397216ca234SAdrian Chadd } else if ((antcomb->second_quick_scan_conf ==
398216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1) ||
399216ca234SAdrian Chadd (antcomb->second_quick_scan_conf ==
400216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)) {
401216ca234SAdrian Chadd /* Set alt LNA1 or LNA2 */
402216ca234SAdrian Chadd if (div_ant_conf->main_lna_conf ==
403216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
404216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
405216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
406216ca234SAdrian Chadd else
407216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
408216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
409216ca234SAdrian Chadd } else {
410216ca234SAdrian Chadd /* Set alt to A+B or A-B */
411216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
412216ca234SAdrian Chadd antcomb->second_quick_scan_conf;
413216ca234SAdrian Chadd }
414216ca234SAdrian Chadd } else if (antcomb->first_ratio) {
415216ca234SAdrian Chadd /* first alt */
416216ca234SAdrian Chadd if ((antcomb->first_quick_scan_conf ==
417216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1) ||
418216ca234SAdrian Chadd (antcomb->first_quick_scan_conf ==
419216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2))
420216ca234SAdrian Chadd /* Set alt LNA1 or LNA2 */
421216ca234SAdrian Chadd if (div_ant_conf->main_lna_conf ==
422216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
423216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
424216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
425216ca234SAdrian Chadd else
426216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
427216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
428216ca234SAdrian Chadd else
429216ca234SAdrian Chadd /* Set alt to A+B or A-B */
430216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
431216ca234SAdrian Chadd antcomb->first_quick_scan_conf;
432216ca234SAdrian Chadd } else if (antcomb->second_ratio) {
433216ca234SAdrian Chadd /* second alt */
434216ca234SAdrian Chadd if ((antcomb->second_quick_scan_conf ==
435216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1) ||
436216ca234SAdrian Chadd (antcomb->second_quick_scan_conf ==
437216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2))
438216ca234SAdrian Chadd /* Set alt LNA1 or LNA2 */
439216ca234SAdrian Chadd if (div_ant_conf->main_lna_conf ==
440216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
441216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
442216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
443216ca234SAdrian Chadd else
444216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
445216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
446216ca234SAdrian Chadd else
447216ca234SAdrian Chadd /* Set alt to A+B or A-B */
448216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
449216ca234SAdrian Chadd antcomb->second_quick_scan_conf;
450216ca234SAdrian Chadd } else {
451216ca234SAdrian Chadd /* main is largest */
452216ca234SAdrian Chadd if ((antcomb->main_conf == HAL_ANT_DIV_COMB_LNA1) ||
453216ca234SAdrian Chadd (antcomb->main_conf == HAL_ANT_DIV_COMB_LNA2))
454216ca234SAdrian Chadd /* Set alt LNA1 or LNA2 */
455216ca234SAdrian Chadd if (div_ant_conf->main_lna_conf ==
456216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2)
457216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
458216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
459216ca234SAdrian Chadd else
460216ca234SAdrian Chadd div_ant_conf->alt_lna_conf =
461216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
462216ca234SAdrian Chadd else
463216ca234SAdrian Chadd /* Set alt to A+B or A-B */
464216ca234SAdrian Chadd div_ant_conf->alt_lna_conf = antcomb->main_conf;
465216ca234SAdrian Chadd }
466216ca234SAdrian Chadd break;
467216ca234SAdrian Chadd default:
468216ca234SAdrian Chadd break;
469216ca234SAdrian Chadd }
470216ca234SAdrian Chadd }
471216ca234SAdrian Chadd
472216ca234SAdrian Chadd static void
ath_ant_adjust_fast_divbias(struct if_ath_ant_comb_state * antcomb,int alt_ratio,int alt_ant_ratio_th,u_int config_group,HAL_ANT_COMB_CONFIG * pdiv_ant_conf)4730f0eebe7SAdrian Chadd ath_ant_adjust_fast_divbias(struct if_ath_ant_comb_state *antcomb,
4740f0eebe7SAdrian Chadd int alt_ratio, int alt_ant_ratio_th, u_int config_group,
4750f0eebe7SAdrian Chadd HAL_ANT_COMB_CONFIG *pdiv_ant_conf)
476216ca234SAdrian Chadd {
4770f0eebe7SAdrian Chadd
4780f0eebe7SAdrian Chadd if (config_group == HAL_ANTDIV_CONFIG_GROUP_1) {
4790f0eebe7SAdrian Chadd switch ((pdiv_ant_conf->main_lna_conf << 4)
4800f0eebe7SAdrian Chadd | pdiv_ant_conf->alt_lna_conf) {
4810f0eebe7SAdrian Chadd case (0x01): //A-B LNA2
4820f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
4830f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
4840f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
485216ca234SAdrian Chadd break;
4860f0eebe7SAdrian Chadd case (0x02): //A-B LNA1
4870f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
4880f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
4890f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
490216ca234SAdrian Chadd break;
4910f0eebe7SAdrian Chadd case (0x03): //A-B A+B
4920f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
4930f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
4940f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
495216ca234SAdrian Chadd break;
4960f0eebe7SAdrian Chadd case (0x10): //LNA2 A-B
4970f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
4980f0eebe7SAdrian Chadd && (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
4990f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3f;
5000f0eebe7SAdrian Chadd } else {
5010f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5020f0eebe7SAdrian Chadd }
5030f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5040f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
505216ca234SAdrian Chadd break;
5060f0eebe7SAdrian Chadd case (0x12): //LNA2 LNA1
5070f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5080f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5090f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
510216ca234SAdrian Chadd break;
5110f0eebe7SAdrian Chadd case (0x13): //LNA2 A+B
5120f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
5130f0eebe7SAdrian Chadd && (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
5140f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3f;
5150f0eebe7SAdrian Chadd } else {
5160f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5170f0eebe7SAdrian Chadd }
5180f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5190f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
520216ca234SAdrian Chadd break;
5210f0eebe7SAdrian Chadd case (0x20): //LNA1 A-B
5220f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
5230f0eebe7SAdrian Chadd && (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
5240f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3f;
5250f0eebe7SAdrian Chadd } else {
5260f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5270f0eebe7SAdrian Chadd }
5280f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5290f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
530216ca234SAdrian Chadd break;
5310f0eebe7SAdrian Chadd case (0x21): //LNA1 LNA2
5320f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5330f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5340f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
535216ca234SAdrian Chadd break;
5360f0eebe7SAdrian Chadd case (0x23): //LNA1 A+B
5370f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
5380f0eebe7SAdrian Chadd && (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO)) {
5390f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3f;
5400f0eebe7SAdrian Chadd } else {
5410f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5420f0eebe7SAdrian Chadd }
5430f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5440f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
545216ca234SAdrian Chadd break;
5460f0eebe7SAdrian Chadd case (0x30): //A+B A-B
5470f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5480f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5490f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
550216ca234SAdrian Chadd break;
5510f0eebe7SAdrian Chadd case (0x31): //A+B LNA2
5520f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5530f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5540f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
555216ca234SAdrian Chadd break;
5560f0eebe7SAdrian Chadd case (0x32): //A+B LNA1
5570f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5580f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5590f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5600f0eebe7SAdrian Chadd break;
5610f0eebe7SAdrian Chadd default:
5620f0eebe7SAdrian Chadd break;
5630f0eebe7SAdrian Chadd }
5640f0eebe7SAdrian Chadd } else if (config_group == HAL_ANTDIV_CONFIG_GROUP_2) {
5650f0eebe7SAdrian Chadd switch ((pdiv_ant_conf->main_lna_conf << 4)
5660f0eebe7SAdrian Chadd | pdiv_ant_conf->alt_lna_conf) {
5670f0eebe7SAdrian Chadd case (0x01): //A-B LNA2
5680f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5690f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5700f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5710f0eebe7SAdrian Chadd break;
5720f0eebe7SAdrian Chadd case (0x02): //A-B LNA1
5730f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5740f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5750f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5760f0eebe7SAdrian Chadd break;
5770f0eebe7SAdrian Chadd case (0x03): //A-B A+B
5780f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5790f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5800f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5810f0eebe7SAdrian Chadd break;
5820f0eebe7SAdrian Chadd case (0x10): //LNA2 A-B
5830f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
5840f0eebe7SAdrian Chadd && (alt_ratio > alt_ant_ratio_th)) {
5850f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5860f0eebe7SAdrian Chadd } else {
5870f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x2;
5880f0eebe7SAdrian Chadd }
5890f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5900f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5910f0eebe7SAdrian Chadd break;
5920f0eebe7SAdrian Chadd case (0x12): //LNA2 LNA1
5930f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
5940f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
5950f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
5960f0eebe7SAdrian Chadd break;
5970f0eebe7SAdrian Chadd case (0x13): //LNA2 A+B
5980f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
5990f0eebe7SAdrian Chadd && (alt_ratio > alt_ant_ratio_th)) {
6000f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6010f0eebe7SAdrian Chadd } else {
6020f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x2;
6030f0eebe7SAdrian Chadd }
6040f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6050f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6060f0eebe7SAdrian Chadd break;
6070f0eebe7SAdrian Chadd case (0x20): //LNA1 A-B
6080f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
6090f0eebe7SAdrian Chadd && (alt_ratio > alt_ant_ratio_th)) {
6100f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6110f0eebe7SAdrian Chadd } else {
6120f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x2;
6130f0eebe7SAdrian Chadd }
6140f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6150f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6160f0eebe7SAdrian Chadd break;
6170f0eebe7SAdrian Chadd case (0x21): //LNA1 LNA2
6180f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6190f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6200f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6210f0eebe7SAdrian Chadd break;
6220f0eebe7SAdrian Chadd case (0x23): //LNA1 A+B
6230f0eebe7SAdrian Chadd if ((antcomb->scan == 0)
6240f0eebe7SAdrian Chadd && (alt_ratio > alt_ant_ratio_th)) {
6250f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6260f0eebe7SAdrian Chadd } else {
6270f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x2;
6280f0eebe7SAdrian Chadd }
6290f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6300f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6310f0eebe7SAdrian Chadd break;
6320f0eebe7SAdrian Chadd case (0x30): //A+B A-B
6330f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6340f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6350f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6360f0eebe7SAdrian Chadd break;
6370f0eebe7SAdrian Chadd case (0x31): //A+B LNA2
6380f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6390f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6400f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6410f0eebe7SAdrian Chadd break;
6420f0eebe7SAdrian Chadd case (0x32): //A+B LNA1
6430f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6440f0eebe7SAdrian Chadd pdiv_ant_conf->main_gaintb = 0;
6450f0eebe7SAdrian Chadd pdiv_ant_conf->alt_gaintb = 0;
6460f0eebe7SAdrian Chadd break;
6470f0eebe7SAdrian Chadd default:
6480f0eebe7SAdrian Chadd break;
6490f0eebe7SAdrian Chadd }
6500f0eebe7SAdrian Chadd } else { /* DEFAULT_ANTDIV_CONFIG_GROUP */
6510f0eebe7SAdrian Chadd switch ((pdiv_ant_conf->main_lna_conf << 4) | pdiv_ant_conf->alt_lna_conf) {
6520f0eebe7SAdrian Chadd case (0x01): //A-B LNA2
6530f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3b;
6540f0eebe7SAdrian Chadd break;
6550f0eebe7SAdrian Chadd case (0x02): //A-B LNA1
6560f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3d;
6570f0eebe7SAdrian Chadd break;
6580f0eebe7SAdrian Chadd case (0x03): //A-B A+B
6590f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6600f0eebe7SAdrian Chadd break;
6610f0eebe7SAdrian Chadd case (0x10): //LNA2 A-B
6620f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x7;
6630f0eebe7SAdrian Chadd break;
6640f0eebe7SAdrian Chadd case (0x12): //LNA2 LNA1
6650f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x2;
6660f0eebe7SAdrian Chadd break;
6670f0eebe7SAdrian Chadd case (0x13): //LNA2 A+B
6680f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x7;
6690f0eebe7SAdrian Chadd break;
6700f0eebe7SAdrian Chadd case (0x20): //LNA1 A-B
6710f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x6;
6720f0eebe7SAdrian Chadd break;
6730f0eebe7SAdrian Chadd case (0x21): //LNA1 LNA2
6740f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x0;
6750f0eebe7SAdrian Chadd break;
6760f0eebe7SAdrian Chadd case (0x23): //LNA1 A+B
6770f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x6;
6780f0eebe7SAdrian Chadd break;
6790f0eebe7SAdrian Chadd case (0x30): //A+B A-B
6800f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x1;
6810f0eebe7SAdrian Chadd break;
6820f0eebe7SAdrian Chadd case (0x31): //A+B LNA2
6830f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3b;
6840f0eebe7SAdrian Chadd break;
6850f0eebe7SAdrian Chadd case (0x32): //A+B LNA1
6860f0eebe7SAdrian Chadd pdiv_ant_conf->fast_div_bias = 0x3d;
687216ca234SAdrian Chadd break;
688216ca234SAdrian Chadd default:
689216ca234SAdrian Chadd break;
690216ca234SAdrian Chadd }
691216ca234SAdrian Chadd }
6920f0eebe7SAdrian Chadd }
6930f0eebe7SAdrian Chadd
6940f0eebe7SAdrian Chadd /*
6950f0eebe7SAdrian Chadd * AR9485/AR933x TODO:
6960f0eebe7SAdrian Chadd * + Select a ratio based on whether RSSI is low or not; but I need
6970f0eebe7SAdrian Chadd * to figure out what "low_rssi_th" is sourced from.
6980f0eebe7SAdrian Chadd * + What's ath_ant_div_comb_alt_check() in the reference driver do?
6990f0eebe7SAdrian Chadd * + .. and there's likely a bunch of other things to include in this.
7000f0eebe7SAdrian Chadd */
701216ca234SAdrian Chadd
702216ca234SAdrian Chadd /* Antenna diversity and combining */
703216ca234SAdrian Chadd void
ath_lna_rx_comb_scan(struct ath_softc * sc,struct ath_rx_status * rs,unsigned long ticks,int hz)704216ca234SAdrian Chadd ath_lna_rx_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs,
705216ca234SAdrian Chadd unsigned long ticks, int hz)
706216ca234SAdrian Chadd {
707216ca234SAdrian Chadd HAL_ANT_COMB_CONFIG div_ant_conf;
708216ca234SAdrian Chadd struct if_ath_ant_comb_state *antcomb = sc->sc_lna_div;
709216ca234SAdrian Chadd int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
710216ca234SAdrian Chadd int curr_main_set, curr_bias;
711216ca234SAdrian Chadd int main_rssi = rs->rs_rssi_ctl[0];
712216ca234SAdrian Chadd int alt_rssi = rs->rs_rssi_ctl[1];
713216ca234SAdrian Chadd int rx_ant_conf, main_ant_conf, alt_ant_conf;
714216ca234SAdrian Chadd HAL_BOOL short_scan = AH_FALSE;
715216ca234SAdrian Chadd
716216ca234SAdrian Chadd rx_ant_conf = (rs->rs_rssi_ctl[2] >> 4) & ATH_ANT_RX_MASK;
717216ca234SAdrian Chadd main_ant_conf = (rs->rs_rssi_ctl[2] >> 2) & ATH_ANT_RX_MASK;
718216ca234SAdrian Chadd alt_ant_conf = (rs->rs_rssi_ctl[2] >> 0) & ATH_ANT_RX_MASK;
719216ca234SAdrian Chadd
720216ca234SAdrian Chadd #if 0
721216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY,
722216ca234SAdrian Chadd "%s: RSSI %d/%d, conf %x/%x, rxconf %x, LNA: %d; ANT: %d; "
723216ca234SAdrian Chadd "FastDiv: %d\n",
724216ca234SAdrian Chadd __func__,
725216ca234SAdrian Chadd main_rssi,
726216ca234SAdrian Chadd alt_rssi,
727216ca234SAdrian Chadd main_ant_conf,
728216ca234SAdrian Chadd alt_ant_conf,
729216ca234SAdrian Chadd rx_ant_conf,
730216ca234SAdrian Chadd !!(rs->rs_rssi_ctl[2] & 0x80),
731216ca234SAdrian Chadd !!(rs->rs_rssi_ctl[2] & 0x40),
732216ca234SAdrian Chadd !!(rs->rs_rssi_ext[2] & 0x40));
733216ca234SAdrian Chadd #endif
734216ca234SAdrian Chadd
735216ca234SAdrian Chadd /*
736216ca234SAdrian Chadd * If LNA diversity combining isn't enabled, don't run this.
737216ca234SAdrian Chadd */
738216ca234SAdrian Chadd if (! sc->sc_dolnadiv)
739216ca234SAdrian Chadd return;
740216ca234SAdrian Chadd
741216ca234SAdrian Chadd /*
742216ca234SAdrian Chadd * XXX this is ugly, but the HAL code attaches the
743216ca234SAdrian Chadd * LNA diversity to the TX antenna settings.
744216ca234SAdrian Chadd * I don't know why.
745216ca234SAdrian Chadd */
746216ca234SAdrian Chadd if (sc->sc_txantenna != HAL_ANT_VARIABLE)
747216ca234SAdrian Chadd return;
748216ca234SAdrian Chadd
749216ca234SAdrian Chadd /* Record packet only when alt_rssi is positive */
750216ca234SAdrian Chadd if (main_rssi > 0 && alt_rssi > 0) {
751216ca234SAdrian Chadd antcomb->total_pkt_count++;
752216ca234SAdrian Chadd antcomb->main_total_rssi += main_rssi;
753216ca234SAdrian Chadd antcomb->alt_total_rssi += alt_rssi;
754216ca234SAdrian Chadd if (main_ant_conf == rx_ant_conf)
755216ca234SAdrian Chadd antcomb->main_recv_cnt++;
756216ca234SAdrian Chadd else
757216ca234SAdrian Chadd antcomb->alt_recv_cnt++;
758216ca234SAdrian Chadd }
759216ca234SAdrian Chadd
760216ca234SAdrian Chadd /* Short scan check */
761216ca234SAdrian Chadd if (antcomb->scan && antcomb->alt_good) {
762b8e29e06SAdrian Chadd if (ieee80211_time_after(ticks, antcomb->scan_start_time +
763216ca234SAdrian Chadd msecs_to_jiffies(ATH_ANT_DIV_COMB_SHORT_SCAN_INTR)))
764216ca234SAdrian Chadd short_scan = AH_TRUE;
765216ca234SAdrian Chadd else
766216ca234SAdrian Chadd if (antcomb->total_pkt_count ==
767216ca234SAdrian Chadd ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT) {
768216ca234SAdrian Chadd alt_ratio = ((antcomb->alt_recv_cnt * 100) /
769216ca234SAdrian Chadd antcomb->total_pkt_count);
770216ca234SAdrian Chadd if (alt_ratio < ATH_ANT_DIV_COMB_ALT_ANT_RATIO)
771216ca234SAdrian Chadd short_scan = AH_TRUE;
772216ca234SAdrian Chadd }
773216ca234SAdrian Chadd }
774216ca234SAdrian Chadd
7750f0eebe7SAdrian Chadd #if 0
7760f0eebe7SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY,
7770f0eebe7SAdrian Chadd "%s: total pkt=%d, aggr=%d, short_scan=%d\n",
7780f0eebe7SAdrian Chadd __func__,
7790f0eebe7SAdrian Chadd antcomb->total_pkt_count,
7800f0eebe7SAdrian Chadd !! (rs->rs_moreaggr),
7810f0eebe7SAdrian Chadd !! (short_scan));
7820f0eebe7SAdrian Chadd #endif
7830f0eebe7SAdrian Chadd
784216ca234SAdrian Chadd if (((antcomb->total_pkt_count < ATH_ANT_DIV_COMB_MAX_PKTCOUNT) ||
785216ca234SAdrian Chadd rs->rs_moreaggr) && !short_scan)
786216ca234SAdrian Chadd return;
787216ca234SAdrian Chadd
788216ca234SAdrian Chadd if (antcomb->total_pkt_count) {
789216ca234SAdrian Chadd alt_ratio = ((antcomb->alt_recv_cnt * 100) /
790216ca234SAdrian Chadd antcomb->total_pkt_count);
791216ca234SAdrian Chadd main_rssi_avg = (antcomb->main_total_rssi /
792216ca234SAdrian Chadd antcomb->total_pkt_count);
793216ca234SAdrian Chadd alt_rssi_avg = (antcomb->alt_total_rssi /
794216ca234SAdrian Chadd antcomb->total_pkt_count);
795216ca234SAdrian Chadd }
796216ca234SAdrian Chadd
797216ca234SAdrian Chadd OS_MEMZERO(&div_ant_conf, sizeof(div_ant_conf));
798216ca234SAdrian Chadd
799216ca234SAdrian Chadd ath_hal_div_comb_conf_get(sc->sc_ah, &div_ant_conf);
800216ca234SAdrian Chadd curr_alt_set = div_ant_conf.alt_lna_conf;
801216ca234SAdrian Chadd curr_main_set = div_ant_conf.main_lna_conf;
802216ca234SAdrian Chadd curr_bias = div_ant_conf.fast_div_bias;
803216ca234SAdrian Chadd
804216ca234SAdrian Chadd antcomb->count++;
805216ca234SAdrian Chadd
806216ca234SAdrian Chadd if (antcomb->count == ATH_ANT_DIV_COMB_MAX_COUNT) {
807216ca234SAdrian Chadd if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) {
808216ca234SAdrian Chadd ath_lnaconf_alt_good_scan(antcomb, &div_ant_conf,
809216ca234SAdrian Chadd main_rssi_avg);
810216ca234SAdrian Chadd antcomb->alt_good = AH_TRUE;
811216ca234SAdrian Chadd } else {
812216ca234SAdrian Chadd antcomb->alt_good = AH_FALSE;
813216ca234SAdrian Chadd }
814216ca234SAdrian Chadd
815216ca234SAdrian Chadd antcomb->count = 0;
816216ca234SAdrian Chadd antcomb->scan = AH_TRUE;
817216ca234SAdrian Chadd antcomb->scan_not_start = AH_TRUE;
818216ca234SAdrian Chadd }
819216ca234SAdrian Chadd
820216ca234SAdrian Chadd if (!antcomb->scan) {
821216ca234SAdrian Chadd if (alt_ratio > ATH_ANT_DIV_COMB_ALT_ANT_RATIO) {
822216ca234SAdrian Chadd if (curr_alt_set == HAL_ANT_DIV_COMB_LNA2) {
823216ca234SAdrian Chadd /* Switch main and alt LNA */
824216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
825216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
826216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
827216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
828216ca234SAdrian Chadd } else if (curr_alt_set == HAL_ANT_DIV_COMB_LNA1) {
829216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
830216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
831216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
832216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
833216ca234SAdrian Chadd }
834216ca234SAdrian Chadd
835216ca234SAdrian Chadd goto div_comb_done;
836216ca234SAdrian Chadd } else if ((curr_alt_set != HAL_ANT_DIV_COMB_LNA1) &&
837216ca234SAdrian Chadd (curr_alt_set != HAL_ANT_DIV_COMB_LNA2)) {
838216ca234SAdrian Chadd /* Set alt to another LNA */
839216ca234SAdrian Chadd if (curr_main_set == HAL_ANT_DIV_COMB_LNA2)
840216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
841216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
842216ca234SAdrian Chadd else if (curr_main_set == HAL_ANT_DIV_COMB_LNA1)
843216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
844216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
845216ca234SAdrian Chadd
846216ca234SAdrian Chadd goto div_comb_done;
847216ca234SAdrian Chadd }
848216ca234SAdrian Chadd
849216ca234SAdrian Chadd if ((alt_rssi_avg < (main_rssi_avg +
8500f0eebe7SAdrian Chadd antcomb->lna1_lna2_delta)))
851216ca234SAdrian Chadd goto div_comb_done;
852216ca234SAdrian Chadd }
853216ca234SAdrian Chadd
854216ca234SAdrian Chadd if (!antcomb->scan_not_start) {
855216ca234SAdrian Chadd switch (curr_alt_set) {
856216ca234SAdrian Chadd case HAL_ANT_DIV_COMB_LNA2:
857216ca234SAdrian Chadd antcomb->rssi_lna2 = alt_rssi_avg;
858216ca234SAdrian Chadd antcomb->rssi_lna1 = main_rssi_avg;
859216ca234SAdrian Chadd antcomb->scan = AH_TRUE;
860216ca234SAdrian Chadd /* set to A+B */
861216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
862216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
863216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
864216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
865216ca234SAdrian Chadd break;
866216ca234SAdrian Chadd case HAL_ANT_DIV_COMB_LNA1:
867216ca234SAdrian Chadd antcomb->rssi_lna1 = alt_rssi_avg;
868216ca234SAdrian Chadd antcomb->rssi_lna2 = main_rssi_avg;
869216ca234SAdrian Chadd antcomb->scan = AH_TRUE;
870216ca234SAdrian Chadd /* set to A+B */
871216ca234SAdrian Chadd div_ant_conf.main_lna_conf = HAL_ANT_DIV_COMB_LNA2;
872216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
873216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
874216ca234SAdrian Chadd break;
875216ca234SAdrian Chadd case HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2:
876216ca234SAdrian Chadd antcomb->rssi_add = alt_rssi_avg;
877216ca234SAdrian Chadd antcomb->scan = AH_TRUE;
878216ca234SAdrian Chadd /* set to A-B */
879216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
880216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
881216ca234SAdrian Chadd break;
882216ca234SAdrian Chadd case HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2:
883216ca234SAdrian Chadd antcomb->rssi_sub = alt_rssi_avg;
884216ca234SAdrian Chadd antcomb->scan = AH_FALSE;
885216ca234SAdrian Chadd if (antcomb->rssi_lna2 >
886216ca234SAdrian Chadd (antcomb->rssi_lna1 +
887216ca234SAdrian Chadd ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA)) {
888216ca234SAdrian Chadd /* use LNA2 as main LNA */
889216ca234SAdrian Chadd if ((antcomb->rssi_add > antcomb->rssi_lna1) &&
890216ca234SAdrian Chadd (antcomb->rssi_add > antcomb->rssi_sub)) {
891216ca234SAdrian Chadd /* set to A+B */
892216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
893216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
894216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
895216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
896216ca234SAdrian Chadd } else if (antcomb->rssi_sub >
897216ca234SAdrian Chadd antcomb->rssi_lna1) {
898216ca234SAdrian Chadd /* set to A-B */
899216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
900216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
901216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
902216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
903216ca234SAdrian Chadd } else {
904216ca234SAdrian Chadd /* set to LNA1 */
905216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
906216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
907216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
908216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
909216ca234SAdrian Chadd }
910216ca234SAdrian Chadd } else {
911216ca234SAdrian Chadd /* use LNA1 as main LNA */
912216ca234SAdrian Chadd if ((antcomb->rssi_add > antcomb->rssi_lna2) &&
913216ca234SAdrian Chadd (antcomb->rssi_add > antcomb->rssi_sub)) {
914216ca234SAdrian Chadd /* set to A+B */
915216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
916216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
917216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
918216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2;
919216ca234SAdrian Chadd } else if (antcomb->rssi_sub >
920216ca234SAdrian Chadd antcomb->rssi_lna1) {
921216ca234SAdrian Chadd /* set to A-B */
922216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
923216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
924216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
925216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2;
926216ca234SAdrian Chadd } else {
927216ca234SAdrian Chadd /* set to LNA2 */
928216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
929216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
930216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
931216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
932216ca234SAdrian Chadd }
933216ca234SAdrian Chadd }
934216ca234SAdrian Chadd break;
935216ca234SAdrian Chadd default:
936216ca234SAdrian Chadd break;
937216ca234SAdrian Chadd }
938216ca234SAdrian Chadd } else {
939216ca234SAdrian Chadd if (!antcomb->alt_good) {
940216ca234SAdrian Chadd antcomb->scan_not_start = AH_FALSE;
941216ca234SAdrian Chadd /* Set alt to another LNA */
942216ca234SAdrian Chadd if (curr_main_set == HAL_ANT_DIV_COMB_LNA2) {
943216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
944216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
945216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
946216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
947216ca234SAdrian Chadd } else if (curr_main_set == HAL_ANT_DIV_COMB_LNA1) {
948216ca234SAdrian Chadd div_ant_conf.main_lna_conf =
949216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA1;
950216ca234SAdrian Chadd div_ant_conf.alt_lna_conf =
951216ca234SAdrian Chadd HAL_ANT_DIV_COMB_LNA2;
952216ca234SAdrian Chadd }
953216ca234SAdrian Chadd goto div_comb_done;
954216ca234SAdrian Chadd }
955216ca234SAdrian Chadd }
956216ca234SAdrian Chadd
957216ca234SAdrian Chadd ath_select_ant_div_from_quick_scan(antcomb, &div_ant_conf,
958216ca234SAdrian Chadd main_rssi_avg, alt_rssi_avg,
959216ca234SAdrian Chadd alt_ratio);
960216ca234SAdrian Chadd
961216ca234SAdrian Chadd antcomb->quick_scan_cnt++;
962216ca234SAdrian Chadd
963216ca234SAdrian Chadd div_comb_done:
9640f0eebe7SAdrian Chadd #if 0
965216ca234SAdrian Chadd ath_ant_div_conf_fast_divbias(&div_ant_conf);
9660f0eebe7SAdrian Chadd #endif
9670f0eebe7SAdrian Chadd
9680f0eebe7SAdrian Chadd ath_ant_adjust_fast_divbias(antcomb,
9690f0eebe7SAdrian Chadd alt_ratio,
9700f0eebe7SAdrian Chadd ATH_ANT_DIV_COMB_ALT_ANT_RATIO,
9710f0eebe7SAdrian Chadd div_ant_conf.antdiv_configgroup,
9720f0eebe7SAdrian Chadd &div_ant_conf);
973216ca234SAdrian Chadd
974216ca234SAdrian Chadd ath_hal_div_comb_conf_set(sc->sc_ah, &div_ant_conf);
975216ca234SAdrian Chadd
976216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: total_pkt_count=%d\n",
977216ca234SAdrian Chadd __func__, antcomb->total_pkt_count);
978216ca234SAdrian Chadd
979216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: main_total_rssi=%d\n",
980216ca234SAdrian Chadd __func__, antcomb->main_total_rssi);
981216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: alt_total_rssi=%d\n",
982216ca234SAdrian Chadd __func__, antcomb->alt_total_rssi);
983216ca234SAdrian Chadd
984216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: main_rssi_avg=%d\n",
985216ca234SAdrian Chadd __func__, main_rssi_avg);
986216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: alt_alt_rssi_avg=%d\n",
987216ca234SAdrian Chadd __func__, alt_rssi_avg);
988216ca234SAdrian Chadd
989216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: main_recv_cnt=%d\n",
990216ca234SAdrian Chadd __func__, antcomb->main_recv_cnt);
991216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: alt_recv_cnt=%d\n",
992216ca234SAdrian Chadd __func__, antcomb->alt_recv_cnt);
993216ca234SAdrian Chadd
994216ca234SAdrian Chadd // if (curr_alt_set != div_ant_conf.alt_lna_conf)
995216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: lna_conf: %x -> %x\n",
996216ca234SAdrian Chadd __func__, curr_alt_set, div_ant_conf.alt_lna_conf);
997216ca234SAdrian Chadd // if (curr_main_set != div_ant_conf.main_lna_conf)
998216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: main_lna_conf: %x -> %x\n",
999216ca234SAdrian Chadd __func__, curr_main_set, div_ant_conf.main_lna_conf);
1000216ca234SAdrian Chadd // if (curr_bias != div_ant_conf.fast_div_bias)
1001216ca234SAdrian Chadd DPRINTF(sc, ATH_DEBUG_DIVERSITY, "%s: fast_div_bias: %x -> %x\n",
1002216ca234SAdrian Chadd __func__, curr_bias, div_ant_conf.fast_div_bias);
1003216ca234SAdrian Chadd
1004216ca234SAdrian Chadd antcomb->scan_start_time = ticks;
1005216ca234SAdrian Chadd antcomb->total_pkt_count = 0;
1006216ca234SAdrian Chadd antcomb->main_total_rssi = 0;
1007216ca234SAdrian Chadd antcomb->alt_total_rssi = 0;
1008216ca234SAdrian Chadd antcomb->main_recv_cnt = 0;
1009216ca234SAdrian Chadd antcomb->alt_recv_cnt = 0;
1010216ca234SAdrian Chadd }
1011