46#include <sys/sysctl.h>
47#include <sys/kernel.h>
49#include <sys/malloc.h>
53#include <machine/bus.h>
54#include <machine/resource.h>
57#include <sys/socket.h>
60#include <net/if_var.h>
61#include <net/if_media.h>
62#include <net/if_arp.h>
63#include <net/ethernet.h>
65#include <net80211/ieee80211_var.h>
70#include <netinet/in.h>
71#include <netinet/if_ether.h>
82#define msecs_to_jiffies(a) ( (a) * hz / 1000 )
102 M_TEMP, M_WAITOK | M_ZERO);
104 device_printf(sc->
sc_dev,
"%s: failed to allocate\n",
111 OS_MEMZERO(&div_ant_conf,
sizeof(div_ant_conf));
165 void *outdata = NULL;
175 indata = malloc(insize, M_TEMP, M_NOWAIT);
176 if (indata == NULL) {
180 error = copyin(ad->
ad_in_data, indata, insize);
192 outdata = malloc(outsize, M_TEMP, M_NOWAIT | M_ZERO);
193 if (outdata == NULL) {
203 if (outsize < ad->ad_out_size)
209 free(indata, M_TEMP);
211 free(outdata, M_TEMP);
221 int main_rssi_avg,
int alt_rssi_avg,
int pkt_count)
224 (alt_rssi_avg > main_rssi_avg + maxdelta)) ||
225 (alt_rssi_avg > main_rssi_avg + mindelta)) && (pkt_count > 50);
286 int alt_rssi_avg,
int alt_ratio)
307 main_rssi_avg, alt_rssi_avg,
316 main_rssi_avg, alt_rssi_avg,
323 (alt_rssi_avg > main_rssi_avg +
325 (alt_rssi_avg > main_rssi_avg)) &&
362 main_rssi_avg, alt_rssi_avg,
371 main_rssi_avg, alt_rssi_avg,
378 (alt_rssi_avg > main_rssi_avg +
380 (alt_rssi_avg > main_rssi_avg)) &&
484 int alt_ratio,
int alt_ant_ratio_th, u_int config_group,
507 if ((antcomb->
scan == 0)
522 if ((antcomb->
scan == 0)
532 if ((antcomb->
scan == 0)
547 if ((antcomb->
scan == 0)
593 if ((antcomb->
scan == 0)
594 && (alt_ratio > alt_ant_ratio_th)) {
608 if ((antcomb->
scan == 0)
609 && (alt_ratio > alt_ant_ratio_th)) {
618 if ((antcomb->
scan == 0)
619 && (alt_ratio > alt_ant_ratio_th)) {
633 if ((antcomb->
scan == 0)
634 && (alt_ratio > alt_ant_ratio_th)) {
715 unsigned long ticks,
int hz)
719 int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
720 int curr_main_set, curr_bias;
723 int rx_ant_conf, main_ant_conf, alt_ant_conf;
731 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
732 "%s: RSSI %d/%d, conf %x/%x, rxconf %x, LNA: %d; ANT: %d; "
760 if (main_rssi > 0 && alt_rssi > 0) {
764 if (main_ant_conf == rx_ant_conf)
786 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
787 "%s: total pkt=%d, aggr=%d, short_scan=%d\n",
807 OS_MEMZERO(&div_ant_conf,
sizeof(div_ant_conf));
830 if (!antcomb->
scan) {
859 if ((alt_rssi_avg < (main_rssi_avg +
865 switch (curr_alt_set) {
968 main_rssi_avg, alt_rssi_avg,
975 ath_ant_div_conf_fast_divbias(&div_ant_conf);
986 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: total_pkt_count=%d\n",
989 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: main_total_rssi=%d\n",
991 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: alt_total_rssi=%d\n",
994 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: main_rssi_avg=%d\n",
995 __func__, main_rssi_avg);
996 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: alt_alt_rssi_avg=%d\n",
997 __func__, alt_rssi_avg);
999 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: main_recv_cnt=%d\n",
1001 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: alt_recv_cnt=%d\n",
1005 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: lna_conf: %x -> %x\n",
1008 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: main_lna_conf: %x -> %x\n",
1011 DPRINTF(sc, ATH_DEBUG_DIVERSITY,
"%s: fast_div_bias: %x -> %x\n",
#define HAL_ANTDIV_CONFIG_GROUP_1
#define HAL_ANTDIV_CONFIG_GROUP_2
@ HAL_ANT_DIV_COMB_LNA1_PLUS_LNA2
@ HAL_ANT_DIV_COMB_LNA1_MINUS_LNA2
#define OS_MEMZERO(_a, _n)
#define DPRINTF(sc, m, fmt,...)
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)
int ath_lna_div_detach(struct ath_softc *sc)
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)
#define msecs_to_jiffies(a)
static void ath_lnaconf_alt_good_scan(struct if_ath_ant_comb_state *antcomb, HAL_ANT_COMB_CONFIG *ant_conf, int main_rssi_avg)
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)
void ath_lna_rx_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs, unsigned long ticks, int hz)
int ath_lna_div_ioctl(struct ath_softc *sc, struct ath_diag *ad)
int ath_lna_div_attach(struct ath_softc *sc)
int ath_lna_div_enable(struct ath_softc *sc, const struct ieee80211_channel *chan)
#define ATH_ANT_DIV_COMB_ALT_ANT_RATIO2
#define ATH_ANT_DIV_COMB_LNA1_DELTA_LOW
#define ATH_ANT_DIV_COMB_LNA1_DELTA_HI
#define ATH_ANT_DIV_COMB_SHORT_SCAN_INTR
#define ATH_ANT_DIV_COMB_MAX_PKTCOUNT
#define ATH_ANT_DIV_COMB_MAX_COUNT
#define ATH_ANT_DIV_COMB_LNA1_LNA2_SWITCH_DELTA
#define ATH_ANT_DIV_COMB_SHORT_SCAN_PKTCOUNT
#define ATH_ANT_DIV_COMB_LNA1_DELTA_MID
#define ATH_ANT_DIV_COMB_ALT_ANT_RATIO
#define ath_hal_div_comb_conf_set(_ah, _conf)
#define ath_hal_div_comb_conf_get(_ah, _conf)
#define ath_hal_hasdivantcomb(_ah)
u_int8_t antdiv_configgroup
unsigned long scan_start_time
HAL_ANT_DIV_COMB_LNA_CONF second_quick_scan_conf
HAL_ANT_DIV_COMB_LNA_CONF first_quick_scan_conf