FreeCalypso > hg > fc-tourmaline
view cdg-hybrid/cdginc/p_8010_153_cause_include.h @ 220:0ed36de51973
ABB semaphore protection overhaul
The ABB semaphone protection logic that came with TCS211 from TI
was broken in several ways:
* Some semaphore-protected functions were called from Application_Initialize()
context. NU_Obtain_Semaphore() called with NU_SUSPEND fails with
NU_INVALID_SUSPEND in this context, but the return value wasn't checked,
and NU_Release_Semaphore() would be called unconditionally at the end.
The latter call would increment the semaphore count past 1, making the
semaphore no longer binary and thus no longer effective for resource
protection. The fix is to check the return value from NU_Obtain_Semaphore()
and skip the NU_Release_Semaphore() call if the semaphore wasn't properly
obtained.
* Some SPI hardware manipulation was being done before entering the semaphore-
protected critical section. The fix is to reorder the code: first obtain
the semaphore, then do everything else.
* In the corner case of L1/DSP recovery, l1_abb_power_on() would call some
non-semaphore-protected ABB & SPI init functions. The fix is to skip those
calls in the case of recovery.
* A few additional corner cases existed, all of which are fixed by making
ABB semaphore protection 100% consistent for all ABB functions and code paths.
There is still one remaining problem of priority inversion: suppose a low-
priority task calls an ABB function, and some medium-priority task just happens
to preempt right in the middle of that semaphore-protected ABB operation. Then
the high-priority SPI task is locked out for a non-deterministic time until
that medium-priority task finishes its work and goes back to sleep. This
priority inversion problem remains outstanding for now.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Mon, 26 Apr 2021 20:55:25 +0000 |
| parents | 35f7a1dc9f7d |
| children |
line wrap: on
line source
/* +--------------------------------------------------------------------------+ | PROJECT : PROTOCOL STACK | | FILE : p_8010_153_cause_include.h | | SOURCE : "sap\8010_153_cause_include.pdf" | | LastModified : "2004-11-30" | | IdAndVersion : "8010.153.04.032" | | SrcFileTime : "Thu Nov 29 09:29:16 2007" | | Generated by CCDGEN_2.5.5A on Fri Oct 14 21:41:52 2016 | | !!DO NOT MODIFY!!DO NOT MODIFY!!DO NOT MODIFY!! | +--------------------------------------------------------------------------+ */ /* PRAGMAS * PREFIX : CAUSE * COMPATIBILITY_DEFINES : NO * ALWAYS_ENUM_IN_VAL_FILE: YES * ENABLE_GROUP: NO * CAPITALIZE_TYPENAME: NO */ #ifndef P_8010_153_CAUSE_INCLUDE_H #define P_8010_153_CAUSE_INCLUDE_H #define CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H #define CDG_ENTER__FILENAME _P_8010_153_CAUSE_INCLUDE_H #define CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H__FILE_TYPE CDGINC #define CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H__LAST_MODIFIED _2004_11_30 #define CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H__ID_AND_VERSION _8010_153_04_032 #define CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H__SRC_FILE_TIME _Thu_Nov_29_09_29_16_2007 #include "CDG_ENTER.h" #undef CDG_ENTER__P_8010_153_CAUSE_INCLUDE_H #undef CDG_ENTER__FILENAME #include "p_8010_153_cause_include.val" /* * typedef between var and valtab enums */ #ifndef __T_CAUSE_cc_cause__ #define __T_CAUSE_cc_cause__ typedef T_CAUSE_VAL_cc_cause T_CAUSE_cc_cause; #endif #ifndef __T_CAUSE_nwcc_cause__ #define __T_CAUSE_nwcc_cause__ typedef T_CAUSE_VAL_nwcc_cause T_CAUSE_nwcc_cause; #endif #ifndef __T_CAUSE_nwss_cause__ #define __T_CAUSE_nwss_cause__ typedef T_CAUSE_VAL_nwcc_cause T_CAUSE_nwss_cause; #endif #ifndef __T_CAUSE_dl_cause__ #define __T_CAUSE_dl_cause__ typedef T_CAUSE_VAL_dl_cause T_CAUSE_dl_cause; #endif #ifndef __T_CAUSE_l2r_cause__ #define __T_CAUSE_l2r_cause__ typedef T_CAUSE_VAL_l2r_cause T_CAUSE_l2r_cause; #endif #ifndef __T_CAUSE_llc_cause__ #define __T_CAUSE_llc_cause__ typedef T_CAUSE_VAL_llc_cause T_CAUSE_llc_cause; #endif #ifndef __T_CAUSE_mm_cause__ #define __T_CAUSE_mm_cause__ typedef T_CAUSE_VAL_mm_cause T_CAUSE_mm_cause; #endif #ifndef __T_CAUSE_nwmm_cause__ #define __T_CAUSE_nwmm_cause__ typedef T_CAUSE_VAL_nwmm_cause T_CAUSE_nwmm_cause; #endif #ifndef __T_CAUSE_ppp_cause__ #define __T_CAUSE_ppp_cause__ typedef T_CAUSE_VAL_ppp_cause T_CAUSE_ppp_cause; #endif #ifndef __T_CAUSE_rcm_cause__ #define __T_CAUSE_rcm_cause__ typedef T_CAUSE_VAL_rcm_cause T_CAUSE_rcm_cause; #endif #ifndef __T_CAUSE_rr_cause__ #define __T_CAUSE_rr_cause__ typedef T_CAUSE_VAL_rr_cause T_CAUSE_rr_cause; #endif #ifndef __T_CAUSE_nwrr_cause__ #define __T_CAUSE_nwrr_cause__ typedef T_CAUSE_VAL_nwrr_cause T_CAUSE_nwrr_cause; #endif #ifndef __T_CAUSE_rlp_cause__ #define __T_CAUSE_rlp_cause__ typedef T_CAUSE_VAL_rlp_cause T_CAUSE_rlp_cause; #endif #ifndef __T_CAUSE_rrc_cause__ #define __T_CAUSE_rrc_cause__ typedef T_CAUSE_VAL_rrc_cause T_CAUSE_rrc_cause; #endif #ifndef __T_CAUSE_nwrrc_cause__ #define __T_CAUSE_nwrrc_cause__ typedef T_CAUSE_VAL_nwrrc_cause T_CAUSE_nwrrc_cause; #endif #ifndef __T_CAUSE_sim_cause__ #define __T_CAUSE_sim_cause__ typedef T_CAUSE_VAL_sim_cause T_CAUSE_sim_cause; #endif #ifndef __T_CAUSE_sm_cause__ #define __T_CAUSE_sm_cause__ typedef T_CAUSE_VAL_sm_cause T_CAUSE_sm_cause; #endif #ifndef __T_CAUSE_nwsm_cause__ #define __T_CAUSE_nwsm_cause__ typedef T_CAUSE_VAL_nwsm_cause T_CAUSE_nwsm_cause; #endif #ifndef __T_CAUSE_sms_cause__ #define __T_CAUSE_sms_cause__ typedef T_CAUSE_VAL_sms_cause T_CAUSE_sms_cause; #endif #ifndef __T_CAUSE_nwsms_cp_cause__ #define __T_CAUSE_nwsms_cp_cause__ typedef T_CAUSE_VAL_nwsms_cp_cause T_CAUSE_nwsms_cp_cause; #endif #ifndef __T_CAUSE_nwsms_rp_cause__ #define __T_CAUSE_nwsms_rp_cause__ typedef T_CAUSE_VAL_nwsms_rp_cause T_CAUSE_nwsms_rp_cause; #endif #ifndef __T_CAUSE_nwsms_tp_cause__ #define __T_CAUSE_nwsms_tp_cause__ typedef T_CAUSE_VAL_nwsms_tp_cause T_CAUSE_nwsms_tp_cause; #endif #ifndef __T_CAUSE_sn_cause__ #define __T_CAUSE_sn_cause__ typedef T_CAUSE_VAL_sn_cause T_CAUSE_sn_cause; #endif #ifndef __T_CAUSE_upm_cause__ #define __T_CAUSE_upm_cause__ typedef T_CAUSE_VAL_upm_cause T_CAUSE_upm_cause; #endif #ifndef __T_CAUSE_rrlc_cause__ #define __T_CAUSE_rrlc_cause__ typedef T_CAUSE_VAL_rrlc_cause T_CAUSE_rrlc_cause; #endif #ifndef __T_CAUSE_value__ #define __T_CAUSE_value__ /* * Cause element containing result of operation * CCDGEN:WriteStruct_Count==1387 */ typedef union { U16 nwmm_cause; /*< 0: 2> T_CAUSE_nwmm_cause, Cause element from network peer MM */ U16 nwrr_cause; /*< 0: 2> T_CAUSE_nwrr_cause, Cause element from GSM peer RR */ U16 nwrrc_cause; /*< 0: 2> T_CAUSE_nwrrc_cause, Cause element from UTRAN peer RRC */ U16 nwsm_cause; /*< 0: 2> T_CAUSE_nwsm_cause, Cause element from network peer SM */ U16 nwss_cause; /*< 0: 2> T_CAUSE_nwss_cause, Cause element containing result of a SS operation */ U16 nwsms_cp_cause; /*< 0: 2> T_CAUSE_nwsms_cp_cause, Cause element containing result of an SMS operation */ U16 nwsms_rp_cause; /*< 0: 2> T_CAUSE_nwsms_rp_cause, Cause element containing result of an SMS operation */ U16 nwsms_tp_cause; /*< 0: 2> T_CAUSE_nwsms_tp_cause, Cause element containing result of an SMS operation */ U16 upper_nw_cause; /*< 0: 2> If ctrl_value is below is_from_nw the cause originates from NW. Do NOT use as real value of ctrl_value. */ U16 cc_cause; /*< 0: 2> T_CAUSE_cc_cause, Cause element containing result of a CC operation */ U16 dl_cause; /*< 0: 2> T_CAUSE_dl_cause, Cause element containing result of a DL operation */ U16 l2r_cause; /*< 0: 2> T_CAUSE_l2r_cause, Cause element containing result of a L2R operation */ U16 llc_cause; /*< 0: 2> T_CAUSE_llc_cause, Cause element containing result of a LLC operation */ U16 mm_cause; /*< 0: 2> T_CAUSE_mm_cause, Cause element containing result of an MM operation */ U16 nwcc_cause; /*< 0: 2> T_CAUSE_nwcc_cause, Cause element containing result of a CC operation */ U16 ppp_cause; /*< 0: 2> T_CAUSE_ppp_cause, Cause element containing result of a PPP operation */ U16 rcm_cause; /*< 0: 2> T_CAUSE_rcm_cause, Cause element containing result of an RCM operation */ U16 rr_cause; /*< 0: 2> T_CAUSE_rr_cause, Cause element containing result of an RR operation */ U16 rlp_cause; /*< 0: 2> T_CAUSE_rlp_cause, Cause element containing result of an RLP operation */ U16 rrc_cause; /*< 0: 2> T_CAUSE_rrc_cause, Cause element containing result of an RRC operation */ U16 sim_cause; /*< 0: 2> T_CAUSE_sim_cause, Cause element from SIM to ACI/SMS/MM */ U16 sm_cause; /*< 0: 2> T_CAUSE_sm_cause, Cause element containing result of an SM operation */ U16 sms_cause; /*< 0: 2> T_CAUSE_sms_cause, Cause element containing result of an SMS operation */ U16 sn_cause; /*< 0: 2> T_CAUSE_sn_cause, Cause element containing result of an SNDCP operation */ U16 upm_cause; /*< 0: 2> T_CAUSE_upm_cause, Cause element containing result of an UPM operation */ U16 upper_ue_cause; /*< 0: 2> If ctrl_value is between is_from_nw and is_from_ue the cause originates from UE. Do NOT use as real value of ctrl_value. */ U8 rrlc_cause; /*< 0: 1> T_CAUSE_rrlc_cause, cause */ } T_CAUSE_value; #endif #ifndef __T_CAUSE_ps_cause__ #define __T_CAUSE_ps_cause__ /* * Cause element containing result of operation * CCDGEN:WriteStruct_Count==1388 */ typedef struct { T_CAUSE_ctrl_value ctrl_value; /*< 0: 4> (enum=32bit) controller for union */ T_CAUSE_value value; /*< 4: 2> Cause element containing result of operation */ U8 _align0; /*< 6: 1> alignment */ U8 _align1; /*< 7: 1> alignment */ } T_CAUSE_ps_cause; #endif /* * End of substructure section, begin of primitive definition section */ #ifndef __T_CAUSE_EXPORT__ #define __T_CAUSE_EXPORT__ /* * * CCDGEN:WriteStruct_Count==1389 */ typedef struct { T_CAUSE_ps_cause ps_cause; /*< 0: 8> Cause element containing result of operation */ } T_CAUSE_EXPORT; #endif #include "CDG_LEAVE.h" #endif
