[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