view src/nucleus/hic.c @ 303:f76436d19a7a default tip

!GPRS config: fix long-standing AT+COPS chance hanging bug There has been a long-standing bug in FreeCalypso going back years: sometimes in the AT command bring-up sequence of an ACI-only MS, the AT+COPS command would produce only a power scan followed by cessation of protocol stack activity (only L1 ADC traces), instead of the expected network search sequence. This behaviour was seen in different FC firmware versions going back to Citrine, and seemed to follow some law of chance, not reliably repeatable. This bug has been tracked down and found to be specific to !GPRS configuration, stemming from our TCS2/TCS3 hybrid and reconstruction of !GPRS support that was bitrotten in TCS3.2/LoCosto version. ACI module psa_mms.c, needed only for !GPRS, was missing in the TCS3 version and had to be pulled from TCS2 - but as it turns out, there is a new field in the MMR_REG_REQ primitive that needs to be set correctly, and that psa_mms.c module is the place where this initialization needed to be added.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 08 Jun 2023 08:23:37 +0000
parents 4e78acac3d88
children
line wrap: on
line source

/*************************************************************************/
/*                                                                       */
/*               Copyright Mentor Graphics Corporation 2002              */
/*                         All Rights Reserved.                          */
/*                                                                       */
/* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS  */
/* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS   */
/* SUBJECT TO LICENSE TERMS.                                             */
/*                                                                       */
/*************************************************************************/

/*************************************************************************/
/*                                                                       */
/* FILE NAME                                               VERSION       */
/*                                                                       */
/*      hic.c                                          Nucleus PLUS 1.14 */
/*                                                                       */
/* COMPONENT                                                             */
/*                                                                       */
/*      HI - History Management                                          */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This file contains the core routines for the History Management  */
/*      component.                                                       */
/*                                                                       */
/* DATA STRUCTURES                                                       */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* FUNCTIONS                                                             */
/*                                                                       */
/*      HIC_Disable_History_Saving          Disable history saving       */
/*      HIC_Enable_History_Saving           Enable history saving        */
/*      HIC_Make_History_Entry_Service      Make history entry service   */
/*      HIC_Make_History_Entry              Make system history entry    */
/*      HIC_Retrieve_History_Entry          Retrieve history entry       */
/*                                                                       */
/* DEPENDENCIES                                                          */
/*                                                                       */
/*      tc_extr.h                           Thread Control functions     */
/*      tm_extr.h                           Timer management functions   */
/*      hi_extr.h                           History functions            */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Replaced void with VOID,                         */
/*                        modified protection logic,                     */
/*                        resulting in version 1.1                       */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*      04-17-1996      updated to version 1.2                           */
/*      03-24-1998      Released version 1.3.                            */
/*      03-26-1999      Released 1.11m (new release                      */
/*                        numbering scheme)                              */
/*      04-17-2002      Released version 1.13m                           */
/*      11-07-2002      Released version 1.14                            */
/*************************************************************************/
#define         NU_SOURCE_FILE

#include        "in_defs.h"                 /* Initialization defines    */
#include        "tc_extr.h"                 /* Thread control functions  */
#include        "tm_extr.h"                 /* Timer functions           */
#include        "hi_extr.h"                 /* History functions         */

/* Define external inner-component global data references.  */

extern INT              INC_Initialize_State;
extern INT              HID_History_Enable;
extern INT              HID_Write_Index;
extern INT              HID_Read_Index;
extern INT              HID_Entry_Count;
extern TC_PROTECT       HID_History_Protect;


/* Define the actual history table.  Note that this is defined in this file
   in order to eliminate this table if none of the run-time history functions
   are accessed.  */

