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

    adf_os_print("%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);
}
