Path: blob/main/sys/dev/ath/ath_hal/ar5416/ar5416_spectral.c
39566 views
/*-1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2012 Qualcomm Atheros, All Rights Reserved.4*5* Permission to use, copy, modify, and/or distribute this software for any6* purpose with or without fee is hereby granted, provided that the above7* copyright notice and this permission notice appear in all copies.8*9* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES10* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF11* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR12* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES13* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN14* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF15* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.16*/17#include "opt_ah.h"1819#include "ah.h"20#include "ah_internal.h"21#include "ah_devid.h"22#include "ah_desc.h" /* NB: for HAL_PHYERR* */2324#include "ar5416/ar5416.h"25#include "ar5416/ar5416reg.h"26#include "ar5416/ar5416phy.h"2728/*29* Default AR9280 spectral scan parameters30*/31#define AR5416_SPECTRAL_SCAN_ENA 032#define AR5416_SPECTRAL_SCAN_ACTIVE 033#define AR5416_SPECTRAL_SCAN_FFT_PERIOD 834#define AR5416_SPECTRAL_SCAN_PERIOD 135#define AR5416_SPECTRAL_SCAN_COUNT 16 //used to be 12836#define AR5416_SPECTRAL_SCAN_SHORT_REPEAT 13738/* constants */39#define MAX_RADAR_RSSI_THRESH 0x3f40#define MAX_RADAR_HEIGHT 0x3f41#define ENABLE_ALL_PHYERR 0xffffffff4243static void ar5416DisableRadar(struct ath_hal *ah);44static void ar5416PrepSpectralScan(struct ath_hal *ah);4546static void47ar5416DisableRadar(struct ath_hal *ah)48{49uint32_t val;5051// Enable radar FFT52val = OS_REG_READ(ah, AR_PHY_RADAR_0);53val |= AR_PHY_RADAR_0_FFT_ENA;5455// set radar detect thresholds to max to effectively disable radar56val &= ~AR_PHY_RADAR_0_RRSSI;57val |= SM(MAX_RADAR_RSSI_THRESH, AR_PHY_RADAR_0_RRSSI);5859val &= ~AR_PHY_RADAR_0_HEIGHT;60val |= SM(MAX_RADAR_HEIGHT, AR_PHY_RADAR_0_HEIGHT);6162val &= ~(AR_PHY_RADAR_0_ENA);63OS_REG_WRITE(ah, AR_PHY_RADAR_0, val);6465// disable extension radar detect66val = OS_REG_READ(ah, AR_PHY_RADAR_EXT);67OS_REG_WRITE(ah, AR_PHY_RADAR_EXT, val & ~AR_PHY_RADAR_EXT_ENA);6869val = OS_REG_READ(ah, AR_RX_FILTER);70val |= (1<<13);71OS_REG_WRITE(ah, AR_RX_FILTER, val);72}7374static void75ar5416PrepSpectralScan(struct ath_hal *ah)76{7778ar5416DisableRadar(ah);79OS_REG_WRITE(ah, AR_PHY_ERR, ENABLE_ALL_PHYERR);80}8182void83ar5416ConfigureSpectralScan(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss)84{85uint32_t val;8687ar5416PrepSpectralScan(ah);8889val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);9091if (ss->ss_fft_period != HAL_SPECTRAL_PARAM_NOVAL) {92val &= ~AR_PHY_SPECTRAL_SCAN_FFT_PERIOD;93val |= SM(ss->ss_fft_period, AR_PHY_SPECTRAL_SCAN_FFT_PERIOD);94}9596if (ss->ss_period != HAL_SPECTRAL_PARAM_NOVAL) {97val &= ~AR_PHY_SPECTRAL_SCAN_PERIOD;98val |= SM(ss->ss_period, AR_PHY_SPECTRAL_SCAN_PERIOD);99}100101if (ss->ss_period != HAL_SPECTRAL_PARAM_NOVAL) {102val &= ~AR_PHY_SPECTRAL_SCAN_PERIOD;103val |= SM(ss->ss_period, AR_PHY_SPECTRAL_SCAN_PERIOD);104}105106/* This section is different for Kiwi and Merlin */107if (AR_SREV_MERLIN(ah) ) {108if (ss->ss_count != HAL_SPECTRAL_PARAM_NOVAL) {109val &= ~AR_PHY_SPECTRAL_SCAN_COUNT;110val |= SM(ss->ss_count, AR_PHY_SPECTRAL_SCAN_COUNT);111}112113if (ss->ss_short_report == AH_TRUE) {114val |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;115} else if (ss->ss_short_report != HAL_SPECTRAL_PARAM_NOVAL) {116val &= ~AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;117}118} else {119if (ss->ss_count != HAL_SPECTRAL_PARAM_NOVAL) {120/*121* In Merlin, for continuous scan, scan_count = 128.122* In case of Kiwi, this value should be 0123*/124if (ss->ss_count == 128)125ss->ss_count = 0;126val &= ~AR_PHY_SPECTRAL_SCAN_COUNT_KIWI;127val |= SM(ss->ss_count, AR_PHY_SPECTRAL_SCAN_COUNT_KIWI);128}129130if (ss->ss_short_report == AH_TRUE) {131val |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI;132} else if (ss->ss_short_report != HAL_SPECTRAL_PARAM_NOVAL) {133val &= ~AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI;134}135136//Select the mask to be same as before137val |= AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT_KIWI;138}139// Enable spectral scan140OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val | AR_PHY_SPECTRAL_SCAN_ENA);141142ar5416GetSpectralParams(ah, ss);143}144145/*146* Get the spectral parameter values and return them in the pe147* structure148*/149void150ar5416GetSpectralParams(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss)151{152uint32_t val;153154val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);155156ss->ss_fft_period = MS(val, AR_PHY_SPECTRAL_SCAN_FFT_PERIOD);157ss->ss_period = MS(val, AR_PHY_SPECTRAL_SCAN_PERIOD);158if (AR_SREV_MERLIN(ah) ) {159ss->ss_count = MS(val, AR_PHY_SPECTRAL_SCAN_COUNT);160ss->ss_short_report = MS(val, AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT);161} else {162ss->ss_count = MS(val, AR_PHY_SPECTRAL_SCAN_COUNT_KIWI);163ss->ss_short_report = MS(val, AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI);164}165val = OS_REG_READ(ah, AR_PHY_RADAR_1);166ss->radar_bin_thresh_sel = MS(val, AR_PHY_RADAR_1_BIN_THRESH_SELECT);167}168169HAL_BOOL170ar5416IsSpectralActive(struct ath_hal *ah)171{172uint32_t val;173174val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);175return MS(val, AR_PHY_SPECTRAL_SCAN_ACTIVE);176}177178HAL_BOOL179ar5416IsSpectralEnabled(struct ath_hal *ah)180{181uint32_t val;182183val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);184return MS(val,AR_PHY_SPECTRAL_SCAN_ENA);185}186187void188ar5416StartSpectralScan(struct ath_hal *ah)189{190uint32_t val;191192ar5416PrepSpectralScan(ah);193194// Activate spectral scan195val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);196val |= AR_PHY_SPECTRAL_SCAN_ENA;197val |= AR_PHY_SPECTRAL_SCAN_ACTIVE;198OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val);199val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);200val = OS_REG_READ(ah, AR_PHY_ERR_MASK_REG);201OS_REG_WRITE(ah, AR_PHY_ERR_MASK_REG, val | AR_PHY_ERR_RADAR);202}203204void205ar5416StopSpectralScan(struct ath_hal *ah)206{207uint32_t val;208val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);209210// Deactivate spectral scan211val &= ~AR_PHY_SPECTRAL_SCAN_ENA;212val &= ~AR_PHY_SPECTRAL_SCAN_ACTIVE;213OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, val);214val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);215val = OS_REG_READ(ah, AR_PHY_ERR_MASK_REG) & (~AR_PHY_ERR_RADAR);216OS_REG_WRITE(ah, AR_PHY_ERR_MASK_REG, val);217}218219uint32_t220ar5416GetSpectralConfig(struct ath_hal *ah)221{222uint32_t val;223224val = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);225return val;226}227228void229ar5416RestoreSpectralConfig(struct ath_hal *ah, uint32_t restoreval)230{231uint32_t curval;232233ar5416PrepSpectralScan(ah);234235curval = OS_REG_READ(ah, AR_PHY_SPECTRAL_SCAN);236237if (restoreval != curval) {238restoreval |= AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;239OS_REG_WRITE(ah, AR_PHY_SPECTRAL_SCAN, restoreval);240}241return;242}243244245