blob: 2f90886a257d227d44967ae820993b2a5f937ada [file] [log] [blame]
/*
* Copyright (c) 2013,2016-2017 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.
*/
/*===========================================================================
wma_dfs_interface.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 "wma.h"
#include "ath_dfs_structs.h"
#include "wma_dfs_interface.h"
int
ol_if_dfs_attach(struct ieee80211com *ic, void *ptr, void *radar_info)
{
struct ath_dfs_caps *pCap = (struct ath_dfs_caps *) ptr;
pr_debug("%s: called; ptr=%pK, radar_info=%pK\n",
__func__, ptr, radar_info);
pCap->ath_chip_is_bb_tlv = 1;
pCap->ath_dfs_combined_rssi_ok = 0;
pCap->ath_dfs_ext_chan_ok = 0;
pCap->ath_dfs_use_enhancement = 0;
pCap->ath_strong_signal_diversiry = 0;
pCap->ath_fastdiv_val = 0;
return(0);
}
/*
* Place Holder API
* We get the tsf from Firmware.
*/
u_int64_t
ol_if_get_tsf64(struct ieee80211com *ic)
{
return (0);
}
/*
* ic_dfs_disable is just a place holder
* function since firmware takes care of
* disabling the dfs phyerrors disabling.
*/
int
ol_if_dfs_disable(struct ieee80211com *ic)
{
return (0);
}
/*
* Locate a channel given a frequency+flags. We cache
* the previous lookup to optimize swithing between two
* channels--as happens with dynamic turbo.
* This verifies that found channels have not been excluded because of 11d.
*/
struct ieee80211_channel *
ieee80211_find_channel(struct ieee80211com *ic, int freq, u_int32_t flags)
{
struct ieee80211_channel *c;
int i;
flags &= IEEE80211_CHAN_ALLTURBO;
/* brute force search */
for (i = 0; i < ic->ic_nchans; i++)
{
c = &ic->ic_channels[i];
if ((! IEEE80211_IS_CHAN_11D_EXCLUDED(c)) &&
(c->ic_freq == freq) &&
((c->ic_flags & IEEE80211_CHAN_ALLTURBO) == flags))
{
return c;
}
}
return NULL;
}
/*
* ic_dfs_enable - enable DFS
* For offload solutions, radar PHY errors will be enabled by the target
* firmware when DFS is requested for the current channel.
*/
int ol_if_dfs_enable(struct ieee80211com *ic, int *is_fastclk, void *pe)
{
/*
* For peregrine, treat fastclk as the "oversampling" mode.
* It's on by default. This may change at some point, so
* we should really query the firmware to find out what
* the current configuration is.
*/
(* is_fastclk) = 1;
return (0);
}
/*
* Convert IEEE channel number to MHz frequency.
*/
u_int32_t
ieee80211_ieee2mhz(u_int32_t chan, u_int32_t flags)
{
if (flags & IEEE80211_CHAN_2GHZ)
{
/* 2GHz band */
if (chan == 14)
return 2484;
if (chan < 14)
return 2407 + chan*5;
else
return 2512 + ((chan-15)*20);
}
else if (flags & IEEE80211_CHAN_5GHZ)
{
/* 5Ghz band */
return 5000 + (chan*5);
}
else
{
/* either, guess */
if (chan == 14)
return 2484;
if (chan < 14) /* 0-13 */
return 2407 + chan*5;
if (chan < 27) /* 15-26 */
return 2512 + ((chan-15)*20);
return 5000 + (chan*5);
}
}
/*
* Place holder function ic_get_ext_busy
*/
int
ol_if_dfs_get_ext_busy(struct ieee80211com *ic)
{
return (0);
}
/*
* ic_get_mib_cycle_counts_pct
*/
int
ol_if_dfs_get_mib_cycle_counts_pct(struct ieee80211com *ic,
u_int32_t *rxc_pcnt, u_int32_t *rxf_pcnt, u_int32_t *txf_pcnt)
{
return (0);
}
u_int16_t
ol_if_dfs_usenol(struct ieee80211com *ic)
{
#ifdef ATH_SUPPORT_DFS
return(dfs_usenol(ic));
#else
return (0);
#endif /* ATH_SUPPORT_DFS */
return 0;
}
/*
* Function to indicate Radar on the current
* SAP operating channel.This indication will
* be posted to SAP to select a new channel
* randomly and issue a vdev restart to
* operate on the new channel.
*/
void
ieee80211_mark_dfs(struct ieee80211com *ic, struct ieee80211_channel *ichan)
{
int status;
status = wma_dfs_indicate_radar(ic, ichan);
}