On Tue, Nov 15, 2005 at 11:56:33AM +0800, Tony wrote:That is indeed my problem. My driver is none of types of drivers, it's just a software virtual one. I think I should mimic the way SLIP handle it. thank a loooooooot!!!
Not strange at all. The typical network driver is implemented using
pci_register_driver which will set the owner filed of the driver's struct
driver which then is being used for internal reference counting. Other
busses or line disciplines (SLIP, PPP, AX.25 ...) need to do the equivalent
or the kernel will believe reference counting isn't necessary and it's
ok to unload the module at any time.
In which driver did you hit this problem?
I have a radio connected to host using ethernet. I'm writing a radio driver that masquerade radio as a NIC. when the module is loaded, I just register_netdev a net_device struct, while unregister_netdev at module cleanup.
register_netdev / unregister_netdev don't deal with the .owner stuff, so
your bug isn't there. If your NIC is a PCI card, it should register it's
driver through pci_register_driver which would deal with the necessary
reference counting. If it's implemented as a platform device you're
presumably calling driver_register() before platform_device_register() and
driver_register() would do the necessary magic for you. If you're using a
different bus it may have it's own variant of driver_register which you
should call. If you don't, you have a problem :-)