• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-12-stable/sys/contrib/ncsw/Peripherals/FM/Port/

Lines Matching refs:p_FmPort

61     t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
63 ASSERT_COND(((event & (IM_EV_RX | IM_EV_BSY)) && FmIsMaster(p_FmPort->h_Fm)) ||
64 !FmIsMaster(p_FmPort->h_Fm));
67 FmPortImRx(p_FmPort);
68 if ((event & IM_EV_BSY) && p_FmPort->f_Exception)
69 p_FmPort->f_Exception(p_FmPort->h_App, e_FM_PORT_EXCEPTION_IM_BUSY);
73 static t_Error TxConf(t_FmPort *p_FmPort, e_TxConfType confType)
79 ASSERT_COND(p_FmPort);
83 return (WfqEntryIsQueueEmpty(p_FmPort->im.h_WfqEntry) ? E_OK : E_BUSY);
86 confBdId = savedStartBdId = p_FmPort->im.currBdId;
99 if (p_FmPort->im.f_TxConf)
102 p_FmPort->im.f_TxConf(p_FmPort->h_App,
105 p_FmPort->im.p_BdShadow[confBdId]);
107 p_FmPort->im.f_TxConf(p_FmPort->h_App,
110 p_FmPort->im.p_BdShadow[confBdId]);
115 confBdId = GetNextBdId(p_FmPort, confBdId);
124 t_Error FmPortImEnable(t_FmPort *p_FmPort)
126 uint32_t tmpReg = GET_UINT32(p_FmPort->im.p_FmPortImPram->mode);
127 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, (uint32_t)(tmpReg & ~IM_MODE_GRC_STP));
131 t_Error FmPortImDisable(t_FmPort *p_FmPort)
133 uint32_t tmpReg = GET_UINT32(p_FmPort->im.p_FmPortImPram->mode);
134 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, (uint32_t)(tmpReg | IM_MODE_GRC_STP));
138 t_Error FmPortImRx(t_FmPort *p_FmPort)
148 ASSERT_COND(p_FmPort);
150 flags = XX_LockIntrSpinlock(p_FmPort->h_Spinlock);
151 if (p_FmPort->lock)
153 XX_UnlockIntrSpinlock(p_FmPort->h_Spinlock, flags);
156 p_FmPort->lock = TRUE;
157 XX_UnlockIntrSpinlock(p_FmPort->h_Spinlock, flags);
159 bdStatus = BD_STATUS_AND_LENGTH(BD_GET(p_FmPort->im.currBdId));
163 if ((p_Data = p_FmPort->im.rxPool.f_GetBuf(p_FmPort->im.rxPool.h_BufferPool, &h_NewUserPriv)) == NULL)
165 p_FmPort->lock = FALSE;
169 if (p_FmPort->im.firstBdOfFrameId == IM_ILEGAL_BD_ID)
170 p_FmPort->im.firstBdOfFrameId = p_FmPort->im.currBdId;
172 p_CurData = BdBufferGet(p_FmPort->im.rxPool.f_PhysToVirt, BD_GET(p_FmPort->im.currBdId));
173 h_CurrUserPriv = p_FmPort->im.p_BdShadow[p_FmPort->im.currBdId];
175 ((bdStatus & BD_LENGTH_MASK) - p_FmPort->im.rxFrameAccumLength):
177 p_FmPort->im.rxFrameAccumLength += length;
181 buffPos = (uint8_t)((p_FmPort->im.currBdId == p_FmPort->im.firstBdOfFrameId) ?
187 p_FmPort->im.rxFrameAccumLength = 0;
188 p_FmPort->im.firstBdOfFrameId = IM_ILEGAL_BD_ID;
191 BdBufferSet(p_FmPort->im.rxPool.f_VirtToPhys, BD_GET(p_FmPort->im.currBdId), p_Data);
193 BD_STATUS_AND_LENGTH_SET(BD_GET(p_FmPort->im.currBdId), BD_R_E);
196 p_FmPort->im.p_BdShadow[p_FmPort->im.currBdId] = h_NewUserPriv;
198 p_FmPort->im.currBdId = GetNextBdId(p_FmPort, p_FmPort->im.currBdId);
199 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.offsetOut, (uint16_t)(p_FmPort->im.currBdId<<4));
205 if (p_FmPort->im.f_RxStore(p_FmPort->h_App,
213 else if (p_FmPort->im.rxPool.f_PutBuf(p_FmPort->im.rxPool.h_BufferPool,
217 p_FmPort->lock = FALSE;
221 bdStatus = BD_STATUS_AND_LENGTH(BD_GET(p_FmPort->im.currBdId));
223 p_FmPort->lock = FALSE;
227 void FmPortConfigIM (t_FmPort *p_FmPort, t_FmPortParams *p_FmPortParams)
229 ASSERT_COND(p_FmPort);
231 SANITY_CHECK_RETURN(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
233 p_FmPort->im.h_FmMuram = p_FmPortParams->specificParams.imRxTxParams.h_FmMuram;
234 p_FmPort->p_FmPortDriverParam->liodnOffset = p_FmPortParams->specificParams.imRxTxParams.liodnOffset;
235 p_FmPort->im.dataMemId = p_FmPortParams->specificParams.imRxTxParams.dataMemId;
236 p_FmPort->im.dataMemAttributes = p_FmPortParams->specificParams.imRxTxParams.dataMemAttributes;
238 p_FmPort->im.fwExtStructsMemId = DEFAULT_PORT_ImfwExtStructsMemId;
239 p_FmPort->im.fwExtStructsMemAttr = DEFAULT_PORT_ImfwExtStructsMemAttr;
241 if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
242 (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
244 p_FmPort->im.rxPool.h_BufferPool = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.h_BufferPool;
245 p_FmPort->im.rxPool.f_GetBuf = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.f_GetBuf;
246 p_FmPort->im.rxPool.f_PutBuf = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.f_PutBuf;
247 p_FmPort->im.rxPool.bufferSize = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.bufferSize;
248 p_FmPort->im.rxPool.f_PhysToVirt = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.f_PhysToVirt;
249 if (!p_FmPort->im.rxPool.f_PhysToVirt)
250 p_FmPort->im.rxPool.f_PhysToVirt = XX_PhysToVirt;
251 p_FmPort->im.rxPool.f_VirtToPhys = p_FmPortParams->specificParams.imRxTxParams.rxPoolParams.f_VirtToPhys;
252 if (!p_FmPort->im.rxPool.f_VirtToPhys)
253 p_FmPort->im.rxPool.f_VirtToPhys = XX_VirtToPhys;
254 p_FmPort->im.f_RxStore = p_FmPortParams->specificParams.imRxTxParams.f_RxStore;
256 p_FmPort->im.mrblr = 0x8000;
257 while (p_FmPort->im.mrblr)
259 if (p_FmPort->im.rxPool.bufferSize & p_FmPort->im.mrblr)
261 p_FmPort->im.mrblr >>= 1;
263 if (p_FmPort->im.mrblr != p_FmPort->im.rxPool.bufferSize)
264 DBG(WARNING, ("Max-Rx-Buffer-Length set to %d", p_FmPort->im.mrblr));
265 p_FmPort->im.bdRingSize = DEFAULT_PORT_rxBdRingLength;
266 p_FmPort->exceptions = DEFAULT_PORT_exception;
267 if (FmIsMaster(p_FmPort->h_Fm))
268 p_FmPort->polling = FALSE;
270 p_FmPort->polling = TRUE;
271 p_FmPort->fmanCtrlEventId = (uint8_t)NO_IRQ;
275 p_FmPort->im.f_TxConf = p_FmPortParams->specificParams.imRxTxParams.f_TxConf;
277 p_FmPort->im.bdRingSize = DEFAULT_PORT_txBdRingLength;
281 t_Error FmPortImCheckInitParameters(t_FmPort *p_FmPort)
283 if ((p_FmPort->portType != e_FM_PORT_TYPE_RX) &&
284 (p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) &&
285 (p_FmPort->portType != e_FM_PORT_TYPE_TX) &&
286 (p_FmPort->portType != e_FM_PORT_TYPE_TX_10G))
289 if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
290 (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
292 if (!POWER_OF_2(p_FmPort->im.mrblr))
294 if (p_FmPort->im.mrblr < 256)
296 if (p_FmPort->p_FmPortDriverParam->liodnOffset & ~FM_LIODN_OFFSET_MASK)
303 t_Error FmPortImInit(t_FmPort *p_FmPort)
315 ASSERT_COND(p_FmPort);
317 p_FmPort->im.p_FmPortImPram =
318 (t_FmPortImPram *)FM_MURAM_AllocMem(p_FmPort->im.h_FmMuram, sizeof(t_FmPortImPram), IM_PRAM_ALIGN);
319 if (!p_FmPort->im.p_FmPortImPram)
321 WRITE_BLOCK(p_FmPort->im.p_FmPortImPram, 0, sizeof(t_FmPortImPram));
323 if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
324 (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
326 p_FmPort->im.p_BdRing =
327 (t_FmImBd *)XX_MallocSmart((uint32_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize),
328 p_FmPort->im.fwExtStructsMemId,
330 if (!p_FmPort->im.p_BdRing)
332 IOMemSet32(p_FmPort->im.p_BdRing, 0, (uint32_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize));
334 p_FmPort->im.p_BdShadow = (t_Handle *)XX_Malloc((uint32_t)(sizeof(t_Handle)*p_FmPort->im.bdRingSize));
335 if (!p_FmPort->im.p_BdShadow)
337 memset(p_FmPort->im.p_BdShadow, 0, (uint32_t)(sizeof(t_Handle)*p_FmPort->im.bdRingSize));
340 for (i=0; i<p_FmPort->im.bdRingSize; i++)
345 if ((p_Data = p_FmPort->im.rxPool.f_GetBuf(p_FmPort->im.rxPool.h_BufferPool, &h_BufContext)) == NULL)
347 BdBufferSet(p_FmPort->im.rxPool.f_VirtToPhys, p_Bd, p_Data);
348 p_FmPort->im.p_BdShadow[i] = h_BufContext;
351 if ((p_FmPort->im.dataMemAttributes & MEMORY_ATTR_CACHEABLE) ||
352 (p_FmPort->im.fwExtStructsMemAttr & MEMORY_ATTR_CACHEABLE))
353 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, IM_MODE_GBL | IM_MODE_SET_BO(2));
355 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, IM_MODE_SET_BO(2));
357 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->rxQdPtr,
358 (uint32_t)((uint64_t)(XX_VirtToPhys(p_FmPort->im.p_FmPortImPram)) -
359 p_FmPort->fmMuramPhysBaseAddr + 0x20));
361 LOG2((uint64_t)p_FmPort->im.mrblr, log2Num);
362 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->mrblr, log2Num);
365 tmpPhysBase = (uint64_t)(XX_VirtToPhys(p_FmPort->im.p_BdRing));
366 SET_ADDR(&p_FmPort->im.p_FmPortImPram->rxQd.bdRingBase, tmpPhysBase);
367 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.bdRingSize, (uint16_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize));
370 WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->rxPortBmiRegs.fmbm_rfqid,
371 (uint32_t)((uint64_t)(XX_VirtToPhys(p_FmPort->im.p_FmPortImPram)) -
372 p_FmPort->fmMuramPhysBaseAddr));
373 if (!p_FmPort->polling || p_FmPort->exceptions)
376 err = FmAllocFmanCtrlEventReg(p_FmPort->h_Fm, &p_FmPort->fmanCtrlEventId);
380 ASSERT_COND(!(p_FmPort->fmanCtrlEventId & ~IM_RXQD_FPMEVT_SEL_MASK));
381 tmpReg16 = (uint16_t)(p_FmPort->fmanCtrlEventId & IM_RXQD_FPMEVT_SEL_MASK);
384 if (p_FmPort->exceptions & IM_EV_BSY)
389 if (!p_FmPort->polling)
394 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen, tmpReg16);
396 FmRegisterFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, ImException , (t_Handle)p_FmPort);
398 FmSetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, tmpReg32);
401 p_FmPort->fmanCtrlEventId = (uint8_t)NO_IRQ;
405 p_FmPort->im.p_BdRing = (t_FmImBd *)XX_MallocSmart((uint32_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize), p_FmPort->im.fwExtStructsMemId, 4);
406 if (!p_FmPort->im.p_BdRing)
408 IOMemSet32(p_FmPort->im.p_BdRing, 0, (uint32_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize));
410 p_FmPort->im.p_BdShadow = (t_Handle *)XX_Malloc((uint32_t)(sizeof(t_Handle)*p_FmPort->im.bdRingSize));
411 if (!p_FmPort->im.p_BdShadow)
413 memset(p_FmPort->im.p_BdShadow, 0, (uint32_t)(sizeof(t_Handle)*p_FmPort->im.bdRingSize));
414 p_FmPort->im.firstBdOfFrameId = IM_ILEGAL_BD_ID;
416 if ((p_FmPort->im.dataMemAttributes & MEMORY_ATTR_CACHEABLE) ||
417 (p_FmPort->im.fwExtStructsMemAttr & MEMORY_ATTR_CACHEABLE))
418 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, IM_MODE_GBL | IM_MODE_SET_BO(2));
420 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->mode, IM_MODE_SET_BO(2));
422 WRITE_UINT32(p_FmPort->im.p_FmPortImPram->txQdPtr,
423 (uint32_t)((uint64_t)(XX_VirtToPhys(p_FmPort->im.p_FmPortImPram)) -
424 p_FmPort->fmMuramPhysBaseAddr + 0x40));
427 tmpPhysBase = (uint64_t)(XX_VirtToPhys(p_FmPort->im.p_BdRing));
428 SET_ADDR(&p_FmPort->im.p_FmPortImPram->txQd.bdRingBase, tmpPhysBase);
429 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->txQd.bdRingSize, (uint16_t)(sizeof(t_FmImBd)*p_FmPort->im.bdRingSize));
432 WRITE_UINT32(p_FmPort->p_FmPortBmiRegs->txPortBmiRegs.fmbm_tcfqid,
433 (uint32_t)((uint64_t)(XX_VirtToPhys(p_FmPort->im.p_FmPortImPram)) -
434 p_FmPort->fmMuramPhysBaseAddr));
441 void FmPortImFree(t_FmPort *p_FmPort)
446 ASSERT_COND(p_FmPort);
447 ASSERT_COND(p_FmPort->im.p_FmPortImPram);
449 if ((p_FmPort->portType == e_FM_PORT_TYPE_RX) ||
450 (p_FmPort->portType == e_FM_PORT_TYPE_RX_10G))
452 if (!p_FmPort->polling || p_FmPort->exceptions)
455 FmSetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, 0);
457 FmFreeFmanCtrlEventReg(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId);
459 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen, 0);
461 FmUnregisterFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId);
464 FmPortImRx(p_FmPort);
467 bdStatus = BD_STATUS_AND_LENGTH(BD_GET(p_FmPort->im.currBdId));
471 p_CurData = BdBufferGet(p_FmPort->im.rxPool.f_PhysToVirt, BD_GET(p_FmPort->im.currBdId));
473 BdBufferSet(p_FmPort->im.rxPool.f_VirtToPhys, BD_GET(p_FmPort->im.currBdId), NULL);
474 BD_STATUS_AND_LENGTH_SET(BD_GET(p_FmPort->im.currBdId), 0);
476 p_FmPort->im.rxPool.f_PutBuf(p_FmPort->im.rxPool.h_BufferPool,
478 p_FmPort->im.p_BdShadow[p_FmPort->im.currBdId]);
480 p_FmPort->im.currBdId = GetNextBdId(p_FmPort, p_FmPort->im.currBdId);
481 bdStatus = BD_STATUS_AND_LENGTH(BD_GET(p_FmPort->im.currBdId));
485 TxConf(p_FmPort, e_TX_CONF_TYPE_FLUSH);
487 FM_MURAM_FreeMem(p_FmPort->im.h_FmMuram, p_FmPort->im.p_FmPortImPram);
489 if (p_FmPort->im.p_BdShadow)
490 XX_Free(p_FmPort->im.p_BdShadow);
492 if (p_FmPort->im.p_BdRing)
493 XX_FreeSmart(p_FmPort->im.p_BdRing);
499 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
501 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
502 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
503 SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
505 p_FmPort->im.mrblr = newVal;
512 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
514 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
515 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
516 SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
518 p_FmPort->im.bdRingSize = newVal;
525 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
527 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
528 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
529 SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
531 p_FmPort->im.bdRingSize = newVal;
540 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
542 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
543 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
544 SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
546 p_FmPort->im.fwExtStructsMemId = memId;
547 p_FmPort->im.fwExtStructsMemAttr = memAttributes;
554 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
556 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
557 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
558 SANITY_CHECK_RETURN_ERROR(p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
560 if ((p_FmPort->portType != e_FM_PORT_TYPE_RX_10G) && (p_FmPort->portType != e_FM_PORT_TYPE_RX))
563 if (!FmIsMaster(p_FmPort->h_Fm))
567 p_FmPort->polling = TRUE;
574 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
579 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
580 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
581 SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
587 p_FmPort->exceptions |= IM_EV_BSY;
588 if (p_FmPort->fmanCtrlEventId == (uint8_t)NO_IRQ)
591 err = FmAllocFmanCtrlEventReg(p_FmPort->h_Fm, &p_FmPort->fmanCtrlEventId);
594 ASSERT_COND(!(p_FmPort->fmanCtrlEventId & ~IM_RXQD_FPMEVT_SEL_MASK));
596 FmRegisterFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, ImException, (t_Handle)p_FmPort);
597 tmpReg16 = (uint16_t)((p_FmPort->fmanCtrlEventId & IM_RXQD_FPMEVT_SEL_MASK) | IM_RXQD_BSYINTM);
602 tmpReg16 = (uint16_t)(GET_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen) | IM_RXQD_BSYINTM);
603 tmpReg32 = FmGetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId) | IM_EV_BSY;
606 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen, tmpReg16);
607 FmSetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, tmpReg32);
611 p_FmPort->exceptions &= ~IM_EV_BSY;
612 if (!p_FmPort->exceptions && p_FmPort->polling)
614 FmFreeFmanCtrlEventReg(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId);
615 FmUnregisterFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId);
616 FmSetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, 0);
617 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen, 0);
618 p_FmPort->fmanCtrlEventId = (uint8_t)NO_IRQ;
622 tmpReg16 = (uint16_t)(GET_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen) & ~IM_RXQD_BSYINTM);
623 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->rxQd.gen, tmpReg16);
624 tmpReg32 = FmGetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId) & ~IM_EV_BSY;
625 FmSetFmanCtrlIntr(p_FmPort->h_Fm, p_FmPort->fmanCtrlEventId, tmpReg32);
641 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
646 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
647 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
648 SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
650 bdStatus = BD_STATUS_AND_LENGTH(BD_GET(p_FmPort->im.currBdId));
651 nextBdId = GetNextBdId(p_FmPort, p_FmPort->im.currBdId);
657 if ((bdStatus & BD_LENGTH_MASK) && (p_FmPort->im.f_TxConf))
658 p_FmPort->im.f_TxConf (p_FmPort->h_App,
659 BdBufferGet(XX_PhysToVirt, BD_GET(p_FmPort->im.currBdId)),
661 p_FmPort->im.p_BdShadow[p_FmPort->im.currBdId]);
666 if (p_FmPort->im.firstBdOfFrameId == IM_ILEGAL_BD_ID)
669 p_FmPort->im.txFirstBdStatus = (bdStatus | BD_R_E);
672 p_FmPort->im.firstBdOfFrameId = p_FmPort->im.currBdId;
677 BdBufferSet(XX_VirtToPhys, BD_GET(p_FmPort->im.currBdId), p_Data);
678 p_FmPort->im.p_BdShadow[p_FmPort->im.currBdId] = h_BufContext;
685 BD_STATUS_AND_LENGTH_SET(BD_GET(p_FmPort->im.currBdId), p_FmPort->im.txFirstBdStatus | BD_L);
689 BD_STATUS_AND_LENGTH_SET (BD_GET(p_FmPort->im.currBdId), (bdStatus | BD_R_E | BD_L));
691 BD_STATUS_AND_LENGTH_SET(BD_GET(p_FmPort->im.firstBdOfFrameId), p_FmPort->im.txFirstBdStatus);
692 p_FmPort->im.firstBdOfFrameId = IM_ILEGAL_BD_ID;
694 WRITE_UINT16(p_FmPort->im.p_FmPortImPram->txQd.offsetIn, (uint16_t)(GetNextBdId(p_FmPort, p_FmPort->im.currBdId)<<4));
697 BD_STATUS_AND_LENGTH_SET (BD_GET(p_FmPort->im.currBdId), bdStatus | BD_R_E);
699 p_FmPort->im.currBdId = GetNextBdId(p_FmPort, p_FmPort->im.currBdId);
704 if (p_FmPort->im.firstBdOfFrameId != IM_ILEGAL_BD_ID)
708 uint16_t cleanBdId = p_FmPort->im.firstBdOfFrameId;
710 ASSERT_COND(p_FmPort->im.firstBdOfFrameId != p_FmPort->im.currBdId);
720 cleanBdId = GetNextBdId(p_FmPort, cleanBdId);
721 } while (cleanBdId != p_FmPort->im.currBdId);
723 p_FmPort->im.currBdId = cleanBdId;
724 p_FmPort->im.firstBdOfFrameId = IM_ILEGAL_BD_ID;
735 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
737 SANITY_CHECK_RETURN(p_FmPort, E_INVALID_HANDLE);
738 SANITY_CHECK_RETURN(p_FmPort->imEn, E_INVALID_STATE);
739 SANITY_CHECK_RETURN(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
741 TxConf(p_FmPort, e_TX_CONF_TYPE_CALLBACK);
746 t_FmPort *p_FmPort = (t_FmPort*)h_FmPort;
748 SANITY_CHECK_RETURN_ERROR(p_FmPort, E_INVALID_HANDLE);
749 SANITY_CHECK_RETURN_ERROR(p_FmPort->imEn, E_INVALID_STATE);
750 SANITY_CHECK_RETURN_ERROR(!p_FmPort->p_FmPortDriverParam, E_INVALID_HANDLE);
752 return FmPortImRx(p_FmPort);