История изменений
Исправление I-Love-Microsoft, (текущая версия) :
struct mypci_device
{
void __iomem *mmio;
struct pci_dev *pci;
struct cdev *char_device;
wait_queue_head_t wait;
dma_addr_t dma_device;
void *dma_driver;
int dma_finished;
int debug;
};
device->dma_driver = dma_alloc_coherent(&device->pci->dev, MYPCI_DMA_BLOCK, &device->dma_device, GFP_DMA);
if((!device->dma_driver) || (!device->dma_device))
{
ret = -ENOMEM;
dev_err(&device->pci->dev, "mypci: ERROR: dma alloc failed\n");
goto failed_dma_alloc;
}
dev_dbg(&device->pci->dev, "mypci: dma= %08lX\n", (unsigned long) device->dma_driver);
То что dma_device - высылаю в устройство, это адрес для устройства. В драйвере я читаю данные с того что dma_driver.
Таким образом, dw указывает на dma_driver. Мне кажется, это не копия, а то что представляет вторую сторону медали dma_device/dma_driver, возможно потенциально на разных платформах это может быть разные адреса для устройства и хоста, указывающие в одно по сути место.
Исправление I-Love-Microsoft, :
struct mypci_device
{
void __iomem *mmio;
struct pci_dev *pci;
struct cdev *char_device;
wait_queue_head_t wait;
dma_addr_t dma_device;
void *dma_driver;
int dma_finished;
int debug;
};
device->dma_driver = dma_alloc_coherent(&device->pci->dev, MYPCI_DMA_BLOCK, &device->dma_device, GFP_DMA);
if((!device->dma_driver) || (!device->dma_device))
{
ret = -ENOMEM;
dev_err(&device->pci->dev, "mypci: ERROR: dma alloc failed\n");
goto failed_dma_alloc;
}
dev_dbg(&device->pci->dev, "mypci: dma= %08lX\n", (unsigned long) device->dma_driver);
То что dma_device - высылаю в устройство, это адрес для устройства. В драйвере я читаю данные с того что dma_driver.
Таким образом, dw указывает на dma_driver.
Исходная версия I-Love-Microsoft, :
struct mypci_device
{
void __iomem *mmio;
struct pci_dev *pci;
struct cdev *char_device;
wait_queue_head_t wait;
dma_addr_t dma_device;
void *dma_driver;
int dma_finished;
int debug;
};
device->dma_driver = dma_alloc_coherent(&device->pci->dev, MYPCI_DMA_BLOCK, &device->dma_device, GFP_DMA);
if((!device->dma_driver) || (!device->dma_device))
{
ret = -ENOMEM;
dev_err(&device->pci->dev, "mypci: ERROR: dma alloc failed\n");
goto failed_dma_alloc;
}
dev_dbg(&device->pci->dev, "mypci: dma= %08lX\n", (unsigned long) device->dma_driver);
То что dma_device - высылаю в устройство, это адрес для устройства. В драйвере я читаю данные с того что dma_driver.