newbus questions

Artem Ignatiev zazubrik at mail.ru
Wed Mar 22 13:47:40 UTC 2006


On 16.03.2006, at 15:06, Artem 'ZaZooBred' Ignatiev wrote:

> On Thu, 16/03/2006 12:35 +0100, Milan Obuch wrote:
>
>> ....
>>
>>> 1. How to create the bus itself, and properly describe its  
>>> interfaces?
>>> skeletons of bus-driver and frontend-drivers would be a GREAT help.
>>
>> Being far from everything knowing hacker, I just can help with  
>> what I found
>> when working on something totally unrelated.
>> First you need to write .m file describing your methods - they are  
>> class
>> description, kind of. There are couple of them - maybe PCI analogy  
>> (pci_if.m
>> and pcib_if.m) could help a little to understand their role. Then  
>> you can use
>> these methods in your device_method_t array describing your  
>> device. Actually,
>> these definitions are something like software bus between parent  
>> and child
>> device. And maybe you could get some clue looking at bktr driver,  
>> which could
>> be somehow related to your are of interest.
>
> Yes, I've got some clearance in how that <something>_if.m files are
> written, but bktr driver is too complex for me to understand how the
> things are done right now. I'll look at it again, though, maybe I  
> could
> understand the logic of how such things are done, when I could clearly
> separate generic logic from implementation of particular hardware
> driver.

Okay, now I have got the bus device, the child device. My current  
trouble is
that I want bus driver to provide some methods to child drivers.

So I created saa_bus_if.m file, declared some methods there, made  
implementation
in bus driver and added them using
DEVICE_METHOD(saa_bus_some_method, saa_some_method_impl),

and added the saa_bus_if.c to child driver SRCS.

Now, when I do SAA_BUS_SOME_METHOD(card, ...) inside bus driver, it  
works just as
expected. But when I do SAA_BUS_SOME_METHOD(device_get_parent 
(subdev), ...)
inside subdriver, it happens that KOBJLOOKUP(...) returns pointer to  
generic
function (which returns ENXIO) rather than pointer to my implementation.

The questions are:
Am I going the Right Way(tm) when exporting functions to child  
drivers like that?
If yes, what I must do in order to get the real implementation, not  
the default one?
If no, what is The Right Way(tm)?

Thanks in advance.


More information about the freebsd-hackers mailing list