Line 77... |
Line 77... |
|
|
// при первом обращении действительно выделяем память,
|
// при первом обращении действительно выделяем память,
|
// а при повторных только отображаем выделенную память на пользовательское пространство
|
// а при повторных только отображаем выделенную память на пользовательское пространство
|
if(!dma->m_UseCount)
|
if(!dma->m_UseCount)
|
{
|
{
|
|
dma_addr_t pa = (dma_addr_t)0;
|
|
|
dma->m_MemType = bMemType;
|
dma->m_MemType = bMemType;
|
dma->m_BlockCount = *pCount;
|
dma->m_BlockCount = *pCount;
|
dma->m_BlockSize = size;
|
dma->m_BlockSize = size;
|
|
|
// выделяем память под описатели блоков (системный, и логический адрес для каждого блока)
|
// выделяем память под описатели блоков (системный, и логический адрес для каждого блока)
|
dma->m_pBufDscr.SystemAddress = (void*)dma_alloc_coherent( dma->m_dev,
|
dma->m_pBufDscr.SystemAddress = (void*)dma_alloc_coherent( dma->m_dev,
|
dma->m_BlockCount * sizeof(SHARED_MEMORY_DESCRIPTION),
|
dma->m_BlockCount * sizeof(SHARED_MEMORY_DESCRIPTION),
|
&dma->m_pBufDscr.LogicalAddress, GFP_KERNEL);
|
&pa, GFP_KERNEL);
|
if(!dma->m_pBufDscr.SystemAddress)
|
if(!dma->m_pBufDscr.SystemAddress)
|
{
|
{
|
printk("<0>%s(): Not memory for buffer descriptions\n", __FUNCTION__);
|
printk("<0>%s(): Not memory for buffer descriptions\n", __FUNCTION__);
|
return -ENOMEM;
|
return -ENOMEM;
|
}
|
}
|
|
|
|
dma->m_pBufDscr.LogicalAddress = (size_t)pa;
|
dma->m_ScatterGatherTableEntryCnt = 0;
|
dma->m_ScatterGatherTableEntryCnt = 0;
|
}
|
}
|
|
|
Status = RequestStub(dma, pStub);
|
Status = RequestStub(dma, pStub);
|
if(Status == 0)
|
if(Status == 0)
|