/*
 * Copyright (c) 2017 The Linux Foundation. All rights reserved.
 *
 * 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.
 */

#ifndef __WMA_HE_H
#define __WMA_HE_H

#include "wma.h"
#include "sir_api.h"

#ifdef WLAN_FEATURE_11AX
void wma_print_he_cap(tDot11fIEvendor_he_cap *he_cap);
void wma_print_he_ppet(wmi_ppe_threshold *ppet);
void wma_print_he_phy_cap(uint32_t *phy_cap);
void wma_print_he_mac_cap(uint32_t mac_cap);
void wma_update_target_ext_he_cap(tp_wma_handle wma_handle,
	struct wma_tgt_cfg *tgt_cfg);
void wma_he_update_tgt_services(tp_wma_handle wma,
				struct wma_tgt_services *cfg);
#else
static inline void wma_print_he_cap(tDot11fIEvendor_he_cap *he_cap)
{
}

static inline void wma_print_he_ppet(wmi_ppe_threshold *ppet)
{
}

static inline void wma_print_he_phy_cap(uint32_t *phy_cap)
{
}

static inline void wma_print_he_mac_cap(uint32_t mac_cap)
{
}

static inline void wma_update_target_ext_he_cap(tp_wma_handle wma_handle,
						struct wma_tgt_cfg *tgt_cfg)
{
}

static inline void wma_he_update_tgt_services(tp_wma_handle wma,
					      struct wma_tgt_services *cfg)
{
	cfg->en_11ax = false;
	return;
}

#endif

#endif /* __WMA_HE_H */
