/*
 * This file is part of the UWB stack for linux.
 *
 * Copyright (c) 2020-2021 Qorvo US, Inc.
 *
 * This software is provided under the GNU General Public License, version 2
 * (GPLv2), as well as under a Qorvo commercial license.
 *
 * You may choose to use this software under the terms of the GPLv2 License,
 * version 2 ("GPLv2"), as published by the Free Software Foundation.
 * You should have received a copy of the GPLv2 along with this program.  If
 * not, see <http://www.gnu.org/licenses/>.
 *
 * This program is distributed under the GPLv2 in the hope that it will be
 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GPLv2 for more
 * details.
 *
 * If you cannot meet the requirements of the GPLv2, you may not use this
 * software for any purpose without first obtaining a commercial license from
 * Qorvo. Please contact Qorvo to inquire about licensing terms.
 */

#ifndef NET_MCPS802154_MCPS802154_I_H
#define NET_MCPS802154_MCPS802154_I_H

#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/wait.h>
#include <linux/workqueue.h>
#include <net/mac802154.h>
#include <net/mcps802154.h>

#include "ca.h"
#include "fproc.h"

/**
 * struct mcps802154_pib - PIB (PAN Information Base): this is a database of
 * 802.15.4 settings.
 */
struct mcps802154_pib {
	/**
	 * @mac_extended_addr: Current extended address.
	 */
	__le64 mac_extended_addr;
	/**
	 * @mac_pan_id: The identifier of the PAN on which the device is
	 * operating. 0xffff if the device is not associated.
	 */
	__le16 mac_pan_id;
	/**
	 * @mac_short_addr: The address the device uses to communicate inside
	 * its PAN. 0xffff if the device is not associated, 0xfffe if the device
	 * is associated but has no short address.
	 */
	__le16 mac_short_addr;
	/**
	 * @mac_max_frame_retries: Number of retries on TX.
	 */
	s8 mac_max_frame_retries;
	/**
	 * @phy_current_channel: Current channel parameters.
	 */
	struct mcps802154_channel phy_current_channel;
};

/**
 * struct mcps802154_local - MCPS private data.
 */
struct mcps802154_local {
	/**
	 * @llhw: Low-level hardware.
	 */
	struct mcps802154_llhw llhw;
	/**
	 * @hw: Pointer to MCPS hw instance.
	 */
	struct ieee802154_hw *hw;
	/**
	 * @ops: Low-level driver operations.
	 */
	const struct mcps802154_ops *ops;
	/**
	 * @hw_idx: Index of hardware.
	 */
	int hw_idx;
	/**
	 * @cur_cmd_info: Current netlink command.
	 */
	struct genl_info *cur_cmd_info;
	/**
	 * @registered_entry: Entry in list of registered low-level driver.
	 */
	struct list_head registered_entry;
	/**
	 * @wq: Wake queue for synchronous operation with an asynchronous
	 * implementation.
	 */
	wait_queue_head_t wq;
	/**
	 * @ca: Channel access context.
	 */
	struct mcps802154_ca ca;
	/**
	 * @fproc: Frame processing context.
	 */
	struct mcps802154_fproc fproc;
	/**
	 * @fsm_lock: FSM lock to avoid multiple access.
	 */
	struct mutex fsm_lock;
	/**
	 * @tx_work: Transmit work to schedule async actions.
	 */
	struct work_struct tx_work;
	/**
	 * @start_stop_request: Request to start (true) or stop (false) from
	 * mac802154 layer.
	 */
	bool start_stop_request;
	/**
	 * @started: Current started state.
	 */
	bool started;
	/**
	 * @broken: Currently broken.
	 */
	bool broken;
	/**
	 * @pib: PAN Information Base.
	 */
	struct mcps802154_pib pib;
};

static inline struct mcps802154_local *
llhw_to_local(struct mcps802154_llhw *llhw)
{
	return container_of(llhw, struct mcps802154_local, llhw);
}

static inline struct mcps802154_local *
txwork_to_local(struct work_struct *tx_work)
{
	return container_of(tx_work, struct mcps802154_local, tx_work);
}

/**
 * is_before_dtu() - Check if timestamp A is before timestamp B.
 * @a_dtu: A timestamp in device time unit.
 * @b_dtu: B timestamp in device time unit.
 *
 * Return: true if A timestamp is before B timestamp.
 */
static inline bool is_before_dtu(u32 a_dtu, u32 b_dtu)
{
	return (s32)(a_dtu - b_dtu) < 0;
}

struct mcps802154_local *mcps802154_get_first_by_idx(int hw_idx);

extern const struct ieee802154_ops mcps802154_ops;

#endif /* NET_MCPS802154_MCPS802154_I_H */
