aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/uwb/beacon.c
diff options
context:
space:
mode:
authorThomas Pugliese <thomas.pugliese@gmail.com>2013-12-20 14:01:03 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-12-20 15:19:44 -0500
commit1fc671b3be8f671482871d9a0b577b6d96914e8e (patch)
tree09232d31e58b5ffad10dbc560db4d8fad45badab /drivers/uwb/beacon.c
parentbf359dff2346d490dbbbe0fcc4aa674625803da5 (diff)
uwb: move mutex_lock to error case in uwbd_evt_handle_rc_bp_slot_change
Only acquire rc->uwb_dev.mutex in the error case in uwbd_evt_handle_rc_bp_slot_change. This fixes a bug where establishing a reservation on a new channel will fail if we were unable to establish a reservation on the previous channel due to DRP conflict. If rc->uwb_dev.mutex is acquired in the non-error case when the uwb system is attempting to start beaconing, it will block because the start beaconing code is holding this mutex. This prevents any other notifications from the URC from being processed. In particular, the DRP_AVAILABILITY notification will not be processed during the start beaconing process which can result in a failure to establish a reservation. It is safe to not hold the mutex in the non-error case since the only other place rc->uwb_dev.beacon_slot is accessed is in the same worker thread that uwbd_evt_handle_rc_bp_slot_change executes in. Signed-off-by: Thomas Pugliese <thomas.pugliese@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/uwb/beacon.c')
-rw-r--r--drivers/uwb/beacon.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/uwb/beacon.c b/drivers/uwb/beacon.c
index 4190f29fe312..57b5ff61020c 100644
--- a/drivers/uwb/beacon.c
+++ b/drivers/uwb/beacon.c
@@ -516,13 +516,13 @@ int uwbd_evt_handle_rc_bp_slot_change(struct uwb_event *evt)
516 } 516 }
517 bpsc = container_of(evt->notif.rceb, struct uwb_rc_evt_bp_slot_change, rceb); 517 bpsc = container_of(evt->notif.rceb, struct uwb_rc_evt_bp_slot_change, rceb);
518 518
519 mutex_lock(&rc->uwb_dev.mutex);
520 if (uwb_rc_evt_bp_slot_change_no_slot(bpsc)) { 519 if (uwb_rc_evt_bp_slot_change_no_slot(bpsc)) {
521 dev_err(dev, "stopped beaconing: No free slots in BP\n"); 520 dev_err(dev, "stopped beaconing: No free slots in BP\n");
521 mutex_lock(&rc->uwb_dev.mutex);
522 rc->beaconing = -1; 522 rc->beaconing = -1;
523 mutex_unlock(&rc->uwb_dev.mutex);
523 } else 524 } else
524 rc->uwb_dev.beacon_slot = uwb_rc_evt_bp_slot_change_slot_num(bpsc); 525 rc->uwb_dev.beacon_slot = uwb_rc_evt_bp_slot_change_slot_num(bpsc);
525 mutex_unlock(&rc->uwb_dev.mutex);
526 526
527 return 0; 527 return 0;
528} 528}