/*
 * 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);
}
