view src/g23m-fad/l2r/l2r_upp.c @ 263:b5e8dfd114a7

Switch_ON(): go into charging boot mode on either CHGSTS or CHGPRES If someone were to plug and then unplug a charger into a switched-off phone in an extremely brief "glitch" manner, we should do an automatic power-off on boot in this condition. When we were checking only CHGPRES in Switch_ON(), we would go into Misc boot state instead, which is undesirable. Now if we have a CHGSTS but not CHGPRES condition, we will go into charging boot mode, and FCBM will then do the automatic power-off upon detecting absence of the charger in its periodic polling.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 14 May 2021 05:50:36 +0000
parents fa8dc04885d8
children
line wrap: on
line source

/*
+-----------------------------------------------------------------------------
|  Project :  CSD (8411)
|  Modul   :  L2r_upp.c
+-----------------------------------------------------------------------------
|  Copyright 2002 Texas Instruments Berlin, AG
|                 All rights reserved.
|
|                 This file is confidential and a trade secret of Texas
|                 Instruments Berlin, AG
|                 The receipt of or possession of this file does not convey
|                 any rights to reproduce or disclose its contents or to
|                 manufacture, use, or sell anything it may describe, in
|                 whole, or in part, without the specific written consent of
|                 Texas Instruments Berlin, AG.
+-----------------------------------------------------------------------------
|  Purpose :  This Modul defines the functions for processing
|             of incomming primitives for the component
|             L2R of the base station
+-----------------------------------------------------------------------------
*/

#ifndef L2R_UPP_C
#define L2R_UPP_C
#endif

#define ENTITY_L2R

/*==== INCLUDES ===================================================*/

#include <string.h>
#include "typedefs.h"
#include "pconst.cdg"
#include "vsi.h"
#include "macdef.h"
#include "custom.h"
#include "gsm.h"
#include "cus_l2r.h"
#include "cnf_l2r.h"
#include "mon_l2r.h"
#include "prim.h"
#include "pei.h"
#include "tok.h"
#include "dti.h"      /* functionality of the dti library */

#include "cl_ribu.h"
#include "l2r.h"

/*==== CONST =======================================================*/
/*==== TYPES =======================================================*/
/*==== VAR EXPORT ==================================================*/
/*==== VAR LOCAL ===================================================*/
/*==== FUNCTIONS ===================================================*/

/*
+------------------------------------------------------------------------------
|  Function    : sig_dti_up_data_received_ind
+------------------------------------------------------------------------------
|  Description : Process primitive DTI2_DATA_REQ received from CSDIWF.
|
|  Parameters  : dti_data_req -
|
|
|  Return      : -
+------------------------------------------------------------------------------
*/

GLOBAL void sig_dti_up_data_received_ind(T_DTI2_DATA_REQ *dti_data_req)
{
  T_UP *dup = &l2r_data->up;

  TRACE_FUNCTION ("sig_dti_up_data_received_ind()");

  PACCESS        (dti_data_req);

  switch (GET_STATE (UP))
  {
  case UP_CONNECTED:
    {
      if (GET_STATE (DTI) NEQ DTI_CLOSED)
      {
        /*
         * do not send flow control primitives automatically
         */
        dti_stop(l2r_hDTI, L2R_DTI_UP_DEF_INSTANCE, L2R_DTI_UP_INTERFACE, L2R_DTI_UP_CHANNEL);
      }

      SET_STATE (UP_UL, IW_IDLE);
      dup->Prim = dti_data_req;

      /* detect break request */
      if (dup->Prim->parameters.st_lines.st_break_len NEQ DTI_BREAK_OFF)
      {
        sig_up_mgt_break_ind(dup->Prim);
      }
      else
      {
        up_store_data();
      }

      switch (GET_STATE (UP_LL))
      {
      case ISW_WAIT:
        if (dup->LLFlow EQ FL_INACTIVE AND dup->RiBu.idx.filled)
        {
          /* L_UDR_1 */
          TIMERSTOP (TIMER_TUP_SND);
          up_send_current_prim();

          if (!dup->RiBu.idx.filled)
          {
            SET_STATE (UP_LL, ISW_IDLE);
          }
          else
          {
            SET_STATE (UP_LL, ISW_SEND);
          }
        }
        else
        {
          /* L_UDR_2 */
          if( dup->LastSentFlow EQ dup->MrgFlow )
            return;

          TIMERSTOP (TIMER_TUP_SND);

          switch (dup->LLFlow)
          {
          case FL_INACTIVE:
            up_send_prim_timeout();
            break;

          case FL_ACTIVE:
            up_send_empty_frame(dup->LastSentSa, dup->LastSentSb, dup->MrgFlow);
            break;
          }

          if (!dup->RiBu.idx.filled)
          {
            SET_STATE (UP_LL, ISW_IDLE);
          }
          else
          {
            SET_STATE (UP_LL, ISW_SEND);
          }
        }
        break;

      default:
        if (!dup->RiBu.idx.filled) /* no primitive is ready */
          return;

        /* L_UDR3 */
        up_check_flow();
        up_check_alloc();
        SET_STATE (UP_LL, ISW_SEND);
        break;
      }
      break;
    }
  }
}

/*
+------------------------------------------------------------------------------
|  Function    : up_rlp_ready_ind
+------------------------------------------------------------------------------
|  Description : Process primitive RLP_READY_IND received from RLP.
|
|  Parameters  : rlp_ready_ind -
|
|
|  Return      : -
+------------------------------------------------------------------------------
*/

GLOBAL void up_rlp_ready_ind(T_RLP_READY_IND *rlp_ready_ind)
{
  T_UP *dup = &l2r_data->up;

  TRACE_FUNCTION ("rlp_ready_ind()");
  PACCESS        (rlp_ready_ind);

  switch (GET_STATE (UP))
  {
  case UP_CONNECTED:
    switch (GET_STATE (UP_LL))
    {
    case ISW_SEND:
      if (dup->LLFlow EQ FL_INACTIVE OR dup->UrgentMsg)
      {
        up_send_current_prim();
        if (!dup->RiBu.idx.filled)
        {
          SET_STATE (UP_LL, ISW_IDLE);
        }
      }
      else
      {
        if (dup->LastSentFlow NEQ dup->MrgFlow)
        {
          up_send_empty_frame(dup->LastSentSa, dup->LastSentSb, dup->MrgFlow);
        }
        else
        {
          SET_STATE (UP_LL, ISW_WAIT);
          TIMERSTART(TIMER_TUP_SND, LL_TO);
        }
      }
      break;

    default:
      SET_STATE (UP_LL, ISW_WAIT);
      TIMERSTART(TIMER_TUP_SND, LL_TO);
      break;
    }
    break;

  case UP_REMAP:
    SET_STATE (UP_LL, ISW_WAIT);
    break;
  }
  PFREE (rlp_ready_ind);
}