summaryrefslogtreecommitdiff
path: root/wl1271/stad/src/Ctrl_Interface/CmdHndlr.c
diff options
context:
space:
mode:
Diffstat (limited to 'wl1271/stad/src/Ctrl_Interface/CmdHndlr.c')
-rw-r--r--wl1271/stad/src/Ctrl_Interface/CmdHndlr.c498
1 files changed, 0 insertions, 498 deletions
diff --git a/wl1271/stad/src/Ctrl_Interface/CmdHndlr.c b/wl1271/stad/src/Ctrl_Interface/CmdHndlr.c
deleted file mode 100644
index 26db480b..00000000
--- a/wl1271/stad/src/Ctrl_Interface/CmdHndlr.c
+++ /dev/null
@@ -1,498 +0,0 @@
-/*
- * CmdHndlr.c
- *
- * Copyright(c) 1998 - 2009 Texas Instruments. All rights reserved.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name Texas Instruments nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-
-/** \file CmdHndlr.c
- * \brief The Command-Hnadler module.
- *
- * \see CmdHndlr.h
- */
-
-#define __FILE_ID__ FILE_ID_48
-#include "tidef.h"
-#include "commonTypes.h"
-#include "osApi.h"
-#include "report.h"
-#include "queue.h"
-#include "context.h"
-#include "CmdHndlr.h"
-#include "CmdInterpret.h"
-#include "DrvMainModules.h"
-
-
-/* The queue may contain only one command per configuration application but set as unlimited */
-#define COMMANDS_QUE_SIZE QUE_UNLIMITED_SIZE
-
-/* Command module internal data */
-typedef struct
-{
- TI_HANDLE hOs;
- TI_HANDLE hReport;
- TI_HANDLE hContext;
- TI_HANDLE hCmdInterpret;
-
- TI_HANDLE hCmdQueue; /* Handle to the commands queue */
- TI_BOOL bProcessingCmds; /* Indicates if currently processing commands */
- TI_UINT32 uContextId; /* ID allocated to this module on registration to context module */
- TConfigCommand *pCurrCmd; /* Pointer to the command currently being processed */
-} TCmdHndlrObj;
-
-/* External functions prototypes */
-extern void wlanDrvIf_CommandDone (TI_HANDLE hOs, void *pSignalObject, TI_UINT8 *CmdResp_p);
-
-/**
- * \fn cmdHndlr_Create
- * \brief Create the module
- *
- * Create the module object
- *
- * \note
- * \param hOs - Handle to the Os Abstraction Layer
- * \return Handle to the allocated module (NULL if failed)
- * \sa
- */
-TI_HANDLE cmdHndlr_Create (TI_HANDLE hOs, TI_HANDLE hEvHandler)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *) os_memoryAlloc (hOs, sizeof(TCmdHndlrObj));
-
- if (pCmdHndlr == NULL)
- {
- return NULL;
- }
-
- os_memoryZero (hOs, (void *)pCmdHndlr, sizeof(TCmdHndlrObj));
-
- pCmdHndlr->hOs = hOs;
-
- pCmdHndlr->hCmdInterpret = cmdInterpret_Create (hOs);
-
- if (pCmdHndlr->hCmdInterpret == NULL)
- {
- cmdHndlr_Destroy ((TI_HANDLE) pCmdHndlr, (TI_HANDLE) hEvHandler);
- return NULL;
- }
-
- return (TI_HANDLE) pCmdHndlr;
-}
-
-
-/**
- * \fn cmdHndlr_Destroy
- * \brief Destroy the module object
- *
- * Destroy the module object.
- *
- * \note
- * \param hCmdHndlr - The object
- * \return TI_OK
- * \sa
- */
-TI_STATUS cmdHndlr_Destroy (TI_HANDLE hCmdHndlr, TI_HANDLE hEvHandler)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
-
- if (pCmdHndlr->hCmdInterpret)
- {
- cmdInterpret_Destroy (pCmdHndlr->hCmdInterpret, hEvHandler);
- }
-
- cmdHndlr_ClearQueue (hCmdHndlr);
-
- if (pCmdHndlr->hCmdQueue)
- {
- que_Destroy (pCmdHndlr->hCmdQueue);
- }
-
- os_memoryFree (pCmdHndlr->hOs, hCmdHndlr, sizeof(TCmdHndlrObj));
-
- return TI_OK;
-}
-
-
-/**
- * \fn cmdHndlr_ClearQueue
- * \brief Clear commands queue
- *
- * Dequeue and free all queued commands.
- *
- * \note
- * \param hCmdHndlr - The object
- * \return void
- * \sa
- */
-void cmdHndlr_ClearQueue (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
- TConfigCommand *pCurrCmd;
-
- /* Dequeue and free all queued commands */
- do {
- context_EnterCriticalSection (pCmdHndlr->hContext);
- pCurrCmd = (TConfigCommand *)que_Dequeue(pCmdHndlr->hCmdQueue);
- context_LeaveCriticalSection (pCmdHndlr->hContext);
- if (pCurrCmd != NULL) {
- /* Just release the semaphore. The command is freed subsequently. */
- os_SignalObjectSet (pCmdHndlr->hOs, pCurrCmd->pSignalObject);
- }
- } while (pCurrCmd != NULL);
-}
-
-
-/**
- * \fn cmdHndlr_Init
- * \brief Init required handles and registries
- *
- * Init required handles and module variables, create the commands-queue and
- * register as the context-engine client.
- *
- * \note
- * \param pStadHandles - The driver modules handles
- * \return void
- * \sa
- */
-void cmdHndlr_Init (TStadHandlesList *pStadHandles)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)(pStadHandles->hCmdHndlr);
- TI_UINT32 uNodeHeaderOffset;
-
- pCmdHndlr->hReport = pStadHandles->hReport;
- pCmdHndlr->hContext = pStadHandles->hContext;
-
- cmdInterpret_Init (pCmdHndlr->hCmdInterpret, pStadHandles);
-
- /* The offset of the queue-node-header from the commands structure entry is needed by the queue */
- uNodeHeaderOffset = TI_FIELD_OFFSET(TConfigCommand, tQueNodeHdr);
-
- /* Create and initialize the commands queue */
- pCmdHndlr->hCmdQueue = que_Create (pCmdHndlr->hOs, pCmdHndlr->hReport, COMMANDS_QUE_SIZE, uNodeHeaderOffset);
-
- /* Register to the context engine and get the client ID */
- pCmdHndlr->uContextId = context_RegisterClient (pCmdHndlr->hContext,
- cmdHndlr_HandleCommands,
- (TI_HANDLE)pCmdHndlr,
- TI_FALSE,
- "COMMAND",
- sizeof("COMMAND"));
-
- if(pCmdHndlr->hReport != NULL)
- {
- os_setDebugOutputToLogger(TI_FALSE);
- }
-}
-
-
-/**
- * \fn cmdHndlr_InsertCommand
- * \brief Insert a new command to the driver
- *
- * Insert a new command to the commands queue from user context.
- * If commands are not beeing processed set a request to start processing in the driver context.
- * Wait on the current command's signal until its processing is completed.
- * Note that this prevents the user application from sending further commands before completion.
- *
- * \note
- * \param hCmdHndlr - The module object
- * \param cmd - User request
- * \param others - The command flags, data and params
- * \return TI_OK if command processed successfully, TI_NOK if failed in processing or memory allocation.
- * \sa cmdHndlr_HandleCommands, cmdHndlr_Complete
- */
-TI_STATUS cmdHndlr_InsertCommand (TI_HANDLE hCmdHndlr,
- TI_UINT32 cmd,
- TI_UINT32 flags,
- void *buffer1,
- TI_UINT32 buffer1_len,
- void *buffer2,
- TI_UINT32 buffer2_len,
- TI_UINT32 *param3,
- TI_UINT32 *param4)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
- TConfigCommand *pNewCmd;
- TI_STATUS eStatus;
-
- /* Allocated command structure */
- pNewCmd = os_memoryAlloc (pCmdHndlr->hOs, sizeof (TConfigCommand));
- if (pNewCmd == NULL)
- {
- return TI_NOK;
- }
- os_memoryZero (pCmdHndlr->hOs, (void *)pNewCmd, sizeof(TConfigCommand));
-
- /* Copy user request into local structure */
- pNewCmd->cmd = cmd;
- pNewCmd->flags = flags;
- pNewCmd->buffer1 = buffer1;
- pNewCmd->buffer1_len = buffer1_len;
- pNewCmd->buffer2 = buffer2;
- pNewCmd->buffer2_len = buffer2_len;
- pNewCmd->param3 = param3;
- pNewCmd->param4 = param4;
- pNewCmd->pSignalObject = os_SignalObjectCreate (pCmdHndlr->hOs); /* initialize "complete-flag" */
-
- /* If creating the signal object failed */
- if (pNewCmd->pSignalObject == NULL)
- {
- os_printf("cmdPerform: Failed to create signalling object\n");
- /* free allocated memory and return error */
- os_memoryFree (pCmdHndlr->hOs, pNewCmd, sizeof (TConfigCommand));
- return TI_NOK;
- }
-
- /* Indicate the start of command process, from adding it to the queue until get return status form it */
- pNewCmd->bWaitFlag = TI_TRUE;
-
- /* Enter critical section to protect queue access */
- context_EnterCriticalSection (pCmdHndlr->hContext);
-
- /* Enqueue the command (if failed, release memory and return NOK) */
- eStatus = que_Enqueue (pCmdHndlr->hCmdQueue, (TI_HANDLE)pNewCmd);
- if (eStatus != TI_OK)
- {
- os_printf("cmdPerform: Failed to enqueue new command\n");
- os_SignalObjectFree (pCmdHndlr->hOs, pNewCmd->pSignalObject);
- pNewCmd->pSignalObject = NULL;
- os_memoryFree (pCmdHndlr->hOs, pNewCmd, sizeof (TConfigCommand));
- context_LeaveCriticalSection (pCmdHndlr->hContext); /* Leave critical section */
- return TI_NOK;
- }
-
- /*
- * Note: The bProcessingCmds flag is used for indicating if we are already processing
- * the queued commands, so the context-engine shouldn't invoke cmdHndlr_HandleCommands.
- * This is important because if we make this decision according to the queue being empty,
- * there may be a command under processing (already dequeued) while the queue is empty.
- * Note that although we are blocking the current command's originator, there may be another
- * application that will issue a command.
- */
-
- if (pCmdHndlr->bProcessingCmds)
- {
- /* No need to schedule the driver (already handling commands) so just leave critical section */
- context_LeaveCriticalSection (pCmdHndlr->hContext);
- }
- else
- {
- /* Indicate that we are handling queued commands (before leaving critical section!) */
- pCmdHndlr->bProcessingCmds = TI_TRUE;
-
- /* Leave critical section */
- context_LeaveCriticalSection (pCmdHndlr->hContext);
-
- /* Request driver task schedule for command handling (after we left critical section!) */
- context_RequestSchedule (pCmdHndlr->hContext, pCmdHndlr->uContextId);
- }
-
- /* Wait until the command is executed */
- os_SignalObjectWait (pCmdHndlr->hOs, pNewCmd->pSignalObject);
-
- /* After "wait" - the command has already been processed by the drivers' context */
- /* Indicate the end of command process, from adding it to the queue until get return status form it */
- pNewCmd->bWaitFlag = TI_FALSE;
-
- /* Copy the return code */
- eStatus = pNewCmd->return_code;
-
- /* Free signalling object and command structure */
- os_SignalObjectFree (pCmdHndlr->hOs, pNewCmd->pSignalObject);
- pNewCmd->pSignalObject = NULL;
-
- /* If command not completed in this context (Async) don't free the command memory */
- if(COMMAND_PENDING != pNewCmd->eCmdStatus)
- {
- os_memoryFree (pCmdHndlr->hOs, pNewCmd, sizeof (TConfigCommand));
- }
-
- /* Return to calling process with command return code */
- return eStatus;
-}
-
-
-
-/**
- * \fn cmdHndlr_HandleCommands
- * \brief Handle queued commands
- *
- * While there are queued commands, dequeue a command and call the
- * commands interpreter (OID or WEXT selected at compile time).
- * If the command processing is not completed in this context (pending), we exit and
- * this function is called again upon commnad completion, so it can continue processing
- * further queued commands (if any).
- *
- * \note
- * \param hCmdHndlr - The module object
- * \return void
- * \sa cmdHndlr_InsertCommand, cmdHndlr_Complete
- */
-void cmdHndlr_HandleCommands (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
-
- while (1)
- {
- /* Enter critical section to protect queue access */
- context_EnterCriticalSection (pCmdHndlr->hContext);
-
- /* Dequeue a command */
- pCmdHndlr->pCurrCmd = (TConfigCommand *) que_Dequeue (pCmdHndlr->hCmdQueue);
-
- /* If we have got a command */
- if (pCmdHndlr->pCurrCmd)
- {
- /* Leave critical section */
- context_LeaveCriticalSection (pCmdHndlr->hContext);
-
- /* Convert to driver structure and execute command */
- pCmdHndlr->pCurrCmd->eCmdStatus = cmdInterpret_convertAndExecute (pCmdHndlr->hCmdInterpret, pCmdHndlr->pCurrCmd);
-
- /*
- * If command not completed in this context (Async), return.
- * (we'll be called back upon command completion)
- */
- if(COMMAND_PENDING == pCmdHndlr->pCurrCmd->eCmdStatus)
- {
- return;
- }
-
- /* Command was completed so free the wait signal and continue to next command */
- wlanDrvIf_CommandDone(pCmdHndlr->hOs, pCmdHndlr->pCurrCmd->pSignalObject, pCmdHndlr->pCurrCmd->CmdRespBuffer);
-
- pCmdHndlr->pCurrCmd = NULL;
-
- }
-
- /* Else, we don't have commands to handle */
- else
- {
- /* Indicate that we are not handling commands (before leaving critical section!) */
- pCmdHndlr->bProcessingCmds = TI_FALSE;
-
- /* Leave critical section */
- context_LeaveCriticalSection (pCmdHndlr->hContext);
-
- /* Exit (no more work) */
- return;
- }
- }
-}
-
-
-/**
- * \fn cmdHndlr_Complete
- * \brief called whenever a command has finished executing
- *
- * This routine is called whenever a command has finished executing.
- * Either called by the cmdHndlr_HandleCommands if completed in the same context,
- * or by the CmdInterpreter module when tcompleted in a later context (Async).
- *
- * \note
- * \param hCmdHndlr - The module object
- * \return void
- * \sa cmdHndlr_InsertCommand, cmdHndlr_HandleCommands
- */
-void cmdHndlr_Complete (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
- TI_BOOL bLocalWaitFlag;
-
- if (pCmdHndlr->pCurrCmd)
- {
- /* set Status to COMPLETE */
- pCmdHndlr->pCurrCmd->eCmdStatus = TI_OK;
-
- /* save the wait flag before free semaphore */
- bLocalWaitFlag = pCmdHndlr->pCurrCmd->bWaitFlag;
-
- wlanDrvIf_CommandDone(pCmdHndlr->hOs, pCmdHndlr->pCurrCmd->pSignalObject, pCmdHndlr->pCurrCmd->CmdRespBuffer);
-
- /* if cmdHndlr_InsertCommand() not wait to cmd complete? */
- if (TI_FALSE == bLocalWaitFlag)
- {
- /* no wait, free the command memory */
- os_memoryFree (pCmdHndlr->hOs, pCmdHndlr->pCurrCmd, sizeof (TConfigCommand));
- }
-
- pCmdHndlr->pCurrCmd = NULL;
-
- return;
- }
-
- TRACE0(pCmdHndlr->hReport, REPORT_SEVERITY_ERROR, "cmdHndlr_Complete(): pCurrCmd is NULL!\n");
-}
-
-
-/**
- * \fn cmdHndlr_GetStat
- * \brief Get driver statistics
- *
- * Get the driver statistics (Tx, Rx, signal quality).
- *
- * \note
- * \param hCmdHndlr - The object
- * \return The driver statistics pointer
- * \sa
- */
-void * cmdHndlr_GetStat (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
-
- return cmdInterpret_GetStat (pCmdHndlr->hCmdInterpret);
-}
-
-
-/**
- * \fn cmdHndlr_Enable & cmdHndlr_Disable
- * \brief Enable/Disable invoking CmdHndlr module from driver-task
- *
- * Called by the Driver-Main Init SM to enable/disable external inputs processing.
- * Calls the context-engine enable/disable function accordingly.
- *
- * \note
- * \param hCmdHndlr - The object
- * \return void
- * \sa
- */
-void cmdHndlr_Enable (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
-
- context_EnableClient (pCmdHndlr->hContext, pCmdHndlr->uContextId);
-}
-
-void cmdHndlr_Disable (TI_HANDLE hCmdHndlr)
-{
- TCmdHndlrObj *pCmdHndlr = (TCmdHndlrObj *)hCmdHndlr;
-
- context_DisableClient (pCmdHndlr->hContext, pCmdHndlr->uContextId);
-}
-