source: svn/trunk/newcon3bcm2_21bu/nexus/modules/frontend/common/src/nexus_frontend.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 20.2 KB
Line 
1/***************************************************************************
2*     (c)2004-2011 Broadcom Corporation
3*
4*  This program is the proprietary software of Broadcom Corporation and/or its licensors,
5*  and may only be used, duplicated, modified or distributed pursuant to the terms and
6*  conditions of a separate, written license agreement executed between you and Broadcom
7*  (an "Authorized License").  Except as set forth in an Authorized License, Broadcom grants
8*  no license (express or implied), right to use, or waiver of any kind with respect to the
9*  Software, and Broadcom expressly reserves all rights in and to the Software and all
10*  intellectual property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU
11*  HAVE NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY
12*  NOTIFY BROADCOM AND DISCONTINUE ALL USE OF THE SOFTWARE.
13*
14*  Except as expressly set forth in the Authorized License,
15*
16*  1.     This program, including its structure, sequence and organization, constitutes the valuable trade
17*  secrets of Broadcom, and you shall use all reasonable efforts to protect the confidentiality thereof,
18*  and to use this information only in connection with your use of Broadcom integrated circuit products.
19*
20*  2.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
21*  AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
22*  WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
23*  THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND ALL IMPLIED WARRANTIES
24*  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE,
25*  LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION
26*  OR CORRESPONDENCE TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF
27*  USE OR PERFORMANCE OF THE SOFTWARE.
28*
29*  3.     TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR ITS
30*  LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL, INDIRECT, OR
31*  EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY WAY RELATING TO YOUR
32*  USE OF OR INABILITY TO USE THE SOFTWARE EVEN IF BROADCOM HAS BEEN ADVISED OF
33*  THE POSSIBILITY OF SUCH DAMAGES; OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT
34*  ACTUALLY PAID FOR THE SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE
35*  LIMITATIONS SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF
36*  ANY LIMITED REMEDY.
37*
38* $brcm_Workfile: nexus_frontend.c $
39* $brcm_Revision: 32 $
40* $brcm_Date: 11/17/11 4:43p $
41*
42* API Description:
43*   API name: Frontend
44*    Generic Frontend APIs.
45*
46* Revision History:
47*
48* $brcm_Log: X:/win_views/7425_3.5/nexus/modules/frontend/common/src/nexus_frontend.c $
49*
50* 32   11/17/11 4:43p vishk
51* SW3461-96: Remove GetLockStatus and replace it with GetFastStatus
52*
53* 31   11/1/11 3:09p vishk
54* SW3461-55: Means of returning BCM3461 chip revsion and firmware
55*  revision via NEXUS i/f
56*
57* 30   10/6/11 5:21p jtna
58* SW7425-1327: add NEXUS_Frontend_Get/SetTransportSettings()
59*
60* 29   10/6/11 9:53a jtna
61* SW7425-1189: change NEXUS_Frontend_GetTsmfSettings() to return void
62*
63* 28   10/5/11 12:24p jtna
64* SW7425-1189: add transport and frontend TSMF support
65*
66* 27   9/21/11 5:26p vishk
67* SW3461-53: 3461 interrupt line 'stuck low' after multiple tune events.
68*
69* 26   1/6/11 7:42p shyi
70* SW35230-2441: Moved out channel scan API to platform specific location
71*
72* 25   11/18/10 11:39a mward
73* SW7125-737:  In NEXUS_Frontend_Close(), don't automatically untune if
74*  frontends are defined for standby.  Explicit untune should be used for
75*  increased flexibility.
76*
77* 24   9/2/10 11:45a shyi
78* SW35230-1020: Merging to main branch
79*
80* SW35230-1020/1   8/26/10 12:01p shyi
81* SW35230-1020: Added frequency scanning for DVB-T signal
82*
83* 23   8/20/09 4:48p erickson
84* PR57770: convert FTM extension into more generic customer extension
85*
86* 22   7/21/09 10:00a erickson
87* PR56958: fix NEXUS_Frontend_SetUserParameters, add comments to
88*  NEXUS_Frontend_ScanFrequency
89*
90* 21   7/21/09 9:00a erickson
91* PR56765: add ftm state and uninit
92*
93* 20   7/14/09 3:47p erickson
94* PR56789: remove NEXUS_Frontend_SetPowerState. unimplemented and unused.
95*
96* 19   7/8/09 3:13p erickson
97* PR56607: remove unused NEXUS_Frontend_P_Register function
98*
99* 18   7/8/09 6:53a erickson
100* PR56607: add optional registerExtension operator so that callbacks can
101*  be recreated with the handle that the user gets. this allows
102*  NEXUS_StopCallbacks to work.
103*
104* 17   7/2/09 2:29p haisongw
105* PR52808: No  Untune() for upstream
106*
107* 16   6/24/09 9:37a erickson
108* PR53078: add support for frontend handle extensions in 73xx public API
109*  implementations
110*
111* 15   5/15/09 12:01p erickson
112* PR54843: untune on close
113*
114* 14   5/11/09 4:29p erickson
115* PR53078: get time of tune or resetStatus so that elapsed time can be
116*  returned with status
117*
118* 13   2/23/09 3:42p katrep
119* PR52409: Fixed error messages due AST during nexus shutdown
120*
121* 12   2/11/09 3:38p jgarrett
122* PR 51457: Renaming destroy extension routine
123*
124* 11   1/23/09 3:32p jgarrett
125* PR 51457: Adding frontend extension hooks for tuners and
126*  frontends/demods
127*
128* 10   12/11/08 4:07p erickson
129* PR49556: separate frontend power management into analog and digital,
130*  guarantee correct refcnt
131*
132* 9   10/8/08 1:12a erickson
133* PR40799: provided untune takes precedence over dummy acquire. needed
134*  for power down.
135*
136* 8   10/2/08 11:27a erickson
137* PR40799: add optional untune function pointer
138*
139* 7   8/5/08 11:25a erickson
140* PR45427: add NEXUS_Frontend_Untune
141*
142* 6   4/11/08 9:53a erickson
143* PR41246: convert BDBG_OBJECT_UNSET to BDBG_OBJECT_DESTROY if freeing
144*  memory
145*
146* 5   3/14/08 12:55p jgarrett
147* PR 40108: Adding NEXUS_Frontend_ScanFrequency
148*
149* 4   3/14/08 11:31a jgarrett
150* PR 40109: Adding NEXUS_Frontend_ResetStatus
151*
152* 3   3/12/08 10:25a erickson
153* PR39584: added BDBG_OBJECT_ASSERT's
154*
155* 2   2/7/08 5:36p jgarrett
156* PR 39407: Converting to common close functions
157*
158* 1   1/18/08 2:19p jgarrett
159* PR 38808: Merging to main branch
160*
161* Nexus_Devel/2   11/5/07 2:58p erickson
162* PR36725: remove Get and GetCount
163*
164* Nexus_Devel/1   10/5/07 5:51p jgarrett
165* PR 35551: Adding initial version
166*
167***************************************************************************/
168
169#include "nexus_frontend_module.h"
170
171BDBG_MODULE(nexus_frontend);
172
173BDBG_OBJECT_ID(NEXUS_Frontend);
174
175/***************************************************************************
176Summary:
177    Return a list of capabilities for a given frontend object.
178Description:
179    This call returns a list of capabilities for a frontend object.  Because
180    many frontends support multiple types of modulation schemes, this
181    allows the application to distinguish the capabilities of one tuner
182    versus another.  If a tuner has multiple capabilities, only one of
183    the modes may be used at any one time.
184See Also:
185    NEXUS_Frontend_Get
186 ***************************************************************************/
187void NEXUS_Frontend_GetCapabilities(
188    NEXUS_FrontendHandle handle,
189    NEXUS_FrontendCapabilities *pCapabilities   /* [out] */
190    )
191{
192    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
193    BDBG_ASSERT(NULL != pCapabilities);
194
195    *pCapabilities = handle->capabilities;
196}
197
198/***************************************************************************
199Summary:
200    Get an array of soft decisions for a constellation.
201Description:
202    I and Q range from 32767 to -32768 for all devices, however precision
203    may vary per device.
204 ***************************************************************************/
205NEXUS_Error NEXUS_Frontend_GetSoftDecisions(
206    NEXUS_FrontendHandle handle,
207    NEXUS_FrontendSoftDecision *pDecisions, /* [out, size_is(length)] array of soft decisions */
208    size_t length                           /* number of NEXUS_FrontendSoftDecision's to get */
209    )
210{
211    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
212    BDBG_ASSERT(NULL != handle->pDeviceHandle);
213    BDBG_ASSERT(NULL != pDecisions);
214
215    if ( NULL == handle->getSoftDecisions )
216    {
217        if ( handle->pParentFrontend )
218        {
219            return NEXUS_Frontend_GetSoftDecisions(handle->pParentFrontend, pDecisions, length);
220        }
221        else
222        {
223            return BERR_TRACE(BERR_NOT_SUPPORTED);
224        }
225    }
226    else
227    {
228        return handle->getSoftDecisions(handle->pDeviceHandle, pDecisions, length);
229    }
230}
231
232NEXUS_Error NEXUS_Frontend_GetUserParameters( NEXUS_FrontendHandle handle, NEXUS_FrontendUserParameters *pParams )
233{
234    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
235    BDBG_ASSERT(NULL != pParams);
236    *pParams = handle->userParameters;
237    return BERR_SUCCESS;
238}
239
240NEXUS_Error NEXUS_Frontend_SetUserParameters( NEXUS_FrontendHandle handle, const NEXUS_FrontendUserParameters *pParams )
241{
242    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
243    BDBG_ASSERT(NULL != pParams);
244    handle->userParameters = *pParams;
245    return BERR_SUCCESS;
246}
247
248void NEXUS_Frontend_P_Init(void)
249{
250}
251
252NEXUS_FrontendHandle NEXUS_Frontend_P_Create(void *pDeviceHandle)
253{
254    NEXUS_FrontendHandle handle;
255    BDBG_ASSERT(NULL != pDeviceHandle);
256    handle = BKNI_Malloc(sizeof(NEXUS_Frontend));
257    if ( NULL != handle )
258    {
259        BKNI_Memset(handle, 0, sizeof(NEXUS_Frontend));
260        BDBG_OBJECT_SET(handle, NEXUS_Frontend);
261        handle->pDeviceHandle = pDeviceHandle;
262    }
263    return handle;
264}
265
266void NEXUS_Frontend_P_Destroy(NEXUS_FrontendHandle handle)
267{
268    BDBG_OBJECT_DESTROY(handle, NEXUS_Frontend);
269    BKNI_Free(handle);
270}
271
272/***************************************************************************
273Summary:
274    Close a frontend handle
275***************************************************************************/
276void NEXUS_Frontend_Close(
277    NEXUS_FrontendHandle handle
278    )
279{
280    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
281    BDBG_ASSERT(NULL != handle->close);
282    if ( handle->numExtensions > 0 )
283    {
284        BDBG_ERR(("Can not close a frontend with open extensions."));
285        BDBG_ASSERT(handle->numExtensions == 0);
286    }
287
288#if (0==(NEXUS_HOST_CONTROL_EXTERNAL_FRONTEND_STANDBY+NEXUS_HOST_CONTROL_INTERNAL_FRONTEND_STANDBY))
289    /* These standby use cases need to separate untune and close. Otherwise... */
290    /* untune before closing. may result in power savings. */
291    NEXUS_Frontend_Untune(handle);
292#endif
293
294#ifdef NEXUS_FRONTEND_CUSTOMER_EXTENSION
295    NEXUS_Frontend_P_UninitExtension(handle);
296#endif
297
298    handle->close(handle);
299}
300
301void NEXUS_Frontend_Untune( NEXUS_FrontendHandle handle )
302{
303    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
304
305    if ( handle->untune )
306    {
307        handle->untune(handle->pDeviceHandle);
308    }
309    else if ( handle->pParentFrontend && handle->pParentFrontend->untune )
310    {
311        NEXUS_Frontend_Untune(handle->pParentFrontend);
312    }
313    else
314    {
315        /* This is a simple way to reset the app callback. In the future, we may want
316                a chip-specific way of reseting state. */
317        if ( handle->capabilities.qam )
318        {
319            NEXUS_FrontendQamSettings settings;
320            NEXUS_Frontend_GetDefaultQamSettings(&settings);
321            (void)NEXUS_Frontend_TuneQam(handle, &settings);
322        }
323        else if ( handle->capabilities.vsb )
324        {
325            NEXUS_FrontendVsbSettings settings;
326            NEXUS_Frontend_GetDefaultVsbSettings(&settings);
327            (void)NEXUS_Frontend_TuneVsb(handle, &settings);
328        }
329        else if ( handle->capabilities.satellite )
330        {
331            NEXUS_FrontendSatelliteSettings settings;
332            NEXUS_Frontend_GetDefaultSatelliteSettings(&settings);
333            settings.frequency=950000000UL;
334            (void)NEXUS_Frontend_TuneSatellite(handle, &settings);
335        }
336        else if ( handle->capabilities.ofdm )
337        {
338            NEXUS_FrontendOfdmSettings settings;
339            NEXUS_Frontend_GetDefaultOfdmSettings(&settings);
340            (void)NEXUS_Frontend_TuneOfdm(handle, &settings);
341        }
342        else if ( handle->capabilities.analog )
343        {
344            NEXUS_FrontendAnalogSettings settings;
345            NEXUS_Frontend_GetDefaultAnalogSettings(&settings);
346            (void)NEXUS_Frontend_TuneAnalog(handle, &settings);
347        }
348        else if ( handle->capabilities.outOfBand )
349        {
350            NEXUS_FrontendOutOfBandSettings settings;
351            NEXUS_Frontend_GetDefaultOutOfBandSettings(&settings);
352            (void)NEXUS_Frontend_TuneOutOfBand(handle, &settings);
353        }
354        else if ( handle->capabilities.upstream )
355        {
356            /* no untune for upstream*/
357        }
358        else
359        {
360            BDBG_ERR(("Unable to untune. No tuner capabilities found."));
361        }
362    }
363}
364
365/***************************************************************************
366Summary:
367    Reset status values for a frontend
368***************************************************************************/
369void NEXUS_Frontend_ResetStatus(
370    NEXUS_FrontendHandle handle
371    )
372{
373    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
374    NEXUS_Time_Get(&handle->resetStatusTime);
375    if ( handle->resetStatus )
376    {
377        handle->resetStatus(handle->pDeviceHandle);
378    }
379    else if ( handle->pParentFrontend )
380    {
381        NEXUS_Frontend_ResetStatus(handle->pParentFrontend);
382    }
383}
384
385/***************************************************************************
386Summary:
387    Get the Synchronous lock status of a frontend.
388 ***************************************************************************/
389NEXUS_Error NEXUS_Frontend_GetFastStatus(
390    NEXUS_FrontendHandle handle,
391    NEXUS_FrontendFastStatus *pStatus
392    )
393{
394    BDBG_ASSERT(NULL != handle);
395
396    if ( NULL == handle->getFastStatus )
397    {
398        if ( handle->pParentFrontend )
399        {
400            return NEXUS_Frontend_GetFastStatus(handle->pParentFrontend, pStatus);
401        }
402        else
403        {
404            return BERR_TRACE(BERR_NOT_SUPPORTED);
405        }
406    }
407    else
408    {
409        return handle->getFastStatus(handle->pDeviceHandle, pStatus);
410    }
411}
412
413/***************************************************************************
414Summary:
415    Retrieve the chip family id, chip id, chip version and firmware version.
416 ***************************************************************************/
417void NEXUS_Frontend_GetType(
418    NEXUS_FrontendHandle handle,
419    NEXUS_FrontendType *pType    /* [out] */
420    )
421{
422    BDBG_ASSERT(NULL != handle);
423
424    if ( NULL == handle->getType )
425    {
426        if ( handle->pParentFrontend )
427        {
428            NEXUS_Frontend_GetType(handle->pParentFrontend, pType);
429        }
430        else
431        {
432            BERR_TRACE(BERR_NOT_SUPPORTED);
433        }
434    }
435    else
436    {
437        handle->getType(handle->pDeviceHandle, pType);
438    }
439}
440
441void NEXUS_Frontend_GetTsmfSettings(
442    NEXUS_FrontendHandle handle,
443    NEXUS_TsmfSettings *pSettings /* [out] */
444    )
445{
446    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
447
448    if (NULL == handle->getTsmfSettings) {
449        if (handle->pParentFrontend) {
450            NEXUS_Frontend_GetTsmfSettings(handle->pParentFrontend, pSettings);
451            return;
452        }
453        else {
454            BERR_TRACE(BERR_NOT_SUPPORTED);
455            return;
456        }
457    }
458    else {
459        handle->getTsmfSettings(handle->pDeviceHandle, pSettings);
460        return;
461    }
462}
463
464NEXUS_Error NEXUS_Frontend_SetTsmfSettings(
465    NEXUS_FrontendHandle handle,
466    const NEXUS_TsmfSettings *pSettings
467    )
468{
469    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
470
471    if (NULL == handle->setTsmfSettings) {
472        if (handle->pParentFrontend) {
473            return NEXUS_Frontend_SetTsmfSettings(handle->pParentFrontend, pSettings);
474        }
475        else {
476            return BERR_TRACE(BERR_NOT_SUPPORTED);
477        }
478    }
479    else {
480        return handle->setTsmfSettings(handle->pDeviceHandle, pSettings);
481    }
482}
483
484void NEXUS_Frontend_GetTransportSettings(
485    NEXUS_FrontendHandle handle,
486    NEXUS_FrontendTransportSettings *pSettings /* [out] */
487    )
488{
489    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
490
491    if (NULL == handle->getTransportSettings) {
492        if (handle->pParentFrontend) {
493            NEXUS_Frontend_GetTransportSettings(handle->pParentFrontend, pSettings);
494            return;
495        }
496        else {
497            BERR_TRACE(BERR_NOT_SUPPORTED);
498            return;
499        }
500    }
501    else {
502        handle->getTransportSettings(handle->pDeviceHandle, pSettings);
503        return;
504    }
505}
506
507NEXUS_Error NEXUS_Frontend_SetTransportSettings(
508    NEXUS_FrontendHandle handle,
509    const NEXUS_FrontendTransportSettings *pSettings
510    )
511{
512    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
513   
514    if (NULL == handle->setTransportSettings) {
515        if (handle->pParentFrontend) {
516            return NEXUS_Frontend_SetTransportSettings(handle->pParentFrontend, pSettings);
517        }
518        else {
519            return BERR_TRACE(BERR_NOT_SUPPORTED);
520        }
521    }
522    else {
523        return handle->setTransportSettings(handle->pDeviceHandle, pSettings);
524    }
525}
526
527void NEXUS_Frontend_P_SetPower(NEXUS_FrontendHandle handle, NEXUS_PowerManagementCore core, bool poweredUp)
528{
529    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
530
531    /* the nexus power management code requires strict reference counting. the frontend tune/untune api
532    does not require strict balancing. this code provides that balancing. */
533    if (core == NEXUS_PowerManagementCore_eDigitalFrontend) {
534        if (handle->power.digital != poweredUp) {
535            NEXUS_PowerManagement_SetCoreState(core, poweredUp);
536            handle->power.digital = poweredUp;
537        }
538    }
539    else if (core == NEXUS_PowerManagementCore_eAnalogFrontend) {
540        if (handle->power.analog != poweredUp) {
541            NEXUS_PowerManagement_SetCoreState(core, poweredUp);
542            handle->power.analog = poweredUp;
543        }
544    }
545}
546
547void NEXUS_Frontend_P_GetDefaultExtensionSettings(
548    NEXUS_FrontendExtensionSettings *pSettings          /* [out] */
549    )
550{
551    BDBG_ASSERT(NULL != pSettings);
552    BKNI_Memset(pSettings, 0, sizeof(*pSettings));
553}
554
555NEXUS_FrontendHandle NEXUS_Frontend_P_CreateExtension(
556    const NEXUS_FrontendExtensionSettings *pSettings    /* Functions to override.  The close function is required, all other functions are optional.
557                                                           If you do not want to extend a function, leave it in the default state and the parent's
558                                                           handler will be called instead. */
559    )
560{
561    NEXUS_Frontend *pFrontend;
562
563    BDBG_ASSERT(NULL != pSettings);
564    BDBG_ASSERT(NULL != pSettings->close);
565    BDBG_ASSERT(NULL != pSettings->parent);
566    NEXUS_ASSERT_MODULE();
567
568    pFrontend = NEXUS_Frontend_P_Create(pSettings->pDeviceHandle);
569    if ( NULL == pFrontend )
570    {
571        (void)BERR_TRACE(BERR_OUT_OF_SYSTEM_MEMORY);
572        return NULL;
573    }
574
575    if (pSettings->parent->registerExtension) {
576        (*pSettings->parent->registerExtension)(pSettings->parent, pFrontend);
577    }
578
579    pFrontend->capabilities = pSettings->parent->capabilities;
580    pFrontend->userParameters = pSettings->parent->userParameters;
581    pFrontend->pParentFrontend = pSettings->parent;
582    pFrontend->close = pSettings->close;
583    pFrontend->tuneAnalog = pSettings->tuneAnalog;
584    pFrontend->tuneOutOfBand = pSettings->tuneOutOfBand;
585    pFrontend->tuneQam = pSettings->tuneQam;
586    pFrontend->tuneUpstream = pSettings->tuneUpstream;
587    pFrontend->tuneVsb = pSettings->tuneVsb;
588    pFrontend->tuneSatellite = pSettings->tuneSatellite;
589    pFrontend->getDiseqcSettings = pSettings->getDiseqcSettings;
590    pFrontend->setDiseqcSettings = pSettings->setDiseqcSettings;
591    pFrontend->sendDiseqcMessage = pSettings->sendDiseqcMessage;
592    pFrontend->getDiseqcReply = pSettings->getDiseqcReply;
593    pFrontend->sendDiseqcAcw = pSettings->sendDiseqcAcw;
594    pFrontend->resetDiseqc = pSettings->resetDiseqc;
595    pFrontend->tuneOfdm = pSettings->tuneOfdm;
596    pFrontend->untune = pSettings->untune;
597
598    pSettings->parent->numExtensions++;
599
600    return pFrontend;
601}
602
603void NEXUS_Frontend_P_DestroyExtension(
604    NEXUS_FrontendHandle handle
605    )
606{
607    NEXUS_ASSERT_MODULE();
608    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
609    BDBG_ASSERT(NULL != handle->pParentFrontend);
610    BDBG_ASSERT(handle->pParentFrontend->numExtensions > 0);
611    handle->pParentFrontend->numExtensions--;
612
613    if (handle->pParentFrontend->registerExtension) {
614        (*handle->pParentFrontend->registerExtension)(handle->pParentFrontend, NULL);
615    }
616
617    NEXUS_Frontend_P_Destroy(handle);
618}
619
620NEXUS_FrontendHandle NEXUS_Frontend_P_GetParentHandle(NEXUS_FrontendHandle handle)
621{
622    BDBG_OBJECT_ASSERT(handle, NEXUS_Frontend);
623    return handle->pParentFrontend;
624}
625
Note: See TracBrowser for help on using the repository browser.