[dev][usb-bus] remove some lock contention

Change-Id: I4fcf4d0e0fc5ce26903352d2c9ab2ea482d6b1dd
diff --git a/zircon/system/dev/usb/usb-bus/usb-device.cpp b/zircon/system/dev/usb/usb-bus/usb-device.cpp
index ee8ab98..442f902 100644
--- a/zircon/system/dev/usb/usb-bus/usb-device.cpp
+++ b/zircon/system/dev/usb/usb-bus/usb-device.cpp
@@ -102,6 +102,8 @@
 }
 
 bool UsbDevice::UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req) {
+    fbl::AutoLock lock(&ep->lock);
+
     auto unowned = UnownedRequest(completed_req, parent_req_size_, /* allow_destruct */ false);
 
     std::optional<size_t> completed_req_idx = ep->pending_reqs.find(&unowned);
@@ -169,8 +171,6 @@
         return;
     }
 
-    fbl::AutoLock lock(&ep->lock);
-
     bool do_callback = UpdateEndpoint(ep, req);
     if (do_callback) {
         QueueCallback(req);
@@ -178,10 +178,12 @@
 }
 
 void UsbDevice::QueueCallback(usb_request_t* req) {
-    fbl::AutoLock lock(&callback_lock_);
+    {
+        fbl::AutoLock lock(&callback_lock_);
 
-    // move original request to completed_reqs list so it can be completed on the callback_thread
-    completed_reqs_.push(UnownedRequest(req, parent_req_size_));
+        // move original request to completed_reqs list so it can be completed on the callback_thread
+        completed_reqs_.push(UnownedRequest(req, parent_req_size_));
+    }
     sync_completion_signal(&callback_thread_completion_);
 }
 
diff --git a/zircon/system/dev/usb/usb-bus/usb-device.h b/zircon/system/dev/usb/usb-bus/usb-device.h
index 87d58bf..16bf93b 100644
--- a/zircon/system/dev/usb/usb-bus/usb-device.h
+++ b/zircon/system/dev/usb/usb-bus/usb-device.h
@@ -130,7 +130,7 @@
     // get a callback. If that prior request has also already completed,
     // |out_additional_callback| will be populated.
     // Returns true if a callback is required.
-    bool UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req) __TA_REQUIRES(ep->lock);
+    bool UpdateEndpoint(Endpoint* ep, usb_request_t* completed_req);
 
     void RequestComplete(usb_request_t* req);
     void QueueCallback(usb_request_t* req);