2011-10-14 13:21:17

by Rafał Miłecki

[permalink] [raw]
Subject: How to create library module with callbacks?

I want to create module library, which will handle PHY operations on
Broadcom card. For most of the time, I'm going to call library
functions from b43.

However, there are places where I need to call some (b43) driver
function from library module.

How can I handle that? Should I pass some functions pointers to the
library? Is that going to work? Or is there a better approach?

P.S.
I'm asking at linux-wireless, it's not wireless related however. I
think question is quite simple for C hackers and there is no need to
hit LKML.

--
Rafał


2011-10-14 14:43:45

by Arend van Spriel

[permalink] [raw]
Subject: Re: How to create library module with callbacks?

On 10/14/2011 03:21 PM, Rafał Miłecki wrote:
> I want to create module library, which will handle PHY operations on
> Broadcom card. For most of the time, I'm going to call library
> functions from b43.
>
> However, there are places where I need to call some (b43) driver
> function from library module.
>
> How can I handle that? Should I pass some functions pointers to the
> library? Is that going to work? Or is there a better approach?
>
> P.S.
> I'm asking at linux-wireless, it's not wireless related however. I
> think question is quite simple for C hackers and there is no need to
> hit LKML.
>

Hi Rafał,

It should be no different as normal drivers do. In your case I would say
b43 registers itself with phylib module and provides phylib_ops. It
could also provide the bcma_device for the 80211 core so the phylib can
use bcma directly. Whether or not phylib is still a library module when
doing so can be argued. As it does not provide a system function by
itself I tend to say it is.

I would suggest to look into mac80211 to see how it deals with the
callbacks it does into the device drivers.

Gr. AvS


2011-10-14 14:42:47

by Pavel Roskin

[permalink] [raw]
Subject: Re: How to create library module with callbacks?

On Fri, 14 Oct 2011 15:21:16 +0200
Rafał Miłecki <[email protected]> wrote:

> I want to create module library, which will handle PHY operations on
> Broadcom card. For most of the time, I'm going to call library
> functions from b43.
>
> However, there are places where I need to call some (b43) driver
> function from library module.
>
> How can I handle that? Should I pass some functions pointers to the
> library? Is that going to work? Or is there a better approach?

Yes, that should work. All modules and the kernel live in the same
address space. But you should make sure that those pointers won't be
used if the calling module is unloaded.

In fact, b43 does it already with mac80211, ssb and bcma. See
b43_hw_ops, b43_ssb_driver and b43_bcma_driver in the code.

--
Regards,
Pavel Roskin