void ParaNdis_UnbindRxBufferFromPacket( pRxNetDescriptor p) { PMDL NextMdlLinkage = p->Holder; while(NextMdlLinkage != NULL) { PMDL pThisMDL = NextMdlLinkage; NextMdlLinkage = NDIS_MDL_LINKAGE(pThisMDL); NdisAdjustMdlLength(pThisMDL, PAGE_SIZE); NdisFreeMdl(pThisMDL); } }
void ParaNdis_UnbindRxBufferFromPacket( pRxNetDescriptor p) { PMDL NextMdlLinkage = p->Holder; ULONG ulPageDescIndex = PARANDIS_FIRST_RX_DATA_PAGE; while(NextMdlLinkage != NULL) { PMDL pThisMDL = NextMdlLinkage; NextMdlLinkage = NDIS_MDL_LINKAGE(pThisMDL); NdisAdjustMdlLength(pThisMDL, p->PhysicalPages[ulPageDescIndex].size); NdisFreeMdl(pThisMDL); ulPageDescIndex++; } }
static void ParaNdis_AdjustRxBufferHolderLength( pRxNetDescriptor p, ULONG ulDataOffset) { PMDL NextMdlLinkage = p->Holder; ULONG ulBytesLeft = p->PacketInfo.dataLength + ulDataOffset; while(NextMdlLinkage != NULL) { ULONG ulThisMdlBytes = min(PAGE_SIZE, ulBytesLeft); NdisAdjustMdlLength(NextMdlLinkage, ulThisMdlBytes); ulBytesLeft -= ulThisMdlBytes; NextMdlLinkage = NDIS_MDL_LINKAGE(NextMdlLinkage); } NETKVM_ASSERT(ulBytesLeft == 0); }
static void ParaNdis_AdjustRxBufferHolderLength( pRxNetDescriptor p, ULONG ulDataOffset) { PMDL NextMdlLinkage = p->Holder; ULONG ulBytesLeft = p->PacketInfo.dataLength + ulDataOffset; ULONG ulPageDescIndex = PARANDIS_FIRST_RX_DATA_PAGE; while(NextMdlLinkage != NULL) { ULONG ulThisMdlBytes = min(p->PhysicalPages[ulPageDescIndex].size, ulBytesLeft); NdisAdjustMdlLength(NextMdlLinkage, ulThisMdlBytes); ulBytesLeft -= ulThisMdlBytes; NextMdlLinkage = NDIS_MDL_LINKAGE(NextMdlLinkage); ulPageDescIndex++; } NETKVM_ASSERT(ulBytesLeft == 0); }
NDIS_STATUS shared_flush( IN shared_info_t *shared, IN uchar *va, IN ULONG pa, IN ULONG len, IN BOOLEAN writetodevice ) { #ifndef NDIS60 PNDIS_BUFFER b; NDIS_STATUS status; NDIS_PHYSICAL_ADDRESS npa; /* if receive, buffer must begin and end on a cacheline boundary */ if (!writetodevice) { ASSERT(ISALIGNED((uintptr)va, shared->cacheline)); len = ROUNDUP(len, shared->cacheline); } /* alloc a temp buffer descriptor */ NdisAllocateBuffer(&status, &b, shared->rxbufferpool, va, len); if (status != NDIS_STATUS_SUCCESS) { ND_ERROR(("%s%d: shared_flush: NdisAllocateBuffer error 0x%x\n", shared->id, shared->unit, status)); return status; } /* flush processor cache */ NdisAdjustBufferLength(b, len); NdisFlushBuffer(b, writetodevice); npa.HighPart = 0; npa.LowPart = pa; #ifndef USEWDK if (!writetodevice) NdisMUpdateSharedMemory(shared->adapterhandle, len, va, npa); #endif /* USEWDK */ /* free the temp buffer descriptor */ NdisFreeBuffer(b); #else /* NDIS60 */ PMDL b; /* if receive, buffer must begin and end on a cacheline boundary */ if (!writetodevice) { ASSERT(ISALIGNED((uintptr)va, shared->cacheline)); len = ROUNDUP(len, shared->cacheline); } /* alloc a temp MDL */ b = NdisAllocateMdl(shared->adapterhandle, va, len); if (b == NULL) { ND_ERROR(("%s%d: shared_flush: NdisAllocateMdl error\n", shared->id, shared->unit)); return NDIS_STATUS_FAILURE; } /* flush processor cache */ NdisAdjustMdlLength(b, len); NdisFlushBuffer(b, writetodevice); /* free the temp MDL */ NdisFreeMdl(b); #endif /* NDIS60 */ return NDIS_STATUS_SUCCESS; }