blob: 9d1b622f97dba38c5249fb7a890fdf4600ab20c6 [file]
/*
* This file is part of the UWB stack for linux.
*
* Copyright (c) 2022 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_FIRA_SESSION_FSM_H
#define NET_MCPS802154_FIRA_SESSION_FSM_H
#include <linux/ieee802154.h>
#include "fira_access.h"
/* Forward declaration. */
struct fira_local;
struct fira_session;
struct fira_session_demand;
/**
* enum fira_session_state_id - State of the FiRa session.
* @FIRA_SESSION_STATE_ID_INIT:
* Initial state, session is not ready yet.
* @FIRA_SESSION_STATE_ID_DEINIT:
* Session does not exist.
* @FIRA_SESSION_STATE_ID_ACTIVE:
* Session is currently active.
* @FIRA_SESSION_STATE_ID_IDLE:
* Session is ready to start, but not currently active.
*/
enum fira_session_state_id {
FIRA_SESSION_STATE_ID_INIT,
FIRA_SESSION_STATE_ID_DEINIT,
FIRA_SESSION_STATE_ID_ACTIVE,
FIRA_SESSION_STATE_ID_IDLE,
};
/**
* struct fira_session_fsm_state - FiRa session FSM state.
*
* This structure contains the callbacks which are called on an event to handle
* the transition from the current state.
*/
struct fira_session_fsm_state {
/** @id: Name of state. */
enum fira_session_state_id id;
/** @enter: Run when the state is entered. */
void (*enter)(struct fira_local *local, struct fira_session *session);
/** @leave: Run when the state is left. */
void (*leave)(struct fira_local *local, struct fira_session *session);
/** @check_parameters: Handle a check parameters. */
int (*check_parameters)(const struct fira_session *session,
struct nlattr **attrs);
/** @parameters_updated: Handle parameters updated event. */
void (*parameters_updated)(struct fira_local *local,
struct fira_session *session);
/** @controlee_list_updated: Handle controlee list updated event. */
void (*controlee_list_updated)(struct fira_local *local,
struct fira_session *session);
/** @start: Handle start. */
int (*start)(struct fira_local *local, struct fira_session *session,
const struct genl_info *info);
/** @stop: Handle stop. */
int (*stop)(struct fira_local *local, struct fira_session *session);
/** @get_demand: Handle the get demand. */
int (*get_demand)(const struct fira_local *local,
const struct fira_session *session,
u32 next_timestamp_dtu, int max_duration_dtu,
struct fira_session_demand *session_demand);
/** @get_access: Handle the get access. */
struct mcps802154_access *(*get_access)(
struct fira_local *local, struct fira_session *session,
const struct fira_session_demand *session_demand);
/** @access_done: Handle end of access. */
void (*access_done)(struct fira_local *local,
struct fira_session *session, bool error);
/** @check_missed_ranging: Handle the check of missed ranging. */
void (*check_missed_ranging)(struct fira_local *local,
struct fira_session *session,
u32 timestamp_dtu);
};
/**
* fira_session_fsm_change_state() - Change the state of the FSM.
* @local: FiRa context.
* @session: Session context.
* @new_state: New to state to use in the FSM.
*
* This function shall be called only by fira_session_fsm files.
*/
void fira_session_fsm_change_state(
struct fira_local *local, struct fira_session *session,
const struct fira_session_fsm_state *new_state);
/**
* fira_session_is_active() - Return the active status of the session.
* @session: Session context.
*
* Return: True is the session is active, false otherwise.
*/
bool fira_session_is_active(const struct fira_session *session);
/**
* fira_session_fsm_initialise() - Initialize the FSM.
* @local: FiRa context.
* @session: Session context.
*/
void fira_session_fsm_initialise(struct fira_local *local,
struct fira_session *session);
/**
* fira_session_fsm_uninit() - Uninitialise the FSM.
* @local: FiRa context.
* @session: Session context.
*/
void fira_session_fsm_uninit(struct fira_local *local,
struct fira_session *session);
/**
* fira_session_get_state_id() - Get current state id (for reporting).
* @session: Session context.
*
* Return: State id value.
*/
enum fira_session_state_id
fira_session_get_state_id(const struct fira_session *session);
/**
* fira_session_fsm_check_parameters() - Check parameters change ask by upper
* layer.
* @session: Session context.
* @attrs: Netlink attributs.
*
* Return: 0 on success, errno when change are refused.
*/
int fira_session_fsm_check_parameters(const struct fira_session *session,
struct nlattr **attrs);
/**
* fira_session_fsm_parameters_updated() - Parameters updated by upper layer.
* @local: FiRa context.
* @session: Session context.
*/
void fira_session_fsm_parameters_updated(struct fira_local *local,
struct fira_session *session);
/**
* fira_session_fsm_controlee_list_updated() - Controlee list updated by upper
* layer.
* @local: FiRa context.
* @session: Session context.
*/
void fira_session_fsm_controlee_list_updated(struct fira_local *local,
struct fira_session *session);
/**
* fira_session_fsm_start() - Start request from upper layer.
* @local: FiRa context.
* @session: Session context.
* @info: Netlink info used only for the portid.
*
* Return: 0 on success, errno otherwise.
*/
int fira_session_fsm_start(struct fira_local *local,
struct fira_session *session,
const struct genl_info *info);
/**
* fira_session_fsm_stop() - Stop request from upper layer.
* @local: FiRa context.
* @session: Session context.
*
* Return: 0 on success, errno otherwise.
*/
int fira_session_fsm_stop(struct fira_local *local,
struct fira_session *session);
/**
* fira_session_fsm_get_demand() - Request the next ranging round of the session.
* @local: FiRa context.
* @session: Session context.
* @next_timestamp_dtu: Timestamp to start a demand.
* @max_duration_dtu: Max duration obligation to be consider by the session.
* @session_demand: Wish of the session when the return value is 1.
*
* Return: 1 for a session demand otherwise 0 for no demand.
*/
int fira_session_fsm_get_demand(const struct fira_local *local,
const struct fira_session *session,
u32 next_timestamp_dtu, int max_duration_dtu,
struct fira_session_demand *session_demand);
/**
* fira_session_fsm_get_access() - Get access to process.
* @local: FiRa context.
* @session: Session context.
* @session_demand: Next access built by the get_demand.
*
* Return: The access for fproc, or NULL pointer.
*/
struct mcps802154_access *
fira_session_fsm_get_access(struct fira_local *local,
struct fira_session *session,
const struct fira_session_demand *session_demand);
/**
* fira_session_fsm_access_done() - End of the access to report.
* @local: FiRa context.
* @session: Session context.
* @error: True when an error happen.
*/
void fira_session_fsm_access_done(struct fira_local *local,
struct fira_session *session, bool error);
/**
* fira_session_fsm_check_missed_ranging() - Report a missed ranging if exist.
* @local: FiRa context.
* @session: Session context.
* @timestamp_dtu: Timestamp dtu where no fallback is possible.
*/
void fira_session_fsm_check_missed_ranging(struct fira_local *local,
struct fira_session *session,
u32 timestamp_dtu);
#endif /* NET_MCPS802154_FIRA_SESSION_FSM_H */