[ddk][usb-request] Remove usb_request_t.release_cb

To simplify transition to banjo

TEST: USB mass storage on NUC.
Change-Id: I64fd1c55e74963e2f56327d333dea2a7dc37a18c
diff --git a/system/dev/lib/usb/usb-request.c b/system/dev/lib/usb/usb-request.c
index 700437b..299319d 100644
--- a/system/dev/lib/usb/usb-request.c
+++ b/system/dev/lib/usb/usb-request.c
@@ -27,38 +27,6 @@
     return (void*)(((uintptr_t)req->virt) + req->offset);
 }
 
-// Frees any resources allocated by the usb request, but not the usb request itself.
-static void usb_request_release_static(usb_request_t* req) {
-    if (req->vmo_handle != ZX_HANDLE_INVALID) {
-        if (req->pmt != ZX_HANDLE_INVALID) {
-            zx_status_t status = zx_pmt_unpin(req->pmt);
-            ZX_DEBUG_ASSERT(status == ZX_OK);
-            req->pmt = ZX_HANDLE_INVALID;
-        }
-
-        zx_vmar_unmap(zx_vmar_root_self(), (uintptr_t)req->virt, req->size);
-        zx_handle_close(req->vmo_handle);
-        req->vmo_handle = ZX_HANDLE_INVALID;
-    }
-    if (req->phys_list && req->pmt != ZX_HANDLE_INVALID) {
-        zx_status_t status = zx_pmt_unpin(req->pmt);
-        ZX_DEBUG_ASSERT(status == ZX_OK);
-        req->pmt = ZX_HANDLE_INVALID;
-    }
-    free(req->phys_list);
-    req->phys_list = NULL;
-    req->phys_count = 0;
-    free(req->sg_list);
-    req->sg_list = NULL;
-    req->sg_count = 0;
-}
-
-// Frees any resources allocated by the usb request, as well as the usb request itself.
-static void usb_request_release_free(usb_request_t* req) {
-    usb_request_release_static(req);
-    free(req);
-}
-
 __EXPORT zx_status_t usb_request_alloc(usb_request_t** out, uint64_t data_size,
                                        uint8_t ep_address, size_t req_size) {
     if (req_size < sizeof(usb_request_t)) {
@@ -94,7 +62,7 @@
     req->alloc_size = req_size;
     req->header.ep_address = ep_address;
     req->header.length = data_size;
-    req->release_cb = usb_request_release_free;
+    req->release_frees = true;
     *out = req;
     return ZX_OK;
 }
@@ -143,7 +111,7 @@
 
     req->header.ep_address = ep_address;
     req->header.length = length;
-    req->release_cb = usb_request_release_free;
+    req->release_frees = true;
     *out = req;
     return ZX_OK;
 }
@@ -187,7 +155,7 @@
 
     req->header.ep_address = ep_address;
     req->header.length = length;
-    req->release_cb = usb_request_release_static;
+    req->release_frees = false;
     return ZX_OK;
 }
 
@@ -302,8 +270,30 @@
 }
 
 __EXPORT void usb_request_release(usb_request_t* req) {
-    if (req->release_cb) {
-        req->release_cb(req);
+    if (req->vmo_handle != ZX_HANDLE_INVALID) {
+        if (req->pmt != ZX_HANDLE_INVALID) {
+            zx_status_t status = zx_pmt_unpin(req->pmt);
+            ZX_DEBUG_ASSERT(status == ZX_OK);
+            req->pmt = ZX_HANDLE_INVALID;
+        }
+
+        zx_vmar_unmap(zx_vmar_root_self(), (uintptr_t)req->virt, req->size);
+        zx_handle_close(req->vmo_handle);
+        req->vmo_handle = ZX_HANDLE_INVALID;
+    }
+    if (req->phys_list && req->pmt != ZX_HANDLE_INVALID) {
+        zx_status_t status = zx_pmt_unpin(req->pmt);
+        ZX_DEBUG_ASSERT(status == ZX_OK);
+        req->pmt = ZX_HANDLE_INVALID;
+    }
+    free(req->phys_list);
+    req->phys_list = NULL;
+    req->phys_count = 0;
+    free(req->sg_list);
+    req->sg_list = NULL;
+    req->sg_count = 0;
+    if (req->release_frees) {
+        free(req);
     }
 }
 
diff --git a/system/ulib/ddk/include/ddk/protocol/usb.h b/system/ulib/ddk/include/ddk/protocol/usb.h
index 0d0c898..d7f71a4 100644
--- a/system/ulib/ddk/include/ddk/protocol/usb.h
+++ b/system/ulib/ddk/include/ddk/protocol/usb.h
@@ -79,10 +79,8 @@
 
     usb_response_t response;
 
-    // The release_cb() callback is set by the allocator and is
-    // invoked by the 'usb_request_release' method when it is called
-    // by the requester.
-    void (*release_cb)(usb_request_t* req);
+    // usb_request_release() frees the request if this is true.
+    bool release_frees;
     size_t alloc_size;
 
     // For requests queued on endpoints which have batching enabled via