source: svn/newcon3bcm2_21bu/nexus/modules/transport/7552/src/nexus_packetsub.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 21.6 KB
Line 
1/***************************************************************************
2 *     (c)2003-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_packetsub.c $
39 * $brcm_Revision: 18 $
40 * $brcm_Date: 12/16/11 1:14p $
41 *
42 * Porting interface code for the packet substitution section of the
43 * data transport core.
44 *
45 * Revision History:
46 *
47 * $brcm_Log: /nexus/modules/transport/7400/src/nexus_packetsub.c $
48 *
49 * 18   12/16/11 1:14p erickson
50 * SW7405-5325: fix 40nm packetsub
51 *
52 * 17   12/16/11 11:43a erickson
53 * SW7405-5325: rework packetsub to use array of descriptors, allow for
54 *  skip in the fifo, add dataCallback
55 *
56 * 16   12/15/11 11:29a gmullen
57 * SW7425-1589: Merged to main
58 *
59 * SW7425-1589/1   12/12/11 4:35p gmullen
60 * SW7425-1589: Added BXPT_PacketSub_GetEobIntId()
61 *
62 * 15   12/9/11 5:52p erickson
63 * SW7405-5325: remove BCHP_CHIP list
64 *
65 * 14   10/31/11 7:48p bandrews
66 * SW7231-391: merge to main
67 *
68 * SW7420-2078/1   10/25/11 5:22p bandrews
69 * SW7231-391: update parser band and timebase implementations to use
70 *  handles everywhere, even for legacy enum usage
71 *
72 * 13   7/8/11 10:59a jtna
73 * SW7405-5382: revert back to no playback support. the PSUB HW does not
74 *  support it.
75 *
76 * 12   7/7/11 4:24p jtna
77 * SW7405-5382: initial playback packetsub work
78 *
79 * 11   5/16/11 9:36a erickson
80 * SW7405-5323: add NEXUS_PacketSubStatus.busy
81 *
82 * 10   5/13/11 1:11p erickson
83 * SW7405-5322: add NEXUS_FlushCache
84 *
85 * 9   5/13/11 12:18p erickson
86 * SW7420-1873: remove shutdown attribute
87 *
88 * 8   1/25/11 3:38p rjlewis
89 * SW7420-879: use default provided by PI for output rate.
90 *
91 * 6   1/17/11 9:31a erickson
92 * SW7425-68: add NEXUS_TransportModuleSettings.mainHeapIndex
93 *
94 * 5   9/16/10 5:23p jgarrett
95 * SW7125-621: Adding stub for NEXUS_PacketSub_GetStatus
96 *
97 * 4   9/15/10 4:24p erickson
98 * SW7125-621: add NEXUS_PacketSub_GetStatus
99 *
100 * 3   8/10/10 3:41p erickson
101 * SW7420-934: rename NEXUS_PacketSub_ReadComplete to
102 *  NEXUS_PacketSub_WriteComplete
103 *
104 * 2   11/19/09 4:25p gmohile
105 * SW7408-1 : Add 7408 support
106 *
107 * 1   5/26/09 11:39a erickson
108 * PR55105: add packet sub api
109 *
110 ***************************************************************************/
111#include "nexus_transport_module.h"
112
113BDBG_MODULE(nexus_packetsub);
114
115#define BDBG_MSG_TRACE(X) /* BDBG_MSG(X) */
116
117#if BXPT_HAS_PACKETSUB
118
119#include "bxpt_packetsub.h"
120#include "bchp_int_id_xpt_bus_if.h"
121
122BDBG_OBJECT_ID(NEXUS_PacketSub);
123
124struct NEXUS_PacketSub
125{
126    BDBG_OBJECT(NEXUS_PacketSub)
127    NEXUS_PacketSubOpenSettings openSettings;
128    NEXUS_PacketSubSettings settings;
129    BXPT_PacketSub_Handle xptPacketSub;
130    bool started;
131    uint8_t *buffer; /* cached ptr */
132    uint8_t *uncachedBuffer; /* uncached ptr for buffer */
133    unsigned offsetBuffer; /* offset for buffer */
134    unsigned wptr, rptr, size; /* fifo of buffer space */
135
136    struct {
137        BXPT_PacketSub_Descriptor *ptr; /* pointer to array of descriptors */
138        unsigned wptr, rptr, size; /* fifo of descriptors */
139    } desc;
140
141    BMEM_Heap_Handle mem;
142    unsigned lastGetBufferSize;
143    NEXUS_IsrCallbackHandle finished, dataCallback;
144    BINT_CallbackHandle psubInt;
145};
146
147static void
148NEXUS_PacketSub_isr(void *context, int param)
149{
150    NEXUS_PacketSubHandle packetSub = context;
151    BXPT_PacketSub_Descriptor *pDesc;
152    BXPT_PacketSub_ChannelStatus status;
153
154    BSTD_UNUSED(param);
155
156    /* TODO: need isr functions */
157    (void)BXPT_PacketSub_GetChannelStatus(packetSub->xptPacketSub, &status);
158    (void)BXPT_PacketSub_GetCurrentDescriptorAddress(packetSub->xptPacketSub, &pDesc);
159    BDBG_MSG_TRACE(("%p: isr cur desc %p, busy=%d finished=%d", packetSub, pDesc, status.Busy, status.Finished));
160
161#if 0
162    /* fifo should not be empty when we get an interrupt */
163    BDBG_ASSERT(packetSub->desc.rptr != packetSub->desc.wptr);
164#else
165    /* TODO: why does this happen? */
166    if (packetSub->desc.rptr == packetSub->desc.wptr) {
167        return;
168    }
169#endif
170
171    /* if not finished, then back up one desc to find what's been completed so far */
172    if (!status.Finished) {
173        if (pDesc == &packetSub->desc.ptr[packetSub->desc.rptr]) {
174            /* none completed */
175            return;
176        }
177        if (pDesc == packetSub->desc.ptr) {
178            pDesc = &packetSub->desc.ptr[packetSub->desc.size-1];
179        }
180        else {
181            pDesc--;
182        }
183    }
184
185    /* update buffer and desc rptrs */
186    packetSub->desc.rptr = (pDesc - packetSub->desc.ptr) + 1;
187    if (packetSub->desc.rptr == packetSub->desc.size) {
188        packetSub->desc.rptr = 0;
189    }
190   
191    BDBG_ASSERT(pDesc->BufferStartAddr >= packetSub->offsetBuffer && pDesc->BufferStartAddr < packetSub->offsetBuffer + packetSub->size);
192    packetSub->rptr = (pDesc->BufferStartAddr - packetSub->offsetBuffer) + pDesc->BufferLength;
193    BDBG_ASSERT(packetSub->rptr <= packetSub->size);
194    if (packetSub->rptr == packetSub->size) {
195        packetSub->rptr = 0;
196    }
197    BDBG_MSG(("isr(%p) fifo=%d,%d; desc=%d,%d", packetSub, packetSub->rptr, packetSub->wptr, packetSub->desc.rptr, packetSub->desc.wptr));
198
199    NEXUS_IsrCallback_Fire_isr(packetSub->dataCallback);
200    if (packetSub->rptr == packetSub->wptr) {
201        BDBG_ASSERT(packetSub->desc.rptr == packetSub->desc.wptr);
202        NEXUS_IsrCallback_Fire_isr(packetSub->finished);
203    }
204}
205
206void NEXUS_PacketSub_GetDefaultOpenSettings( NEXUS_PacketSubOpenSettings *pOpenSettings )
207{
208    BKNI_Memset(pOpenSettings, 0, sizeof(*pOpenSettings));
209    pOpenSettings->fifoSize = 32 * 1024;
210    pOpenSettings->numDescriptors = 4; /* default to a small number */
211}
212
213NEXUS_PacketSubHandle NEXUS_PacketSub_Open( unsigned index, const NEXUS_PacketSubOpenSettings *pOpenSettings )
214{
215    NEXUS_PacketSubHandle packetSub;
216    BERR_Code rc;
217    BXPT_PacketSub_ChannelSettings channelSettings;
218    void *temp;
219    unsigned int_id;
220    NEXUS_PacketSubOpenSettings defaultOpenSettings;
221
222    if (!pOpenSettings) {
223        NEXUS_PacketSub_GetDefaultOpenSettings(&defaultOpenSettings);
224        pOpenSettings = &defaultOpenSettings;
225    }
226   
227    BDBG_CASSERT(NEXUS_NUM_PACKET_SUB <= BXPT_NUM_PACKETSUBS);
228    if (index >= NEXUS_NUM_PACKET_SUB) {
229        BERR_TRACE(NEXUS_INVALID_PARAMETER);
230        return NULL;
231    }
232    if (pOpenSettings->fifoSize < 4) {
233        BERR_TRACE(NEXUS_INVALID_PARAMETER);
234        return NULL;
235    }
236    if (pOpenSettings->numDescriptors == 0) {
237        BERR_TRACE(NEXUS_INVALID_PARAMETER);
238        return NULL;
239    }
240
241    packetSub = BKNI_Malloc(sizeof(*packetSub));
242    if (!packetSub) {
243        BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
244        return NULL;
245    }
246    BKNI_Memset(packetSub, 0, sizeof(*packetSub));
247    BDBG_OBJECT_SET(packetSub, NEXUS_PacketSub);
248
249    packetSub->finished = NEXUS_IsrCallback_Create(packetSub, NULL);
250    if (!packetSub->finished) {
251        BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
252        goto error;
253    }
254    packetSub->dataCallback = NEXUS_IsrCallback_Create(packetSub, NULL);
255    if (!packetSub->dataCallback) {
256        BERR_TRACE(NEXUS_OUT_OF_SYSTEM_MEMORY);
257        goto error;
258    }
259
260    rc = BXPT_PacketSub_GetChannelDefaultSettings(pTransport->xpt, index, &channelSettings);
261    if (rc) {rc = BERR_TRACE(rc); goto error;}
262
263    /* set default settings to match HW/PI default */
264    packetSub->settings.outputRate = channelSettings.OutputRate;
265
266    rc = BXPT_PacketSub_OpenChannel(pTransport->xpt, &packetSub->xptPacketSub, index, &channelSettings);
267    if (rc) {rc = BERR_TRACE(rc); goto error;}
268
269    rc = BXPT_PacketSub_GetEobIntId( packetSub->xptPacketSub, &int_id );
270    if (rc) {rc = BERR_TRACE(rc); goto error;}
271
272    packetSub->mem = pOpenSettings->heap ? NEXUS_Heap_GetMemHandle(pOpenSettings->heap) : g_pCoreHandles->heap[pTransport->settings.mainHeapIndex];
273
274    /* alloc fifo */
275    packetSub->size = pOpenSettings->fifoSize;
276    packetSub->uncachedBuffer = BMEM_AllocAligned(packetSub->mem, packetSub->size, 2 /* 4 byte aligned */, 0);
277    if (!packetSub->uncachedBuffer) {
278        rc = BERR_TRACE(NEXUS_OUT_OF_DEVICE_MEMORY);
279        goto error;
280    }
281    rc = BMEM_Heap_ConvertAddressToCached(packetSub->mem, packetSub->uncachedBuffer, &temp);
282    if (rc) {rc = BERR_TRACE(rc); goto error;}
283    rc = BMEM_Heap_ConvertAddressToOffset(packetSub->mem, packetSub->uncachedBuffer, &packetSub->offsetBuffer);
284    if (rc) {rc = BERR_TRACE(rc); goto error;}
285    packetSub->buffer = temp;
286
287    /* alloc descriptors */
288    packetSub->desc.size = pOpenSettings->numDescriptors + 1; /* alloc one extra for simple fifo logic */
289    packetSub->desc.ptr = BMEM_AllocAligned(packetSub->mem, packetSub->desc.size * sizeof(BXPT_PacketSub_Descriptor), 4 /* 16 byte aligned */, 0);
290    if (!packetSub->desc.ptr) {
291        rc = BERR_TRACE(NEXUS_OUT_OF_DEVICE_MEMORY);
292        goto error;
293    }
294    BDBG_MSG_TRACE(("%p: desc fifo %#x, size %#x * %d", packetSub, packetSub->desc.ptr, sizeof(BXPT_PacketSub_Descriptor), packetSub->desc.size));
295
296    packetSub->openSettings = *pOpenSettings;
297
298    rc = BINT_CreateCallback(&packetSub->psubInt, g_pCoreHandles->bint, int_id, NEXUS_PacketSub_isr, packetSub, 0);
299    if (rc) {rc = BERR_TRACE(rc); goto error;}
300    rc = BINT_EnableCallback(packetSub->psubInt);
301    if (rc) {rc = BERR_TRACE(rc); goto error;}
302
303    return packetSub;
304
305error:
306    NEXUS_PacketSub_Close(packetSub);
307    return NULL;
308}
309
310void NEXUS_PacketSub_Close( NEXUS_PacketSubHandle packetSub )
311{
312    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
313
314    if (packetSub->started) {
315        NEXUS_PacketSub_Stop(packetSub);
316    }
317    if (packetSub->psubInt) {
318        BINT_DestroyCallback(packetSub->psubInt);
319    }
320    if (packetSub->xptPacketSub) {
321        BXPT_PacketSub_CloseChannel(packetSub->xptPacketSub);
322    }
323    if (packetSub->desc.ptr) {
324        BMEM_Heap_Free(packetSub->mem, packetSub->desc.ptr);
325    }
326    if (packetSub->uncachedBuffer) {
327        BMEM_Heap_Free(packetSub->mem, packetSub->uncachedBuffer);
328    }
329    if (packetSub->finished) {
330        NEXUS_IsrCallback_Destroy(packetSub->finished);
331    }
332    if (packetSub->dataCallback) {
333        NEXUS_IsrCallback_Destroy(packetSub->dataCallback);
334    }
335
336    BDBG_OBJECT_DESTROY(packetSub, NEXUS_PacketSub);
337    BKNI_Free(packetSub);
338}
339
340NEXUS_Error NEXUS_PacketSub_Start( NEXUS_PacketSubHandle packetSub )
341{
342    BERR_Code rc;
343    NEXUS_PidChannelHandle pidChannel;
344
345    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
346
347    if (packetSub->started) {
348        return BERR_TRACE(NEXUS_UNKNOWN);
349    }
350    pidChannel = packetSub->settings.pidChannel;
351    if (!pidChannel) {
352        return BERR_TRACE(NEXUS_INVALID_PARAMETER);
353    }
354
355    if (pidChannel->status.playback) {
356        /* PSUB HW does not support playback */
357        return BERR_TRACE(NEXUS_INVALID_PARAMETER);
358    }
359
360    rc = BXPT_PacketSub_SetPidChanNum(packetSub->xptPacketSub, pidChannel->status.pidChannelIndex, pidChannel->parserBand->hwIndex);
361    if (rc) return BERR_TRACE(rc);
362
363    rc = BXPT_PacketSub_StartChannel(packetSub->xptPacketSub);
364    if (rc) return BERR_TRACE(rc);
365
366    packetSub->started = true;
367
368    return 0;
369}
370
371void NEXUS_PacketSub_Stop( NEXUS_PacketSubHandle packetSub )
372{
373    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
374
375    if (packetSub->started) {
376        (void)BXPT_PacketSub_StopChannel(packetSub->xptPacketSub);
377        packetSub->started = false;
378    }
379}
380
381NEXUS_Error NEXUS_PacketSub_SetSettings( NEXUS_PacketSubHandle packetSub, const NEXUS_PacketSubSettings *pSettings )
382{
383    BERR_Code rc;
384
385    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
386
387    NEXUS_IsrCallback_Set(packetSub->finished, &pSettings->finished);
388    NEXUS_IsrCallback_Set(packetSub->dataCallback, &pSettings->dataCallback);
389
390    if (packetSub->started) {
391        /* some settings can't be changed after start */
392        if (pSettings->pidChannel != packetSub->settings.pidChannel) {
393            return BERR_TRACE(NEXUS_INVALID_PARAMETER);
394        }
395        if (pSettings->loop != packetSub->settings.loop) {
396            return BERR_TRACE(NEXUS_INVALID_PARAMETER);
397        }
398    }
399
400    rc = BXPT_PacketSub_SetForcedOutput(packetSub->xptPacketSub, pSettings->forcedOutput);
401    if (rc) return BERR_TRACE(rc);
402
403    rc = BXPT_PacketSub_SetFullRateOutput(packetSub->xptPacketSub, pSettings->fullRateOutput);
404    if (rc) return BERR_TRACE(rc);
405
406    rc = BXPT_PacketSub_SetOutputRate(packetSub->xptPacketSub, pSettings->outputRate);
407    if (rc) return BERR_TRACE(rc);
408
409    packetSub->settings = *pSettings;
410    return 0;
411}
412
413void NEXUS_PacketSub_GetSettings( NEXUS_PacketSubHandle packetSub, NEXUS_PacketSubSettings *pSettings )
414{
415    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
416    *pSettings = packetSub->settings;
417}
418
419NEXUS_Error NEXUS_PacketSub_SetPause( NEXUS_PacketSubHandle packetSub, bool paused )
420{
421    BERR_Code rc;
422
423    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
424
425    rc = BXPT_PacketSub_PauseChannel(packetSub->xptPacketSub, paused);
426    if (rc) return BERR_TRACE(rc);
427
428    return 0;
429}
430
431/* === data; --- available
432   |===W---R===|
433   |---R===W---|
434   |R======W---|
435*/
436/* continuous space available at wptr */
437#define BFIFO_WRITE_AVAILABLE(wptr, rptr, size, min) ((wptr)<(rptr)?(rptr)-(wptr)-(min):(rptr)?(size)-(wptr):(size)-(wptr)-(min))
438
439NEXUS_Error NEXUS_PacketSub_GetBuffer( NEXUS_PacketSubHandle packetSub, void **pBuffer, unsigned *pSize )
440{
441    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
442
443    /* there must be buffer space and a spare desciptor */
444    BKNI_EnterCriticalSection();
445    if (!BFIFO_WRITE_AVAILABLE(packetSub->desc.wptr, packetSub->desc.rptr, packetSub->desc.size, 1) ||
446        !BFIFO_WRITE_AVAILABLE(packetSub->wptr, packetSub->rptr, packetSub->size, 4)) {
447        *pBuffer = NULL;
448        *pSize = 0;
449    }
450    else {
451        *pBuffer = &packetSub->buffer[packetSub->wptr];
452        *pSize = BFIFO_WRITE_AVAILABLE(packetSub->wptr, packetSub->rptr, packetSub->size, 4);
453    }
454    BKNI_LeaveCriticalSection();
455    BDBG_MSG(("GetBuffer(%p) fifo=%d,%d; desc=%d,%d; size=%d", packetSub, packetSub->rptr, packetSub->wptr, packetSub->desc.rptr, packetSub->desc.wptr, *pSize));
456
457    packetSub->lastGetBufferSize = *pSize;
458
459    return 0;
460}
461
462NEXUS_Error NEXUS_PacketSub_WriteCompleteWithSkip( NEXUS_PacketSubHandle packetSub, unsigned skip, unsigned amount )
463{
464    NEXUS_Error rc;
465    BXPT_PacketSub_Descriptor *pDesc;
466
467    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
468
469    if (skip + amount > packetSub->lastGetBufferSize) {
470        return BERR_TRACE(NEXUS_INVALID_PARAMETER);
471    }
472   
473    if (skip) {
474        BKNI_EnterCriticalSection();
475        packetSub->wptr += skip;
476        if (packetSub->wptr == packetSub->size) {
477            packetSub->wptr = 0;
478        }
479        BKNI_LeaveCriticalSection();
480    }
481   
482    if (!amount) {
483        goto done;
484    }
485   
486    /* flush data in cached fifo before submitting to HW */
487    NEXUS_FlushCache(&packetSub->buffer[packetSub->wptr], amount);
488
489    /* prepare descriptor for this submisssion */
490    pDesc = &packetSub->desc.ptr[packetSub->desc.wptr];
491    rc = BXPT_PacketSub_CreateDesc(pTransport->xpt, pDesc, &packetSub->uncachedBuffer[packetSub->wptr], amount, true,
492        packetSub->settings.loop ? pDesc : NULL);
493    if (rc) return BERR_TRACE(rc);
494
495    BKNI_EnterCriticalSection();
496    if (++packetSub->desc.wptr == packetSub->desc.size) {
497        packetSub->desc.wptr = 0;
498    }
499    packetSub->wptr += amount;
500    if (packetSub->wptr == packetSub->size) {
501        packetSub->wptr = 0;
502    }
503    BKNI_LeaveCriticalSection();
504
505    /* must add to HW after incrementing wptr */
506    rc = BXPT_PacketSub_AddDescriptors(packetSub->xptPacketSub, pDesc, pDesc);
507    if (rc) return BERR_TRACE(rc);
508    BDBG_MSG_TRACE(("%p: submit desc %p", packetSub, pDesc));
509
510done:
511    BDBG_MSG(("WriteComplete(%p) fifo=%d,%d; desc=%d,%d; skip=%d, amount=%d", packetSub, packetSub->rptr, packetSub->wptr, packetSub->desc.rptr, packetSub->desc.wptr, skip, amount));
512
513    packetSub->lastGetBufferSize = 0;
514
515    return 0;
516}
517
518void NEXUS_PacketSub_Flush( NEXUS_PacketSubHandle packetSub )
519{
520    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
521
522    packetSub->wptr = 0;
523}
524
525NEXUS_Error NEXUS_PacketSub_GetStatus( NEXUS_PacketSubHandle packetSub, NEXUS_PacketSubStatus *pStatus )
526{
527    BXPT_PacketSub_ChannelStatus chStatus;
528    BERR_Code rc;
529
530    BDBG_OBJECT_ASSERT(packetSub, NEXUS_PacketSub);
531    BKNI_Memset(pStatus, 0, sizeof(*pStatus));
532    rc = BXPT_PacketSub_GetChannelStatus(packetSub->xptPacketSub, &chStatus);
533    if (rc) return BERR_TRACE(rc);
534    pStatus->finished = chStatus.Finished;
535    pStatus->busy = chStatus.Busy;
536
537    return 0;
538}
539
540#else /* BXPT_HAS_PACKETSUB */
541
542void NEXUS_PacketSub_GetDefaultOpenSettings( NEXUS_PacketSubOpenSettings *pOpenSettings )
543{
544    BSTD_UNUSED(pOpenSettings);
545    BDBG_WRN(("Packetsub not enabled on this chipset"));
546    BERR_TRACE(BERR_NOT_SUPPORTED);
547    return;
548}
549
550NEXUS_PacketSubHandle NEXUS_PacketSub_Open( unsigned index, const NEXUS_PacketSubOpenSettings *pOpenSettings )
551{
552    BSTD_UNUSED(index);
553    BSTD_UNUSED(pOpenSettings);
554    BDBG_WRN(("Packetsub not enabled on this chipset"));
555    BERR_TRACE(BERR_NOT_SUPPORTED);
556    return NULL;
557}
558
559void NEXUS_PacketSub_Close( NEXUS_PacketSubHandle packetSub )
560{
561    BSTD_UNUSED(packetSub);
562    BDBG_WRN(("Packetsub not enabled on this chipset"));
563    BERR_TRACE(BERR_NOT_SUPPORTED);
564    return;
565}
566
567NEXUS_Error NEXUS_PacketSub_Start( NEXUS_PacketSubHandle packetSub )
568{
569    BSTD_UNUSED(packetSub);
570    BDBG_WRN(("Packetsub not enabled on this chipset"));
571    BERR_TRACE(BERR_NOT_SUPPORTED);
572    return 0;
573}
574
575void NEXUS_PacketSub_Stop( NEXUS_PacketSubHandle packetSub )
576{
577    BSTD_UNUSED(packetSub);
578    BDBG_WRN(("Packetsub not enabled on this chipset"));
579    BERR_TRACE(BERR_NOT_SUPPORTED);
580    return;
581}
582
583NEXUS_Error NEXUS_PacketSub_SetSettings( NEXUS_PacketSubHandle packetSub, const NEXUS_PacketSubSettings *pSettings )
584{
585    BSTD_UNUSED(packetSub);
586    BSTD_UNUSED(pSettings);
587    BDBG_WRN(("Packetsub not enabled on this chipset"));
588    BERR_TRACE(BERR_NOT_SUPPORTED);
589    return 0;
590}
591
592void NEXUS_PacketSub_GetSettings( NEXUS_PacketSubHandle packetSub, NEXUS_PacketSubSettings *pSettings )
593{
594    BSTD_UNUSED(packetSub);
595    BSTD_UNUSED(pSettings);
596    BDBG_WRN(("Packetsub not enabled on this chipset"));
597    BERR_TRACE(BERR_NOT_SUPPORTED);
598    return;
599}
600
601NEXUS_Error NEXUS_PacketSub_SetPause( NEXUS_PacketSubHandle packetSub, bool paused )
602{
603    BSTD_UNUSED(packetSub);
604    BSTD_UNUSED(paused);
605    BDBG_WRN(("Packetsub not enabled on this chipset"));
606    BERR_TRACE(BERR_NOT_SUPPORTED);
607    return 0;
608}
609
610NEXUS_Error NEXUS_PacketSub_GetBuffer( NEXUS_PacketSubHandle packetSub, void **pBuffer, unsigned *pSize )
611{
612    BSTD_UNUSED(packetSub);
613    BSTD_UNUSED(pBuffer);
614    BSTD_UNUSED(pSize);
615    BDBG_WRN(("Packetsub not enabled on this chipset"));
616    BERR_TRACE(BERR_NOT_SUPPORTED);
617    return 0;
618}
619
620NEXUS_Error NEXUS_PacketSub_WriteCompleteWithSkip( NEXUS_PacketSubHandle packetSub, unsigned skip, unsigned amount )
621{
622    BSTD_UNUSED(packetSub);
623    BSTD_UNUSED(skip);
624    BSTD_UNUSED(amount);
625    BDBG_WRN(("Packetsub not enabled on this chipset"));
626    BERR_TRACE(BERR_NOT_SUPPORTED);
627    return 0;
628}
629
630void NEXUS_PacketSub_Flush( NEXUS_PacketSubHandle packetSub )
631{
632    BSTD_UNUSED(packetSub);
633    BDBG_WRN(("Packetsub not enabled on this chipset"));
634    BERR_TRACE(BERR_NOT_SUPPORTED);
635    return;
636}
637
638NEXUS_Error NEXUS_PacketSub_GetStatus( NEXUS_PacketSubHandle packetSub, NEXUS_PacketSubStatus *pStatus )
639{
640    BSTD_UNUSED(packetSub);
641    BSTD_UNUSED(pStatus);
642    BDBG_WRN(("Packetsub not enabled on this chipset"));
643    return BERR_TRACE(BERR_NOT_SUPPORTED);
644}
645#endif /* BXPT_HAS_PACKETSUB */
646
647NEXUS_Error NEXUS_PacketSub_WriteComplete( NEXUS_PacketSubHandle packetSub, unsigned amount )
648{
649    return NEXUS_PacketSub_WriteCompleteWithSkip(packetSub, 0, amount);
650}
Note: See TracBrowser for help on using the repository browser.