Драйвер как модуль

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|

Драйвер как модуль

BSW-2
        День добрый.

А никто не пробовал писать драйвера для PCI-железяк в виде LKM?
На текущий момент я застрял на том, что не могу "оторвать" свой
обработчик прерываний при выгрузке модуля. Код pci_intr_disestablish()
наводит на грустные размышления. Насколько я понимаю, должны выполняться
некие действия, по сути обратные pci_intr_route_link(), а этого нигде
нет. :-(


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Mike Belopuhov
BSW wrote:

>     День добрый.
>
> А никто не пробовал писать драйвера для PCI-железяк в виде LKM?
> На текущий момент я застрял на том, что не могу "оторвать" свой
> обработчик прерываний при выгрузке модуля. Код pci_intr_disestablish()
> наводит на грустные размышления. Насколько я понимаю, должны выполняться
> некие действия, по сути обратные pci_intr_route_link(), а этого нигде
> нет. :-(
>
>

а зачем это делать?

--
you're never too old to rock'n'roll if you're too young to die.


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

BSW-2
Mike Belopuhov пишет:
> а зачем это делать?
Как это зачем? По-моему гораздо проще слелать modunload/modload, чем
полностью ребутить машину после каждого изменения кода. Или у Опенка уже
есть драйвера под все мыслимое и немыслимое железо, и разработка
драйверов не требуется?


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Mike Belopuhov
BSW wrote:
> Mike Belopuhov пишет:
>> а зачем это делать?
> Как это зачем? По-моему гораздо проще слелать modunload/modload, чем
> полностью ребутить машину после каждого изменения кода. Или у Опенка уже
> есть драйвера под все мыслимое и немыслимое железо, и разработка
> драйверов не требуется?
>

аа, ну я думаю все ребутят :)
вон у гранге@ спроси :)

а драйвер пишите-пишите. дело полезное.

думается что LKM вообще не приспособлен для таких вещей...
тем более что на amd64 (и наверное еще много где) вообще не работает.

--
you're never too old to rock'n'roll if you're too young to die.


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

BSW-2
Mike Belopuhov пишет:
> аа, ну я думаю все ребутят :)
Увы, у меня нет лишней машинки под вечные ребуты. :-(

> вон у гранге@ спроси :)
Гранге@, ау!

> думается что LKM вообще не приспособлен для таких вещей...
На текущий момент умею искать/инитить железку. Не умею - отвязаться от
прерываний, сразу panic.

> тем более что на amd64 (и наверное еще много где) вообще не работает.
Ну так доделают, вещь-то полезная.


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Mike Belopuhov
BSW wrote:

> Mike Belopuhov пишет:
>> аа, ну я думаю все ребутят :)
> Увы, у меня нет лишней машинки под вечные ребуты. :-(
>
>> вон у гранге@ спроси :)
> Гранге@, ау!
>
>> думается что LKM вообще не приспособлен для таких вещей...
> На текущий момент умею искать/инитить железку. Не умею - отвязаться от
> прерываний, сразу panic.
>
>> тем более что на amd64 (и наверное еще много где) вообще не работает.
> Ну так доделают, вещь-то полезная.
>
>

ничего они не доделают. им он как раз совсем не нужен.

--
you're never too old to rock'n'roll if you're too young to die.


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Alexander Yurchenko
In reply to this post by Mike Belopuhov
On Tue, Aug 28, 2007 at 09:37:53PM +0400, Mike Belopuhov wrote:

> BSW wrote:
> >Mike Belopuhov пишет:
> >>а зачем это делать?
> >Как это зачем? По-моему гораздо проще слелать modunload/modload, чем
> >полностью ребутить машину после каждого изменения кода. Или у Опенка уже
> >есть драйвера под все мыслимое и немыслимое железо, и разработка
> >драйверов не требуется?
> >
>
> аа, ну я думаю все ребутят :)
> вон у гранге@ спроси :)

