Bluetooth: Make hidp_get_raw_report abort if the session is terminating
After linux 3.2 the hid_destroy_device call in hidp_session cleaning up invokes a hook to the power_supply code which in turn tries to read the battery capacity. This read will trigger a call to hidp_get_raw_report which is bound to fail because the device is being taken away - so rather than wait for the 5 second timeout failure this changes enables it to fail straight away. Signed-off-by: Karl Relton <karllinuxtest.relton@ntlworld.com> Reviewed-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
This commit is contained in:
parent
bed7174834
commit
fd86c9becc
1 changed files with 4 additions and 0 deletions
|
@ -311,6 +311,9 @@ static int hidp_get_raw_report(struct hid_device *hid,
|
|||
int numbered_reports = hid->report_enum[report_type].numbered;
|
||||
int ret;
|
||||
|
||||
if (atomic_read(&session->terminate))
|
||||
return -EIO;
|
||||
|
||||
switch (report_type) {
|
||||
case HID_FEATURE_REPORT:
|
||||
report_type = HIDP_TRANS_GET_REPORT | HIDP_DATA_RTYPE_FEATURE;
|
||||
|
@ -722,6 +725,7 @@ static int hidp_session(void *arg)
|
|||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
}
|
||||
set_current_state(TASK_RUNNING);
|
||||
atomic_inc(&session->terminate);
|
||||
remove_wait_queue(sk_sleep(intr_sk), &intr_wait);
|
||||
remove_wait_queue(sk_sleep(ctrl_sk), &ctrl_wait);
|
||||
|
||||
|
|
Loading…
Reference in a new issue