Here is a snippet of kern.log after a resume, with printk added to hidp_session() and hidp_get_raw_report().
When the connection is taken down, hidp_session() exists its main loop (prints 'out of loop' message).
It then does a hid_destroy_device() ... which invokes sysfs removal of the input device. BUT that invokes a battery lookup (in power_supply code), which calls back hidp_get_raw_report ... which stalls and waits for its 5 second timeout. Only then does hidp_session finally complete. Notice the 5 second time jump in this log snippet.
Here is a snippet of kern.log after a resume, with printk added to hidp_session() and hidp_get_ raw_report( ).
When the connection is taken down, hidp_session() exists its main loop (prints 'out of loop' message). device( ) ... which invokes sysfs removal of the input device. BUT that invokes a battery lookup (in power_supply code), which calls back hidp_get_raw_report ... which stalls and waits for its 5 second timeout. Only then does hidp_session finally complete. Notice the 5 second time jump in this log snippet.
It then does a hid_destroy_