#endif
}
+/* The function zeroes 'struct scatterlist' and then fills it with values.
+ On error 'struct scatterlist' is returned zeroed */
void *alloc_dma_mem(
IN struct mthca_dev *dev,
IN unsigned long size,
void *va;
DMA_ADAPTER *p_dma = dev->ext->p_dma_adapter;
-
#ifndef USE_GET_SG_LIST
- PHYSICAL_ADDRESS pa;
+ PHYSICAL_ADDRESS pa = {0};
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
RtlZeroMemory(p_sg,sizeof *p_sg);
- p_sg->length = size;
+ if (!size)
+ return NULL;
+
va = p_dma->DmaOperations->AllocateCommonBuffer(
p_dma, size, &pa, FALSE );
- p_sg->dma_address = pa.QuadPart;
+ if (va) {
+ p_sg->length = size;
+ p_sg->dma_address = pa.QuadPart;
+ p_sg->page = va;
+ }
#else
int err;
PHYSICAL_ADDRESS la = {0}, ba = {0}, ha = {(u64)(-1I64)};
+ PMDL p_mdl;
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
RtlZeroMemory(p_sg,sizeof *p_sg);
- p_sg->length = size;
+ if (!size)
+ return NULL;
// allocate memory
va = MmAllocateContiguousMemorySpecifyCache(
}
// allocate MDL
- p_sg->p_mdl = IoAllocateMdl( va, size, FALSE, FALSE, NULL );
- if (!p_sg->p_mdl) {
+ p_mdl = IoAllocateMdl( va, size, FALSE, FALSE, NULL );
+ if (!p_mdl) {
HCA_PRINT(TRACE_LEVEL_ERROR ,HCA_DBG_LOW ,("MmAllocateContiguousMemorySpecifyCache failed on %#x size\n", size )));
goto err_mdl;
}
- MmBuildMdlForNonPagedPool( p_sg->p_mdl );
+ MmBuildMdlForNonPagedPool( p_mdl );
+
+ p_sg->p_mdl = p_mdl;
+ p_sg->length = size;
+ p_sg->page = va;
+
goto end;
err_mdl:
#endif
- p_sg->page = va;
return va;
}
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
- pa.QuadPart = p_sg->dma_address;
- p_dma->DmaOperations->FreeCommonBuffer(
- p_dma, p_sg->length, pa,
- p_sg->page, FALSE );
+ if (p_sg->length) {
+ pa.QuadPart = p_sg->dma_address;
+ p_dma->DmaOperations->FreeCommonBuffer(
+ p_dma, p_sg->length, pa,
+ p_sg->page, FALSE );
+ }
#else