/*--------------------------------------------------------------------------- wpalPacketRXLowResourceCB – RX RAW packer CB function Param: pPacket – Available RX packet userData - PAL Client Context, DXE Return: Status ---------------------------------------------------------------------------*/ VOS_STATUS wpalPacketRXLowResourceCB(vos_pkt_t *pPacket, v_VOID_t *userData) { VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; void* pData = NULL; if (NULL == pPacket) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "Get new RX PAL packet fail"); return VOS_STATUS_E_FAILURE; } vosStatus = vos_pkt_reserve_head_fast( pPacket, &pData, VPKT_SIZE_BUFFER ); if(VOS_STATUS_SUCCESS != vosStatus) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "Prepare RX packet for DXE fail"); return VOS_STATUS_E_FAILURE; } if((NULL == wpalPacketAvailableCB) || (NULL == userData)) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "Invalid ARG for new RX packet"); return VOS_STATUS_E_FAILURE; } wpalPacketAvailableCB( (wpt_packet *)pPacket, userData ); return VOS_STATUS_SUCCESS; }
/*--------------------------------------------------------------------------- wpalPacketAlloc – Allocate a wpt_packet from PAL. Param: pktType – specify the type of wpt_packet to allocate nPktSize - packet size Return: A pointer to the wpt_packet. NULL means fail. ---------------------------------------------------------------------------*/ wpt_packet * wpalPacketAlloc(wpt_packet_type pktType, wpt_uint32 nPktSize, wpalPacketLowPacketCB rxLowCB, void *usrData) { VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; wpt_packet* pPkt = NULL; vos_pkt_t* pVosPkt = NULL; void* pData = NULL; v_U16_t allocLen; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ switch (pktType) { case eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT: vosStatus = vos_pkt_get_packet(&pVosPkt, VOS_PKT_TYPE_TX_802_11_MGMT, nPktSize, 1, VOS_FALSE, NULL, NULL /*no callback*/); break; case eWLAN_PAL_PKT_TYPE_RX_RAW: /* Set the wpalPacketAvailableCB before we try to get a VOS * packet from the 'free list' and reset it if vos_pkt_get_packet() * returns a valid packet. This order is required to avoid the * race condition: * 1. The below call to vos_pkt_get_packet() in RX_Thread determines * that no more packets are available in the 'free list' and sets * the low resource callbacks. * 2. in parallel vos_pkt_return_packet() is called in MC_Thread for a * Management frame before wpalPacketAlloc() gets a chance to set * wpalPacketAvailableCB and since the 'low resource callbacks' * are set the callback function - wpalPacketRXLowResourceCB is * executed,but since wpalPacketAvailableCB is still NULL the low * resource recovery fails. */ wpalPacketAvailableCB = rxLowCB; vosStatus = vos_pkt_get_packet(&pVosPkt, VOS_PKT_TYPE_RX_RAW, nPktSize, 1, VOS_FALSE, wpalPacketRXLowResourceCB, usrData); #ifndef FEATURE_R33D /* Reserve the entire raw rx buffer for DXE */ if( vosStatus == VOS_STATUS_SUCCESS ) { wpalPacketAvailableCB = NULL; vosStatus = vos_pkt_reserve_head_fast( pVosPkt, &pData, nPktSize ); } #endif /* FEATURE_R33D */ if((NULL != pVosPkt) && (VOS_STATUS_E_RESOURCES != vosStatus)) { vos_pkt_get_packet_length(pVosPkt, &allocLen); if (nPktSize != allocLen) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "RX packet alloc has problem, discard this frame, Len %d", allocLen); vos_pkt_return_packet(pVosPkt); return NULL; } } break; default: WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, " try to allocate unsupported packet type (%d)", pktType); break; } if(VOS_IS_STATUS_SUCCESS(vosStatus)) { pPkt = (wpt_packet *)pVosPkt; } return pPkt; }/*wpalPacketAlloc*/
wpt_packet * wpalPacketAlloc(wpt_packet_type pktType, wpt_uint32 nPktSize, wpalPacketLowPacketCB rxLowCB, void *usrData) { VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE; wpt_packet* pPkt = NULL; vos_pkt_t* pVosPkt = NULL; void* pData = NULL; v_U16_t allocLen; /* */ switch (pktType) { case eWLAN_PAL_PKT_TYPE_TX_802_11_MGMT: vosStatus = vos_pkt_get_packet(&pVosPkt, VOS_PKT_TYPE_TX_802_11_MGMT, nPktSize, 1, VOS_FALSE, NULL, NULL /* */); break; case eWLAN_PAL_PKT_TYPE_RX_RAW: /* */ wpalPacketAvailableCB = rxLowCB; vosStatus = vos_pkt_get_packet(&pVosPkt, VOS_PKT_TYPE_RX_RAW, nPktSize, 1, VOS_FALSE, wpalPacketRXLowResourceCB, usrData); #ifndef FEATURE_R33D /* */ if( vosStatus == VOS_STATUS_SUCCESS ) { wpalPacketAvailableCB = NULL; vosStatus = vos_pkt_reserve_head_fast( pVosPkt, &pData, nPktSize ); } #endif /* */ if((NULL != pVosPkt) && (VOS_STATUS_E_RESOURCES != vosStatus)) { vos_pkt_get_packet_length(pVosPkt, &allocLen); if (nPktSize != allocLen) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "RX packet alloc has problem, discard this frame, Len %d", allocLen); vos_pkt_return_packet(pVosPkt); return NULL; } } break; default: WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, " try to allocate unsupported packet type (%d)\n", pktType); break; } if(VOS_IS_STATUS_SUCCESS(vosStatus)) { pPkt = (wpt_packet *)pVosPkt; } return pPkt; }/* */