kmdf/usb/hid: interrupt endpoint pole rate drops down to 2 or 3 per second

My HID device has an interrupt endpoint that is normally polled every 5 ms. I
notice that after 60 seconds of inactivity, the pole rate drops down to 2 or 3
times per second.

I register for
WdfDeviceInitRegisterPnpStateChangeCallback() and WdfDeviceInitRegisterPowerStateChangeCallback() and
WdfDeviceInitRegisterPowerPolicyStateChangeCallback()

but I get no notification when poll rate drops or resotres to full functional rate.

What is happening here?

the APIs you called are about state changes local to the pdevice_object, not how the lower stack polls your hardware. did you enable your miniport for selective suspend? if so, is it selectively suspending right before you see the polling rate go down?

d

thanks Doron.

In my adddevice I set the device as a filter, therefore, non-power policy owner.

What do I look for in my code to see if enable the feature in my mini driver. As a non power policy owner, I don’t seem to have much say in these policies.

thanks,

hidclass is the power policy owner. you enable selective suspend by setting a reg key in your INF that says it is OK to enable it. are you doing that? are you processing IOCTL_HID_SEND_IDLE_NOTIFICATION_REQUEST and registering and IdleCallback? if no to either of these, selective suspend is not being enabled and that is the not the cause of the polling frequency change. it could very well be the host controller driver is throttling based off of inactivity for all we know.

d