Когда у человека что-то начинает работать, он показывает dmesg. При этом
в первых строчках пишется что-то типа GENERIC #111. Так вот чем больше
число компиляций (а равно и перезагрузок) тем круче разработка (:
А с модулем у вас это число будет близко к нулю (:

>
> а драйвер пишите-пишите. дело полезное.
>
> думается что LKM вообще не приспособлен для таких вещей...
> тем более что на amd64 (и наверное еще много где) вообще не работает.
>
> --
> you're never too old to rock'n'roll if you're too young to die.
>

--
   Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Alexander Yurchenko
In reply to this post by BSW-2
On Tue, Aug 28, 2007 at 11:53:15PM +0600, BSW wrote:

> Mike Belopuhov пишет:
> >аа, ну я думаю все ребутят :)
> Увы, у меня нет лишней машинки под вечные ребуты. :-(
>
> >вон у гранге@ спроси :)
> Гранге@, ау!
>
> >думается что LKM вообще не приспособлен для таких вещей...
> На текущий момент умею искать/инитить железку. Не умею - отвязаться от
> прерываний, сразу panic.

По-моему вы чего-то не того делаете. pci_intr_disestablish() должен
отработать нормально. А то, что при этом не выполняется возврат pci
рутера в прежнее состояние - так это фигня.

>
> >тем более что на amd64 (и наверное еще много где) вообще не работает.
> Ну так доделают, вещь-то полезная.
>

--
   Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

BSW-2
Alexander Yurchenko пишет:
> По-моему вы чего-то не того делаете. pci_intr_disestablish() должен
> отработать нормально. А то, что при этом не выполняется возврат pci
> рутера в прежнее состояние - так это фигня.
void my_attach(struct device *parent, struct device *self, void *aux)
{
struct pci_attach_args  *pa = aux;
struct my_softc     *sc = (void *)self;
..
         if (pci_intr_map(pa, &sc->ih)) {
                 printf("%s: couldn't map interrupt\n",
                                sc->my_dev.dv_xname);
                 return;
         };
         intrstr = pci_intr_string(pa->pa_pc, sc->ih);
         sc->ihp = pci_intr_establish(pa->pa_pc, sc->ih, IPL_VIDEO,
                        my_intr, sc, sc->my_dev.dv_xname);
  ...
};

int my_detach(struct device *self, int n)
{
struct my_softc     *sc = (void *)self;
..
         pci_intr_disestablish(sc->pc, &sc->ihp);
         bus_space_unmap(sc->memt, sc->memh, sc->obmemsz);
..
};

Делаю modload/modunload, получаю
ddb> trace
Debugger(d0dca400,44,3,0,d0dca454) at Debugger+0x4
panic(d07015c0,3,8c,d033cf01,1) at panic+0x63
isa_intr_disestablish(0,d0dca454,d0822c1c,d07379e4,7389c0) at
isa_intr_disestab
lish+0x95
(null)(d0dca400,0,10,d0337d59,d3c88dec) at 0xdb05230f
config_detach(d0dca400,0,db04cc90,d033cf01,db054500) at config_detach+0x218
(null)(db05444f,db054439,db04cce0,b7cd68,d0d4d480) at 0xdb0521c2
(null)(d0d4d480,2,daffe188,db04cd68,db04cd68) at 0xdb05413d
(null)(d0d4d480,2,2,c00c4b0a) at 0xdb0540c6
lkmioctl(1c00,c00c4b0a,db04ce78,3,daffe188) at lkmioctl+0x253
spec_ioctl(db04cd68,db04ce28,db04cdf0,d035f218,d3b7cd68) at spec_ioctl+0x3f
spec_vnoperate(db04cd68,d3c94f50,daffe188,d3b7cd68,d0738580) at
spec_vnoperate+
0x16
VOP_IOCTL(d3b7cd68,c00c4b0a,db04ce78,3,d3c94f50,daffe188,d3b7cde8,0) at
VOP_IOC
TL+0x40
vn_ioctl(daeef2c8,c00c4b0a,db04ce78,daffe188,d3c94f50) at vn_ioctl+0xd0
sys_ioctl(daffe188,db04cf68,db04cf58,3,1ed) at sys_ioctl+0x125
syscall() at syscall+0x24a
--- syscall (number 54) ---
0x1c0004bd:


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

BSW-2
BSW пишет:
> Alexander Yurchenko пишет:
>> По-моему вы чего-то не того делаете. pci_intr_disestablish() должен
>> отработать нормально.

> int my_detach(struct device *self, int n)
> {
> struct my_softc     *sc = (void *)self;
> ...
>         pci_intr_disestablish(sc->pc, &sc->ihp);
>         bus_space_unmap(sc->memt, sc->memh, sc->obmemsz);
> ...
> };

Вопрос снят, я слепой $#@$^#@#. :-S
---         pci_intr_disestablish(sc->pc, &sc->ihp);
+++         pci_intr_disestablish(sc->pc, sc->ihp);


Reply | Threaded
Open this post in threaded view
|

Re: Драйвер как модуль

Alexander Yurchenko
In reply to this post by BSW-2
On Wed, Aug 29, 2007 at 08:06:03PM +0600, BSW wrote:

> Alexander Yurchenko пишет:
> >По-моему вы чего-то не того делаете. pci_intr_disestablish() должен
> >отработать нормально. А то, что при этом не выполняется возврат pci
> >рутера в прежнее состояние - так это фигня.
> void my_attach(struct device *parent, struct device *self, void *aux)
> {
> struct pci_attach_args  *pa = aux;
> struct my_softc     *sc = (void *)self;
> ..
>         if (pci_intr_map(pa, &sc->ih)) {
>                 printf("%s: couldn't map interrupt\n",
> sc->my_dev.dv_xname);
>                 return;
>         };
>         intrstr = pci_intr_string(pa->pa_pc, sc->ih);
>         sc->ihp = pci_intr_establish(pa->pa_pc, sc->ih, IPL_VIDEO,
> my_intr, sc, sc->my_dev.dv_xname);
>  ...
> };
>
> int my_detach(struct device *self, int n)
> {
> struct my_softc     *sc = (void *)self;
> ..
>         pci_intr_disestablish(sc->pc, &sc->ihp);
                                       ^^^
Амперсанд лишний.

>         bus_space_unmap(sc->memt, sc->memh, sc->obmemsz);
> ..
> };
>
> Делаю modload/modunload, получаю
> ddb> trace
> Debugger(d0dca400,44,3,0,d0dca454) at Debugger+0x4
> panic(d07015c0,3,8c,d033cf01,1) at panic+0x63
> isa_intr_disestablish(0,d0dca454,d0822c1c,d07379e4,7389c0) at
> isa_intr_disestab
> lish+0x95
> (null)(d0dca400,0,10,d0337d59,d3c88dec) at 0xdb05230f
> config_detach(d0dca400,0,db04cc90,d033cf01,db054500) at config_detach+0x218
> (null)(db05444f,db054439,db04cce0,b7cd68,d0d4d480) at 0xdb0521c2
> (null)(d0d4d480,2,daffe188,db04cd68,db04cd68) at 0xdb05413d
> (null)(d0d4d480,2,2,c00c4b0a) at 0xdb0540c6
> lkmioctl(1c00,c00c4b0a,db04ce78,3,daffe188) at lkmioctl+0x253
> spec_ioctl(db04cd68,db04ce28,db04cdf0,d035f218,d3b7cd68) at spec_ioctl+0x3f
> spec_vnoperate(db04cd68,d3c94f50,daffe188,d3b7cd68,d0738580) at
> spec_vnoperate+
> 0x16
> VOP_IOCTL(d3b7cd68,c00c4b0a,db04ce78,3,d3c94f50,daffe188,d3b7cde8,0) at
> VOP_IOC
> TL+0x40
> vn_ioctl(daeef2c8,c00c4b0a,db04ce78,daffe188,d3c94f50) at vn_ioctl+0xd0
> sys_ioctl(daffe188,db04cf68,db04cf58,3,1ed) at sys_ioctl+0x125
> syscall() at syscall+0x24a
> --- syscall (number 54) ---
> 0x1c0004bd:
>

--
   Alexander Yurchenko