>> On Sat, Apr 25, 2020 at 1:46 AM Sohaib Mhmd <xunilams@gmail.com> wrote:
>> Hi everyone, I made a very simple USB driver,
>> but the problem is that the probe and disconnect functions never was called.
>> I tried to google for this problem but unfortunately:
>> 1- I don't use usb-storage, it's a keyboard! (but anyway the same problem exists with any usb-based device) and all driver on my machine are  bluetooth related drive (i think!) (as you see from lsmod | grep usb)
>> 2- I tried to rmmod usbhid but I get error: ERROR: Module usbhid is builtin.
>> I tried to search for "usbhid" in .config file to remove it but I didn't find anything.

>> What should I do?
>> thanks, smalinux

Hello Sohaib,

Looking at the very last line of your dmesg output :
[ 4545.614471] hid-generic 0003:045E:0800.000C: input,hiddev96,hidraw2: USB HID v1.11 Device [Microsoft Microsoft® Nano Transceiver v2.0] on usb-0000:00:14.0-3/input2

The reason your probe and disconnect functions are never called is because the hid-generic driver has claimed your device. This is the default behavior.
Since usbhid is builtin you are unable to unload it using rmmod. But you can unbind it. The steps are below:

1 - sudo modprobe <your_kernel_module>
2 - unbind hid-generic                  ( from a root terminal )
3 - bind <your_kernel_module>    ( from a root terminal )
4 - check dmesg                         ( should show your probe has been called )
5 - unbind <your_kernel_module> ( from a root terminal )
6 - check dmesg                         ( should show your disconnect has been called )

Clear the log buffer with dmesg -c then run dmesg -w.

Now find your bus id. Your bus id is 3-3:1.2 from your second last dmesg output.
[ 4545.613190] input: Microsoft Microsoft® Nano Transceiver v2.0 System Control as /devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3:1.2/0003:045E:0800.000C/input/input49

To unbind from hid-generic from a root shell/terminal:
echo "3-3:1.2" >  /sys/bus/usb/drivers/usbhid/unbind

Now to bind to your driver from a root shell:
echo "3-3:1.2" >  /sys/bus/usb/drivers/'my first usb driver'/bind    // you need the single quotes because of the spaces in your driver name

You should see dmesg telling you the probe function has been called now.

To unbind your driver from a root shell:
echo "3-3:1.2" >  /sys/bus/usb/drivers/'my first usb driver'/unbind    // you need the single quotes because of the spaces in your driver name

and now dmesg should show you the disconnect function has been called.

If you pull out your device and plug it back in usbhid will be triggered. To stop that you can from a root terminal:
echo '0' > /sys/bus/hid/drivers_autoprobe  

Good luck - Aruna ( If you have the kernel source why not re-compile ? Look for CONFIG_USB_HID in Make menuconfig )