Date: Sun, 5 Sep 2004 21:19:12 +0200 From: gerarra@tin.it To: freebsd-hackers@freebsd.org Cc: ctodd@chrismiller.com Subject: RE: KLD and USB driver Message-ID: <411972290001A708@ims3a.cp.tin.it> In-Reply-To: <Pine.BSI.4.58L.0409041924100.24206@vp4.netgate.net>
index | next in thread | previous in thread | raw e-mail
>I'm working on a usb device driver I've derived from existing drivers in >sys/dev/usb (4.10-RELEASE). > >I can successfully load and unload the module, but the usb subsystem does >not appear to see the driver. However if I compile my driver in the >kernel, the usb sub system uses the driver correctly. Unfortunately this >is making it time consuming to test changes to my driver code as I have to >compile the kernel each time. > >I haven't see this used in the existing usb drivers code, but I tried >using the "KLD Skeleton" from the FreeBSD Architecture Handbook. >Although I see the uprintf output at the terminal when load/unloading the >module, the usb subsystem does not use my driver. Like the existing usb >drivers, I'm using USB_DECLARE_DRIVER and DRIVER_MODULE statements. > >Is the KLD DECLARE_MODULE code really necessary for this driver (doesn't >USB_DECLARE_DRIVER make the driver available already)? How can I determine >why the driver works when compiled in the kernel, but not when dynamically >loaded? I'm able to load/unload the uhid and ugen drivers and they work as >expected. FreeBSD is dived into subsystems and every subsystem contains a certain number of components. To mantain specific order starting subsystems SYSINIT macro is provided by the kernel; very struct sysinit obj has a double-code priority referencing subsystem priority and priority within the subsystem (you can give a look to them in sys/kernel.h, enum sysinit_sub_id and enum sysinit_elem_order enumerations). When you code a generic KLD, DECLARE_MODULE macro is provided to manage linking; between the other things a struct sysinit obj is done (through a call to SYSINIT macro) and initialized within a specified subsystem and with a specified priority inside the subsystem, to let module start properly. DRIVER_MODULE just does that: among the other things, calls DECLARE_MODULE linking the new module in the DRIVERS subsystems. USB_DECLARE_DRIVER, instead, just defines some functions to manage your usb driver. In the end, the real linking is done by DRIVER_MODULE and you should not use DECLARE_MODULE (DRIVER_MODULE alredy does). However for a review of the code the complete source code might be provided. greetings rookiehelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?411972290001A708>
