LINUX.ORG.RU

История изменений

Исправление 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.