HI_HISTORY_ENTRY  HIC_History_Table[HI_MAX_ENTRIES];


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      HIC_Disable_History_Saving                                       */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function disables the history saving function.              */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      TCT_Protect                         Protect history structures   */
/*      TCT_Unprotect                       Release history protection   */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Replaced void with VOID,                         */
/*                        resulting in version 1.1                       */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
VOID  HIC_Disable_History_Saving(VOID)
{
NU_SUPERV_USER_VARIABLES

    /* Switch to supervisor mode */
    NU_SUPERVISOR_MODE();

    /* Protect the history data structures.  */
    TCT_Protect(&HID_History_Protect);

    /* Disable history saving by setting the enable flag to false.  */
    HID_History_Enable =  NU_FALSE;

    /* Release protection.  */
    TCT_Unprotect();

    /* Return to user mode */
    NU_USER_MODE();
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      HIC_Enable_History_Saving                                        */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function enables the history saving function.               */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      TCT_Protect                         Protect history structures   */
/*      TCT_Unprotect                       Release history protection   */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Replaced void with VOID,                         */
/*                        resulting in version 1.1                       */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
VOID  HIC_Enable_History_Saving(VOID)
{
NU_SUPERV_USER_VARIABLES

    /* Switch to supervisor mode */
    NU_SUPERVISOR_MODE();

    /* Protect the history data structures.  */
    TCT_Protect(&HID_History_Protect);

    /* Enable history saving by setting the enable flag to true.  */
    HID_History_Enable =  NU_TRUE;

    /* Release protection.  */
    TCT_Unprotect();

    /* Return to user mode */
    NU_USER_MODE();
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      HIC_Make_History_Entry_Service                                   */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function makes an application entry in the history table.   */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      HIC_Make_History_Entry              Make a history entry         */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      param1                              First history parameter      */
/*      param2                              Second history parameter     */
/*      param3                              Third history parameter      */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*                                                                       */
/*************************************************************************/
VOID  HIC_Make_History_Entry_Service(UNSIGNED param1,
                                        UNSIGNED param2, UNSIGNED param3)
{
    /* Call actual function to make the history entry.  */
    HIC_Make_History_Entry(NU_USER_ID, param1, param2, param3);
}



/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      HIC_Make_History_Entry                                           */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function makes an entry in the next available location in   */
/*      the history table- if history saving is enabled.                 */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      TCC_Current_HISR_Pointer            Retrieve current HISR pointer*/
/*      TCC_Current_Task_Pointer            Retrieve current task pointer*/
/*      TCT_Get_Current_Protect             Pickup current protection    */
/*      TCT_Protect                         Protect history structures   */
/*      TCT_Set_Current_Protect             Set current protection       */
/*      TCT_Unprotect                       Release history protection   */
/*      TCT_Unprotect_Specific              Release history protection   */
/*      TMT_Retrieve_Clock                  Retrieve system clock        */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      param1                              First history parameter      */
/*      param2                              Second history parameter     */
/*      param3                              Third history parameter      */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*      03-01-1994      Modified protection logic,                       */
/*                        resulting in version 1.1                       */
/*                                                                       */
/*      03-18-1994      Verified version 1.1                             */
/*                                                                       */
/*************************************************************************/
VOID  HIC_Make_History_Entry(DATA_ELEMENT id, UNSIGNED param1,
                                        UNSIGNED param2, UNSIGNED param3)
{
TC_PROTECT              *save_protect;      /* Save protect pointer     */
HI_HISTORY_ENTRY        *pointer;           /* Quick access pointer     */
NU_SUPERV_USER_VARIABLES

    /* Switch to supervisor mode */
    NU_SUPERVISOR_MODE();

    /* If we are not in initialization, get the current protection state */
    if (INC_Initialize_State ==  INC_END_INITIALIZE)

        /* Pickup current protection.  */
        save_protect =  TCT_Get_Current_Protect();

    else
        /* we are in initialization, just clear save_protect */
        save_protect = 0;

    /* Protect the history data structures.  */
    TCT_Protect(&HID_History_Protect);

    /* Determine if history saving is enabled.  */
    if (HID_History_Enable)
    {

        /* Yes, history saving is enabled.  */

        /* Build a pointer to the next location to write to in the table. */
        pointer =  &HIC_History_Table[HID_Write_Index];

        /* Place the necessary information into the history table at the
           current location.  */
        pointer -> hi_id =      id;
        pointer -> hi_param1 =  param1;
        pointer -> hi_param2 =  param2;
        pointer -> hi_param3 =  param3;
        pointer -> hi_time =    TMT_Retrieve_Clock();

        /* Now determine what thread we are currently in.  */
        if ((pointer -> hi_thread =
                (VOID *) TCC_Current_Task_Pointer()) != NU_NULL)

            /* Task thread.  Set the caller flag accordingly.  */
            pointer -> hi_caller =  HI_TASK;

        else if ((pointer -> hi_thread =
                (VOID *) TCC_Current_HISR_Pointer()) != NU_NULL)

            /* HISR thread.  Set the caller flag accordingly.  */
            pointer -> hi_caller =  HI_HISR;

        else

            /* Neither a task or HISR, it caller must be initialization.  */
            pointer -> hi_caller =  HI_INITIALIZE;

        /* Move the write index.  */
        HID_Write_Index++;

        /* Check for a wrap condition on the write index.  */
        if (HID_Write_Index >= HI_MAX_ENTRIES)

            /* Wrap condition present, adjust the write index to the top of the
               table.  */
            HID_Write_Index =  0;

        /* Increment the entries counter, if the maximum has not yet been
           reached.  */
        if (HID_Entry_Count < HI_MAX_ENTRIES)

            /* Increment the total entries counter.  */
            HID_Entry_Count++;
        else

            /* Drag the read index along with the write index.  */
            HID_Read_Index =  HID_Write_Index;
    }

    /* Determine if there was protection in force before call.  */
    if (save_protect)
    {

        /* Make saved protection the current again.  */
        TCT_Set_Current_Protect(save_protect);

        /* Release the history protection.  */
        TCT_Unprotect_Specific(&HID_History_Protect);
    }
    else

        /* Release protection.  */
        TCT_Unprotect();

    /* Return to user mode */
    NU_USER_MODE();
}


/*************************************************************************/
/*                                                                       */
/* FUNCTION                                                              */
/*                                                                       */
/*      HIC_Retrieve_History_Entry                                       */
/*                                                                       */
/* DESCRIPTION                                                           */
/*                                                                       */
/*      This function retrieves the next oldest entry in the history     */
/*      table.  If no more entries are available, an error status is     */
/*      returned.                                                        */
/*                                                                       */
/* CALLED BY                                                             */
/*                                                                       */
/*      Application                                                      */
/*                                                                       */
/* CALLS                                                                 */
/*                                                                       */
/*      TCT_Protect                         Protect history structures   */
/*      TCT_Unprotect                       Release history protection   */
/*                                                                       */
/* INPUTS                                                                */
/*                                                                       */
/*      id                                  Destination for entry id     */
/*      param1                              Destination for parameter 1  */
/*      param2                              Destination for parameter 2  */
/*      param3                              Destination for parameter 3  */
/*      time                                Destination for time of entry*/
/*      task                                Destination of task pointer  */
/*      hisr                                Destination of hisr pointer  */
/*                                                                       */
/* OUTPUTS                                                               */
/*                                                                       */
/*      None                                                             */
/*                                                                       */
/* HISTORY                                                               */
/*                                                                       */
/*         DATE                    REMARKS                               */
/*                                                                       */
/*      03-01-1993      Created initial version 1.0                      */
/*      04-19-1993      Verified version 1.0                             */
/*                                                                       */
/*************************************************************************/
STATUS  HIC_Retrieve_History_Entry(DATA_ELEMENT *id, UNSIGNED *param1,
                                        UNSIGNED *param2, UNSIGNED *param3,
                                        UNSIGNED *time, NU_TASK **task,
                                        NU_HISR **hisr)
{

STATUS                  status;             /* Completion status        */
HI_HISTORY_ENTRY        *pointer;           /* Quick access pointer     */
NU_SUPERV_USER_VARIABLES

    /* Switch to supervisor mode */
    NU_SUPERVISOR_MODE();

    /* Initialize status.  */
    status =  NU_SUCCESS;

    /* Protect the history data structures.  */
    TCT_Protect(&HID_History_Protect);

    /* Determine if there is an entry in the history log.  */
    if (HID_Entry_Count)
    {

        /* Yes, there is at least one entry in the history log.  */

        /* Build a pointer to the next location to read from in the table. */
        pointer =  &HIC_History_Table[HID_Read_Index];

        /* Place the necessary information into the history table at the
           current location.  */
        *id =           pointer -> hi_id;
        *param1 =       pointer -> hi_param1;
        *param2 =       pointer -> hi_param2;
        *param3 =       pointer -> hi_param3;
        *time =         pointer -> hi_time;

        /* Now determine what thread the entry was made from.  */
        if (pointer -> hi_caller == HI_TASK)
        {

            /* Setup the task return parameter.  */
            *task =     (NU_TASK *) pointer -> hi_thread;
            *hisr =     NU_NULL;
        }
        else
        {

            /* In either HISR or initialize case place the thread value
               in the HISR return parameter.  */
            *hisr =     (NU_HISR *) pointer -> hi_thread;
            *task =     NU_NULL;
        }

        /* Move the read index.  */
        HID_Read_Index++;

        /* Check for a wrap condition on the read index.  */
        if (HID_Read_Index >= HI_MAX_ENTRIES)

            /* Wrap condition present, adjust the read index to the top of the
               table.  */
            HID_Read_Index =  0;

        /* Decrement the entries counter.  */
        HID_Entry_Count--;
    }
    else

        /* Return the end of history log status.  */
        status =  NU_END_OF_LOG;

    /* Release protection.  */
    TCT_Unprotect();

    /* Return to user mode */
    NU_USER_MODE();

    /* Return completion status to the caller.  */
    return(status);
}