blob: 1dfd8b7935477a8ee7f4ebe2b5a31ec67c43c32d [file] [log] [blame]
/*
* Copyright (c) 2017-2019 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.
*/
/**
* DOC: wlan_serialization_internal_i.h
* This file defines the prototypes of functions which are called
* from serialization public API's and are internal
* to serialization.
*/
#ifndef __WLAN_SERIALIZATION_PVT_I_H
#define __WLAN_SERIALIZATION_PVT_I_H
#include <wlan_objmgr_vdev_obj.h>
#include <wlan_objmgr_pdev_obj.h>
#include <wlan_objmgr_psoc_obj.h>
#include <qdf_list.h>
#include <qdf_status.h>
#include "wlan_serialization_api.h"
#include "wlan_serialization_main_i.h"
#include "wlan_serialization_utils_i.h"
#include "wlan_serialization_non_scan_i.h"
/**
* wlan_serialization_is_cmd_present_queue() - Check if same command
* is already present active or pending queue
* @cmd: pointer to command which we need to find
* @is_active_queue: flag to find the command in active or pending queue
*
* This API will check the given command is already present in active or
* pending queue based on flag
* If present then return true otherwise false
*
* Return: true or false
*/
bool
wlan_serialization_is_cmd_present_queue(
struct wlan_serialization_command *cmd,
uint8_t is_active_queue);
/**
* wlan_serialization_is_active_cmd_allowed() - Check if the given command
* can be moved to active queue
* @cmd: Serialization command information
*
* Return: true or false
*/
bool
wlan_serialization_is_active_cmd_allowed(
struct wlan_serialization_command *cmd);
/**
* wlan_serialization_enqueue_cmd() - Enqueue the cmd to pending/active Queue
* @cmd: Command information
* @ser_reason: action for dequeue
*
* Return: Status of the serialization request
*/
enum wlan_serialization_status
wlan_serialization_enqueue_cmd(struct wlan_serialization_command *cmd,
enum ser_queue_reason ser_reason);
/**
* wlan_serialization_activate_cmd() - activate cmd in active queue
* @cmd_list: Command needs to be activated
* @ser_pdev_obj: Serialization private pdev object
* @ser_reason: reason the activation cb would be called
*
* Return: Status of activation of the command
*/
QDF_STATUS
wlan_serialization_activate_cmd(
struct wlan_serialization_command_list *cmd_list,
struct wlan_ser_pdev_obj *ser_pdev_obj,
enum ser_queue_reason ser_reason);
/**
* wlan_serialization_move_pending_to_active() - Move a cmd from pending
* queue to active queue
* @cmd_type: Type of command to be moved i.e scan or non scan
* @pcmd_list: Pointer to command list containing the command
* @ser_pdev_obj: Serialization private pdev object
* @vdev: Pointer to vdev object manager
* @blocking_cmd_removed: If a blocking cmd is removed from active queue
* @blocking_cmd_waiting: If a blocking cmd is waiting in pending queue
*
* Return: Status of command request
*/
enum wlan_serialization_status
wlan_serialization_move_pending_to_active(
enum wlan_serialization_cmd_type cmd_type,
struct wlan_ser_pdev_obj *ser_pdev_obj,
struct wlan_objmgr_vdev *vdev,
bool blocking_cmd_removed);
/**
* wlan_serialization_dequeue_cmd() - dequeue the cmd to pending/active Queue
* @cmd: Command information
* @ser_reason: action for dequeue
* @active_cmd: whether command is for active queue
*
* Return: Status of the serialization request
*/
enum wlan_serialization_cmd_status
wlan_serialization_dequeue_cmd(struct wlan_serialization_command *cmd,
enum ser_queue_reason ser_reason,
uint8_t active_cmd);
/**
* wlan_serialization_generic_timer_cb() - timer callback when timer fire
* @arg: argument that timer passes to this callback
*
* All the timers in serialization module calls this callback when they fire,
* and this API in turn calls command specific timeout callback and remove
* timed-out command from active queue and move any pending command to active
* queue of same cmd_type.
*
* Return: none
*/
void wlan_serialization_generic_timer_cb(void *arg);
/**
* wlan_serialization_find_and_start_timer() - to find and start the timer
* @psoc: pointer to psoc
* @cmd: pointer to actual command
* @ser_reason: serialization reason
*
* find the free timer, initialize it, and start it
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_serialization_find_and_start_timer(struct wlan_objmgr_psoc *psoc,
struct wlan_serialization_command *cmd,
enum ser_queue_reason ser_reason);
/**
* wlan_serialization_find_and_update_timer() - to find and update the timer
* @psoc: pointer to psoc
* @cmd: pointer to command attributes
*
* Find the timer associated with command, and update it
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_serialization_find_and_update_timer(
struct wlan_objmgr_psoc *psoc,
struct wlan_serialization_command *cmd);
/**
* wlan_serialization_find_and_stop_timer() - to find and stop the timer
* @psoc: pointer to psoc
* @cmd: pointer to actual command
* @ser_reason: serialization reason
*
* find the timer associated with command, stop it and destroy it
*
* Return: QDF_STATUS
*/
QDF_STATUS
wlan_serialization_find_and_stop_timer(struct wlan_objmgr_psoc *psoc,
struct wlan_serialization_command *cmd,
enum ser_queue_reason ser_reason);
/**
* wlan_serialization_find_and_cancel_cmd() - to find cmd from queue and cancel
* @cmd: pointer to serialization command
* @req_type: Command cancel request type
* @queue_type: Bitmask for member queue type i.e active or pending or both
*
* This api will find command from active queue and pending queue and
* removes the command. If it is in active queue then it will notifies the
* requester that it is in active queue and from there it expects requester
* to send remove command
*
* Return: wlan_serialization_cmd_status
*/
enum wlan_serialization_cmd_status
wlan_serialization_find_and_cancel_cmd(
struct wlan_serialization_command *cmd,
enum wlan_serialization_cancel_type req_type,
uint8_t queue_type);
/**
* wlan_serialization_cmd_cancel_handler() - helper func to cancel cmd
* @ser_obj: private pdev ser obj
* @cmd: pointer to command
* @pdev: pointer to pdev
* @vdev: pointer to vdev
* @cmd_type: pointer to cmd_type
* @queue_type: If active queue or pending queue
* @cmd_attr: Attrbute to indicate a blocking or a non-blocking command
*
* This API will decide from which queue, command needs to be cancelled
* and pass that queue and other parameter required to cancel the command
* to helper function.
*
* Return: wlan_serialization_cmd_status
*/
enum wlan_serialization_cmd_status
wlan_serialization_cmd_cancel_handler(
struct wlan_ser_pdev_obj *ser_obj,
struct wlan_serialization_command *cmd,
struct wlan_objmgr_pdev *pdev,
struct wlan_objmgr_vdev *vdev,
enum wlan_serialization_cmd_type cmd_type,
uint8_t queue_type,
enum wlan_ser_cmd_attr cmd_attr);
#endif