LINUX.ORG.RU

GKH's review

 ,


0

1

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

> +static int mkopci_wait_irq(struct mkopci_device *dev)
> +{
> +     volatile unsigned long *LPCI_4C =
> +             (unsigned long *)(dev->core.lin_base[0] + 0x4C);
> +
> +     *LPCI_4C |= 0x49;
> +
> +     if (wait_event_interruptible(dev->wq, *LPCI_4C & 0x24))
> +             return -ERESTARTSYS;
> +     if (v > 1)
> +             pr_info("mkopci%d: irq received\n", dev->core.n_dev);
> +     *LPCI_4C &= ~0x40;


You can't directly access memory like this safely, please use the proper
io memory functions instead, otherwise bad things are guaranteed to
happen.


// от себя скажу, что такая фигня там с первой ревизи (еще для 2.4.x) и bad things замечены не были %)
ну ок, согласен, есть же функции io{read,write}32, в конце концов
сделал так:

static int mkopci_wait_irq(struct mkopci_device *dev)
{
    unsigned long flags, LPCI_4C;
    unsigned long *lpci_4c_addr = (unsigned long *) (dev->core.lin_base[0] + 0x4C);

    LPCI_4C = ioread32(lpci_4c_addr);
    iowrite32(LPCI_4C | 0x49, lpci_4c_addr);           //  01001001

    if (wait_event_interruptible(dev->wq, *lpci_4c_addr & 0x24)) {
        return -ERESTARTSYS;
    }    
    if (v > 1) 
        printk(KERN_INFO "mkopci%d: irq recieved\n", dev->core.n_dev);

    LPCI_4C = ioread32(lpci_4c_addr);
    iowrite32(LPCI_4C & ~0x40, lpci_4c_addr);         //  ~01000000


но что делать с wait_event_interruptible?? в смысле, все-равно в ней «неправильное» чтение остается...

★★★★★

Последнее исправление: metawishmaster (всего исправлений: 1)

Вы б ссылки на контекст привели хоть. Что за драйвер, откуда, где актуальные ваши исходники, и т. п.

Andrey_Utkin ★★
()
Ответ на: комментарий от Andrey_Utkin

да это еще год назад было... там много фигни из старых ядер потому что у меня один исходник для ядер 2.4+, просто с кучкой #ifdef'ов в зависимости от версии ядра, от туда и активное использование proc. еще с 2006-го года

а все ioctl там - по ТЗ

в общем, я тогда всмомнил фразу Торвальдса «We don't break userspace» и забил на mainline %)

но Грег хоть посмеялся :))

metawishmaster ★★★★★
() автор топика

ну ок, согласен, есть же функции io{read,write}32, в конце концов

нифига себе - типа сделал одолжение :) вообщето разница там в барьерах памяти, на каких то архитектурах они нужны а на каких-то нет, а эти функции - обертки скрывающие архиектурно-зависимую реализацию доступа к памяти. Кстати - в чем проблема заменить

*lpci_4c_addr

на

ioread32(lpci_4c_addr) ?

    if (wait_event_interruptible(dev->wq, ioread32(lpci_4c_addr) & 0x24)) {
        return -ERESTARTSYS;
    } 
[/quote]
anonymous
()
Ответ на: комментарий от anonymous

[нифига себе - типа сделал одолжение :)

:)))
да то я больше к тому, что девайс только на x86 используется... пока, по-краеней мере...

    if (wait_event_interruptible(dev->wq, ioread32(lpci_4c_addr) & 0x24)) {
        return -ERESTARTSYS;
    }


ща получу когнитивный диссонанс... %)
wait_event_interruptible же спит и не дергается - ioread32 выполнится только один раз

metawishmaster ★★★★★
() автор топика
Последнее исправление: metawishmaster (всего исправлений: 4)
Ответ на: комментарий от metawishmaster

ioread32 же выпоснится только один раз...

ioread32 инлайнится и на x86 примет вид *lpci_4c_addr в итоге, на более другой архитектуре может принять например вид

*lpci_4c_addr; rmb();

не понимаю - что тебя смущает

http://lxr.free-electrons.com/source/include/linux/wait.h#L454

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.