VOID MPReturnPacket( IN NDIS_HANDLE MiniportAdapterContext, IN PNDIS_PACKET Packet) { if (Packet) { PVOID data = NULL; PNDIS_BUFFER ndis_buffer = NULL; data = *(PVOID*)Packet->MiniportReserved; if (data) ExFreePoolWithTag(data, 'tkpi'); while(1) { NdisUnchainBufferAtBack(Packet, &ndis_buffer); if (ndis_buffer) NdisFreeBuffer(ndis_buffer); else break; } NdisFreePacket(Packet); } }
/*----------------------------------------------------------------------------*/ VOID kalPacketFree(IN P_GLUE_INFO_T prGlueInfo, IN PVOID pvPacket) { PNDIS_PACKET prNdisPacket; PNDIS_BUFFER prNdisBuf; ASSERT(prGlueInfo); ASSERT(pvPacket); prNdisPacket = (PNDIS_PACKET) pvPacket; do { NdisUnchainBufferAtBack(prNdisPacket, &prNdisBuf); if (prNdisBuf) { NdisFreeBuffer(prNdisBuf); } else { break; } } while (TRUE); /* Reinitialize the packet descriptor for reuse. */ NdisReinitializePacket(prNdisPacket); #if CETK_NDIS_PERFORMANCE_WORKAROUND { PUINT_32 ptr; ptr = (PUINT_32) prNdisPacket->ProtocolReserved; *ptr = 0; } #endif putPoolPacket(prGlueInfo, prNdisPacket, NULL); } /* kalPacketFree */
/*----------------------------------------------------------------------------*/ WLAN_STATUS kalRxIndicatePkts(IN P_GLUE_INFO_T prGlueInfo, IN PVOID apvPkts[], IN UINT_32 ucPktNum) { NDIS_STATUS arStatus[CFG_RX_MAX_PKT_NUM]; UINT_32 u4Idx; for (u4Idx = 0; u4Idx < ucPktNum; u4Idx++) { UINT_32 i, pivot; PVOID pvTmp; if (NDIS_GET_PACKET_STATUS((PNDIS_PACKET) apvPkts[u4Idx]) == NDIS_STATUS_RESOURCES) { pivot = u4Idx; for (i = u4Idx + 1; i < ucPktNum; i++) { if (NDIS_GET_PACKET_STATUS((PNDIS_PACKET) apvPkts[i]) != NDIS_STATUS_RESOURCES) { pvTmp = apvPkts[pivot]; apvPkts[pivot] = apvPkts[i]; apvPkts[i] = pvTmp; pivot++; } } break; } } for (u4Idx = 0; u4Idx < ucPktNum; u4Idx++) { arStatus[u4Idx] = NDIS_GET_PACKET_STATUS((PNDIS_PACKET) apvPkts[u4Idx]); if (arStatus[u4Idx] == NDIS_STATUS_SUCCESS) { /* 4 Increase the Pending Count before calling NdisMIndicateReceivePacket(). */ InterlockedIncrement(&prGlueInfo->i4RxPendingFrameNum); } } NdisMIndicateReceivePacket(prGlueInfo->rMiniportAdapterHandle, (PPNDIS_PACKET) apvPkts, (UINT) ucPktNum); for (u4Idx = 0; u4Idx < ucPktNum; u4Idx++) { /* 4 <1> Packets be retained. */ if (arStatus[u4Idx] != NDIS_STATUS_SUCCESS) { PNDIS_PACKET prNdisPacket = (PNDIS_PACKET) apvPkts[u4Idx]; PNDIS_BUFFER prNdisBuf = (PNDIS_BUFFER) NULL; ASSERT(prNdisPacket); NdisUnchainBufferAtBack(prNdisPacket, &prNdisBuf); if (prNdisBuf) { NdisFreeBuffer(prNdisBuf); } #if DBG else { ASSERT(0); } #endif /* DBG */ /* Reinitialize the packet descriptor for reuse. */ NdisReinitializePacket(prNdisPacket); #if CETK_NDIS_PERFORMANCE_WORKAROUND { PUINT_32 pu4Dummy; pu4Dummy = (PUINT_32) prNdisPacket->ProtocolReserved; *pu4Dummy = 0; } #endif /* CETK_NDIS_PERFORMANCE_WORKAROUND */ } } return WLAN_STATUS_SUCCESS; } /* kalIndicatePackets */