LINUX.ORG.RU

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

Исправление I-Love-Microsoft, (текущая версия) :

tailgunner Извините, снова я беспокою :)

Теперь встал вопрос непосредственно с SG-DMA. Кажется я понял суть этого метода, в LDD3 это хорошо описано. В документации есть такие строки:

int i, count = dma_map_sg(dev, sglist, nents, direction);
struct scatterlist *sg;

for_each_sg(sglist, sg, count, i) {
    hw_address[i] = sg_dma_address(sg);
    hw_len[i] = sg_dma_len(sg);
}
Но возникает вопрос - а что это за sglist? В документации выше он абсолютно не описан, он берется из космоса? Я предположил что так надо:
    int n_sg = 10;
    struct scatterlist sg[10];
    n_sg = dma_map_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
    for(i = 0; i < n_sg; i++)
    {
	printk(KERN_INFO "mypci: SG %d -> %d @ %d\n", i, sg_dma_address(&sg[i]), sg_dma_len(&sg[i]));
    }
    dma_unmap_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
Однако на этой строке «n_sg = dma_map_sg(&dev, sg, n_sg, DMA_FROM_DEVICE)» всё валится.

Разобрался с прерываниями, генерировать MSI в корке оказалось очень просто, повесил обработчик - генерируется с нужной частотой. Правда каждое третье прерывание отлетает USB мышка и снова реконнектится - странно что есть влияние на не связанные устройства.

irqreturn_t mypci_isr(int irq, void *data)
{
    printk(KERN_INFO "mypci: interrupt!\n");
    return IRQ_HANDLED;
}
EXPORT_SYMBOL(mypci_isr);
...
    pci_set_master(dev);
    pci_enable_msi(dev);
    devm_request_irq(&dev->dev, dev->irq, mypci_isr, 0, "mypci", NULL);
Тут я правильно сделал? Обработчики ошибок убрал для читаемости, ошибок не возникает на этих строках в процессе работы.

Исходная версия I-Love-Microsoft, :

tailgunner Извините, снова я беспокою :)

Теперь встал вопрос непосредственно с SG-DMA. Кажется я понял суть этого метода, в LDD3 это хорошо описано. В документации есть такие строки:

int i, count = dma_map_sg(dev, sglist, nents, direction);
struct scatterlist *sg;

for_each_sg(sglist, sg, count, i) {
    hw_address[i] = sg_dma_address(sg);
    hw_len[i] = sg_dma_len(sg);
}
Но возникает вопрос - а что это за sglist? В документации выше он абсолютно не описан, он берется из космоса? Я предположил что так надо:
    int n_sg = 10;
    struct scatterlist sg[10];
    n_sg = dma_map_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);
    for(i = 0; i < n_sg; i++)
    {
	printk(KERN_INFO "mypci: SG %d -> %d @ %d\n", i, sg_dma_address(&sg[i]), sg_dma_len(&sg[i]));
    }
    dma_unmap_sg(&dev, sg, n_sg, DMA_FROM_DEVICE);

Разобрался с прерываниями, генерировать MSI в корке оказалось очень просто, повесил обработчик - генерируется с нужной частотой. Правда каждое третье прерывание отлетает USB мышка и снова реконнектится - странно что есть влияние на не связанные устройства.

irqreturn_t mypci_isr(int irq, void *data)
{
    printk(KERN_INFO "mypci: interrupt!\n");
    return IRQ_HANDLED;
}
EXPORT_SYMBOL(mypci_isr);
...
    pci_set_master(dev);
    pci_enable_msi(dev);
    devm_request_irq(&dev->dev, dev->irq, mypci_isr, 0, "mypci", NULL);
Тут я правильно сделал? Обработчики ошибок убрал для читаемости, ошибок не возникает на этих строках в процессе работы.