blob: efe88520852aae6461a268d05f0bc542045b8900 [file] [log] [blame]
/*
* Copyright (c) 2002-2013, 2016 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
/*===========================================================================
dfs_debug.c
OVERVIEW:
Source code borrowed from QCA_MAIN DFS module
DEPENDENCIES:
Are listed for each API below.
===========================================================================*/
/*===========================================================================
EDIT HISTORY FOR FILE
This section contains comments describing changes made to the module.
Notice that changes are listed in reverse chronological order.
when who what, where, why
---------- --- --------------------------------------------------------
===========================================================================*/
#include "dfs.h"
/* TO DO DFS
#include <ieee80211_var.h>
*/
#ifdef ATH_SUPPORT_DFS
void
dfs_print_delayline(struct ath_dfs *dfs, struct dfs_delayline *dl)
{
int i=0,index;
struct dfs_delayelem *de;
index = dl->dl_lastelem;
for (i=0; i<dl->dl_numelems; i++) {
de = &dl->dl_elems[index];
DFS_DPRINTK(dfs, ATH_DEBUG_DFS2,
"Elem %d: ts = %u (0x%x) dur=%u\n",i,
de->de_time, de->de_time, de->de_dur);
index = (index - 1)& DFS_MAX_DL_MASK;
}
}
void
dfs_print_filter(struct ath_dfs *dfs, struct dfs_filter *rf)
{
DFS_DPRINTK(dfs, ATH_DEBUG_DFS1,
"filterID[%d] rf_numpulses=%u; rf->rf_minpri=%u; "
"rf->rf_maxpri=%u; rf->rf_threshold=%u; rf->rf_filterlen=%u; "
"rf->rf_mindur=%u; rf->rf_maxdur=%u\n",
rf->rf_pulseid,
rf->rf_numpulses,
rf->rf_minpri,
rf->rf_maxpri,
rf->rf_threshold,
rf->rf_filterlen,
rf->rf_mindur,
rf->rf_maxdur);
}
void
dfs_print_filters(struct ath_dfs *dfs)
{
struct dfs_filtertype *ft = NULL;
struct dfs_filter *rf;
int i,j;
if (dfs == NULL) {
DFS_DPRINTK(dfs, ATH_DEBUG_DFS, "%s: sc_dfs is NULL\n", __func__);
return;
}
for (i=0; i<DFS_MAX_RADAR_TYPES; i++) {
if (dfs->dfs_radarf[i] != NULL) {
ft = dfs->dfs_radarf[i];
if((ft->ft_numfilters > DFS_MAX_NUM_RADAR_FILTERS) || (!ft->ft_numfilters))
continue;
DFS_PRINTK("===========ft->ft_numfilters=%u===========\n",
ft->ft_numfilters);
for (j=0; j<ft->ft_numfilters; j++) {
rf = ft->ft_filters[j];
DFS_PRINTK("filter[%d] filterID = %d rf_numpulses=%u; rf->rf_minpri=%u; rf->rf_maxpri=%u; rf->rf_threshold=%u; rf->rf_filterlen=%u; rf->rf_mindur=%u; rf->rf_maxdur=%u\n",j, rf->rf_pulseid,
rf->rf_numpulses, rf->rf_minpri, rf->rf_maxpri, rf->rf_threshold, rf->rf_filterlen, rf->rf_mindur, rf->rf_maxdur);
}
}
}
for (i=0; i < DFS_MAX_RADAR_TYPES; i++) {
if (dfs->dfs_dc_radarf[i])
continue;
ft = dfs->dfs_dc_radarf[i];
if ((ft->ft_numfilters > DFS_MAX_NUM_RADAR_FILTERS) ||
(!ft->ft_numfilters))
continue;
DFS_PRINTK("===========DC ft->ft_numfilters=%u===========\n",
ft->ft_numfilters);
for (j = 0; j < ft->ft_numfilters; j++) {
rf = ft->ft_filters[j];
DFS_PRINTK("DC filter[%d] filterID = %d rf_numpulses=%u; rf->rf_minpri=%u; rf->rf_maxpri=%u; rf->rf_threshold=%u; rf->rf_filterlen=%u; rf->rf_mindur=%u; rf->rf_maxdur=%u\n",
j, rf->rf_pulseid, rf->rf_numpulses, rf->rf_minpri,
rf->rf_maxpri, rf->rf_threshold, rf->rf_filterlen,
rf->rf_mindur, rf->rf_maxdur);
}
}
}
void dfs_print_activity(struct ath_dfs *dfs)
{
int chan_busy=0, ext_chan_busy=0;
u_int32_t rxclear=0, rxframe=0, txframe=0, cycles=0;
cycles = dfs->ic->ic_get_mib_cycle_counts_pct(dfs->ic, &rxclear, &rxframe, &txframe);
chan_busy = cycles;
ext_chan_busy = dfs->ic->ic_get_ext_busy(dfs->ic);
DFS_DPRINTK(dfs, ATH_DEBUG_DFS,"cycles=%d rxclear=%d rxframe=%d"
" txframe=%d extchanbusy=%d\n", cycles, rxclear,
rxframe, txframe, ext_chan_busy);
return;
}
/*
* XXX migrate this to use ath_dfs as the arg, not ieee80211com!
*/
#ifndef ATH_DFS_RADAR_DETECTION_ONLY
OS_TIMER_FUNC(dfs_debug_timeout)
{
struct ieee80211com *ic;
struct ath_dfs* dfs;
OS_GET_TIMER_ARG(ic, struct ieee80211com *);
dfs = (struct ath_dfs *)ic->ic_dfs;
dfs_print_activity(dfs);
OS_SET_TIMER(&dfs->ath_dfs_debug_timer, DFS_DEBUG_TIMEOUT_MS);
}
#endif
#endif /* ATH_SUPPORT_DFS */